% !TeX root = ../../thesis.tex

\chapter{Performance-Untersuchung}
\label{ch:performance-checking}

\section{Auswertung des Systems}
\label{sec:performance-checking:system}

\mytodos{Hier die Auswertung des Produktionsservers unterbringen}

\section{Statistiken im PostgreSQL auswerten}
\label{sec:performance-checking:postgresql-statistics}

\mytodos{Logs auswerten, am besten vom Produktionsserver. Ebenfalls sollte man die Webseite
prüfen, die den Cache von OpenJPE auswerten}

\section{Überprüfung des PostgreSQL und Servers}
\label{sec:performance-checking:postgresql-checking}

\mytodos{Konfiguration vom Produktionsserver prüfen}

\section{Einbau und Aktivieren von Performance-Messung}
\label{sec:performance-checking:performance-measure}

Um eine Messung der Performance in der Webseite durchführen zu können, gibt es in \ac{JSF} die Möglichkeit, über eine
eigene Implementierung der Klasse \textbf{ViewDeclarationLanguageWrapper} sich in das generieren der Webseite
einzuhängen. Hierbei können die Funktionen für das erstellen, des bauen und das rendern der Webseite überschrieben
werden. In den überschriebenen Funktionen werden nun Laufzeiten gemessen und die ermittelten Zeiten mit einer Kennung
in die Log"=Datei eingetragen. Durch die Kennung, können die Zeiten im Nachgang über ein Script ermittelt und
ausgewertet werden.

Zusätzlich wird noch eine Implementierung der zugehörigen Factory"=Klasse \textbf{ViewDeclarationLanguageFactory}
benötigt. Durch diese Factory"=Klasse wird der eigentlichen Wrapper mit der Performance-Messung in die Bearbeitungsschicht
eingehängt. Diese Implementierung wird dann noch in der \textbf{faces-config.xml} eingetragen, wie das in
\ref{lst:activate-factory} gezeigt wird, damit die Factory durch das System aufgerufen wird.

\begin{lstlisting}[language=xml,caption={Einbindung Factory},label=lst:activate-factory]
<factory>
  <view-declaration-language-factory>
    de.wedekind.utils.VdlLoggerFactory
  </view-declaration-language-factory>
</factor>
\end{lstlisting}

Der Quellcode der Klassen ist im Anhang zu finden, unter \ref{ap:jsf_performance_measure} zu finden.

Um die Abfragen im \textit{PostgreSQL} untersuchen zu können, ist es am leichtesten, wenn man die Konfiguration so
anpasst, dass alle Abfragen mit entsprechenden Zeitmessungen in die Log"=Datei des ausgegeben werden. 
Zu erst werden über die Einstellungen unter \ref{lst:postgresql_logfile} die Datei und das Format definiert.

\begin{lstlisting}[language=yaml,caption={PostgreSQL Dateikonfiguration},label=lst:postgresql_logfile]
log_destination = 'jsonlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0640
log_rotation_size = 100MB
\end{lstlisting}

Über die Konfiguration unter \ref{lst:postgresql_logconf} wird definiert welche Werte mit protokolliert werden. Die
wichtigste Einstellung ist \textit{log\_min\_duration\_statement}, diese definiert ab welcher Laufzeit eine Abfrage
protokolliert werden soll. Mit dem Wert 0 werden alle Abfragen protokolliert. Alle weitere Einstellungen sind so
gesetzt, dass nicht unnötige Abfragen für die spätere Auswertung mit \textit{pgBadger} protokolliert werden.

\begin{lstlisting}[language=yaml,caption={PostgreSQL Ausgabekonfiguration},label=lst:postgresql_logconf]
log_min_duration_statement = 0
log_autovacuum_min_duration = 10
log_checkpoints = off
log_connections = on
log_disconnections = on
log_disconnections = on
log_duration = off
log_error_verbosity = default
log_hostname = on
log_lock_waits = on
log_statement = 'none'
log_temp_files = -1
log_timezone = 'Europe/Berlin'
\end{lstlisting}
