Rebuilding Repository for Bachelor thesis
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
archive/
|
||||||
|
trace-analyse/output/
|
||||||
|
trace-analyse/traces/
|
BIN
20130306-KDB-and-IDL.pdf
Normal file
BIN
Proposal/Folien/Architektur.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Proposal/Folien/Gantt-Project.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
Proposal/Folien/kielprints.png
Normal file
After Width: | Height: | Size: 735 KiB |
BIN
Proposal/Folien/vortrag.pdf
Normal file
259
Proposal/Folien/vortrag.tex
Normal file
|
@ -0,0 +1,259 @@
|
||||||
|
\documentclass{beamer}
|
||||||
|
|
||||||
|
% Diese Datei enthält eine Lösungsvorlage für:
|
||||||
|
|
||||||
|
% - Vorträge bei einer (deutschsprachigen) Konferenz/einem Kolloquium.
|
||||||
|
% - Vortragslänge von etwa 20 Minuten.
|
||||||
|
% - Aussehen des Vortrags ist verschnörkelt/dekorativ.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% Copyright 2004 by Till Tantau <tantau@users.sourceforge.net>.
|
||||||
|
%
|
||||||
|
% In principle, this file can be redistributed and/or modified under
|
||||||
|
% the terms of the GNU Public License, version 2.
|
||||||
|
%
|
||||||
|
% However, this file is supposed to be a template to be modified
|
||||||
|
% for your own needs. For this reason, if you use this file as a
|
||||||
|
% template and not specifically distribute it as part of a another
|
||||||
|
% package/program, I grant the extra permission to freely copy and
|
||||||
|
% modify this file as you see fit and even to delete this copyright
|
||||||
|
% notice.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\mode<presentation>
|
||||||
|
{
|
||||||
|
\usetheme{Warsaw}
|
||||||
|
}
|
||||||
|
|
||||||
|
\usepackage[german]{babel}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{times}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
|
||||||
|
|
||||||
|
\title[Perl-Monitoring] % (optional, nur bei langen Titeln nötig)
|
||||||
|
{Monitoring von Perl-basierten Web Anwendungen mit Kieker}
|
||||||
|
|
||||||
|
\subtitle{Proposal}
|
||||||
|
|
||||||
|
\author{Nis Wechselberg}
|
||||||
|
|
||||||
|
|
||||||
|
\institute[CAU Kiel] % (optional, aber oft nötig)
|
||||||
|
{
|
||||||
|
Institut für Informatik\\
|
||||||
|
Christian-Albrechts-Universität zu Kiel
|
||||||
|
}
|
||||||
|
|
||||||
|
\date{19. Dezember 2012}
|
||||||
|
|
||||||
|
% Folgendes sollte gelöscht werden, wenn man nicht am Anfang jedes
|
||||||
|
% Unterabschnitts die Gliederung nochmal sehen möchte.
|
||||||
|
\AtBeginSection[]
|
||||||
|
{
|
||||||
|
\begin{frame}<beamer>{Gliederung}
|
||||||
|
\tableofcontents[currentsection]
|
||||||
|
\end{frame}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
% Falls Aufzählungen immer schrittweise gezeigt werden sollen, kann
|
||||||
|
% folgendes Kommando benutzt werden:
|
||||||
|
|
||||||
|
\beamerdefaultoverlayspecification{<+->}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\begin{frame}
|
||||||
|
\titlepage
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Gliederung}
|
||||||
|
\tableofcontents
|
||||||
|
% Die Option [pausesections] könnte nützlich sein.
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% Einen Vortrag zu strukturieren ist nicht immer einfach. Die
|
||||||
|
% nachfolgende Struktur kann unangemessen sein. Hier ein paar Regeln,
|
||||||
|
% die für diese Lösungsvorlage gelten:
|
||||||
|
|
||||||
|
% - Es sollte genau zwei oder drei Abschnitte geben (neben der
|
||||||
|
% Zusammenfassung).
|
||||||
|
% - *Höchstens* drei Unterabschnitte pro Abschnitt.
|
||||||
|
% - Pro Rahmen sollte man zwischen 30s und 2min reden. Es sollte also
|
||||||
|
% 15 bis 30 Rahmen geben.
|
||||||
|
|
||||||
|
% - Konferenzteilnehmer wissen oft wenig von der Materie des
|
||||||
|
% Vortrags. Deshalb: vereinfachen!
|
||||||
|
% - In 20 Minuten ist es schon schwer genug, die Hauptbotschaft zu
|
||||||
|
% vermitteln. Deshalb sollten Details ausgelassen werden, selbst
|
||||||
|
% wenn dies zu Ungenauigkeiten oder Halbwahrheiten führt.
|
||||||
|
% - Falls man Details weglässt, die eigentlich wichtig für einen
|
||||||
|
% Beweis/Implementation sind, so sagt man dies einmal nüchtern. Alle
|
||||||
|
% werden damit glücklich sein.
|
||||||
|
|
||||||
|
\section{Motivation}
|
||||||
|
|
||||||
|
\subsection{Kielprints}
|
||||||
|
|
||||||
|
\begin{frame}{Kielprints}
|
||||||
|
\includegraphics[scale=0.17]{kielprints.png}[
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Projektbeschreibung}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Plattform zur Veröffentlichung von wissenschaftlichen Dokumenten (\emph{self archiving})
|
||||||
|
\item
|
||||||
|
Ergänzte und modifizierte Version von ePrints
|
||||||
|
\item
|
||||||
|
Betrieben durch das Helmholtz Zentrum für Ozeanforschung Kiel (GEOMAR)
|
||||||
|
\item
|
||||||
|
Erweiterung des OceanRep GEOMAR
|
||||||
|
\item
|
||||||
|
Über 14000 Veröffentlichungen von etwa 1000 Autoren
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Beobachtete Performanceprobleme}
|
||||||
|
|
||||||
|
\begin{frame}{Benutzerperspektive}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Abrufen von Einträgen über die Plattform: \\[0.5cm]
|
||||||
|
\item
|
||||||
|
Erhöhte Antwortzeiten
|
||||||
|
\item
|
||||||
|
Langsame Suche in den Fachbereichen
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Administration/Betrieb}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Zur Zeit \emph{Vorberechnung} in der Nacht durch Cron-Job
|
||||||
|
\item
|
||||||
|
Trotzdem hohe Wartezeiten bei Seitenwechseln im Backend
|
||||||
|
\item
|
||||||
|
Beispiel: Beim Eintragen von neuen Publikationen über das Backend und hinzufügen von Autoren dauert die Generierung von Dropdown-Menüs etwa 10 Sekunden.
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Technologien und Methoden}
|
||||||
|
|
||||||
|
\subsection{Performance-Monitoring}
|
||||||
|
|
||||||
|
\begin{frame}{Vorgehen bei Performance-Monitoring}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item
|
||||||
|
Instrumentierung des Codes mit \emph{Probes}
|
||||||
|
\item
|
||||||
|
Ausführung des instrumentierten Codes
|
||||||
|
\item
|
||||||
|
Protokollierung von Monitoring Daten
|
||||||
|
\item
|
||||||
|
Auswertung der Daten mittels geeigneter Tools
|
||||||
|
\end{enumerate}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Erfasste Daten}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Anwendungsdaten
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Aufrufreihenfolge
|
||||||
|
\item
|
||||||
|
Aufrufhäufigkeiten
|
||||||
|
\item
|
||||||
|
Ausführungszeiten
|
||||||
|
\end{itemize}
|
||||||
|
\item
|
||||||
|
Systemdaten
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
CPU-Auslastung
|
||||||
|
\item
|
||||||
|
Arbeitsspeicher
|
||||||
|
\item
|
||||||
|
aktive Prozesse
|
||||||
|
\item
|
||||||
|
...
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Kieker-Framework}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker Monitoring Framework}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Monitoring Tool aus diesem Lehrstuhl
|
||||||
|
\item Empfohlenes Tool im SPEC RG Software Repository
|
||||||
|
\end{itemize}
|
||||||
|
\includegraphics[scale=0.7]{kiekerComponentDiagram-woCloud-bw-w-record-newNames-withTraceAnalysis-colors.pdf}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Überblick über Kieker}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Aufteilung in \emph{Kieker.Monitoring} und \emph{Kieker.Analysis}
|
||||||
|
\item Kieker.Monitoring zur Instrumentierung und Überwachung
|
||||||
|
\item Kieker.Analysis zur Auswertung und Veranschaulichung
|
||||||
|
\item Kommunikation über Monitoring Log oder Stream\\[0.5cm]
|
||||||
|
\item Bisher keine Unterstützung für Perl
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Programmiersprache Perl}
|
||||||
|
|
||||||
|
\begin{frame}{Programmiersprache Perl}
|
||||||
|
\begin{itemize}
|
||||||
|
\item imperative, plattformunabhängige, interpretierte Sprache
|
||||||
|
\item Entwickelt 1987, heute in Version 5.16 verfügbar
|
||||||
|
\item Sehr viele Freiheiten für Programmierer (freie Syntax)
|
||||||
|
\item Starke Funktionen für String-Manipulationen und Reguläre Ausdrücke
|
||||||
|
\item Direkte Integration in Webserver mittels CGI-Perl
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Geplante Umsetzung}
|
||||||
|
|
||||||
|
\subsection{Architekturentwurf}
|
||||||
|
|
||||||
|
\begin{frame}{Neuimplementierungen in Perl}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Implementierung von Monitoring Probes und Monitoring Writer
|
||||||
|
\item Ausgabe von Monitoring Records in Monitoring Log
|
||||||
|
\item Auswertung mit \emph{Kieker.Analysis}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Architekturentwurf}
|
||||||
|
\includegraphics[scale=0.6]{Architektur.png}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Zeitplan}
|
||||||
|
|
||||||
|
\begin{frame}{Zeitplan}
|
||||||
|
\includegraphics[scale=0.27]{Gantt-Project.png}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Implementierung der benötigten Funktionen bis 23.12.
|
||||||
|
\item Ab Mitte Januar zunächst Testinstrumentierung von Kielprints
|
||||||
|
\item Anschliessend Instrumentierung und Analyse im Produktivsystem
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}
|
||||||
|
\hfill
|
||||||
|
\begin{beamercolorbox}[rounded=true, center, shadow=true,sep=0.5cm]{block body}
|
||||||
|
Ich danke für Ihre Aufmerksamkeit!
|
||||||
|
\end{beamercolorbox}
|
||||||
|
\hfill\hfill
|
||||||
|
\end{frame}
|
||||||
|
\end{document}
|
||||||
|
|
||||||
|
|
66
Proposal/LaTeX/Gantt-Project.gan
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="Untitled Gantt Project" company="" webLink="http://" view-date="2012-10-01" view-index="0" gantt-divider-location="353" resource-divider-location="300" version="2.0" locale="de_DE">
|
||||||
|
<description/>
|
||||||
|
<view zooming-state="default:8" id="gantt-chart">
|
||||||
|
<field id="tpd3" name="Vorgang" width="57" order="0"/>
|
||||||
|
<field id="tpd4" name="Anfang" width="21" order="1"/>
|
||||||
|
<field id="tpd5" name="Ende" width="21" order="2"/>
|
||||||
|
</view>
|
||||||
|
<view id="resource-table">
|
||||||
|
<field id="0" name="Ressource" width="56" order="0"/>
|
||||||
|
<field id="1" name="Rolle" width="43" order="1"/>
|
||||||
|
</view>
|
||||||
|
<!-- -->
|
||||||
|
<calendars>
|
||||||
|
<day-types>
|
||||||
|
<day-type id="0"/>
|
||||||
|
<day-type id="1"/>
|
||||||
|
<calendar id="1" name="default">
|
||||||
|
<default-week sun="1" mon="0" tue="0" wed="0" thu="0" fri="0" sat="1"/>
|
||||||
|
<only-show-weekends value="false"/>
|
||||||
|
<overriden-day-types/>
|
||||||
|
<days/>
|
||||||
|
</calendar>
|
||||||
|
</day-types>
|
||||||
|
</calendars>
|
||||||
|
<tasks empty-milestones="true">
|
||||||
|
<taskproperties>
|
||||||
|
<taskproperty id="tpd0" name="type" type="default" valuetype="icon"/>
|
||||||
|
<taskproperty id="tpd1" name="priority" type="default" valuetype="icon"/>
|
||||||
|
<taskproperty id="tpd2" name="info" type="default" valuetype="icon"/>
|
||||||
|
<taskproperty id="tpd3" name="name" type="default" valuetype="text"/>
|
||||||
|
<taskproperty id="tpd4" name="begindate" type="default" valuetype="date"/>
|
||||||
|
<taskproperty id="tpd5" name="enddate" type="default" valuetype="date"/>
|
||||||
|
<taskproperty id="tpd6" name="duration" type="default" valuetype="int"/>
|
||||||
|
<taskproperty id="tpd7" name="completion" type="default" valuetype="int"/>
|
||||||
|
<taskproperty id="tpd8" name="coordinator" type="default" valuetype="text"/>
|
||||||
|
<taskproperty id="tpd9" name="predecessorsr" type="default" valuetype="text"/>
|
||||||
|
</taskproperties>
|
||||||
|
<task id="0" name="Literaturrecherche/Vorarbeiten" color="#8cb6ce" meeting="false" start="2012-11-19" duration="10" complete="0" expand="true"/>
|
||||||
|
<task id="3" name="Implementierung des Perl-Moduls" color="#8cb6ce" meeting="false" start="2012-11-26" duration="20" complete="0" expand="true"/>
|
||||||
|
<task id="5" name="Konsolidierung/Schreiben" color="#8cb6ce" meeting="false" start="2012-12-21" duration="7" complete="0" expand="true"/>
|
||||||
|
<task id="8" name="Test-Instrumentierung" color="#8cb6ce" meeting="false" start="2013-01-01" duration="9" complete="0" expand="true"/>
|
||||||
|
<task id="11" name="KielPrints-Instrumentierung" color="#8cb6ce" meeting="false" start="2013-01-14" duration="25" complete="0" expand="true"/>
|
||||||
|
<task id="14" name="Konsolidierung/Schreiben 2" color="#8cb6ce" meeting="false" start="2013-02-18" duration="15" complete="0" expand="true"/>
|
||||||
|
<task id="9" name="Abschluss der Arbeit/Vortrag" color="#8cb6ce" meeting="false" start="2013-03-11" duration="15" complete="0" expand="true"/>
|
||||||
|
</tasks>
|
||||||
|
<resources/>
|
||||||
|
<allocations/>
|
||||||
|
<vacations/>
|
||||||
|
<taskdisplaycolumns>
|
||||||
|
<displaycolumn property-id="tpd6" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd7" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd11" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd10" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd1" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd0" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd8" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd9" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd2" order="-1" width="75" visible="false"/>
|
||||||
|
<displaycolumn property-id="tpd3" order="0" width="199" visible="true"/>
|
||||||
|
<displaycolumn property-id="tpd4" order="1" width="75" visible="true"/>
|
||||||
|
<displaycolumn property-id="tpd5" order="2" width="75" visible="true"/>
|
||||||
|
</taskdisplaycolumns>
|
||||||
|
<previous/>
|
||||||
|
<roles roleset-name="Default"/>
|
||||||
|
</project>
|
70
Proposal/LaTeX/authoryear-square.bbx
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
\ProvidesFile{authoryear-square.bbx}
|
||||||
|
%% [\abx@bbxid]
|
||||||
|
|
||||||
|
\RequirePackage{xpatch}
|
||||||
|
|
||||||
|
\RequireBibliographyStyle{standard}
|
||||||
|
\ExecuteBibliographyOptions{sorting=anyt,pagetracker,labelyear}
|
||||||
|
\ExecuteBibliographyOptions{firstinits,useprefix,maxbibnames=999,maxcitenames=2,block=space}
|
||||||
|
|
||||||
|
\defbibenvironment{bibliography}
|
||||||
|
{\list
|
||||||
|
{}
|
||||||
|
{\setlength{\leftmargin}{\bibhang}%
|
||||||
|
\setlength{\itemindent}{-\leftmargin}%
|
||||||
|
\setlength{\itemsep}{\bibitemsep}%
|
||||||
|
\setlength{\parsep}{\bibparsep}}}
|
||||||
|
{\endlist}
|
||||||
|
{\item}
|
||||||
|
|
||||||
|
\DeclareFieldFormat{shorthandwidth}{#1}
|
||||||
|
\defbibenvironment{shorthands}
|
||||||
|
{\list
|
||||||
|
{\printfield[shorthandwidth]{shorthand}}
|
||||||
|
{\setlength{\labelwidth}{\shorthandwidth}%
|
||||||
|
\setlength{\leftmargin}{\labelwidth}%
|
||||||
|
\setlength{\labelsep}{\biblabelsep}%
|
||||||
|
\addtolength{\leftmargin}{\labelsep}%
|
||||||
|
\setlength{\itemsep}{\bibitemsep}%
|
||||||
|
\setlength{\parsep}{\bibparsep}%
|
||||||
|
\renewcommand*{\makelabel}[1]{##1\hss}}}
|
||||||
|
{\endlist}
|
||||||
|
{\item}
|
||||||
|
|
||||||
|
\InitializeBibliographyStyle{}
|
||||||
|
|
||||||
|
%% Changes to standard style
|
||||||
|
\renewcommand*{\nameyeardelim}{\addspace}
|
||||||
|
\renewcommand*{\bibpagerefpunct}{\iflistundef{pageref}{\addspace}{\addperiod\addspace}}
|
||||||
|
\renewcommand*{\finentrypunct}{\iflistundef{pageref}{\addperiod}{}}%
|
||||||
|
\renewbibmacro*{in:}{%
|
||||||
|
\ifentrytype{article}{}{%
|
||||||
|
\printtext{\bibstring{in}\intitlepunct}}}
|
||||||
|
\xpatchbibmacro{pageref:comp}{\multilistdelim}%
|
||||||
|
{\ifboolexpr{test {\ifnumless{\value{listcount}}{\value{liststop}}}or test \ifmoreitems}{\multilistdelim}{\finallistdelim}}{}{}
|
||||||
|
\DeclareFieldFormat
|
||||||
|
[article,inbook,incollection,inproceedings,patent,thesis,unpublished]
|
||||||
|
{title}{#1\isdot}
|
||||||
|
|
||||||
|
%% Add the citekey
|
||||||
|
\xpatchbibdriver{misc}{\setunit{\labelnamepunct}}{\setunit*{\labelnamepunct}}{}{}
|
||||||
|
\renewbibmacro*{begentry}{%
|
||||||
|
\printtext[brackets]{%
|
||||||
|
\begingroup%
|
||||||
|
\defcounter{maxnames}{\blx@maxcitenames}%
|
||||||
|
\iffieldundef{shorthand}%
|
||||||
|
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}%
|
||||||
|
{\iffieldundef{label}{\printfield[citetitle]{labeltitle}}{\printfield{label}}%
|
||||||
|
%\setunit{\nameyeardelim}%
|
||||||
|
%\iffieldundef{labelyear}{}{\printfield{labelyear}\printfield{extrayear}}%
|
||||||
|
}%
|
||||||
|
{\printnames{labelname}%
|
||||||
|
\setunit{\nameyeardelim}%
|
||||||
|
\iffieldundef{labelyear}{}{\printfield{labelyear}\printfield{extrayear}}}}%
|
||||||
|
{\printfield{shorthand}}%
|
||||||
|
\endgroup%
|
||||||
|
}%
|
||||||
|
\printtext{}\setunit{\addspace}\newblock% \printtext{\quad}or \addspace
|
||||||
|
}
|
||||||
|
|
||||||
|
\endinput
|
214
Proposal/LaTeX/authoryear-square.cbx
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
\ProvidesFile{authoryear-square.cbx}
|
||||||
|
%% [\abx@cbxid]
|
||||||
|
|
||||||
|
\ExecuteBibliographyOptions{labelyear,autocite=inline,maxcitenames=2}
|
||||||
|
\newbool{cbx:parens}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:init}{%
|
||||||
|
\ifnumless{\value{multicitecount}}{2}
|
||||||
|
{\global\boolfalse{cbx:parens}%
|
||||||
|
\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}
|
||||||
|
{\iffieldundef{prenote}
|
||||||
|
{}
|
||||||
|
{\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:reinit}{%
|
||||||
|
\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}
|
||||||
|
|
||||||
|
\newbibmacro*{cite}{%
|
||||||
|
\printtext[bibhyperref]{% Apply citation link to bibmacro output
|
||||||
|
\DeclareFieldAlias{bibhyperref}{default}% Prevent nested hyperlinks
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
|
||||||
|
{\usebibmacro{cite:label}%
|
||||||
|
%\setunit{\nameyeardelim}%
|
||||||
|
%\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\usebibmacro{cite:reinit}}
|
||||||
|
{\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\printnames{labelname}%
|
||||||
|
\setunit{\nameyeardelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\usebibmacro{cite:reinit}}%
|
||||||
|
\setunit{\multicitedelim}}}
|
||||||
|
|
||||||
|
\newbibmacro*{citeyear}{%
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\iffieldundef{labelyear}
|
||||||
|
{\usebibmacro{cite:label}%
|
||||||
|
\usebibmacro{cite:reinit}}
|
||||||
|
{\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\usebibmacro{cite:reinit}}%
|
||||||
|
\setunit{\multicitedelim}}
|
||||||
|
|
||||||
|
\newbibmacro*{textcite}{%
|
||||||
|
\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\iffieldundef{shorthand}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:shorthand}%
|
||||||
|
\global\undef\cbx@lastyear}}
|
||||||
|
{\ifbool{cbx:parens}{\bibclosebracket\global\boolfalse{cbx:parens}}{}%
|
||||||
|
\setunit*{\multicitedelim}%
|
||||||
|
\ifnameundef{labelname}
|
||||||
|
{\iffieldundef{shorthand}
|
||||||
|
{\printtext[bibhyperref]{\DeclareFieldAlias{bibhyperref}{default}\usebibmacro{cite:label}}%
|
||||||
|
\setunit{%
|
||||||
|
\global\booltrue{cbx:parens}%
|
||||||
|
\addspace\bibopenbracket}%
|
||||||
|
\ifnumequal{\value{citecount}}{1}
|
||||||
|
{\usebibmacro{prenote}}
|
||||||
|
{}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}}
|
||||||
|
{\usebibmacro{cite:shorthand}}}
|
||||||
|
{\printtext[bibhyperref]{\DeclareFieldAlias{bibhyperref}{default}\printnames{labelname}}%
|
||||||
|
\setunit{%
|
||||||
|
\global\booltrue{cbx:parens}%
|
||||||
|
\addspace\bibopenbracket}%
|
||||||
|
\ifnumequal{\value{citecount}}{1}
|
||||||
|
{\usebibmacro{prenote}}
|
||||||
|
{}%
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\iffieldundef{labelyear}
|
||||||
|
{\usebibmacro{cite:label}}
|
||||||
|
{\usebibmacro{cite:labelyear+extrayear}}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\global\undef\cbx@lastyear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:shorthand}{%
|
||||||
|
\printtext[bibhyperref]{\printfield{shorthand}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:label}{%
|
||||||
|
\iffieldundef{label}
|
||||||
|
{\printtext[bibhyperref]{\printfield[citetitle]{labeltitle}}}
|
||||||
|
{\printtext[bibhyperref]{\printfield{label}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:labelyear+extrayear}{%
|
||||||
|
\iffieldundef{labelyear}
|
||||||
|
{}
|
||||||
|
{\printtext[bibhyperref]{%
|
||||||
|
\printfield{labelyear}%
|
||||||
|
\printfield{extrayear}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:extrayear}{%
|
||||||
|
\iffieldundef{extrayear}
|
||||||
|
{}
|
||||||
|
{\printtext[bibhyperref]{\printfield{extrayear}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{textcite:postnote}{%
|
||||||
|
\usebibmacro{postnote}%
|
||||||
|
\ifthenelse{\value{multicitecount}=\value{multicitetotal}}
|
||||||
|
{\setunit{}%
|
||||||
|
\printtext{%
|
||||||
|
\ifbool{cbx:parens}
|
||||||
|
{\bibclosebracket\global\boolfalse{cbx:parens}}
|
||||||
|
{}}}
|
||||||
|
{\setunit{%
|
||||||
|
\ifbool{cbx:parens}
|
||||||
|
{\bibclosebracket\global\boolfalse{cbx:parens}}
|
||||||
|
{}%
|
||||||
|
\multicitedelim}}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\cite}
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand*{\cite}
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{citeyear}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\parencite}[\mkbibbrackets]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand*{\parencite}[\mkbibbrackets]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{citeyear}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\footcite}[\mkbibfootnote]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\footcitetext}[\mkbibfootnotetext]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\smartcite}[\iffootnote\mkbibbrackets\mkbibfootnote]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\textcite}
|
||||||
|
{\usebibmacro{cite:init}}
|
||||||
|
{\usebibmacro{citeindex}\usebibmacro{textcite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{textcite:postnote}%
|
||||||
|
\ifbool{cbx:parens}{\bibclosebracket\global\boolfalse{cbx:parens}}{}}
|
||||||
|
|
||||||
|
\DeclareMultiCiteCommand{\cites}{\cite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\parencites}[\mkbibbrackets]{\parencite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\footcites}[\mkbibfootnote]{\footcite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\footcitetexts}[\mkbibfootnotetext]{\footcitetext}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\smartcites}[\iffootnote\mkbibbrackets\mkbibfootnote]{\smartcite}
|
||||||
|
{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\textcites}{\textcite}{}
|
||||||
|
|
||||||
|
\endinput
|
47
Proposal/LaTeX/bibliography.bib
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
@mastersthesis{cau15489,
|
||||||
|
month = August,
|
||||||
|
type = {Diplomarbeit},
|
||||||
|
title = {Dynamische Analyse von COBOL-Systemarchitekturen zum modellbasierten Testen},
|
||||||
|
school = {Department of Computer Science, University of Kiel, Germany},
|
||||||
|
author = {Bettual Richter},
|
||||||
|
year = {2012},
|
||||||
|
note = {Diploma Thesis, University of Kiel (work in progress)},
|
||||||
|
keywords = { },
|
||||||
|
url = {http://eprints.uni-kiel.de/15489/},
|
||||||
|
}
|
||||||
|
|
||||||
|
@mastersthesis{cau15486,
|
||||||
|
month = Oktober,
|
||||||
|
type = {Diplomarbeit},
|
||||||
|
title = {Dynamic analysis of .NET applications for architecture-based model extraction and test generation},
|
||||||
|
school = {Department of Computer Science, University of Kiel, Germany},
|
||||||
|
author = {Felix Magedanz},
|
||||||
|
year = {2011},
|
||||||
|
keywords = { },
|
||||||
|
url = {http://eprints.uni-kiel.de/15486/},
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{gpl,
|
||||||
|
title = {GNU General Public License, version 3},
|
||||||
|
url = {http://www.gnu.org/licenses/gpl.html},
|
||||||
|
year = {2007},
|
||||||
|
month = June
|
||||||
|
}
|
||||||
|
|
||||||
|
@MANUAL{Kieker1.6UserGuide,
|
||||||
|
title = {Kieker 1.6 User Guide},
|
||||||
|
author = {{Kieker Project}},
|
||||||
|
organization = {{Software Engineering Group, Kiel University, Kiel, Germany}},
|
||||||
|
month = oct,
|
||||||
|
year = {2012},
|
||||||
|
url = {http://kieker-monitoring.net/documentation/},
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{schmalenbach2007performancemanagement,
|
||||||
|
title={Performancemanagement f{\"u}r serviceorientierte Java-Anwendungen: Werkzeug- und Methodenunterst{\"u}tzung im Spannungsfeld von Entwicklung und Betrieb},
|
||||||
|
author={Schmalenbach, C.},
|
||||||
|
isbn={9783540366317},
|
||||||
|
url={http://books.google.de/books?id=IbaEtgAACAAJ},
|
||||||
|
year={2007},
|
||||||
|
publisher={Springer}
|
||||||
|
}
|
24
Proposal/LaTeX/docstyleDE.tex
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
%% SE-KCSS-Style DE v1.1
|
||||||
|
\documentclass[10pt]{book}
|
||||||
|
\usepackage{fixltx2e}
|
||||||
|
\usepackage[resetfonts]{cmap}
|
||||||
|
\usepackage{nameref}
|
||||||
|
\usepackage[%
|
||||||
|
language=german,paper=a4paper,largepaper=true,%
|
||||||
|
algorithmBackwardCompatibility=false,algorithmForwardCompatibility=false,%
|
||||||
|
biblatexstyle=authoryear-square,biblatexOptions={natbib=true,backend=bibtex},%
|
||||||
|
acronymOptions={smaller,printonlyused}%,withpage
|
||||||
|
]{ifiseries}
|
||||||
|
\usepackage[format=hang]{caption}
|
||||||
|
\usepackage{textcomp}
|
||||||
|
\newcommand{\thesistitlepage}[5]{\gentitlepage{#1}{#2}{#3\\\Large\vspace{5ex}#4}{\Large\textsc{Christian-Albrechts-Universit\"{a}t zu Kiel\\Institut f\"{u}r Informatik\\ Arbeitsgruppe Software Engineering }\\\vspace{10ex}\begin{tabular}{rl}Betreut durch: & Prof. Dr. Wilhelm Hasselbring \\ & #5 \\\end{tabular}}}
|
||||||
|
\ExecuteBibliographyOptions{sortcase=false,babel=other,backref=true,abbreviate=false}
|
||||||
|
\ExecuteBibliographyOptions{isbn=false,url=true,doi=false,eprint=false}
|
||||||
|
\addbibresource{bibliography.bib}
|
||||||
|
|
||||||
|
\hypersetup{bookmarksdepth=3}
|
||||||
|
\hypersetup{bookmarksopen=true}
|
||||||
|
\hypersetup{bookmarksopenlevel=0}
|
||||||
|
\hypersetup{bookmarksnumbered=true}
|
||||||
|
|
||||||
|
\endinput
|
10
Proposal/LaTeX/glossary.tex
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
%E
|
||||||
|
\newglossaryentry{eprints}{name={ePrints},description={Open-Source Plattform zur Veröffentlichung von Dokumenten,\\\url{http://www.eprints.org/software}},see={moni}}
|
||||||
|
%K
|
||||||
|
\newglossaryentry{kieker}{name={Kieker},description={Software Framework zur Durchführung von Monitoringaufgaben,\\\url{http://www.kieker-monitoring.net}},see={moni}}
|
||||||
|
%M
|
||||||
|
\newglossaryentry{moni}{name={Monitoring},description={Überwachung des Verhalten eines Programmes während der Laufzeit}}
|
||||||
|
\newglossaryentry{probe}{name={monitoring probe},description={Eingefügter Messpunkt in einem Programm zur Erzeugung von \glspl{record}},plural={monitoring probes}}
|
||||||
|
\newglossaryentry{record}{name={monitoring record},description={Bei der Ausführung einer \gls{probe} erzeugter Protokoll-Eintrag einer Messung},plural={monitoring records}}
|
||||||
|
%R
|
||||||
|
\newglossaryentry{recursion}{name={Rekursion},description={siehe \gls{recursion}}}
|
939
Proposal/LaTeX/ifiseries.sty
Normal file
|
@ -0,0 +1,939 @@
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{ifiseries}
|
||||||
|
\RequirePackage{kvoptions}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Options and their defaults
|
||||||
|
|
||||||
|
\DeclareBoolOption[false]{legacytexlive} % for the ancient TeX Live shipped with Ubuntu
|
||||||
|
\DeclareBoolOption[false]{natbib}
|
||||||
|
\DeclareBoolOption[false]{babelbib}
|
||||||
|
\DeclareBoolOption[true]{biblatex}
|
||||||
|
\DeclareStringOption[sort,numbers]{natbibOptions}
|
||||||
|
\DeclareStringOption[alphabetic]{biblatexstyle}
|
||||||
|
\DeclareStringOption[maxcitenames=4,maxbibnames=10,babel=other]{biblatexOptions}
|
||||||
|
\DeclareStringOption[]{bibresource}
|
||||||
|
\DeclareStringOption[ngerman,english]{babelOptions}
|
||||||
|
\DeclareStringOption[]{variorefOptions}
|
||||||
|
\DeclareStringOption[linesnumbered,ruled,vlined]{algorithmOptions}
|
||||||
|
\DeclareStringOption[alphaurl]{bibliographystyle} % only for bibtex, not biblatex
|
||||||
|
\DeclareStringOption[utf8]{inputencOptions}
|
||||||
|
\DeclareBoolOption[true]{tikz}
|
||||||
|
\DeclareBoolOption[true]{algorithmForwardCompatibility}
|
||||||
|
\DeclareBoolOption[true]{algorithmBackwardCompatibility}
|
||||||
|
\DeclareStringOption[smaller,nohyperlinks,printonlyused]{acronymOptions}
|
||||||
|
\DeclareStringOption[caption=false,font=footnotesize]{subfigOptions}
|
||||||
|
\DeclareStringOption[]{theorems}
|
||||||
|
\DeclareStringOption[Bibliography]{refname}
|
||||||
|
\DeclareStringOption[black]{hypercolor}
|
||||||
|
\DeclareBoolOption[false]{dottednumbers}
|
||||||
|
\DeclareStringOption[english]{language}
|
||||||
|
\DeclareBoolOption[true]{runningtitle}
|
||||||
|
|
||||||
|
\DeclareBoolOption[true]{layout}
|
||||||
|
\DeclareBoolOption[true]{pagelayout}
|
||||||
|
\DeclareStringOption[ustrade]{paper}
|
||||||
|
\DeclareStringOption[]{paperwidth}
|
||||||
|
\DeclareStringOption[]{paperheight}
|
||||||
|
\DeclareStringOption[0mm]{bindingoffset}
|
||||||
|
\DeclareStringOption[.25]{halfparskipfill}
|
||||||
|
\DeclareBoolOption[false]{halfparskip}
|
||||||
|
\DeclareStringOption[Palatino]{font}
|
||||||
|
\DeclareStringOption[12]{marginfrac}
|
||||||
|
\DeclareStringOption[floatrow]{figure}
|
||||||
|
\DeclareStringOption[]{compact}
|
||||||
|
\DeclareStringOption[1.5]{headsepmult}
|
||||||
|
\DeclareStringOption[3]{footskipmult}
|
||||||
|
\DeclareBoolOption[false]{leftmarkright}
|
||||||
|
\if@twoside
|
||||||
|
\DeclareBoolOption[false]{hcenter}
|
||||||
|
\else
|
||||||
|
\DeclareBoolOption[true]{hcenter}
|
||||||
|
\fi
|
||||||
|
\@ifclassloaded{book}%
|
||||||
|
{\DeclareStringOption[section]{theoremswithin}}%
|
||||||
|
{\DeclareStringOption[subsection]{theoremswithin}}
|
||||||
|
|
||||||
|
\DeclareBoolOption[false]{largepaper}
|
||||||
|
|
||||||
|
\ProcessKeyvalOptions*
|
||||||
|
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{xifthen}
|
||||||
|
\RequirePackage{expl3}
|
||||||
|
|
||||||
|
\ifthenelse{\boolean{ifiseries@legacytexlive}}{% FIXME why can't i use \ififiseries@legacytexlive?
|
||||||
|
\let\ifiseries@natbibtrue\@undefined%
|
||||||
|
\let\ifiseries@natbibfalse\@undefined%
|
||||||
|
\let\ififiseries@natbib\@undefined%
|
||||||
|
\let\ifiseries@biblatextrue\@undefined%
|
||||||
|
\let\ifiseries@biblatexfalse\@undefined%
|
||||||
|
\let\ififiseries@biblatex\@undefined%
|
||||||
|
\DeclareBoolOption[true]{natbib}%
|
||||||
|
\DeclareBoolOption[false]{biblatex}%
|
||||||
|
}{}
|
||||||
|
|
||||||
|
\ififiseries@largepaper
|
||||||
|
\let\ifiseries@marginfrac\@undefined%
|
||||||
|
\let\ifiseries@headsepmult\@undefined%
|
||||||
|
\let\ifiseries@footskipmult\@undefined%
|
||||||
|
\DeclareStringOption[9]{marginfrac}%
|
||||||
|
\DeclareStringOption[2]{headsepmult}%
|
||||||
|
\DeclareStringOption[3.5]{footskipmult}%
|
||||||
|
\fi
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
% TeX Live 2009 (still shipped with Ubuntu in 2012) does not provide the 'onn' version.
|
||||||
|
% So we have to use a little trick to get the argument expanded.
|
||||||
|
% This will occur frequently in this code.
|
||||||
|
\newcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{english} {\relax}
|
||||||
|
{german} {
|
||||||
|
\let\ifiseries@babelOptions\@undefined%
|
||||||
|
\let\ifiseries@variorefOptions\@undefined%
|
||||||
|
\let\ifiseries@refname\@undefined%
|
||||||
|
\let\ifiseries@dottednumberstrue\@undefined%
|
||||||
|
\let\ifiseries@dottednumbersfalse\@undefined%
|
||||||
|
\let\ififiseries@dottednumbers\@undefined%
|
||||||
|
\DeclareStringOption[english,ngerman]{babelOptions}%
|
||||||
|
\DeclareStringOption[ngerman]{variorefOptions}%
|
||||||
|
\DeclareStringOption[Bibliografie]{refname}%
|
||||||
|
\DeclareBoolOption[true]{dottednumbers}%
|
||||||
|
\ifthenelse{\boolean{ifiseries@legacytexlive}}{%
|
||||||
|
\let\ifiseries@babelbibtrue\@undefined%
|
||||||
|
\let\ifiseries@babelbibfalse\@undefined%
|
||||||
|
\let\ififiseries@babelbib\@undefined%
|
||||||
|
\let\ifiseries@bibliographystyle\@undefined%
|
||||||
|
\DeclareBoolOption[true]{babelbib}%
|
||||||
|
\DeclareStringOption[babalpha]{bibliographystyle}%
|
||||||
|
}{}
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unsupported~language:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@language}
|
||||||
|
|
||||||
|
\ProcessKeyvalOptions*
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Packages with no or minimal influence on the main layout
|
||||||
|
|
||||||
|
\RequirePackage{etex}
|
||||||
|
\RequirePackage[\ifiseries@inputencOptions]{inputenc}
|
||||||
|
\RequirePackage[T1]{fontenc}
|
||||||
|
\@ifclassloaded{beamer}{}{\RequirePackage[rgb,svgnames]{xcolor}}
|
||||||
|
\RequirePackage[\ifiseries@babelOptions]{babel}
|
||||||
|
|
||||||
|
\RequirePackage{amsmath}
|
||||||
|
\RequirePackage[matha]{mathabx}
|
||||||
|
\RequirePackage{amssymb}
|
||||||
|
\RequirePackage{amsfonts}
|
||||||
|
\RequirePackage{amstext}
|
||||||
|
\RequirePackage{mathtools}
|
||||||
|
\RequirePackage{nicefrac}
|
||||||
|
\RequirePackage{graphicx}
|
||||||
|
\RequirePackage{grffile}
|
||||||
|
\RequirePackage{eso-pic}
|
||||||
|
\RequirePackage{listings}
|
||||||
|
\RequirePackage{booktabs}
|
||||||
|
\RequirePackage{multicol}
|
||||||
|
\RequirePackage{multirow}
|
||||||
|
\RequirePackage[autolanguage]{numprint}
|
||||||
|
\RequirePackage{units}
|
||||||
|
\RequirePackage[babel=true]{csquotes}
|
||||||
|
\ififiseries@natbib\RequirePackage[\ifiseries@natbibOptions]{natbib}\fi
|
||||||
|
\ififiseries@babelbib\RequirePackage{babelbib}\fi
|
||||||
|
\ififiseries@biblatex
|
||||||
|
\RequirePackage[style=\ifiseries@biblatexstyle,\ifiseries@biblatexOptions]{biblatex}%
|
||||||
|
\ifdefempty{\ifiseries@bibresource}{}{\addbibresource{\ifiseries@bibresource}}%
|
||||||
|
\DeclareFieldFormat[article,unpublished,inproceedings]{realtitlecase}{\MakeSentenceCase*{#1}}%
|
||||||
|
%% cf. texmf-dist/tex/latex/biblatex/biblatex.def
|
||||||
|
\renewbibmacro*{title}{%
|
||||||
|
\ifboolexpr{
|
||||||
|
test {\iffieldundef{title}}
|
||||||
|
and
|
||||||
|
test {\iffieldundef{subtitle}}
|
||||||
|
}
|
||||||
|
{}
|
||||||
|
{\printtext[title]{%
|
||||||
|
\printfield[realtitlecase]{title}%
|
||||||
|
\setunit{\subtitlepunct}%
|
||||||
|
\printfield[realtitlecase]{subtitle}}%
|
||||||
|
\newunit}%
|
||||||
|
\printfield{titleaddon}}%
|
||||||
|
%%
|
||||||
|
\else
|
||||||
|
\bibliographystyle{\ifiseries@bibliographystyle}%
|
||||||
|
\RequirePackage{bibentry}%
|
||||||
|
\fi
|
||||||
|
\RequirePackage[\ifiseries@variorefOptions]{varioref}
|
||||||
|
\RequirePackage{url}
|
||||||
|
\RequirePackage{dsfont}
|
||||||
|
\RequirePackage{bbding}
|
||||||
|
\RequirePackage{pifont}
|
||||||
|
\RequirePackage{calc}
|
||||||
|
\RequirePackage{blindtext}
|
||||||
|
\RequirePackage{setspace}
|
||||||
|
\RequirePackage{relsize}
|
||||||
|
\RequirePackage[\ifiseries@algorithmOptions]{algorithm2e}
|
||||||
|
\ififiseries@algorithmForwardCompatibility
|
||||||
|
\ifthenelse{\isundefined{\DontPrintSemicolon}}{\newcommand*{\DontPrintSemicolon}{\dontprintsemicolon}}{}
|
||||||
|
\ifthenelse{\isundefined{\SetAlgoVlined}}{\newcommand*{\SetAlgoVlined}{\SetVline}}{}
|
||||||
|
\ifthenelse{\isundefined{\SetAlgoNoLine}}{\newcommand*{\SetAlgoNoLine}{\SetNoline}}{}
|
||||||
|
\fi
|
||||||
|
\ififiseries@algorithmBackwardCompatibility
|
||||||
|
\ifthenelse{\isundefined{\RestyleAlgo}}{\let\RestyleAlgo\restylealgo}
|
||||||
|
\fi
|
||||||
|
\RequirePackage[compatibility=false]{caption} % compatibility switched off for hyperref
|
||||||
|
\RequirePackage{bookmark}
|
||||||
|
\RequirePackage{hyperref}
|
||||||
|
\hypersetup{%
|
||||||
|
final=true,%
|
||||||
|
colorlinks=true,%
|
||||||
|
linkcolor=\ifiseries@hypercolor,%
|
||||||
|
citecolor=\ifiseries@hypercolor,%
|
||||||
|
urlcolor=\ifiseries@hypercolor,%
|
||||||
|
}
|
||||||
|
\RequirePackage[strict]{changepage}
|
||||||
|
\ififiseries@tikz
|
||||||
|
\RequirePackage{tikz}
|
||||||
|
\usetikzlibrary{positioning}
|
||||||
|
\usetikzlibrary{arrows}
|
||||||
|
\usetikzlibrary{shapes}
|
||||||
|
\usetikzlibrary{shadows}
|
||||||
|
\usetikzlibrary{decorations.text}
|
||||||
|
\usetikzlibrary{decorations.markings}
|
||||||
|
\usetikzlibrary{decorations.pathmorphing}
|
||||||
|
\usetikzlibrary{petri}
|
||||||
|
\usetikzlibrary{shapes.symbols}
|
||||||
|
\usetikzlibrary{shapes.arrows}
|
||||||
|
\usetikzlibrary{decorations}
|
||||||
|
\usetikzlibrary{decorations.pathreplacing}
|
||||||
|
\usetikzlibrary{decorations.shapes}
|
||||||
|
\usetikzlibrary{calc}
|
||||||
|
\usetikzlibrary{chains}
|
||||||
|
\usetikzlibrary{patterns}
|
||||||
|
\usetikzlibrary{matrix}
|
||||||
|
\usetikzlibrary{backgrounds}
|
||||||
|
\usetikzlibrary{mindmap}
|
||||||
|
\usetikzlibrary{topaths}
|
||||||
|
\usetikzlibrary{automata}
|
||||||
|
\fi
|
||||||
|
\RequirePackage{microtype}
|
||||||
|
\RequirePackage{enumitem} %%% add 'inline' option once it is supported everywhere
|
||||||
|
\newlist{compactitemize}{itemize}{3}
|
||||||
|
\setlist[compactitemize]{label=\raisebox{.1em}{\smaller\textbullet}}
|
||||||
|
\newlist{compactenumerate}{enumerate}{2}
|
||||||
|
\setlist[compactenumerate]{label=\arabic*.}
|
||||||
|
\newlist{compactdescription}{description}{3}
|
||||||
|
\RequirePackage{placeins}
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{floatrow} {\RequirePackage{floatrow}\DeclareCaptionSubType[alph]{figure}}
|
||||||
|
{subfig} {\RequirePackage[\ifiseries@subfigOptions]{subfig}\RequirePackage{sidecap}\sidecaptionvpos{figure}{t}}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~figure~system:~#1}\@ehc}}
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@figure}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
|
||||||
|
\RequirePackage[\ifiseries@acronymOptions]{acronym}
|
||||||
|
\RequirePackage{xspace}
|
||||||
|
\RequirePackage{hyphenat}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Useful commands
|
||||||
|
|
||||||
|
%% Remove margins for screen viewing.
|
||||||
|
%% This command is used by the code below if 'compact' is set.
|
||||||
|
%% It is the same as the '\nomargin' command in 'localKit'.
|
||||||
|
\newcommand*{\nomargin}{
|
||||||
|
\setlength{\oddsidemargin}{.02\textwidth-1in}
|
||||||
|
\setlength{\evensidemargin}{.02\textwidth-1in}
|
||||||
|
\setlength{\paperwidth}{1.04\textwidth}
|
||||||
|
\setlength{\paperheight}{\headheight+\headsep+\textheight+\footskip}
|
||||||
|
\setlength{\paperheight}{1.04\paperheight}
|
||||||
|
\setlength{\topmargin}{.02\paperheight-1in}
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Abbreviations
|
||||||
|
\newcommand*{\abbrdot}{\protect\@ifnextchar.{}{.\@\xspace}}
|
||||||
|
\newcommand*{\abbrcomma}{\protect\@ifnextchar,{}{,\xspace}}
|
||||||
|
\newcommand*{\eg}{e.\@\,g.\@\abbrcomma}
|
||||||
|
\newcommand*{\ie}{i.\@\,e.\@\abbrcomma}
|
||||||
|
\newcommand*{\cf}{cf.\@\abbrcomma}
|
||||||
|
\newcommand*{\Eg}{E.\@\,g.\@\abbrcomma}
|
||||||
|
\newcommand*{\Ie}{I.\@\,e.\@\abbrcomma}
|
||||||
|
\newcommand*{\Cf}{Cf.\@\abbrcomma}
|
||||||
|
\newcommand*{\etal}{et~al\abbrdot}
|
||||||
|
\newcommand*{\etc}{etc\abbrdot}
|
||||||
|
\newcommand*{\vs}{vs\abbrdot}
|
||||||
|
\newcommand*{\Wlg}{W.l.o.g\abbrdot}
|
||||||
|
\newcommand*{\wlg}{w.l.o.g\abbrdot}
|
||||||
|
\newcommand*{\OBdA}{O.B.d.A\abbrdot}
|
||||||
|
\newcommand*{\oBdA}{o.B.d.A\abbrdot}
|
||||||
|
\newcommand*{\wrt}{w.r.t.\@\xspace}
|
||||||
|
\newcommand*{\rv}{r.v.\@\xspace}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Theorems. If 'theorems' is empty, nothing happens here.
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{numbersfirst} {
|
||||||
|
\ififiseries@dottednumbers% FIXME how can I pass through boolean options?
|
||||||
|
\RequirePackage[within=\ifiseries@theoremswithin,likeequations,language=\ifiseries@language,dottednumbers=true]{localTheorem}%
|
||||||
|
\else%
|
||||||
|
\RequirePackage[within=\ifiseries@theoremswithin,likeequations,language=\ifiseries@language,dottednumbers=false]{localTheorem}%
|
||||||
|
\fi%
|
||||||
|
\let\@subsection\subsection%
|
||||||
|
\renewcommand*\subsection{\@ifnextchar*{\@subsection}{\@subsection*}}%
|
||||||
|
\let\@subsubsection\subsubsection%
|
||||||
|
\renewcommand*\subsubsection{\@ifnextchar*{\@subsubsection}{\@subsubsection*}}%
|
||||||
|
}
|
||||||
|
{numberslast} {
|
||||||
|
\ififiseries@dottednumbers%
|
||||||
|
\RequirePackage[numbersfirst=false,language=\ifiseries@language,dottednumbers=true]{localTheorem}%
|
||||||
|
\else%
|
||||||
|
\RequirePackage[numbersfirst=false,language=\ifiseries@language,dottednumbers=false]{localTheorem}%
|
||||||
|
\fi%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~theorem~system:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@theorems}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Packages and settings with influence on the main layout
|
||||||
|
|
||||||
|
\ififiseries@layout
|
||||||
|
|
||||||
|
\newcommand*{\ifiseries@titlefontfamily}{}
|
||||||
|
\newcommand*{\ifiseries@sectionfontweight}{\bfseries}
|
||||||
|
\newcommand*{\ifiseries@chapterfontweight}{\bfseries}
|
||||||
|
|
||||||
|
%% Font and linespread.
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{Bera} {
|
||||||
|
\RequirePackage[scaled]{beraserif}%
|
||||||
|
\RequirePackage[scaled=.90]{berasans}%
|
||||||
|
\RequirePackage[scaled=.90]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Charter} { %% sometimes problem: "Too many math alphabets used in version normal."
|
||||||
|
\usepackage[bitstream-charter]{mathdesign}%
|
||||||
|
\RequirePackage[scaled]{berasans}%
|
||||||
|
\RequirePackage[scaled]{beramono}%
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{ConcreteEuler} {
|
||||||
|
\RequirePackage{lmodern}%
|
||||||
|
\RequirePackage[boldsans]{concmath}%
|
||||||
|
\RequirePackage{eulervm}%
|
||||||
|
\RequirePackage[scaled=.84]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{DejaVu} {
|
||||||
|
\RequirePackage[scaled]{DejaVuSerif}
|
||||||
|
\RequirePackage{eulervm}
|
||||||
|
\RequirePackage[scaled=.95]{beramono}
|
||||||
|
\linespread{1.10}
|
||||||
|
}
|
||||||
|
{DejaVuCondensed} {
|
||||||
|
\RequirePackage[scaled]{DejaVuSerifCondensed}
|
||||||
|
\RequirePackage{eulervm}
|
||||||
|
\RequirePackage[scaled=.95]{beramono}
|
||||||
|
\linespread{1.10}
|
||||||
|
}
|
||||||
|
{Kerkis} { %% some problems in math mode, e.g., tildas extend into symbols
|
||||||
|
\usepackage{kmath,kerkis}%
|
||||||
|
\let\openbox\@undefined%
|
||||||
|
\RequirePackage[scaled=.81]{berasans}%
|
||||||
|
\RequirePackage[scaled=.81]{beramono}%
|
||||||
|
\renewcommand*{\bfdefault}{sb}%
|
||||||
|
\linespread{1.10}%
|
||||||
|
}
|
||||||
|
{KP} {
|
||||||
|
\RequirePackage{kpfonts}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{LatinModern} {
|
||||||
|
\RequirePackage{lmodern}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
\let\@bfseries\bfseries%
|
||||||
|
\renewcommand*{\bfseries}{\sffamily\@bfseries\fontseries{sbc}\selectfont}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{NewCenturySchoolbook} {
|
||||||
|
\RequirePackage{fouriernc}%
|
||||||
|
\RequirePackage[scaled=.85]{beramono}%
|
||||||
|
\linespread{1.10}%
|
||||||
|
}
|
||||||
|
{Palatino} {
|
||||||
|
\RequirePackage[sc]{mathpazo}%
|
||||||
|
\@ifclassloaded{beamer}{%
|
||||||
|
\RequirePackage[scaled=.90]{helvet}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
}{%
|
||||||
|
\RequirePackage[scaled=.80]{berasans}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Schola} {
|
||||||
|
\RequirePackage{fouriernc}% only for the math
|
||||||
|
\RequirePackage{tgschola}%
|
||||||
|
\RequirePackage[scaled=.88]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Times} {
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\RequirePackage{mathptmx}%
|
||||||
|
\RequirePackage[scaled=.87]{helvet}%
|
||||||
|
\RequirePackage[scaled=.82]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Termes} {
|
||||||
|
\RequirePackage{tgtermes}%
|
||||||
|
\RequirePackage[scaled=.86]{berasans}%
|
||||||
|
\RequirePackage[scaled=.86]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{TX} {
|
||||||
|
\RequirePackage{txfonts}%
|
||||||
|
\RequirePackage[scaled=.86]{berasans}%
|
||||||
|
\RequirePackage[scaled=.86]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Utopia} {
|
||||||
|
\RequirePackage[widespace]{fourier}%
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\RequirePackage[scaled=.82]{berasans}%
|
||||||
|
\RequirePackage[scaled=.82]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~font:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@font}
|
||||||
|
|
||||||
|
%% \prg_case_str cannot occur inside an argument.
|
||||||
|
%% So we have to prepare several commands here to be called later
|
||||||
|
%% inside the \@ifclassloaded.
|
||||||
|
\ExplSyntaxOn
|
||||||
|
%
|
||||||
|
\newcommand{\ifiseries@temp@paper}[1]{
|
||||||
|
\prg_case_str:nnn{#1} {
|
||||||
|
{} {\relax}
|
||||||
|
{ustrade} {\geometry{paperwidth=15.24cm, paperheight=22.86cm}}
|
||||||
|
{15522} {\geometry{paperwidth=15.50cm, paperheight=22.00cm}}
|
||||||
|
{royal} {\geometry{paperwidth=15.57cm, paperheight=23.39cm}}
|
||||||
|
{crownquarto} {\geometry{paperwidth=18.91cm, paperheight=24.589cm}}
|
||||||
|
}{\geometry{paper=\ifiseries@paper}}}
|
||||||
|
%
|
||||||
|
\newcommand{\ifiseries@temp@compact}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{moderate} {
|
||||||
|
\setlength{\headsep}{.5\baselineskip}%
|
||||||
|
\setlength{\footskip}{\baselineskip}%
|
||||||
|
\nomargin%
|
||||||
|
}
|
||||||
|
{strong} {
|
||||||
|
%% This does the same as the '\ebook' command in 'localKit'.
|
||||||
|
\fancyhf{}%
|
||||||
|
\fancyfoot[R]{\thepage}%
|
||||||
|
\fancypagestyle{plain}{\fancyhf{}\fancyfoot[R]{\thepage}}%
|
||||||
|
\setlength{\headsep}{0pt}%
|
||||||
|
\setlength{\headheight}{0pt}%
|
||||||
|
%\setlength{\topskip}{0pt}% affects height of textblock in ways difficult to determine!
|
||||||
|
\setlength{\footskip}{1.5\baselineskip}%
|
||||||
|
\setlength{\oddsidemargin}{.02\textwidth-1in}%
|
||||||
|
\setlength{\evensidemargin}{.02\textwidth-1in}%
|
||||||
|
\setlength{\paperwidth}{1.04\textwidth}%
|
||||||
|
\setlength{\paperheight}{\textheight+\footskip}%
|
||||||
|
\setlength{\topmargin}{.005\paperheight-1in}% CHANGE
|
||||||
|
\setlength{\paperheight}{1.02\paperheight}%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~compact~system:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
%% End of preparations.
|
||||||
|
|
||||||
|
\@ifclassloaded{beamer}{}{%
|
||||||
|
%% Page layout.
|
||||||
|
\ififiseries@pagelayout
|
||||||
|
\RequirePackage{geometry}
|
||||||
|
\expandafter\ifiseries@temp@paper\expandafter{\ifiseries@paper}
|
||||||
|
\ifdefempty{\ifiseries@paperheight}{}{\ifdefempty{\ifiseries@paperwidth}{}%
|
||||||
|
{\geometry{paperwidth=\ifiseries@paperwidth,paperheight=\ifiseries@paperheight}}}
|
||||||
|
%
|
||||||
|
\ifthenelse
|
||||||
|
{\equal{\@ptsize}{1}}
|
||||||
|
{\setlength{\headheight}{13.59999pt}}
|
||||||
|
{}
|
||||||
|
%
|
||||||
|
\ififiseries@hcenter
|
||||||
|
\geometry{%
|
||||||
|
bindingoffset=\ifiseries@bindingoffset, %
|
||||||
|
heightrounded, %
|
||||||
|
headsep=\ifiseries@headsepmult\baselineskip, %
|
||||||
|
footskip=\ifiseries@footskipmult\baselineskip, %
|
||||||
|
left=3\paperwidth/(2*\ifiseries@marginfrac), hmarginratio=1:1, %
|
||||||
|
includehead, top=\paperheight/\ifiseries@marginfrac, vmarginratio=1:2}
|
||||||
|
\else
|
||||||
|
\geometry{%
|
||||||
|
bindingoffset=\ifiseries@bindingoffset, %
|
||||||
|
heightrounded, %
|
||||||
|
headsep=\ifiseries@headsepmult\baselineskip, %
|
||||||
|
footskip=\ifiseries@footskipmult\baselineskip, %
|
||||||
|
left=\paperwidth/\ifiseries@marginfrac, hmarginratio=1:2, %
|
||||||
|
includehead, top=\paperheight/\ifiseries@marginfrac, vmarginratio=1:2}
|
||||||
|
\fi
|
||||||
|
\fi % pagelayout
|
||||||
|
|
||||||
|
%% Folios and running titles (and others, see below).
|
||||||
|
\ififiseries@leftmarkright\let\rightmark\leftmark\fi
|
||||||
|
\RequirePackage{fancyhdr}
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\fancyhf{}
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\let\@frontmatter\frontmatter
|
||||||
|
\renewcommand*{\frontmatter}{\@frontmatter\renewcommand*{\chaptermark}[1]{\markboth{##1}{##1}}}
|
||||||
|
\let\@mainmatter\mainmatter
|
||||||
|
\renewcommand*{\mainmatter}{\@mainmatter\renewcommand*{\chaptermark}[1]{\markboth{\thechapter. \ ##1}{}}}
|
||||||
|
\let\@backmatter\backmatter
|
||||||
|
\renewcommand*{\backmatter}{\@backmatter\bookmarksetup{startatroot}}
|
||||||
|
\let\@appendix\appendix
|
||||||
|
\renewcommand*{\appendix}{\bookmarksetup{startatroot}\@appendix}
|
||||||
|
\fancyhead[LE]{\nouppercase{\leftmark}}
|
||||||
|
}{ %%% else ifclassloaded book
|
||||||
|
\ififiseries@runningtitle\fancyhead[LE]{\nouppercase{\rightmark}}\fi
|
||||||
|
} %%% end ifclassloaded book
|
||||||
|
\ififiseries@runningtitle\fancyhead[RO]{\nouppercase{\rightmark}}\fi
|
||||||
|
\fancyfoot[RO]{\thepage}
|
||||||
|
\fancyfoot[LE]{\thepage}
|
||||||
|
\renewcommand*{\headrulewidth}{0pt}
|
||||||
|
\fancypagestyle{plain}{\fancyhf{}\fancyfoot[LE]{\thepage}\fancyfoot[RO]{\thepage}}
|
||||||
|
|
||||||
|
%% Compact system: reduce margins.
|
||||||
|
\expandafter\ifiseries@temp@compact\expandafter{\ifiseries@compact}
|
||||||
|
|
||||||
|
%% Empty clearpages (i.e., pages left blank before a chapter start).
|
||||||
|
\renewcommand*{\cleardoublepage}{%
|
||||||
|
\clearpage
|
||||||
|
\if@twoside
|
||||||
|
\ifodd
|
||||||
|
\c@page
|
||||||
|
\else
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\hbox{}
|
||||||
|
\newpage
|
||||||
|
\if@twocolumn
|
||||||
|
\hbox{}
|
||||||
|
\newpage
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Section headings.
|
||||||
|
\RequirePackage{sectsty}
|
||||||
|
\sectionfont{\normalfont\Large\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\subsectionfont{\normalfont\large\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\subsubsectionfont{\normalfont\normalsize\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\ififiseries@dottednumbers
|
||||||
|
\def\@seccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\def\@subseccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\def\@subsubseccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Part title page (package 'sectsty' must be loaded first).
|
||||||
|
\newenvironment{centerpage}%
|
||||||
|
{\begin{adjustwidth*}%
|
||||||
|
{(\paperwidth-\textwidth)/2-1in-\oddsidemargin+\ifiseries@bindingoffset}%
|
||||||
|
{(\paperwidth-\textwidth)/2-1in-\evensidemargin}%
|
||||||
|
\centering}%
|
||||||
|
{\end{adjustwidth*}}
|
||||||
|
\newcommand*{\typesetpart}[1]{{%
|
||||||
|
\begin{centerpage}
|
||||||
|
\null
|
||||||
|
\vspace{.20\textheight}
|
||||||
|
\interlinepenalty \@M
|
||||||
|
\normalfont
|
||||||
|
\ifnum \c@secnumdepth >-2\relax
|
||||||
|
\LARGE\sc\bfseries\ifiseries@titlefontfamily \partname\nobreakspace\thepart
|
||||||
|
\par\normalsize\normalfont
|
||||||
|
\vskip 20\p@
|
||||||
|
\fi
|
||||||
|
\Huge \bfseries \ifiseries@titlefontfamily #1\par
|
||||||
|
\end{centerpage}
|
||||||
|
}}
|
||||||
|
\renewcommand*{\part}{%
|
||||||
|
\if@openright
|
||||||
|
\FloatBarrier
|
||||||
|
\newpage\thispagestyle{empty}\hbox{}
|
||||||
|
\cleardoublepage
|
||||||
|
\else
|
||||||
|
\clearpage
|
||||||
|
\fi
|
||||||
|
\thispagestyle{empty}%
|
||||||
|
\if@twocolumn
|
||||||
|
\onecolumn
|
||||||
|
\@tempswatrue
|
||||||
|
\else
|
||||||
|
\@tempswafalse
|
||||||
|
\fi
|
||||||
|
\secdef\@part\@spart%
|
||||||
|
}
|
||||||
|
\renewcommand*{\@part}[2][]{%
|
||||||
|
\ifnum \c@secnumdepth >-2\relax
|
||||||
|
\refstepcounter{part}%
|
||||||
|
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
|
||||||
|
\else
|
||||||
|
\addcontentsline{toc}{part}{#1}%
|
||||||
|
\fi
|
||||||
|
\markboth{}{}%
|
||||||
|
\typesetpart{#2}%
|
||||||
|
\@endpart%
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Chapter titles
|
||||||
|
%% cf. texlive/2011/texmf-dist/tex/latex/base/book.cls
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\renewcommand*{\@makechapterhead}[1]{%
|
||||||
|
%\vspace*{20\p@}%
|
||||||
|
{\parindent \z@ \flushright \normalfont
|
||||||
|
\ifnum \c@secnumdepth >\m@ne
|
||||||
|
\if@mainmatter
|
||||||
|
\large\sc\ifiseries@chapterfontweight\ifiseries@titlefontfamily \@chapapp\space \thechapter
|
||||||
|
\par\normalsize\normalfont\nobreak
|
||||||
|
\vskip 20\p@
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
\interlinepenalty\@M
|
||||||
|
\huge \ifiseries@chapterfontweight \ifiseries@titlefontfamily #1\par\nobreak
|
||||||
|
\vskip 50\p@
|
||||||
|
}}
|
||||||
|
\renewcommand*{\@makeschapterhead}[1]{%
|
||||||
|
%\vspace*{50\p@}%
|
||||||
|
{\parindent \z@ \flushright
|
||||||
|
\normalfont
|
||||||
|
\interlinepenalty\@M
|
||||||
|
{\huge\bfseries #1\par\nobreak}
|
||||||
|
\vskip 50\p@
|
||||||
|
}}
|
||||||
|
}{} %%% end ifclassloaded book
|
||||||
|
} %%% end ifclassloaded not beamer
|
||||||
|
|
||||||
|
%% Bibliography.
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\newcommand*{\preparebibliography}{%
|
||||||
|
\renewcommand*{\refname}{\ifiseries@refname}%
|
||||||
|
\cleardoublepage
|
||||||
|
\phantomsection
|
||||||
|
\addcontentsline{toc}{chapter}{\refname}
|
||||||
|
}%
|
||||||
|
\newcommand*{\tocbibliography}{%
|
||||||
|
\preparebibliography%
|
||||||
|
\ififiseries@biblatex\printbibliography\else\bibliography{\ifiseries@bibresource}\fi}}{%
|
||||||
|
\newcommand*{\preparebibliography}{%
|
||||||
|
\renewcommand*{\refname}{\ifiseries@refname}%
|
||||||
|
\phantomsection
|
||||||
|
\addcontentsline{toc}{section}{\refname}
|
||||||
|
}%
|
||||||
|
\newcommand*{\tocbibliography}{%
|
||||||
|
\preparebibliography%
|
||||||
|
\ififiseries@biblatex\printbibliography\else\bibliography{\ifiseries@bibresource}\fi}}
|
||||||
|
|
||||||
|
%% For multiple authors.
|
||||||
|
\newcommand*{\andauthor}{\\[.5\baselineskip]}
|
||||||
|
|
||||||
|
%% Command to create generic cover pages.
|
||||||
|
\ifthenelse{\equal{\ifiseries@compact}{}}{\newcommand*{\ifiseries@titlepagetopskip}{}}%
|
||||||
|
{\newcommand*{\ifiseries@titlepagetopskip}{\vspace*{5ex}}}
|
||||||
|
\newcommand{\gentitlepage}[4]{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\begin{centerpage}
|
||||||
|
\ifiseries@titlepagetopskip%
|
||||||
|
\Huge #1\\
|
||||||
|
\normalsize\vspace{5ex}
|
||||||
|
\Large \ifthenelse{\equal{#2}{}}{\mbox{ }}{#2}\\
|
||||||
|
\normalsize\vspace{5ex}
|
||||||
|
\Large #3\\
|
||||||
|
\normalsize\vfill
|
||||||
|
#4
|
||||||
|
\end{centerpage}}
|
||||||
|
|
||||||
|
%% Command to create the cover page for dissertations.
|
||||||
|
\newcommand{\disstitlepage}[5]{%
|
||||||
|
\gentitlepage{#1}{#2}{#3}{%
|
||||||
|
Dissertation\\
|
||||||
|
zur Erlangung des akademischen Grades\\
|
||||||
|
%
|
||||||
|
\ifstrequal{#4}{nat}{%
|
||||||
|
Doktor der Naturwissenschaften\\%
|
||||||
|
(Dr.~rer.~nat.)\\%
|
||||||
|
}{\ifstrequal{#4}{ing}{%
|
||||||
|
Doktor der Ingenieurwissenschaften\\%
|
||||||
|
(Dr.-Ing.)\\%
|
||||||
|
}{}}%
|
||||||
|
%
|
||||||
|
der Technischen Fakult\"at\\
|
||||||
|
der Christian-Albrechts-Universit\"at zu Kiel\\
|
||||||
|
eingereicht im Jahr #5}}
|
||||||
|
|
||||||
|
%% Command to create the cover page for student's thesis.
|
||||||
|
\newcommand{\studtitlepage}[7]{%
|
||||||
|
\gentitlepage{#1}{#2}{#3}{%
|
||||||
|
#4\\
|
||||||
|
eingereicht im Jahr #5\\
|
||||||
|
\vspace{1ex}
|
||||||
|
Christian-Albrechts-Universit\"at zu Kiel\\
|
||||||
|
#6\\
|
||||||
|
\vspace{1ex}
|
||||||
|
Betreut durch: #7}}
|
||||||
|
|
||||||
|
%% Command to create the reviewer page for dissertations.
|
||||||
|
\newcommand{\dissreviewerpage}[4]{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{plain}
|
||||||
|
\vspace*{.5\textheight}
|
||||||
|
\noindent
|
||||||
|
\begin{tabular}{@{}p{.20\textwidth}@{\hspace{.05\textwidth}}p{.75\textwidth}@{}}
|
||||||
|
1.~Gutachter: & \ifthenelse{\equal{#1}{_}}{\rule{12em}{.3pt}}{#1} \\[1em]
|
||||||
|
2.~Gutachter: & \ifthenelse{\equal{#2}{_}}{\rule{12em}{.3pt}}{#2}
|
||||||
|
\ifthenelse{\equal{#3}{}}{}{\\[1em] 3.~Gutachter: & \ifthenelse{\equal{#3}{_}}{\rule{12em}{.3pt}}{#3}}
|
||||||
|
\end{tabular}
|
||||||
|
\par
|
||||||
|
\vspace*{2em}
|
||||||
|
\noindent
|
||||||
|
Datum der m\"undlichen Pr\"ufung:~\ifthenelse{\equal{#4}{_}}{\rule{12em}{.3pt}}{#4}}
|
||||||
|
|
||||||
|
%% Eidesstattliche Erklaerung
|
||||||
|
\newcommand*{\eidesstatt}{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{plain}
|
||||||
|
\hskip 0mm
|
||||||
|
\vfill
|
||||||
|
\noindent
|
||||||
|
\begin{otherlanguage}{ngerman}
|
||||||
|
\textbf{Eidesstattliche Erkl{\"a}rung}\par
|
||||||
|
\bigskip\noindent Hiermit erkl{\"a}re ich an Eides statt, dass
|
||||||
|
ich die vorliegende Arbeit selbst\-st{\"a}n\-dig verfasst und keine
|
||||||
|
anderen als die angegebenen Quellen und Hilfsmittel verwendet habe.\par
|
||||||
|
\bigskip\noindent Kiel,
|
||||||
|
\vskip 10mm
|
||||||
|
\hfill\rule{18em}{.3pt}%
|
||||||
|
\end{otherlanguage}}
|
||||||
|
|
||||||
|
%% Command to create a page with meta data.
|
||||||
|
\newcommand{\metapage}[7]{%
|
||||||
|
\newpage%
|
||||||
|
\thispagestyle{plain}%
|
||||||
|
\footnotesize%
|
||||||
|
\mbox{}\vfill%
|
||||||
|
\begin{itemize}[label=]%
|
||||||
|
\item Kiel Computer Science Series (KCSS) #1%
|
||||||
|
\item
|
||||||
|
ISSN 2193-6781 (print version)\\
|
||||||
|
ISSN 2194-6639 (electronic version)
|
||||||
|
\item Electronic version, updates, errata available via
|
||||||
|
\url{https://www.informatik.uni-kiel.de/kcss}
|
||||||
|
\ifthenelse{\equal{#2}{}}{}{\item The author can be contacted via #2}%
|
||||||
|
\item Published by the Department of Computer Science, Christian-Albrechts-Universit\"at zu Kiel%
|
||||||
|
\item #3%
|
||||||
|
\item Please cite as:%
|
||||||
|
\begin{itemize}%
|
||||||
|
\item #4%
|
||||||
|
\end{itemize}%
|
||||||
|
\item \lstinputlisting[%
|
||||||
|
nolol=true,frame=none,numbers=none,language={},style={},keywordsprefix={},basicstyle=\tt,%
|
||||||
|
aboveskip=\medskipamount,belowskip=\medskipamount,lineskip=0pt,boxpos=c,print=true,%
|
||||||
|
showlines=false,gobble=0,tabsize=8,showtabs=false,showspaces=false,%
|
||||||
|
linewidth=\linewidth,xleftmargin=0pt,xrightmargin=0pt,resetmargins=false,breaklines=false,%
|
||||||
|
columns={[c]fixed},flexiblecolumns=false,keepspaces=false,basewidth={0.6em,0.45em},fontadjust=false,%
|
||||||
|
mathescape=false,escapechar={},escapeinside={},%
|
||||||
|
]{#5}%
|
||||||
|
\item \textcopyright\ #6%
|
||||||
|
\ifthenelse{\equal{#7}{}}{}{\item #7}%
|
||||||
|
\end{itemize}%
|
||||||
|
\normalsize}
|
||||||
|
|
||||||
|
%% Paragraph skip instead of paragraph indentation.
|
||||||
|
\ififiseries@halfparskip
|
||||||
|
\setlength{\parskip}{.5\baselineskip plus .5\baselineskip}
|
||||||
|
\setlength{\parindent}{0em}
|
||||||
|
\setlength{\parfillskip}{\ifiseries@halfparskipfill\textwidth plus 1fil}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Enumeration environments.
|
||||||
|
%
|
||||||
|
\ififiseries@halfparskip
|
||||||
|
%
|
||||||
|
% For halfparskip, we set topsep to 0 everywhere.
|
||||||
|
% This seems to be necessary to prevent excessive whitespace.
|
||||||
|
%
|
||||||
|
\setitemize{leftmargin=*, label=$\triangleright$, topsep=0em}
|
||||||
|
\setenumerate{leftmargin=*, topsep=0em}
|
||||||
|
\setdescription{leftmargin=\parindent, style=sameline, font=\it, topsep=0em}
|
||||||
|
\setlist[compactitemize]{%
|
||||||
|
label=\raisebox{.1em}{\smaller\textbullet},%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactitemize,2,3]{%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactenumerate]{%
|
||||||
|
label=\arabic*.,%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
% FIXME: third level does not work for compactenumerate
|
||||||
|
\setlist[compactenumerate,2]{%
|
||||||
|
label=(\alph*),%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactdescription]{%
|
||||||
|
style=sameline,%
|
||||||
|
font=\it,%
|
||||||
|
leftmargin=\parindent,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactdescription,2,3]{%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
\else
|
||||||
|
%
|
||||||
|
% Settings for non-halfparskip (the normal settings).
|
||||||
|
%
|
||||||
|
\@ifclassloaded{beamer}{\setitemize{leftmargin=*,%
|
||||||
|
label={\usebeamercolor[fg]{itemize item}%
|
||||||
|
\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleright$}}}%
|
||||||
|
\setenumerate{leftmargin=*}%
|
||||||
|
\setdescription{font={\normalfont\usebeamercolor[fg]{itemize item}}}}%
|
||||||
|
{\setitemize{leftmargin=*, label=$\triangleright$}%
|
||||||
|
\setenumerate{leftmargin=*}%
|
||||||
|
\setdescription{leftmargin=\parindent, style=sameline, font=\it}}
|
||||||
|
\setlist[compactitemize]{%
|
||||||
|
label=\raisebox{.1em}{\smaller\textbullet},%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactitemize,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactenumerate]{%
|
||||||
|
label=\arabic*.,%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactenumerate,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactdescription]{%
|
||||||
|
style=sameline,%
|
||||||
|
font=\it,%
|
||||||
|
leftmargin=\parindent,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactdescription,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Figures and captions.
|
||||||
|
\captionsetup{font=small,labelfont=bf,labelsep=period}
|
||||||
|
\ifdefstring{\ifiseries@figure}{floatrow}{%
|
||||||
|
\captionsetup[subfigure]{labelformat=parens,labelsep=space}%
|
||||||
|
\floatsetup[table]{style=plaintop}%
|
||||||
|
\floatsetup[figure]{capbesideposition={center,inside},facing=yes}}{}
|
||||||
|
% Alter some defaults for better treatment of figures.
|
||||||
|
% Taken from http://mintaka.sdsu.edu/GF/bibliog/latex/floats.html
|
||||||
|
% See also p.105 of "TeX Unbound" for suggested values.
|
||||||
|
% General parameters, for ALL pages:
|
||||||
|
\renewcommand*{\topfraction}{0.9} % max fraction of floats at top
|
||||||
|
\renewcommand*{\bottomfraction}{0.8} % max fraction of floats at bottom
|
||||||
|
% Parameters for TEXT pages (not float pages):
|
||||||
|
\setcounter{topnumber}{2}
|
||||||
|
\setcounter{bottomnumber}{2}
|
||||||
|
\setcounter{totalnumber}{4} % 2 may work better
|
||||||
|
\setcounter{dbltopnumber}{2} % for 2-column pages
|
||||||
|
\renewcommand*{\dbltopfraction}{0.9} % fit big float above 2-col. text
|
||||||
|
\renewcommand*{\textfraction}{0.07} % allow minimal text w. figs
|
||||||
|
% Parameters for FLOAT pages (not text pages):
|
||||||
|
\renewcommand*{\floatpagefraction}{0.7} % require fuller float pages
|
||||||
|
% N.B.: floatpagefraction MUST be less than topfraction
|
||||||
|
\renewcommand*{\dblfloatpagefraction}{0.7} % require fuller float pages
|
||||||
|
|
||||||
|
%% Hyperref's \autoref feature.
|
||||||
|
\@ifclassloaded{beamer}{}{%
|
||||||
|
\providecommand{\subfigureautorefname}{\figureautorefname}
|
||||||
|
% \extrasenglish seem to be invoked twice, so need \renew.. there, hence all \...refname must be defined
|
||||||
|
\ifthenelse{\isundefined{\algorithmautorefname}}{\newcommand*{\algorithmautorefname}{Algorithm}}{}
|
||||||
|
\addto\extrasenglish{
|
||||||
|
\renewcommand*{\chapterautorefname}{Chapter}
|
||||||
|
\renewcommand*{\sectionautorefname}{Section}
|
||||||
|
\renewcommand*{\subsectionautorefname}{Section}
|
||||||
|
\renewcommand*{\algorithmautorefname}{Algorithm}}
|
||||||
|
} %%% end ifclassloaded not beamer
|
||||||
|
|
||||||
|
%% Configure listings package.
|
||||||
|
\lstset{basicstyle=\tt}
|
||||||
|
|
||||||
|
%% Configure the url package, and adjust \href command.
|
||||||
|
\ifthenelse{\isundefined{\DeclareUrlCommand}}{\renewcommand*{\path}[1]{\url{#1}}}{\DeclareUrlCommand\path{}} %%% workaround
|
||||||
|
\renewcommand*{\UrlFont}{\smaller\tt}
|
||||||
|
\let\@href\href
|
||||||
|
\renewcommand*{\href}[3][]{\@href[#1]{#2}{\UrlFont #3}}
|
||||||
|
|
||||||
|
%% Display settings.
|
||||||
|
\allowdisplaybreaks
|
||||||
|
\AtBeginDocument{
|
||||||
|
\setlength{\abovedisplayshortskip}{-.5\baselineskip plus .5\baselineskip}
|
||||||
|
\setlength{\abovedisplayskip}{\medskipamount}
|
||||||
|
\setlength{\belowdisplayshortskip}{\medskipamount}
|
||||||
|
\setlength{\belowdisplayskip}{\medskipamount}
|
||||||
|
}
|
||||||
|
|
||||||
|
\fi % ifiseries@layout
|
2421
Proposal/LaTeX/images/Architektur.svg
Normal file
After Width: | Height: | Size: 95 KiB |
865
Proposal/LaTeX/images/Kielprints Deployment.svg
Normal file
|
@ -0,0 +1,865 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
color-rendering="auto"
|
||||||
|
color-interpolation="auto"
|
||||||
|
text-rendering="auto"
|
||||||
|
width="376.84402"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
shape-rendering="auto"
|
||||||
|
font-weight="normal"
|
||||||
|
height="197.10254"
|
||||||
|
font-style="normal"
|
||||||
|
font-size="12"
|
||||||
|
image-rendering="auto"
|
||||||
|
id="svg3225"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.2 r9819"
|
||||||
|
sodipodi:docname="Kielprints Deployment.svg"
|
||||||
|
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0;font-family:Dialog">
|
||||||
|
<metadata
|
||||||
|
id="metadata3463">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1323"
|
||||||
|
inkscape:window-height="788"
|
||||||
|
id="namedview3461"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="2.1325301"
|
||||||
|
inkscape:cx="170.54338"
|
||||||
|
inkscape:cy="106.04333"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg3225"
|
||||||
|
units="mm"
|
||||||
|
fit-margin-left="1"
|
||||||
|
fit-margin-top="1"
|
||||||
|
fit-margin-bottom="1"
|
||||||
|
fit-margin-right="1" />
|
||||||
|
<!--Generated by the Batik Graphics2D SVG Generator-->
|
||||||
|
<defs
|
||||||
|
id="genericDefs">
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<clipPath
|
||||||
|
id="clipPath1"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3232"
|
||||||
|
d="m -7,-7 358,0 0,208 -358,0 0,-208 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath2"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3235"
|
||||||
|
d="M 0,0 332,0 332,19 0,19 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath3"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3238"
|
||||||
|
d="m 0,0 0,163 331,0 0,-163 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath4"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3241"
|
||||||
|
d="m -7,-7 138,0 0,58 -138,0 0,-58 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath5"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3244"
|
||||||
|
d="M 0,0 96,0 96,40 0,40 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath6"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3247"
|
||||||
|
d="m -7,-7 38,0 0,38 -38,0 0,-38 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath7"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3250"
|
||||||
|
d="m -7,-7 30,0 0,30 -30,0 0,-30 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath8"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3253"
|
||||||
|
d="m -49,-15 147,0 0,45 -147,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath9"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3256"
|
||||||
|
d="m -63,-15 189,0 0,45 -189,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath10"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3259"
|
||||||
|
d="m -43,-15 129,0 0,45 -129,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath11"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3262"
|
||||||
|
d="M 0,0 124,0 124,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath12"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3265"
|
||||||
|
d="M 0,0 125,0 125,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath13"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3268"
|
||||||
|
d="M 100,0 100,125 -4,125 -4,0 100,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath14"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3271"
|
||||||
|
d="M 0,0 104,0 104,114 0,114 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath15"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3274"
|
||||||
|
d="M 0,0 104,0 104,125 0,125 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath16"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3277"
|
||||||
|
d="M 0,0 126,0 126,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3283"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(4.0433847,4.0592348)"
|
||||||
|
font-size="11">
|
||||||
|
<polygon
|
||||||
|
style="fill:none"
|
||||||
|
id="polygon3285"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
points="339,0 331,8 0,8 8,0 " />
|
||||||
|
<polygon
|
||||||
|
style="fill:none"
|
||||||
|
id="polygon3287"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
points="339,181 331,189 331,8 339,0 " />
|
||||||
|
<rect
|
||||||
|
style="fill:none"
|
||||||
|
id="rect3289"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
y="8"
|
||||||
|
height="181"
|
||||||
|
width="331"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3291"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(4.0433847,12.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3293"
|
||||||
|
clip-path="url(#clipPath2)"
|
||||||
|
y="16"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="131">SunFire 4250</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3295"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(14.043385,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="stroke:none"
|
||||||
|
id="rect3297"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3299"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(14.043385,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="fill:none"
|
||||||
|
id="rect3301"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3303"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="5"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3305"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="114"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3307"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="21"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3309"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="8"
|
||||||
|
y1="5"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3311"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="8"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3313"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="14"
|
||||||
|
y1="12"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3315"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="14"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3317"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="18"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3319"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(14.043385,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3321"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
style="font-weight:bold;stroke:none"
|
||||||
|
id="text3323"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="16">PostgreSQL</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3325"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="stroke:none"
|
||||||
|
id="rect3327"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3329"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="fill:none"
|
||||||
|
id="rect3331"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3333"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="5"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3335"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="114"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3337"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="21"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3339"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="8"
|
||||||
|
y1="5"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3341"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="8"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3343"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="14"
|
||||||
|
y1="12"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3345"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="14"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3347"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="18"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3349"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3351"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
style="font-weight:bold;stroke:none"
|
||||||
|
id="text3353"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="28">Apache</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3355"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="stroke:none"
|
||||||
|
id="rect3357"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3359"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="fill:none"
|
||||||
|
id="rect3361"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3363"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="5"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3365"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="114"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3367"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="21"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3369"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="8"
|
||||||
|
y1="5"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3371"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="8"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3373"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="14"
|
||||||
|
y1="12"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="rect3375"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="14"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
style="fill:none;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10"
|
||||||
|
id="line3377"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="18"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3379"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3381"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
style="font-weight:bold;stroke:none"
|
||||||
|
id="text3383"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="28">ePrints</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3385"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(154.04338,54.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<circle
|
||||||
|
style="stroke:none"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3387"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3389"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(154.04338,54.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<circle
|
||||||
|
style="fill:none"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3391"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3393"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(244.04338,94.059239)"
|
||||||
|
font-size="11">
|
||||||
|
<circle
|
||||||
|
style="stroke:none"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3395"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3397"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(244.04338,94.059239)"
|
||||||
|
font-size="11">
|
||||||
|
<circle
|
||||||
|
style="fill:none"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3399"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#7acff5;fill-opacity:1;stroke:#7acff5;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3401"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(338.04338,70.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="stroke:none"
|
||||||
|
id="rect3403"
|
||||||
|
clip-path="url(#clipPath7)"
|
||||||
|
y="0"
|
||||||
|
height="12"
|
||||||
|
width="12"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3405"
|
||||||
|
stroke-miterlimit="0"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(338.04338,70.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<rect
|
||||||
|
style="fill:none"
|
||||||
|
id="rect3407"
|
||||||
|
clip-path="url(#clipPath7)"
|
||||||
|
y="0"
|
||||||
|
height="12"
|
||||||
|
width="12"
|
||||||
|
x="0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3421"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(333.04338,81.059239)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3423"
|
||||||
|
clip-path="url(#clipPath8)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="12">HTTP</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3425"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(256.04338,92.059239)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3427"
|
||||||
|
clip-path="url(#clipPath9)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9">CGI/Perl</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3429"
|
||||||
|
font-weight="bold"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(142.04338,74.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<text
|
||||||
|
style="stroke:none"
|
||||||
|
id="text3431"
|
||||||
|
clip-path="url(#clipPath10)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="10">SQL</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3433"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(85.043385,14.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<line
|
||||||
|
style="fill:none"
|
||||||
|
id="line3435"
|
||||||
|
y1="50"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath11)"
|
||||||
|
x1="70"
|
||||||
|
y2="50" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3437"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(122.04338,14.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<line
|
||||||
|
style="fill:none"
|
||||||
|
id="line3439"
|
||||||
|
y1="50"
|
||||||
|
x2="56"
|
||||||
|
clip-path="url(#clipPath12)"
|
||||||
|
x1="71"
|
||||||
|
y2="50" />
|
||||||
|
<path
|
||||||
|
style="fill:none"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3441"
|
||||||
|
transform="matrix(0,-1,1,0,0,100)"
|
||||||
|
clip-path="url(#clipPath13)"
|
||||||
|
d="m 37,42.8571 a 13,13 0 0 0 26,0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3443"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(204.04338,35.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<line
|
||||||
|
style="fill:none"
|
||||||
|
id="line3445"
|
||||||
|
y1="60"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath14)"
|
||||||
|
x1="50"
|
||||||
|
y2="50" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3447"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(204.04338,62.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<line
|
||||||
|
style="fill:none"
|
||||||
|
id="line3449"
|
||||||
|
y1="71"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath15)"
|
||||||
|
x1="50"
|
||||||
|
y2="56" />
|
||||||
|
<path
|
||||||
|
style="fill:none"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3451"
|
||||||
|
clip-path="url(#clipPath15)"
|
||||||
|
d="m 37,42.8571 a 13,13 0 0 0 26,0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="g3453"
|
||||||
|
text-rendering="geometricPrecision"
|
||||||
|
transform="translate(265.04338,22.059235)"
|
||||||
|
font-size="11">
|
||||||
|
<line
|
||||||
|
style="fill:none"
|
||||||
|
id="line3455"
|
||||||
|
y1="50"
|
||||||
|
x2="72"
|
||||||
|
clip-path="url(#clipPath16)"
|
||||||
|
x1="50"
|
||||||
|
y2="50" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 25 KiB |
BIN
Proposal/LaTeX/images/architektur.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Proposal/LaTeX/images/architektur2.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
Proposal/LaTeX/images/deployment.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
Proposal/LaTeX/images/ganttchart.png
Normal file
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 156 KiB |
11
Proposal/LaTeX/proposal-blx.bib
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
@Comment{$ biblatex control file $}
|
||||||
|
@Comment{$ biblatex version 1.7 $}
|
||||||
|
Do not modify this file!
|
||||||
|
|
||||||
|
This is an auxiliary file used by the 'biblatex' package.
|
||||||
|
This file may safely be deleted. It will be recreated as
|
||||||
|
required.
|
||||||
|
|
||||||
|
@Control{biblatex-control,
|
||||||
|
options = {1.7:0:0:0:0:1:1:1:0:0:1:0:12:1:2:1:79:+},
|
||||||
|
}
|
BIN
Proposal/LaTeX/proposal.pdf
Normal file
213
Proposal/LaTeX/proposal.tex
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
\input{docstyleDE}
|
||||||
|
|
||||||
|
% Einrichtung von Paket Glossaries
|
||||||
|
\usepackage[ngerman]{translator}
|
||||||
|
\usepackage[xindy,toc,style=altlistgroup]{glossaries}
|
||||||
|
\input{glossary} % Glossardaten ausgelagert
|
||||||
|
\makeglossaries
|
||||||
|
|
||||||
|
% PDF Metadaten
|
||||||
|
\hypersetup{pdftitle=Monitoring von Perl-basierten Webanwendungen mittels Kieker}
|
||||||
|
\hypersetup{pdfauthor=Nis Börge Wechselberg}
|
||||||
|
\hypersetup{pdfsubject=Proposal zur Bachelor-Arbeit}
|
||||||
|
\hypersetup{pdfkeywords=}
|
||||||
|
|
||||||
|
% Dokumenteninhalt
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Präambel (Deckblatt, Inhalt, ...)
|
||||||
|
\frontmatter
|
||||||
|
\thesistitlepage
|
||||||
|
{Monitoring von Perl-basierten\\[.1em]Webanwendungen mittels Kieker}% Title
|
||||||
|
{Proposal zur Bachelor-Arbeit}% Thesistype
|
||||||
|
{Nis Börge Wechselberg}% Name
|
||||||
|
{\today}% Date
|
||||||
|
{Dipl.-Inf. Peer Brauer}
|
||||||
|
|
||||||
|
\tableofcontents
|
||||||
|
|
||||||
|
% Hauptteil
|
||||||
|
\mainmatter
|
||||||
|
|
||||||
|
\chapter{Einleitung}
|
||||||
|
Dieses Proposal soll zur genauen Definition des Themas und des Umfangs der Bachelorarbeit dienen. Hierzu wird zunächst die Zielsetzung der Arbeit und eine Einordnung in das umgebende Themenfeld vorgestellt. Anschließend werden die benötigten und verwendeten Technologien und Softwaresysteme vorgestellt.
|
||||||
|
|
||||||
|
Hierauf aufbauend wird dann das geplantes Vorgehen für die Lösung der Problemstellung aufgezeigt.
|
||||||
|
|
||||||
|
%\section{Zielsetzung der Arbeit} %Auskommentiert um Gliederungsfehler zu vermeiden
|
||||||
|
Die Bachelorarbeit trägt den Arbeitstitel \emph{Monitoring von Perl-basierten Webanwendungen mittels \gls{kieker}}. Somit soll in der Arbeit zunächst ein Monitoringverfahren für Perl-Anwendungen im Allgemeinen und Webanwendungen im speziellen etabliert werden. Das \gls{moni} soll hierbei mit dem \gls{kieker} Framework geschehen, welches bisher primär auf Java-Anwendungen ausgerichtet war. In mehreren Abschlussarbeiten wurden unter anderem bereits Erweiterungen für .NET oder COBOL sowie COM entwickelt, allerdings ist bisher noch kein \gls{moni} von Perl-Anwendungen möglich. Somit muss zunächst ein System entwickelt werden um Perl-Anwendungen mit \emph{\glspl{probe}} zu versehen und diese Daten anschließend an \gls{kieker} zu übergeben. Hierbei liegt der Fokus auf dem \emph{performance monitoring}, also der Erfassung des zeitlichen Verhaltens der Anwendung.
|
||||||
|
|
||||||
|
Mit diesen \emph{\glspl{probe}} soll dann zunächst eine isolierte Testanwendung instrumentiert werden und das Verhalten der Anwendung ausgewertet werden. Hierbei können erste Ergebnisse zu dem Einfluss der \emph{\glspl{probe}} auf die Laufzeit der Anwendung und das korrekte Verhalten der Probes ermittelt werden.
|
||||||
|
|
||||||
|
Sobald diese Tests erfolgreich abgeschlossen sind, sollen dann die Probes in die Anwendung Kielprints eingeführt werden. Diese Plattform wird vom Geomar Helmholtz-Zentrum betrieben und in der letzten Zeit sind hier einige Probleme mit dem Laufzeitverhalten beobachtet worden. Durch das Monitoring kann dann das Verhalten der Anwendung im Betrieb beobachtet werden. Es soll versucht werden Ursachen für Leistungseinbußen zu lokalisieren und Optimierungspotential in der Anwendung aufgezeigt werden.
|
||||||
|
|
||||||
|
Bei ausreichender Zeit können dann noch weitere Funktionen für die Perl-Schnittstelle implementiert werden wie Optionen zur automatischen oder teil-automatischen Instrumentierung der Anwendung oder andere Monitoringoptionen.
|
||||||
|
|
||||||
|
|
||||||
|
\chapter{Ziele \& Technologien}
|
||||||
|
Im folgenden werden kurz die wichtigsten Technologien und Softwaresysteme vorgestellt, welche im Rahmen dieser Bachelor-Arbeit eingesetzt werden sollen. Zuvor wird auf das Verfahren des Performance Monitorings (\ref{sec:perfmoni}) eingegangen um den Zweck dieser Systeme zu verdeutlichen. Die verwendeten Softwaresysteme umfassen neben der Programmiersprache Perl (\ref{sec:perl}) primär das Monitoring Framework \gls{kieker} (\ref{sec:kieker}). Das zu untersuchende System \gls{eprints} wird ebenfalls kurz vorgestellt (\ref{sec:eprints}) um die Rahmenbedingungen zu erläutern. Zum Abschluss werden dann die Ziele der Arbeit aufgelistet (\ref{sec:ziele}).
|
||||||
|
|
||||||
|
\section{Performance Monitoring}
|
||||||
|
\label{sec:perfmoni}
|
||||||
|
Beim Monitoring, auch dynamische Analyse genannt, werden während der Ausführung einer Anwendung Messdaten erzeugt und anschließend anhand dieser Messdaten das Verhalten der Anwendung analysiert. Dieses Verfahren steht als ergänzendes Mittel zur statischen Analyse, bei welchem die Software anhand ihres Quelltextes analysiert wird. Allerdings ist die statische Analyse für umfangreichere Softwaresysteme nur schwierig durchführbar. Mit der dynamischen Analyse können die tatsächlich ausgeführten Programmpfade ermittelt werden und direkt das Verhalten der Anwendung nachvollzogen werden.(\cite[vgl. auch][]{schmalenbach2007performancemanagement})
|
||||||
|
Mit verschiedenen Techniken können dann auch bei Bedarf nur Teile der Anwendung beobachtet werden und der Fokus auf bestimmte Programmteile gelegt werden.
|
||||||
|
|
||||||
|
Die dynamische Analyse wird auch häufig eingesetzt um das Verhalten eines existierenden Softwaresystems in Modernisierungsprozessen zu erfassen. Da Anwendungen häufig im Betrieb modifiziert und weiterentwickelt werden und hierbei mitunter die Dokumentation der Änderungen nur untergeordneten Charakter gegenüber der Funktionalität geniest, weicht häufig das dokumentierte Verhalten von dem tatsächlich beobachteten ab. Diese Differenzen können durch die dynamische Analyse erkannt werden und in den Modernisierungsprozess eingebunden werden.
|
||||||
|
|
||||||
|
Zur Durchführung des Monitorings wird der Quelltext des Programms mit sogenannten Probes versehen, welche verschiedene Ereignisse im Programmablauf protokollieren. Hierbei sind häufig Verzweigungen, Sprünge oder Funktionsaufrufe besonders von Interesse, aber auch andere Ereignisse wie Anfragen an Datenbanken können protokolliert werden.
|
||||||
|
|
||||||
|
Mit diesen Messdaten kann dann eine Analyse und Visualisierung durchgeführt werden um das Verhalten der Anwendung zu dokumentieren. Hierbei werden dann zum Beispiel UML Sequenz Diagramme erstellt oder das zeitliche Verhalten der Anwendung detailliert untersucht.
|
||||||
|
|
||||||
|
Der Schwerpunkt dieser Arbeit wird auf dem \emph{performance monitoring} liegen. Hierbei wird eine möglichst präzise Zeitmessung im Programmablauf durchgeführt und dieser Zeitcode in den \emph{\glspl{record}} eingefügt. Somit kann nicht nur die Aufrufreihenfolge sondern auch der zeitliche Ablauf, also konkret die Dauer zur Ausführung einer Funktion und auch die Häufigkeit der Ausführung, festgestellt werden. Somit können dann besonders lang und/oder häufig laufende Funktionen identifiziert werden um Ansatzpunkte für Performanceprobleme aufzuzeigen. Neben der Zeit können bei Bedarf auch noch weitere Systemdaten wie CPU-Auslastung oder Speicherverbrauch protokolliert werden.
|
||||||
|
|
||||||
|
\section{Kieker Monitoring Framework}
|
||||||
|
\label{sec:kieker}
|
||||||
|
\gls{kieker}\footnote{\url{http://www.kieker-monitoring.net}} ist ein System zum \gls{moni} und zur Analyse des Laufzeit-Verhaltens einer Software. Es wird seit 2006 in der Arbeitsgruppe Software Engineering an der CAU Kiel entwickelt. Frühere Versionen von \gls{kieker} waren primär auf das \gls{moni} von Java-Anwendungen ausgerichtet, doch wurden bereits ergänzende Module entwickelt oder befinden sich zur Zeit in der Entwicklung um zum Beispiel .NET oder COBOL mit \gls{kieker} analysieren zu können. Seit 2011 wird \gls{kieker} von der SPEC Research Group als empfohlenes Tool im SPEC RG Software Verzeichnis\footnote{\url{http://research.spec.org/projects/tools.html}} angeboten.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.96\textwidth]{images/kiekerComponentDiagram-woCloud-bw-w-record-newNames-withTraceAnalysis-colors}
|
||||||
|
\caption[Kieker Komponentendiagramm]{Kieker Komponentendiagramm \footnotemark}
|
||||||
|
\label{fig:KiekerComponentDiagram}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Wie in Grafik \ref{fig:KiekerComponentDiagram} dargestellt besteht \gls{kieker} aus den zwei zentralen Komponenten Kieker.Monitoring und Kieker.Analysis. Die Monitoring Komponente stellt Klassen und Methoden zum Instrumentieren und Überwachen der Software zur Verfügung. Hierzu werden von \emph{\glspl{probe}} Messungen vorgenommen und hierzu \emph{\glspl{record}} erstellt. Diese \emph{\glspl{record}} werden dann an einen \emph{monitoring writer} übergeben, der die Informationen in eine Log-Datei schreibt oder mit einem Stream an die Analysis Komponente übergibt. Zum \gls{moni} stehen manuelle Methoden aber auch automatische Mechanismen zur Verfügung die, zum Beispiel mittels \emph{AspectJ}, die Programmstruktur analysieren und automatisch die benötigten Messpunkte erzeugen.
|
||||||
|
|
||||||
|
Die Analyse der erhaltenen Daten wird mittels Kieker.Analysis durchgeführt. Diese Komponente liest die \emph{\glspl{record}} ein und stellt einen konfigurierbaren Ablauf zum Filtern, Analysieren und Visualisieren der Daten bereit. Hierbei können zum Beispiel Sequenz Diagramme oder Abhängigkeitsbäume erzeugt werden um das Verhalten der Anwendung zu beschreiben.
|
||||||
|
|
||||||
|
Die Kieker.Monitoring Funktionen werden in dieser Arbeit nicht oder nur teilweise eingesetzt werden, da sie primär auf Java-Anwendungen ausgerichtet sind. Allerdings werden die Kieker.Analysis Funktionen benutzt werden um die weitere Analyse durchzuführen.
|
||||||
|
\footnotetext{Grafik entnommen aus \citep{Kieker1.6UserGuide}}
|
||||||
|
|
||||||
|
\section{Perl}
|
||||||
|
\label{sec:perl}
|
||||||
|
Die Programmiersprache Perl\footnote{\url{http://www.perl.org}} ist eine imperative, plattformunabhängige, interpretierte Programmiersprache. Die erste Version wurde 1987 vorgestellt und hat seine Wurzeln primär in C und awk. Die aktuelle Version ist Perl 5.16, die im Mai 2012 veröffentlicht wurde. Perl ist eine interpretierte Programmiersprache, also werden die Programme nicht zu einer nativen Anwendung übersetzt sondern mit einem Interpreter ausgeführt. Der Perl-Interpreter ist für alle relevanten Betriebssysteme verfügbar und in vielen Systemen bereits integriert.
|
||||||
|
|
||||||
|
In Perl werden verschiedenste Programmierparadigmen umgesetzt, allerdings ist es dem Programmierer freigestellt, welche dieser Möglichkeiten er umsetzen will. So ist zum Beispiel die Objektorientierung ein Teil der Sprache, allerdings nicht wie in Java erzwungen. Auch stellt Perl häufig mehrere Optionen für die selben Probleme bereit, so können häufig Befehle verkürzt werden oder es stehen mehrere äquivalente Befehle zur Verfügung. Dies führt allerdings sehr schnell zu schlechter Lesbarkeit der Programme, da Perl auch eine sehr freie Syntax ermöglicht. Zeilenumbrüche und Leerzeichen sind weitgehend bedeutungslos und führen zu einem sehr unterschiedlichen Code-Format und sehr persönlichen Gestaltungen der Programme.
|
||||||
|
|
||||||
|
Eines der stärksten Features von Perl sind Reguläre Ausdrücke. Bereits in frühen Versionen wurden diese unterstützt und aufgrund der hohen Verbreitung von Perl wurden die Perl Syntax de facto Standard für Reguläre Ausdrücke. Auch aufgrund dieser Stärke bei der Verarbeitung von Regulären Ausdrücken und der guten Verbindung mit anderen Softwaresystemen wird Perl in vielen Websystemen eingesetzt. Die meisten Webserver bieten Schnittstellen um den Perl-Interpreter einzubinden und Perl-Anwendungen somit in die Webpräsenz einzubinden.
|
||||||
|
|
||||||
|
\section{ePrints / Kielprints}
|
||||||
|
\label{sec:eprints}
|
||||||
|
Das System \gls{eprints} ist eine quelloffene Webplattform zur Veröffentlichung von Publikationen, Forschungsberichten oder anderen Dokumenten. Die Plattform implementiert dabei das OAI-PMH\footnote{Open Archives Initiative Protocol for Metadata Harvesting} Protokoll und ist somit ein Projekt zur Umsetzung von Open Access. \gls{eprints} wurde initial von der University of Southampton entwickelt und unter der \citep{gpl} lizenziert. Die Plattform wurde in Perl implementiert und steht zur Zeit in der Version 3.3 zum Download\footnote{\url{http://www.eprints.org/software/}} bereit.
|
||||||
|
|
||||||
|
An der Universität Kiel wird die Software Kielprints verwendet, was einen angepasste Version von \gls{eprints} ist. Betrieben wird diese Plattform von dem Kieler Datenmanagement Team am Geomar Helmholtz-Zentrum für Ozeanforschung Kiel. Das Deployment der Anwendung ist in der Abbildung \ref{fig:deploy} grob skizziert.
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.6\textwidth]{images/deployment}
|
||||||
|
\caption{Deployment der Kielprints-Anwendung}
|
||||||
|
\label{fig:deploy}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Für die Plattform wurden bereits einige Erweiterungen entwickelt und in die Plattform integriert. Mit der Öffnung der Plattform für alle Institute der Universität sind unerwartete Performanceprobleme aufgetreten. Diese sollen mit dieser Arbeit und den entwickelten Modulen aufgespürt werden. Diese Probleme treten einerseits für die Benutzer beim Datenabruf auf, wobei unerwünscht lange Antwortzeiten, besonders bei der Suche nach Autoren oder Forschungsbereichen, beobachtet werden können. Aber auch die Administration und Datenpflege leidet unter den Problemen, da die Oberflächen für das Eintragen oder Editieren von Publikationen teilweise Wartezeiten von über 10 Sekunden aufweisen. Diese Zeiten sind bei einer Datenbankgröße von etwa 14000 Publikationen und 1000 Autoren nicht angemessen und weisen auf Probleme in der Aufbereitung der Seiten hin.
|
||||||
|
|
||||||
|
\section{Zielsetzung}
|
||||||
|
\label{sec:ziele}
|
||||||
|
Folgende Punkte sollen in der Bachelorarbeit konkret umgesetzt werden:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Implementierung von \glspl{probe} und einem monitoring writer in Perl.
|
||||||
|
\item Verwendung eines monitoring logs in Dateiform.
|
||||||
|
\item Untersuchung des Einflusses der \glspl{probe} auf die Laufzeit von Anwendungen.
|
||||||
|
\item Instrumentierung der Kielprints-Anwendung.
|
||||||
|
\item Lokalisierung von Performanceproblemen in der Kielprints-Anwendung.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
\chapter{Geplante Umsetzung}
|
||||||
|
Wie bereits in der Einleitung skizziert muss für die Umsetzung der Arbeit zunächst eine Möglichkeit des Monitorings der Perl-Anwendungen geschaffen werden (\ref{sec:PerlMoni}). Anschließend soll das Verhalten zunächst getestet werden (\ref{sec:testInstr}) und schließlich das Projekt Kielprints untersucht werden (\ref{sec:KielprintsInstr}).
|
||||||
|
|
||||||
|
\section{Monitoring-Probes in Perl}
|
||||||
|
\label{sec:PerlMoni}
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/architektur2}
|
||||||
|
\caption{Entwurf der Systemarchitektur}
|
||||||
|
\label{fig:architecture}
|
||||||
|
\end{figure}
|
||||||
|
Das \gls{kieker} Framework unterstützt zur Zeit noch kein \gls{moni} von Perl-Anwendungen. Im Rahmen von früheren Abschlussarbeiten wurden bereits Verfahren zum \gls{moni} von zum Beispiel .NET- \citep{cau15486} oder COBOL-Anwendungen \citep{cau15489} realisiert. Aufbauend auf den bisherigen Entwicklungen soll in dieser Arbeit nun das \gls{moni} von Perl-Anwendungen ermöglicht werden. Hierzu soll ein Perl-Modul implementiert werden, welches die Aufgaben des Kieker.Monitoring übernimmt. Dieser Ansatz ist in Abbildung \ref{fig:architecture} dargestellt.
|
||||||
|
|
||||||
|
Dieses Modul muss zunächst Funktionen zur Anreicherung des Codes mit Probes bereitstellen. Diese Funktionen müssen das Verhalten der Anwendung protokollieren und an eine (zu implementierende) Funktion weiterreichen, welche die persistente Sicherung der Daten übernimmt. Hierbei ist abzuwägen, ob von diesem Perl-Modul direkt \emph{\glspl{record}} erzeugt werden sollen, die von Kieker.Analysis verarbeitet werden können, oder ob ein Ansatz gewählt werden soll, der zunächst eigene Records erstellt und anschließend mit einer neuen Kieker Komponente die Übersetzung in \gls{kieker} \emph{\glspl{record}} realisiert. Dieser zweistufige Ansatz wurde bereits für COBOL-Anwendungen realisiert, allerdings ist auch die Erzeugung fertiger Records in Perl möglich. Für die erste Implementierung soll aber der Ansatz mit einer zwischengelagerten Kieker-Ausführung gewählt werden.
|
||||||
|
|
||||||
|
Da in Perl auch recht mächtige Funktionen zur Anbindung anderer Programmiersprachen unterstützt werden könnte auch eine Integration der bestehenden \gls{kieker} Klassen in Betracht gezogen werden. Da aber hierbei eine Verbindung von vorcompiliertem Java-Code und interpretiertem Perl-Code realisiert werden muss, kann bei dieser Veriante das Laufzeitverhalten stärker als in dem oben skizzierten Ansatz beeinflusst werden.
|
||||||
|
|
||||||
|
\section{Instrumentierung und Monitoring einer Testanwendung}
|
||||||
|
\label{sec:testInstr}
|
||||||
|
Das fertige Perl-Modul wird anschließend auf eine isolierte Testanwendung angewendet. Hierbei wird es sich voraussichtlich um eine Kopie des ePrints-Systems handeln. In dieser Testanwendung kann dann die Instrumentierung durchgeführt werden und verschiedenen Testszenarien untersucht werden. Durch die Simulation von verschiedenen Anfragen kann neben dem Verhalten der Anwendung auch der Einfluss des Monitorings auf die Anwendung untersucht werden. Es sollte versucht werden, den zusätzlichen Aufwand der Anwendung möglichst gering zu halten um das tatsächliche Verhalten der Anwendung nicht zu stark zu verzerren.
|
||||||
|
|
||||||
|
Mit den erzeugten Daten soll die Anbindung an Kieker.Analysis getestet werden und eine geeignete Analysemethode für die späteren Tests festgelegt werden. Sobald diese Tests zufriedenstellend ausfallen kann dann die Instrumentierung von Kielprints im produktiven Betrieb durchgeführt werden.
|
||||||
|
|
||||||
|
\section{Instrumentierung von Kielprints}
|
||||||
|
\label{sec:KielprintsInstr}
|
||||||
|
In Zusammenarbeit mit dem Geomar Helmholtz-Zentrum für Ozeanforschung Kiel soll dann Kielprints instrumentiert werden. In dem momentanen Zustand der Anwendung sind langsame Reaktionszeiten aufgetreten, obwohl bisher mit knapp 14000 Publikationen die Auslastung der Datenbank noch in einem üblichen Rahmen liegt. Somit soll die Anwendung instrumentiert werden und Engpässe in der Anwendung identifiziert werden. Hierzu werden die Erkenntnisse der vorherigen Testläufe verwendet um Analysemethoden festzulegen und Vergleichswerte zu erhalten. Mit den erhaltenen Analysedaten soll dann versucht werden Optimierungspotential der Anwendung aufzuzeigen.
|
||||||
|
\chapter{Organisatorischer Rahmen}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Organisation
|
||||||
|
\begin{description}
|
||||||
|
\item[Dauer der Arbeit] 1. Oktober 2012 bis 31. März 2013
|
||||||
|
\item[Bearbeiter] Nis Börge Wechselberg, Mat-Nr. 774996, nbw@informatik.uni-kiel.de
|
||||||
|
\item[Berater] Dipl.-Inf. Peer Brauer, pcb@informatik.uni-kiel.de
|
||||||
|
\end{description}
|
||||||
|
\item Entwicklung
|
||||||
|
\begin{description}
|
||||||
|
\item[Hardware] Die Kielprints-Plattform wird im Geomar auf einer SunFire 4250 betreiben. Das Testsystem wird auf einem Blade des Lehrstuhls bereitgestellt.
|
||||||
|
\item[System] Solaris 10
|
||||||
|
\item[Software] ePrints 3.3 unter Perl 5.10
|
||||||
|
\item[Entwicklungsumgebung] Für den Betreib von Kielprints werden PostgreSQL 8.3 sowie Apache 2.2.22 eingesetzt. Die Pakete wurden von OpenCSW.org angepasst.
|
||||||
|
\end{description}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
\chapter{Zeitplan}
|
||||||
|
In der folgenden Tabelle ist das geplante Vorgehen skizziert:
|
||||||
|
\begin{table}[tph]
|
||||||
|
\centering
|
||||||
|
\begin{tabular}{rlp{5.5cm}}
|
||||||
|
KW & Projektphase & Meilensteine \\
|
||||||
|
\hline
|
||||||
|
47 & Vorbereitung & Literaturrecherche \\
|
||||||
|
\hline
|
||||||
|
48 & Perl-Modul & Analyse der benötigten Funktionen, Festlegung des Datenformats \\
|
||||||
|
48 & & Implementierung der Probes \\
|
||||||
|
49 & & Implementierung der Probes \\
|
||||||
|
50 & & Lokale Tests und Fehlerbehebung \\
|
||||||
|
\hline
|
||||||
|
51 & Konsolidierung & Schreiben der Arbeit \\
|
||||||
|
52 & & Schreiben der Arbeit \\
|
||||||
|
\hline
|
||||||
|
1 & Test-Instrumentierung & Einrichtung von Testanwendungen, Instrumentierung \\
|
||||||
|
2 & & Feststellung von Monitoring-Overhead \\
|
||||||
|
\hline
|
||||||
|
3 & Konsolidierung & Schreiben der Arbeit \\
|
||||||
|
\hline
|
||||||
|
4 & Kielprints & Instrumentierung der Anwendung \\
|
||||||
|
5 & & Ablauf des Monitorings zur Laufzeit \\
|
||||||
|
6 & & Analyse der Traces \\
|
||||||
|
7 & & Evtl. Langzeit \gls{moni} \\
|
||||||
|
8 & & \\
|
||||||
|
9 & & \\
|
||||||
|
\hline
|
||||||
|
10 & Konsolidierung & Schreiben der Arbeit \\
|
||||||
|
\hline
|
||||||
|
11 & Abschluss der Arbeit & Fertigstellung, Kolloqium \\
|
||||||
|
12 & & \\
|
||||||
|
13 & &
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Zeitplan}
|
||||||
|
\label{tab:zeitplan}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
Dieser Verlauf ist auch aus dem folgenden Gantt-Diagramm (Abbildung \ref{fig:GanttChart}) ersichtlich.
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[angle=90,scale=0.45]{images/ganttchart}
|
||||||
|
\caption{Gantt-Chart}
|
||||||
|
\label{fig:GanttChart}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
% Abschluss
|
||||||
|
\backmatter
|
||||||
|
|
||||||
|
\printglossaries
|
||||||
|
|
||||||
|
\tocbibliography
|
||||||
|
|
||||||
|
\end{document}
|
10
Proposal/LaTeX/run.sh
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
pdflatex proposal.tex
|
||||||
|
pdflatex proposal.tex
|
||||||
|
bibtex proposal.aux
|
||||||
|
makeglossaries proposal
|
||||||
|
pdflatex proposal.tex
|
||||||
|
makeglossaries proposal
|
||||||
|
pdflatex proposal.tex
|
||||||
|
pdflatex proposal.tex
|
||||||
|
|
BIN
Proposal/proposal-sample.pdf
Normal file
BIN
Thesis/Folien/images/Classdiagram-Kieker-Perl.pdf
Normal file
BIN
Thesis/Folien/images/Condensed-Dependency-Graph.pdf
Normal file
BIN
Thesis/Folien/images/Dependency-Graph-EPrints.pdf
Normal file
BIN
Thesis/Folien/images/Deployment-Diagram-Client-Server-Model.pdf
Normal file
BIN
Thesis/Folien/images/Instrument-Code.pdf
Normal file
BIN
Thesis/Folien/images/Kielprints-Deployment.pdf
Normal file
BIN
Thesis/Folien/images/Screenshot-Trace4.png
Normal file
After Width: | Height: | Size: 250 KiB |
BIN
Thesis/Folien/images/kieker-data-bridge.pdf
Normal file
BIN
Thesis/Folien/images/kielprints.png
Normal file
After Width: | Height: | Size: 735 KiB |
BIN
Thesis/Folien/vortrag.pdf
Normal file
364
Thesis/Folien/vortrag.tex
Normal file
|
@ -0,0 +1,364 @@
|
||||||
|
\documentclass{beamer}
|
||||||
|
|
||||||
|
\mode<presentation>{\usetheme{Madrid}}
|
||||||
|
|
||||||
|
\usepackage[german]{babel}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{times}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
|
||||||
|
|
||||||
|
\title[Perl-Monitoring] % (optional, nur bei langen Titeln nötig)
|
||||||
|
{Monitoring von Perl-basierten Web Anwendungen mit Kieker}
|
||||||
|
|
||||||
|
\subtitle{Bachelor-\\Abschlusskolloquium}
|
||||||
|
\author{Nis Wechselberg}
|
||||||
|
\institute[CAU Kiel]{Institut für Informatik\\Christian-Albrechts-Universität zu Kiel}
|
||||||
|
|
||||||
|
\date{26. März 2013}
|
||||||
|
|
||||||
|
% Folgendes sollte gelöscht werden, wenn man nicht am Anfang jedes
|
||||||
|
% Unterabschnitts die Gliederung nochmal sehen möchte.
|
||||||
|
\AtBeginSection[]
|
||||||
|
{
|
||||||
|
\begin{frame}<beamer>{Gliederung}
|
||||||
|
\tableofcontents[currentsection,hideothersubsections,hideothersections,sectionstyle=show/hide]
|
||||||
|
\end{frame}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
% Falls Aufzählungen immer schrittweise gezeigt werden sollen, kann
|
||||||
|
% folgendes Kommando benutzt werden:
|
||||||
|
|
||||||
|
% \beamerdefaultoverlayspecification{<+->}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\begin{frame}
|
||||||
|
\titlepage
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Gliederung}
|
||||||
|
\tableofcontents[hidesubsections]
|
||||||
|
% Die Option [pausesections] könnte nützlich sein.
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Motivation}
|
||||||
|
|
||||||
|
\subsection{System}
|
||||||
|
\begin{frame}{Kielprints}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.93\textwidth]{images/kielprints}
|
||||||
|
\end{center}
|
||||||
|
\end{frame}
|
||||||
|
\begin{frame}{Projektbeschreibung}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Plattform zur Veröffentlichung von wissenschaftlichen Dokumenten (\emph{self archiving})
|
||||||
|
\item
|
||||||
|
Ergänzte und modifizierte Version von EPrints
|
||||||
|
\item
|
||||||
|
Betrieben durch das GEOMAR | Helmholtz Zentrum für Ozeanforschung Kiel
|
||||||
|
\item
|
||||||
|
Erweiterung des OceanRep GEOMAR
|
||||||
|
\item
|
||||||
|
Über 15000 Veröffentlichungen von mehr als 1000 Autoren
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Beobachtete Performanceprobleme}
|
||||||
|
\begin{frame}{Benutzerperspektive}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Abrufen von Einträgen über die Plattform: \\[0.5cm]
|
||||||
|
\item
|
||||||
|
Erhöhte Antwortzeiten
|
||||||
|
\item
|
||||||
|
Langsame Suche in den Fachbereichen
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
\begin{frame}{Administration/Betrieb}
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Hohe Wartezeiten bei Seitenwechseln im Backend
|
||||||
|
\item
|
||||||
|
Beispiel: Beim Eintragen von neuen Publikationen über das Backend und hinzufügen von Autoren dauert die Generierung von Dropdown-Menüs etwa 10 Sekunden.
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Technologien und Methoden}
|
||||||
|
\subsection{Kieker-Framework}
|
||||||
|
\begin{frame}{Kieker Monitoring Framework}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Monitoring Tool aus diesem Lehrstuhl
|
||||||
|
\item Empfohlenes Tool im SPEC RG Software Repository
|
||||||
|
\end{itemize}
|
||||||
|
\includegraphics[scale=0.7]{images/kiekerComponentDiagram-woCloud-bw-w-record-newNames-withTraceAnalysis-colors}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Überblick über Kieker}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Aufteilung in \emph{Kieker.Monitoring} und \emph{Kieker.Analysis}
|
||||||
|
\item \emph{Kieker.Monitoring} zur Instrumentierung und Überwachung
|
||||||
|
\item \emph{Kieker.Analysis} zur Auswertung und Veranschaulichung
|
||||||
|
\item Kommunikation über Monitoring Log oder Stream\\[0.5cm]
|
||||||
|
\item Bisher keine Unterstützung für Perl
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Programmiersprache Perl}
|
||||||
|
|
||||||
|
\begin{frame}{Programmiersprache Perl}
|
||||||
|
\begin{itemize}
|
||||||
|
\item imperative, plattformunabhängige, interpretierte Sprache
|
||||||
|
\item Entwickelt 1987, heute in Version 5.16 verfügbar
|
||||||
|
\item Module für Objektorientierung über CPAN verfügbar
|
||||||
|
\item Sehr viele Freiheiten für Programmierer (freie Syntax)
|
||||||
|
\item Starke Funktionen für String-Manipulationen und Reguläre Ausdrücke
|
||||||
|
\item Direkte Integration in Webserver mittels mod\_perl
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Performance-Monitoring}
|
||||||
|
|
||||||
|
\begin{frame}{Vorgehen bei Performance-Monitoring}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Instrumentierung des Codes mit \emph{Probes}
|
||||||
|
\item Ausführung des instrumentierten Codes
|
||||||
|
\item Protokollierung von Monitoring Daten
|
||||||
|
\item Auswertung der Daten mittels geeigneter Tools
|
||||||
|
\end{enumerate}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Erfasste Daten}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Anwendungsdaten
|
||||||
|
\begin{itemize}
|
||||||
|
\item Aufrufreihenfolge
|
||||||
|
\item Aufrufhäufigkeiten
|
||||||
|
\item Ausführungszeiten
|
||||||
|
\end{itemize}
|
||||||
|
\item Systemdaten
|
||||||
|
\begin{itemize}
|
||||||
|
\item CPU-Auslastung
|
||||||
|
\item Arbeitsspeicher
|
||||||
|
\item aktive Prozesse
|
||||||
|
\item ...
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Perl.Kieker Implementierung}
|
||||||
|
|
||||||
|
\subsection{Architektur}
|
||||||
|
|
||||||
|
\begin{frame}{Architekturentwurf}
|
||||||
|
\includegraphics[width=0.95\textwidth]{images/Deployment-Diagram-Client-Server-Model}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Neuimplementierungen in Perl}
|
||||||
|
\includegraphics[width=0.95\textwidth]{images/Classdiagram-Kieker-Perl}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Implementierung von Monitoring Records, Monitoring Writer und Kontrollmechanismen
|
||||||
|
\item Unterstützte Records: OperationEntryEvent, OperationExitEvent, Trace
|
||||||
|
\item Auswertung mit \emph{Kieker.Analysis}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Basismodule}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker in Perl}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Kieker
|
||||||
|
\begin{itemize}
|
||||||
|
\item Kapselt die weiteren Module zur einfacheren Verwendung
|
||||||
|
\item Hält die Instanzen von Kieker::Writer und Kieker::Controlling
|
||||||
|
\end{itemize}
|
||||||
|
\item Kieker::Controlling
|
||||||
|
\begin{itemize}
|
||||||
|
\item Verwaltet Trace-IDs und Order-Indices
|
||||||
|
\item Erzeugt bei Bedarf neue Traces
|
||||||
|
\end{itemize}
|
||||||
|
\item Kieker::Util
|
||||||
|
\begin{itemize}
|
||||||
|
\item Verwaltet Zeitmessung
|
||||||
|
\item Rechnet Perl-Mikrosekunden in Nanosekunden um
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker in Perl - Writer}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Kieker::Writer::FileWriter
|
||||||
|
\begin{itemize}
|
||||||
|
\item Schreibt serialisierte Records in angelegte Datei
|
||||||
|
\item Wurde für frühe Test verwendet
|
||||||
|
\end{itemize}
|
||||||
|
\item Kieker::Writer::JMSWriter
|
||||||
|
\begin{itemize}
|
||||||
|
\item Verwendet den Java Message Service zur Übertragung der Nachrichten
|
||||||
|
\item Anbindung an Kieker mittels Kieker-Data-Bridge
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker in Perl - Records}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Kieker::Record::Trace
|
||||||
|
\item Kieker::Record::OperationEntryEvent // OperationExitEvent
|
||||||
|
\begin{itemize}
|
||||||
|
\item Zeigen Start und Ende einer Funktion an
|
||||||
|
\item Benötigte Daten: Funktionsname, Paketname, Zeitstempel, Trace, OrderIndex
|
||||||
|
\item Rekonstruktion durch Kieker.Analysis
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Kieker-Data-Bridge}
|
||||||
|
\begin{frame}{Kieker-Data-Bridge I}
|
||||||
|
\includegraphics[width=0.95\textwidth]{images/kieker-data-bridge}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker-Data-Bridge II}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Entwickelt aus dem MENGES-Projekt heraus
|
||||||
|
\item Stellt eine einheitliche Schnittstelle für neue Erweiterungen dar
|
||||||
|
\item Verschiedene Konnektoren \\
|
||||||
|
(TCP Client, TCP Server, JMS Client, JMS Embedded)
|
||||||
|
\item Empfängt Binärdaten und Textnachrichten
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Kieker-Data-Bridge III}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Textnachrichten mit Semikolon getrennt
|
||||||
|
\item Records werden mit Mapping-Datei identifiziert
|
||||||
|
\item Parameter hängen von Record-Typ ab
|
||||||
|
\item Beispiel: \texttt{1;1362747533540734000;6889; \\5;EPrints.current\_repository;EPrints}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Instrumentierung}
|
||||||
|
|
||||||
|
\begin{frame}{Automatische Instrumentierung}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Verwendung von CPAN-Modul Sub::WrapPackages
|
||||||
|
\item Automatische Erstellung von Wrappern
|
||||||
|
\item[] \includegraphics[width=0.7\textwidth]{images/Instrument-Code}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Testdurchführung}
|
||||||
|
\subsection{System}
|
||||||
|
\begin{frame}{Vergleichstest}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Virtuelle Maschine unter Ubuntu 12.04 LTS
|
||||||
|
\item Datenbasis vom GEOMAR vom 7. Februar 2013
|
||||||
|
\item Vergleich von EPrints 3.2 und Kielprints
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Komponenten}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.7\textwidth]{images/Kielprints-Deployment}
|
||||||
|
\end{center}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\subsection{Requests}
|
||||||
|
\begin{frame}
|
||||||
|
\begin{itemize}
|
||||||
|
\item 5 beispielhafte Anfragen auf der Admin-Oberfläche
|
||||||
|
\item Anwendungsfall \emph{Neue Publikation eintragen} (Skizze)
|
||||||
|
\item 4 normale Requests, 1 AJAX Request
|
||||||
|
\item[] \includegraphics[width=0.7\textwidth]{images/Screenshot-Trace4}
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\section{Ergebnisse}
|
||||||
|
\subsection{Zeitliches Verhalten}
|
||||||
|
\begin{frame}[shrink=15]{Zeitmessungen}
|
||||||
|
\begin{table}
|
||||||
|
\begin{tabular}{l|rrrrr}
|
||||||
|
Request & 1 & 2 & 3 & 4 & 5 \\
|
||||||
|
\hline
|
||||||
|
EP norm. & 402 ms & 220 ms & 136 ms & 413 ms & 348 ms \\
|
||||||
|
EP inst. & 15389 ms & 15043 ms & 18408 ms & \textbf{23430 ms} & \textbf{7066 ms} \\
|
||||||
|
\hline
|
||||||
|
KP norm. & 10270 ms & 227 ms & 166 ms & 13420 ms & 18890 ms \\
|
||||||
|
KP inst. & 28505 ms & 16623 ms & 17414 ms & \textbf{280927 ms} & \textbf{342662 ms} \\
|
||||||
|
\hline
|
||||||
|
F1 & 25,5 & 1,0 & 1,2 & 32,5 & 54,3 \\
|
||||||
|
F2 & 1,8 & 1,1 & 0,9 & 11,9 & 48,5
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Zeitliches Verhalten von Eprints und Kielprints vor und nach Instrumentierung}
|
||||||
|
\end{table}
|
||||||
|
\textbf{Requests}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Admin Homepage
|
||||||
|
\item Neue Publikation eintragen
|
||||||
|
\item Dateiupload
|
||||||
|
\item Metadaten
|
||||||
|
\item AJAX: Mehr Autorenfelder
|
||||||
|
\end{enumerate}
|
||||||
|
\end{frame}
|
||||||
|
\subsection{Funktionsaufrufe}
|
||||||
|
\begin{frame}[shrink=15]{Funktionsaufrufe}
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{l|rrrrr|r}
|
||||||
|
Request & 1 & 2 & 3 & 4 & 5 & Summe \\
|
||||||
|
\hline
|
||||||
|
Eprints & 20875 & 28590 & 33171 & 43056 & 16980 & 142672 \\
|
||||||
|
% \hline
|
||||||
|
Kielprints & 31742 & 36681 & 40165 & 905580 & 934760 & 1948928 \\
|
||||||
|
% \hline
|
||||||
|
Faktor & 1,5 & 1,3 & 1,2 & 21,0 & 55,1 & 13,7
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Funktionsaufrufe von EPrints und Kielprints}
|
||||||
|
\end{table}
|
||||||
|
\end{frame}
|
||||||
|
\subsection{Aktive Pakete}
|
||||||
|
\begin{frame}[shrink=10]{Aktive Pakete}
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{lrlr}
|
||||||
|
\textbf{EPrints} & \textbf{Aufrufe} & \textbf{Kielprints} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.Script.Compiler & 30304 & EPrints.MetaField & 501872 \\
|
||||||
|
EPrints.Repository & 25980 & EPrints.DataSet & 253493 \\
|
||||||
|
EPrints.MetaField & 18374 & EPrints.Repository & 243699 \\
|
||||||
|
EPrints.XML & 12486 & EPrints.Database & 189624 \\
|
||||||
|
EPrints.DataSet & 7488 & EPrints.DataObj & 156391 \\
|
||||||
|
EPrints.Utils & 7220 & EPrints.MetaField.Id & 155978 \\
|
||||||
|
EPrints.XML.EPC & 5703 & EPrints.Utils & 118036 \\
|
||||||
|
EPrints.DataObj & 5439 & EPrints.XML & 107939 \\
|
||||||
|
EPrints.Database & 3466 & EPrints.MetaField.Multilang & 45312 \\
|
||||||
|
EPrints.Script.Compiled & 3404 & EPrints.Script.Compiler & 39550
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Die 10 aktivsten Pakete}
|
||||||
|
\end{table}
|
||||||
|
\end{frame}
|
||||||
|
\subsection{Abhängigkeiten}
|
||||||
|
\begin{frame}{Abhängigkeitsgraph EPrints}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.6\textwidth]{images/Dependency-Graph-EPrints}
|
||||||
|
\end{center}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\begin{frame}{Reduzierter Abhängigkeitsgraph}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.65\textwidth]{images/Condensed-Dependency-Graph}
|
||||||
|
\end{center}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Fazit}
|
||||||
|
|
||||||
|
\begin{frame}{Fazit}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Es wurde ein erstes Monitoringverfahren für Perl-Anwendungen etabliert.
|
||||||
|
\item Die Perl-Data-Bridge wurde das erste Mal \emph{produktiv} eingesetzt.
|
||||||
|
\item Es wurde ein Vergleichstest von EPrints und Kielprints durchgeführt.
|
||||||
|
\item Es wurden häufige Datenbankanfragen in Kielprints festgestellt.
|
||||||
|
\item Es wurden Schwächen in der Architektur sowohl von EPrints und Kielprints erkannt.
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\end{document}
|
5
Thesis/LaTeX/abstract.tex
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Die Bedeutung von Webanwendungen hat in den letzten Jahren stetig zugenommen. Um diese Anwendungen während der Laufzeit zu überwachen, muss ein Monitoringverfahren für diese Softwaresysteme etabliert werden. Das Kieker Framework stellt ein effizientes System zum Monitoring von Java-Anwendungen dar.
|
||||||
|
|
||||||
|
In dieser Arbeit wird eine Erweiterung des Frameworks zum Monitoring von Perl-Anwendungen vorgestellt. Für diese Software wird die entwickelte Klassenstruktur vorgestellt und mögliche alternative Implementierungen diskutiert. Die Anbindung der Perl-Komponenten wird mit der Kieker-Data-Bridge realisiert, welche ebenfalls hier vorgestellt wird. Weiter wird ein manuelles und ein automatisches Instrumentierungsverfahren für objektorientiertes Perl vorgestellt.
|
||||||
|
|
||||||
|
Als erste Anwendung wird dann die Software zum Profiling von \gls{kielpr} verwendet. Hierbei werden Unterschiede im Verhalten zwischen Kielprints und unmodifiziertem EPrints aufgezeigt. Es zeigt sich bei Kielprints eine signifikante Steigerung der Laufzeiten und ein massiver Anstieg der Funktionsaufrufe gegenüber EPrints. Schließlich werden Ansätze zur Architekturerkennung für diese Anwendungen skizziert.
|
78
Thesis/LaTeX/appendix.tex
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
\chapter{Perl Dokumentation}\label{app:PerlDoc}
|
||||||
|
\input{../../Umsetzung/Perl/Kieker.tex}
|
||||||
|
|
||||||
|
\chapter{Perl Skripte zur Auswertung}\label{app:PerlScripts}
|
||||||
|
\section{Zählen von Aufrufhäugigkeiten}\label{app:perlFunCnt}
|
||||||
|
Dieses Skript liest einen von \textsf{Kieker.Analysis} ereugten Trace in textueller Form (erzeugt mit \emph{--print-Execution-Trace}) und erzeugt eine CSV-Datei mit allen Funktionen und ihren Aufrufhäufigkeiten.
|
||||||
|
\begin{lstlisting}[language=perl]
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
my $inputfile = '';
|
||||||
|
my $outputfile = 'a.out';
|
||||||
|
|
||||||
|
GetOptions ("i|input|inputfile=s" => \$inputfile, # string
|
||||||
|
"o|output|outputfile=s" => \$outputfile ); # string
|
||||||
|
|
||||||
|
unless ($inputfile) {
|
||||||
|
die("Missing option -i");
|
||||||
|
}
|
||||||
|
|
||||||
|
open(my $inFile, "<", $inputfile) || die "Can't open $inputfile: $!";
|
||||||
|
open(my $outFile, ">", "$outputfile.csv") || die "Can't open $outputfile: $!";
|
||||||
|
|
||||||
|
my %funHash = ();
|
||||||
|
my %funHashTrace = ();
|
||||||
|
my $trace;
|
||||||
|
|
||||||
|
while (<$inFile>) {
|
||||||
|
if (/0::@\d+:(\S+)\s/) {
|
||||||
|
$funHash{$1} += 1;
|
||||||
|
$funHashTrace{$1} += 1;
|
||||||
|
} elsif ($trace && /^TraceId\s(\d+)/) {
|
||||||
|
open(my $traceOutFile, ">", "$outputfile-$trace.csv")
|
||||||
|
|| die "Can't open $outputfile-$trace.csv: $!";
|
||||||
|
while (my ($key, $value) = each %funHashTrace) {
|
||||||
|
print $traceOutFile "$key;$value\n";
|
||||||
|
}
|
||||||
|
$trace = $1;
|
||||||
|
%funHashTrace = ();
|
||||||
|
} elsif (/^TraceId\s(\d+)/) {
|
||||||
|
$trace = $1;
|
||||||
|
%funHashTrace = ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open(my $traceOutFile, ">", "$outputfile-$trace.csv")
|
||||||
|
|| die "Can't open $outputfile-$trace.csv: $!";
|
||||||
|
while (my ($key, $value) = each %funHashTrace) {
|
||||||
|
print $traceOutFile "$key;$value\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
while (my ($key, $value) = each %funHash) {
|
||||||
|
print $outFile "$key;$value\n";
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\section{Aggregieren von Funktionsaufrufen}\label{app:perlFunAgg}
|
||||||
|
Mit diesem Skript werden die Trace-Daten modifiziert. Alle Funktionsnamen werden ignoriert und durch \emph{agg()} ersetzt. Somit existiert nur noch eine Funktion pro Paket. Die Aggregation erfolgt vor der Verarbeitung durch Kieker, damit auch graphische Auswertungen durch Kieker erzeugt werden können.
|
||||||
|
\begin{lstlisting}[language=perl]
|
||||||
|
use File::Copy;
|
||||||
|
|
||||||
|
my $inFile;
|
||||||
|
|
||||||
|
opendir(my $dh, ".") || die "can't opendir .: $!";
|
||||||
|
my @files = grep(/\.dat$/,readdir($dh));
|
||||||
|
|
||||||
|
foreach my $d (@files) {
|
||||||
|
copy($d,$d.".bak");
|
||||||
|
open($inFile, "<",$d.".bak");
|
||||||
|
open(my $outFile, ">",$d);
|
||||||
|
|
||||||
|
while (<$inFile>) {
|
||||||
|
s/(;EPrints.*\.).*?(;EPrints)/$1agg$2/;
|
||||||
|
print $outFile $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir $dh;
|
||||||
|
\end{lstlisting}
|
70
Thesis/LaTeX/authoryear-square.bbx
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
\ProvidesFile{authoryear-square.bbx}
|
||||||
|
%% [\abx@bbxid]
|
||||||
|
|
||||||
|
\RequirePackage{xpatch}
|
||||||
|
|
||||||
|
\RequireBibliographyStyle{standard}
|
||||||
|
\ExecuteBibliographyOptions{sorting=anyt,pagetracker,labelyear}
|
||||||
|
\ExecuteBibliographyOptions{firstinits,useprefix,maxbibnames=999,maxcitenames=2,block=space}
|
||||||
|
|
||||||
|
\defbibenvironment{bibliography}
|
||||||
|
{\list
|
||||||
|
{}
|
||||||
|
{\setlength{\leftmargin}{\bibhang}%
|
||||||
|
\setlength{\itemindent}{-\leftmargin}%
|
||||||
|
\setlength{\itemsep}{\bibitemsep}%
|
||||||
|
\setlength{\parsep}{\bibparsep}}}
|
||||||
|
{\endlist}
|
||||||
|
{\item}
|
||||||
|
|
||||||
|
\DeclareFieldFormat{shorthandwidth}{#1}
|
||||||
|
\defbibenvironment{shorthands}
|
||||||
|
{\list
|
||||||
|
{\printfield[shorthandwidth]{shorthand}}
|
||||||
|
{\setlength{\labelwidth}{\shorthandwidth}%
|
||||||
|
\setlength{\leftmargin}{\labelwidth}%
|
||||||
|
\setlength{\labelsep}{\biblabelsep}%
|
||||||
|
\addtolength{\leftmargin}{\labelsep}%
|
||||||
|
\setlength{\itemsep}{\bibitemsep}%
|
||||||
|
\setlength{\parsep}{\bibparsep}%
|
||||||
|
\renewcommand*{\makelabel}[1]{##1\hss}}}
|
||||||
|
{\endlist}
|
||||||
|
{\item}
|
||||||
|
|
||||||
|
\InitializeBibliographyStyle{}
|
||||||
|
|
||||||
|
%% Changes to standard style
|
||||||
|
\renewcommand*{\nameyeardelim}{\addspace}
|
||||||
|
\renewcommand*{\bibpagerefpunct}{\iflistundef{pageref}{\addspace}{\addperiod\addspace}}
|
||||||
|
\renewcommand*{\finentrypunct}{\iflistundef{pageref}{\addperiod}{}}%
|
||||||
|
\renewbibmacro*{in:}{%
|
||||||
|
\ifentrytype{article}{}{%
|
||||||
|
\printtext{\bibstring{in}\intitlepunct}}}
|
||||||
|
\xpatchbibmacro{pageref:comp}{\multilistdelim}%
|
||||||
|
{\ifboolexpr{test {\ifnumless{\value{listcount}}{\value{liststop}}}or test \ifmoreitems}{\multilistdelim}{\finallistdelim}}{}{}
|
||||||
|
\DeclareFieldFormat
|
||||||
|
[article,inbook,incollection,inproceedings,patent,thesis,unpublished]
|
||||||
|
{title}{#1\isdot}
|
||||||
|
|
||||||
|
%% Add the citekey
|
||||||
|
\xpatchbibdriver{misc}{\setunit{\labelnamepunct}}{\setunit*{\labelnamepunct}}{}{}
|
||||||
|
\renewbibmacro*{begentry}{%
|
||||||
|
\printtext[brackets]{%
|
||||||
|
\begingroup%
|
||||||
|
\defcounter{maxnames}{\blx@maxcitenames}%
|
||||||
|
\iffieldundef{shorthand}%
|
||||||
|
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}%
|
||||||
|
{\iffieldundef{label}{\printfield[citetitle]{labeltitle}}{\printfield{label}}%
|
||||||
|
%\setunit{\nameyeardelim}%
|
||||||
|
%\iffieldundef{labelyear}{}{\printfield{labelyear}\printfield{extrayear}}%
|
||||||
|
}%
|
||||||
|
{\printnames{labelname}%
|
||||||
|
\setunit{\nameyeardelim}%
|
||||||
|
\iffieldundef{labelyear}{}{\printfield{labelyear}\printfield{extrayear}}}}%
|
||||||
|
{\printfield{shorthand}}%
|
||||||
|
\endgroup%
|
||||||
|
}%
|
||||||
|
\printtext{}\setunit{\addspace}\newblock% \printtext{\quad}or \addspace
|
||||||
|
}
|
||||||
|
|
||||||
|
\endinput
|
214
Thesis/LaTeX/authoryear-square.cbx
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
\ProvidesFile{authoryear-square.cbx}
|
||||||
|
%% [\abx@cbxid]
|
||||||
|
|
||||||
|
\ExecuteBibliographyOptions{labelyear,autocite=inline,maxcitenames=2}
|
||||||
|
\newbool{cbx:parens}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:init}{%
|
||||||
|
\ifnumless{\value{multicitecount}}{2}
|
||||||
|
{\global\boolfalse{cbx:parens}%
|
||||||
|
\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}
|
||||||
|
{\iffieldundef{prenote}
|
||||||
|
{}
|
||||||
|
{\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:reinit}{%
|
||||||
|
\global\undef\cbx@lasthash
|
||||||
|
\global\undef\cbx@lastyear}
|
||||||
|
|
||||||
|
\newbibmacro*{cite}{%
|
||||||
|
\printtext[bibhyperref]{% Apply citation link to bibmacro output
|
||||||
|
\DeclareFieldAlias{bibhyperref}{default}% Prevent nested hyperlinks
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
|
||||||
|
{\usebibmacro{cite:label}%
|
||||||
|
%\setunit{\nameyeardelim}%
|
||||||
|
%\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\usebibmacro{cite:reinit}}
|
||||||
|
{\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\printnames{labelname}%
|
||||||
|
\setunit{\nameyeardelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\usebibmacro{cite:reinit}}%
|
||||||
|
\setunit{\multicitedelim}}}
|
||||||
|
|
||||||
|
\newbibmacro*{citeyear}{%
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\iffieldundef{labelyear}
|
||||||
|
{\usebibmacro{cite:label}%
|
||||||
|
\usebibmacro{cite:reinit}}
|
||||||
|
{\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\usebibmacro{cite:reinit}}%
|
||||||
|
\setunit{\multicitedelim}}
|
||||||
|
|
||||||
|
\newbibmacro*{textcite}{%
|
||||||
|
\iffieldequals{namehash}{\cbx@lasthash}
|
||||||
|
{\iffieldundef{shorthand}
|
||||||
|
{\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
|
||||||
|
\(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
|
||||||
|
{\setunit{\addcomma}%
|
||||||
|
\usebibmacro{cite:extrayear}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}}
|
||||||
|
{\setunit{\compcitedelim}%
|
||||||
|
\usebibmacro{cite:shorthand}%
|
||||||
|
\global\undef\cbx@lastyear}}
|
||||||
|
{\ifbool{cbx:parens}{\bibclosebracket\global\boolfalse{cbx:parens}}{}%
|
||||||
|
\setunit*{\multicitedelim}%
|
||||||
|
\ifnameundef{labelname}
|
||||||
|
{\iffieldundef{shorthand}
|
||||||
|
{\printtext[bibhyperref]{\DeclareFieldAlias{bibhyperref}{default}\usebibmacro{cite:label}}%
|
||||||
|
\setunit{%
|
||||||
|
\global\booltrue{cbx:parens}%
|
||||||
|
\addspace\bibopenbracket}%
|
||||||
|
\ifnumequal{\value{citecount}}{1}
|
||||||
|
{\usebibmacro{prenote}}
|
||||||
|
{}%
|
||||||
|
\usebibmacro{cite:labelyear+extrayear}}
|
||||||
|
{\usebibmacro{cite:shorthand}}}
|
||||||
|
{\printtext[bibhyperref]{\DeclareFieldAlias{bibhyperref}{default}\printnames{labelname}}%
|
||||||
|
\setunit{%
|
||||||
|
\global\booltrue{cbx:parens}%
|
||||||
|
\addspace\bibopenbracket}%
|
||||||
|
\ifnumequal{\value{citecount}}{1}
|
||||||
|
{\usebibmacro{prenote}}
|
||||||
|
{}%
|
||||||
|
\iffieldundef{shorthand}
|
||||||
|
{\iffieldundef{labelyear}
|
||||||
|
{\usebibmacro{cite:label}}
|
||||||
|
{\usebibmacro{cite:labelyear+extrayear}}%
|
||||||
|
\savefield{labelyear}{\cbx@lastyear}}
|
||||||
|
{\usebibmacro{cite:shorthand}%
|
||||||
|
\global\undef\cbx@lastyear}%
|
||||||
|
\savefield{namehash}{\cbx@lasthash}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:shorthand}{%
|
||||||
|
\printtext[bibhyperref]{\printfield{shorthand}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:label}{%
|
||||||
|
\iffieldundef{label}
|
||||||
|
{\printtext[bibhyperref]{\printfield[citetitle]{labeltitle}}}
|
||||||
|
{\printtext[bibhyperref]{\printfield{label}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:labelyear+extrayear}{%
|
||||||
|
\iffieldundef{labelyear}
|
||||||
|
{}
|
||||||
|
{\printtext[bibhyperref]{%
|
||||||
|
\printfield{labelyear}%
|
||||||
|
\printfield{extrayear}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{cite:extrayear}{%
|
||||||
|
\iffieldundef{extrayear}
|
||||||
|
{}
|
||||||
|
{\printtext[bibhyperref]{\printfield{extrayear}}}}
|
||||||
|
|
||||||
|
\newbibmacro*{textcite:postnote}{%
|
||||||
|
\usebibmacro{postnote}%
|
||||||
|
\ifthenelse{\value{multicitecount}=\value{multicitetotal}}
|
||||||
|
{\setunit{}%
|
||||||
|
\printtext{%
|
||||||
|
\ifbool{cbx:parens}
|
||||||
|
{\bibclosebracket\global\boolfalse{cbx:parens}}
|
||||||
|
{}}}
|
||||||
|
{\setunit{%
|
||||||
|
\ifbool{cbx:parens}
|
||||||
|
{\bibclosebracket\global\boolfalse{cbx:parens}}
|
||||||
|
{}%
|
||||||
|
\multicitedelim}}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\cite}
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand*{\cite}
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{citeyear}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\parencite}[\mkbibbrackets]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand*{\parencite}[\mkbibbrackets]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{citeyear}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\footcite}[\mkbibfootnote]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\footcitetext}[\mkbibfootnotetext]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\smartcite}[\iffootnote\mkbibbrackets\mkbibfootnote]
|
||||||
|
{\usebibmacro{cite:init}%
|
||||||
|
\usebibmacro{prenote}}
|
||||||
|
{\usebibmacro{citeindex}%
|
||||||
|
\usebibmacro{cite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{postnote}}
|
||||||
|
|
||||||
|
\DeclareCiteCommand{\textcite}
|
||||||
|
{\usebibmacro{cite:init}}
|
||||||
|
{\usebibmacro{citeindex}\usebibmacro{textcite}}
|
||||||
|
{}
|
||||||
|
{\usebibmacro{textcite:postnote}%
|
||||||
|
\ifbool{cbx:parens}{\bibclosebracket\global\boolfalse{cbx:parens}}{}}
|
||||||
|
|
||||||
|
\DeclareMultiCiteCommand{\cites}{\cite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\parencites}[\mkbibbrackets]{\parencite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\footcites}[\mkbibfootnote]{\footcite}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\footcitetexts}[\mkbibfootnotetext]{\footcitetext}{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\smartcites}[\iffootnote\mkbibbrackets\mkbibfootnote]{\smartcite}
|
||||||
|
{\setunit{\multicitedelim}}
|
||||||
|
\DeclareMultiCiteCommand{\textcites}{\textcite}{}
|
||||||
|
|
||||||
|
\endinput
|
188
Thesis/LaTeX/bibliography.bib
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
@inproceedings{Jung:2012,
|
||||||
|
author = {Goerigk, Wolfgang and Hasselbring, Wilhelm and Hennings, Gregor and Jung, Reiner and Neustock, Holger and Schaefer, Heiko and Schneider, Christian and Schultz, Elferik and Stahl, Thomas and von Hanxleden, Reinhard and Weik, Steffen and Zeug, Stefan},
|
||||||
|
title = {{Entwurf einer dom{\"a}nenspezifischen Sprache f{\"u}r elektronische Stellwerke}},
|
||||||
|
booktitle = {Software Engineering},
|
||||||
|
year = {2012},
|
||||||
|
editor = {J{\"a}hnichen, Stefan and K{\"u}pper, Axel and Albayrak, Sahin},
|
||||||
|
volume = {198},
|
||||||
|
series = {LNI},
|
||||||
|
pages = {119-130},
|
||||||
|
publisher = {GI},
|
||||||
|
added-at = {2012-05-10T00:00:00.000+0200},
|
||||||
|
biburl = {http://www.bibsonomy.org/bibtex/21e79c65a724d68edd0f07b5b97f2e3ab/dblp},
|
||||||
|
ee = {http://subs.emis.de/LNI/Proceedings/Proceedings198/article6645.html},
|
||||||
|
interhash = {b11f024c10545b1a4cf913876807e4ed},
|
||||||
|
intrahash = {1e79c65a724d68edd0f07b5b97f2e3ab},
|
||||||
|
isbn = {978-3-88579-292-5},
|
||||||
|
keywords = {dblp},
|
||||||
|
timestamp = {2012-05-10T00:00:00.000+0200},
|
||||||
|
url = {http://dblp.uni-trier.de/db/conf/se/se2012.html#GoerigkHHJNSSSSHWZ12},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@incollection{probDeterm,
|
||||||
|
year = {2004},
|
||||||
|
isbn = {978-3-540-23631-3},
|
||||||
|
booktitle = {Utility Computing},
|
||||||
|
volume = {3278},
|
||||||
|
series = {Lecture Notes in Computer Science},
|
||||||
|
editor = {Sahai, Akhil and Wu, Felix},
|
||||||
|
doi = {10.1007/978-3-540-30184-4_15},
|
||||||
|
title = {Problem Determination Using Dependency Graphs and Run-Time Behavior Models},
|
||||||
|
url = {http://dx.doi.org/10.1007/978-3-540-30184-4_15},
|
||||||
|
urldate = {2013-03-20},
|
||||||
|
publisher = {Springer Berlin Heidelberg},
|
||||||
|
author = {Agarwal, ManojK. and Appleby, Karen and Gupta, Manish and Kar, Gautam and Neogi, Anindya and Sailer, Anca},
|
||||||
|
pages = {171-182}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mastersthesis{cau15489,
|
||||||
|
month = aug,
|
||||||
|
type = {Diplomarbeit},
|
||||||
|
title = {Dynamische Analyse von COBOL-Systemarchitekturen zum modellbasierten Testen},
|
||||||
|
school = {Department of Computer Science, University of Kiel, Germany},
|
||||||
|
author = {Bettual Richter},
|
||||||
|
year = {2012},
|
||||||
|
note = {Diploma Thesis, University of Kiel (work in progress)},
|
||||||
|
keywords = { },
|
||||||
|
url = {http://eprints.uni-kiel.de/15489/},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mastersthesis{cau15486,
|
||||||
|
month = oct,
|
||||||
|
type = {Diplomarbeit},
|
||||||
|
title = {Dynamic analysis of .NET applications for architecture-based model extraction and test generation},
|
||||||
|
school = {Department of Computer Science, University of Kiel, Germany},
|
||||||
|
author = {Felix Magedanz},
|
||||||
|
year = {2011},
|
||||||
|
keywords = { },
|
||||||
|
url = {http://eprints.uni-kiel.de/15486/},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{gpl,
|
||||||
|
title = {GNU General Public License, Version 3},
|
||||||
|
url = {http://www.gnu.org/licenses/gpl.html},
|
||||||
|
urldate = {2013-03-20},
|
||||||
|
year = {2007},
|
||||||
|
month = jun
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{OracleJMSSpecs,
|
||||||
|
title = {Java Message Service Specification},
|
||||||
|
url = {http://www.oracle.com/technetwork/java/docs-136352.html},
|
||||||
|
urldate = {2013-03-20},
|
||||||
|
year = {2002},
|
||||||
|
month = mar
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{PerlHistory,
|
||||||
|
title = {The Timeline of Perl and its Culture},
|
||||||
|
url = {http://history.perl.org/PerlTimeline.html},
|
||||||
|
year = {2013},
|
||||||
|
month = mar,
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{modPerl,
|
||||||
|
title = {mod\_perl Documentation},
|
||||||
|
url = {http://perl.apache.org/docs/index.html},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{perlobj,
|
||||||
|
title = {perlobj - Perl object reference},
|
||||||
|
url = {http://perldoc.perl.org/perlobj.html},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{perldata,
|
||||||
|
title = {perldata - Perl data types},
|
||||||
|
url = {http://perldoc.perl.org/perldata.html},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{perlsyn,
|
||||||
|
title = {perlsyn - Perl syntax},
|
||||||
|
url = {http://perldoc.perl.org/perlsyn.html},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{EPrintsOA,
|
||||||
|
title = {EPrints - About Open Access},
|
||||||
|
url = {http://www.eprints.org/openaccess/},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@online{jpl,
|
||||||
|
title = {Java-Perl Library},
|
||||||
|
url = {http://oreilly.com/catalog/prkunix/excerpt/UGch03.html},
|
||||||
|
urldate = {2013-03-20}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MANUAL{Kieker1.7UserGuide,
|
||||||
|
title = {Kieker 1.7-SNAPSHOT User Guide},
|
||||||
|
author = {{Kieker Project}},
|
||||||
|
organization = {{Software Engineering Group, Kiel University, Kiel, Germany}},
|
||||||
|
month = mar,
|
||||||
|
year = {2013},
|
||||||
|
url = {http://kieker-monitoring.net/documentation/},
|
||||||
|
urldate = {2013-03-04}
|
||||||
|
}
|
||||||
|
|
||||||
|
@INPROCEEDINGS{KiekerICPE2012,
|
||||||
|
author = {van Hoorn,Andr{\'e} and Waller,Jan and Hasselbring,Wilhelm},
|
||||||
|
title = {Kieker: {A} Framework for Application Performance Monitoring and
|
||||||
|
Dynamic Software Analysis},
|
||||||
|
booktitle = {Proceedings of the 3rd ACM/SPEC International Conference on
|
||||||
|
Performance Engineering (ICPE~2012)},
|
||||||
|
year = {2012},
|
||||||
|
pages = {247--248},
|
||||||
|
month = apr,
|
||||||
|
publisher = {ACM},
|
||||||
|
isbn = {978-1-4503-1202-8},
|
||||||
|
location = {{Boston, Massachusetts, USA, April 22--25, 2012}},
|
||||||
|
}
|
||||||
|
|
||||||
|
@TECHREPORT{KiekerTR2009,
|
||||||
|
author = {van Hoorn,Andr{\'e} and Rohr,Matthias and Hasselbring,Wilhelm and
|
||||||
|
Waller,Jan and Ehlers,Jens and Frey,S{\"o}ren and Kieselhorst,Dennis},
|
||||||
|
title = {Continuous Monitoring of Software Services: {D}esign and Application
|
||||||
|
of the {K}ieker Framework},
|
||||||
|
institution = {Department of Computer Science, Kiel University, Germany},
|
||||||
|
year = {2009},
|
||||||
|
number = {TR-0921},
|
||||||
|
month = nov,
|
||||||
|
pages = {27~pages},
|
||||||
|
}
|
||||||
|
|
||||||
|
@MISC{KiekerWebSite,
|
||||||
|
author = {{Kieker Project}},
|
||||||
|
title = {Kieker web site},
|
||||||
|
year = {2013},
|
||||||
|
organization = {{Software Engineering Group, Kiel University, Kiel, Germany}},
|
||||||
|
url = {http://kieker-monitoring.net/},
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{schmalenbach2007performancemanagement,
|
||||||
|
title = {Performancemanagement f{\"u}r serviceorientierte Java-Anwendungen: Werkzeug- und Methodenunterst{\"u}tzung im Spannungsfeld von Entwicklung und Betrieb},
|
||||||
|
author = {Schmalenbach, C.},
|
||||||
|
isbn = {9783540366317},
|
||||||
|
url = {http://books.google.de/books?id=IbaEtgAACAAJ},
|
||||||
|
urldate = {2013-03-20},
|
||||||
|
year = {2007},
|
||||||
|
publisher = {Springer}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{PRKUnix,
|
||||||
|
title = {Perl Resource Kit},
|
||||||
|
author = {Siever, Ellen and Wall, Larry and Jepson, Brian and Futato, David and Patwardhan, Nathan},
|
||||||
|
isbn = {9781565923706},
|
||||||
|
month = nov,
|
||||||
|
year = {1997},
|
||||||
|
url = {http://oreilly.com/catalog/prkunix/excerpt/UGtoc.html},
|
||||||
|
urldate = {2013-03-20},
|
||||||
|
publisher = {O'Reilly Media}
|
||||||
|
}
|
9
Thesis/LaTeX/chapter1.tex
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
\epigraph{\textit{Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony.}}{--- Morpheus, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Seit einigen Jahren nehmen Internetdienste eine immer wichtigere Position ein. Mit fortschreitender Zeit wachsen diese Dienste und müssen häufig mit wachsender Komplexität fertig werden. Hier müssen zum Beispiel steigende Benutzerzahlen, wachsende Datenbanken oder Ergänzungen neuer Funktionen berücksichtigt werden. Kann die Anwendung nicht mir diesen Herausforderungen umgehen, treten häufig Performanceprobleme auf und es besteht schnell Bedarf an einer Möglichkeit das Verhalten der Anwendung zur Laufzeit zu beobachten und zu analysieren.
|
||||||
|
|
||||||
|
Das \gls{kieker} Monitoring Framework wird seit einiger Zeit an der Universität Kiel entwickelt und stellt ein mächtiges System zur Überwachung und Analyse von diversen Softwaresystemen dar. Dieses Programm ist in Java programmiert und unterstützt zur Zeit, mit Java, .NET, VB6 und COBOL, nur eine eingeschränkte Anzahl von Programmiersprachen. Mit diesem Tool sollte nun versucht werden in der Publikationsdatenbank \gls{kielpr} der Universität Performance-Probleme, die im Betrieb aufgetreten sind, zu lokalisieren. Diese Anwendung besteht aus einer modifizierte Version der quelloffenen Software EPrints der University of Southampton, welche am GEOMAR | Helmholtz-Zentrum für Ozeanforschung Kiel angepasst wurde und von dem dortigen Datenmanagement-Team betrieben wird. Große Teile der Anwendung wurden in der Programmiersprache Perl geschrieben, für die zum Zeitpunkt der Arbeit noch keine Schnittstelle im \gls{kieker} Framework vorhanden war. Somit wurde es nötig diese Schnittstelle zu realisieren um anschließend das \gls{kielpr}-System untersuchen zu können.
|
||||||
|
|
||||||
|
Im Rahmen der Arbeit werden die benötigten Perl-Module für das \gls{moni} sowie eine Anbindung dieser Komponenten an das bestehende \gls{kieker} Framework realisiert. Hierfür wird neben den Messmethoden in Perl auch eine Brücke in die Java-Anwendung \gls{kieker} benötigt. Anschließend werden diese neuen Komponenten auf das \gls{kielpr}-System angewendet, also eine Instrumentierung der Anwendung durchgeführt. Mit diesem instrumentierten \gls{kielpr} werden dann Tests durchgeführt, um Ursachen für die Performance-Probleme aufzudecken.
|
||||||
|
|
||||||
|
\noindent Im folgenden erkläre ich in \autoref{cha:grundlagen} die benötigten Grundlagen und stelle die verwendeten Technologien vor. Hierauf aufbauend stelle ich dann in \autoref{cha:perl} die von mir realisierten Softwarekomponenten vor und beschreibe anschließend die Anwendung auf das beschriebene Problem in \autoref{cha:instrumentierung}. In \autoref{cha:tests} wird dann das Testverfahren präsentiert und die erhaltenen Ergebnisse in \autoref{cha:testsErgebnisse} angegeben und analysiert. Zum Abschluss werde ich in \autoref{cha:abschluss} noch eine Zusammenfassung und mögliche Weiterführungen der Arbeit präsentieren.
|
54
Thesis/LaTeX/chapter2.tex
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
\epigraph{\textit{Perhaps we are asking the wrong questions. }}{--- Agent Brown, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Im folgenden werden die verwendete Technologien vorgestellt und die benötigten Grundlagen besprochen. Dies umfasst neben einer kurzen Vorstellung des \gls{kieker} Monitoring Frameworks in \autoref{sec:grundKieker} sowie der Programmiersprache Perl in \autoref{sec:grundPerl} auch eine Beschreibung des EPrints-System im allgemeinen und der angepassten Variante \gls{kielpr} in \autoref{sec:grundKielprints}. Schließlich wird dann in \autoref{sec:grundPerformance} eine Einführung in das \gls{moni} gegeben.
|
||||||
|
|
||||||
|
\section{Kieker Monitoring Framework}\label{sec:grundKieker}
|
||||||
|
\gls{kieker}\footnote{\url{http://www.kieker-monitoring.net} (Zuletzt aufgerufen 2013-03-19)} ist ein System zum \gls{moni} und zur Analyse des Laufzeit-Verhaltens einer Software. Es wird seit 2006 in der Arbeitsgruppe Software Engineering an der CAU Kiel entwickelt. Frühere Versionen von \gls{kieker} waren primär auf das \gls{moni} von Java-Anwendungen ausgerichtet, doch wurden bereits ergänzende Module entwickelt oder befinden sich zur Zeit in der Entwicklung um zum Beispiel .NET oder COBOL mit \gls{kieker} analysieren zu können. Seit 2011 wird \gls{kieker} von der SPEC Research Group als empfohlenes Tool im SPEC RG Software Verzeichnis\footnote{\url{http://research.spec.org/projects/tools.html} (Zuletzt aufgerufen 2013-03-20)} angeboten.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.96\textwidth]{images/kiekerComponentDiagram-woCloud-bw-w-record-newNames-withTraceAnalysis-colors}
|
||||||
|
\caption[Kieker Komponentendiagramm]{Kieker Komponentendiagramm \citep{Kieker1.7UserGuide}}
|
||||||
|
\label{fig:KiekerComponentDiagram}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Wie in \autoref{fig:KiekerComponentDiagram} dargestellt besteht \gls{kieker} aus den zwei zentralen Komponenten \textsf{Kieker.Monitoring} und \textsf{Kieker.Analysis}. Die Monitoring-Komponente stellt Klassen und Methoden zum Instrumentieren und Überwachen der Software zur Verfügung. Hierzu werden von \emph{\glspl{probe}} Messungen vorgenommen und hierzu \emph{\glspl{record}} erstellt. Diese \emph{\glspl{record}} werden dann an einen \emph{Monitoring Writer} übergeben, der die Informationen in eine Log-Datei schreibt oder mit einem Stream an die Analysis-Komponente übergibt. Zur Instrumentierung des Systems stehen manuelle Methoden, also das statische Einfügen der \emph{\glspl{probe}} in den Quelltext, aber auch automatische Mechanismen zur Verfügung, welche zum Beispiel mittels \emph{AspectJ} die Programmstruktur analysieren und automatisch die benötigten Messpunkte erzeugen \citep{Kieker1.7UserGuide,KiekerICPE2012,KiekerTR2009}.
|
||||||
|
|
||||||
|
\noindent Die Analyse der erhaltenen Daten wird mittels \textsf{Kieker.Analysis} durchgeführt. Diese Komponente liest die \emph{\glspl{record}} ein und stellt einen konfigurierbaren Ablauf zum Filtern, Analysieren und Visualisieren der Daten bereit. Hierbei können zum Beispiel Sequenzdiagramme oder Abhängigkeitsbäume erzeugt werden um das Verhalten der Anwendung zu beschreiben \citep{Kieker1.7UserGuide,KiekerICPE2012,KiekerTR2009}.
|
||||||
|
|
||||||
|
Die \textsf{Kieker.Monitoring}-Komponente wird in dieser Arbeit mit der parallel zu dieser Arbeit neu entwickelten Kieker-Data-Bridge erweitert um die Schnittstelle zwischen den Programmiersprachen Java und Perl zu überbrücken. Die Perl-Module sowie die Kieker-Data-Bridge werden in \autoref{cha:perl} ausführlicher erläutert.
|
||||||
|
|
||||||
|
\section{Die Programmiersprache Perl}\label{sec:grundPerl}
|
||||||
|
Die Programmiersprache Perl\footnote{\url{http://www.perl.org} (Zuletzt aufgerufen 2013-03-20)} ist eine imperative, plattformunabhängige, interpretierte Programmiersprache. Die erste Version wurde 1987 vorgestellt und hat seine Wurzeln primär in C und awk \citep{PerlHistory}. Die aktuelle Version ist Perl 5.16, die im Mai 2012 veröffentlicht wurde. Perl ist eine interpretierte Programmiersprache, also werden die Programme nicht zu einer nativen Anwendung übersetzt sondern mit einem Interpreter ausgeführt. Der Perl-Interpreter ist für alle relevanten Betriebssysteme verfügbar und in vielen Systemen bereits integriert. Neben der Verwendung des Interpreters im Betriebsystems wird der Interpreter auch häufig in Webserver eingebettet \citep{modPerl}.
|
||||||
|
|
||||||
|
In Perl werden verschiedenste Programmierparadigmen umgesetzt, allerdings ist es dem Programmierer freigestellt, welche dieser Möglichkeiten er umsetzen will. So ist zum Beispiel die Objektorientierung ein Teil der Sprache, allerdings nicht wie in Java erzwungen sondern mit verschiedenen Modulen optional verfügbar. Auch stellt Perl häufig mehrere Optionen für die selben Probleme bereit, so können häufig Befehle verkürzt werden oder es stehen mehrere äquivalente Befehle zur Verfügung. Dies führt allerdings sehr schnell zu schlechter Lesbarkeit der Programme, da Perl auch eine sehr freie Syntax ermöglicht. Zeilenumbrüche und Leerzeichen sind weitgehend bedeutungslos und führen zu einem sehr unterschiedlichen Code-Format und sehr persönlichen Gestaltungen der Programme \citep{perlsyn}.
|
||||||
|
|
||||||
|
Perl verwendet keine expliziten Typen und verfügt nur über die Datenstrukturen \gls{skalar}, \gls{array} bzw. Liste sowie \glspl{hash} \citep{perldata}. Wird mit Perl objektorientiert programmiert, so werden normale Variablen mit einem Attribut versehen, das die Klasse definiert (\emph{\glspl{blessvar}}). Diese Variablen verfügen intern über ein Hash zum Speichern ihrer Attribute und können auf Methoden der Klasse zugreifen \citep{perlobj}.
|
||||||
|
|
||||||
|
\section{EPrints \& Kielprints}\label{sec:grundKielprints}
|
||||||
|
Das System \gls{eprints} ist eine quelloffene Webplattform zur Veröffentlichung von Publikationen, Forschungsberichten oder anderen Dokumenten. Die Plattform implementiert dabei das OAI-PMH\footnote{Open Archives Initiative Protocol for Metadata Harvesting} Protokoll und ist somit ein Projekt zur Umsetzung von Open Access. \gls{eprints} wurde initial von der University of Southampton entwickelt und unter der \citep{gpl} lizenziert. Die Plattform wurde in Perl implementiert und steht zur Zeit in der Version 3.3 zum Download\footnote{\url{http://www.eprints.org/software/} (Zuletzt aufgerufen 2013-03-20)} bereit.
|
||||||
|
|
||||||
|
An der Universität Kiel wird die Software \gls{kielpr} verwendet, was eine angepasste Version von \gls{eprints}, basierend auf EPrints 3.2., ist. Betrieben wird diese Plattform durch das Kieler Datenmanagement Team am GEOMAR | Helmholtz-Zentrum für Ozeanforschung Kiel. Das Deployment der Anwendung ist in \autoref{fig:deploy} grob skizziert.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.6\textwidth]{images/Kielprints-Deployment}
|
||||||
|
\caption{Deployment der Kielprints-Anwendung}
|
||||||
|
\label{fig:deploy}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Wie bereits angesprochen sind im laufenden Betrieb einige Performance-Probleme aufgetreten, speziell bei einigen Seiten zur Administration. Hierbei treten mitunter Wartezeiten von über 10 Sekunden auf, obwohl sich die Datenbank mit 15050 Publikationen und 1090 Autoren\footnote{Stand: 2013-03-20, 12:50} noch in üblichen Größenordnungen bewegt.
|
||||||
|
|
||||||
|
\section{Monitoring}\label{sec:grundPerformance}
|
||||||
|
Beim \gls{moni} werden während der Ausführung einer Anwendung Messdaten erzeugt und anschließend anhand dieser Messdaten das Verhalten der Anwendung analysiert. Aufgrund der Art der Datenerfassung wird diese Analyse auch dynamische Analyse genannt. Das Verfahren steht als ergänzendes Mittel zur statischen Analyse zur Verfügung, bei welchem die Software anhand ihres Quelltextes analysiert wird. Allerdings ist die statische Analyse für umfangreichere Softwaresysteme nur schwierig durchführbar, da hier zum Beispiel alle theoretisch möglichen Programmpfade ausgewertet werden. Mit der dynamischen Analyse können die tatsächlich ausgeführten Programmpfade ermittelt werden und direkt das Verhalten der Anwendung nachvollzogen werden \citep[vgl. auch][]{schmalenbach2007performancemanagement}.
|
||||||
|
Mit verschiedenen Techniken können dann auch bei Bedarf nur Teile der Anwendung beobachtet werden und der Fokus auf bestimmte Programmteile gelegt werden. Dies kann einerseits durch verschiedene Instrumentierungstechniken, andererseits durch Filterung der erhaltenen Daten erreicht werden.
|
||||||
|
|
||||||
|
Zur Durchführung des Monitorings wird der Quelltext des Programms mit \emph{\glspl{probe}} versehen, welche verschiedene Ereignisse im Programmablauf protokollieren. Hierbei sind häufig Verzweigungen, Sprünge oder Funktionsaufrufe besonders von Interesse \citep[S. 38]{cau15489}, aber auch andere Ereignisse wie Anfragen an Datenbanken können protokolliert werden.
|
||||||
|
|
||||||
|
Mit den erhaltenen Messdaten wird eine Analyse und Visualisierung durchgeführt um das Verhalten der Anwendung zu dokumentieren. Hierbei werden zum Beispiel UML Sequenzdiagramme erstellt oder das zeitliche Verhalten der Anwendung detailliert untersucht. Auch kann ein Abhängigkeitsgraph erstellt werden, der die Verschränkung der verschiedenen Komponenten zeigt, oder eine statistische Analyse durchgeführt werden \citep{probDeterm}
|
||||||
|
|
||||||
|
Eine Sonderform der dynamischen Analyse ist das \emph{\gls{profil}}. Hierbei wird die Analyse eingesetzt um das Verhalten eines existierenden Softwaresystems auf Funktionsebene zu erfassen. Dies wird zum Beispiel in Modernisierungsprozessen verwendet. Da Anwendungen häufig im Betrieb modifiziert und weiterentwickelt werden und hierbei mitunter die Dokumentation der Änderungen nur untergeordneten Charakter gegenüber der Funktionalität genießt, weicht häufig das dokumentierte Verhalten von dem tatsächlich beobachteten ab. Diese Differenzen können durch das \emph{\gls{profil}} erkannt werden und in den Modernisierungsprozess eingebunden werden \citep{cau15489}.
|
||||||
|
|
||||||
|
\noindent Der Schwerpunkt dieser Arbeit wird auf dem \emph{\gls{profil}} sowie auf dem \emph{Performance Monitoring} liegen. Hierbei wird eine möglichst präzise Zeitmessung im Programmablauf durchgeführt und dieser Zeitcode in den \emph{\glspl{record}} eingefügt. Somit kann nicht nur die Aufrufreihenfolge sondern auch der zeitliche Ablauf, also konkret die Dauer zur Ausführung einer Funktion und auch die Häufigkeit der Ausführung, festgestellt werden. Es können dann besonders lang und/oder häufig laufende Funktionen identifiziert werden um Ansatzpunkte für Performanceprobleme aufzuzeigen. Neben der Zeit können noch weitere Systemdaten wie CPU-Auslastung oder Speicherverbrauch protokolliert werden. Das \gls{kieker} Framework unterstützt für diesen Zweck neben Kontrollflussdaten auch \emph{\glspl{record}} welche die Systemauslastung protokollieren oder die Systemzeit messen. Aufgrund der Erweiterbarkeit von \gls{kieker} können auch beliebige weitere \emph{\glspl{record}} erzeugt werden.
|
||||||
|
|
||||||
|
Der Hauptunterschied zwischen \emph{\gls{profil}} und \emph{Performance Monitoring} besteht darin, dass beim \emph{Performance Monitoring} die Anwendung kontinuierlich im laufenden Betrieb untersucht wird. Beim \emph{\gls{profil}} werden in der Regel Testfälle ausgeführt um eine möglichst gute Abdeckung nach klassischen Testkriterien wie Pfad-, Zweig- oder Anweisungsüberdeckung zu erreichen.
|
77
Thesis/LaTeX/chapter3.tex
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
\epigraph{\textit{Neo, sooner or later you're going to realize just as I did that there's a difference between knowing the path and walking the path.}}{--- Morpheus, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Vor der Entwicklung von Perl-Modulen mussten zunächst einige Abwägungen zur Integrationsweise getroffen werden. Es bieten sich verschiedene Möglichkeiten zur Überbrückung der Grenze zwischen Perl und \gls{kieker} an, die einleitend in \autoref{sec:perlMoeglich} diskutiert werden. Die gewählte Möglichkeit wird anschließend in \autoref{sec:perlImpl} detaillierter vorgestellt und schließlich in \autoref{sec:perlDataBridge} die Anbindung der Module an das vorhandene \gls{kieker} Framework beschrieben.
|
||||||
|
|
||||||
|
\section{Möglichkeiten der Integration}\label{sec:perlMoeglich}
|
||||||
|
Zur Verwendung des \gls{kieker} Frameworks mit neuen Programmiersprachen muss die Grenze zwischen den Sprachen überwunden werden. In früheren Arbeiten \citep{cau15486,cau15489} wurden hierzu bereits Überlegungen angestellt, die zu unterschiedlichen Ergebnissen gekommen sind. Auf dieses Projekt angewendet ergeben sich primär zwei Optionen, der Einsatz einer Perl-Java-Brücke oder eine Client/Server-basierte Lösung. Die ebenfalls mögliche Neuimplementierung von \gls{kieker} in Perl wurde nicht weiter berücksichtig, da neben erheblichem Aufwand in der Portierung die Pflege zweier funktional identischer Systeme nicht anzustreben ist.
|
||||||
|
\subsection{Verwendung einer Perl-Java-Brücke}
|
||||||
|
Für die Anbindung von .NET Anwendungen wurde in \citep{cau15486} eine kommerzielle .NET-Java-Bridge verwendet. Zur Zeit sind allerdings keine entsprechenden Brücken in ausreichender Stabilität für Perl verfügbar. Eine umfangreiche Implementierung, die Java-Perl Library von O'Reilly wird seit 1998 nicht mehr weiter gepflegt\citep{PRKUnix} und mehrere Open-Source Projekte\footnote{z.B. Java::Bridge: http://blogs.perl.org/users/theorbtwo/javabridge/ (Zuletzt aufgerufen 2013-03-20)} haben nicht die nötige Stabilität erreicht. Das Paket Inline::Java würde einige benötigte Funktionen bereitstellen, allerdings ist auch hier, aufgrund des hohen Alters der Bibliothek, ein problemloser Einsatz mit neueren Java Versionen zweifelhaft. Ebenso bestehen Probleme bei der Ausführung der Bibliothek im Rahmen eines Webdienstes. In Folge dieser Probleme wurde die Verwendung einer Brücke nicht weiter verfolgt.
|
||||||
|
\subsection{Entwicklung einer Client/Server-Architektur}
|
||||||
|
Als zweiter Ansatz ist eine Client/Server-Architektur zu verfolgen. Hierbei kommuniziert ein zu implementierender \gls{kieker} Perl-Client mit einem Java-basierten Server. Diese Prinzip ist in \autoref{fig:CommunicationDiagramClientServer} exemplarisch für diesen Fall dargestellt. Zur Kommunikation zwischen den Komponenten bieten sich verschiedene Protokolle wie TCP oder \gls{jms} an.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics{images/Deployment-Diagram-Client-Server-Model}
|
||||||
|
\caption{Kommunikationsmodell im Client/Server System}
|
||||||
|
\label{fig:CommunicationDiagramClientServer}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Es ist abzuwägen wieviele Kontrollmechanismen aus bestehenden \gls{kieker}-Komponenten übernommen werden können. Wird der bestehende Monitoring-Controller weiterverwendet müssen zusätzliche Nachrichten zur Trace-Verwaltung zwischen Client und Server versendet werden, die potentiell einen großen Einfluss auf die Laufzeit der Anwendung haben können. Andererseits steigt natürlich der Implementierungs- und Pflegeaufwand mit jedem zusätzlich neu in Perl realisierten Modul an und es können leichter Inkonsistenzen zwischen den verschiedenen \gls{kieker}-Implementierungen auftreten.
|
||||||
|
|
||||||
|
Für dieses Projekt wurde ein verhältnismäßig schwergewichtiger Perl-Client gewählt, der neben eigenen Methoden zur Zeitmessung auch die Traceverwaltung übernimmt. Die erhaltenen Daten können dann zur weiteren Aufbereitung an \gls{kieker} übergeben werden. Hierfür wird die Kieker-Data-Bridge verwendet, welche genauer in \autoref{sec:perlDataBridge} beschrieben wird.
|
||||||
|
|
||||||
|
\section{Implementierung}\label{sec:perlImpl}
|
||||||
|
Für das Monitoring von Perl-Anwendungen wurde ein Perl-Modul entwickelt, welche sich um die Erzeugung von \emph{\glspl{record}}, die Verwaltung und das Controlling sowie um die Kommunikation mit der Data-Bridge kümmert. Aufgrund der engen Zielsetzung wurde zunächst nur ein eingeschränkter Funktionsumfang des \gls{kieker} Frameworks umgesetzt. Die Module und ihre Verbindungen untereinander sind in \autoref{fig:ClassDiagramKiekerPerl} zu erkennen. Die zentralen Funktionen finden sich hier in dem Modul \textsf{Kieker.pm} wieder. Auf die einzelnen Komponenten und die Funktionsweise wird im folgenden eingegangen. Die Dokumentation der Pakete findet sich in \autoref{app:PerlDoc}.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{images/Classdiagram-Kieker.Perl}
|
||||||
|
\caption{Klassendiagramm für Kieker.Perl}
|
||||||
|
\label{fig:ClassDiagramKiekerPerl}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Kieker}
|
||||||
|
Das Modul \gls{kieker} stellt eine schmale Schnittstelle zur einfachen Benutzung bereit. In diesem Modul werden die Controlling- und Writing-Komponenten verwaltet und Methoden für die verschiedenen Events bereitgestellt. In diesen Methoden werden die Optionen zur Zeitmessung und zum Schreiben der \emph{\glspl{record}} gekapselt. Somit bietet sich hier auch die Möglichkeit der Konfiguration an, um andere Writer-Module zu verwenden oder um andere Komponenten ersetzen zu können.
|
||||||
|
\subsection{Kieker::Controlling}
|
||||||
|
Das Controlling Modul verwaltet die Trace-Ids sowie die laufenden Zähler der Traces. Da im EPrints-Web-Kontext ein einzelner Request nur schwierig identifizierbar ist, wurde hier auf eine Notlösung zurückgegriffen und die Thread-Id des Perl-Interpreters als Trace-Id verwendet. Hierbei wird dann in der Apache-Konfiguration dafür gesorgt, dass jeder Request in einem eigenen Thread gestartet wird. Als bessere Lösung bietet es sich hier im Web-Kontext an, die angeforderte URL in Kombination mit einem Zeitstempel und eventuell einer IP-Adresse des Benutzers zu verwenden. Diese Informationen können allerdings nicht aus Umgebungsvariablen erzeugt werden, sondern erfordern z.B. ein Apache Request Object\footnote{Dokumentation unter http://perl.apache.org/docs/2.0/api/Apache2/RequestRec.html (Zuletzt aufgerufen 2013-03-24)}, welches allerdings von EPrints blockiert wird und somit hier nicht zur Verfügung steht.
|
||||||
|
|
||||||
|
Für die Zähler der Traces wird ein Hash verwendet, in dem die aktuellen Zählerstände verwaltet werden. Wird ein Zähler zu einem unbekannten, also neu angelegten, Trace angefordert wird automatisch der entsprechende Trace-Record erzeugt und an den Writer übergeben.
|
||||||
|
\subsection{Kieker::Util}
|
||||||
|
Im Util Modul werden Hilfsfunktionen zur einfacheren Verwendung der Module verwaltet. Im aktuellen Status wird hier nur die Zeitmessung gekapselt. Perl stellt keine Funktionen zur Messung von Nanosekunden, sondern lediglich das Paket Time::HiRes zur Messung in einem Paar (Sekunden,Mikrosekunden) bereit. Zur Kompatibilität mit der \gls{kieker} Zeitmessung wird eine Anpassung auf ein flaches Nanosekunden-Format durchgeführt. Hierbei wird natürlich keine Steigerung der Genauigkeit erreicht sondern lediglich ein Mikrosekunden-Zeitstempel in Nanosekunden ausgegeben.
|
||||||
|
\subsection{Kieker::Writer}
|
||||||
|
Unter Kieker::Writer wurden zwei verschiedene Ausgabemodule erstellt. In einer frühen Phase wurde zunächst Kieker::Writer::FileWriter verwendet, der automatisch zeilenweise in eine Datei schreibt, die bei der Initialisierung des Moduls erstellt wird. Dieser FileWriter wurde primär für frühe Entwicklungen und Tests verwendet.
|
||||||
|
|
||||||
|
Der später eingesetzte Writer ist Kieker::Writer::JMSWriter. Dieses Modul baut beim Start eine Verbindung zu einem laufenden JMS-Provider auf \citep[Zur Funktionsweise von JMS vgl.][]{OracleJMSSpecs}. Über diese Verbindung werden dann die \emph{\glspl{record}} in serialisierter Form an eine Message-Queue gesendet. Zur Verbindung mit dem JMS-Provider wird das Modul Net::Stomp verwendet, das die Nachrichten in Textform überträgt. Dieses Protokoll wird noch nicht von allen JMS-Providern unterstützt, bietet aber leichte Implementierbarkeit und ist somit auch in vielen anderen Sprachen verfügbar.
|
||||||
|
\subsection{Kieker::Record}
|
||||||
|
Die drei zur Zeit implementierten \emph{\glspl{record}} sind Trace, OperationEntryEvent und OperationExitEvent. Der Trace wird, wie bereits erwähnt, automatisch durch den Controller erzeugt sobald ein neuer Trace gestartet wird. Die beiden OperationEvents verfügen über die selben Attribute wie die entsprechenden \gls{kieker} Events und können nach Bedarf erzeugt werden. Zusätzlich verfügen die \emph{\glspl{record}} noch jeweils über eine Methode zur Serialisierung der Ausgabe. Hierbei werden den Events eindeutige Kennnummern zugewiesen, die später bei der Deserialisierung zur Identifizierung genutzt werden. Nach der Serialisierung sieht z.B. ein OperationEntryEven wie folgt aus:
|
||||||
|
\begin{verbatim}
|
||||||
|
1;1362747533540734000;6889;5;EPrints.current_repository;EPrints
|
||||||
|
\end{verbatim}
|
||||||
|
Dieses Nachrichtenformat wurde für die weitere Verwendung mit der Kieker-Data-Bridge entworfen.
|
||||||
|
|
||||||
|
\section{Übernahme der Daten in Kieker}\label{sec:perlDataBridge}
|
||||||
|
Zur Übernahme der Monitoringdaten in das bestehende \gls{kieker} System musste eine Methode geschaffen werden die serialisierten \emph{\glspl{record}} zu importieren. In den bisherigen Arbeiten wurde dies auf unterschiedliche Arten getan, so wurde in \citep{cau15489} das Programm \emph{Seq2Kieker} verwendet, welches sich an Stelle einer \gls{kieker} Probe in der bisherigen Struktur einbettet (vgl. dazu \autoref{fig:KiekerComponentDiagram}) und die erzeugten Protokolldaten in \gls{kieker} \emph{\glspl{record}} transformiert.
|
||||||
|
|
||||||
|
Damit nicht für jede neue Programmiersprache erneut eine Schnittstelle entwickelt werden muss, wurde begonnen eine einheitliche Schnittstelle bereitzustellen. Aus dem MENGES-Projekt \citep{Jung:2012} heraus wurde daraufhin von Reiner Jung begonnen die Kieker-Data-Bridge zu entwickeln. Um bereits zur Entwicklungszeit mit der Data-Bridge arbeiten zu können, habe ich zunächst Teile der Data-Bridge übernommen und um die Option zur Verwendung eines JMS-Providers sowie um die Verwendung von Textnachrichten statt Binärdaten erweitert. Diese Komponenten sind dann ebenfalls in die Data-Bridge migriert worden, so dass für die späteren Tests die fertige Data-Bridge verwendet werden konnte.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/kieker-data-bridge}
|
||||||
|
\caption[Komponentendiagramm Kieker-Data-Bridge]{Komponentendiagramm-Kieker-Data-Bridge\footnotemark}
|
||||||
|
\label{fig:KiekerDataBridge}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\footnotetext{Grafik freundlicherweise zur Verfügung gestellt von Reiner Jung}
|
||||||
|
Die Data-Bridge kennt verschiedene Konnektoren, die durch die \emph{Service Connectors} realisiert werden. Zusätzliche Konnektoren für neue Kommunikationsarten können somit bei Bedarf ergänzt werden, indem ein neuer Service Connector erstellt wird. Zur Zeit kann die Bridge Daten direkt per TCP oder \gls{jms} entgegennehmen. Auch für den Verbindungsaufbau existieren verschiedene Verfahren, in denen die Kieker-Data-Bridge entweder als Server auf eingehende Verbindungen lauscht oder sich als Client an einem wartenden Monitoring Prozess anmeldet. Im JMS-Modus kann sich die Data-Bridge entweder an einem JMS-Provider anmelden oder einen eigenen JMS-Provider im eingebetteten Modus starten.
|
||||||
|
|
||||||
|
In dieser Arbeit werden die Nachrichten in Textform, wie in \autoref{sec:perlImpl} beschrieben, übertragen. Das Format wurde möglichst einfach gewählt um eine leichte Implementierbarkeit auch für zukünftige Projekte zu gewährleisten. Die Nachrichten beginnen mit einer Id, auf die, mit Semikolons getrennt, die Attribute folgen. Sollte ein Semikolon in den Datenfeldern auftreten, muss dieses maskiert werden. Dies sollte sich aber als unkritisch erweisen, da als Nutzdaten in den \emph{\glspl{record}} nur Zahlen oder Funktionsnamen übertragen werden, die in den meisten Programmiersprachen nur aus einem eingeschränkten Zeichensatz bestehen. Das Ende der Nachricht wird mit dem betriebssystemspezifischen Zeilenende signalisiert.
|
||||||
|
|
||||||
|
Die Identifizierung der \emph{\glspl{record}} erfolgt durch eine Mapping-Datei, in der für jeden Record Typen die eindeutige Id angegeben wird. Das von mir verwendete Mapping ist in \autoref{lst:recordMapping} angegeben.
|
||||||
|
\begin{lstlisting}[caption=Record Mapping der Kieker-Data-Bridge,label=lst:recordMapping]{}
|
||||||
|
1=kieker.common.record.flow.trace.operation.BeforeOperationEvent
|
||||||
|
2=kieker.common.record.flow.trace.operation.AfterOperationEvent
|
||||||
|
3=kieker.common.record.flow.trace.Trace
|
||||||
|
\end{lstlisting}
|
||||||
|
Nach der Auswahl des passenden Records werden die jeweiligen Attribute entsprechend dem TYPES Attribut der Records ausgewertet.
|
||||||
|
|
||||||
|
Neben den hier verwendeten Textnachrichten können die Nachrichten auch in einem binärem Modus übergeben werden. Außerdem kann die Data-Bridge nicht nur auf der Kommandozeile ausgeführt werden, sondern auch als Eclipse-Plugin verwendet werden. Diese Optionen wurden allerdings für diese Arbeit nicht verwendet.
|
73
Thesis/LaTeX/chapter4.tex
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
\epigraph{\textit{Never send a human to do a machine's job. }}{--- Agent Smith, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Nach der Implementierung der Perl Module mussten die \emph{\glspl{probe}} in den zu untersuchenden Code eingebracht werden. Das EPrints System ist objektorientiert programmiert und verfügt über eine große Anzahl an verwendeten Perl Modulen. In diesen Modulen mussten alle Subroutinen mit OperationEntry- und OperationExitEvents versehen werden.
|
||||||
|
Diese Instrumentierung wurde zunächst mit verschiedenen selbstentwickelten statischen Analysen versucht. Diese Versuche sind in \autoref{sec:instrStatisch} beschrieben. Da diese Versuche keine zufriedenstellenden Ergebnisse brachten wurde schließlich das \gls{cpan}-Modul Sub::WrapPackages\footnote{http://search.cpan.org/~dcantrell/Sub-WrapPackages-2.0/lib/Sub/WrapPackages.pm (Zuletzt aufgerufen 2013-03-25)} verwendet, das eine leichtgewichtige Lösung zur Erzeugung von Funktionen um eine existierende Subroutine herum darstellt. Mit diesem Paket wurde dann die Instrumentierung wie in \autoref{sec:instrSubWrap} beschrieben durchgeführt.
|
||||||
|
|
||||||
|
\section{Statische Integration der Probes}\label{sec:instrStatisch}
|
||||||
|
Zunächst wurde versucht die Pakete statisch zu analysieren und nach dieser Analyse die benötigen \emph{\glspl{probe}} in den Quelltext einzubringen. Für OperationEntryEvents funktioniert dieses Verfahren auch zufriedenstellend, indem am Anfang jedes Moduls zunächst ein Kieker Objekt erzeugt wird, dann mittels regulärer Ausdrücke der Beginn von Funktionen erkannt wird und anschließend der folgende Code eingebracht wird.
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption=Eingebrachtes OperationEntryEvent, label=lst:statischEntry, language=perl]{}
|
||||||
|
sub load_source {
|
||||||
|
$kieker->EntryEvent( 'load_source', 'EPrints::Citation' );
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\noindent Diese Integration funktioniert weitestgehend automatisch. Um die Zuverlässigkeit zu erhöhen kann hierbei auch das Paket Perl::Tidy eingesetzt werden um Unterschiede in der Formatierung auszugleichen und die regulären Ausdrücke einfacher gestalten zu können.
|
||||||
|
|
||||||
|
\noindent Ein größeres Problem entstand bei der Erzeugung der nötigen OperationExitEvents. Verfügt die Funktion über ein return Statement kann auch hier in einem naiven Ansatz versucht werden, wie in \autoref{lst:statischExitNaiv} das ExitEvent direkt vor dem return einzufügen.
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption=Eingebrachtes OperationExitEvent, label=lst:statischExitNaiv, language=perl]{}
|
||||||
|
$kieker->ExitEvent( 'load_source', 'EPrints::Citation' );
|
||||||
|
return $value
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\noindent Hierbei ist allerdings festzustellen, dass Perl-Funktionen nicht zwingend über ein return Statement verfügen müssen. Sofern die Funktion ohne ein return Statement terminiert, wird der Wert der letzten ausgeführten Operation zurückgegeben. Wie in \autoref{lst:statischNoReturn} können somit z.B. minimale Funktionen realisiert werden, die einen Wert zurückliefern.
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption=Minimale Funktion ohne return, label=lst:statischNoReturn, language=perl]{}
|
||||||
|
sub get_default_charset {
|
||||||
|
"utf8"
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\noindent In Kombination mit verschiedenen Verzweigungen oder Schleifen macht dieses Verhalten es schwierig den Wert einer Funktion sicher zu bestimmen und die letzte ausgeführte Operation zu lokalisieren.
|
||||||
|
|
||||||
|
Weiterhin ist es möglich, dass die Argumente im return Statement über Seiteneffekte verfügen. Hierbei muss dann eine neue Variable erzeugt werden, die den Wert der Anweisung speichert, und die anschließend zurückgegeben werden kann. Diese Konstruktion ist in \autoref{lst:statischNewResult} dargestellt.
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption=return mit neuer Variablenbindung, label=lst:statischNewResult, language=perl]{}
|
||||||
|
my $kieker_return = get_default_charset();
|
||||||
|
$kieker->ExitEvent( 'load_source', 'EPrints::Citation' );
|
||||||
|
return $kieker_return;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\noindent Als weiteres Problem stellt sich hierbei allerdings das Typensystem von Perl heraus. So ist es möglich, dass eine Funktion verschiedene Rückgabetypen erzeugt, je nachdem in welchem Kontext sie aufgerufen wird. Somit muss analysiert werden, ob das in \autoref{lst:statischNewResult} erzeugte \emph{kieker\textunderscore return} einen Skalaren Typ oder eine Liste darstellen muss. Die Rückgabe von Hashes wird in Perl nicht unterstützt. Für vordefinierte Funktionen können diese Informationen noch durch ein Parsen der Dokumentation erhalten werden, jedoch ist auch hier schon ein massiver Aufwand von Nöten.
|
||||||
|
|
||||||
|
Werden nun aber Objektmethoden in dem Return statement aufgerufen, kann nicht mehr aus der Signatur erkannt werden, was für ein Rückgabetyp hier erzeugt wird. Weiterhin existiert das Konstrukt \emph{wantarray} mit dem zur Laufzeit unterschiedliche Typen zurückgegeben werden können, je nachdem in welchem Kontext der Aufruf erfolgt. Somit scheiterte dieser Ansatz der Instrumentierung.
|
||||||
|
|
||||||
|
\section{Integration mit Sub::WrapPackages}\label{sec:instrSubWrap}
|
||||||
|
Als zweiter Ansatz wurde dann die Verwendung eines spezialisierten Paketes aus dem \gls{cpan} gewählt. Das Paket Sub::WrapPackages wurde von David Cantrell entwickelt und dient dazu, gesamte Packages oder auch spezifische Funktionen innerhalb von Packages mit Wrappern zu umschließen und so das Ausführen von beliebigem Code vor und nach der Ausführung ermöglichen.
|
||||||
|
|
||||||
|
Zur Benutzung des Paketes muss das Paket lediglich vor der Ausführung der Pakete wie folgt eingebunden werden.
|
||||||
|
\begin{lstlisting}[caption=Benutzung von Sub::WrapPackages, label=lst:WrapPackages, language=perl, numbers=left]{}
|
||||||
|
use Sub::WrapPackages
|
||||||
|
packages => [qw(EPrints EPrints::*)],
|
||||||
|
pre => sub {
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new();
|
||||||
|
$_[0] =~ s/::/./g;
|
||||||
|
$_[0] =~ /^(.*)\..*?$/;
|
||||||
|
$kieker->EntryEvent($_[0],$1);
|
||||||
|
},
|
||||||
|
post => sub {
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new();
|
||||||
|
$_[0] =~ s/::/./g;
|
||||||
|
$_[0] =~ /^(.*)\..*?$/;
|
||||||
|
$kieker->ExitEvent($_[0],$1);
|
||||||
|
};
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\noindent In diesem Fall werden in Zeile 2 alle EPrints Pakete für die Instrumentierung gewählt und jeweils vor (Zeilen 3 bis 9) und nach (Zeilen 10 bis 16) der Ausführung der Funktionen Entry- bzw. ExitEvents erzeugt. In den Events werden der Funktionsname und auch der Paketname als Parameter übergeben. Hierbei ist zu beachten dass in Perl der zweifache Doppelpunkt als Trennzeichen in Signaturen verwendet wird und nicht der in Java übliche einfache Punkt. Diese Notation wird hier mit regulären Ausdrücken (Zeilen 6, 7, 13 und 14) angepasst um später besser in \textsf{Kieker.Analysis} ausgewertet werden zu können.
|
||||||
|
|
||||||
|
Der angegebene Code kann an verschiedenen Stellen eingebracht werden. Eine Möglichkeit wäre es, direkt in der Konfiguration des Webservers diesen Code ausführen zu lassen. Somit könnten auch Initialisierungen der Webanwendungen mit in dem Monitoring erfasst werden. Leider hat sich in einer der letzten Perl-Updates die Behandlung von definierten Konstanten verändert, was zu einem Fehler in dem Modul Sub::WrapPackages führt. Dieser Fehler verhindert die Aktivierung des Moduls bevor durch die Anwendung die Verbindung zur Datenbank aufgebaut wurde, da sonst Typenfehler bei Datenbankanfragen auftreten.
|
||||||
|
|
||||||
|
\noindent Statt dessen wurde der Code in die CGI-Dateien eingebracht, die vom Benutzer aufgerufen werden. Somit konnte selektiv bestimmt werden, welche Requests von dem Monitoring erfasst werden sollten. Zusätzlich wurden in der CGI-Datei zu Beginn und Ende des Codes Entry- und ExitEvents eingefügt, um einen äußeren Rahmen für den Trace zu bieten.
|
85
Thesis/LaTeX/chapter5.tex
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
\epigraph{\textit{Remember... all I'm offering is the truth. Nothing more.}}{--- Morpheus, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Nachdem die Instrumentierung der Anwendung und die Übernahme der Daten in das \gls{kieker} Framework realisiert war, wurde die EPrints Plattform untersucht. Diese Tests wurden nicht auf dem Produktivsystem sondern auf einem lokalen Testsystem durchgeführt, das in \autoref{sec:testsSystem} zunächst beschrieben wird. Anschließend wird in \autoref{sec:testsAufbau} der grundlegende Aufbau des Testszenarios beschrieben und in \autoref{sec:testsRequests} die durchgeführten Requests dokumentiert.
|
||||||
|
|
||||||
|
\section{Systemumgebung}\label{sec:testsSystem}
|
||||||
|
Die Tests wurden nicht auf den Systemen des GEOMAR durchgeführt, sondern auf einer lokalen, extra eingerichteten virtuellen Maschine. Als Host-System wurde dabei ein MacMini aus dem Jahr 2012 verwendet, der mit einem Intel Core i5 mit 2,5 GHz und 8GB Arbeitsspeicher ausgestattet ist. Zur Virtualisierung wurde die Software VirtualBox in der Version 4.2.8 unter Mac OS X 10.8.2 verwendet. In der virtuellen Maschine wurden dem Gastsystem 4 GB Arbeitsspeicher bereitgestellt.
|
||||||
|
|
||||||
|
Als Gastsystem wurde ein Ubuntu Linux 12.04 LTS eingesetzt. In diesem System wurde versucht die Gegebenheiten des GEOMAR System zu simulieren. Hierfür wurde PostgreSQL 8.4.16, Apache 2.2.22 und Perl 5.14.2 aus den Ubuntu Paketquellen gewählt und installiert. Für den Import der vom GEOMAR gelieferten Daten mussten einigen Referenzen in der Datenbank mit Prototypen aufgelöst werden. Hierzu musste ein neues, leeres Datenbankschema und einige Tabellen angelegt werden. Diese Tabellen wurden nicht mit Daten gefüllt und sind nicht direkt auf \gls{kielpr} bezogen sondern beinhalten normalerweise Daten zu Forschungsexpeditionen des Instituts.
|
||||||
|
|
||||||
|
\section{Testaufbau}\label{sec:testsAufbau}
|
||||||
|
In den Tests wurde ein Vergleich zwischen dem in Kiel verwendeten \gls{kielpr} und dem entsprechenden unmodifizierten EPrints 3.2 durchgeführt. Als Datenbasis wurde ein Datenexport der GEOMAR Datenbank vom 7. Februar 2013 verwendet. \gls{kielpr} wurde in der Version vom 4. März aus dem SVN-Repository des GEOMAR ausgecheckt und auf der virtuellen Maschine eingerichtet.
|
||||||
|
|
||||||
|
Beide Systeme wurden nacheinander auf der virtuellen Maschine gestartet und die selben Requests auf den Systemen ausgeführt. Hierfür wurde in beiden Systemen die Datei \emph{eprints/cgi/users/home} wie in \autoref{sec:instrSubWrap} beschrieben instrumentiert. Es wurden die Requests ausgeführt und die erhaltenen \emph{\glspl{record}} an einen laufenden JMS-Provider gesendet. Mittels der Kieker-Data-Bridge wurden die \emph{\glspl{record}} dem JMS-Provider entnommen und mittels der Standardkonfiguration als Trace im Dateisystem abgelegt.
|
||||||
|
|
||||||
|
\section{Requests}\label{sec:testsRequests}
|
||||||
|
Es wurden fünf Requests ausgewählt um einen exemplarischen Arbeitsvorgang darzustellen. Neben vier Seitenaufrufen ist hierbei auch ein Request via AJAX vorhanden, der in \gls{kielpr} besonders lange zur Ausführung benötigt. In den folgenden Abschnitten werden jeweils die genauen Requests aufgeführt und dann in \autoref{cha:testsErgebnisse} die jeweils erhaltenen Daten vorgestellt.
|
||||||
|
|
||||||
|
\subsection{Request 1: Admin-Login}
|
||||||
|
\begin{description}
|
||||||
|
\item[Request URL:]http://nbw-virtualbox/cgi/users/home
|
||||||
|
\item[Trace Ids:]Eprints: 6884 - Kielprints: 5821
|
||||||
|
\end{description}
|
||||||
|
Direkt nach dem Login wird eine Seite generiert, auf der die eingetragenen Publikationen angezeigt werden. Die Seiten unterscheiden sich primär in ihrem Aussehen, die Funktionalität ist anscheinend gleich. (\autoref{fig:screenTrace1})
|
||||||
|
\begin{figure}[p]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/Screenshot-Trace1}
|
||||||
|
\caption{Vergleich der Seiten zu Request 1 (Links EPrints, Rechts Kielprints)}
|
||||||
|
\label{fig:screenTrace1}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Request 2: Eintragen eines neuen Titels}
|
||||||
|
\begin{description}
|
||||||
|
\item[Request URL:]http://nbw-virtualbox/cgi/users/home \\
|
||||||
|
?screen=EPrint::Edit\&eprintid=20282\&stage=type
|
||||||
|
\item[Trace Ids:]Eprints: 6886 - Kielprints: 5820
|
||||||
|
\end{description}
|
||||||
|
Auf dieser Seite wird begonnen, wenn eine neue Publikation in der Datenbank eingetragen werden soll. Es bestehen leichte Unterschiede in den Seiten, so wird in der \gls{kielpr}-Version das zu verwendenden Archiv sowie eine Gewichtung für den Impact Factor abgefragt, während die EPrints Seite nur den Typ der Publikation erfragt. (\autoref{fig:screenTrace2})
|
||||||
|
\begin{figure}[p]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/Screenshot-Trace2}
|
||||||
|
\caption{Vergleich der Seiten zu Request 2 (Links EPrints, Rechts Kielprints)}
|
||||||
|
\label{fig:screenTrace2}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Request 3: Upload der Publikation}
|
||||||
|
\begin{description}
|
||||||
|
\item[Request URL:]http://nbw-virtualbox/cgi/users/home \\
|
||||||
|
?screen=EPrint::Edit\&eprintid=20280\&stage=files\#t
|
||||||
|
\item[Trace Ids:]Eprints: 6885 - Kielprints: 5829
|
||||||
|
\end{description}
|
||||||
|
Es wird nach der hochzuladenden Datei gefragt. Für diesen Test wurde keine Datei hochgeladen. Als Unterschied zwischen den beiden Versionen ist zu beachten, dass die Reihenfolge der Abfragen variiert. In \gls{kielpr} erfolgt dieser Upload erst nach der Eingabe der Metadaten, in EPrints vor dieser. Funktionale Unterschiede scheinen nicht zu bestehen.
|
||||||
|
\begin{figure}[p]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/Screenshot-Trace3}
|
||||||
|
\caption{Vergleich der Seiten zu Request 3 (Links EPrints, Rechts Kielprints)}
|
||||||
|
\label{fig:screenTrace3}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Request 4: Eingabe der Metadaten}
|
||||||
|
\begin{description}
|
||||||
|
\item[Request URL:]http://nbw-virtualbox/cgi/users/home \\
|
||||||
|
?screen=EPrint::Edit\&eprintid=20282\&stage=core\#t
|
||||||
|
\item[Trace Ids:]Eprints: 6888 - Kielprints: 5824
|
||||||
|
\end{description}
|
||||||
|
Auf dieser Seite werden die meisten Metadaten der Publikation eingetragen, also neben Titel und Autor und Kurzbeschreibung auch Herausgeber, Erscheinungsjahr und Einstellungen zum Open-Access-Zugriff. In \gls{kielpr} können hier auch Verweise zu Expeditionen des Instituts oder Verbindungen zu Sonderforschungsbereichen angegeben werden.
|
||||||
|
\begin{figure}[p]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/Screenshot-Trace4}
|
||||||
|
\caption{Vergleich der Seiten zu Request 4 (Links EPrints, Rechts Kielprints)}
|
||||||
|
\label{fig:screenTrace4}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Request 5: (AJAX) Mehr Autorenfelder}
|
||||||
|
\begin{description}
|
||||||
|
\item[Request URL:]http://nbw-virtualbox/cgi/users/home \\
|
||||||
|
?\_internal\_c15\_creators\_morespaces=Mehr\%20Eingabefelder\&[...]
|
||||||
|
\item[Trace Ids:]Eprints: 6889 - Kielprints: 5825
|
||||||
|
\end{description}
|
||||||
|
Werden für die Erfassung mehr Felder für die Autoren benötigt, so können hier zusätzliche Felder eingeblendet werden ohne die gesamte Seite neu laden zu müssen. Lediglich das Block-Element mit den Autoren wird auf dem Server neu generiert und per JavaScript in der Seite ersetzt. Die Eingabefelder verfügen über Optionen zur automatischen Vervollständigung, so dass hier nicht nur statische Eingabefelder generiert, sondern auch Daten aus der Datenbank angefordert werden müssen.
|
||||||
|
\begin{figure}[p]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{images/Screenshot-Trace5}
|
||||||
|
\caption{Vergleich der Seiten zu Request 5 (Links EPrints, Rechts Kielprints)}
|
||||||
|
\label{fig:screenTrace5}
|
||||||
|
\end{figure}
|
178
Thesis/LaTeX/chapter6.tex
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
\epigraph{\textit{Welcome to the real world.}}{--- Morpheus, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Die in \autoref{sec:testsRequests} beschriebenen Requests wurden, nach der Verarbeitung durch die Kieker-Data-Bridge, mit dem Kommandozeilentool \emph{kieker-analysis.sh} aufbereitet. Hierbei wurden zunächst mit der Option \emph{-\--print-Execution-Traces} textuelle Beschreibungen der erstellten Traces erzeugt. Aus diesen Beschreibungen konnten dann das zeitliche Verhalten, welches in \autoref{sec:auswZeit} erläutert wird, und die Funktionsaufrufe, welche in \autoref{sec:auswFunCall} besprochen werden, abgelesen werden.
|
||||||
|
|
||||||
|
Anschließend wurde mit einem Perl-Script (siehe Anhang \ref{app:perlFunCnt}) die Aufrufhäufigkeit für jede Funktion gezählt. Die Ergebnisse dieser Untersuchung werden in \autoref{sec:auswFunCnt} vorgestellt. Schließlich wurden die Funktionsaufrufe mit einem weiteren Perl-Script (siehe Anhang \ref{app:perlFunAgg}) in ihre Pakete aggregiert und die Aufrufhäufigkeiten für diese bestimmt. Diese Daten werden in \autoref{sec:auswPackCnt} präsentiert und diskutiert.
|
||||||
|
|
||||||
|
Zur weiteren Veranschaulichung wurden dann auf den aggregierten Daten mit der Kommandozeilenoption \emph{-\--plot-Assembly-Component-Dependency-Graph} die in \autoref{sec:auswPackDep} präsentierten Abhängigkeitsgraphen erstellt, um die Verbindungen zwischen den Paketen zu visualisieren.
|
||||||
|
|
||||||
|
\section{Zeitliches Verhalten}\label{sec:auswZeit}
|
||||||
|
Zunächst wurde eine Zeitmessung für alle Requests ausgeführt. Die erhaltenen Daten sind in \autoref{tab:auswZeit} aufgetragen. Zunächst ist hierbei festzustellen, dass die Instrumentierung offenbar einen extremen Anstieg der Ausführungszeit verursacht hat. Als wahrscheinlichste Engstelle vermute ich hier das Versenden der Records an den JMS-Provider via TCP. Hier sollte in Zukunft auf eine asynchrone Kommunikation umgestellt werden um den Programmablauf nicht unnötig zu verzögern.
|
||||||
|
|
||||||
|
\begin{table}
|
||||||
|
\begin{tabular}{l|rrrrr}
|
||||||
|
Request & Nr. 1 & Nr. 2 & Nr. 3 & Nr. 4 & Nr. 5 \\
|
||||||
|
\hline
|
||||||
|
Eprints normal & 402 ms & 220 ms & 136 ms & 413 ms & 348 ms \\
|
||||||
|
EPrints instrumentiert & 15389 ms & 15043 ms & 18408 ms & \textbf{23430 ms} & \textbf{7066 ms} \\
|
||||||
|
\hline
|
||||||
|
\gls{kielpr} normal & 10270 ms & 227 ms & 166 ms & 13420 ms & 18890 ms \\
|
||||||
|
\gls{kielpr} instrumentiert & 28505 ms & 16623 ms & 17414 ms & \textbf{280927 ms} & \textbf{342662 ms} \\
|
||||||
|
\hline
|
||||||
|
Faktor normal & 25,5 & 1,0 & 1,2 & 32,5 & 54,3 \\
|
||||||
|
Faktor instrumentiert & 1,8 & 1,1 & 0,9 & 11,9 & 48,5
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Zeitliches Verhalten von Eprints und Kielprints vor und nach Instrumentierung}
|
||||||
|
\label{tab:auswZeit}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
Vergleicht man die Ausführungszeiten zwischen den instrumentierten Varianten, so ist auffällig, dass in den Request 2 und 3 mit Faktor 1,1 und 0,9 kaum Abweichungen auftreten, aber in Request 4 eine Steigerung der Ausführungszeit um den Faktor 11,9 und in Request 5 sogar eine Steigung um den Faktor 48,5 auftritt. Weiter ist auffällig, dass in EPrints die Zeit für Request 5 um 70\% geringer ausfällt als für Request 4, während in \gls{kielpr} hier noch eine Steigerung um 21\% von Request 4 zu Request 5 festzustellen ist. Der Request 1 liegt zwischen den beiden Verhalten, indem es zwar eine Steigerung aufweißt aber diese mit dem Faktor 1,85 deutlich geringer ausfällt als in Requests 4 und 5.
|
||||||
|
|
||||||
|
Diese Verhältnisse verschieben sich noch bei den nicht-instrumentierten Versionen. Die Requests 2 und 3 weisen auch bei diesen Messungen kaum Unterschiede auf, doch bei den Request 1, 4 und 5 steigt die Ausführungszeit um Faktoren zwischen 25,5 und 54,3. Die unterschiedlichen Verhältnisse zwischen den normalen und instrumentierten Versionen lassen sich auf den großen Einfluss des Monitorings, und hier speziell das Senden der Records, zurückführen.
|
||||||
|
|
||||||
|
\section{Funktionsaufrufe}\label{sec:auswFunCall}
|
||||||
|
Als nächstes kann die Anzahl protokollierter Funktionsaufrufe betrachtet werden. In \autoref{tab:auswFunCall} sind die einzelnen Requests sowie die Summe über alle 5 Requests aufgetragen. Die Ergebnisse bieten ähnliche Folgerungen, wie bereits bei der zeitlichen Betrachtung.
|
||||||
|
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{l|rrrrr|r}
|
||||||
|
Request & 1 & 2 & 3 & 4 & 5 & Summe \\
|
||||||
|
\hline
|
||||||
|
Eprints & 20875 & 28590 & 33171 & 43056 & 16980 & 142672 \\
|
||||||
|
% \hline
|
||||||
|
\gls{kielpr} & 31742 & 36681 & 40165 & 905580 & 934760 & 1948928 \\
|
||||||
|
% \hline
|
||||||
|
Faktor & 1,5 & 1,3 & 1,2 & 21,0 & 55,1 & 13,7
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Funktionsaufrufe von EPrints und Kielprints}
|
||||||
|
\label{tab:auswFunCall}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\noindent Zwar sind die Funktionsaufrufe in den ersten drei Requests bei \gls{kielpr} höher als in EPrints, allerdings bewegen sich die beiden Systeme noch in den selben Größenordnungen. Als Abweichung zwischen dem zeitlichen Verhalten und den Funktionsaufrufen ist bei Request 3 festzustellen, dass trotz einer kürzeren Ausführungszeit eine Steigerung der Funktionsaufrufe auftritt. Bei Request 4 weißt \gls{kielpr} eine Steigerung um den Faktor 21,0 gegenüber dem unmodifizierten EPrints auf, bei Request 5 beträgt die Steigerung gar Faktor 55,1. In der Summe ergibt sich eine Steigerung um den Faktor 13,7 zwischen den Systemen.
|
||||||
|
|
||||||
|
\section{Aufrufhäufigkeiten für Funktionen}\label{sec:auswFunCnt}
|
||||||
|
Werden die Aufrufhäufigkeiten für die einzelnen Funktionen ausgewertet, zeigen sich auffällige Verschiebungen. Hierfür betrachte ich exemplarisch Request 4, für den ich in \autoref{tab:auswFunCnt4} jeweils die 10 häufigsten Funktionen angegeben habe.
|
||||||
|
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{lr}
|
||||||
|
\textbf{EPrints} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.Script.Compiler.next\_is & 5873 \\
|
||||||
|
EPrints.Repository.xml & 2668 \\
|
||||||
|
EPrints.XML.is\_dom & 1690 \\
|
||||||
|
EPrints.XHTML.\_to\_xhtml & 1345 \\
|
||||||
|
EPrints.Utils.is\_set & 1230 \\
|
||||||
|
EPrints.XML.EPC.process & 1073 \\
|
||||||
|
EPrints.XML.clone\_node & 968 \\
|
||||||
|
EPrints.Repository.get\_repository & 943 \\
|
||||||
|
EPrints.Repository.clone\_for\_me & 923 \\
|
||||||
|
EPrints.XML.create\_element & 842 \\ \\
|
||||||
|
|
||||||
|
\textbf{\gls{kielpr}} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.MetaField.Id.value\_from\_sql\_row & 75008 \\
|
||||||
|
EPrints.MetaField.property & 65202 \\
|
||||||
|
EPrints.Database.quote\_identifier & 52383 \\
|
||||||
|
EPrints.Utils.is\_set & 44571 \\
|
||||||
|
EPrints.MetaField.get\_sql\_names & 37258 \\
|
||||||
|
EPrints.DataSet.field & 31053 \\
|
||||||
|
EPrints.MetaField.get\_value & 30598 \\
|
||||||
|
EPrints.DataObj.get\_value\_raw & 30598 \\
|
||||||
|
EPrints.MetaField.get\_property & 27790 \\
|
||||||
|
EPrints.XML.is\_dom & 24304
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Die 10 meistgenutzten Funktionen bei Request 4}
|
||||||
|
\label{tab:auswFunCnt4}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\noindent Die am häufigsten aufgerufene Funktion in EPrints ist \emph{EPrints.Script.Compiler.next\_is}, eine Funktion die zur Verarbeitung der EPrints-internen Scriptsprache EPscript benötigt wird. Die Funktionen aus den Paketen \emph{EPrints.XHTML} und \emph{EPrints.XML} dienen offenbar primär der Aufbereitung des XHTML Codes der aufgerufenen Seite. Die Funktion aus dem Paket \emph{EPrints.Repository} behandeln das zentrale Datenobjekt des EPrints-Systems, welches z.B. die Datenbankverbindung oder den aktuellen Request zum zentralen Zugriff kapselt.
|
||||||
|
|
||||||
|
Im Vergleich dazu sind die häufigsten Funktionen in \gls{kielpr} weitestgehend auf die Datenbank bezogen. Neben den direkten Datenbankfunktionen dienen die meisten Funktionen aus den \emph{EPrints.MetaField} Paketen zur Aufbereitung der erhaltenen Daten. Besonders ist hierbei zu beachten, dass die häufigste Funktion, \emph{EPrints.MetaField.Id.value\_from\_sql\_row}, in der Dokumentation als \emph{deprecated} und Relikt aus EPrints Version 2 ausgewiesen ist und nicht mehr verwendet werden sollte.
|
||||||
|
Wird eine Summe über alle 5 Requests gebildet ergibt sich ein ähnliches Bild, wie in \autoref{tab:auswFunCntSum} zu erkennen ist.
|
||||||
|
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{lr}
|
||||||
|
\textbf{EPrints} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.Script.Compiler.next\_is & 17534 \\
|
||||||
|
EPrints.Repository.xml & 6428 \\
|
||||||
|
EPrints.XML.is\_dom & 5457 \\
|
||||||
|
EPrints.Utils.is\_set & 5361 \\
|
||||||
|
EPrints.MetaField.property & 4185 \\
|
||||||
|
EPrints.DataSet.field & 3310 \\
|
||||||
|
EPrints.Repository.get\_repository & 3181 \\
|
||||||
|
EPrints.XML.EPC.process & 3011 \\
|
||||||
|
EPrints.XML.clone\_node & 2682 \\
|
||||||
|
EPrints.Repository.clone\_for\_me & 2652 \\ \\
|
||||||
|
|
||||||
|
\textbf{\gls{kielpr}} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.MetaField.Id.value\_from\_sql\_row & 155884 \\
|
||||||
|
EPrints.MetaField.property & 138063 \\
|
||||||
|
EPrints.Database.quote\_identifier & 111214 \\
|
||||||
|
EPrints.Utils.is\_set & 95232 \\
|
||||||
|
EPrints.MetaField.get\_sql\_names & 78938 \\
|
||||||
|
EPrints.DataSet.field & 66011 \\
|
||||||
|
EPrints.MetaField.get\_value & 64282 \\
|
||||||
|
EPrints.DataObj.get\_value\_raw & 64282 \\
|
||||||
|
EPrints.MetaField.get\_property & 59662 \\
|
||||||
|
EPrints.XML.is\_dom & 53005
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Die 10 meistgenutzten Funktionen insgesamt}
|
||||||
|
\label{tab:auswFunCntSum}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\noindent Analog zu Request 4 dominieren hier in \gls{kielpr} die Funktionen zur Behandlung von Datenbankanfragen, während diese in EPrints nur eine untergeordnete Rolle spielen. In EPrints wird weiterhin die Funktion \emph{EPrints.Script.Compiler.next\_is} am häufigsten ausgeführt, welche bei der Ausführung von Scripten den Typ des nächsten Objektes bestimmt.
|
||||||
|
|
||||||
|
\section{Aufrufhäufigkeiten für Pakete}\label{sec:auswPackCnt}
|
||||||
|
Mit dem in Anhang \ref{app:perlFunAgg} angegebenen Skript wurden die individuellen Funktionsaufrufe auf ihre Paketzugehörigkeit reduziert, um Abhängigkeiten auf Paketebene analysieren zu können. Hierbei ergeben sich, über alle Requests zusammen, die in \autoref{tab:auswPack} angegebenen Werte.
|
||||||
|
|
||||||
|
\begin{table}[h!tb]
|
||||||
|
\begin{tabular}{lr}
|
||||||
|
\textbf{EPrints} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.Script.Compiler & 30304 \\
|
||||||
|
EPrints.Repository & 25980 \\
|
||||||
|
EPrints.MetaField & 18374 \\
|
||||||
|
EPrints.XML & 12486 \\
|
||||||
|
EPrints.DataSet & 7488 \\
|
||||||
|
EPrints.Utils & 7220 \\
|
||||||
|
EPrints.XML.EPC & 5703 \\
|
||||||
|
EPrints.DataObj & 5439 \\
|
||||||
|
EPrints.Database & 3466 \\
|
||||||
|
EPrints.Script.Compiled & 3404 \\ \\
|
||||||
|
|
||||||
|
\textbf{\gls{kielpr}} & \textbf{Aufrufe} \\
|
||||||
|
EPrints.MetaField & 501872 \\
|
||||||
|
EPrints.DataSet & 253493 \\
|
||||||
|
EPrints.Repository & 243699 \\
|
||||||
|
EPrints.Database & 189624 \\
|
||||||
|
EPrints.DataObj & 156391 \\
|
||||||
|
EPrints.MetaField.Id & 155978 \\
|
||||||
|
EPrints.Utils & 118036 \\
|
||||||
|
EPrints.XML & 107939 \\
|
||||||
|
EPrints.MetaField.Multilang & 45312 \\
|
||||||
|
EPrints.Script.Compiler & 39550
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Die 10 aktivsten Pakete}
|
||||||
|
\label{tab:auswPack}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
Diese Daten spiegeln erneut die Ergebnisse der bisherigen Auswertungen. Die Datenbankanbindung ist in EPrints das neunte Paket in der Liste, während es auf den vierten Platz in \gls{kielpr} vorrückt. Das wichtigste Paket in EPrints, \emph{EPrints.Script.Compiler}, rückt in \gls{kielpr} auf den 10. Platz. Auch ist hier zu beachten, dass kaum zusätzliche Funktionsaufrufe in diesem Paket auftreten. Erneut ist hier das Paket \emph{EPrints.MetaField.Id} vertreten, dass seit dem Update auf Version 3 nicht mehr verwendet werden sollte.
|
||||||
|
|
||||||
|
\section{Paketabhängigkeiten}\label{sec:auswPackDep}
|
||||||
|
Mit den gleichen Daten wie in \autoref{sec:auswPackCnt} wurden die Abhängigkeiten in \gls{kielpr} sowie in EPrints mit dem Grafiktool Gephi visualisiert. Hier wurde als Layout-Algorithmus die Einstellung Fruchtermann Reingold gewählt und der Graph anschließend mit Standardeinstellungen gerendert.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{images/Dependency-Graph-EPrints}
|
||||||
|
\caption{Visualisierung der Abhängigkeiten in EPrints}
|
||||||
|
\label{fig:dependenEPrints}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Der in \autoref{fig:dependenEPrints} hellgrün markierte Knoten stellt das Paket EPrints.Repository dar, der hellrot markierte Knoten das Paket EPrints.PluginFactory. Die jeweils direkt mit diesen Paketen benachbarten Knoten sind in der entsprechenden gedämpften Farbe markiert. Aufgrund der hohen Anzahl Knoten und der starken Vernetzung untereinander ist die Analyse hierbei allerdings nur schwierig möglich.
|
||||||
|
|
||||||
|
Werden in den Daten funktional ähnliche Pakete zusammengefasst, also zum Beispiel die verschiedenen \emph{EPrints.MetaField.*} Pakete oder die Pakete \emph{EPrints.Database.Pg} und \emph{EPrints.Database}, so zeigen sich die Abhängigkeiten deutlicher. Ein Versuch dieser Visualisierung ist in \autoref{fig:dependenEPrintsConden} dargestellt.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{images/Condensed-Dependency-Graph}
|
||||||
|
\caption{Visualisierung der Abhängigkeiten in EPrints}
|
||||||
|
\label{fig:dependenEPrintsConden}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Es ergeben sich nur geringe Unterschiede zwischen den Abhängigkeitsgraphen von EPrints und \gls{kielpr}. Allerdings zeigt sich hier, dass auch in EPrints Probleme in der Schichtenarchitektur bestehen, denn auch hier greift zum Beispiel das Paket \emph{EPrints.ScreenProcessor} direkt auf die Datenbank zu.
|
22
Thesis/LaTeX/chapter7.tex
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
\epigraph{\textit{Only human.}}{--- Agent Jones, \textit{The Matrix}}
|
||||||
|
|
||||||
|
\noindent Um die Arbeit abzuschließen, fasse ich zunächst in \autoref{sec:abschZusammen} das Vorgehen und die bisherigen Ergebnisse zusammen. Zum Schluss werden in \autoref{sec:abschWeiter} noch offene Fragen und mögliche Folgerungen aus dieser Arbeit präsentiert.
|
||||||
|
|
||||||
|
\section{Zusammenfassung}\label{sec:abschZusammen}
|
||||||
|
Im Rahmen meiner Arbeit habe ich eine Software entwickelt, welche die dynamische Analyse von Perl-Programmen mittels des \gls{kieker} Frameworks ermöglicht. Hierzu wurde ein in Perl implementiertes Modul erstellt, welches die benötigten Daten im Kontext des Perl-Interpreters sammelt und diese zur weiteren Bearbeitung an die, ebenfalls neu entwickelte, Kieker-Data-Bridge überträgt. Das Modul verfügt neben den benötigten Records auch über Methoden zur Traceverwaltung, wodurch der Kommunikationsaufwand reduziert wird.
|
||||||
|
|
||||||
|
Zur Instrumentierung von bestehendem Code wurde anschließend versucht eine statische Analyse durchzuführen, was jedoch aufgrund von diversen Verhaltensweisen der Programmiersprache Perl nicht erfolgreich durchgeführt werden konnte. Statt dessen konnte ein \gls{cpan}-Paket eingesetzte werden, dass zur Erzeugung von Routinen vor und nach der Ausführung von bestehendem Code dient. Mit diesem Verfahren konnten dann sowohl die Software EPrints als auch die Variante \gls{kielpr} mit \emph{\glspl{probe}} instrumentiert werden.
|
||||||
|
|
||||||
|
Mit diesen beiden Systemen wurde ein vergleichender Test durchgeführt um Unterschiede zwischen den Systemen zu lokalisieren. Hierbei wurde festgestellt, dass \gls{kielpr} bei selbem Datenbestand signifikant häufiger auf die Datenbank zugreift, worin ich die Ursache für die festgestellten Performanceprobleme vermute. Die Veränderungen im Verhalten deuten darauf hin, dass die Modifikationen in \gls{kielpr} einen Durchgriff durch die Schichtenarchitektur vornehmen. Auch wurde in diesem Kontext die Verwendung von veralteten Funktionen festgestellt, die auf absehbare Zeit zu einem Ausfall führen können, sollten die Funktionen in einer zukünftigen Version nicht mehr bereitgestellt werden.
|
||||||
|
|
||||||
|
Die ermittelten Daten des Vergleichstest können zur Zeit nur zur groben Lokalisierung der Probleme dienen, allerdings können die Daten auch noch detaillierter in Hinblick auf Abhängigkeiten oder Aufrufreihenfolge analysiert werden. Die hier präsentierten Auswertungen decken in dieser Hinsicht nur einen Teil ab. Als direkte Erkenntnis lässt sich allerdings bereits feststellen, dass in \gls{kielpr} darauf geachtet werden sollte, die von EPrints vorgesehene Skriptsprache zu verwenden und direkte Zugriffe auf die Datenbank zu vermeiden.
|
||||||
|
|
||||||
|
\section{Ausblick}\label{sec:abschWeiter}
|
||||||
|
Das im Rahmen dieser Arbeit realisierte Perl-Modul weißt zur Zeit nur einen eingeschränkten Funktionsumfang auf. Neben den implementierten drei Records unterstützt das \gls{kieker} Framework noch diverse weitere Recordtypen, die aufgrund der Zielsetzung dieser Arbeit bisher keinen Einzug in die Perl-Implementierung gefunden haben.
|
||||||
|
|
||||||
|
Als weitere Verbesserung sollte eine signifikante Verringerung des Performance-Over-heads priorisiert werden. Dies kann vermutlich durch Modifikationen beim Schreiben der Records erreicht werden.
|
||||||
|
In der weiteren Entwicklung sollte dann adaptives Monitoring integriert werden, um selektiver das Monitoring steuern zu können. Diese Änderungen erfordern dann auch eine Erweiterung der Kieker-Data-Bridge um einen vollständigen Rückkanal von \gls{kieker} zu dem überwachten System.
|
||||||
|
|
||||||
|
Die Analyse der ermittelten Daten kann genutzt werden, um sowohl EPrints im Allgemeinen als auch \gls{kielpr} im Speziellen zu verbessern und bisher unerkannte Schwächen in den Systemen zu lokalisieren und zu beheben. In Abstimmung mit dem GEOMAR können hier noch weitere Analysen durchgeführt werden, um die Probleme weiter eingrenzen zu können und \gls{kielpr} wieder in einen Zustand zu versetzen, der einen Regelbetrieb für die gesamte Universität ermöglicht.
|
||||||
|
|
||||||
|
Auch EPrints kann von diesen Untersuchungen profitieren. Da die Software bereits seit vielen Jahren von verschiedenen Entwicklern programmiert und modifiziert wird, steht es zu erwarten, dass die Software unerwünschtes Verhalten an den Tag legt und eine Überprüfung des theoretischen Modells gegenüber der tatsächlichen Implementierung zu einer Verbesserung der Software führen kann. Hierzu ist in dieser Arbeit im Rahmen der Abhängigkeitsanalyse schon ein erster Ansatz geboten worden.
|
24
Thesis/LaTeX/docstyleDE.tex
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
%% SE-KCSS-Style DE v1.1
|
||||||
|
\documentclass[10pt]{book}
|
||||||
|
\usepackage{fixltx2e}
|
||||||
|
\usepackage[resetfonts]{cmap}
|
||||||
|
\usepackage{nameref}
|
||||||
|
\usepackage[%
|
||||||
|
language=german,paper=a4paper,largepaper=true,%
|
||||||
|
algorithmBackwardCompatibility=false,algorithmForwardCompatibility=false,%
|
||||||
|
biblatexstyle=authoryear-square,biblatexOptions={natbib=true,backend=bibtex},%
|
||||||
|
acronymOptions={smaller,printonlyused}%,withpage
|
||||||
|
]{ifiseries}
|
||||||
|
\usepackage[format=hang]{caption}
|
||||||
|
\usepackage{textcomp}
|
||||||
|
\newcommand{\thesistitlepage}[5]{\gentitlepage{#1}{#2}{#3\\\Large\vspace{5ex}#4}{\Large\textsc{Christian-Albrechts-Universit\"{a}t zu Kiel\\Institut f\"{u}r Informatik\\ Arbeitsgruppe Software Engineering }\\\vspace{10ex}\begin{tabular}{rl}Betreut durch: & Prof. Dr. Wilhelm Hasselbring \\ & #5 \\\end{tabular}}}
|
||||||
|
\ExecuteBibliographyOptions{sortcase=false,babel=other,backref=true,abbreviate=false}
|
||||||
|
\ExecuteBibliographyOptions{isbn=false,url=true,doi=false,eprint=false}
|
||||||
|
\addbibresource{bibliography.bib}
|
||||||
|
|
||||||
|
\hypersetup{bookmarksdepth=3}
|
||||||
|
\hypersetup{bookmarksopen=true}
|
||||||
|
\hypersetup{bookmarksopenlevel=0}
|
||||||
|
\hypersetup{bookmarksnumbered=true}
|
||||||
|
|
||||||
|
\endinput
|
39
Thesis/LaTeX/glossary.tex
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
%A
|
||||||
|
\newglossaryentry{array}{name={Array},description={Eine geordnete Menge von Variablen eines Datentyps},plural={Arrays}}
|
||||||
|
|
||||||
|
%B
|
||||||
|
\newglossaryentry{blessvar}{name={blessed variable},description={Das Perl Äquivalent eines Objektes. Beim \emph{blessing} wird die Variable mit ihrer Klasse angereichert um als Objekt verwendet werden zu können},plural={blessed variables}}
|
||||||
|
|
||||||
|
%C
|
||||||
|
\newglossaryentry{cpan}{name={CPAN},description={Comprehensive Perl Archive Network, ein Netzwerk zur Verteilung von Perl-Modulen}}
|
||||||
|
|
||||||
|
%E
|
||||||
|
\newglossaryentry{eprints}{name={EPrints},description={Open-Source Plattform zur Veröffentlichung von Dokumenten,\\\url{http://www.eprints.org/software}}}
|
||||||
|
|
||||||
|
%H
|
||||||
|
\newglossaryentry{hash}{name={Hash},description={Eine Menge von Schlüssel/Wert-Paaren},plural={Hashes}}
|
||||||
|
|
||||||
|
%I
|
||||||
|
\newglossaryentry{instr}{name={Instrumentierung},description={Einfügen von \glspl{probe} in den Quelltext eines bestehenden Programmes}}
|
||||||
|
|
||||||
|
%J
|
||||||
|
\newglossaryentry{jms}{name={JMS},description={Java Message Service, ist eine Schnittstelle zur Kommunikation mit einer Nachrichtenorientierten Middleware. JMS ist Teil der Java Enterprise Edition}}
|
||||||
|
|
||||||
|
%K
|
||||||
|
\newglossaryentry{kieker}{name={Kieker},description={Software Framework zur Durchführung von Monitoringaufgaben,\\\url{http://www.kieker-monitoring.net}},see={moni}}
|
||||||
|
\newglossaryentry{kielpr}{name={Kielprints},description={Durch das GEOMAR angepasste Version von \gls{eprints}. Eingesetzt an der Universität Kiel}}
|
||||||
|
|
||||||
|
%M
|
||||||
|
\newglossaryentry{moni}{name={Monitoring},description={Überwachung des Verhalten eines Programmes während der Laufzeit}}
|
||||||
|
\newglossaryentry{probe}{name={Monitoring Probe},description={Eingefügter Messpunkt in einem Programm zur Erzeugung von \glspl{record}},plural={Monitoring Probes}}
|
||||||
|
\newglossaryentry{record}{name={Monitoring Record},description={Bei der Ausführung einer \gls{probe} erzeugter Protokoll-Eintrag einer Messung},plural={Monitoring Records}}
|
||||||
|
|
||||||
|
%P
|
||||||
|
\newglossaryentry{profil}{name={Profiling},description={Dynamisches Monitoringverfahren zum Erkennen von Funktionsverhalten in Anwendungen},see={moni}}
|
||||||
|
|
||||||
|
|
||||||
|
%R
|
||||||
|
\newglossaryentry{recursion}{name={Rekursion},description={siehe \gls{recursion}}}
|
||||||
|
|
||||||
|
%S
|
||||||
|
\newglossaryentry{skalar}{name={Skalar},description={Eine Variable, die einen einzelnen Wert, z.B. eine Zahl oder einen String, speichert}}
|
939
Thesis/LaTeX/ifiseries.sty
Normal file
|
@ -0,0 +1,939 @@
|
||||||
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
|
\ProvidesPackage{ifiseries}
|
||||||
|
\RequirePackage{kvoptions}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Options and their defaults
|
||||||
|
|
||||||
|
\DeclareBoolOption[false]{legacytexlive} % for the ancient TeX Live shipped with Ubuntu
|
||||||
|
\DeclareBoolOption[false]{natbib}
|
||||||
|
\DeclareBoolOption[false]{babelbib}
|
||||||
|
\DeclareBoolOption[true]{biblatex}
|
||||||
|
\DeclareStringOption[sort,numbers]{natbibOptions}
|
||||||
|
\DeclareStringOption[alphabetic]{biblatexstyle}
|
||||||
|
\DeclareStringOption[maxcitenames=4,maxbibnames=10,babel=other]{biblatexOptions}
|
||||||
|
\DeclareStringOption[]{bibresource}
|
||||||
|
\DeclareStringOption[ngerman,english]{babelOptions}
|
||||||
|
\DeclareStringOption[]{variorefOptions}
|
||||||
|
\DeclareStringOption[linesnumbered,ruled,vlined]{algorithmOptions}
|
||||||
|
\DeclareStringOption[alphaurl]{bibliographystyle} % only for bibtex, not biblatex
|
||||||
|
\DeclareStringOption[utf8]{inputencOptions}
|
||||||
|
\DeclareBoolOption[true]{tikz}
|
||||||
|
\DeclareBoolOption[true]{algorithmForwardCompatibility}
|
||||||
|
\DeclareBoolOption[true]{algorithmBackwardCompatibility}
|
||||||
|
\DeclareStringOption[smaller,nohyperlinks,printonlyused]{acronymOptions}
|
||||||
|
\DeclareStringOption[caption=false,font=footnotesize]{subfigOptions}
|
||||||
|
\DeclareStringOption[]{theorems}
|
||||||
|
\DeclareStringOption[Bibliography]{refname}
|
||||||
|
\DeclareStringOption[black]{hypercolor}
|
||||||
|
\DeclareBoolOption[false]{dottednumbers}
|
||||||
|
\DeclareStringOption[english]{language}
|
||||||
|
\DeclareBoolOption[true]{runningtitle}
|
||||||
|
|
||||||
|
\DeclareBoolOption[true]{layout}
|
||||||
|
\DeclareBoolOption[true]{pagelayout}
|
||||||
|
\DeclareStringOption[ustrade]{paper}
|
||||||
|
\DeclareStringOption[]{paperwidth}
|
||||||
|
\DeclareStringOption[]{paperheight}
|
||||||
|
\DeclareStringOption[0mm]{bindingoffset}
|
||||||
|
\DeclareStringOption[.25]{halfparskipfill}
|
||||||
|
\DeclareBoolOption[false]{halfparskip}
|
||||||
|
\DeclareStringOption[Palatino]{font}
|
||||||
|
\DeclareStringOption[12]{marginfrac}
|
||||||
|
\DeclareStringOption[floatrow]{figure}
|
||||||
|
\DeclareStringOption[]{compact}
|
||||||
|
\DeclareStringOption[1.5]{headsepmult}
|
||||||
|
\DeclareStringOption[3]{footskipmult}
|
||||||
|
\DeclareBoolOption[false]{leftmarkright}
|
||||||
|
\if@twoside
|
||||||
|
\DeclareBoolOption[false]{hcenter}
|
||||||
|
\else
|
||||||
|
\DeclareBoolOption[true]{hcenter}
|
||||||
|
\fi
|
||||||
|
\@ifclassloaded{book}%
|
||||||
|
{\DeclareStringOption[section]{theoremswithin}}%
|
||||||
|
{\DeclareStringOption[subsection]{theoremswithin}}
|
||||||
|
|
||||||
|
\DeclareBoolOption[false]{largepaper}
|
||||||
|
|
||||||
|
\ProcessKeyvalOptions*
|
||||||
|
|
||||||
|
\RequirePackage{etoolbox}
|
||||||
|
\RequirePackage{xifthen}
|
||||||
|
\RequirePackage{expl3}
|
||||||
|
|
||||||
|
\ifthenelse{\boolean{ifiseries@legacytexlive}}{% FIXME why can't i use \ififiseries@legacytexlive?
|
||||||
|
\let\ifiseries@natbibtrue\@undefined%
|
||||||
|
\let\ifiseries@natbibfalse\@undefined%
|
||||||
|
\let\ififiseries@natbib\@undefined%
|
||||||
|
\let\ifiseries@biblatextrue\@undefined%
|
||||||
|
\let\ifiseries@biblatexfalse\@undefined%
|
||||||
|
\let\ififiseries@biblatex\@undefined%
|
||||||
|
\DeclareBoolOption[true]{natbib}%
|
||||||
|
\DeclareBoolOption[false]{biblatex}%
|
||||||
|
}{}
|
||||||
|
|
||||||
|
\ififiseries@largepaper
|
||||||
|
\let\ifiseries@marginfrac\@undefined%
|
||||||
|
\let\ifiseries@headsepmult\@undefined%
|
||||||
|
\let\ifiseries@footskipmult\@undefined%
|
||||||
|
\DeclareStringOption[9]{marginfrac}%
|
||||||
|
\DeclareStringOption[2]{headsepmult}%
|
||||||
|
\DeclareStringOption[3.5]{footskipmult}%
|
||||||
|
\fi
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
% TeX Live 2009 (still shipped with Ubuntu in 2012) does not provide the 'onn' version.
|
||||||
|
% So we have to use a little trick to get the argument expanded.
|
||||||
|
% This will occur frequently in this code.
|
||||||
|
\newcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{english} {\relax}
|
||||||
|
{german} {
|
||||||
|
\let\ifiseries@babelOptions\@undefined%
|
||||||
|
\let\ifiseries@variorefOptions\@undefined%
|
||||||
|
\let\ifiseries@refname\@undefined%
|
||||||
|
\let\ifiseries@dottednumberstrue\@undefined%
|
||||||
|
\let\ifiseries@dottednumbersfalse\@undefined%
|
||||||
|
\let\ififiseries@dottednumbers\@undefined%
|
||||||
|
\DeclareStringOption[english,ngerman]{babelOptions}%
|
||||||
|
\DeclareStringOption[ngerman]{variorefOptions}%
|
||||||
|
\DeclareStringOption[Bibliografie]{refname}%
|
||||||
|
\DeclareBoolOption[true]{dottednumbers}%
|
||||||
|
\ifthenelse{\boolean{ifiseries@legacytexlive}}{%
|
||||||
|
\let\ifiseries@babelbibtrue\@undefined%
|
||||||
|
\let\ifiseries@babelbibfalse\@undefined%
|
||||||
|
\let\ififiseries@babelbib\@undefined%
|
||||||
|
\let\ifiseries@bibliographystyle\@undefined%
|
||||||
|
\DeclareBoolOption[true]{babelbib}%
|
||||||
|
\DeclareStringOption[babalpha]{bibliographystyle}%
|
||||||
|
}{}
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unsupported~language:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@language}
|
||||||
|
|
||||||
|
\ProcessKeyvalOptions*
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Packages with no or minimal influence on the main layout
|
||||||
|
|
||||||
|
\RequirePackage{etex}
|
||||||
|
\RequirePackage[\ifiseries@inputencOptions]{inputenc}
|
||||||
|
\RequirePackage[T1]{fontenc}
|
||||||
|
\@ifclassloaded{beamer}{}{\RequirePackage[rgb,svgnames]{xcolor}}
|
||||||
|
\RequirePackage[\ifiseries@babelOptions]{babel}
|
||||||
|
|
||||||
|
\RequirePackage{amsmath}
|
||||||
|
\RequirePackage[matha]{mathabx}
|
||||||
|
\RequirePackage{amssymb}
|
||||||
|
\RequirePackage{amsfonts}
|
||||||
|
\RequirePackage{amstext}
|
||||||
|
\RequirePackage{mathtools}
|
||||||
|
\RequirePackage{nicefrac}
|
||||||
|
\RequirePackage{graphicx}
|
||||||
|
\RequirePackage{grffile}
|
||||||
|
\RequirePackage{eso-pic}
|
||||||
|
\RequirePackage{listings}
|
||||||
|
\RequirePackage{booktabs}
|
||||||
|
\RequirePackage{multicol}
|
||||||
|
\RequirePackage{multirow}
|
||||||
|
\RequirePackage[autolanguage]{numprint}
|
||||||
|
\RequirePackage{units}
|
||||||
|
\RequirePackage[babel=true]{csquotes}
|
||||||
|
\ififiseries@natbib\RequirePackage[\ifiseries@natbibOptions]{natbib}\fi
|
||||||
|
\ififiseries@babelbib\RequirePackage{babelbib}\fi
|
||||||
|
\ififiseries@biblatex
|
||||||
|
\RequirePackage[style=\ifiseries@biblatexstyle,\ifiseries@biblatexOptions]{biblatex}%
|
||||||
|
\ifdefempty{\ifiseries@bibresource}{}{\addbibresource{\ifiseries@bibresource}}%
|
||||||
|
\DeclareFieldFormat[article,unpublished,inproceedings]{realtitlecase}{\MakeSentenceCase*{#1}}%
|
||||||
|
%% cf. texmf-dist/tex/latex/biblatex/biblatex.def
|
||||||
|
\renewbibmacro*{title}{%
|
||||||
|
\ifboolexpr{
|
||||||
|
test {\iffieldundef{title}}
|
||||||
|
and
|
||||||
|
test {\iffieldundef{subtitle}}
|
||||||
|
}
|
||||||
|
{}
|
||||||
|
{\printtext[title]{%
|
||||||
|
\printfield[realtitlecase]{title}%
|
||||||
|
\setunit{\subtitlepunct}%
|
||||||
|
\printfield[realtitlecase]{subtitle}}%
|
||||||
|
\newunit}%
|
||||||
|
\printfield{titleaddon}}%
|
||||||
|
%%
|
||||||
|
\else
|
||||||
|
\bibliographystyle{\ifiseries@bibliographystyle}%
|
||||||
|
\RequirePackage{bibentry}%
|
||||||
|
\fi
|
||||||
|
\RequirePackage[\ifiseries@variorefOptions]{varioref}
|
||||||
|
\RequirePackage{url}
|
||||||
|
\RequirePackage{dsfont}
|
||||||
|
\RequirePackage{bbding}
|
||||||
|
\RequirePackage{pifont}
|
||||||
|
\RequirePackage{calc}
|
||||||
|
\RequirePackage{blindtext}
|
||||||
|
\RequirePackage{setspace}
|
||||||
|
\RequirePackage{relsize}
|
||||||
|
\RequirePackage[\ifiseries@algorithmOptions]{algorithm2e}
|
||||||
|
\ififiseries@algorithmForwardCompatibility
|
||||||
|
\ifthenelse{\isundefined{\DontPrintSemicolon}}{\newcommand*{\DontPrintSemicolon}{\dontprintsemicolon}}{}
|
||||||
|
\ifthenelse{\isundefined{\SetAlgoVlined}}{\newcommand*{\SetAlgoVlined}{\SetVline}}{}
|
||||||
|
\ifthenelse{\isundefined{\SetAlgoNoLine}}{\newcommand*{\SetAlgoNoLine}{\SetNoline}}{}
|
||||||
|
\fi
|
||||||
|
\ififiseries@algorithmBackwardCompatibility
|
||||||
|
\ifthenelse{\isundefined{\RestyleAlgo}}{\let\RestyleAlgo\restylealgo}
|
||||||
|
\fi
|
||||||
|
\RequirePackage[compatibility=false]{caption} % compatibility switched off for hyperref
|
||||||
|
\RequirePackage{bookmark}
|
||||||
|
\RequirePackage{hyperref}
|
||||||
|
\hypersetup{%
|
||||||
|
final=true,%
|
||||||
|
colorlinks=true,%
|
||||||
|
linkcolor=\ifiseries@hypercolor,%
|
||||||
|
citecolor=\ifiseries@hypercolor,%
|
||||||
|
urlcolor=\ifiseries@hypercolor,%
|
||||||
|
}
|
||||||
|
\RequirePackage[strict]{changepage}
|
||||||
|
\ififiseries@tikz
|
||||||
|
\RequirePackage{tikz}
|
||||||
|
\usetikzlibrary{positioning}
|
||||||
|
\usetikzlibrary{arrows}
|
||||||
|
\usetikzlibrary{shapes}
|
||||||
|
\usetikzlibrary{shadows}
|
||||||
|
\usetikzlibrary{decorations.text}
|
||||||
|
\usetikzlibrary{decorations.markings}
|
||||||
|
\usetikzlibrary{decorations.pathmorphing}
|
||||||
|
\usetikzlibrary{petri}
|
||||||
|
\usetikzlibrary{shapes.symbols}
|
||||||
|
\usetikzlibrary{shapes.arrows}
|
||||||
|
\usetikzlibrary{decorations}
|
||||||
|
\usetikzlibrary{decorations.pathreplacing}
|
||||||
|
\usetikzlibrary{decorations.shapes}
|
||||||
|
\usetikzlibrary{calc}
|
||||||
|
\usetikzlibrary{chains}
|
||||||
|
\usetikzlibrary{patterns}
|
||||||
|
\usetikzlibrary{matrix}
|
||||||
|
\usetikzlibrary{backgrounds}
|
||||||
|
\usetikzlibrary{mindmap}
|
||||||
|
\usetikzlibrary{topaths}
|
||||||
|
\usetikzlibrary{automata}
|
||||||
|
\fi
|
||||||
|
\RequirePackage{microtype}
|
||||||
|
\RequirePackage{enumitem} %%% add 'inline' option once it is supported everywhere
|
||||||
|
\newlist{compactitemize}{itemize}{3}
|
||||||
|
\setlist[compactitemize]{label=\raisebox{.1em}{\smaller\textbullet}}
|
||||||
|
\newlist{compactenumerate}{enumerate}{2}
|
||||||
|
\setlist[compactenumerate]{label=\arabic*.}
|
||||||
|
\newlist{compactdescription}{description}{3}
|
||||||
|
\RequirePackage{placeins}
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{floatrow} {\RequirePackage{floatrow}\DeclareCaptionSubType[alph]{figure}}
|
||||||
|
{subfig} {\RequirePackage[\ifiseries@subfigOptions]{subfig}\RequirePackage{sidecap}\sidecaptionvpos{figure}{t}}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~figure~system:~#1}\@ehc}}
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@figure}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
|
||||||
|
\RequirePackage[\ifiseries@acronymOptions]{acronym}
|
||||||
|
\RequirePackage{xspace}
|
||||||
|
\RequirePackage{hyphenat}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Useful commands
|
||||||
|
|
||||||
|
%% Remove margins for screen viewing.
|
||||||
|
%% This command is used by the code below if 'compact' is set.
|
||||||
|
%% It is the same as the '\nomargin' command in 'localKit'.
|
||||||
|
\newcommand*{\nomargin}{
|
||||||
|
\setlength{\oddsidemargin}{.02\textwidth-1in}
|
||||||
|
\setlength{\evensidemargin}{.02\textwidth-1in}
|
||||||
|
\setlength{\paperwidth}{1.04\textwidth}
|
||||||
|
\setlength{\paperheight}{\headheight+\headsep+\textheight+\footskip}
|
||||||
|
\setlength{\paperheight}{1.04\paperheight}
|
||||||
|
\setlength{\topmargin}{.02\paperheight-1in}
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Abbreviations
|
||||||
|
\newcommand*{\abbrdot}{\protect\@ifnextchar.{}{.\@\xspace}}
|
||||||
|
\newcommand*{\abbrcomma}{\protect\@ifnextchar,{}{,\xspace}}
|
||||||
|
\newcommand*{\eg}{e.\@\,g.\@\abbrcomma}
|
||||||
|
\newcommand*{\ie}{i.\@\,e.\@\abbrcomma}
|
||||||
|
\newcommand*{\cf}{cf.\@\abbrcomma}
|
||||||
|
\newcommand*{\Eg}{E.\@\,g.\@\abbrcomma}
|
||||||
|
\newcommand*{\Ie}{I.\@\,e.\@\abbrcomma}
|
||||||
|
\newcommand*{\Cf}{Cf.\@\abbrcomma}
|
||||||
|
\newcommand*{\etal}{et~al\abbrdot}
|
||||||
|
\newcommand*{\etc}{etc\abbrdot}
|
||||||
|
\newcommand*{\vs}{vs\abbrdot}
|
||||||
|
\newcommand*{\Wlg}{W.l.o.g\abbrdot}
|
||||||
|
\newcommand*{\wlg}{w.l.o.g\abbrdot}
|
||||||
|
\newcommand*{\OBdA}{O.B.d.A\abbrdot}
|
||||||
|
\newcommand*{\oBdA}{o.B.d.A\abbrdot}
|
||||||
|
\newcommand*{\wrt}{w.r.t.\@\xspace}
|
||||||
|
\newcommand*{\rv}{r.v.\@\xspace}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Theorems. If 'theorems' is empty, nothing happens here.
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{numbersfirst} {
|
||||||
|
\ififiseries@dottednumbers% FIXME how can I pass through boolean options?
|
||||||
|
\RequirePackage[within=\ifiseries@theoremswithin,likeequations,language=\ifiseries@language,dottednumbers=true]{localTheorem}%
|
||||||
|
\else%
|
||||||
|
\RequirePackage[within=\ifiseries@theoremswithin,likeequations,language=\ifiseries@language,dottednumbers=false]{localTheorem}%
|
||||||
|
\fi%
|
||||||
|
\let\@subsection\subsection%
|
||||||
|
\renewcommand*\subsection{\@ifnextchar*{\@subsection}{\@subsection*}}%
|
||||||
|
\let\@subsubsection\subsubsection%
|
||||||
|
\renewcommand*\subsubsection{\@ifnextchar*{\@subsubsection}{\@subsubsection*}}%
|
||||||
|
}
|
||||||
|
{numberslast} {
|
||||||
|
\ififiseries@dottednumbers%
|
||||||
|
\RequirePackage[numbersfirst=false,language=\ifiseries@language,dottednumbers=true]{localTheorem}%
|
||||||
|
\else%
|
||||||
|
\RequirePackage[numbersfirst=false,language=\ifiseries@language,dottednumbers=false]{localTheorem}%
|
||||||
|
\fi%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~theorem~system:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@theorems}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%% Packages and settings with influence on the main layout
|
||||||
|
|
||||||
|
\ififiseries@layout
|
||||||
|
|
||||||
|
\newcommand*{\ifiseries@titlefontfamily}{}
|
||||||
|
\newcommand*{\ifiseries@sectionfontweight}{\bfseries}
|
||||||
|
\newcommand*{\ifiseries@chapterfontweight}{\bfseries}
|
||||||
|
|
||||||
|
%% Font and linespread.
|
||||||
|
\ExplSyntaxOn
|
||||||
|
\renewcommand{\ifiseries@temp}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{Bera} {
|
||||||
|
\RequirePackage[scaled]{beraserif}%
|
||||||
|
\RequirePackage[scaled=.90]{berasans}%
|
||||||
|
\RequirePackage[scaled=.90]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Charter} { %% sometimes problem: "Too many math alphabets used in version normal."
|
||||||
|
\usepackage[bitstream-charter]{mathdesign}%
|
||||||
|
\RequirePackage[scaled]{berasans}%
|
||||||
|
\RequirePackage[scaled]{beramono}%
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{ConcreteEuler} {
|
||||||
|
\RequirePackage{lmodern}%
|
||||||
|
\RequirePackage[boldsans]{concmath}%
|
||||||
|
\RequirePackage{eulervm}%
|
||||||
|
\RequirePackage[scaled=.84]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{DejaVu} {
|
||||||
|
\RequirePackage[scaled]{DejaVuSerif}
|
||||||
|
\RequirePackage{eulervm}
|
||||||
|
\RequirePackage[scaled=.95]{beramono}
|
||||||
|
\linespread{1.10}
|
||||||
|
}
|
||||||
|
{DejaVuCondensed} {
|
||||||
|
\RequirePackage[scaled]{DejaVuSerifCondensed}
|
||||||
|
\RequirePackage{eulervm}
|
||||||
|
\RequirePackage[scaled=.95]{beramono}
|
||||||
|
\linespread{1.10}
|
||||||
|
}
|
||||||
|
{Kerkis} { %% some problems in math mode, e.g., tildas extend into symbols
|
||||||
|
\usepackage{kmath,kerkis}%
|
||||||
|
\let\openbox\@undefined%
|
||||||
|
\RequirePackage[scaled=.81]{berasans}%
|
||||||
|
\RequirePackage[scaled=.81]{beramono}%
|
||||||
|
\renewcommand*{\bfdefault}{sb}%
|
||||||
|
\linespread{1.10}%
|
||||||
|
}
|
||||||
|
{KP} {
|
||||||
|
\RequirePackage{kpfonts}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{LatinModern} {
|
||||||
|
\RequirePackage{lmodern}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
\let\@bfseries\bfseries%
|
||||||
|
\renewcommand*{\bfseries}{\sffamily\@bfseries\fontseries{sbc}\selectfont}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{NewCenturySchoolbook} {
|
||||||
|
\RequirePackage{fouriernc}%
|
||||||
|
\RequirePackage[scaled=.85]{beramono}%
|
||||||
|
\linespread{1.10}%
|
||||||
|
}
|
||||||
|
{Palatino} {
|
||||||
|
\RequirePackage[sc]{mathpazo}%
|
||||||
|
\@ifclassloaded{beamer}{%
|
||||||
|
\RequirePackage[scaled=.90]{helvet}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
}{%
|
||||||
|
\RequirePackage[scaled=.80]{berasans}%
|
||||||
|
\RequirePackage[scaled=.80]{beramono}%
|
||||||
|
}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Schola} {
|
||||||
|
\RequirePackage{fouriernc}% only for the math
|
||||||
|
\RequirePackage{tgschola}%
|
||||||
|
\RequirePackage[scaled=.88]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Times} {
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\RequirePackage{mathptmx}%
|
||||||
|
\RequirePackage[scaled=.87]{helvet}%
|
||||||
|
\RequirePackage[scaled=.82]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Termes} {
|
||||||
|
\RequirePackage{tgtermes}%
|
||||||
|
\RequirePackage[scaled=.86]{berasans}%
|
||||||
|
\RequirePackage[scaled=.86]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{TX} {
|
||||||
|
\RequirePackage{txfonts}%
|
||||||
|
\RequirePackage[scaled=.86]{berasans}%
|
||||||
|
\RequirePackage[scaled=.86]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
{Utopia} {
|
||||||
|
\RequirePackage[widespace]{fourier}%
|
||||||
|
\RequirePackage{eucal}%
|
||||||
|
\RequirePackage[scaled=.82]{berasans}%
|
||||||
|
\RequirePackage[scaled=.82]{beramono}%
|
||||||
|
\linespread{1.05}%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~font:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
\expandafter\ifiseries@temp\expandafter{\ifiseries@font}
|
||||||
|
|
||||||
|
%% \prg_case_str cannot occur inside an argument.
|
||||||
|
%% So we have to prepare several commands here to be called later
|
||||||
|
%% inside the \@ifclassloaded.
|
||||||
|
\ExplSyntaxOn
|
||||||
|
%
|
||||||
|
\newcommand{\ifiseries@temp@paper}[1]{
|
||||||
|
\prg_case_str:nnn{#1} {
|
||||||
|
{} {\relax}
|
||||||
|
{ustrade} {\geometry{paperwidth=15.24cm, paperheight=22.86cm}}
|
||||||
|
{15522} {\geometry{paperwidth=15.50cm, paperheight=22.00cm}}
|
||||||
|
{royal} {\geometry{paperwidth=15.57cm, paperheight=23.39cm}}
|
||||||
|
{crownquarto} {\geometry{paperwidth=18.91cm, paperheight=24.589cm}}
|
||||||
|
}{\geometry{paper=\ifiseries@paper}}}
|
||||||
|
%
|
||||||
|
\newcommand{\ifiseries@temp@compact}[1]{
|
||||||
|
\prg_case_str:nnn{#1}{
|
||||||
|
{} {\relax}
|
||||||
|
{moderate} {
|
||||||
|
\setlength{\headsep}{.5\baselineskip}%
|
||||||
|
\setlength{\footskip}{\baselineskip}%
|
||||||
|
\nomargin%
|
||||||
|
}
|
||||||
|
{strong} {
|
||||||
|
%% This does the same as the '\ebook' command in 'localKit'.
|
||||||
|
\fancyhf{}%
|
||||||
|
\fancyfoot[R]{\thepage}%
|
||||||
|
\fancypagestyle{plain}{\fancyhf{}\fancyfoot[R]{\thepage}}%
|
||||||
|
\setlength{\headsep}{0pt}%
|
||||||
|
\setlength{\headheight}{0pt}%
|
||||||
|
%\setlength{\topskip}{0pt}% affects height of textblock in ways difficult to determine!
|
||||||
|
\setlength{\footskip}{1.5\baselineskip}%
|
||||||
|
\setlength{\oddsidemargin}{.02\textwidth-1in}%
|
||||||
|
\setlength{\evensidemargin}{.02\textwidth-1in}%
|
||||||
|
\setlength{\paperwidth}{1.04\textwidth}%
|
||||||
|
\setlength{\paperheight}{\textheight+\footskip}%
|
||||||
|
\setlength{\topmargin}{.005\paperheight-1in}% CHANGE
|
||||||
|
\setlength{\paperheight}{1.02\paperheight}%
|
||||||
|
}
|
||||||
|
}{\PackageError{ifiseries}{Unknown~compact~system:~#1}\@ehc}}
|
||||||
|
\ExplSyntaxOff
|
||||||
|
%% End of preparations.
|
||||||
|
|
||||||
|
\@ifclassloaded{beamer}{}{%
|
||||||
|
%% Page layout.
|
||||||
|
\ififiseries@pagelayout
|
||||||
|
\RequirePackage{geometry}
|
||||||
|
\expandafter\ifiseries@temp@paper\expandafter{\ifiseries@paper}
|
||||||
|
\ifdefempty{\ifiseries@paperheight}{}{\ifdefempty{\ifiseries@paperwidth}{}%
|
||||||
|
{\geometry{paperwidth=\ifiseries@paperwidth,paperheight=\ifiseries@paperheight}}}
|
||||||
|
%
|
||||||
|
\ifthenelse
|
||||||
|
{\equal{\@ptsize}{1}}
|
||||||
|
{\setlength{\headheight}{13.59999pt}}
|
||||||
|
{}
|
||||||
|
%
|
||||||
|
\ififiseries@hcenter
|
||||||
|
\geometry{%
|
||||||
|
bindingoffset=\ifiseries@bindingoffset, %
|
||||||
|
heightrounded, %
|
||||||
|
headsep=\ifiseries@headsepmult\baselineskip, %
|
||||||
|
footskip=\ifiseries@footskipmult\baselineskip, %
|
||||||
|
left=3\paperwidth/(2*\ifiseries@marginfrac), hmarginratio=1:1, %
|
||||||
|
includehead, top=\paperheight/\ifiseries@marginfrac, vmarginratio=1:2}
|
||||||
|
\else
|
||||||
|
\geometry{%
|
||||||
|
bindingoffset=\ifiseries@bindingoffset, %
|
||||||
|
heightrounded, %
|
||||||
|
headsep=\ifiseries@headsepmult\baselineskip, %
|
||||||
|
footskip=\ifiseries@footskipmult\baselineskip, %
|
||||||
|
left=\paperwidth/\ifiseries@marginfrac, hmarginratio=1:2, %
|
||||||
|
includehead, top=\paperheight/\ifiseries@marginfrac, vmarginratio=1:2}
|
||||||
|
\fi
|
||||||
|
\fi % pagelayout
|
||||||
|
|
||||||
|
%% Folios and running titles (and others, see below).
|
||||||
|
\ififiseries@leftmarkright\let\rightmark\leftmark\fi
|
||||||
|
\RequirePackage{fancyhdr}
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\fancyhf{}
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\let\@frontmatter\frontmatter
|
||||||
|
\renewcommand*{\frontmatter}{\@frontmatter\renewcommand*{\chaptermark}[1]{\markboth{##1}{##1}}}
|
||||||
|
\let\@mainmatter\mainmatter
|
||||||
|
\renewcommand*{\mainmatter}{\@mainmatter\renewcommand*{\chaptermark}[1]{\markboth{\thechapter. \ ##1}{}}}
|
||||||
|
\let\@backmatter\backmatter
|
||||||
|
\renewcommand*{\backmatter}{\@backmatter\bookmarksetup{startatroot}}
|
||||||
|
\let\@appendix\appendix
|
||||||
|
\renewcommand*{\appendix}{\bookmarksetup{startatroot}\@appendix}
|
||||||
|
\fancyhead[LE]{\nouppercase{\leftmark}}
|
||||||
|
}{ %%% else ifclassloaded book
|
||||||
|
\ififiseries@runningtitle\fancyhead[LE]{\nouppercase{\rightmark}}\fi
|
||||||
|
} %%% end ifclassloaded book
|
||||||
|
\ififiseries@runningtitle\fancyhead[RO]{\nouppercase{\rightmark}}\fi
|
||||||
|
\fancyfoot[RO]{\thepage}
|
||||||
|
\fancyfoot[LE]{\thepage}
|
||||||
|
\renewcommand*{\headrulewidth}{0pt}
|
||||||
|
\fancypagestyle{plain}{\fancyhf{}\fancyfoot[LE]{\thepage}\fancyfoot[RO]{\thepage}}
|
||||||
|
|
||||||
|
%% Compact system: reduce margins.
|
||||||
|
\expandafter\ifiseries@temp@compact\expandafter{\ifiseries@compact}
|
||||||
|
|
||||||
|
%% Empty clearpages (i.e., pages left blank before a chapter start).
|
||||||
|
\renewcommand*{\cleardoublepage}{%
|
||||||
|
\clearpage
|
||||||
|
\if@twoside
|
||||||
|
\ifodd
|
||||||
|
\c@page
|
||||||
|
\else
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\hbox{}
|
||||||
|
\newpage
|
||||||
|
\if@twocolumn
|
||||||
|
\hbox{}
|
||||||
|
\newpage
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Section headings.
|
||||||
|
\RequirePackage{sectsty}
|
||||||
|
\sectionfont{\normalfont\Large\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\subsectionfont{\normalfont\large\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\subsubsectionfont{\normalfont\normalsize\ifiseries@sectionfontweight\ifiseries@titlefontfamily}
|
||||||
|
\ififiseries@dottednumbers
|
||||||
|
\def\@seccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\def\@subseccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\def\@subsubseccntformat#1{\csname the#1\endcsname.\quad}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Part title page (package 'sectsty' must be loaded first).
|
||||||
|
\newenvironment{centerpage}%
|
||||||
|
{\begin{adjustwidth*}%
|
||||||
|
{(\paperwidth-\textwidth)/2-1in-\oddsidemargin+\ifiseries@bindingoffset}%
|
||||||
|
{(\paperwidth-\textwidth)/2-1in-\evensidemargin}%
|
||||||
|
\centering}%
|
||||||
|
{\end{adjustwidth*}}
|
||||||
|
\newcommand*{\typesetpart}[1]{{%
|
||||||
|
\begin{centerpage}
|
||||||
|
\null
|
||||||
|
\vspace{.20\textheight}
|
||||||
|
\interlinepenalty \@M
|
||||||
|
\normalfont
|
||||||
|
\ifnum \c@secnumdepth >-2\relax
|
||||||
|
\LARGE\sc\bfseries\ifiseries@titlefontfamily \partname\nobreakspace\thepart
|
||||||
|
\par\normalsize\normalfont
|
||||||
|
\vskip 20\p@
|
||||||
|
\fi
|
||||||
|
\Huge \bfseries \ifiseries@titlefontfamily #1\par
|
||||||
|
\end{centerpage}
|
||||||
|
}}
|
||||||
|
\renewcommand*{\part}{%
|
||||||
|
\if@openright
|
||||||
|
\FloatBarrier
|
||||||
|
\newpage\thispagestyle{empty}\hbox{}
|
||||||
|
\cleardoublepage
|
||||||
|
\else
|
||||||
|
\clearpage
|
||||||
|
\fi
|
||||||
|
\thispagestyle{empty}%
|
||||||
|
\if@twocolumn
|
||||||
|
\onecolumn
|
||||||
|
\@tempswatrue
|
||||||
|
\else
|
||||||
|
\@tempswafalse
|
||||||
|
\fi
|
||||||
|
\secdef\@part\@spart%
|
||||||
|
}
|
||||||
|
\renewcommand*{\@part}[2][]{%
|
||||||
|
\ifnum \c@secnumdepth >-2\relax
|
||||||
|
\refstepcounter{part}%
|
||||||
|
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
|
||||||
|
\else
|
||||||
|
\addcontentsline{toc}{part}{#1}%
|
||||||
|
\fi
|
||||||
|
\markboth{}{}%
|
||||||
|
\typesetpart{#2}%
|
||||||
|
\@endpart%
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Chapter titles
|
||||||
|
%% cf. texlive/2011/texmf-dist/tex/latex/base/book.cls
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\renewcommand*{\@makechapterhead}[1]{%
|
||||||
|
%\vspace*{20\p@}%
|
||||||
|
{\parindent \z@ \flushright \normalfont
|
||||||
|
\ifnum \c@secnumdepth >\m@ne
|
||||||
|
\if@mainmatter
|
||||||
|
\large\sc\ifiseries@chapterfontweight\ifiseries@titlefontfamily \@chapapp\space \thechapter
|
||||||
|
\par\normalsize\normalfont\nobreak
|
||||||
|
\vskip 20\p@
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
\interlinepenalty\@M
|
||||||
|
\huge \ifiseries@chapterfontweight \ifiseries@titlefontfamily #1\par\nobreak
|
||||||
|
\vskip 50\p@
|
||||||
|
}}
|
||||||
|
\renewcommand*{\@makeschapterhead}[1]{%
|
||||||
|
%\vspace*{50\p@}%
|
||||||
|
{\parindent \z@ \flushright
|
||||||
|
\normalfont
|
||||||
|
\interlinepenalty\@M
|
||||||
|
{\huge\bfseries #1\par\nobreak}
|
||||||
|
\vskip 50\p@
|
||||||
|
}}
|
||||||
|
}{} %%% end ifclassloaded book
|
||||||
|
} %%% end ifclassloaded not beamer
|
||||||
|
|
||||||
|
%% Bibliography.
|
||||||
|
\@ifclassloaded{book}{%
|
||||||
|
\newcommand*{\preparebibliography}{%
|
||||||
|
\renewcommand*{\refname}{\ifiseries@refname}%
|
||||||
|
\cleardoublepage
|
||||||
|
\phantomsection
|
||||||
|
\addcontentsline{toc}{chapter}{\refname}
|
||||||
|
}%
|
||||||
|
\newcommand*{\tocbibliography}{%
|
||||||
|
\preparebibliography%
|
||||||
|
\ififiseries@biblatex\printbibliography\else\bibliography{\ifiseries@bibresource}\fi}}{%
|
||||||
|
\newcommand*{\preparebibliography}{%
|
||||||
|
\renewcommand*{\refname}{\ifiseries@refname}%
|
||||||
|
\phantomsection
|
||||||
|
\addcontentsline{toc}{section}{\refname}
|
||||||
|
}%
|
||||||
|
\newcommand*{\tocbibliography}{%
|
||||||
|
\preparebibliography%
|
||||||
|
\ififiseries@biblatex\printbibliography\else\bibliography{\ifiseries@bibresource}\fi}}
|
||||||
|
|
||||||
|
%% For multiple authors.
|
||||||
|
\newcommand*{\andauthor}{\\[.5\baselineskip]}
|
||||||
|
|
||||||
|
%% Command to create generic cover pages.
|
||||||
|
\ifthenelse{\equal{\ifiseries@compact}{}}{\newcommand*{\ifiseries@titlepagetopskip}{}}%
|
||||||
|
{\newcommand*{\ifiseries@titlepagetopskip}{\vspace*{5ex}}}
|
||||||
|
\newcommand{\gentitlepage}[4]{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\begin{centerpage}
|
||||||
|
\ifiseries@titlepagetopskip%
|
||||||
|
\Huge #1\\
|
||||||
|
\normalsize\vspace{5ex}
|
||||||
|
\Large \ifthenelse{\equal{#2}{}}{\mbox{ }}{#2}\\
|
||||||
|
\normalsize\vspace{5ex}
|
||||||
|
\Large #3\\
|
||||||
|
\normalsize\vfill
|
||||||
|
#4
|
||||||
|
\end{centerpage}}
|
||||||
|
|
||||||
|
%% Command to create the cover page for dissertations.
|
||||||
|
\newcommand{\disstitlepage}[5]{%
|
||||||
|
\gentitlepage{#1}{#2}{#3}{%
|
||||||
|
Dissertation\\
|
||||||
|
zur Erlangung des akademischen Grades\\
|
||||||
|
%
|
||||||
|
\ifstrequal{#4}{nat}{%
|
||||||
|
Doktor der Naturwissenschaften\\%
|
||||||
|
(Dr.~rer.~nat.)\\%
|
||||||
|
}{\ifstrequal{#4}{ing}{%
|
||||||
|
Doktor der Ingenieurwissenschaften\\%
|
||||||
|
(Dr.-Ing.)\\%
|
||||||
|
}{}}%
|
||||||
|
%
|
||||||
|
der Technischen Fakult\"at\\
|
||||||
|
der Christian-Albrechts-Universit\"at zu Kiel\\
|
||||||
|
eingereicht im Jahr #5}}
|
||||||
|
|
||||||
|
%% Command to create the cover page for student's thesis.
|
||||||
|
\newcommand{\studtitlepage}[7]{%
|
||||||
|
\gentitlepage{#1}{#2}{#3}{%
|
||||||
|
#4\\
|
||||||
|
eingereicht im Jahr #5\\
|
||||||
|
\vspace{1ex}
|
||||||
|
Christian-Albrechts-Universit\"at zu Kiel\\
|
||||||
|
#6\\
|
||||||
|
\vspace{1ex}
|
||||||
|
Betreut durch: #7}}
|
||||||
|
|
||||||
|
%% Command to create the reviewer page for dissertations.
|
||||||
|
\newcommand{\dissreviewerpage}[4]{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{plain}
|
||||||
|
\vspace*{.5\textheight}
|
||||||
|
\noindent
|
||||||
|
\begin{tabular}{@{}p{.20\textwidth}@{\hspace{.05\textwidth}}p{.75\textwidth}@{}}
|
||||||
|
1.~Gutachter: & \ifthenelse{\equal{#1}{_}}{\rule{12em}{.3pt}}{#1} \\[1em]
|
||||||
|
2.~Gutachter: & \ifthenelse{\equal{#2}{_}}{\rule{12em}{.3pt}}{#2}
|
||||||
|
\ifthenelse{\equal{#3}{}}{}{\\[1em] 3.~Gutachter: & \ifthenelse{\equal{#3}{_}}{\rule{12em}{.3pt}}{#3}}
|
||||||
|
\end{tabular}
|
||||||
|
\par
|
||||||
|
\vspace*{2em}
|
||||||
|
\noindent
|
||||||
|
Datum der m\"undlichen Pr\"ufung:~\ifthenelse{\equal{#4}{_}}{\rule{12em}{.3pt}}{#4}}
|
||||||
|
|
||||||
|
%% Eidesstattliche Erklaerung
|
||||||
|
\newcommand*{\eidesstatt}{%
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{plain}
|
||||||
|
\hskip 0mm
|
||||||
|
\vfill
|
||||||
|
\noindent
|
||||||
|
\begin{otherlanguage}{ngerman}
|
||||||
|
\textbf{Eidesstattliche Erkl{\"a}rung}\par
|
||||||
|
\bigskip\noindent Hiermit erkl{\"a}re ich an Eides statt, dass
|
||||||
|
ich die vorliegende Arbeit selbst\-st{\"a}n\-dig verfasst und keine
|
||||||
|
anderen als die angegebenen Quellen und Hilfsmittel verwendet habe.\par
|
||||||
|
\bigskip\noindent Kiel,
|
||||||
|
\vskip 10mm
|
||||||
|
\hfill\rule{18em}{.3pt}%
|
||||||
|
\end{otherlanguage}}
|
||||||
|
|
||||||
|
%% Command to create a page with meta data.
|
||||||
|
\newcommand{\metapage}[7]{%
|
||||||
|
\newpage%
|
||||||
|
\thispagestyle{plain}%
|
||||||
|
\footnotesize%
|
||||||
|
\mbox{}\vfill%
|
||||||
|
\begin{itemize}[label=]%
|
||||||
|
\item Kiel Computer Science Series (KCSS) #1%
|
||||||
|
\item
|
||||||
|
ISSN 2193-6781 (print version)\\
|
||||||
|
ISSN 2194-6639 (electronic version)
|
||||||
|
\item Electronic version, updates, errata available via
|
||||||
|
\url{https://www.informatik.uni-kiel.de/kcss}
|
||||||
|
\ifthenelse{\equal{#2}{}}{}{\item The author can be contacted via #2}%
|
||||||
|
\item Published by the Department of Computer Science, Christian-Albrechts-Universit\"at zu Kiel%
|
||||||
|
\item #3%
|
||||||
|
\item Please cite as:%
|
||||||
|
\begin{itemize}%
|
||||||
|
\item #4%
|
||||||
|
\end{itemize}%
|
||||||
|
\item \lstinputlisting[%
|
||||||
|
nolol=true,frame=none,numbers=none,language={},style={},keywordsprefix={},basicstyle=\tt,%
|
||||||
|
aboveskip=\medskipamount,belowskip=\medskipamount,lineskip=0pt,boxpos=c,print=true,%
|
||||||
|
showlines=false,gobble=0,tabsize=8,showtabs=false,showspaces=false,%
|
||||||
|
linewidth=\linewidth,xleftmargin=0pt,xrightmargin=0pt,resetmargins=false,breaklines=false,%
|
||||||
|
columns={[c]fixed},flexiblecolumns=false,keepspaces=false,basewidth={0.6em,0.45em},fontadjust=false,%
|
||||||
|
mathescape=false,escapechar={},escapeinside={},%
|
||||||
|
]{#5}%
|
||||||
|
\item \textcopyright\ #6%
|
||||||
|
\ifthenelse{\equal{#7}{}}{}{\item #7}%
|
||||||
|
\end{itemize}%
|
||||||
|
\normalsize}
|
||||||
|
|
||||||
|
%% Paragraph skip instead of paragraph indentation.
|
||||||
|
\ififiseries@halfparskip
|
||||||
|
\setlength{\parskip}{.5\baselineskip plus .5\baselineskip}
|
||||||
|
\setlength{\parindent}{0em}
|
||||||
|
\setlength{\parfillskip}{\ifiseries@halfparskipfill\textwidth plus 1fil}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Enumeration environments.
|
||||||
|
%
|
||||||
|
\ififiseries@halfparskip
|
||||||
|
%
|
||||||
|
% For halfparskip, we set topsep to 0 everywhere.
|
||||||
|
% This seems to be necessary to prevent excessive whitespace.
|
||||||
|
%
|
||||||
|
\setitemize{leftmargin=*, label=$\triangleright$, topsep=0em}
|
||||||
|
\setenumerate{leftmargin=*, topsep=0em}
|
||||||
|
\setdescription{leftmargin=\parindent, style=sameline, font=\it, topsep=0em}
|
||||||
|
\setlist[compactitemize]{%
|
||||||
|
label=\raisebox{.1em}{\smaller\textbullet},%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactitemize,2,3]{%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactenumerate]{%
|
||||||
|
label=\arabic*.,%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
% FIXME: third level does not work for compactenumerate
|
||||||
|
\setlist[compactenumerate,2]{%
|
||||||
|
label=(\alph*),%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactdescription]{%
|
||||||
|
style=sameline,%
|
||||||
|
font=\it,%
|
||||||
|
leftmargin=\parindent,%
|
||||||
|
topsep=.0em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactdescription,2,3]{%
|
||||||
|
topsep=.0em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
\else
|
||||||
|
%
|
||||||
|
% Settings for non-halfparskip (the normal settings).
|
||||||
|
%
|
||||||
|
\@ifclassloaded{beamer}{\setitemize{leftmargin=*,%
|
||||||
|
label={\usebeamercolor[fg]{itemize item}%
|
||||||
|
\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleright$}}}%
|
||||||
|
\setenumerate{leftmargin=*}%
|
||||||
|
\setdescription{font={\normalfont\usebeamercolor[fg]{itemize item}}}}%
|
||||||
|
{\setitemize{leftmargin=*, label=$\triangleright$}%
|
||||||
|
\setenumerate{leftmargin=*}%
|
||||||
|
\setdescription{leftmargin=\parindent, style=sameline, font=\it}}
|
||||||
|
\setlist[compactitemize]{%
|
||||||
|
label=\raisebox{.1em}{\smaller\textbullet},%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactitemize,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactenumerate]{%
|
||||||
|
label=\arabic*.,%
|
||||||
|
leftmargin=*,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactenumerate,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
%
|
||||||
|
\setlist[compactdescription]{%
|
||||||
|
style=sameline,%
|
||||||
|
font=\it,%
|
||||||
|
leftmargin=\parindent,%
|
||||||
|
topsep=.4em plus .1em,%
|
||||||
|
parsep=.2em plus .1em,%
|
||||||
|
itemsep=.2em plus .1em,%
|
||||||
|
}
|
||||||
|
\setlist[compactdescription,2,3]{%
|
||||||
|
topsep=.1em,%
|
||||||
|
partopsep=.1em,%
|
||||||
|
parsep=.1em,%
|
||||||
|
itemsep=.1em,%
|
||||||
|
}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
%% Figures and captions.
|
||||||
|
\captionsetup{font=small,labelfont=bf,labelsep=period}
|
||||||
|
\ifdefstring{\ifiseries@figure}{floatrow}{%
|
||||||
|
\captionsetup[subfigure]{labelformat=parens,labelsep=space}%
|
||||||
|
\floatsetup[table]{style=plaintop}%
|
||||||
|
\floatsetup[figure]{capbesideposition={center,inside},facing=yes}}{}
|
||||||
|
% Alter some defaults for better treatment of figures.
|
||||||
|
% Taken from http://mintaka.sdsu.edu/GF/bibliog/latex/floats.html
|
||||||
|
% See also p.105 of "TeX Unbound" for suggested values.
|
||||||
|
% General parameters, for ALL pages:
|
||||||
|
\renewcommand*{\topfraction}{0.9} % max fraction of floats at top
|
||||||
|
\renewcommand*{\bottomfraction}{0.8} % max fraction of floats at bottom
|
||||||
|
% Parameters for TEXT pages (not float pages):
|
||||||
|
\setcounter{topnumber}{2}
|
||||||
|
\setcounter{bottomnumber}{2}
|
||||||
|
\setcounter{totalnumber}{4} % 2 may work better
|
||||||
|
\setcounter{dbltopnumber}{2} % for 2-column pages
|
||||||
|
\renewcommand*{\dbltopfraction}{0.9} % fit big float above 2-col. text
|
||||||
|
\renewcommand*{\textfraction}{0.07} % allow minimal text w. figs
|
||||||
|
% Parameters for FLOAT pages (not text pages):
|
||||||
|
\renewcommand*{\floatpagefraction}{0.7} % require fuller float pages
|
||||||
|
% N.B.: floatpagefraction MUST be less than topfraction
|
||||||
|
\renewcommand*{\dblfloatpagefraction}{0.7} % require fuller float pages
|
||||||
|
|
||||||
|
%% Hyperref's \autoref feature.
|
||||||
|
\@ifclassloaded{beamer}{}{%
|
||||||
|
\providecommand{\subfigureautorefname}{\figureautorefname}
|
||||||
|
% \extrasenglish seem to be invoked twice, so need \renew.. there, hence all \...refname must be defined
|
||||||
|
\ifthenelse{\isundefined{\algorithmautorefname}}{\newcommand*{\algorithmautorefname}{Algorithm}}{}
|
||||||
|
\addto\extrasenglish{
|
||||||
|
\renewcommand*{\chapterautorefname}{Chapter}
|
||||||
|
\renewcommand*{\sectionautorefname}{Section}
|
||||||
|
\renewcommand*{\subsectionautorefname}{Section}
|
||||||
|
\renewcommand*{\algorithmautorefname}{Algorithm}}
|
||||||
|
} %%% end ifclassloaded not beamer
|
||||||
|
|
||||||
|
%% Configure listings package.
|
||||||
|
\lstset{basicstyle=\tt}
|
||||||
|
|
||||||
|
%% Configure the url package, and adjust \href command.
|
||||||
|
\ifthenelse{\isundefined{\DeclareUrlCommand}}{\renewcommand*{\path}[1]{\url{#1}}}{\DeclareUrlCommand\path{}} %%% workaround
|
||||||
|
\renewcommand*{\UrlFont}{\smaller\tt}
|
||||||
|
\let\@href\href
|
||||||
|
\renewcommand*{\href}[3][]{\@href[#1]{#2}{\UrlFont #3}}
|
||||||
|
|
||||||
|
%% Display settings.
|
||||||
|
\allowdisplaybreaks
|
||||||
|
\AtBeginDocument{
|
||||||
|
\setlength{\abovedisplayshortskip}{-.5\baselineskip plus .5\baselineskip}
|
||||||
|
\setlength{\abovedisplayskip}{\medskipamount}
|
||||||
|
\setlength{\belowdisplayshortskip}{\medskipamount}
|
||||||
|
\setlength{\belowdisplayskip}{\medskipamount}
|
||||||
|
}
|
||||||
|
|
||||||
|
\fi % ifiseries@layout
|
BIN
Thesis/LaTeX/images/Classdiagram-Kieker.Perl.pdf
Normal file
1040
Thesis/LaTeX/images/Classdiagram-Kieker.Perl.svg
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
Thesis/LaTeX/images/Condensed-Dependency-Graph.pdf
Normal file
2524
Thesis/LaTeX/images/Condensed-Dependency-Graph.svg
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
Thesis/LaTeX/images/Dependency-Graph-EPrints.pdf
Normal file
3530
Thesis/LaTeX/images/Dependency-Graph-EPrints.svg
Normal file
After Width: | Height: | Size: 234 KiB |
BIN
Thesis/LaTeX/images/Deployment-Diagram-Client-Server-Model.pdf
Normal file
1158
Thesis/LaTeX/images/Deployment-Diagram-Client-Server-Model.svg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
Thesis/LaTeX/images/Kielprints-Deployment.pdf
Normal file
659
Thesis/LaTeX/images/Kielprints-Deployment.svg
Normal file
|
@ -0,0 +1,659 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
color-rendering="auto"
|
||||||
|
color-interpolation="auto"
|
||||||
|
text-rendering="auto"
|
||||||
|
width="380.66824"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
shape-rendering="auto"
|
||||||
|
font-weight="normal"
|
||||||
|
height="197.10254"
|
||||||
|
font-style="normal"
|
||||||
|
font-size="12"
|
||||||
|
image-rendering="auto"
|
||||||
|
id="svg3225"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.3.1 r9886"
|
||||||
|
sodipodi:docname="Kielprints-Deployment.svg"
|
||||||
|
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0;font-family:Dialog"
|
||||||
|
inkscape:export-filename="/home/enbewe/git/nbw/Thesis/LaTeX/images/deployment.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90">
|
||||||
|
<metadata
|
||||||
|
id="metadata3463">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1213"
|
||||||
|
inkscape:window-height="788"
|
||||||
|
id="namedview3461"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0662651"
|
||||||
|
inkscape:cx="202.65369"
|
||||||
|
inkscape:cy="97.416534"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg3225"
|
||||||
|
units="mm"
|
||||||
|
fit-margin-left="1"
|
||||||
|
fit-margin-top="1"
|
||||||
|
fit-margin-bottom="1"
|
||||||
|
fit-margin-right="1" />
|
||||||
|
<!--Generated by the Batik Graphics2D SVG Generator-->
|
||||||
|
<defs
|
||||||
|
id="genericDefs">
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<clipPath
|
||||||
|
id="clipPath1"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3232"
|
||||||
|
d="m -7,-7 358,0 0,208 -358,0 0,-208 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath2"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3235"
|
||||||
|
d="M 0,0 332,0 332,19 0,19 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath3"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3238"
|
||||||
|
d="m 0,0 0,163 331,0 0,-163 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath4"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3241"
|
||||||
|
d="m -7,-7 138,0 0,58 -138,0 0,-58 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath5"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3244"
|
||||||
|
d="M 0,0 96,0 96,40 0,40 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath6"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3247"
|
||||||
|
d="m -7,-7 38,0 0,38 -38,0 0,-38 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath7"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3250"
|
||||||
|
d="m -7,-7 30,0 0,30 -30,0 0,-30 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath8"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3253"
|
||||||
|
d="m -49,-15 147,0 0,45 -147,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath9"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3256"
|
||||||
|
d="m -63,-15 189,0 0,45 -189,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath10"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3259"
|
||||||
|
d="m -43,-15 129,0 0,45 -129,0 0,-45 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath11"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3262"
|
||||||
|
d="M 0,0 124,0 124,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath12"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3265"
|
||||||
|
d="M 0,0 125,0 125,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath13"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3268"
|
||||||
|
d="M 100,0 100,125 -4,125 -4,0 100,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath14"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3271"
|
||||||
|
d="M 0,0 104,0 104,114 0,114 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath15"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3274"
|
||||||
|
d="M 0,0 104,0 104,125 0,125 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath16"
|
||||||
|
clipPathUnits="userSpaceOnUse">
|
||||||
|
<path
|
||||||
|
id="path3277"
|
||||||
|
d="M 0,0 126,0 126,104 0,104 0,0 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="g7872">
|
||||||
|
<polygon
|
||||||
|
transform="translate(4.0433847,4.0592348)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#6699cc;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="polygon3285"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
points="331,8 0,8 8,0 339,0 " />
|
||||||
|
<polygon
|
||||||
|
transform="translate(4.0433847,4.0592348)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#6699cc;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="polygon3287"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
points="331,189 331,8 339,0 339,181 " />
|
||||||
|
<rect
|
||||||
|
transform="translate(4.0433847,4.0592348)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#6699cc;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3289"
|
||||||
|
clip-path="url(#clipPath1)"
|
||||||
|
y="8"
|
||||||
|
height="181"
|
||||||
|
width="331"
|
||||||
|
x="0" />
|
||||||
|
<text
|
||||||
|
transform="translate(4.0433847,12.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3293"
|
||||||
|
clip-path="url(#clipPath2)"
|
||||||
|
y="16"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="131">SunFire 4250</text>
|
||||||
|
<rect
|
||||||
|
transform="translate(14.043385,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="rect3297"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
<rect
|
||||||
|
transform="translate(14.043385,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3301"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<path
|
||||||
|
d="m 104,18 0,3 m -3,-7 7,0 0,4 -7,0 z m 3,-2 0,2 m -3,-6 7,0 0,4 -7,0 z m 3,-3 0,3 m 0,13 10,0 m 0,-16 0,16 M 104,5 114,5"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
transform="translate(14.043385,134.05924)"
|
||||||
|
id="line3317"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<text
|
||||||
|
transform="translate(14.043385,134.05924)"
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3321"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
transform="translate(14.043385,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3323"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="16">PostgreSQL</text>
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="rect3327"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3331"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3333"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="5"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3335"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="114"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3337"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="21"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3339"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="8"
|
||||||
|
y1="5"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3341"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="8"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3343"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="14"
|
||||||
|
y1="12"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3345"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="14"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3347"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="18"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<text
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3351"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
transform="translate(194.04338,44.059235)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3353"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="28">Apache</text>
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="rect3357"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="40"
|
||||||
|
width="120"
|
||||||
|
x="0" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3361"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="0"
|
||||||
|
height="39"
|
||||||
|
width="119"
|
||||||
|
x="0" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3363"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="5"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3365"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="5"
|
||||||
|
x2="114"
|
||||||
|
x1="114"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3367"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="21"
|
||||||
|
x2="114"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3369"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="8"
|
||||||
|
y1="5"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3371"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="8"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3373"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="14"
|
||||||
|
y1="12"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<rect
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3375"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
height="4"
|
||||||
|
width="7"
|
||||||
|
clip-path="url(#clipPath4)"
|
||||||
|
y="14"
|
||||||
|
x="101" />
|
||||||
|
<line
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3377"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
y2="21"
|
||||||
|
y1="18"
|
||||||
|
x2="104"
|
||||||
|
x1="104"
|
||||||
|
clip-path="url(#clipPath4)" />
|
||||||
|
<text
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3381"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
y="15"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7"><<component>></text>
|
||||||
|
<text
|
||||||
|
transform="translate(194.04338,134.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3383"
|
||||||
|
clip-path="url(#clipPath5)"
|
||||||
|
font-weight="bold"
|
||||||
|
y="30"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="28">EPrints</text>
|
||||||
|
<circle
|
||||||
|
transform="translate(154.04338,144.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3387"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
<circle
|
||||||
|
transform="translate(154.04338,144.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3391"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
<circle
|
||||||
|
transform="translate(244.04338,94.059239)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#6699cc;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3395"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
<circle
|
||||||
|
transform="translate(244.04338,94.059239)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
sodipodi:ry="9.5"
|
||||||
|
sodipodi:rx="9.5"
|
||||||
|
sodipodi:cy="9.5"
|
||||||
|
sodipodi:cx="9.5"
|
||||||
|
d="M 19,9.5 C 19,14.746705 14.746705,19 9.5,19 4.2532949,19 0,14.746705 0,9.5 0,4.2532949 4.2532949,0 9.5,0 14.746705,0 19,4.2532949 19,9.5 z"
|
||||||
|
id="circle3399"
|
||||||
|
cy="9.5"
|
||||||
|
cx="9.5"
|
||||||
|
clip-path="url(#clipPath6)"
|
||||||
|
r="9.5" />
|
||||||
|
<rect
|
||||||
|
transform="translate(338.04338,66.776749)"
|
||||||
|
style="font-size:11px;fill:#6699cc;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="rect3403"
|
||||||
|
clip-path="url(#clipPath7)"
|
||||||
|
y="0"
|
||||||
|
height="12"
|
||||||
|
width="12"
|
||||||
|
x="0" />
|
||||||
|
<rect
|
||||||
|
transform="translate(338.04338,66.776749)"
|
||||||
|
style="font-size:11px;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="rect3407"
|
||||||
|
clip-path="url(#clipPath7)"
|
||||||
|
y="0"
|
||||||
|
height="12"
|
||||||
|
width="12"
|
||||||
|
x="0" />
|
||||||
|
<text
|
||||||
|
transform="translate(333.04338,81.059239)"
|
||||||
|
style="font-size:11px;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3423"
|
||||||
|
clip-path="url(#clipPath8)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="12"><tspan
|
||||||
|
id="tspan7870"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans Bold">HTTP</tspan></text>
|
||||||
|
<text
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3427"
|
||||||
|
clip-path="url(#clipPath9)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9"
|
||||||
|
transform="translate(260.26372,94.403872)">mod_perl</text>
|
||||||
|
<text
|
||||||
|
transform="translate(142.04338,164.05924)"
|
||||||
|
style="font-size:11px;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;font-family:sans-serif"
|
||||||
|
id="text3431"
|
||||||
|
clip-path="url(#clipPath10)"
|
||||||
|
y="12"
|
||||||
|
xml:space="preserve"
|
||||||
|
x="10">SQL</text>
|
||||||
|
<line
|
||||||
|
transform="translate(85.043385,104.05924)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3435"
|
||||||
|
y1="50"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath11)"
|
||||||
|
x1="70"
|
||||||
|
y2="50" />
|
||||||
|
<line
|
||||||
|
transform="translate(122.04338,104.05924)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3439"
|
||||||
|
y1="50"
|
||||||
|
x2="56"
|
||||||
|
clip-path="url(#clipPath12)"
|
||||||
|
x1="71"
|
||||||
|
y2="50" />
|
||||||
|
<path
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3441"
|
||||||
|
transform="matrix(0,-1,1,0,122.04338,204.05924)"
|
||||||
|
clip-path="url(#clipPath13)"
|
||||||
|
d="m 37,42.8571 a 13,13 0 0 0 26,0" />
|
||||||
|
<line
|
||||||
|
transform="translate(204.04338,35.059235)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3445"
|
||||||
|
y1="60"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath14)"
|
||||||
|
x1="50"
|
||||||
|
y2="50" />
|
||||||
|
<line
|
||||||
|
transform="translate(204.04338,62.059235)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3449"
|
||||||
|
y1="71"
|
||||||
|
x2="50"
|
||||||
|
clip-path="url(#clipPath15)"
|
||||||
|
x1="50"
|
||||||
|
y2="56" />
|
||||||
|
<path
|
||||||
|
transform="translate(204.04338,62.059235)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3451"
|
||||||
|
clip-path="url(#clipPath15)"
|
||||||
|
d="m 37,42.8571 a 13,13 0 0 0 26,0" />
|
||||||
|
<line
|
||||||
|
transform="translate(265.04338,22.059235)"
|
||||||
|
style="font-size:11px;fill:none;stroke:#000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;font-family:sans-serif"
|
||||||
|
id="line3455"
|
||||||
|
y1="50"
|
||||||
|
x2="72"
|
||||||
|
clip-path="url(#clipPath16)"
|
||||||
|
x1="50"
|
||||||
|
y2="50" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 24 KiB |
BIN
Thesis/LaTeX/images/Screenshot-Trace1.png
Normal file
After Width: | Height: | Size: 442 KiB |
BIN
Thesis/LaTeX/images/Screenshot-Trace2.png
Normal file
After Width: | Height: | Size: 341 KiB |
BIN
Thesis/LaTeX/images/Screenshot-Trace3.png
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
Thesis/LaTeX/images/Screenshot-Trace4.png
Normal file
After Width: | Height: | Size: 250 KiB |
BIN
Thesis/LaTeX/images/Screenshot-Trace5.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Thesis/LaTeX/images/kieker-data-bridge.pdf
Normal file
1148
Thesis/LaTeX/images/kieker-data-bridge.svg
Normal file
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 158 KiB |
10
Thesis/LaTeX/run.sh
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
pdflatex thesis.tex
|
||||||
|
pdflatex thesis.tex
|
||||||
|
bibtex thesis.aux
|
||||||
|
makeglossaries thesis
|
||||||
|
pdflatex thesis.tex
|
||||||
|
makeglossaries thesis
|
||||||
|
pdflatex thesis.tex
|
||||||
|
pdflatex thesis.tex
|
||||||
|
|
11
Thesis/LaTeX/thesis-blx.bib
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
@Comment{$ biblatex control file $}
|
||||||
|
@Comment{$ biblatex version 1.7 $}
|
||||||
|
Do not modify this file!
|
||||||
|
|
||||||
|
This is an auxiliary file used by the 'biblatex' package.
|
||||||
|
This file may safely be deleted. It will be recreated as
|
||||||
|
required.
|
||||||
|
|
||||||
|
@Control{biblatex-control,
|
||||||
|
options = {1.7:0:0:0:0:1:1:1:0:0:1:0:12:1:2:1:79:+},
|
||||||
|
}
|
68
Thesis/LaTeX/thesis.tex
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
\input{docstyleDE}% or \input{docstyleDE}
|
||||||
|
|
||||||
|
% Einrichtung von Epigraphs
|
||||||
|
\usepackage{epigraph}
|
||||||
|
\setlength{\epigraphwidth}{.4\textwidth}
|
||||||
|
\setlength{\epigraphrule}{0pt}
|
||||||
|
|
||||||
|
% Listingssetup
|
||||||
|
\lstset{ captionpos=b }
|
||||||
|
|
||||||
|
% Einrichtung von Paket Glossaries
|
||||||
|
\usepackage[ngerman]{translator}
|
||||||
|
\usepackage[xindy,toc,style=altlistgroup]{glossaries}
|
||||||
|
\input{glossary} % Glossardaten ausgelagert
|
||||||
|
\makeglossaries
|
||||||
|
|
||||||
|
% PDF Metadaten
|
||||||
|
\hypersetup{pdftitle=Monitoring von Perl-basierten Webanwendungen mittels Kieker}
|
||||||
|
\hypersetup{pdfauthor=Nis Börge Wechselberg}
|
||||||
|
\hypersetup{pdfsubject=Bachelorarbeit}
|
||||||
|
\hypersetup{pdfkeywords=}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\frontmatter
|
||||||
|
\thesistitlepage
|
||||||
|
{Monitoring von Perl-basierten\\[.1em] % Title
|
||||||
|
Webanwendungen mittels Kieker}
|
||||||
|
{Bachelorarbeit} % Thesistype
|
||||||
|
{Nis Börge Wechselberg} % Name
|
||||||
|
{\today} % Date
|
||||||
|
{Dipl.-Inf. Peer Brauer}
|
||||||
|
|
||||||
|
\eidesstatt{}
|
||||||
|
|
||||||
|
\chapter*{Abstract}
|
||||||
|
\input{abstract}
|
||||||
|
|
||||||
|
\tableofcontents{}
|
||||||
|
%\listoffigures{}\listoftables{}\lstlistoflistings{}
|
||||||
|
%\chapter*{List of Acronyms}
|
||||||
|
%% List of acronyms
|
||||||
|
|
||||||
|
\mainmatter
|
||||||
|
\chapter{Einleitung}\label{cha:einleitung}
|
||||||
|
\input{chapter1}
|
||||||
|
\chapter{Grundlagen und Technologien}\label{cha:grundlagen}
|
||||||
|
\input{chapter2}
|
||||||
|
\chapter{Umsetzung der Perl-Module}\label{cha:perl}
|
||||||
|
\input{chapter3}
|
||||||
|
\chapter{Instrumentierung}\label{cha:instrumentierung}
|
||||||
|
\input{chapter4}
|
||||||
|
\chapter{Testdurchführung}\label{cha:tests}
|
||||||
|
\input{chapter5}
|
||||||
|
\chapter{Ergebnisse}\label{cha:testsErgebnisse}
|
||||||
|
\input{chapter6}
|
||||||
|
\chapter{Zusammenfassung und Ausblick}\label{cha:abschluss}
|
||||||
|
\input{chapter7}
|
||||||
|
|
||||||
|
\appendix
|
||||||
|
\input{appendix}
|
||||||
|
|
||||||
|
% Abschluss
|
||||||
|
\backmatter
|
||||||
|
\printglossaries
|
||||||
|
\tocbibliography
|
||||||
|
|
||||||
|
\end{document}
|
BIN
Thesis/Thesis.vpp
Normal file
110
Umsetzung/Perl/Kieker.htm
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker - wraps Kieker Monitoring functions</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_object___kieker__new__">$object = Kieker-><code>new()</code></a></li>
|
||||||
|
<li><a href="#_object__entryevent__functionname___packagename__">$object->EntryEvent($functionName, $packageName);</a></li>
|
||||||
|
<li><a href="#_object__exitevent__functionname___packagename__">$object->ExitEvent($functionName, $packageName);</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker - wraps Kieker Monitoring functions</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new(); # Creates a new monitoring instance</pre>
|
||||||
|
<pre>
|
||||||
|
$kieker->EntryEvent('Foo','Bar'); # Produces a new EntryEvent</pre>
|
||||||
|
<pre>
|
||||||
|
$kieker->ExitEvent('Foo','Bar'); # Produces a new ExitEvent</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>This module encapsulates the Kieker monitoring functions in one module. Upon
|
||||||
|
creation the controlling and writing parts are loaded and the singleton
|
||||||
|
instances are stored.
|
||||||
|
After that Events can be constructed and written to the active writer.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_object___kieker__new__">$object = Kieker-><code>new()</code></a></h2>
|
||||||
|
<p>Creates a new Kieker object. Currently takes no parameters for configuration.
|
||||||
|
Returns the object.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_object__entryevent__functionname___packagename__">$object->EntryEvent($functionName, $packageName);</a></h2>
|
||||||
|
<p>Creates and sends out a EntryEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_object__exitevent__functionname___packagename__">$object->ExitEvent($functionName, $packageName);</a></h2>
|
||||||
|
<p>Creates and sends out a ExitEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
5255
Umsetzung/Perl/Kieker.log
Normal file
128
Umsetzung/Perl/Kieker.pm
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker;
|
||||||
|
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
use Kieker::Record::OperationEntryEvent;
|
||||||
|
use Kieker::Record::OperationExitEvent;
|
||||||
|
use Kieker::Controlling;
|
||||||
|
use Kieker::Util;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker - wraps Kieker Monitoring functions
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new(); # Creates a new monitoring instance
|
||||||
|
|
||||||
|
$kieker->EntryEvent('Foo','Bar'); # Produces a new EntryEvent
|
||||||
|
|
||||||
|
$kieker->ExitEvent('Foo','Bar'); # Produces a new ExitEvent
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This module encapsulates the Kieker monitoring functions in one module. Upon
|
||||||
|
creation the controlling and writing parts are loaded and the singleton
|
||||||
|
instances are stored.
|
||||||
|
After that Events can be constructed and written to the active writer.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $object = Kieker->new()
|
||||||
|
|
||||||
|
Creates a new Kieker object. Currently takes no parameters for configuration.
|
||||||
|
Returns the object.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($type) = @_;
|
||||||
|
|
||||||
|
my $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
my $control = Kieker::Controlling->instance();
|
||||||
|
|
||||||
|
my $this = {
|
||||||
|
writer => $writer,
|
||||||
|
control => $control
|
||||||
|
};
|
||||||
|
|
||||||
|
return bless $this, $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $object->EntryEvent($functionName, $packageName);
|
||||||
|
|
||||||
|
Creates and sends out a EntryEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub EntryEvent {
|
||||||
|
my ($self,$functionName,$packageName) = @_;
|
||||||
|
my $writer = $self->{writer};
|
||||||
|
my $control = $self->{control};
|
||||||
|
|
||||||
|
my $record = Kieker::Record::OperationEntryEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $object->ExitEvent($functionName, $packageName);
|
||||||
|
|
||||||
|
Creates and sends out a ExitEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub ExitEvent {
|
||||||
|
my ($self,$functionName,$packageName) = @_;
|
||||||
|
my $writer = $self->{writer};
|
||||||
|
my $control = $self->{control};
|
||||||
|
|
||||||
|
my $record = Kieker::Record::OperationExitEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
280
Umsetzung/Perl/Kieker.tex
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
\section{Kieker\label{Kieker}\index{Kieker}}
|
||||||
|
|
||||||
|
|
||||||
|
Wraps Kieker Monitoring functions
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker_SYNOPSIS}\index{Kieker!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new(); # Creates a new monitoring instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$kieker->EntryEvent('Foo','Bar'); # Produces a new EntryEvent
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$kieker->ExitEvent('Foo','Bar'); # Produces a new ExitEvent
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker_DESCRIPTION}\index{Kieker!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module encapsulates the Kieker monitoring functions in one module. Upon
|
||||||
|
creation the controlling and writing parts are loaded and the singleton
|
||||||
|
instances are stored.
|
||||||
|
After that Events can be constructed and written to the active writer.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker_METHODS}\index{Kieker!METHODS}}
|
||||||
|
\subsubsection*{\$object = Kieker-$>$new()\label{Kieker__object_Kieker-_new_}\index{Kieker!\$object = Kieker-$>$new()}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Kieker object. Currently takes no parameters for configuration.
|
||||||
|
Returns the object.
|
||||||
|
|
||||||
|
\subsubsection*{\$object-$>$EntryEvent(\$functionName, \$packageName);\label{Kieker__object-_EntryEvent_functionName_packageName_}\index{Kieker!\$object-$>$EntryEvent(\$functionName, \$packageName);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates and sends out a EntryEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
\subsubsection*{\$object-$>$ExitEvent(\$functionName, \$packageName);\label{Kieker__object-_ExitEvent_functionName_packageName_}\index{Kieker!\$object-$>$ExitEvent(\$functionName, \$packageName);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates and sends out a ExitEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
\section{Kieker::Controlling\label{Kieker::Controlling}\index{Kieker::Controlling}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides Controlling mechanisms to Kieker Modules
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Controlling_SYNOPSIS}\index{Kieker::Controlling!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Controlling;
|
||||||
|
my $control = Kieker::Controlling->instance(); # Get controlling instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $trace = $control->getTrace(); # Get current traceID
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $orderId = $control->getOrderIndex($trace); # Get current orderIndex
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Controlling_DESCRIPTION}\index{Kieker::Controlling!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module provides controlling methods for Kieker. The main functions are
|
||||||
|
providing consistent trace and orderIDs. When new traces are created the
|
||||||
|
corresponding traceEvents are created and written.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Controlling_METHODS}\index{Kieker::Controlling!METHODS}}
|
||||||
|
\subsubsection*{\$control = Kieker::Controlling-$>$instance();\label{Kieker::Controlling__control_Kieker::Controlling-_instance_}\index{Kieker::Controlling!\$control = Kieker::Controlling-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the singleton instance of Kieker::Controlling. If no instance is defined
|
||||||
|
a new instance is created.
|
||||||
|
|
||||||
|
\subsubsection*{my \$orderId = \$control-$>$getOrderIndex(\$trace);\label{Kieker::Controlling_my_orderId_control-_getOrderIndex_trace_}\index{Kieker::Controlling!my \$orderId = \$control-$>$getOrderIndex(\$trace);}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the current orderIndex and increments the count. If this is the first
|
||||||
|
request a new traceEvent is created and written to the log.
|
||||||
|
|
||||||
|
\subsubsection*{my \$trace = \$control-$>$getTrace();\label{Kieker::Controlling_my_trace_control-_getTrace_}\index{Kieker::Controlling!my \$trace = \$control-$>$getTrace();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the current traceID. In this version it uses the threadID and relies on
|
||||||
|
special Apache configuration.
|
||||||
|
|
||||||
|
\section{Kieker::Util\label{Kieker::Util}\index{Kieker::Util}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker utility functions
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Util_SYNOPSIS}\index{Kieker::Util!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Util;
|
||||||
|
my $time = Kieker::Util->time(); # Get current time in (pseudo)-nanoseconds
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Util_DESCRIPTION}\index{Kieker::Util!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module provides utility functions for other Kieker modules.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Util_METHODS}\index{Kieker::Util!METHODS}}
|
||||||
|
\subsubsection*{\$time = Kieker::Util-$>$time();\label{Kieker::Util__time_Kieker::Util-_time_}\index{Kieker::Util!\$time = Kieker::Util-$>$time();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns current time in pseudo nanoseconds. Perl doesn't provide a real
|
||||||
|
nanosecond timer but only microseconds. Output is formatted to match kieker
|
||||||
|
time format.
|
||||||
|
NO REAL NANOSECONDS, MICROSECOND PRECISION.
|
||||||
|
|
||||||
|
\section{Kieker::Record::OperationEntryEvent\label{Kieker::Record::OperationEntryEvent}\index{Kieker::Record::OperationEntryEvent}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event to be produced at the start
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::OperationEntryEvent_SYNOPSIS}\index{Kieker::Record::OperationEntryEvent!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::OperationEntryEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::OperationEntryEvent_DESCRIPTION}\index{Kieker::Record::OperationEntryEvent!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a OperationEntryEvent. This Event should be generated at the start of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::OperationEntryEvent_METHODS}\index{Kieker::Record::OperationEntryEvent!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::OperationEntryEvent-$>$new(tstamp, trace, orderIndex, function, package);\label{Kieker::Record::OperationEntryEvent__record_Kieker::Record::OperationEntryEvent-_new_tstamp_trace_orderIndex_function_package_}\index{Kieker::Record::OperationEntryEvent!\$record = Kieker::Record::OperationEntryEvent-$>$new(tstamp, trace, orderIndex, function, package);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::OperationEntryEvent__string_record-_genoutput_}\index{Kieker::Record::OperationEntryEvent!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "1" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Record::OperationExitEvent\label{Kieker::Record::OperationExitEvent}\index{Kieker::Record::OperationExitEvent}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event to be produced at the end
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::OperationExitEvent_SYNOPSIS}\index{Kieker::Record::OperationExitEvent!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::OperationExitEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::OperationExitEvent_DESCRIPTION}\index{Kieker::Record::OperationExitEvent!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a OperationExitEvent. This Event should be generated at the end of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::OperationExitEvent_METHODS}\index{Kieker::Record::OperationExitEvent!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::OperationExitEvent-$>$new(tstamp, trace, orderIndex, function, package);\label{Kieker::Record::OperationExitEvent__record_Kieker::Record::OperationExitEvent-_new_tstamp_trace_orderIndex_function_package_}\index{Kieker::Record::OperationExitEvent!\$record = Kieker::Record::OperationExitEvent-$>$new(tstamp, trace, orderIndex, function, package);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::OperationExitEvent__string_record-_genoutput_}\index{Kieker::Record::OperationExitEvent!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "2" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Record::Trace\label{Kieker::Record::Trace}\index{Kieker::Record::Trace}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event indicating one trace. Gets autocreated by
|
||||||
|
Kieker::Controlling.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::Trace_SYNOPSIS}\index{Kieker::Record::Trace!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::Trace->new($traceID);
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::Trace_DESCRIPTION}\index{Kieker::Record::Trace!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a Trace. This Event is autocreated by Kieker::Controlling when a new
|
||||||
|
trace is started.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::Trace_METHODS}\index{Kieker::Record::Trace!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::Trace-$>$new(\$traceID);\label{Kieker::Record::Trace__record_Kieker::Record::Trace-_new_traceID_}\index{Kieker::Record::Trace!\$record = Kieker::Record::Trace-$>$new(\$traceID);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new trace with the given trace ID.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::Trace__string_record-_genoutput_}\index{Kieker::Record::Trace!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "3" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Writer::FileWriter\label{Kieker::Writer::FileWriter}\index{Kieker::Writer::FileWriter}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides a Kieker Writer for file output.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Writer::FileWriter_SYNOPSIS}\index{Kieker::Writer::FileWriter!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Writer::FileWriter;
|
||||||
|
my $writer = Kieker::Writer::FileWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($string); # writes string to the current file
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Writer::FileWriter_DESCRIPTION}\index{Kieker::Writer::FileWriter!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes Kieker records to a Logfile. Can also be used to write other strings to
|
||||||
|
log files.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Writer::FileWriter_METHODS}\index{Kieker::Writer::FileWriter!METHODS}}
|
||||||
|
\subsubsection*{\$writer = Kieker::Writer::FileWriter-$>$instance();\label{Kieker::Writer::FileWriter__writer_Kieker::Writer::FileWriter-_instance_}\index{Kieker::Writer::FileWriter!\$writer = Kieker::Writer::FileWriter-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the filehandle
|
||||||
|
currently wrinting to. If no instance exists, it is created and a new logfile
|
||||||
|
is created using the current time for the filename.
|
||||||
|
|
||||||
|
\subsubsection*{\$writer-$>$write(STRING);\label{Kieker::Writer::FileWriter__writer-_write_STRING_}\index{Kieker::Writer::FileWriter!\$writer-$>$write(STRING);}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes STRING to the filehandle.
|
||||||
|
|
||||||
|
\section{Kieker::Writer::JMSWriter\label{Kieker::Writer::JMSWriter}\index{Kieker::Writer::JMSWriter}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides a Kieker Writer for JMS output.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Writer::JMSWriter_SYNOPSIS}\index{Kieker::Writer::JMSWriter!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
my $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($string); # writes string to JMS
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Writer::JMSWriter_DESCRIPTION}\index{Kieker::Writer::JMSWriter!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes Kieker records to a JMS provider. Can also be used to write other
|
||||||
|
strings.
|
||||||
|
|
||||||
|
\subsection*{REQUIREMENTS\label{Kieker::Writer::JMSWriter_REQUIREMENTS}\index{Kieker::Writer::JMSWriter!REQUIREMENTS}}
|
||||||
|
|
||||||
|
|
||||||
|
Uses Net::Stomp for the JMS connection.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Writer::JMSWriter_METHODS}\index{Kieker::Writer::JMSWriter!METHODS}}
|
||||||
|
\subsubsection*{\$writer = Kieker::Writer::JMSWriter-$>$instance();\label{Kieker::Writer::JMSWriter__writer_Kieker::Writer::JMSWriter-_instance_}\index{Kieker::Writer::JMSWriter!\$writer = Kieker::Writer::JMSWriter-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the handle currently
|
||||||
|
wrinting to. If no instance exists, it is created and a connection to the JMS
|
||||||
|
provider is opened. Currently no configuration options are provided and the
|
||||||
|
location of the provider is static in the source. (localhost:61613)
|
||||||
|
|
||||||
|
\subsubsection*{\$writer-$>$write(STRING);\label{Kieker::Writer::JMSWriter__writer-_write_STRING_}\index{Kieker::Writer::JMSWriter!\$writer-$>$write(STRING);}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes STRING to JMS.
|
||||||
|
|
280
Umsetzung/Perl/Kieker.tex.bak
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
\section{Kieker\label{Kieker}\index{Kieker}}
|
||||||
|
|
||||||
|
|
||||||
|
Wraps Kieker Monitoring functions
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker_SYNOPSIS}\index{Kieker!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker;
|
||||||
|
my $kieker = Kieker->new(); # Creates a new monitoring instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$kieker->EntryEvent('Foo','Bar'); # Produces a new EntryEvent
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$kieker->ExitEvent('Foo','Bar'); # Produces a new ExitEvent
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker_DESCRIPTION}\index{Kieker!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module encapsulates the Kieker monitoring functions in one module. Upon
|
||||||
|
creation the controlling and writing parts are loaded and the singleton
|
||||||
|
instances are stored.
|
||||||
|
After that Events can be constructed and written to the active writer.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker_METHODS}\index{Kieker!METHODS}}
|
||||||
|
\subsubsection*{\$object = Kieker-$>$new()\label{Kieker__object_Kieker-_new_}\index{Kieker!\$object = Kieker-$>$new()}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Kieker object. Currently takes no parameters for configuration.
|
||||||
|
Returns the object.
|
||||||
|
|
||||||
|
\subsubsection*{\$object-$>$EntryEvent(\$functionName, \$packageName);\label{Kieker__object-_EntryEvent_functionName_packageName_}\index{Kieker!\$object-$>$EntryEvent(\$functionName, \$packageName);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates and sends out a EntryEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
\subsubsection*{\$object-$>$ExitEvent(\$functionName, \$packageName);\label{Kieker__object-_ExitEvent_functionName_packageName_}\index{Kieker!\$object-$>$ExitEvent(\$functionName, \$packageName);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates and sends out a ExitEvent for a specified functionName in a specified
|
||||||
|
package. Uses the current timestamp. Returns nothing.
|
||||||
|
|
||||||
|
\section{Kieker::Controlling\label{Kieker::Controlling}\index{Kieker::Controlling}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides Controlling mechanisms to Kieker Modules
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Controlling_SYNOPSIS}\index{Kieker::Controlling!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Controlling;
|
||||||
|
my $control = Kieker::Controlling->instance(); # Get controlling instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $trace = $control->getTrace(); # Get current traceID
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $orderId = $control->getOrderIndex($trace); # Get current orderIndex
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Controlling_DESCRIPTION}\index{Kieker::Controlling!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module provides controlling methods for Kieker. The main functions are
|
||||||
|
providing consistent trace and orderIDs. When new traces are created the
|
||||||
|
corresponding traceEvents are created and written.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Controlling_METHODS}\index{Kieker::Controlling!METHODS}}
|
||||||
|
\subsubsection*{\$control = Kieker::Controlling-$>$instance();\label{Kieker::Controlling__control_Kieker::Controlling-_instance_}\index{Kieker::Controlling!\$control = Kieker::Controlling-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the singleton instance of Kieker::Controlling. If no instance is defined
|
||||||
|
a new instance is created.
|
||||||
|
|
||||||
|
\subsubsection*{my \$orderId = \$control-$>$getOrderIndex(\$trace);\label{Kieker::Controlling_my_orderId_control-_getOrderIndex_trace_}\index{Kieker::Controlling!my \$orderId = \$control-$>$getOrderIndex(\$trace);}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the current orderIndex and increments the count. If this is the first
|
||||||
|
request a new traceEvent is created and written to the log.
|
||||||
|
|
||||||
|
\subsubsection*{my \$trace = \$control-$>$getTrace();\label{Kieker::Controlling_my_trace_control-_getTrace_}\index{Kieker::Controlling!my \$trace = \$control-$>$getTrace();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the current traceID. In this version it uses the threadID and relies on
|
||||||
|
special Apache configuration.
|
||||||
|
|
||||||
|
\section{Kieker::Util\label{Kieker::Util}\index{Kieker::Util}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker utility functions
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Util_SYNOPSIS}\index{Kieker::Util!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Util;
|
||||||
|
my $time = Kieker::Util->time(); # Get current time in (pseudo)-nanoseconds
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Util_DESCRIPTION}\index{Kieker::Util!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
This module provides utility functions for other Kieker modules.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Util_METHODS}\index{Kieker::Util!METHODS}}
|
||||||
|
\subsubsection*{\$time = Kieker::Util-$>$time();\label{Kieker::Util__time_Kieker::Util-_time_}\index{Kieker::Util!\$time = Kieker::Util-$>$time();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns current time in pseudo nanoseconds. Perl doesn't provide a real
|
||||||
|
nanosecond timer but only microseconds. Output is formatted to match kieker
|
||||||
|
time format.
|
||||||
|
NO REAL NANOSECONDS, MICROSECOND PRECISION.
|
||||||
|
|
||||||
|
\section{Kieker::Record::OperationEntryEvent\label{Kieker::Record::OperationEntryEvent}\index{Kieker::Record::OperationEntryEvent}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event to be produced at the start
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::OperationEntryEvent_SYNOPSIS}\index{Kieker::Record::OperationEntryEvent!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::OperationEntryEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::OperationEntryEvent_DESCRIPTION}\index{Kieker::Record::OperationEntryEvent!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a OperationEntryEvent. This Event should be generated at the start of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::OperationEntryEvent_METHODS}\index{Kieker::Record::OperationEntryEvent!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::OperationEntryEvent-$>$new(tstamp, trace, orderIndex, function, package);\label{Kieker::Record::OperationEntryEvent__record_Kieker::Record::OperationEntryEvent-_new_tstamp_trace_orderIndex_function_package_}\index{Kieker::Record::OperationEntryEvent!\$record = Kieker::Record::OperationEntryEvent-$>$new(tstamp, trace, orderIndex, function, package);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::OperationEntryEvent__string_record-_genoutput_}\index{Kieker::Record::OperationEntryEvent!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "1" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Record::OperationExitEvent\label{Kieker::Record::OperationExitEvent}\index{Kieker::Record::OperationExitEvent}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event to be produced at the end
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::OperationExitEvent_SYNOPSIS}\index{Kieker::Record::OperationExitEvent!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::OperationExitEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::OperationExitEvent_DESCRIPTION}\index{Kieker::Record::OperationExitEvent!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a OperationExitEvent. This Event should be generated at the end of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::OperationExitEvent_METHODS}\index{Kieker::Record::OperationExitEvent!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::OperationExitEvent-$>$new(timestamp, trace, orderIndex, function, package);\label{Kieker::Record::OperationExitEvent__record_Kieker::Record::OperationExitEvent-_new_timestamp_trace_orderIndex_function_package_}\index{Kieker::Record::OperationExitEvent!\$record = Kieker::Record::OperationExitEvent-$>$new(timestamp, trace, orderIndex, function, package);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::OperationExitEvent__string_record-_genoutput_}\index{Kieker::Record::OperationExitEvent!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "2" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Record::Trace\label{Kieker::Record::Trace}\index{Kieker::Record::Trace}}
|
||||||
|
|
||||||
|
|
||||||
|
Kieker Event indicating one trace. Gets autocreated by
|
||||||
|
Kieker::Controlling.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Record::Trace_SYNOPSIS}\index{Kieker::Record::Trace!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
my $record = Kieker::Record::Trace->new($traceID);
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Record::Trace_DESCRIPTION}\index{Kieker::Record::Trace!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Generates a Trace. This Event is autocreated by Kieker::Controlling when a new
|
||||||
|
trace is started.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Record::Trace_METHODS}\index{Kieker::Record::Trace!METHODS}}
|
||||||
|
\subsubsection*{\$record = Kieker::Record::Trace-$>$new(\$traceID);\label{Kieker::Record::Trace__record_Kieker::Record::Trace-_new_traceID_}\index{Kieker::Record::Trace!\$record = Kieker::Record::Trace-$>$new(\$traceID);}}
|
||||||
|
|
||||||
|
|
||||||
|
Creates a new trace with the given trace ID.
|
||||||
|
|
||||||
|
\subsubsection*{\$string = \$record-$>$genoutput();\label{Kieker::Record::Trace__string_record-_genoutput_}\index{Kieker::Record::Trace!\$string = \$record-$>$genoutput();}}
|
||||||
|
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "3" for the event type.
|
||||||
|
|
||||||
|
\section{Kieker::Writer::FileWriter\label{Kieker::Writer::FileWriter}\index{Kieker::Writer::FileWriter}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides a Kieker Writer for file output.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Writer::FileWriter_SYNOPSIS}\index{Kieker::Writer::FileWriter!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Writer::FileWriter;
|
||||||
|
my $writer = Kieker::Writer::FileWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($string); # writes string to the current file
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Writer::FileWriter_DESCRIPTION}\index{Kieker::Writer::FileWriter!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes Kieker records to a Logfile. Can also be used to write other strings to
|
||||||
|
log files.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Writer::FileWriter_METHODS}\index{Kieker::Writer::FileWriter!METHODS}}
|
||||||
|
\subsubsection*{\$writer = Kieker::Writer::FileWriter-$>$instance();\label{Kieker::Writer::FileWriter__writer_Kieker::Writer::FileWriter-_instance_}\index{Kieker::Writer::FileWriter!\$writer = Kieker::Writer::FileWriter-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the filehandle
|
||||||
|
currently wrinting to. If no instance exists, it is created and a new logfile
|
||||||
|
is created using the current time for the filename.
|
||||||
|
|
||||||
|
\subsubsection*{\$writer-$>$write(STRING);\label{Kieker::Writer::FileWriter__writer-_write_STRING_}\index{Kieker::Writer::FileWriter!\$writer-$>$write(STRING);}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes STRING to the filehandle.
|
||||||
|
|
||||||
|
\section{Kieker::Writer::JMSWriter\label{Kieker::Writer::JMSWriter}\index{Kieker::Writer::JMSWriter}}
|
||||||
|
|
||||||
|
|
||||||
|
Provides a Kieker Writer for JMS output.
|
||||||
|
|
||||||
|
\subsection*{SYNOPSIS\label{Kieker::Writer::JMSWriter_SYNOPSIS}\index{Kieker::Writer::JMSWriter!SYNOPSIS}}
|
||||||
|
\begin{verbatim}
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
my $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
\end{verbatim}
|
||||||
|
\begin{verbatim}
|
||||||
|
$writer->write($string); # writes string to JMS
|
||||||
|
\end{verbatim}
|
||||||
|
\subsection*{DESCRIPTION\label{Kieker::Writer::JMSWriter_DESCRIPTION}\index{Kieker::Writer::JMSWriter!DESCRIPTION}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes Kieker records to a JMS provider. Can also be used to write other
|
||||||
|
strings.
|
||||||
|
|
||||||
|
\subsection*{REQUIREMENTS\label{Kieker::Writer::JMSWriter_REQUIREMENTS}\index{Kieker::Writer::JMSWriter!REQUIREMENTS}}
|
||||||
|
|
||||||
|
|
||||||
|
Uses Net::Stomp for the JMS connection.
|
||||||
|
|
||||||
|
\subsection*{METHODS\label{Kieker::Writer::JMSWriter_METHODS}\index{Kieker::Writer::JMSWriter!METHODS}}
|
||||||
|
\subsubsection*{\$writer = Kieker::Writer::JMSWriter-$>$instance();\label{Kieker::Writer::JMSWriter__writer_Kieker::Writer::JMSWriter-_instance_}\index{Kieker::Writer::JMSWriter!\$writer = Kieker::Writer::JMSWriter-$>$instance();}}
|
||||||
|
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the handle currently
|
||||||
|
wrinting to. If no instance exists, it is created and a connection to the JMS
|
||||||
|
provider is opened. Currently no configuration options are provided and the
|
||||||
|
location of the provider is static in the source. (localhost:61613)
|
||||||
|
|
||||||
|
\subsubsection*{\$writer-$>$write(STRING);\label{Kieker::Writer::JMSWriter__writer-_write_STRING_}\index{Kieker::Writer::JMSWriter!\$writer-$>$write(STRING);}}
|
||||||
|
|
||||||
|
|
||||||
|
Writes STRING to JMS.
|
||||||
|
|
115
Umsetzung/Perl/Kieker/Controlling.pm
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Controlling;
|
||||||
|
|
||||||
|
use Kieker::Record::Trace;
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Controlling - Provides Controlling mechanisms to Kieker Modules
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Kieker::Controlling;
|
||||||
|
my $control = Kieker::Controlling->instance(); # Get controlling instance
|
||||||
|
|
||||||
|
my $trace = $control->getTrace(); # Get current traceID
|
||||||
|
|
||||||
|
my $orderId = $control->getOrderIndex($trace); # Get current orderIndex
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This module provides controlling methods for Kieker. The main functions are
|
||||||
|
providing consistent trace and orderIDs. When new traces are created the
|
||||||
|
corresponding traceEvents are created and written.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $control = Kieker::Controlling->instance();
|
||||||
|
|
||||||
|
Returns the singleton instance of Kieker::Controlling. If no instance is defined
|
||||||
|
a new instance is created.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
my $oneTrueSelf;
|
||||||
|
|
||||||
|
sub instance {
|
||||||
|
# check singleton
|
||||||
|
unless (defined $oneTrueSelf) {
|
||||||
|
my ($type) = @_;
|
||||||
|
my $this = {};
|
||||||
|
|
||||||
|
$oneTrueSelf = bless $this, $type;
|
||||||
|
}
|
||||||
|
return $oneTrueSelf;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 my $orderId = $control->getOrderIndex($trace);
|
||||||
|
|
||||||
|
Returns the current orderIndex and increments the count. If this is the first
|
||||||
|
request a new traceEvent is created and written to the log.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub getOrderIndex {
|
||||||
|
my ($self, $trace) = @_;
|
||||||
|
|
||||||
|
if (defined ($self->{$trace})) {
|
||||||
|
my $orderIndex = $self->{$trace} + 1;
|
||||||
|
$self->{$trace} = $orderIndex;
|
||||||
|
return $orderIndex;
|
||||||
|
} else {
|
||||||
|
my $kieker_writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
my $kieker_record = Kieker::Record::Trace->new($trace);
|
||||||
|
$kieker_writer->write($kieker_record->genoutput());
|
||||||
|
$self->{$trace} = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 my $trace = $control->getTrace();
|
||||||
|
|
||||||
|
Returns the current traceID. In this version it uses the threadID and relies on
|
||||||
|
special Apache configuration.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub getTrace {
|
||||||
|
return $$;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
109
Umsetzung/Perl/Kieker/Controlling.pm.htm
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Controlling - Provides Controlling mechanisms to Kieker Modules</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_control___kieker__controlling__instance___">$control = Kieker::Controlling-><code>instance()</code>;</a></li>
|
||||||
|
<li><a href="#my__orderid____control__getorderindex__trace__">my $orderId = $control-><code>getOrderIndex($trace)</code>;</a></li>
|
||||||
|
<li><a href="#my__trace____control__gettrace___">my $trace = $control-><code>getTrace()</code>;</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Controlling - Provides Controlling mechanisms to Kieker Modules</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
use Kieker::Controlling;
|
||||||
|
my $control = Kieker::Controlling->instance(); # Get controlling instance</pre>
|
||||||
|
<pre>
|
||||||
|
my $trace = $control->getTrace(); # Get current traceID</pre>
|
||||||
|
<pre>
|
||||||
|
my $orderId = $control->getOrderIndex($trace); # Get current orderIndex</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>This module provides controlling methods for Kieker. The main functions are
|
||||||
|
providing consistent trace and orderIDs. When new traces are created the
|
||||||
|
corresponding traceEvents are created and written.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_control___kieker__controlling__instance___">$control = Kieker::Controlling-><code>instance()</code>;</a></h2>
|
||||||
|
<p>Returns the singleton instance of Kieker::Controlling. If no instance is defined
|
||||||
|
a new instance is created.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="my__orderid____control__getorderindex__trace__">my $orderId = $control-><code>getOrderIndex($trace)</code>;</a></h2>
|
||||||
|
<p>Returns the current orderIndex and increments the count. If this is the first
|
||||||
|
request a new traceEvent is created and written to the log.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="my__trace____control__gettrace___">my $trace = $control-><code>getTrace()</code>;</a></h2>
|
||||||
|
<p>Returns the current traceID. In this version it uses the threadID and relies on
|
||||||
|
special Apache configuration.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
92
Umsetzung/Perl/Kieker/Record/OperationEntryEvent.pm
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Record::OperationEntryEvent;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Record::OperationEntryEvent - Kieker Event to be produced at the start
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
my $record = Kieker::Record::OperationEntryEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Generates a OperationEntryEvent. This Event should be generated at the start of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $record = Kieker::Record::OperationEntryEvent->new(timestamp, trace, orderIndex, function, package);
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($type, $timest, $traceID, $orderID, $funName, $packName) = @_;
|
||||||
|
my $this = {
|
||||||
|
timestamp => $timest,
|
||||||
|
traceID => $traceID,
|
||||||
|
orderIndex => $orderID,
|
||||||
|
functionName => $funName,
|
||||||
|
packageName => $packName
|
||||||
|
};
|
||||||
|
|
||||||
|
return bless($this,$type);
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $string = $record->genoutput();
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "1" for the event type.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub genoutput {
|
||||||
|
my ($self) = @_;
|
||||||
|
return
|
||||||
|
"1;".$self->{timestamp}.";".$self->{traceID}.";".
|
||||||
|
$self->{orderIndex}.";".$self->{functionName}.";".$self->{packageName};
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
104
Umsetzung/Perl/Kieker/Record/OperationEntryEvent.pm.htm
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Record::OperationEntryEvent - Kieker Event to be produced at the start
|
||||||
|
of a function call.</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_record___kieker__record__operationentryevent__new_timestamp__trace__orderindex__function__package__">$record = Kieker::Record::OperationEntryEvent->new(timestamp, trace, orderIndex, function, package);</a></li>
|
||||||
|
<li><a href="#_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Record::OperationEntryEvent - Kieker Event to be produced at the start
|
||||||
|
of a function call.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
my $record = Kieker::Record::OperationEntryEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>Generates a OperationEntryEvent. This Event should be generated at the start of
|
||||||
|
each monitored function.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_record___kieker__record__operationentryevent__new_timestamp__trace__orderindex__function__package__">$record = Kieker::Record::OperationEntryEvent->new(timestamp, trace, orderIndex, function, package);</a></h2>
|
||||||
|
<p>Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></h2>
|
||||||
|
<p>Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "1" for the event type.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
92
Umsetzung/Perl/Kieker/Record/OperationExitEvent.pm
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Record::OperationExitEvent;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Record::OperationExitEvent - Kieker Event to be produced at the end
|
||||||
|
of a function call.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
my $record = Kieker::Record::OperationExitEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Generates a OperationExitEvent. This Event should be generated at the end of
|
||||||
|
each monitored function.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $record = Kieker::Record::OperationExitEvent->new(timestamp, trace, orderIndex, function, package);
|
||||||
|
|
||||||
|
Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($type, $timest, $traceID, $orderID, $funName, $packName) = @_;
|
||||||
|
my $this = {
|
||||||
|
timestamp => $timest,
|
||||||
|
traceID => $traceID,
|
||||||
|
orderIndex => $orderID,
|
||||||
|
functionName => $funName,
|
||||||
|
packageName => $packName
|
||||||
|
};
|
||||||
|
|
||||||
|
return bless($this,$type);
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $string = $record->genoutput();
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "2" for the event type.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub genoutput {
|
||||||
|
my ($self) = @_;
|
||||||
|
return
|
||||||
|
"2;".$self->{timestamp}.";".$self->{traceID}.";".
|
||||||
|
$self->{orderIndex}.";".$self->{functionName}.";".$self->{packageName};
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
104
Umsetzung/Perl/Kieker/Record/OperationExitEvent.pm.htm
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Record::OperationExitEvent - Kieker Event to be produced at the end
|
||||||
|
of a function call.</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_record___kieker__record__operationexitevent__new_timestamp__trace__orderindex__function__package__">$record = Kieker::Record::OperationExitEvent->new(timestamp, trace, orderIndex, function, package);</a></li>
|
||||||
|
<li><a href="#_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Record::OperationExitEvent - Kieker Event to be produced at the end
|
||||||
|
of a function call.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
my $record = Kieker::Record::OperationExitEvent->new(
|
||||||
|
Kieker::Util->time(),
|
||||||
|
$control->getTrace(),
|
||||||
|
$control->getOrderIndex($control->getTrace()),
|
||||||
|
$functionName,$packageName);
|
||||||
|
$writer->write($record->genoutput());</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>Generates a OperationExitEvent. This Event should be generated at the end of
|
||||||
|
each monitored function.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_record___kieker__record__operationexitevent__new_timestamp__trace__orderindex__function__package__">$record = Kieker::Record::OperationExitEvent->new(timestamp, trace, orderIndex, function, package);</a></h2>
|
||||||
|
<p>Creates a new Record. It needs a timestamp, a trace with its corresponding
|
||||||
|
orderIndex, a function name and a package name.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></h2>
|
||||||
|
<p>Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "2" for the event type.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
82
Umsetzung/Perl/Kieker/Record/Trace.pm
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Record::Trace;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Record::Trace - Kieker Event indicating one trace. Gets autocreated by
|
||||||
|
Kieker::Controlling.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
my $record = Kieker::Record::Trace->new($traceID);
|
||||||
|
|
||||||
|
$writer->write($record->genoutput());
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Generates a Trace. This Event is autocreated by Kieker::Controlling when a new
|
||||||
|
trace is started.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $record = Kieker::Record::Trace->new($traceID);
|
||||||
|
|
||||||
|
Creates a new trace with the given trace ID.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($type, $traceID) = @_;
|
||||||
|
my $this = {
|
||||||
|
traceID => $traceID
|
||||||
|
};
|
||||||
|
|
||||||
|
return bless($this,$type);
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $string = $record->genoutput();
|
||||||
|
|
||||||
|
Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "3" for the event type.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub genoutput {
|
||||||
|
my ($self) = @_;
|
||||||
|
return "3;".$self->{traceID}.";0;0;0;0;0";
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
100
Umsetzung/Perl/Kieker/Record/Trace.pm.htm
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Record::Trace - Kieker Event indicating one trace. Gets autocreated by
|
||||||
|
Kieker::Controlling.</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_record___kieker__record__trace__new__traceid__">$record = Kieker::Record::Trace-><code>new($traceID)</code>;</a></li>
|
||||||
|
<li><a href="#_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Record::Trace - Kieker Event indicating one trace. Gets autocreated by
|
||||||
|
Kieker::Controlling.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
my $record = Kieker::Record::Trace->new($traceID);
|
||||||
|
|
||||||
|
$writer->write($record->genoutput());</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>Generates a Trace. This Event is autocreated by Kieker::Controlling when a new
|
||||||
|
trace is started.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_record___kieker__record__trace__new__traceid__">$record = Kieker::Record::Trace-><code>new($traceID)</code>;</a></h2>
|
||||||
|
<p>Creates a new trace with the given trace ID.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_string____record__genoutput___">$string = $record-><code>genoutput()</code>;</a></h2>
|
||||||
|
<p>Serializes the record for output. Returns the serialized form of the record.
|
||||||
|
Uses the identifier "3" for the event type.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
68
Umsetzung/Perl/Kieker/Util.pm
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Util;
|
||||||
|
|
||||||
|
use Time::HiRes qw(gettimeofday);
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Util - Kieker utility functions
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Kieker::Util;
|
||||||
|
my $time = Kieker::Util->time(); # Get current time in (pseudo)-nanoseconds
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This module provides utility functions for other Kieker modules.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $time = Kieker::Util->time();
|
||||||
|
|
||||||
|
Returns current time in pseudo nanoseconds. Perl doesn't provide a real
|
||||||
|
nanosecond timer but only microseconds. Output is formatted to match kieker
|
||||||
|
time format.
|
||||||
|
NO REAL NANOSECONDS, MICROSECOND PRECISION.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub time {
|
||||||
|
(my $s, my $usec) = gettimeofday();
|
||||||
|
return ($s*1000000+$usec)*1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
93
Umsetzung/Perl/Kieker/Util.pm.htm
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Util - Kieker utility functions</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_time___kieker__util__time___">$time = Kieker::Util-><code>time()</code>;</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Util - Kieker utility functions</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
use Kieker::Util;
|
||||||
|
my $time = Kieker::Util->time(); # Get current time in (pseudo)-nanoseconds</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>This module provides utility functions for other Kieker modules.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_time___kieker__util__time___">$time = Kieker::Util-><code>time()</code>;</a></h2>
|
||||||
|
<p>Returns current time in pseudo nanoseconds. Perl doesn't provide a real
|
||||||
|
nanosecond timer but only microseconds. Output is formatted to match kieker
|
||||||
|
time format.
|
||||||
|
NO REAL NANOSECONDS, MICROSECOND PRECISION.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
101
Umsetzung/Perl/Kieker/Writer/FileWriter.pm
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Writer::FileWriter;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Writer::FileWriter - Provides a Kieker Writer for file output.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Kieker::Writer::FileWriter;
|
||||||
|
my $writer = Kieker::Writer::FileWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
|
||||||
|
$writer->write($string); # writes string to the current file
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Writes Kieker records to a Logfile. Can also be used to write other strings to
|
||||||
|
log files.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $writer = Kieker::Writer::FileWriter->instance();
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the filehandle
|
||||||
|
currently wrinting to. If no instance exists, it is created and a new logfile
|
||||||
|
is created using the current time for the filename.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
my $oneTrueSelf;
|
||||||
|
|
||||||
|
sub instance {
|
||||||
|
# check singleton
|
||||||
|
unless (defined $oneTrueSelf) {
|
||||||
|
my ($type) = @_;
|
||||||
|
|
||||||
|
# generate filename from time
|
||||||
|
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
|
||||||
|
my $filename = 'kieker_monitoring_output_'.($year+1900).'-'.sprintf("%02d", ($mon+1)).'-'.$mday.'_'.$hour.':'.$min.':'.$sec.'.log';
|
||||||
|
# open filehandle
|
||||||
|
open(my $filehandle, "> $filename") || die ("can't open output file: $!");
|
||||||
|
|
||||||
|
my $this = {
|
||||||
|
file => $filehandle
|
||||||
|
};
|
||||||
|
$oneTrueSelf = bless $this, $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $oneTrueSelf;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $writer->write(STRING);
|
||||||
|
|
||||||
|
Writes STRING to the filehandle.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub write {
|
||||||
|
my ($self, $string) = @_;
|
||||||
|
my $handle = $self->{file};
|
||||||
|
my $old_fh = select($handle);
|
||||||
|
$| = 1;
|
||||||
|
select($old_fh);
|
||||||
|
print $handle $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
101
Umsetzung/Perl/Kieker/Writer/FileWriter.pm.htm
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Writer::FileWriter - Provides a Kieker Writer for file output.</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_writer___kieker__writer__filewriter__instance___">$writer = Kieker::Writer::FileWriter-><code>instance()</code>;</a></li>
|
||||||
|
<li><a href="#_writer__write_string__">$writer->write(STRING);</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Writer::FileWriter - Provides a Kieker Writer for file output.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
use Kieker::Writer::FileWriter;
|
||||||
|
my $writer = Kieker::Writer::FileWriter->instance();
|
||||||
|
# Get writer instance</pre>
|
||||||
|
<pre>
|
||||||
|
$writer->write($string); # writes string to the current file</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>Writes Kieker records to a Logfile. Can also be used to write other strings to
|
||||||
|
log files.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_writer___kieker__writer__filewriter__instance___">$writer = Kieker::Writer::FileWriter-><code>instance()</code>;</a></h2>
|
||||||
|
<p>Returns the writer singleton instance. Thsi object holds the filehandle
|
||||||
|
currently wrinting to. If no instance exists, it is created and a new logfile
|
||||||
|
is created using the current time for the filename.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_writer__write_string__">$writer->write(STRING);</a></h2>
|
||||||
|
<p>Writes STRING to the filehandle.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
104
Umsetzung/Perl/Kieker/Writer/JMSWriter.pm
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
package Kieker::Writer::JMSWriter;
|
||||||
|
|
||||||
|
use Net::Stomp;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Kieker::Writer::JMSWriter - Provides a Kieker Writer for JMS output.
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
my $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
# Get writer instance
|
||||||
|
|
||||||
|
$writer->write($string); # writes string to JMS
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Writes Kieker records to a JMS provider. Can also be used to write other
|
||||||
|
strings.
|
||||||
|
|
||||||
|
=head1 REQUIREMENTS
|
||||||
|
|
||||||
|
Uses Net::Stomp for the JMS connection.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
|
||||||
|
Returns the writer singleton instance. Thsi object holds the handle currently
|
||||||
|
wrinting to. If no instance exists, it is created and a connection to the JMS
|
||||||
|
provider is opened. Currently no configuration options are provided and the
|
||||||
|
location of the provider is static in the source. (localhost:61613)
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
my $singleton;
|
||||||
|
|
||||||
|
sub instance {
|
||||||
|
# check Singleton
|
||||||
|
unless (defined $singleton) {
|
||||||
|
my ($type) = @_;
|
||||||
|
|
||||||
|
my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );
|
||||||
|
$stomp->connect( { login => 'hello', passcode => 'there' } );
|
||||||
|
|
||||||
|
my $this = {
|
||||||
|
handle => $stomp
|
||||||
|
};
|
||||||
|
$singleton = bless $this, $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 $writer->write(STRING);
|
||||||
|
|
||||||
|
Writes STRING to JMS.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub write {
|
||||||
|
my ($self, $msg) = @_;
|
||||||
|
my $handle = $self->{handle};
|
||||||
|
|
||||||
|
$handle->send(
|
||||||
|
{ destination => '/queue/de.cau.cs.se.kieker.service', body => $msg } );
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.
|
||||||
|
|
||||||
|
=head1 COPYRIGHT and LICENCE
|
||||||
|
|
||||||
|
Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, nbw@informatik.uni-kiel.de
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
1;
|
108
Umsetzung/Perl/Kieker/Writer/JMSWriter.pm.htm
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Kieker::Writer::JMSWriter - Provides a Kieker Writer for JMS output.</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="background-color: white">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- INDEX BEGIN -->
|
||||||
|
<div name="index">
|
||||||
|
<p><a name="__index__"></a></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#name">NAME</a></li>
|
||||||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||||||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||||||
|
<li><a href="#requirements">REQUIREMENTS</a></li>
|
||||||
|
<li><a href="#methods">METHODS</a></li>
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="#_writer___kieker__writer__jmswriter__instance___">$writer = Kieker::Writer::JMSWriter-><code>instance()</code>;</a></li>
|
||||||
|
<li><a href="#_writer__write_string__">$writer->write(STRING);</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li><a href="#bugs">BUGS</a></li>
|
||||||
|
<li><a href="#copyright_and_licence">COPYRIGHT and LICENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr name="index" />
|
||||||
|
</div>
|
||||||
|
<!-- INDEX END -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h1><a name="name">NAME</a></h1>
|
||||||
|
<p>Kieker::Writer::JMSWriter - Provides a Kieker Writer for JMS output.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||||||
|
<pre>
|
||||||
|
use Kieker::Writer::JMSWriter;
|
||||||
|
my $writer = Kieker::Writer::JMSWriter->instance();
|
||||||
|
# Get writer instance</pre>
|
||||||
|
<pre>
|
||||||
|
$writer->write($string); # writes string to JMS</pre>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||||||
|
<p>Writes Kieker records to a JMS provider. Can also be used to write other
|
||||||
|
strings.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="requirements">REQUIREMENTS</a></h1>
|
||||||
|
<p>Uses Net::Stomp for the JMS connection.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="methods">METHODS</a></h1>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_writer___kieker__writer__jmswriter__instance___">$writer = Kieker::Writer::JMSWriter-><code>instance()</code>;</a></h2>
|
||||||
|
<p>Returns the writer singleton instance. Thsi object holds the handle currently
|
||||||
|
wrinting to. If no instance exists, it is created and a connection to the JMS
|
||||||
|
provider is opened. Currently no configuration options are provided and the
|
||||||
|
location of the provider is static in the source. (localhost:61613)</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<h2><a name="_writer__write_string__">$writer->write(STRING);</a></h2>
|
||||||
|
<p>Writes STRING to JMS.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="bugs">BUGS</a></h1>
|
||||||
|
<p>The package is probably full of bugs and is likely to break on every possible
|
||||||
|
occasion. If you find any please let me know via email.</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<h1><a name="copyright_and_licence">COPYRIGHT and LICENCE</a></h1>
|
||||||
|
<p>Copyright 2013 Nis Börge Wechselberg, Kiel, Germany, <a href="mailto:nbw@informatik.uni-kiel.de">nbw@informatik.uni-kiel.de</a></p>
|
||||||
|
<p>The MIT License (MIT)</p>
|
||||||
|
<p>Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:</p>
|
||||||
|
<p>The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.</p>
|
||||||
|
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
BIN
Umsetzung/de.cau.cs.se.kieker.service.jar
Normal file
413
Umsetzung/kieker.monitoring.properties
Normal file
|
@ -0,0 +1,413 @@
|
||||||
|
## In order to use a custom Kieker.Monitoring configuration, create a copy of
|
||||||
|
## this file and modify it according to your needs.
|
||||||
|
##
|
||||||
|
## The location of the file is passed to Kieker.Monitoring via the JVM parameter
|
||||||
|
## kieker.monitoring.configuration. For example, with a configuration file named
|
||||||
|
## my.kieker.monitoring.properties in the folder META-INF you would pass this location
|
||||||
|
## to the JVM when starting your application:
|
||||||
|
##
|
||||||
|
## java -Dkieker.monitoring.configuration=META-INF/my.kieker.monitoring.properties [...]
|
||||||
|
##
|
||||||
|
## If no configuration file is passed, Kieker tries to use a configuration file in
|
||||||
|
## META-INF/kieker.monitoring.properties
|
||||||
|
## If this also fails, a default configuration is being used according to the values in
|
||||||
|
## this default file.
|
||||||
|
|
||||||
|
## The name of the Kieker instance.
|
||||||
|
kieker.monitoring.name=KIEKER
|
||||||
|
|
||||||
|
## Whether a debug mode is activated.
|
||||||
|
## This changes a few internal id generation mechanisms to enable
|
||||||
|
## easier debugging. Additionally, it is possible to enable debug
|
||||||
|
## logging in the settings of the used logger.
|
||||||
|
## This setting should usually not be set to true.
|
||||||
|
kieker.monitoring.debug=true
|
||||||
|
|
||||||
|
## Enable/disable monitoring after startup (true|false; default: true)
|
||||||
|
## If monitoring is disabled, the MonitoringController simply pauses.
|
||||||
|
## Furthermore, probes should stop collecting new data and monitoring
|
||||||
|
## writers stop should stop writing existing data.
|
||||||
|
kieker.monitoring.enabled=true
|
||||||
|
|
||||||
|
## The name of the VM running Kieker. If empty the name will be determined
|
||||||
|
## automatically, else it will be set to the given value.
|
||||||
|
kieker.monitoring.hostname=
|
||||||
|
|
||||||
|
## The initial ID associated with all experiments. (currently not used)
|
||||||
|
kieker.monitoring.initialExperimentId=1
|
||||||
|
|
||||||
|
## Enables/disable the automatic assignment of each record's logging timestamp.
|
||||||
|
## (true|false; default: true)
|
||||||
|
kieker.monitoring.setLoggingTimestamp=false
|
||||||
|
|
||||||
|
## Whether a shutdown hook should be registered.
|
||||||
|
## This ensures that necessary cleanup steps are finished and no
|
||||||
|
## information is lost due to asynchronous writers.
|
||||||
|
## This should usually not be set to false.
|
||||||
|
kieker.monitoring.useShutdownHook=true
|
||||||
|
|
||||||
|
## Whether any JMX functionality is available
|
||||||
|
kieker.monitoring.jmx=false
|
||||||
|
kieker.monitoring.jmx.domain=kieker.monitoring
|
||||||
|
|
||||||
|
## Enable/Disable the MonitoringController MBean
|
||||||
|
kieker.monitoring.jmx.MonitoringController=true
|
||||||
|
kieker.monitoring.jmx.MonitoringController.name=MonitoringController
|
||||||
|
|
||||||
|
## Controls JMX remote access
|
||||||
|
kieker.monitoring.jmx.remote=false
|
||||||
|
kieker.monitoring.jmx.remote.port=59999
|
||||||
|
kieker.monitoring.jmx.remote.name=JMXServer
|
||||||
|
## If the SUN-JMX Bootstrap class is not available, a fallback to the
|
||||||
|
## default implementation can be used. The fallback solution prevents
|
||||||
|
## the VM from terminating.
|
||||||
|
## A graceful shutdown is done by connecting to the JMXServer, there to
|
||||||
|
## kieker.monitoring.JMXServer and using the operation stop()
|
||||||
|
kieker.monitoring.jmx.remote.fallback=true
|
||||||
|
## These properties will be forwarded to configure the JMX server
|
||||||
|
com.sun.management.jmxremote.local.only=false
|
||||||
|
com.sun.management.jmxremote.authenticate=false
|
||||||
|
com.sun.management.jmxremote.ssl=false
|
||||||
|
|
||||||
|
## The size of the thread pool used to execute registered periodic sensor jobs.
|
||||||
|
## The thread pool is also used to periodically read the config file for adaptive
|
||||||
|
## monitoring.
|
||||||
|
## Set to 0 to deactivate scheduling.
|
||||||
|
kieker.monitoring.periodicSensorsExecutorPoolSize=1
|
||||||
|
|
||||||
|
## Enable or disable adaptive monitoring.
|
||||||
|
kieker.monitoring.adaptiveMonitoring.enabled=false
|
||||||
|
#
|
||||||
|
## Default location of the adaptive monitoring configuration File
|
||||||
|
kieker.monitoring.adaptiveMonitoring.configFile=META-INF/kieker.monitoring.adaptiveMonitoring.conf
|
||||||
|
#
|
||||||
|
## Enable/disable the updating of the pattern file by activating or deactivating
|
||||||
|
## probes through the api.
|
||||||
|
kieker.monitoring.adaptiveMonitoring.updateConfigFile=false
|
||||||
|
#
|
||||||
|
## The delay in seconds in which the pattern file is checked for changes.
|
||||||
|
## Requires kieker.monitoring.periodicSensorsExecutorPoolSize > 0.
|
||||||
|
## Set to 0 to disable the observation.
|
||||||
|
kieker.monitoring.adaptiveMonitoring.readInterval=30
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
####### TIMER #######
|
||||||
|
###########################
|
||||||
|
## Selection of the timer used by Kieker (classname)
|
||||||
|
## The value must be a fully-qualified classname of a class implementing
|
||||||
|
## kieker.monitoring.timer.ITimeSource and providing a constructor that
|
||||||
|
## accepts a single Configuration.
|
||||||
|
kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
|
||||||
|
|
||||||
|
####
|
||||||
|
#kieker.monitoring.timer=kieker.monitoring.timer.SystemMilliTimer
|
||||||
|
#
|
||||||
|
## A timer with millisecond precision.
|
||||||
|
#
|
||||||
|
## The offset of the timer. The time returned is since 1970-1-1
|
||||||
|
## minus this offset. If the offset is empty it is set to the current
|
||||||
|
## time.
|
||||||
|
## The offset must be specified in milliseconds.
|
||||||
|
kieker.monitoring.timer.SystemMilliTimer.offset=0
|
||||||
|
## The timeunit used to report the timestamp.
|
||||||
|
## Accepted values:
|
||||||
|
## 0 - nanoseconds
|
||||||
|
## 1 - microseconds
|
||||||
|
## 2 - milliseconds
|
||||||
|
## 3 - seconds
|
||||||
|
kieker.monitoring.timer.SystemMilliTimer.unit=0
|
||||||
|
|
||||||
|
####
|
||||||
|
#kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
|
||||||
|
#
|
||||||
|
## A timer with nanosecond precision.
|
||||||
|
#
|
||||||
|
## The offset of the timer. The time returned is since 1970-1-1
|
||||||
|
## minus this offset. If the offset is empty it is set to the current
|
||||||
|
## time.
|
||||||
|
## The offset must be specified in milliseconds.
|
||||||
|
kieker.monitoring.timer.SystemNanoTimer.offset=0
|
||||||
|
## The timeunit used to report the timestamp.
|
||||||
|
## Accepted values:
|
||||||
|
## 0 - nanoseconds
|
||||||
|
## 1 - microseconds
|
||||||
|
## 2 - milliseconds
|
||||||
|
## 3 - seconds
|
||||||
|
kieker.monitoring.timer.SystemNanoTimer.unit=0
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
####### WRITER #######
|
||||||
|
###########################
|
||||||
|
## Selection of monitoring data writer (classname)
|
||||||
|
## The value must be a fully-qualified classname of a class implementing
|
||||||
|
## kieker.monitoring.writer.IMonitoringWriter and providing a constructor that
|
||||||
|
## accepts an IMonitoringController and a single Configuration.
|
||||||
|
kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.DummyWriter
|
||||||
|
#
|
||||||
|
## Configuration Properties of the DummyWriter
|
||||||
|
kieker.monitoring.writer.DummyWriter.key=value
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.PrintStreamWriter
|
||||||
|
#
|
||||||
|
## The PrintStream used to print the monitoring records.
|
||||||
|
## Either STDOUT or STDERR.
|
||||||
|
## Other values are used as a filenames for a target log file.
|
||||||
|
## You should use AsyncFsWriter instead of this writer for logging to files!
|
||||||
|
kieker.monitoring.writer.PrintStreamWriter.Stream=STDOUT
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.SyncFsWriter
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or C:\\KiekerData (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## The maximal file size of the generated monitoring log. Older files will be
|
||||||
|
## deleted if this file size is exceeded. Given in MiB.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.maxLogSize=-1
|
||||||
|
#
|
||||||
|
## The maximal number of log files generated. Older files will be
|
||||||
|
## deleted if this number is exceeded.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.maxLogFiles=-1
|
||||||
|
#
|
||||||
|
## When flushing is disabled, it could require a lot of records before
|
||||||
|
## finally any writing is done.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.flush=true
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
|
||||||
|
#
|
||||||
|
## When flushing is disabled, it could require a lot of records before
|
||||||
|
## finally any writing is done.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.flush=true
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or C:\\KiekerData (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## The maximal file size of the generated monitoring log. Older files will be
|
||||||
|
## deleted if this file size is exceeded. Given in MiB.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.maxLogSize=-1
|
||||||
|
#
|
||||||
|
## The maximal number of log files generated. Older files will be
|
||||||
|
## deleted if this number is exceeded.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.maxLogFiles=-1
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or C:\\KiekerData (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## The maximal file size of the generated monitoring log. Older files will be
|
||||||
|
## deleted if this file size is exceeded. Given in MiB.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxLogSize=-1
|
||||||
|
#
|
||||||
|
## The maximal number of log files generated. Older files will be
|
||||||
|
## deleted if this number is exceeded.
|
||||||
|
## At least one file will always remain, regardless of size!
|
||||||
|
## Use -1 to ignore this functionality.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxLogFiles=-1
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.namedRecordPipe.PipeWriter
|
||||||
|
#
|
||||||
|
## The name of the pipe used (must not be empty).
|
||||||
|
kieker.monitoring.writer.namedRecordPipe.PipeWriter.pipeName=kieker-pipe
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.jms.AsyncJMSWriter
|
||||||
|
#
|
||||||
|
## The url of the jndi provider that knows the jms service
|
||||||
|
## - ActiveMQ: tcp://127.0.0.1:61616/
|
||||||
|
## - HornetQ: jnp://localhost:1099/
|
||||||
|
## - OpenJMS: tcp://127.0.0.1:3035/
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.ProviderUrl=tcp://127.0.0.1:61616/
|
||||||
|
#
|
||||||
|
## The topic at the jms server which is used in the publisher/subscribe communication.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.Topic=queue1
|
||||||
|
#
|
||||||
|
## The type of the jms factory implementation, e.g.
|
||||||
|
## - ActiveMQ: org.apache.activemq.jndi.ActiveMQInitialContextFactory
|
||||||
|
## - HornetQ: org.jnp.interfaces.NamingContextFactory
|
||||||
|
## - OpenJMS: org.exolab.jms.jndi.InitialContextFactory
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.ContextFactoryType=org.apache.activemq.jndi.ActiveMQInitialContextFactory
|
||||||
|
#
|
||||||
|
## The service name for the jms connection factory.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.FactoryLookupName=ConnectionFactory
|
||||||
|
#
|
||||||
|
## The time that a jms message will be kept alive at the jms server before
|
||||||
|
## it is automatically deleted.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.MessageTimeToLive=10000
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.database.SyncDbWriter
|
||||||
|
#
|
||||||
|
## Database driver classname
|
||||||
|
## Examples:
|
||||||
|
## MySQL: com.mysql.jdbc.Driver
|
||||||
|
## DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
#
|
||||||
|
## Connection string
|
||||||
|
## Examples:
|
||||||
|
## MySQL: jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
|
||||||
|
## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
|
||||||
|
#
|
||||||
|
## Prefix for the names of the database tables
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.TablePrefix=kieker
|
||||||
|
#
|
||||||
|
## Drop already existing tables or terminate monitoring with an error.
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.DropTables=false
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.database.AsyncDbWriter
|
||||||
|
#
|
||||||
|
## Database driver classname
|
||||||
|
## MySQL: com.mysql.jdbc.Driver
|
||||||
|
## DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
#
|
||||||
|
## Connection string
|
||||||
|
## Examples:
|
||||||
|
## MySQL: jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
|
||||||
|
## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
|
||||||
|
#
|
||||||
|
## Prefix for the names of the database tables
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.TablePrefix=kieker
|
||||||
|
#
|
||||||
|
## Drop already existing tables or terminate monitoring with an error.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.DropTables=false
|
||||||
|
#
|
||||||
|
## The number of concurrent Database connections.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.numberOfConnections=4
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.jmx.JMXWriter
|
||||||
|
#
|
||||||
|
## The domain used to register the MonitoringLog. If empty, the value
|
||||||
|
## of "kieker.monitoring.jmx.domain" will be used.
|
||||||
|
kieker.monitoring.writer.jmx.JMXWriter.domain=
|
||||||
|
#
|
||||||
|
## The name of the MonitoringLog in the domain.
|
||||||
|
kieker.monitoring.writer.jmx.JMXWriter.logname=MonitoringLog
|
||||||
|
|
352
Umsetzung/kieker.properties
Normal file
|
@ -0,0 +1,352 @@
|
||||||
|
## In order to use a custom Kieker.Monitoring configuration, create a copy of
|
||||||
|
## this file and modify it according to your needs.
|
||||||
|
##
|
||||||
|
## The location of the file is passed to Kieker.Monitoring via the JVM parameter
|
||||||
|
## kieker.monitoring.configuration. For example, with a configuration file named
|
||||||
|
## my.kieker.monitoring.properties in the folder META-INF you would pass this location
|
||||||
|
## to the JVM when starting your application:
|
||||||
|
##
|
||||||
|
## java -Dkieker.monitoring.configuration=META-INF/my.kieker.monitoring.properties [...]
|
||||||
|
##
|
||||||
|
## If no configuration file is passed, Kieker tries to use a configuration file in
|
||||||
|
## META-INF/kieker.monitoring.properties
|
||||||
|
## If this also fails, a default configuration is being used according to the values in
|
||||||
|
## this default file.
|
||||||
|
|
||||||
|
# The name of the Kieker instance.
|
||||||
|
kieker.monitoring.name=KIEKER
|
||||||
|
|
||||||
|
# Whether a debug mode is activated.
|
||||||
|
# This changes a few internal id generation mechanisms to enable
|
||||||
|
# easier debugging. Additionally, it is possible to enable debug
|
||||||
|
# logging in the settings of the used logger.
|
||||||
|
# This setting should usually not be set to true.
|
||||||
|
kieker.monitoring.debug=false
|
||||||
|
|
||||||
|
# The name of the VM running Kieker. If empty the name will be determined
|
||||||
|
# automatically, else it will be set to the given value.
|
||||||
|
kieker.monitoring.hostname=
|
||||||
|
|
||||||
|
# The initial ID associated with all experiments. (currently not used)
|
||||||
|
kieker.monitoring.initialExperimentId=1
|
||||||
|
|
||||||
|
# Whether a shutdown hook should be registered.
|
||||||
|
# This ensures that necessary cleanup steps are finished and no
|
||||||
|
# information is lost due to asynchronous writers.
|
||||||
|
# This should usually not be set to false.
|
||||||
|
kieker.monitoring.useShutdownHook=true
|
||||||
|
|
||||||
|
# Whether any JMX functionality is available
|
||||||
|
kieker.monitoring.jmx=false
|
||||||
|
kieker.monitoring.jmx.domain=kieker.monitoring
|
||||||
|
|
||||||
|
# Enable/Disable the MonitoringController MBean
|
||||||
|
kieker.monitoring.jmx.MonitoringController=true
|
||||||
|
kieker.monitoring.jmx.MonitoringController.name=MonitoringController
|
||||||
|
|
||||||
|
# Controls JMX remote access
|
||||||
|
kieker.monitoring.jmx.remote=false
|
||||||
|
kieker.monitoring.jmx.remote.port=59999
|
||||||
|
kieker.monitoring.jmx.remote.name=JMXServer
|
||||||
|
# If the SUN-JMX Bootstrap class is not available, a fallback to the
|
||||||
|
# default implementation can be used. The fallback solution prevents
|
||||||
|
# the VM from terminating.
|
||||||
|
# A graceful shutdown is done by connecting to the JMXServer, there to
|
||||||
|
# kieker.monitoring.JMXServer and using the operation stop()
|
||||||
|
kieker.monitoring.jmx.remote.fallback=true
|
||||||
|
# These properties will be forwarded to configure the JMX server
|
||||||
|
com.sun.management.jmxremote.local.only=false
|
||||||
|
com.sun.management.jmxremote.authenticate=false
|
||||||
|
com.sun.management.jmxremote.ssl=false
|
||||||
|
|
||||||
|
# Enable/disable monitoring after startup (true|false; default: true)
|
||||||
|
# If monitoring is disabled, the MonitoringController simply pauses.
|
||||||
|
# Furthermore, probes should stop collecting new data and monitoring
|
||||||
|
# writers stop should stop writing existing data.
|
||||||
|
kieker.monitoring.enabled=true
|
||||||
|
|
||||||
|
# The size of the thread pool used to execute registered periodic sensor jobs.
|
||||||
|
kieker.monitoring.periodicSensorsExecutorPoolSize=1
|
||||||
|
|
||||||
|
# Enables/disable the automatic assignment of each record's logging timestamp
|
||||||
|
# (true|false; default: true)
|
||||||
|
kieker.monitoring.setLoggingTimestamp=true
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
####### TIMER #######
|
||||||
|
###########################
|
||||||
|
## Selection of the timer used by Kieker (classname)
|
||||||
|
## The value must be a fully-qualified classname of a class implementing
|
||||||
|
## kieker.monitoring.timer.ITimeSource and providing a constructor that
|
||||||
|
## accepts a single Configuration.
|
||||||
|
kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
|
||||||
|
|
||||||
|
####
|
||||||
|
#kieker.monitoring.timer=kieker.monitoring.timer.SystemMilliTimer
|
||||||
|
#
|
||||||
|
## The offset of the timer. The time returned is in milliseconds
|
||||||
|
## since 1970-1-1 minus this offset. If the offset is empty it is
|
||||||
|
## set to the current time.
|
||||||
|
kieker.monitoring.timer.SystemMilliTimer.offset=0
|
||||||
|
## The timeunit used to report the timestamp.
|
||||||
|
## Accepted values:
|
||||||
|
## 0 - nanoseconds
|
||||||
|
## 1 - microseconds
|
||||||
|
## 2 - milliseconds
|
||||||
|
## 3 - seconds
|
||||||
|
kieker.monitoring.timer.SystemMilliTimer.unit=0
|
||||||
|
|
||||||
|
####
|
||||||
|
#kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
|
||||||
|
#
|
||||||
|
## The offset of the timer. The time returned is in nanoseconds
|
||||||
|
## since 1970-1-1 minus this offset. If the offset is empty it is
|
||||||
|
## set to the current time. The offset must be specified in milliseconds.
|
||||||
|
kieker.monitoring.timer.SystemNanoTimer.offset=0
|
||||||
|
## The timeunit used to report the timestamp.
|
||||||
|
## Accepted values:
|
||||||
|
## 0 - nanoseconds
|
||||||
|
## 1 - microseconds
|
||||||
|
## 2 - milliseconds
|
||||||
|
## 3 - seconds
|
||||||
|
kieker.monitoring.timer.SystemNanoTimer.unit=0
|
||||||
|
|
||||||
|
###########################
|
||||||
|
####### WRITER #######
|
||||||
|
###########################
|
||||||
|
## Selection of monitoring data writer (classname)
|
||||||
|
## The value must be a fully-qualified classname of a class implementing
|
||||||
|
## kieker.monitoring.writer.IMonitoringWriter and providing a constructor that
|
||||||
|
## accepts an IMonitoringController and a single Configuration.
|
||||||
|
kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.DummyWriter
|
||||||
|
#
|
||||||
|
## Configuration Properties of the DummyWriter
|
||||||
|
kieker.monitoring.writer.DummyWriter.key=value
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.PrintStreamWriter
|
||||||
|
#
|
||||||
|
## The PrintStream used to print the monitoring records.
|
||||||
|
## Either STDOUT or STDERR.
|
||||||
|
## Other values are used as a filenames for a target log file.
|
||||||
|
## You should use AsyncFsWriter instead of this writer for logging to files!
|
||||||
|
kieker.monitoring.writer.PrintStreamWriter.Stream=STDOUT
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.SyncFsWriter
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or "C:\KiekerData" (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## When flushing is disabled, it could require a lot of records before
|
||||||
|
## finally any writing is done.
|
||||||
|
kieker.monitoring.writer.filesystem.SyncFsWriter.flush=true
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
|
||||||
|
#
|
||||||
|
## When flushing is disabled, it could require a lot of records before
|
||||||
|
## finally any writing is done.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.flush=true
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or "C:\KiekerData" (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueFullBehavior=1
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncFsWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter
|
||||||
|
#
|
||||||
|
## In order to use the default temporary directory, set the property value of
|
||||||
|
## storeInJavaIoTmpdir to true.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.storeInJavaIoTmpdir=true
|
||||||
|
#
|
||||||
|
## In order to use a custom directory, set storeInJavaIoTmpdir=false
|
||||||
|
## and set customStoragePath as desired. Examples:
|
||||||
|
## /var/kieker or "C:\KiekerData" (ensure the folder exists).
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.customStoragePath=.
|
||||||
|
#
|
||||||
|
## The maximal number of entries (records) per created file.
|
||||||
|
## Must be greater than zero.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxEntriesInFile=25000
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.namedRecordPipe.PipeWriter
|
||||||
|
#
|
||||||
|
## The name of the pipe used (must not be empty).
|
||||||
|
kieker.monitoring.writer.namedRecordPipe.PipeWriter.pipeName=kieker-pipe
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.jms.AsyncJMSWriter
|
||||||
|
#
|
||||||
|
## The url of the jndi provider that knows the jms service
|
||||||
|
## - ActiveMQ: tcp://127.0.0.1:61616/
|
||||||
|
## - HornetQ: jnp://localhost:1099/
|
||||||
|
## - OpenJMS: tcp://127.0.0.1:3035/
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.ProviderUrl=tcp://127.0.0.1:61616/
|
||||||
|
#
|
||||||
|
## The topic at the jms server which is used in the publisher/subscribe communication.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.Topic=queue1
|
||||||
|
#
|
||||||
|
## The type of the jms factory implementation, e.g.
|
||||||
|
## - ActiveMQ: org.apache.activemq.jndi.ActiveMQInitialContextFactory
|
||||||
|
## - HornetQ: org.jnp.interfaces.NamingContextFactory
|
||||||
|
## - OpenJMS: org.exolab.jms.jndi.InitialContextFactory
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.ContextFactoryType=org.apache.activemq.jndi.ActiveMQInitialContextFactory
|
||||||
|
#
|
||||||
|
## The service name for the jms connection factory.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.FactoryLookupName=ConnectionFactory
|
||||||
|
#
|
||||||
|
## The time that a jms message will be kept alive at the jms server before
|
||||||
|
## it is automatically deleted.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.MessageTimeToLive=10000
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.jms.AsyncJMSWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.database.SyncDbWriter
|
||||||
|
#
|
||||||
|
## Database driver classname
|
||||||
|
## Examples:
|
||||||
|
## MySQL: com.mysql.jdbc.Driver
|
||||||
|
## DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
#
|
||||||
|
## Connection string
|
||||||
|
## Examples:
|
||||||
|
## MySQL: jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
|
||||||
|
## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
|
||||||
|
#
|
||||||
|
## Prefix for the names of the database tables
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.TablePrefix=kieker
|
||||||
|
#
|
||||||
|
## Drop already existing tables or terminate monitoring with an error.
|
||||||
|
kieker.monitoring.writer.database.SyncDbWriter.DropTables=false
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.database.AsyncDbWriter
|
||||||
|
#
|
||||||
|
## Database driver classname
|
||||||
|
## MySQL: com.mysql.jdbc.Driver
|
||||||
|
## DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
|
||||||
|
#
|
||||||
|
## Connection string
|
||||||
|
## Examples:
|
||||||
|
## MySQL: jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
|
||||||
|
## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
|
||||||
|
#
|
||||||
|
## Prefix for the names of the database tables
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.TablePrefix=kieker
|
||||||
|
#
|
||||||
|
## Drop already existing tables or terminate monitoring with an error.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.DropTables=false
|
||||||
|
#
|
||||||
|
## The number of concurrent Database connections.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.numberOfConnections=4
|
||||||
|
#
|
||||||
|
## Asynchronous writers need to store monitoring records in an internal buffer.
|
||||||
|
## This parameter defines its capacity in terms of the number of records.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.QueueSize=10000
|
||||||
|
#
|
||||||
|
## Behavior of the asynchronous writer when the internal queue is full:
|
||||||
|
## 0: terminate Monitoring with an error (default)
|
||||||
|
## 1: writer blocks until queue capacity is available
|
||||||
|
## 2: writer discards new records until space is available
|
||||||
|
## Be careful when using the value '1' since then, the asynchronous writer
|
||||||
|
## is no longer decoupled from the monitored application.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.QueueFullBehavior=0
|
||||||
|
#
|
||||||
|
## Maximum time to wait for the writer threads to finish (in milliseconds).
|
||||||
|
## A MaxShutdownDelay of -1 means infinite waiting.
|
||||||
|
kieker.monitoring.writer.database.AsyncDbWriter.MaxShutdownDelay=-1
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
#kieker.monitoring.writer=kieker.monitoring.writer.jmx.JMXWriter
|
||||||
|
#
|
||||||
|
## The domain used to register the MonitoringLog. If empty, the value
|
||||||
|
## of "kieker.monitoring.jmx.domain" will be used.
|
||||||
|
kieker.monitoring.writer.jmx.JMXWriter.domain=
|
||||||
|
#
|
||||||
|
## The name of the MonitoringLog in the domain.
|
||||||
|
kieker.monitoring.writer.jmx.JMXWriter.logname=MonitoringLog
|
||||||
|
|