kieker 1.4 user guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf ·...

89
http://kieker.sourceforge.net Kieker 1.4 User Guide Nils Ehmke, Andr´ e van Hoorn * , and Reiner Jung October 13, 2011 Software Engineering Group, http://se.informatik.uni-kiel.de Dept. Computer Science, Christian Albrechts University of Kiel, Germany * Corresponding author; e-mail: [email protected]

Upload: others

Post on 13-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

http://kieker.sourceforge.net

Kieker 1.4 User Guide

Nils Ehmke, Andre van Hoorn∗, and Reiner Jung

October 13, 2011

Software Engineering Group, http://se.informatik.uni-kiel.deDept. Computer Science, Christian Albrechts University of Kiel, Germany

∗Corresponding author; e-mail: [email protected]

Page 2: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Contents

1 Introduction 31.1 What is Kieker? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Framework Components and Extension Points . . . . . . . . . . . . . . . . . 41.3 Licensing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4 Structure of this User Guide . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Quick Start Example 72.1 Download and Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Bookstore Example Application . . . . . . . . . . . . . . . . . . . . . . . . . 82.3 Monitoring with Kieker.Monitoring . . . . . . . . . . . . . . . . . . . . . . . 122.4 Analysis with Kieker.Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3 Kieker.Monitoring Component 203.1 Monitoring Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.2 Kieker.Monitoring Configuration . . . . . . . . . . . . . . . . . . . . . . . . 223.3 Monitoring Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.4 Monitoring Probes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.5 Monitoring Writers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4 Kieker.Analysis Component 304.1 Analysis Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.2 Monitoring Readers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.3 Analysis Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.4 Monitoring Record Consumer Plugins . . . . . . . . . . . . . . . . . . . . . . 32

5 Kieker.TraceAnalysis Tool 355.1 Monitoring Trace Information . . . . . . . . . . . . . . . . . . . . . . . . . . 365.2 Trace Analysis and Visualization . . . . . . . . . . . . . . . . . . . . . . . . 415.3 Example Kieker.TraceAnalysis Outputs . . . . . . . . . . . . . . . . . . . . . 43

Appendix 51

Bibliography 89

Kieker 1.4 User Guide 2

Page 3: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

1 Introduction

Modern software applications are often complex and have to fulfill a large set of functionaland non-functional properties. The internal behavior of such large systems cannot easilybe determined on the basis of the source code. Furthermore, existing applications oftenlack sufficient documentation which makes it cumbersome to extend and change themfor future needs. A solution to these problems can be monitoring, which allows to logthe behavior of the application and to discover the application-internal control flows andresponse times of method executions.

The monitoring of the behavior can help in detecting performance problems and faultybehavior, capacity planning, and many other areas. The Kieker framework provides thenecessary monitoring capabilities and comes with tools and libraries for the analysis ofmonitored data. Kieker was designed for continuous monitoring in production systemsinducing only a very low overhead. Further information on the overhead caused by Kiekeris provided at http://kieker.sourceforge.net/overhead-evaluation/.

1.1 What is Kieker?

The present version of Kieker is a monitoring and analysis framework for Java applica-tions. Support for other platforms, such as Visual Basic 6 and .NET, is currently underdevelopment.1 Figure 1.1 shows the framework’s composition based on the two maincomponents Kieker.Monitoring and Kieker.Analysis.

AnalysisPlugin

AnalysisController

Monitoring Log Reader

Monitoring Probe

Monitoring Controller

Monitoring Log Writer

Monitoring Log/Stream

Monitoring Record

Kieker.TraceAnalysis

Figure 1.1: Overview of the framework components

1Contact us directly if you are interested in Kieker support for Visual Basic 6 and .NET

Kieker 1.4 User Guide 3

Page 4: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The Kieker.Monitoring component is responsible for program instrumentation, data col-lection, and logging. Its core is the MonitoringController. The component Kieker.-Analysis is responsible for reading, analyzing, and visualizing the monitoring data. Itscore is the AnalysisController which manages the life-cycle of the monitoring readerand all analysis plugins.

The monitoring and analysis parts of the Kieker framework are composed of subcom-ponents which represent the different functionalities of the monitoring and analysis tasks.The important interaction pattern among the components is illustrated in Figure 1.2 butwill be explained furthermore throughout the course of this user guide.

: IMonitoringWriter : IMonitoringReader

: IMonitoringRecord

: AnalysisController: MonitoringController

record = new MonitoringRecordImpl(...)1.1:

1

newMonitoringRecord(record)4.2:

record = initFromArray(...)4.1:

1

newMonitoringRecord(record)1.2:

1toArray()3:

1

1

newMonitoringRecord(record)2:

1

1

*

1

**

*: IMonitoringRecordConsumerPlugin: IMonitoringProbe

*

*

Figure 1.2: Communication among Kieker framework components

The monitoring probes create the monitoring records containing the monitoring dataand deliver them to the monitoring controller. The monitoring controller employs themonitoring writers to write these monitoring records to a monitoring log or stream.For analyzing purposes, a monitoring reader reads the records from the monitoringlog/stream. These records can then be further processed by the analysis plugins.

1.2 Framework Components and Extension Points

Figure 1.3 depicts the possible extension points for custom components as well as thecomponents which are already included in the Kieker distribution and detailed below.

• Monitoring writers and corresponding readers for file systems and SQLdatabases, for in-memory record streams (named pipes), as well writer and read-ers employing Java Management Extensions (JMX) [4] and Java Messaging Ser-vice (JMS) [3] technology. A special reader allows to replay existing persistentmonitoring logs, for example to emulate incoming monitoring data—also in real-time.• A time source utilizing Java’s System.nanoTime() method.

Kieker 1.4 User Guide 4

Page 5: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Monitoring Records

Cur

rent

tim

e

Mem

ory/

swap

usa

ge

CP

U u

tiliz

atio

n

Ope

ratio

n ex

ecut

ion

Res

ourc

e ut

iliza

tion

<yo

ur m

onito

ring

reco

rd ty

pe>

Kieker.Monitoring

Periodic Sampling

JMX Interface

Logging

Time Source

Monitoring Writer

Monitoring Controller

Monitoring Probe

Logging Seria-lization

Deseria-lization

Monitoring Record

Kieker.Analysis

Monitoring Reader

Analysis /Visualization

Plug-In

Analysis Controller

Monitoring WritersMonitoring Probes/Samplers Time Sources

File

sys

tem

Dat

abas

e (S

QL)

<yo

ur m

onito

ring

writ

er>

Asynchr. writers Syncr.Sys

tem

tim

e (n

anos

)

<yo

ur ti

me

sour

ce>

Control-flowtracing

Spr

ing

Asp

ectJ

Ser

vlet

CX

F/S

OA

P

Man

ual i

nstr

umen

tatio

n

<yo

ur in

terc

eptio

n te

chno

logy

>

Resourcemonitoring

<yo

ur te

chno

logy

>

CP

U u

tiliz

atio

n

Mem

ory

usag

e

Sigar

Servlet

<yo

ur m

onito

ring

prob

e>

File

sys

tem

Dat

abas

e (S

QL)

Java

Mes

sagi

ng S

ervc

ice

(JM

S)

Java

Man

agem

ent E

xt.

(JM

X)

Nam

ed p

ipe

<yo

ur m

onito

ring

read

er>

File

sys

tem

Nam

ed p

ipe

Rea

l-tim

e re

play

er

Monitoring Readers

<yo

ur v

isua

lizat

ion>

Seq

uenc

e di

agra

ms

Dep

ende

ncy

grap

hs

Cal

l gra

phs

Visualization

Architecture reconstr.

Pipe and filter framework

Analysis/Visualization Plug-Ins

<yo

ur tr

ace

anal

ysis

>

Trace analysis <yo

ur r

econ

stru

ctio

n pl

ug-in

>

<yo

ur

an

aly

sis

plu

g-i

n/t

oo

l>

Java

Mes

sagi

ng S

ervc

ie (

JMS

)

Java

Man

agem

ent E

xt.

(JM

X)

Figure 1.3: Kieker framework components and extension points for custom components

• Monitoring record types allowing to store monitoring data about operationexecutions (including timing, control-flow, and session information), CPU and re-source utilization, memory/swap usage, as well as a record type which can be usedto store the current time.• Monitoring probes: A special feature of Kieker is the ability to monitor (dis-

tributed) traces of method executions and corresponding timing information. Formonitoring this data, Kieker includes monitoring probes employing AspectJ [9],Java EE Servlet [5], Spring [6], and Apache CXF [7] technology. Additionally,Kieker includes probes for (periodic) system-level resource monitoring employingthe Sigar library [1].• Analysis/Visualization plugins can be assembled to pipe-and-filter architec-

tures based on input and output ports. The Kieker.TraceAnalysis tool (Figure 1.1)is itself implemented based on a re-usable set of Kieker.Analysis plugins allowing toreconstruct and visualize architectural models of the monitored systems, e.g., asdependency graphs, sequence diagrams, and call trees.

1.3 Licensing

Kieker is licensed under the Apache License, Version 2.0. You may obtain a copy of thelicense at http://www.apache.org/licenses/LICENSE-2.0.

The Kieker source and binary release archives include a number of third-party libraries.Appendix I lists these libraries along with information on the licenses. The lib/ directoryof the release archives contains a .LICENSE file for each third-party library, pointing tothe respective license text.

Kieker 1.4 User Guide 5

Page 6: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

1.4 Structure of this User Guide

Based on a simple example, Chapter 2 demonstrates how to manually instrument Javaprograms with Kieker.Monitoring in order to monitor timing information of method ex-ecutions, and how to use Kieker.Analysis to analyze the monitored data. Chapter 3provides a more detailed description of Kieker.Monitoring and shows how to implementand use custom monitoring records, monitoring probes, and monitoring writers. A moredetailed description of Kieker.Analysis and how to implement and use custom monitor-ing readers, and analysis plugins follows in Chapter 4. Chapter 5 demonstrates howto use Kieker.TraceAnalysis for monitoring, analyzing, and visualizing trace information.Additional resources are included in the Appendix.

RThe Java sources presented in this user guide, as well as pre-compiledbinaries, are included in the examples/userguide/ directory of theKieker distribution (see Section 2.1). Also, the example directories canbe imported as Eclipse projects.

Kieker 1.4 User Guide 6

Page 7: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

2 Quick Start Example

This chapter provides a brief introduction to Kieker based on a simple Bookstore exampleapplication. Section 2.1 explains how to download and install Kieker. The Bookstoreapplication itself is introduced in Section 2.2, while the following sections demonstratehow to use Kieker for monitoring (Section 2.3) and analyzing (Section 2.4) the resultingmonitoring data.

2.1 Download and Installation

The Kieker download site1 provides archives of the binary and source distribution, theJavadoc API, as well as additional examples. For this quick start guide, Kieker’s binarydistribution, e.g., kieker-1.4_binaries.zip, is required and must be downloaded. Af-ter having extracted the archive, you’ll find the directory structure and contents shownin Figure 2.1.

kieker-1.4/

bin/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Call scripts for Kieker tools

. . .

dist/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Kieker framework libraries

kieker-1.4.jar

kieker-monitoring-servlet-1.4.war

doc/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

kieker-1.4 userguide.pdf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PDF file of this document

examples/

userguide/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Source code of the examples in this document

. . .

lib/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Libraries required by Kieker

commons-logging-1.1.1.jar

. . .

META-INF/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Example configuration files

kieker.monitoring.properties

. . .

Figure 2.1: Directory structure and contents of Kieker’s binary distribution

1http://sourceforge.net/projects/kieker/files

Kieker 1.4 User Guide 7

Page 8: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The Java sources presented in this user guide, as well as pre-compiled binaries, areincluded in the examples/userguide/ directory. The file kieker-1.4.jar containsthe Kieker.Monitoring and Kieker.Analysis components, as well as the Kieker.TraceAnalysistool. A Servlet-based Web application, provided in kieker-monitoring-servlet-1.4.war,can be used to control the status of Kieker.Monitoring in Java EE environments. Thesample Kieker.Monitoring configuration file kieker.monitoring.properties will be de-tailed in Chapter 3. Since Kieker uses the Apache Commons library [8] as a logginginterface, the file commons-logging-1.1.1.jar is the only dependency to a third-partylibrary which is needed to execute Kieker in any case.

2.2 Bookstore Example Application

The Bookstore application is a small sample application resembling a simple bookstorewith a market-place facility where users can search for books in an online catalog, andsubsequently get offers from different book sellers. Figure 2.2 shows a class diagram de-scribing the structure of the bookstore and a sequence diagram illustrating the dynamicsof the application.

(a)

crm:CRMcatalog:Catalogbookstore:BookstoreBookstoreStarter

searchBook

getOffers

main

getBook

getBook

(b)

Figure 2.2: UML class diagram (a) and sequence diagram (b) of the Bookstore application

Kieker 1.4 User Guide 8

Page 9: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The bookstore contains a catalog for books and a customer relationship managementsystem (CRM) for the book sellers. To provide this service, the different classes provideoperations to initialize the application, search for books, and get offers or searched books.In this example, the methods implementing these operations are merely stubs. However,for the illustration of Kieker they are sufficient and the inclined reader may extend theapplication into a real bookstore.

The directory structure of the Bookstore example is shown in Figure 2.3 and com-prises four Java classes in its source directory src/bookstoreApplication/ which areexplained in detail below.

examples/

userguide/

ch2–bookstore-application/

src/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The directory for the source code files

bookstoreApplication/

Bookstore.java

BookstoreStarter.java

Catalog.java

CRM.java

build.properties

build.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Optional built script for the application

Figure 2.3: The directory structure of the Bookstore application

RThe Java sources and a pre-compiled binary of the uninstrumentedBookstore application can be found in the examples/userguide/ch2-

bookstore-application/ directory.

The class BookstoreStarter, shown in Listing 2.1, contains the application’s mainmethod, i.e., the program start routine. It initializes the Bookstore and issues fivesearch requests by calling the searchBook method of the bookstore object.

21 package bookstoreApplication;2223 public class BookstoreStarter {2425 public static void main(String [] args) {26 Bookstore bookstore = new Bookstore();27 for ( int i = 0; i < 5; i++) {28 System.out. println (”Bookstore.main: Starting request ” + i) ;29 bookstore.searchBook();30 }31 }32 }

Listing 2.1: BookstoreStarter.java

Kieker 1.4 User Guide 9

Page 10: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The Bookstore, shown in Listing 2.2, contains a catalog and a CRM object, representingthe catalog of the bookstore and a customer relationship management system which canprovide offers for books out of the catalog. The business method of the bookstore issearchBook() which will first check the catalog for books and then check for offers.

In a real application these methods would pass objects to ensure the results of thecatalog search will be available to the offer collecting method. However, for our examplewe omitted such code.

21 package bookstoreApplication;2223 public class Bookstore {2425 private final Catalog catalog = new Catalog();26 private final CRM crm = new CRM(catalog);2728 public void searchBook() {29 catalog .getBook(false) ;30 crm.getOffers () ;31 }32 }

Listing 2.2: Bookstore.java

The customer relationship management for this application is modeled in the CRM classshown in Listing 2.3. It only provides a business method to collect offers which usesthe catalog for some lookup. The additional catalog lookup is later used to illustratedifferent traces in the application.

21 package bookstoreApplication;2223 public class CRM {24 private final Catalog catalog ;2526 public CRM(final Catalog catalog) {27 this . catalog = catalog;28 }2930 public void getOffers () {31 catalog .getBook(false) ;32 }33 }

Listing 2.3: CRM.java

Kieker 1.4 User Guide 10

Page 11: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The final class is Catalog shown in Listing 2.4. It resembles the catalog component inthe application.

21 package bookstoreApplication;2223 public class Catalog {2425 public void getBook(final boolean complexQuery) { }26 }

Listing 2.4: Catalog.java

After this brief introduction of the application and its implementation, the next step is tosee the example running. To compile and run the example, the commands in Listing 2.5can be executed. This document assumes that the reader enters the commands in theexample directory. For this first example this is examples/userquide/ch2-bookstore-application/.

RWindows comes with two command-line interpreters called cmd.exe

and command.com. Only the first one is able to handle wildcards cor-rectly. So we recommend using cmd.exe for these examples.

> mkdir build> javac src/bookstoreApplication/∗ .java −d build

> java −classpath build bookstoreApplication.BookstoreStarter

Listing 2.5: Commands to compile and run the Bookstore application

The first command compiles the application and places the resulting four class files inthe build/ directory. To verify the build process, the build/ directory can be inspected.The second command loads the bookstore application and produces the output shownin Listing 2.6.

Bookstore.main: Starting request 0Bookstore.main: Starting request 1Bookstore.main: Starting request 2Bookstore.main: Starting request 3Bookstore.main: Starting request 4

Listing 2.6: Example run of the Bookstore application

In this section, the Kieker example application was introduced and when everything wentwell, the bookstore is a runnable program. Furthermore, the composition of the appli-cation and its function should now be present. The next Section 2.3 will demonstratehow to monitor this example application employing Kieker.Monitoring using manual in-strumentation.

Kieker 1.4 User Guide 11

Page 12: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

2.3 Monitoring with Kieker.Monitoring

In the previous Sections 2.1 and 2.2, the Kieker installation and the example applicationhave been introduced. In this section, the preparations for application monitoring, theinstrumentation of the application, and the actual monitoring are explained.

!In this example, the instrumentation is done manually. This meansthat the monitoring probe is implemented by mixing monitoring logicwith business logic, which is often not desired since the resulting codeis hardly maintainable. Kieker includes probes based on AOP (aspect-oriented programming, [2]) technology, as covered by Chapter 5. How-ever, to illustrate the instrumentation in detail, the quick start exampleuses manual instrumentation.

The first step is to copy the Kieker jar-file kieker-1.4.jar to the lib/ directory ofthe example directory (see Section 2.2). The file is located in the kieker-1.4/dist/

directory of the extracted Kieker archive, as described in Section 2.1. The file commons-

logging-1.1.1.jar is located in the kieker-1.4/lib/ directory and has to be copied tothe lib/ directory of the example application. The final layout of the example directoryis illustrated in Figure 2.4.

examples/

userguide/

ch2–manual-instrumentation/

build/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Directory for the Java class files

lib/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directory for the required libraries

kieker-1.4.jar

commons-logging-1.1.1.jar

src/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The directory for the source code files

. . .

Figure 2.4: The directory structure of the Bookstore application with Kieker libraries

RThe Java sources and pre-compiled binaries of the manually instru-mented Bookstore application described in this section can be found inthe examples/userguide/ch2-manual-instrumentation/ directory.

Kieker maintains monitoring data as so-called monitoring records. Section 3.3 describeshow to define and use custom monitoring record types. The monitoring record typeused in this example is an operation execution record which is included in the Kieker

Kieker 1.4 User Guide 12

Page 13: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

distribution. Figure 2.5 shows the attributes which are relevant to this example. Therecord type will be detailed in Chapter 5 .

OperationExecutionRecord

(from kieker::common::record)

+ className : String

+ operationName : String

+ tin : long

+ tout : long+ ...

AbstractMonitoringRecord

(from kieker::common::record)

«interface»

IMonitoringRecord

(from kieker::common::record)

Figure 2.5: The class diagram of the operation execution record

The attributes relevant to this part are className and operationName for the class andmethod name, as well as tin and tout for the timestamp before and after the call of theinstrumented method.

Listing 2.7 shows the instrumentation of the Bookstore class and its method search-Book(). In the lines 32 and 33, the monitoring controller is instantiated. It provides themonitoring service for the instrumentation.

32 private final static IMonitoringController MONITORING CONTROLLER =33 MonitoringController . getInstance () ;3435 public void searchBook() {36 /∗ 1.) Call the Catalog component’s getBook() method37 ∗ and log its entry and exit timestamp using Kieker. ∗/38 final long tin = Bookstore.MONITORING CONTROLLER.getTimeSource().getTime();39 this . catalog .getBook(false) ;40 final long tout = Bookstore.MONITORING CONTROLLER.getTimeSource().getTime

();41 final OperationExecutionRecord e =42 new OperationExecutionRecord(43 Catalog. class .getName(), ”getBook(..) ”,44 tin , tout) ;45 Bookstore.MONITORING CONTROLLER.newMonitoringRecord(e);4647 /∗ 2.) Call the CRM catalog’s getOffers() method48 ∗ (without monitoring). ∗/49 this .crm.getOffers () ;50 }

Listing 2.7: Instrumentation of the getBook() call in Bookstore.java

Kieker 1.4 User Guide 13

Page 14: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The lines 38 and 40 are used to determine the current time in nanoseconds before andafter the getBook() call. In lines 41 to 44, a monitoring record for this measurementis created and initialized with the two time values. Additionally, the record has anattribute for the involved class Catalog and the called method getBook(). Finally therecord is handed over to the monitoring controller which calls a monitoring writer topersist the record. In this example, the filesystem writer is used—Kieker uses this writerby default when no other writer is specified, as detailed in Section 3.5.

In addition to the instrumentation in the Bookstore class, the getOffers() method ofthe CRM class is instrumented as well. Similar to Listing 2.7, measurements are takenbefore and after the call of the catalog’s getBook() method, as shown in lines 40 and 42of Listing 2.8. Not shown in the listing is the instantiation of the monitoring controller.However, it is done in the same way as illustrated in Listing 2.7. Finally, a record iscreated (see lines 43–46) and stored by calling the monitoring controller (see line 47).

37 public void getOffers () {38 /∗ Call the Catalog component’s getBook() method39 ∗ and log its entry and exit timestamp using Kieker. ∗/40 final long tin = CRM.MONITORING CONTROLLER.getTimeSource().getTime();41 this . catalog .getBook(false) ;42 final long tout = CRM.MONITORING CONTROLLER.getTimeSource().getTime();43 final OperationExecutionRecord e =44 new OperationExecutionRecord(45 Catalog. class .getName(), ”getBook()”,46 tin , tout) ;47 CRM.MONITORING CONTROLLER.newMonitoringRecord(e);48 }

Listing 2.8: Instrumentation of the getBook() call in CRM.java

The next step after instrumenting the code is running the instrumented application.Listing 2.9 shows the commands to compile and run the application under UNIX-likesystems. Listing 2.10 shows the same commands for Windows. The expected workingdirectory is the base directory of this example, i.e. examples/userguide/ch2-manual-

instrumentation/.

. mkdir build

. javac src/bookstoreApplication/∗ .java −classpath lib/kieker-1.4.jar −d build/

. java −classpath build/:lib /kieker-1.4.jar:lib /commons-logging-1.1.1.jarbookstoreApplication.BookstoreStarter

Listing 2.9: Commands to compile and run the instrumented Bookstore under UNIX-likesystems

!Under Windows it is necessary to separate the classpath elements by asemicolon instead of a colon. Also, we recommend to use the Windowsshell cmd.exe for this tutorial since problems have been reported forthe Windows PowerShell.

Kieker 1.4 User Guide 14

Page 15: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

. mkdir build

. javac src\bookstoreApplication\∗ .java −classpath lib\kieker-1.4.jar −d build\

. java −classpath build\;lib \kieker-1.4.jar;lib \commons-logging-1.1.1.jarbookstoreApplication.BookstoreStarter

Listing 2.10: Commands to compile and run the instrumented Bookstore under Windows

If everything worked correctly, a new directory for the monitoring data with a namesimilar to kieker-20110427-142244899-UTC-Kaapstad-KIEKER-SINGLETON/ is created(see Figure 2.6). In Kieker’s default configuration, the log directory can be found in thedefault temporary directory: under UNIX-like systems, this is typically /tmp/; check theenvironment variables $TMPDIR or %temp% for the location under Mac OS or Windowsrespectively. The exact location of the created monitoring log is reported in Kieker’sconsole output (see for example Appendix G.1). The monitoring directory contains twotypes of files: .dat files containing text representations of the monitoring records and afile named kieker.map which contains information on the types of monitoring recordsused.

/tmp/

kieker-20110427-142244899-UTC-Kaapstad-KIEKER-SINGLETON/

kieker.map

kieker-20110427-142244920-UTC-Thread-1.dat

Figure 2.6: Directory structure after a monitoring run

The Listings 2.11 and 2.12 show example file contents. The .dat-file is saved in CSVformat (Comma Separated Values)—in this case, the values of a monitoring record areseparated by semicolons. To understand the .dat-file structure the semantics have tobe explained. For this quick start example only some of the values are relevant. Thefirst value $1 indicates the record type. The fourth value indicates the class and methodwhich has been called. And the seventh and eighth value are the start and end time ofthe execution of the called method.

$1;1303914164918306848;−1;bookstoreApplication.Catalog.getBook(..);N/A;−1;1303914164915013739;1303914164917124977;N/A;−1;−1

$1;1303914164920544967;−1;bookstoreApplication.Catalog.getBook();N/A;−1;1303914164918412684;1303914164920506469;N/A;−1;−1

Listing 2.11: kieker-20110427-142244920-UTC-Thread-1.dat (excerpt)

The second file is a simple mapping file referencing keys to monitoring record types. InListing 2.12 the key $1 is mapped to the type of operation execution records which wereused in the monitoring. The key value corresponds to the key values in the .dat-file.

$1=kieker.common.record.OperationExecutionRecord

Listing 2.12: kieker.map

Kieker 1.4 User Guide 15

Page 16: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

By the end of this section, two Java classes of the Bookstore application have beenmanually instrumented using Kieker.Monitoring and at least one run of the instrumentedapplication has been performed. The resulting monitoring log, written to the .dat-filein CSV format, could already be used for analysis or visualization by any spreadsheetor statistical tool. The following Section 2.4 will show how to process this monitoringdata with Kieker.Analysis.

2.4 Analysis with Kieker.Analysis

In this section, the monitoring data recorded in the previous section is analyzed withKieker.Analysis. For this quick example guide, the analysis tool is very simple anddoes not show the full potential of Kieker. For more detail read Chapter 5 which usesKieker.TraceAnalysis.

examples/

userguide/

ch2–manual-instrumentation/

build/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Directory for the Java class files

lib/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directory for the required libraries

. . .

kieker-1.4.jar

src/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The directory for the source code files

bookstoreApplication/

. . .

BookstoreAnalysisStarter.java

Consumer.java

Figure 2.7: Directory layout of the example application with the analysis files highlighted

The analysis application developed in this section comprises the files Consumer.java

and BookstoreAnalysisStarter.java, as shown in Figure 2.7. These files can also befound in the directory examples/userguide/ch2-manual-instrumentation/.

Listing 2.13 on page 17 shows the content of the Consumer.java file which implementsthe IMonitoringRecordConsumerPlugin interface. This is the standard interface forthe consumer of Kieker monitoring records. The consumer is part of the Kieker.Analysiscomponent. It processes records provided by the monitoring readers (see Chapter 1).The consumer checks if the response time of each method call, in this case getBook(),is below a specified threshold value. This threshold is set during construction of theConsumer class (see lines 33–35).

For the data analysis, the method newMonitoringRecord() (see lines 43–60) is used.

Kieker 1.4 User Guide 16

Page 17: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

21 package bookstoreApplication;2223 import java. util . Collection ;2425 import kieker . analysis . plugin .IMonitoringRecordConsumerPlugin;26 import kieker .common.record.IMonitoringRecord;27 import kieker .common.record.OperationExecutionRecord;2829 public class Consumer implements IMonitoringRecordConsumerPlugin {3031 private final long maxResponseTime;3233 public Consumer(final long maxResponseTime) {34 this .maxResponseTime = maxResponseTime;35 }3637 @Override38 public Collection <Class<? extends IMonitoringRecord>> getRecordTypeSubscriptionList() {39 return null ;40 }4142 @Override43 public boolean newMonitoringRecord(final IMonitoringRecord record) {44 if (!( record instanceof OperationExecutionRecord)) {45 return true ;46 }47 final OperationExecutionRecord rec = (OperationExecutionRecord) record;48 /∗ Derive response time from the record . ∗/49 final long responseTime = rec.getTout() − rec.getTin() ;50 /∗ Now compare with the response time threshold: ∗/51 if (responseTime > this.maxResponseTime) {52 System.err . println (”maximum response time exceeded by ”53 + (responseTime − this.maxResponseTime) + ” ns: ” + rec.getClassName()54 + ”. ” + rec.getOperationName());55 } else {56 System.out. println (”response time accepted: ” + rec.getClassName()57 + ”. ” + rec.getOperationName());58 }59 return true ;60 }6162 @Override63 public boolean execute() {64 return true ;65 }6667 @Override68 public void terminate( final boolean error) {}6970 }

Listing 2.13: Consumer.java

Kieker 1.4 User Guide 17

Page 18: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

This method is called for every monitoring record. At first, the method tests if themonitoring record is an OperationExecutionRecord, as this is the only record type itcan process. Then the method calculates the response time of one recorded getBook()call. If the method call takes longer than specified, a message is written directly to theerror stream.

The framework methods terminate and execute don’t do anything in this example, dueto the fact that this consumer does not need any initialization. If the consumer would,for example, use threads then these methods would be the correct location to start andstop them.

After implementing a consumer, the application’s main class has to be created. In thiscase the main program is located in the BookstoreAnalysisStarter.java file shownin Listing 2.14.

21 package bookstoreApplication;2223 import kieker . analysis . AnalysisController ;24 import kieker . analysis . plugin .MonitoringRecordConsumerException;25 import kieker . analysis . reader .MonitoringReaderException;26 import kieker . analysis . reader . filesystem .FSReader;2728 public class BookstoreAnalysisStarter {2930 public static void main(final String [] args)31 throws MonitoringReaderException, MonitoringRecordConsumerException {3233 if (args . length == 0) {34 return;35 }3637 /∗ Create Kieker.Analysis instance ∗/38 final AnalysisController analysisInstance = new AnalysisController () ;39 /∗ Register our own consumer; set the max. response time to 1.9 ms ∗/40 analysisInstance . registerPlugin (new Consumer(1900000));4142 /∗ Set filesystem monitoring log input directory for our analysis ∗/43 final String inputDirs [] = {args [0]};44 analysisInstance .setReader(new FSReader(inputDirs));4546 /∗ Start the analysis ∗/47 analysisInstance .run() ;48 }49 }

Listing 2.14: BookstoreAnalysisStarter.java

The BookstoreAnalysisStarter follows a simple scheme. Each analysis tool has tocreate at least one AnalysisController which can be seen in Listing 2.14 in line 38.Then the consumers are registered with the analysis instance. In this case, the previ-

Kieker 1.4 User Guide 18

Page 19: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

ously described Consumer is instantiated and the maximum response time is set to 1.9milliseconds. Line 44 sets the file system monitoring log reader which is initialized withthe first command-line argument value as the input directory. The application expectsthe output directory from the earlier monitoring run (see Section 2.3) as the only argu-ment value, which must be passed manually. The analysis is started by calling its runmethod (line 47).

The Listings 2.15 and 2.16 describe how the analysis application can be compiled andexecuted under UNIX-like systems and Windows.

. mkdir build

. javac src/bookstoreApplication/∗ .java−classpath lib/kieker-1.4.jar−d build/

. java −classpathbuild/:lib /kieker-1.4.jar:lib /commons-logging-1.1.1.jarbookstoreApplication.BookstoreAnalysisStarter

/tmp/kieker−20110427−142244899−UTC−Kaapstad−KIEKER−SINGLETON

Listing 2.15: Commands to compile and run the analysis under UNIX-like systems

. mkdir build

. javac src\bookstoreApplication\∗ .java−classpath lib\kieker-1.4.jar−d build\

. java −classpathbuild \;lib \kieker-1.4.jar;lib \commons-logging-1.1.1.jarbookstoreApplication.BookstoreAnalysisStarter

C:\Temp\kieker−20110427−142244899−UTC−Kaapstad−KIEKER−SINGLETON

Listing 2.16: Commands to compile and run the analysis under Windows

You need to make sure that the application gets the correct path from the monitoringrun. The consumer prints an output message for each record received. An exampleoutput can be found in Appendix G.1.

Kieker 1.4 User Guide 19

Page 20: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

3 Kieker.Monitoring Component

RThe Java sources of this chapter, as well as a pre-compiled binary, canbe found in the examples/userguide/ch3-4-custom-components/ di-rectory of the binary release.

3.1 Monitoring Controller

The MonitoringController constructs and controls a Kieker.Monitoring instance. Asdepicted by the class diagram in Figure 3.1, it provides methods for

• Creating IMonitoringController instances (Section 3.1.1),• Logging monitoring records employing the configured monitoring writer (Section 3.1.2),• Retrieving the current time via the configured time source (Section 3.1.3),• Scheduling and removing period samplers (Section 3.1.4), and• Controlling the monitoring state (Section 3.1.5).

3.1.1 Creating MonitoringController Instances

The MonitoringController provides two different static methods for retrieving in-stances of IMonitoringController:

1. The method MonitoringController.getInstance() returns a singleton instance. Asdescribed in Section 3.2, the configuration is read from a properties file that hasbeen passed to the JVM, is located in the classpath, or conforms to the defaultconfiguration (Appendix E).

MonitoringController

(from kieker::monitoring::core::controller)

+ getInstance ( ) : IMonitoringController

+ createInstance ( configuration : Configuration ) : IMonitoringController

+ getTimeSource ( ) : ITimeSource

+ newMonitoringRecord ( record : IMonitoringRecord ) : boolean

+ schedulePeriodicSampler ( sampler : ISampler, period : long, ... )

+ removeScheduledSampler ( sampler : ScheduledSamplerJob ) : boolean

+ disableMonitoring ( )

+ enableMonitoring ( )

+ terminateMonitoring ( )

+ isMonitoringEnabled ( ) : boolean

+ isMonitoringTerminated ( ) : boolean

«interface»

IMonitoringWriter

(from kieker::monitoring::writer)

«interface»

ITimeSource

(from kieker::monitoring::core::timer)

+ getTime ( ) : long

1 1

- writer

1 1

- timeSource

Figure 3.1: Class diagram of the MonitoringController (including selected methods)

Kieker 1.4 User Guide 20

Page 21: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

2. The method MonitoringController.createInstance(Configuration config) can be usedto create an instance that is configured according to the passed Configuration

object, as described in Section 3.2.

3.1.2 Logging Monitoring Records

Monitoring records are sent to the configured monitoring writers by passing these records,in form of IMonitoringRecord objects, to the MonitoringController’s newMonitor-ingRecord method. Note, that this is not the case if monitoring is disabled or terminated(Section 3.1.5).

3.1.3 Retrieving the Current Time and Using Custom Time Sources

The current time is maintained by a so-called time source. The MonitoringController’smethod getTimeSource returns an ITimeSource object which provides a method get-Time. Kieker’s default time source (DefaultSystemTimer) returns the current systemtime as the number of nanoseconds elapsed since 1 Jan 1970 00:00 UTC. The easiest wayto use a custom time source is to extend the AbstractTimeSource and to implementthe method getTime(). Custom time sources make sense, for example, in simulationswhere not the current system time but the current simulation time is relevant. Theconfiguration needs to be adjusted to use a custom time source class.

3.1.4 Scheduling and Removing Periodic Samplers

For certain applications, it is required to monitor runtime data periodically, e.g., theutilization of system resources such as CPUs. For this purpose, Kieker supports specialmonitoring probes, called samplers. Samplers must implement the interface ISampler

which includes a single method sample(IMonitoringController monitoringController).This method is called in peridioc time steps, as specified by the MonitoringController’sregistration function schedulePeriodicSampler. Periodic samplers can be stopped bycalling the MonitoringController’s method removeScheduledSampler.

Listing 3.1 shows the sample method of the MemSwapUsageSampler which can be usedto monitor memory and swap usage employing the Sigar library [1]. Likewise to othermonitoring probes described in this user guide (see for example Sections 3.4 and 2.3),it collects the data of interest (lines 53–54), creates a monitoring record (lines 55–56),and passes this monitoring record to the monitoring controller (line 57). The availableSigar-based samplers for monitoring system-level monitoring data, such as CPU andmemory usage, are discussed in Appendix D.

Kieker 1.4 User Guide 21

Page 22: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

51 @Override52 public void sample( final IMonitoringController monitoringController ) throws

SigarException {53 final Mem mem = this.sigar.getMem();54 final Swap swap = this.sigar .getSwap();55 final MemSwapUsageRecord r = new MemSwapUsageRecord(monitoringController.

getTimeSource().getTime(), monitoringController.getHostName(), mem.getTotal(),56 mem.getActualUsed(), mem.getActualFree(), swap.getTotal(), swap.getUsed(), swap.

getTotal()) ;57 monitoringController .newMonitoringRecord(r);58 }

Listing 3.1: Method sample from MemSwapUsageSampler.java

3.1.5 Controlling the Monitoring State

The MonitoringController provides methods to temporarily enable or disable moni-toring (enableMonitoring/disableMonitoring), as well as to terminate monitoring perma-nently (terminateMonitoring). The current state can be requested by calling the meth-ods isMonitoringEnabled and isMonitoringTerminated. If monitoring is not enabled (i.e.,disabled or terminated), no monitoring records retrieved via the method newMonitor-ingRecord are passed to the monitoring writer. Also, probes should be passive or returnimmediately with respect to the return value of the method isMonitoringEnabled. Note,that once the MonitoringController is terminated, it cannot be enabled later on.

3.1.6 JMX MBean Access to MonitoringController

The MonitoringController’s interface methods (see Figure 3.1) can be accessed as aJMX MBean. For example, this allows to control the monitoring state using the methodsdescribed in the previous Section 3.1.5. As a JMX-compliant graphical client that isincluded in the JDK, jconsole is probably the easiest way to get started. Figure 3.2shows two screenshots of the MBean access using jconsole.

In order to enable JMX MBean access to the MonitoringController, the value ofthe configuration property kieker.monitoring.MBean must be set to true:

# Whether the MonitoringController will be available as an MBean.kieker .monitoring.MBean=true

3.2 Kieker.Monitoring Configuration

Kieker.Monitoring instances can be configured by properties files, Configuration objects,and by passing property values as JVM arguments. If no configuration is specified, a

Kieker 1.4 User Guide 22

Page 23: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

(a) Attributes (b) Operations

Figure 3.2: Screenshots of the jconsole JMX client accessing the MonitoringCon-

troller’s attributes and operations via the MBean interface.

default configuration is being used. Appendix E lists this default configuration with adocumentation of all available properties. The default configuration properties file, whichcan be used as a template for custom configurations, is provided by the file kieker.-

monitoring.properties in the directory kieker-1.4/META-INF/ of the binary release(see Section 2.1).

Configurations for Singleton Instances

In order to use a custom configuration file, its location needs to be passed to the JVMusing the parameter kieker.monitoring.configuration as follows:

. java -Dkieker.monitoring.configuration=<ANY−DIR>/my.kieker.monitoring.properties [. . . ]

Alternatively, a file named kieker.monitoring.properties can be placed in a directorycalled META-INF/ located in the classpath. The available configuration properties canalso be passed as JVM arguments, e.g., −Dkieker.monitoring.enabled=true.

Configurations for Non-Singleton Instances

The class Configuration provides factory methods to create Configuration objectsaccording to the default configuration or loaded from a specified properties file: creat-eDefaultConfiguration, createConfigurationFromFile, and createSingletonConfiguration.

Kieker 1.4 User Guide 23

Page 24: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Note, that JVM parameters are only evaluated when using the factory method cre-ateSingletonConfiguration. The returned Configuration objects can be adjusted bysetting single property values using the method setProperty.

3.3 Monitoring Records

Monitoring records are objects that contain the monitoring data, as mentioned in theprevious chapters. Typically, an instance of a monitoring record is constructed in amonitoring probe (Section 3.4), passed to the monitoring controller (Section 3.1), se-rialized and deserialized by a monitoring writer (Section 3.5) and a monitoring reader(Section 4.2), and provided to the analyis plugins (Section 4.4) by the analysis controller(Section 4.1). Figure 1.2 illustrates this life cycle of a monitoring record.

In Chapter 2, we’ve already introduced and used the monitoring record type Oper-

ationExecutionRecord. Kieker allows to use custom monitoring record types. Corre-sponding classes must implement the interface IMonitoringRecord shown in Figure 3.3.The methods initFromArray, toArray, getValueTypes are used for serialization and de-serialization of the monitoring data contained in the record. The method setLogging-Timestamp is used by the monitoring controller to store the date and time when a recordis received by the controller. The method getLoggingTimestamp can be used duringanalysis to retrieve this value. Kieker.Monitoring provides the abstract class Abstract-

MonitoringRecord (Figure 3.3) which already implements the methods to maintain thelogging timestamp.

MyResponseTimeRecord

+ className : String

+ methodName : String

+ responseTimeNanos : long

+ initFromArray ( values : Object [3] )

+ toArray ( ) : Object [3]

+ getValueTypes ( ) : Class [3]

AbstractMonitoringRecord

(from kieker::common::record)

+ setLoggingTimestamp ( timestamp : long )

+ getLoggingTimestamp ( ) : long

«interface»

IMonitoringRecord

(from kieker::common::record)

+ setLoggingTimestamp ( timestamp : long )

+ getLoggingTimestamp ( ) : long

+ initFromArray ( values : Object [*] )

+ toArray ( ) : Object [*]

+ getValueTypes ( ) : Class [*]

Figure 3.3: Class diagram with the IMonitoringRecord interface, the abstract class Ab-

stractMonitoringRecord, and a custom monitoring record type MyResponse-TimeRecord

Kieker 1.4 User Guide 24

Page 25: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

In order to use the abstract class for implementing your own monitoring record type,you need to:

1. Create a class that extends AbstractMonitoringRecord and

2. Override the methods initFromArray, toArray, getValueTypes.

The class MyResponseTimeRecord, shown in the class diagram in Figure 3.3 and inListing 3.2, is an example of a custom monitoring record type that can be used tomonitor response times of method executions.

21 package bookstoreApplication;2223 import kieker .common.record.AbstractMonitoringRecord;2425 public class MyResponseTimeRecord extends AbstractMonitoringRecord {2627 private static final long serialVersionUID = 1775L;28 private final static String NA VAL = ”N/A”;2930 /∗ Attributes storing the actual monitoring data: ∗/31 public volatile String className = MyResponseTimeRecord.NA VAL;32 public volatile String methodName = MyResponseTimeRecord.NA VAL;33 public volatile long responseTimeNanos = −1;3435 @Override36 public final void initFromArray( final Object [] values) {37 this .className = (String) values [0];38 this .methodName = (String) values[1];39 this .responseTimeNanos = (Long) values[2];40 }4142 @Override43 public final Object [] toArray() {44 return new Object[]{this .className, this .methodName, this.responseTimeNanos};45 }4647 @Override48 public Class<?>[] getValueTypes() {49 return new Class[]{String . class , String . class , long. class };50 }51 }

Listing 3.2: MyResponseTimeRecord.java

Kieker 1.4 User Guide 25

Page 26: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

3.4 Monitoring Probes

The probes are responsible for collecting the monitoring data and passing it to themonitoring controller. In Chapter 2.3, we have already demonstrated how to manuallyinstrument a Java application. Listing 3.3 shows a similar manual monitoring probewhich uses the monitoring record type MyResponseTimeRecord defined in the previousSection 3.3.

35 final long tin =36 Bookstore.MONITORING CONTROLLER.getTimeSource().getTime();37 this . catalog .getBook(false) ;38 final long tout =39 Bookstore.MONITORING CONTROLLER.getTimeSource().getTime();40 /∗ Create a new record and set values ∗/41 final MyResponseTimeRecord e = new MyResponseTimeRecord();42 e.className = ”mySimpleKiekerExample.bookstoreTracing.Catalog”;43 e.methodName = ”getBook(..)”;44 e.responseTimeNanos = tout − tin;45 /∗ Pass the record to the monitoring controller ∗/46 Bookstore.MONITORING CONTROLLER.newMonitoringRecord(e);

Listing 3.3: Excerpt from Bookstore.java

In order to avoid multiple calls to the getInstance method of the MonitoringControllerclass, singleton instances should be stored in a final static variable, as shown in List-ing 3.4.

30 private final static IMonitoringController MONITORING CONTROLLER =31 MonitoringController . getInstance () ;

Listing 3.4: Singleton instance of the monitoring controller stored in a final static variable(excerpt from Bookstore.java)

When manually instrumenting an application, the monitoring probe is implementedby mixing monitoring logic with business logic, which is often not desired since theresulting code is hardly maintainable. Many middleware technologies, such as Java EEServlet [5], Spring [6], and Apache CXF [7] provide interception/AOP [2] interfaceswhich are well-suited to implement monitoring probes. AspectJ [9] allows to instrumentJava applications without source code modifications. Chapter 5 describes the Kiekerprobes based on these technologies allowing to monitor trace information in distributedapplications.

3.5 Monitoring Writers

Monitoring writers serialize monitoring records to the monitoring log/stream and mustimplement the interface IMonitoringWriter. The monitoring controller passes the re-ceived records to the writer by calling the method newMonitoringRecord. Writers canuse the methods to serialize the record contents, as described in Section 3.3.

Kieker 1.4 User Guide 26

Page 27: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Figure 3.4 shows the monitoring writers already implemented in Kieker.Monitoring.The available properties for the included writers are well-documented in the exampleconfiguration file (see Appendix E).

The writers AsyncFsWriter, SyncFsWriter, AsyncDbWriter, and SyncDbWriter canbe used to store monitoring records to filesystems and databases respectively. The vari-ants with the prefix Async are implemented using asynchronous threads that decouplethe I/O operations from the control flow of the instrumented application. The AsyncF-

sWriter is the default writer which has already been used in Section 2.3. Currently, thedatabase writer only supports the record type OperationExecutionRecord.

The AsyncJMSWriter and JMXWriter write records to a JMS (Java Messaging Ser-vice [3]) queue and JMX (Java Management Extensions [4]) queue respectively. ThePipeWriter allows to pass records via in-memory record streams (named pipes). Thesewriters allow to implement on-the-fly analysis in distributed systems, i.e., analysis whilecontinuously receiving new monitoring data from an instrumented application potentiallyrunning on another machine. A more detailed description of how to use the AsyncJM-

SWriter can be found in Appendix C.

Figure 3.4: Interface IMonitoringWriter and the implementing classes

Listing 3.5 on page 28 shows a custom writer MyPipeWriter which uses a named pipeto write the given records into a buffer located in the memory. The source code of theclass MyPipe is listed in Appendix F.1.The monitoring writer to be used is selected and configured by the Kieker.Monitoring con-figuration properties (Section 3) monitoringDataWriter and monitoringDataWriterInit-String. Listing 3.5 demonstrates how to use the custom writer MyPipeWriter definedabove. In this example, the pipe name is passed as the property value monitoring-DataWriterInitString.

monitoringDataWriter=bookstoreApplication.MyPipeWritermonitoringDataWriterInitString =pipeName=somePipe

Kieker 1.4 User Guide 27

Page 28: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

21 package bookstoreApplication;2223 import java. util . Properties ;2425 import kieker .common.record.IMonitoringRecord;26 import kieker .monitoring. core . configuration . Configuration ;27 import kieker .monitoring. writer .AbstractMonitoringWriter ;2829 public class MyPipeWriter extends AbstractMonitoringWriter {30 private static final String PREFIX = MyPipeWriter.class.getName() + ”.”;31 private static final String PROPERTY PIPE NAME = MyPipeWriter.PREFIX32 + ”pipeName”;33 private volatile String pipeName;34 private volatile MyPipe pipe;3536 public MyPipeWriter(final Configuration configuration ) {37 super( configuration ) ;38 }3940 @Override41 public boolean newMonitoringRecord(final IMonitoringRecord record) {42 try {43 /∗ Just write the content of the record into the pipe. ∗/44 this .pipe .put(new PipeData(record.getLoggingTimestamp(), record.toArray()));45 } catch ( final InterruptedException e) {46 return false ; // signal error47 }48 return true ;49 }5051 @Override52 protected Properties getDefaultProperties () {53 final Properties properties = new Properties(super.getDefaultProperties ()) ;54 properties . setProperty(MyPipeWriter.PROPERTY PIPE NAME, ”myPipeName”);55 return properties ;56 }5758 @Override59 protected void init () throws Exception {60 this .pipeName =61 this . configuration62 . getStringProperty (MyPipeWriter.PROPERTY PIPE NAME);63 this .pipe = MyNamedPipeManager.getInstance().acquirePipe(this.pipeName);64 }6566 @Override67 public void terminate() { }68 }

Listing 3.5: MyPipeWriter.java

Kieker 1.4 User Guide 28

Page 29: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

As the data structure of this kind of monitoring stream, we created a class PipeData

in order to demonstrate the use of the toArray and initFromArray (in Section 4.2)methods. A PipeData object holds a logging timestamp and an Object array containingthe serialized record data. Appendix F.1 includes a source code listing of this class.Alternatively, we could have used IMonitoringRecord as the data structure used by thepipe. This is the way, Kieker’s PipeWriter works.

Kieker 1.4 User Guide 29

Page 30: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

4 Kieker.Analysis Component

RThe Java sources of this chapter, as well as a pre-compiled bi-nary, can also be found in the examples/userguide/ch3-4-custom-

components/ directory of the binary release.

4.1 Analysis Controller

An analysis with Kieker.Analysis is set up and executed employing the class Analysis-

Controller. Kieker.Analysis requires a monitoring reader (Section 4.2) and at least onemonitoring record consumer plugin (Section 4.4). In addition to the monitoring recordconsumer plugin, other analysis plugins can be registered. Figure 4.1 shows the classdiagram with the important Kieker.Analysis classes and their relationship.

AnalysisController

(from kieker::analysis)

+ registerPlugin ( plugin : IAnalysisPlugin )

+ run ( )

«interface»

IMonitoringReader

(from kieker::analysis::reader)

+ init ( initString : String )

+ addRecordReceiver ( receiver : IMonitoringRecordReceiver )

+ read ( ) : boolean

«interface»

IMonitoringRecordConsumerPlugin

(from kieker::analysis::plugin)

+ getRecordTypeSubscriptionList ( ) [*]

«interface»

IMonitoringRecordReceiver

(from kieker::common::record)

+ newMonitoringRecord ( record : IMonitoringRecord ) : boolean

«interface»

IAnalysisPlugin

(from kieker::analysis::plugin)

+ execute ( )

+ terminate ( )

1

1- reader

1

1..* - consumers

1

* - receivers

1

1..* - plugins

+ setReader ( reader : IMonitoringReader )

Figure 4.1: Class diagram showing important Kieker.Analysis classes and their relationship

Setting up and running an analysis with Kieker.Analysis requires the following steps tobe performed, as described in Section 2.4 already:

1. Creating an instance of the AnalysisController class2. Creating and registering the monitoring reader (setReader) as well as the monitor-

ing record consumers and other analysis plugins (registerPlugin).3. Starting the analysis instance (run).

Kieker 1.4 User Guide 30

Page 31: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

In the following Sections 4.2 and 4.4, we will create a custom monitoring reader MyP-

ipeReader and a monitoring record consumer plugin MyResponseTimeConsumer. Thefollowing Listing 4.1 shows how to create and run an analysis with these custom com-ponents:

46 final AnalysisController analyisController = new AnalysisController () ;47 final IMonitoringReader reader =48 new MyPipeReader(”somePipe”);49 final IMonitoringRecordConsumerPlugin consumer =50 new MyResponseTimeConsumer();51 analyisController .setReader(reader) ;52 analyisController . registerPlugin (consumer);53 analyisController .run() ;

Listing 4.1: Code snippet setting up and running a Kieker.Analysis instance (Starter.java)

On invocation of the run method, the Analysis Controller calls the execute methodof all analysis plugins allowing them to initialize. Then, it starts the configured mon-itoring reader by calling its read method. Monitoring record consumers receive themonitoring records provided by the reader. As soon as the reader returns from theexecution of its read method, the method terminate of each registered plugin is calledby the Analysis Controller. In order to support the asynchronous execution of theAnalysisController instance, we provide the AnalysisControllerThread class.

4.2 Monitoring Readers

The monitoring readers are the direct counterpart to the monitoring writers. While writ-ers receive records and write them into files or other kinds of monitoring logs/streams,readers deserialize monitoring data and provide it as IMonitoringRecord instances.

Figure 4.2: Interface IMonitoringReader and implementing classes

Kieker 1.4 User Guide 31

Page 32: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

There are already some readers implemented in Kieker, as shown in the class diagram inFigure 4.2. The FSReader has already been used in Section 2.4. The FSReaderRealtimecan be used to simulate continuous monitoring of a production system. It adds delaysbetween the delivery of the monitoring records to its consumers according to the originaldelays reconstructed from the logging timestamps (Section 3.3). A brief description ofhow to use the JMSReader can be found in Appendix C.The implementation of a custom reader is similar to the implementation of a monitoringwriter. Custom readers should extend the class AbstractKiekerMonitoringReader

which already provides an implementation of the observer pattern. By invoking themethod deliverRecord, the delivery of records is then delegated to the super class.

Listing 4.2 on page 33 shows a simple reader which polls records from the named pipeintroduced in the previous Chapter 3.

4.3 Analysis Plugins

Any analysis or visualization component used with Kieker.Analysis must implement theinterface IAnalysisPlugin (Figure 4.1). As described in Section 4.1, the life-cycle ofeach registered plugin is controlled by the Analysis Controller instance employingthe methods execute and terminate. Analysis plugins must implement these methodsfor initialization and termination.

The monitoring record consumer plugins described in the following Section 4.4, arespecial analysis plugins that receive the monitoring records provided by the monitoringreader. Starting with these monitoring record plugins, analysis plugins can be con-nected in a pipe-and-filter style to implement more complex analyses. Kieker providesinput and output port interfaces and implementing classes to implement such analyses.See the documentation of the classes AbstractInputPort and OutputPort for details.Kieker.TraceAnalysis is implemented based on this pattern.

4.4 Monitoring Record Consumer Plugins

As just mentioned, consumer plugins are special analysis plugins which receive therecords provided by the monitoring reader and implement analyses or visualizationsbased on these records. Consumer plugins must implement the interface IMonitor-

ingRecordConsumerPlugin (see Figure 4.1). By implementing the getRecordTypeSub-scriptionList method, a consumer plugin can specify the desired types of monitoringrecords to be received via the method newMonitoringRecord.

The custom consumer in Listing 4.3 on page 34 simply writes the content of thereceived response time records to the standard output stream.

Kieker 1.4 User Guide 32

Page 33: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

29 public class MyPipeReader extends AbstractMonitoringReader {3031 private static final Log log = LogFactory.getLog(MyPipeReader.class);3233 private static final String PROPERTY PIPE NAME = ”pipeName”;34 private volatile MyPipe pipe;3536 public MyPipeReader () {}3738 public MyPipeReader (final String pipeName) {39 this . init (MyPipeReader.PROPERTY PIPE NAME+”=”+pipeName);40 }4142 @Override43 public boolean init ( final String initString ) throws IllegalArgumentException {44 try {45 final PropertyMap propertyMap = new PropertyMap(initString, ”|”, ”=”);46 final String pipeName = propertyMap.getProperty(MyPipeReader.

PROPERTY PIPE NAME);47 this .pipe = MyNamedPipeManager.getInstance().acquirePipe(pipeName);48 } catch ( final Exception exc) {49 MyPipeReader.log.error(”Failed to parse initString ’ ” + initString50 + ”’: ” + exc.getMessage());51 return false ;52 }53 return true ;54 }5556 @Override57 public boolean read() {58 try {59 PipeData data;60 /∗ Wait max. 4 seconds for the next data. ∗/61 while ((data = this.pipe . poll (4)) != null) {62 /∗ Create new record, init from received array ... ∗/63 final MyResponseTimeRecord record = new MyResponseTimeRecord();64 record . initFromArray(data.getRecordData());65 record .setLoggingTimestamp(data.getLoggingTimestamp());66 /∗ ... and delegate the task of delivering to the super class . ∗/67 this . deliverRecord (record) ;68 }69 } catch ( final InterruptedException e) {70 return false ; // signal error71 }72 return true ;73 }7475 @Override76 public void terminate() {77 // currently no termination code (could be refined )78 }79 }

Listing 4.2: MyPipeReader.java (excerpt)

Kieker 1.4 User Guide 33

Page 34: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

21 package bookstoreApplication;2223 import java. util . Collection ;2425 import kieker . analysis . plugin .IMonitoringRecordConsumerPlugin;26 import kieker .common.record.IMonitoringRecord;2728 public class MyResponseTimeConsumer implements IMonitoringRecordConsumerPlugin {2930 @Override31 public Collection <Class<? extends IMonitoringRecord>> getRecordTypeSubscriptionList()

{32 return null ;33 }3435 @Override36 public boolean newMonitoringRecord(IMonitoringRecord record) {37 if (record instanceof MyResponseTimeRecord) {38 /∗ Write the content to the standard output stream. ∗/39 MyResponseTimeRecord myRecord = (MyResponseTimeRecord) record;40 System.out. println (”[Consumer] ” + myRecord.getLoggingTimestamp()41 + ”: ” + myRecord.className + ”, ” + myRecord.methodName42 + ”, ” + myRecord.responseTimeNanos);43 }44 return true ;45 }4647 @Override48 public boolean execute() {49 return true ;50 }5152 @Override53 public void terminate(boolean error) {54 }55 }

Listing 4.3: MyReponseTimeConsumer.java

Kieker 1.4 User Guide 34

Page 35: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5 Kieker.TraceAnalysis Tool

Kieker.TraceAnalysis implements the special feature of Kieker allowing to monitor, ana-lyze and visualize (distributed) traces of method executions and corresponding timinginformation. For this purpose, it includes monitoring probes employing AspectJ [9],Java EE Servlet [5], Spring [6], and Apache CXF [7] technology. Moreover, it allows toreconstruct and visualize architectural models of the monitored systems, e.g., as sequenceand dependency diagrams.

Section 2 already introduced parts of the monitoring record type OperationExecu-

tionRecord. Kieker.TraceAnalysis uses this record type to represent monitored executionsand associated trace and session information. Figure 5.1 shows a class diagram with allattributes of the record type OperationExecutionRecord. The attributes className,operationName, tin, and tout have been introduced before. The attributes traceId andsessionId are used to store trace and session information; eoi and ess contain control-flow information needed to reconstruct traces from monitoring data. For details on this,please refer to our technical report [10].

OperationExecutionRecord

(from kieker::common::record)

+ componentName : String

+ opName : String

+ sessionId : String

+ traceId : long

+ tin : long

+ tout : long

+ eoi : int

+ ess : int

AbstractMonitoringRecord

(from kieker::common::record)

«interface»

IMonitoringRecord

(from kieker::common::record)

Figure 5.1: The class diagram of the operation execution record

Section 5.1 describes how to instrument Java applications for monitoring trace informa-tion. It presents the technology-specific probes provided by Kieker for this purpose—witha focus on AspectJ. Additional technology-specific probes can be implemented based onthe existing probes. Section 5.2 presents the tool which can be used to analyze andvisualize the recorded trace data. Examples for the available analysis and visualizationoutputs provided by Kieker.TraceAnalysis are presented in Section 5.3.

Kieker 1.4 User Guide 35

Page 36: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.1 Monitoring Trace Information

The following Sections describe how to use the monitoring probes based on AspectJ (Sec-tion 5.1.1), the Java Servlet API (Section 5.1.2), the Spring Framework (Section 5.1.3),and Apache CXF (Section 5.1.4) provided by Kieker.

5.1.1 AspectJ-Based Instrumentation

AspectJ [9] allows to weave code into the byte code of Java applications and librarieswithout requiring manual modifications of the source code. Kieker includes the AspectJ-based monitoring probes OperationExecutionAspectAnnotation, OperationExecu-

tionAspectAnnotationServlet, OperationExecutionAspectFull, and OperationEx-

ecutionAspectFullServlet which can be woven into Java applications at compile timeand load time. These probes monitor method executions and corresponding trace andtiming information. The probes with the postfix Servlet additionally store a sessionidentifier within the OperationExecutionRecord. When the probes with name elementAnnotation are used, methods to be monitored must be annotated by the Kieker anno-tation @OperationExecutionMonitoringProbe. This section demonstrates how to usethe AspectJ-based probes to monitor traces based on the Bookstore application fromChapter 2.

RThe Java sources of the example presented in this section, as well as apre-compiled binary, can be found in the examples/userguide/ch5-

trace-monitoring-aspectj/ directory of the binary release.

examples/

userguide/

ch5–trace-monitoring-aspectj/

build/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Directory for the Java class files

META-INF/

META-INF/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Directory for the configuration files

aop.xml

kieker.monitoring.properties

lib/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directory for the needed libraries

kieker-1.4.jar

commons-logging-1.1.1.jar

aspectjweaver-1.6.11.jar

src/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directory for the source code files

bookstoreTracing/

Bookstore.java

BookstoreStarter.java

Catalog.java

CRM.java

Figure 5.2: The new directory structure of the Bookstore application

Kieker 1.4 User Guide 36

Page 37: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Figure 5.2 shows the directory used by the example of this section. The jar-fileaspectjweaver-1.6.11.jar is included in the lib/ directory of the Kieker binary re-lease. Its META-INF/ directory contains an example aop.xml. The library aspectjweaver-

1.6.11.jar contains the AspectJ weaver which is registered with the JVM and weavesthe monitoring instrumentation into the Java classes. It will be configured based on theconfiguration file aop.xml.

Once the necessary files have been copied to the example directory, the source codecan be instrumented with the annotation OperationExecutionMonitoringProbe. List-ing 5.1 shows how the annotation is used.

21 package bookstoreTracing;2223 import kieker .monitoring.annotation.OperationExecutionMonitoringProbe;2425 public class Bookstore {2627 private final Catalog catalog = new Catalog();28 private final CRM crm = new CRM(catalog);2930 @OperationExecutionMonitoringProbe31 public void searchBook() {32 catalog .getBook(false) ;33 crm.getOffers () ;34 }35 }

Listing 5.1: Bookstore.java

As a first example, each method of the Bookstore application will be annotated. Theannotation can be used to instrument all methods except for constructors.

The aop.xml file has to be modified to specify the classes to be considered for instru-mentation by the AspectJ weaver. Listing 5.2 shows the modified configuration file.

1 <!DOCTYPE aspectj PUBLIC ”−//AspectJ//DTD//EN” ”http://www.aspectj.org/dtd/aspectj 1 5 0.dtd”>

23 <aspectj>4 <weaver options=””>5 <include within=”bookstoreTracing..∗”/>6 </weaver>78 <aspects>9 <aspect name=”kieker.monitoring.probe.aspectJ. operationExecution .

OperationExecutionAspectAnnotation”/>10 </aspects>11 </aspectj>

Listing 5.2: aop.xml

Kieker 1.4 User Guide 37

Page 38: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Line 5 tells the AspectJ weaver to consider all classes inside the package bookstore-

Tracing. AspectJ allows to use wild-cards for the definition of classes to include—e.g.,<include within=”bookstoreTracing.Bookstore∗”/> to weave all classes in this package with theprefix Bookstore.

Line 9 specifies the aspect to be woven into the classes. In this case, the Kieker probeOperationExecutionAspectAnnotation is used. It requires that methods intended tobe instrumented are annotated by @OperationExecutionMonitoringProbe, as mentioned before.

Listings 5.3 and 5.4 show how to compile and run the annotated Bookstore applica-tion. The aop.xml must be located in a META-INF/ directory in the classpath—in thiscase the build/ directory. The AspectJ weaver has to be loaded as a so-called Java-agent. It weaves the monitoring aspect into the byte code of the Bookstore application.Additionally, a kieker.monitoring.properties is copied to the META-INF/ directory.The configuration may be adjusted as desired (see Section 3.2).

. mkdir build

. mkdir build/META−INF

. javac src/bookstoreTracing/∗.java−d build/−classpath lib/kieker-1.4.jar :lib /commons-logging-1.1.1.jar

. cp META−INF/aop.xml build/META−INF/

. cp META−INF/kieker.monitoring.properties build/META−INF/

. java −javaagent :lib/aspectjweaver-1.6.11.jar−classpath build/ :lib /kieker-1.4.jar :lib /commons-logging-1.1.1.jar

bookstoreTracing.BookstoreStarter

Listing 5.3: Commands to compile and run the Bookstore under UNIX-like systems

. mkdir build

. mkdir build\META−INF

. javac src\bookstoreTracing\∗.java−d build\−classpath lib\kieker-1.4.jar; lib \commons-logging-1.1.1.jar

. copy META−INF\aop.xml build\META−INF\

. copy META−INF\kieker.monitoring.properties build\META−INF\

. java −javaagent:lib\aspectjweaver-1.6.11.jar−classpath build\; lib \kieker-1.4.jar; lib \commons-logging-1.1.1.jar

bookstoreTracing.BookstoreStarter

Listing 5.4: Commands to compile and run the annotated Bookstore under Windows

After a complete run of the application, the monitoring files should appear in the sameway as mentioned in Section 2.3 including the additional trace information. An examplelog of a complete run can be found in Appendix G.2.

Kieker 1.4 User Guide 38

Page 39: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Instrumentation without annoations AspectJ-based instrumentation without usingannotations is quite simple. It is only necessary to modify the file aop.xml, as shown inListing 5.5.

1 <!DOCTYPE aspectj PUBLIC ”−//AspectJ//DTD//EN” ”http://www.aspectj.org/dtd/aspectj 1 5 0.dtd”>

23 <aspectj>4 <weaver options=””>5 <include within=”bookstoreTracing.BookstoreStarter ”/>6 </weaver>78 <aspects>9 <aspect name=”kieker.monitoring.probe.aspectJ. operationExecution .

OperationExecutionAspectFull”/>10 </aspects>11 </aspectj>

Listing 5.5: aop.xml

The alternative aspect OperationExecutionAspectFull is being activated in line 9. Asindicated by its name, this aspect makes sure that every method within the includedclasses/packages will be instrumented and monitored. Listing 5.5 demonstrates how tolimit the instrumented methods to those of the class BookstoreStarter.

The commands shown in the Listings 5.3 and 5.4 can again be used to compile andexecute the example. Note that the annotations within the source code have no effectwhen using this aspect.

!When using a custom aspect, it can be necessary to specify its class-name in the include directives of the aop.xml.

5.1.2 Servlet Filters

The Java Servlet API [5] includes the javax.servlet.Filter interface. It can be usedto implement interceptors for incoming HTTP requests. Kieker includes the probes Op-

erationExecutionRegistrationFilter and OperationExecutionRegistrationAnd-

LoggingFilter which implement the javax.servlet.Filter interface. Both initializethe session and trace information for incoming requests. The latter additionally createsan OperationExecutionRecord for each invocation of the filter and passes it to theMonitoringController.

Listing 5.6 demonstrates how to integrate the OperationExecutionRegistratio-

nAndLoggingFilter in the web.xml file of a web application.The Java EE Servlet container example described in Appendix employs the Opera-

tionExecutionRegistrationAndLoggingFilter.

Kieker 1.4 User Guide 39

Page 40: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<!−− Begin: Integration of kieker.monitoring.probe. servlet .OperationExecutionRegistrationAndLoggingFilter −−>

< filter >< filter−name>sessionRegistrationFilter</ filter−name>< filter−class>kieker.monitoring.probe. servlet . OperationExecutionRegistrationAndLoggingFilter</

filter−class></ filter >< filter−mapping>< filter−name>sessionRegistrationFilter</ filter−name><url−pattern>/∗</url−pattern></ filter−mapping>

Listing 5.6: OperationExecutionRegistrationAndLoggingFilter in a web.xml file

5.1.3 Spring

The Spring framework [6] provides interfaces for intercepting Spring services and webrequests. Kieker includes the probes OperationExecutionMethodInvocationInter-

ceptor and OperationExecutionWebRequestRegistrationInterceptor. The Opera-

tionExecutionMethodInvocationInterceptor is similar to the AspectJ-based probesdescribed in the previous section and monitors method executions as well as corre-sponding trace and session information. The OperationExecutionWebRequestRegis-

trationInterceptor intercepts incoming Web requests and initializes the trace and ses-sion data for this trace. If you are not using the OperationExecutionWebRequestReg-

istrationInterceptor, it is important to use one of the previously described Servletfilters (Section 5.1.2).

See the Spring documentation for instructions how to add the interceptors to theserver configuration.

5.1.4 CXF SOAP Interceptors

The Apache CXF framework [7] allows to implement interceptors for web service calls,for example, based on the SOAP web service protocol. Kieker includes the probes Opera-tionExecutionSOAPRequestOutInterceptor, OperationExecutionSOAPRequestInIn-terceptor, OperationExecutionSOAPResponseOutInterceptor, and OperationExe-

cutionSOAPResponseInInterceptor which can be used to monitor SOAP-based webservice calls. Session and trace information is written to and read from the SOAP headerof service requests and responses allowing to monitor distributed traces. See the CXFdocumentation for instructions how to add the interceptors to the server configuration.

Kieker 1.4 User Guide 40

Page 41: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.2 Trace Analysis and Visualization

Monitoring data including trace information can be analyzed and visualized with theKieker.TraceAnalysis tool which is included in the Kieker binary as well.

!In order to use this tool, it is necessary to install two third-party pro-grams:

1. Graphviz A graph visualization software which can be down-loaded from http://www.graphviz.org/.

2. GNU PlotUtils A set of tools for generating 2D plotgraphics which can be downloaded from http://www.gnu.org/

software/plotutils/ (for Linux) and from http://gnuwin32.

sourceforge.net/packages/plotutils.htm (for Windows).

Under Windows it is recommended to add the bin/ directories of bothtools to the “path” environment variable.

Once both programs have been installed, the Kieker.TraceAnalysis tool can be used. Itcan be accessed via the wrapper-script trace-analysis.sh or trace-analysis.bat

(Windows) in the bin/ directory. Non-parameterized calls of the scripts print all possibleoptions on the screen, as listed in Appendix A.3.

The commands shown in Listings 5.7 and 5.8 generate a sequence diagram as well asa call tree to an existing directory named out/. The monitoring data is assumed to belocated in the directory /tmp/kieker-20110428-142829399-UTC-Kaapstad-KIEKER/ or%temp%\kieker-20100813-121041532-UTC-virus-KIEKER under Windows.

. ./trace-analysis.sh –inputdirs /tmp/kieker−20110428−142829399−UTC−Kaapstad−KIEKER–outputdir out/–plot-Deployment-Sequence-Diagrams–plot-Call-Trees

Listing 5.7: Commands to produce the diagrams under UNIX-like systems

. trace-analysis.bat –inputdirs %temp%\kieker−20100813−121041532−UTC−virus−KIEKER–outputdir out\–plot-Deployment-Sequence-Diagrams–plot-Call-Trees

Listing 5.8: Commands to produce the diagrams under Windows

!The Windows .bat wrapper scripts (including trace-analysis.bat)must be executed from within the bin/ directory.

Kieker 1.4 User Guide 41

Page 42: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

The resulting contents of the out/ directory should be similar to the following tree:

out/

deploymentSequenceDiagram-6120391893596504065.pic

callTree-6120391893596504065.dot

system-entities.html

The .pic and .dot files can be converted into other formats, such as .pdf, by using theGraphviz and PlotUtils tools dot and pic2plot. The following Listing 5.9 demonstratesthis.

. dot callTree−6120391893596504065.dot -Tpng -o callTree.png

. pic2plot deploymentSequenceDiagram−6120391893596504065.pic -Tpng > sequenceDiagram.png

Listing 5.9: Commands to convert the diagrams

RThe scripts dotPic-fileConverter.sh and dotPic-

fileConverter.bat convert all .pic and .dot in a specifieddirectory. See Appendix A.4 for details.

Examples of all available visualization are presented in the following Section 5.3.

Kieker 1.4 User Guide 42

Page 43: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.3 Example Kieker.TraceAnalysis Outputs

The examples presented in this section were generated based on the monitoring datawhich can be found in the directory examples/userguide/ch5-trace-monitoring-

aspectj/testdata/kieker-20100830-082225522-UTC/. It consists of 1635 traces ofthe Bookstore application with AspectJ-based instrumentation, as described in Sec-tion 5.1.1. In order to illustrate the visualization of distributed traces, the hostnameof the Catalog’s method getBook was probabilistically changed to a second hostname.For a more detailed description of the underlying formalisms, we refer to our technicalreport [10].

5.3.1 Textual Trace and Equivalence Class Representations

Execution Traces

Textual execution trace representations of valid/invalid traces are written to an out-put file using the command-line options - -print-Execution-Traces and - -print-

invalid-Execution-Traces. Listing 5.10 shows the execution trace representation forthe valid trace . . . 6129.

TraceId 6488138950668976129 (minTin=1283156498770302094 (Mo, 30 Aug 2010 08:21:38 +0000 (UTC));maxTout=1283156498820012272 (Mo, 30 Aug 2010 08:21:38 +0000 (UTC)); maxEss=2):

<6488138950668976129[0,0] 1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A>

<6488138950668976129[1,1] 1283156498770900902−1283156498773404399 SRV1::@1:bookstoreTracing.Catalog.getBook N/A>

<6488138950668976129[2,1] 1283156498817823953−1283156498820007367 SRV0::@2:bookstoreTracing.CRM.getOffers N/A>

<6488138950668976129[3,2] 1283156498817855493−1283156498819999771 SRV1::@1:bookstoreTracing.Catalog.getBook N/A>

Listing 5.10: Textual output of trace 6488138950668976129’s execution trace representation

Message Traces

Textual message trace representations of valid traces are written to an output file usingthe command-line option - -print-Message-Traces. Listing 5.11 shows the messagetrace representation for the valid trace . . . 6129.

Trace 6488138950668976129:<SYNC−CALL 1283156498770302094 $ −−> 6488138950668976129[0,0]

1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A><SYNC−CALL 1283156498770900902 6488138950668976129[0,0]

1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A−−> 6488138950668976129[1,1] 1283156498770900902−1283156498773404399 SRV1::@1:bookstoreTracing.Catalog.getBook N/A>

<SYNC−RPLY 1283156498773404399 6488138950668976129[1,1]1283156498770900902−1283156498773404399 SRV1::@1:bookstoreTracing.Catalog.getBook N/A −−>6488138950668976129[0,0] 1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A>

Kieker 1.4 User Guide 43

Page 44: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<SYNC−CALL 1283156498817823953 6488138950668976129[0,0]1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A−−> 6488138950668976129[2,1] 1283156498817823953−1283156498820007367 SRV0::@2:bookstoreTracing.CRM.getOffers N/A>

<SYNC−CALL 1283156498817855493 6488138950668976129[2,1]1283156498817823953−1283156498820007367 SRV0::@2:bookstoreTracing.CRM.getOffers N/A −−>6488138950668976129[3,2] 1283156498817855493−1283156498819999771 SRV1::@1:bookstoreTracing.Catalog.getBook N/A>

<SYNC−RPLY 1283156498819999771 6488138950668976129[3,2]1283156498817855493−1283156498819999771 SRV1::@1:bookstoreTracing.Catalog.getBook N/A −−>6488138950668976129[2,1] 1283156498817823953−1283156498820007367 SRV0::@2:bookstoreTracing.CRM.getOffers N/A>

<SYNC−RPLY 1283156498820007367 6488138950668976129[2,1]1283156498817823953−1283156498820007367 SRV0::@2:bookstoreTracing.CRM.getOffers N/A −−>6488138950668976129[0,0] 1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A>

<SYNC−RPLY 1283156498820012272 6488138950668976129[0,0]1283156498770302094−1283156498820012272 SRV0::@3:bookstoreTracing.Bookstore.searchBook N/A−−> $>

Listing 5.11: Textual output of trace 6488138950668976129’s message trace representation

Trace Equivalence Classes

Deployment/assembly-level trace equivalence classes are computed and written to outputfiles using the command-line options - -print-Deployment-Equivalence-Classes and- -print-Assembly-Equivalence-Classes. Listings 5.12 and 5.13 show the outputgenerated for the monitoring data used in this section.

Class 0 ; cardinality : 187; # executions: 4; representative : 6488138950668976141; max. stack depth: 2Class 1 ; cardinality : 706; # executions: 4; representative : 6488138950668976129; max. stack depth: 2Class 2 ; cardinality : 386; # executions: 4; representative : 6488138950668976130; max. stack depth: 2Class 3 ; cardinality : 356; # executions: 4; representative : 6488138950668976131; max. stack depth: 2

Listing 5.12: Textual output of information on the deployment-level trace equivalenceclasses

Class 0 ; cardinality : 1635; # executions: 4; representative : 6488138950668976129; max. stack depth: 2

Listing 5.13: Textual output of information on the assembly-level trace equivalence class

Kieker 1.4 User Guide 44

Page 45: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.3.2 Sequence Diagrams

Deployment-Level Sequence Diagrams

Deployment-level sequence diagrams are generated using the command-line option - -

plot-Deployment-Sequence-Diagrams. Figures 5.3(a)–5.3(d) show these sequence di-agrams for each deployment-level trace equivalence representative (Section 5.3.1).

SRV0::@3:..Bookstore

SRV1::@1:..Catalog

SRV0::@2:..CRM

searchBook()

getBook(..)

getOffers()

getBook(..)

(a) Trace . . . 6129

SRV0::@3:..Bookstore

SRV1::@1:..Catalog

SRV0::@2:..CRM

SRV0::@1:..Catalog

searchBook()

getBook(..)

getOffers()

getBook(..)

(b) Trace . . . 6130

SRV0::@3:..Bookstore

SRV0::@1:..Catalog

SRV0::@2:..CRM

SRV1::@1:..Catalog

searchBook()

getBook(..)

getOffers()

getBook(..)

(c) Trace . . . 6131

SRV0::@3:..Bookstore

SRV0::@1:..Catalog

SRV0::@2:..CRM

searchBook()

getBook(..)

getOffers()

getBook(..)

(d) Trace . . . 6141

Figure 5.3: Deployment-level sequence diagrams of the trace equivalence class representa-tives (Listing 5.13)

Kieker 1.4 User Guide 45

Page 46: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Assembly-Level Sequence Diagrams

Assembly-level sequence diagrams are generated using the command-line option - -

plot-Assembly-Sequence-Diagrams. Figure 5.4 shows the sequence diagram for theassembly-level trace equivalence representative (Section 5.3.1).

@3:..Bookstore @1:..Catalog @2:..CRM

searchBook()

getBook(..)

getOffers()

getBook(..)

Figure 5.4: Assembly-level sequence diagram of trace . . . 6129

5.3.3 Call Trees

Trace Call Trees

Trace call trees are generated using the command-line option - -plot-Call-Trees. Fig-ures 5.5(a)–5.5(d) show these call trees for each deployment-level trace equivalence rep-resentative (Section 5.3.1).

$

SRV0::@3:..Bookstore.searchBook()

1.

SRV1::@1:..Catalog.getBook(..)

2.

SRV0::@2:..CRM.getOffers()

3.

SRV1::@1:..Catalog.getBook(..)

4.

(a) Trace . . . 6129

$

SRV0::@3:..Bookstore.searchBook()

1.

SRV1::@1:..Catalog.getBook(..)

2.

SRV0::@2:..CRM.getOffers()

3.

SRV0::@1:..Catalog.getBook(..)

4.

(b) Trace . . . 6130

$

SRV0::@3:..Bookstore.searchBook()

1.

SRV0::@1:..Catalog.getBook(..)

2.

SRV0::@2:..CRM.getOffers()

3.

SRV1::@1:..Catalog.getBook(..)

4.

(c) Trace . . . 6131

$

SRV0::@3:..Bookstore.searchBook()

1.

SRV0::@1:..Catalog.getBook(..)

2.

SRV0::@2:..CRM.getOffers()

3.

SRV0::@1:..Catalog.getBook(..)

4.

(d) Trace . . . 6141

Figure 5.5: Calls trees of the trace equivalence class representatives (Listing 5.13)

Kieker 1.4 User Guide 46

Page 47: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Aggregated Call Trees

Aggregated deployment/assembly-level call trees are generated using the command-lineoptions - -plot-Aggregated-Deployment-Call-Tree and - -plot-Aggregated-Assembly-

Call-Tree. Figures 5.6(a) and 5.6(b) show these aggregated call trees for the tracescontained in the monitoring data used in this section.

$

SRV0::@3:bookstoreTracingBookstore

.searchBook()

1635

SRV1::@1:bookstoreTracingCatalog

.getBook(..)

1092

SRV0::@2:bookstoreTracingCRM

.getOffers()

1635

SRV0::@1:bookstoreTracingCatalog

.getBook(..)

543

SRV1::@1:bookstoreTracingCatalog

.getBook(..)

1062

SRV0::@1:bookstoreTracingCatalog

.getBook(..)

573

(a) deployment-level

$

@3:bookstoreTracingBookstore.searchBook()

1635

@1:bookstoreTracingCatalog.getBook(..)

1635

@2:bookstoreTracingCRM.getOffers()

1635

@1:bookstoreTracingCatalog.getBook(..)

1635

(b) assembly-level

Figure 5.6: Aggregated call trees generated from the 1635 traces

Kieker 1.4 User Guide 47

Page 48: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.3.4 Dependency Graphs

Container Dependency Graphs

A container dependency graph is generated using the command-line option - -plot-

Container-Dependency-Graph. Figure 5.7 shows the container dependency graph forthe monitoring data used in this section.

$<<execution container>>

SRV01635 <<execution container>>

SRV12154

Figure 5.7: Container dependency graph

Component Dependency Graphs

Deployment/assembly-level component dependency graphs are generated using the command-line options - -plot-Deployment-Component-Dependency-Graph and - -plot-Assembly-

Component-Dependency-Graph. Figures 5.8(a) and 5.8(b) show the component depen-dency graphs for the monitoring data used in this section.

<<execution container>>SRV0

<<execution container>>SRV1

<<deployment component>>@1:..Catalog

<<deployment component>>@2:..CRM

573

<<deployment component>>@1:..Catalog

1062

<<deployment component>>@3:..Bookstore

543

1635

1092

$1635

(a) deployment-level

$<<assembly component>>

@3:..Bookstore1635 <<assembly component>>

@1:..Catalog<<assembly component>>

@2:..CRM

1635

1635

1635

(b) assembly-level

Figure 5.8: Component dependency graphs

Kieker 1.4 User Guide 48

Page 49: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Operation Dependency Graphs

Deployment/assembly-level operation dependency graphs are generated using the command-line options - -plot-Deployment-Operation-Dependency-Graph and - -plot-Assembly-

Operation-Dependency-Graph. Figures 5.9(a) and 5.9(b) show the operation depen-dency graphs for the monitoring data used in this section.

<<execution container>>SRV0

<<deployment component>>@3:..Bookstore

<<deployment component>>@2:..CRM

<<deployment component>>@1:..Catalog

<<execution container>>SRV1

<<deployment component>>@1:..Catalog

searchBook() getOffers()1635

getBook(..)

543

getBook(..)

1092

573

1062

$1635

(a) deployment-level

<<assembly component>>@3:..Bookstore

<<assembly component>>@2:..CRM

<<assembly component>>@1:..Catalog

searchBook()

getOffers()1635

getBook(..)1635

1635$

1635

(b) assembly-level

Figure 5.9: Operation dependency graphs

Kieker 1.4 User Guide 49

Page 50: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5.3.5 HTML Output of the System Model

Kieker.TraceAnalysis writes an HTML representation of the system model reconstructedfrom the trace data to a file system-entities.html. Figure 5.10 shows a screenshot ofthis file rendered by a web browser.

Figure 5.10: HTML output of the system model reconstructed from the traces

Kieker 1.4 User Guide 50

Page 51: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

A Wrapper scripts

The bin/ directory of Kieker’s binary release contains some .sh and .bat scripts toinvoke tools included in kieker-1.4.jar. The following sections give a short descriptionof their functionality and list their usage outputs as printed to the standard outputstream when called without command-line parameters. In addition to the standardoutput stream, the file kieker.log is used for logging output during execution.

!The Windows .bat wrapper scripts must be executed from within thebin/ directory.

A.1 Script convertLoggingTimestamp.sh|bat

The script converts Kieker.Monitoring logging timestamps, representing the number ofnanoseconds since 1 Jan 1970 00:00 UTC, to a human-readable textual representationin the UTC and local timezones.

Main-class: kieker.tools.loggingTimestampConverter.LoggingTimestampConverterTool

Usage

usage: kieker . tools . loggingTimestampConverter.LoggingTimestampConverterTool −t<timestamp1 ... timestampN>

−t,−−timestamps <timestamp1 ... timestampN> List of timestamps (UTC timezone)to convert

ExampleThe following listing shows the command to convert two logging timestamps as well

as the resulting output.

. bin/convertLoggingTimestamp.sh - -timestamps 1283156545581511026 12831565461271172461283156545581511026: Mo, 30 Aug 2010 08:22:25 +0000 (UTC) (Mo, 30 Aug 2010 10:22:25 +0200 (local

time))1283156546127117246: Mo, 30 Aug 2010 08:22:26 +0000 (UTC) (Mo, 30 Aug 2010 10:22:26 +0200 (local

time))

Listing A.1: Execution under UNIX-like systems

Kieker 1.4 User Guide 51

Page 52: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

. convertLoggingTimestamp.bat - -timestamps 1283156545581511026 12831565461271172461283156545581511026: Mo, 30 Aug 2010 08:22:25 +0000 (UTC) (Mo, 30 Aug 2010 10:22:25 +0200 (local

time))1283156546127117246: Mo, 30 Aug 2010 08:22:26 +0000 (UTC) (Mo, 30 Aug 2010 10:22:26 +0200 (local

time))

Listing A.2: Execution under Windows

A.2 Script logReplay.sh|bat

Replays filesystem monitoring logs created by Kieker.Monitoring. Example applicationsare:• Merging multiple directories containing monitoring data into a single output di-

rectory.• Importing a filesystem monitoring log to another monitoring log, e.g., a database.

Therefore, an appropriate Kieker.Monitoring configuration file must be passed tothe script (see Section 3.2).• Replaying a recorded filesystem monitoring log in real-time in order to simulate

incoming monitoring data from a running system, e.g., via JMS (see also Ap-pendix C).

Main-class: kieker.tools.logReplayer.FilesystemLogReplayerStarter

Usage

usage: kieker . tools . logReplayer . FilesystemLogReplayerStarter−i,−−inputdirs <dir1 ... dirN> Log directories to read data from−−ignore−records−after−date <yyyyMMdd−HHmmss> Records logged after this date

(UTC timezone) are ignored( disabled by default ) .

−−ignore−records−before−date <yyyyMMdd−HHmmss> Records logged before this date(UTC timezone) are ignored( disabled by default ) .

−k,−−keep−logging−timestamps <true|false> Replay the original loggingtimestamps ( defaults to true)?)

−n,−−realtime−worker−threads <num> Number of worker threads used inrealtime mode (defaults to 1).

−r,−−realtime <true|false> Replay log data in realtime ?

ExampleThe following command replays the monitoring testdata included in the binary releaseto another directory:

Kieker 1.4 User Guide 52

Page 53: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

. bin/logReplay.sh- -inputdirs examples/userguide/ch5–trace-monitoring-aspectj/testdata/kieker-20100830-082225522-UTC- -keep-logging-timestamps true- -realtime false

Listing A.3: Execution under UNIX-like systems

. logReplay.bat- -inputdirs ..\examples\userguide\ch5–trace-monitoring-aspectj\testdata\kieker-20100830-082225522-UTC- -keep-logging-timestamps true- -realtime false

Listing A.4: Execution under Windows

A.3 Script trace-analysis.sh|bat

Calls Kieker.TraceAnalysis to analyze and visualize monitored trace data, as described inChapter 5.

Main-class: kieker.tools.traceAnalysis.TraceAnalysisTool

Kieker 1.4 User Guide 53

Page 54: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Usage

usage: kieker . tools . traceAnalysis . TraceAnalysisTool −i <dir1 ... dirN> −o <dir>[−p <prefix>] [−−plot−Deployment−Sequence−Diagrams][−−plot−Assembly−Sequence−Diagrams][−−plot−Deployment−Component−Dependency−Graph][−−plot−Assembly−Component−Dependency−Graph][−−plot−Container−Dependency−Graph][−−plot−Deployment−Operation−Dependency−Graph][−−plot−Assembly−Operation−Dependency−Graph][−−plot−Aggregated−Deployment−Call−Tree][−−plot−Aggregated−Assembly−Call−Tree] [−−plot−Call−Trees][−−print−Message−Traces] [−−print−Execution−Traces][−−print−invalid−Execution−Traces][−−print−Deployment−Equivalence−Classes][−−print−Assembly−Equivalence−Classes] [−−select−traces <id0 ... idn>][−−ignore−invalid−traces] [−−max−trace−duration <duration in ms>][−−ignore−executions−before−date <yyyyMMdd−HHmmss>][−−ignore−executions−after−date <yyyyMMdd−HHmmss>][−−short−labels]

−i,−−inputdirs <dir1 ... dirN> Log directories to readdata from

−o,−−outputdir <dir> Directory for thegenerated file (s)

−p,−−output−filename−prefix <prefix> Prefix for outputfilenames

−−plot−Deployment−Sequence−Diagrams Generate and storedeployment−levelsequence diagrams (. picfiles )

−−plot−Assembly−Sequence−Diagrams Generate and storeassembly−level sequencediagrams (. pic files )

−−plot−Deployment−Component−Dependency−Graph Generate and store adeployment−levelcomponent dependencygraph (.dot file )

−−plot−Assembly−Component−Dependency−Graph Generate and store anassembly−level componentdependency graph (.dotfile )

−−plot−Container−Dependency−Graph Generate and store acontainer dependencygraph (.dot file )

−−plot−Deployment−Operation−Dependency−Graph Generate and store adeployment−leveloperation dependencygraph (.dot file )

−−plot−Assembly−Operation−Dependency−Graph Generate and store anassembly−level operationdependency graph (.dotfile )

−−plot−Aggregated−Deployment−Call−Tree Generate and store anaggregateddeployment−level calltree (.dot files )

−−plot−Aggregated−Assembly−Call−Tree Generate and store anaggregatedassembly−level call tree(.dot files )

Kieker 1.4 User Guide 54

Page 55: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

−−plot−Call−Trees Generate and store calltrees for the selectedtraces (.dot files )

−−print−Message−Traces Save message tracerepresentations of validtraces (. txt files )

−−print−Execution−Traces Save execution tracerepresentations of validtraces (. txt files )

−−print−invalid−Execution−Traces Save a execution tracerepresentations ofinvalid trace artifacts(. txt files )

−−print−Deployment−Equivalence−Classes Output an overview aboutthe deployment−leveltrace equivalenceclasses

−−print−Assembly−Equivalence−Classes Output an overview aboutthe assembly−level traceequivalence classes

−−select−traces <id0 ... idn> Consider only the tracesidentified by the list

of trace IDs. Defaultsto all traces .

−−ignore−invalid−traces If selected , theexecution aborts on theoccurence of an invalidtrace .

−−max−trace−duration <duration in ms> Threshold ( inmilliseconds ) afterwhich an incompletetrace becomes invalid .Defaults to 600000 (10minutes).

−−ignore−executions−before−date <yyyyMMdd−HHmmss> Executions startingbefore this date (UTCtimezone) are ignored .

−−ignore−executions−after−date <yyyyMMdd−HHmmss> Executions ending afterthis date (UTC timezone)are ignored .

−−short−labels If selected , abbreviatedlabels (e.g ., packagenames) are used in thevisualizations .

ExampleThe following commands generate a deployment-level operation dependency graph andconvert it to pdf format:

. bin/trace-analysis.sh- -inputdirs examples/userguide/ch5–trace-monitoring-aspectj/testdata/kieker-20100830-082225522-UTC- -outputdir .- -plot-Deployment-Operation-Dependency-Graph

. dot -T pdf deploymentOperationDependencyGraph.dot > deploymentOperationDependencyGraph.pdf

Listing A.5: Execution under UNIX-like systems

Kieker 1.4 User Guide 55

Page 56: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

. trace-analysis.bat- -inputdirs ..\examples\userguide\ch5–trace-monitoring-aspectj\testdata\kieker-20100830-082225522-UTC- -outputdir .- -plot-Deployment-Operation-Dependency-Graph

. dot -T pdf deploymentOperationDependencyGraph.dot > deploymentOperationDependencyGraph.pdf

Listing A.6: Execution under Windows

Additional examples can be found in Chapter 5.

A.4 Script dotPic-fileConverter.sh|bat

Converts each .dot and .pic file, e.g., diagrams generated by Kieker.TraceAnalysis (Sec-tion 5), located in a directory into desired graphic output formats. This scripts simplycalls the Graphviz and PlotUtils tools dot and pic2plot.

Usage

Usage: dotPic−fileConverter .sh <output−directory> <file−type−1 ... file−type−N>

ExampleThe following command converts each .dot and .pic file located in the directory out/

to files in .pdf and .png format:

. bin/dotPic-fileConverter.sh out/ pdf png

Listing A.7: Execution under UNIX-like systems

. dotPic-fileConverter.bat out\ pdf png

Listing A.8: Execution under Windows

Kieker 1.4 User Guide 56

Page 57: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

B Java EE Servlet Container Example

The Kieker download site1 includes an additional example JavaEEServletContainerEx-ample. Using the sample Java Web application iBATIS JPetStore2, this example demon-strates how to employ Kieker.Monitoring for monitoring a Java application running in aJava EE container—in this case, Apache Tomcat3. Monitoring probes based on theJava EE Servlet API and AspectJ are used to monitor execution, trace, and session data(see Section 5).

B.1 Preparation of the Tomcat Servlet Container

1. Copy the files kieker-1.4.jar, commons-logging-1.1.1.jar, and aspectjweaver-

1.6.11.jar from Kieker’s binary distribution to the Tomcat’s lib/ directory.2. Copy the file kieker-monitoring-servlet-1.4.war from Kieker’s binary distri-

bution to the Tomcat’s webapps/ directory.3. Tomcat’s lib/ directory contains the files kieker.monitoring.properties and

aop.xml — the configuration of Kieker.Monitoring and the AspectJ-based instru-mentation.

4. Tomcat’s start script bin/catalina.{sh|bat} file was modified to add the locationof the kieker.monitoring.properties and the AspectJ agent to the argumentlist of the JVM call:

188 # Activate Kieker with AspectJ load−time−weaving agent and custom conguration189 JAVA OPTS=”${JAVA OPTS} −javaagent:$CATALINA BASE/lib/aspectjweaver−1.6.11.jar −Dorg.

aspectj.weaver.showWeaveInfo=false −Daj.weaving.verbose=false”190 JAVA OPTS=”${JAVA OPTS} −Dkieker.monitoring.configuration=$CATALINA BASE/lib/META−INF/

kieker.monitoring.properties”

Listing B.1: Excerpt from catalina.sh (for UNIX-like systems)

121 rem Activate Kieker with AspectJ load−time−weaving agent and custom configuration122 set JAVA OPTS=%JAVA OPTS% −javaagent:%CATALINA BASE%\lib\aspectjweaver−1.6.11.jar −

Dorg.aspectj.weaver.showWeaveInfo=false −Daj.weaving.verbose=false123 set JAVA OPTS=%JAVA OPTS% −Dkieker.monitoring.configuration=%CATALINA BASE%\lib\META

−INF\kieker.monitoring.properties

Listing B.2: Excerpt from catalina.bat (for Windows)

1http://sourceforge.net/projects/kieker/files2http://ibatis.apache.org/3http://tomcat.apache.org/

Kieker 1.4 User Guide 57

Page 58: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

5. A prepared jpetstore.war file is already located in the Tomcat’s webapps/ direc-tory. If you want to rebuild the sources, for example to modify the instrumentation,see Section B.3.

B.2 JPetStore and Kieker.Monitoring Control Servlet

We will now start the Tomcat server and generate some monitoring data by manuallyaccessing the JPetStore web application.

1. Start the Tomcat server using the bin/startup.sh or bin/startup.bat (UNIX-like systems/Windows) script in the Tomcat’s bin/ directory.You should make sure, that the Tomcat started properly, by taking a look at thelogs/catalina.out file, logs/catalina.<date>.log file respectively. On error,the file logs/localhost.<date>.log may contain details to resolve the issue.

2. Now, you can access the JPetStore application by opening the URL http://

localhost:8080/jpetstore/ (Figure B.1(a)). Kieker intialization messages shouldappear in logs/catalina.out, logs/catalina.<date>.log respectively. Theoutput includes the information where the monitoring data is written to (shouldbe Tomcat’s temp/kieker-<DATE-TIME>/ directory).

3. Browse through the application to generate some monitoring data. This data canbe analyzed and visualized using Kieker.TraceAnalysis, as described in Chapter 5.

4. Kieker includes a servlet to control the status of Kieker.Monitoring. It can beaccessed via http://localhost:8080/kieker-monitoring-servlet-1.4/ (Fig-ure B.1(b)).

(a) iBATIS JPetStore (b) Kieker.Monitoring control servlet

Figure B.1

Kieker 1.4 User Guide 58

Page 59: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

B.3 Rebuilding the JPetStore Application

In order to rebuild the JPetStore sources (located in JPetStore-5.0-instrumented/),the following steps are required:

1. Copy the kieker-1.4.jar from Kieker’s binary distribution to the JPetStore’sdevlib/ directory. It is required for the annotation-based instrumentation (@Ope-rationExecutionMonitoringProbe), as described in Chapter 5

2. Build the JPetStore with the build.xml by calling ant from within build/ direc-tory.

3. You’ll find the packaged JPetStore .war-file in build/wars/.4. Copy the file to the Tomcat’s webapps/ directory.

Kieker 1.4 User Guide 59

Page 60: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

C Using the JMS Writer and Reader

This chapter gives a brief description on how to use the AsyncJMSWriter and JMSReader

classes. The directory examples/userguide/appendix-JMS/ contains the sources, antscripts etc. used in this example. It is based on the Bookstore application with manualinstrumentation presented in Chapter 2.

The following sections provide step-by-step instructions for the JMS server imple-mentations ActiveMQ (Section C.1), HornetQ (C.2), and OpenJMS (C.3). The generalprocedure for each example is the following:

1. Download and prepare the respective JMS server implementation2. Copy required libraries to the example directory3. Start the JMS server4. Start the analysis instance which receives records via JMS5. Start the monitoring instance which sends records via JMS

!Due to a bug in the JMS-server some executions of the following ex-amples could be problematic if paths with space characters are used.Try to avoid such paths.

C.1 ActiveMQ

C.1.1 Download and Prepare ActiveMQ

Download an ActiveMQ archive from http://activemq.apache.org/activemq-550-release.

html and decompress it to the base directory of the example. Note, that there are twodifferent distributions, one for Unix/Linux/Cygwin and another one for Windows.

Under UNIX-like systems, you’ll need to set the executable-bit of the start script:

. chmod +x bin/activemq

Also under UNIX-like systems, make sure that the file bin/activemq includes UNIXline endings (e.g., using your favorite editor or the dos2unix tool).

C.1.2 Copy Kieker and OpenJMS Libraries

Kieker Libraries Copy the following files from Kieker’s binary distribution to the ex-ample’s lib/ directory.

Kieker 1.4 User Guide 60

Page 61: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

1. kieker-1.4.jar (from dist/)2. commons-logging-1.1.1.jar (from lib/)

ActiveMQ Libraries Copy the following files from the ActiveMQ release to the lib/

directory of this example:

1. activemq-all-<version>.jar (from ActiveMQ’s base directory)2. slf4j-log4j<version>.jar (from ActiveMQ’s lib/optional directory)3. log4j-<version>.jar (from ActiveMQ’s lib/optional directory)

C.1.3 Kieker Monitoring Configuration for ActiveMQ

The file examples/userguide/appendix-JMS/META-INF/kieker.monitoring.properties-activeMQ is already configured to use the AsyncJMSWriter via ActiveMQ. The importantproperties are the definition of the provider URL and the context factory:

kieker .monitoring. writer .jms.AsyncJMSWriter.ProviderUrl=tcp://127.0.0.1:61616/

Listing C.1: Excerpt from kieker.monitoring.properties-activemq configuring theprovider URL of the JMS writer via ActiveMQ

kieker .monitoring. writer .jms.AsyncJMSWriter.ContextFactoryType=org.apache.activemq.jndi.ActiveMQInitialContextFactory

Listing C.2: Excerpt from kieker.monitoring.properties-activemq configuring theconnection factory of the JMS writer via ActiveMQ

C.1.4 Running the Example

The execution of the example is performed by the following three steps:

1. Start the JMS server (you may have to set your JAVA_HOME variable first):

. bin/activemq start

Listing C.3: Start of the JMS server under UNIX-like systems

. bin\activemq

Listing C.4: Start of the JMS server under Windows

2. Start the analysis part (in a new terminal):

. ant run−analysis−activemq

3. Start the instrumented Bookstore (in a new terminal):

. ant run−monitoring−activemq

Kieker 1.4 User Guide 61

Page 62: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

C.2 HornetQ

C.2.1 Download and Prepare HornetQ

Download a HornetQ archive from http://www.jboss.org/hornetq/downloads.html

and decompress it to the root directory of the example.You need to create a queue in the HornetQ configuration file config/stand-alone/non-clustered/hornetq-jms.xml, as shown in Listing C.5.

<queue name=”queue1”><entry name=”/queue/queue1”/>

</queue>

Listing C.5: Queue definition to be added to the HornetQ configuration file

C.2.2 Copy Kieker and HornetQ Libraries

Kieker Libraries Copy the following files from Kieker’s binary distribution to the ex-ample’s lib/ directory.

1. kieker-1.4.jar (from dist/)2. commons-logging-1.1.1.jar (from lib/)

HornetQ Libraries Copy the following files from the HornetQ lib/ folder to the lib/

directory of this example:

1. hornetq-jms-client.jar

2. hornetq-core-client.jar

3. jboss-jms-api.jar

4. jnp-client.jar

5. netty.jar

C.2.3 Kieker Monitoring Configuration for HornetQ

The file examples/userguide/appendix-JMS/META-INF/kieker.monitoring.properties-hornetq is already configured to use the AsyncJMSWriter via HornetQ. The importantproperties are the definition of the provider URL, the context factory, and the queue:

kieker .monitoring. writer .jms.AsyncJMSWriter.ProviderUrl=jnp://localhost:1099/

Listing C.6: Excerpt from kieker.monitoring.properties-hornetq configuring theprovider URL of the JMS writer via HornetQ

kieker .monitoring. writer .jms.AsyncJMSWriter.ContextFactoryType=org.jnp.interfaces.NamingContextFactory

Listing C.7: Excerpt from kieker.monitoring.properties-hornetq configuring theconnection factory of the JMS writer via HornetQ

Kieker 1.4 User Guide 62

Page 63: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

C.2.4 Running the Example

The execution of the example is performed by the following three steps:

1. Start the JMS server:

. ./run.sh

Listing C.8: Start of the JMS server under UNIX-like systems

. run.bat

Listing C.9: Start of the JMS server under Windows

Note that the script must be called from within HornetQ’s bin/ directory.

2. Start the analysis part (in a new terminal):

. ant run−analysis−hornetq

3. Start the instrumented Bookstore (in a new terminal):

. ant run−monitoring−hornetq

C.3 OpenJMS

C.3.1 Download and Prepare OpenJMS

Download an OpenJMS install archive from http://openjms.sourceforge.net anddecompress it to the root directory of the example. Unter UNIX-like systems, make surethat the executable-bit of all scripts within the bin/ directory are set.

C.3.2 Copy Kieker and OpenJMS Libraries

Kieker Libraries Copy the following files from Kieker’s binary distribution to the ex-ample’s lib/ directory.

1. kieker-1.4.jar (from dist/)2. commons-logging-1.1.1.jar (from lib/)

OpenJMS Libraries Copy the following files from the OpenJMS lib/ folder to thelib/ directory of this example:

1. openjms-<version>.jar

2. openjms-common-<version>.jar

3. openjms-net-<version>.jar

4. jms-<version>.jar

5. concurrent-<version>.jar

6. spice-jndikit-<version>.jar

Kieker 1.4 User Guide 63

Page 64: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

C.3.3 Kieker Monitoring Configuration for OpenJMS

The file examples/userguide/appendix-JMS/META-INF/kieker.monitoring.properties-openjms is already configured to use the AsyncJMSWriter via OpenJMS. The importantproperties are the definition of the provider URL and the context factory:

kieker .monitoring. writer .jms.AsyncJMSWriter.ProviderUrl=tcp://127.0.0.1:3035/

Listing C.10: Excerpt from kieker.monitoring.properties-openjms configuring theprovider URL of the JMS writer via OpenJMS

kieker .monitoring. writer .jms.AsyncJMSWriter.ContextFactoryType=org.exolab.jms.jndi.InitialContextFactory

Listing C.11: Excerpt from kieker.monitoring.properties-openjms configuring theconnection factory of the JMS writer via OpenJMS

C.3.4 Running the Example

The execution of the example is performed by the following three steps:

1. Start the JMS server (you may have to set your JAVA_HOME and OPENJMS_HOME

variables first):

. openjms−<version>/bin/startup.sh

Listing C.12: Start of the JMS server under UNIX-like systems

. openjms−<version>\bin\startup.bat

Listing C.13: Start of the JMS server under Windows

2. Start the analysis part (in a new terminal):

. ant run−analysis−openjms

3. Start the instrumented Bookstore (in a new terminal):

. ant run−monitoring−openjms

Kieker 1.4 User Guide 64

Page 65: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

D Sigar-Based Samplers for System-LevelMonitoring

This chapter gives a brief description on how to use the included periodic samplers(Section 3.1.4) for monitoring CPU utilization and memory/swap usage. The directoryexamples/userguide/appendix-Sigar/ contains the sources, ant scripts etc. used inthis example. These samplers employ the Sigar API [1].

D.1 Preparation

1. Copy the files kieker-1.4.jar, commons-logging-1.1.1.jar, and sigar-1.6.3.jar

from the binary distribution to the example’s lib/ directory.2. Additionally, depending on the underlying system platform, corresponding Sigar

native libraries need to be placed in the example’s lib/ directory. Kieker’s lib/sigar-native-libs/ folder already includes the right libraries for 32 and 64 bit Lin-ux/Windows platforms. Native libraries for other platforms can be downloadedfrom [1].

D.2 Using the Sigar-Based Samplers

The Sigar API [1] provides access to a number of system-level inventory and monitoringdata, e.g., regarding memory, swap, cpu, file system, and network devices. Kieker in-cludes Sigar-based samplers for monitoring CPU utilization (CPUsDetailedPercSampler,CPUsCombinedPercSampler) and memory/swap usage (MemSwapUsageSampler). Whenregistered as a periodic sampler (Section 3.1.4), these samplers collect the data of interestemploying the Sigar API, and write monitoring records of types CPUUtilizationRecord,ResourceUtilizationRecord, and MemSwapUsageRecord respectively to the configuredmonitoring log/stream.

Listing D.1 shows an excerpt from this example’s MonitoringStarter which createsand registers two Sigar-based peridioc samplers. For reasons of performance and thread-safety, the SigarSamplerFactory should be used to create instances of the Sigar-basedSamplers.

Kieker 1.4 User Guide 65

Page 66: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

40 final ISigarSamplerFactory sigarFactory = SigarSamplerFactory.getInstance () ;4142 final CPUsDetailedPercSampler cpuSampler = sigarFactory.createSensorCPUsDetailedPerc

();43 final MemSwapUsageSampler memSwapSampler = sigarFactory.

createSensorMemSwapUsage();4445 final long offset = 2; // start after 2 seconds46 final long period = 5; // monitor every 5 seconds4748 monitoringController . schedulePeriodicSampler(cpuSampler, offset , period , TimeUnit.

SECONDS);49 monitoringController . schedulePeriodicSampler(memSwapSampler, offset, period,

TimeUnit.SECONDS);

Listing D.1: Excerpt from MonitoringStarter.java

Based on the existing samplers, users can easily create custom Sigar-based samplers byextending the class AbstractSigarSampler. For example, Listing 3.1 in Section 3.1.4shows the MemSwapUsageSampler’s sample method. Typically, it is also required to definea corresponding monitoring record type, as explained in Section 3.3. When implementingcustom Sigar-based samplers, the SigarSamplerFactory’s getSigar method should beused to retrieve a Sigar instance.

This example uses a stand-alone Java application to set up a Sigar-based monitoringprocess. When using servlet containers, users may consider implementing this routineas a ServletContextListener, which are executed when the container is started andshutdown. As an example, Kieker includes a CPUMemUsageServletContextListener.

D.3 Executing the Example

The execution of the example is performed by the following two steps:

1. Monitoring CPU utilization and memory usage for 30 seconds (class Monitor-

ingStarter):

. ant run−monitoring

Kieker’s console output lists the location of the directory containing the file systemmonitoring log. The following listing shows an excerpt:

Writer: ’ kieker.monitoring.writer.filesystem.AsyncFsWriter ’Configuration:

kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueFullBehavior =’0’kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueSize =’10000’kieker.monitoring.writer.filesystem.AsyncFsWriter.customStoragePath =’’kieker.monitoring.writer.filesystem.AsyncFsWriter.storeInJavaIoTmpdir =’true’

Writer Threads (1):Finished: ’ false ’; Writing to Directory: ’/tmp/

kieker−20110511−10095928−UTC−avanhoorn−thinkpad−KIEKER−SINGLETON’

Kieker 1.4 User Guide 66

Page 67: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

A sample monitoring log can be found in the directory examples/userguide/appendix-

Sigar/testdata/kieker-20110511-10095928-UTC-avanhoorn-thinkpad-KIEKER-

SINGLETON/.2. Analyzing the monitoring data (class AnalysisStarter):

. ant run−analysis -Danalysis.directory=</path/to/monitoring/log/>

You need to replace </path/to/monitoring/log/> by the location of the file sys-tem monitoring log. You can also use the above-mentioned monitoring log includedin the example.The AnalysisStarter produces a simple console output for each monitoring record,as shown in the following excerpt:

Wed, 11 May 2011 10:10:01 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 0.00 %Wed, 11 May 2011 10:10:01 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 0.00 %Wed, 11 May 2011 10:10:01 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 722.0 MB ;

swap usage: 0.0 MBWed, 11 May 2011 10:10:06 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 5.35 %Wed, 11 May 2011 10:10:06 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 1.31 %Wed, 11 May 2011 10:10:06 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 721.0 MB ;

swap usage: 0.0 MBWed, 11 May 2011 10:10:11 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 1.80 %Wed, 11 May 2011 10:10:11 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 0.20 %Wed, 11 May 2011 10:10:11 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 721.0 MB ;

swap usage: 0.0 MBWed, 11 May 2011 10:10:16 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 1.40 %Wed, 11 May 2011 10:10:16 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 0.79 %Wed, 11 May 2011 10:10:16 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 721.0 MB ;

swap usage: 0.0 MBWed, 11 May 2011 10:10:21 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 1.80 %Wed, 11 May 2011 10:10:21 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 0.79 %Wed, 11 May 2011 10:10:21 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 721.0 MB ;

swap usage: 0.0 MBWed, 11 May 2011 10:10:26 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 0 ; utilization: 0.40 %Wed, 11 May 2011 10:10:26 +0000 (UTC): [CPU] host: thinkpad ; cpu−id: 1 ; utilization: 0.59 %Wed, 11 May 2011 10:10:26 +0000 (UTC): [Mem/Swap] host: thinkpad ; mem usage: 721.0 MB ;

swap usage: 0.0 MB

Kieker 1.4 User Guide 67

Page 68: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

E Kieker.Monitoring Default Configuration

This is the file kieker.monitoring.properties from the binary release and constitutesKieker.Monitoring’s default configuration. Section 3.2 describes how to use a customconfiguration.

## 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

# 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.kieker .monitoring. initialExperimentId =1

# Whether any JMX functionality is availablekieker .monitoring.jmx=falsekieker .monitoring.jmx.domain=kieker.monitoring

# Enable/Disable the MonitoringController MBeankieker .monitoring.jmx. MonitoringController =truekieker .monitoring.jmx. MonitoringController .name=MonitoringController

# Controls JMX remote accesskieker .monitoring.jmx.remote=falsekieker .monitoring.jmx.remote.port=59999kieker .monitoring.jmx.remote.name=JMXServer

Kieker 1.4 User Guide 68

Page 69: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

# 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 servercom.sun.management.jmxremote.local.only=falsecom.sun.management.jmxremote.authenticate=falsecom.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 Timer used by Kieker. You usually don’t want to change the value.kieker .monitoring. timer=kieker.monitoring. timer .DefaultSystemTimer# You can specify additional parameters sent to the Timer, e.g.#kieker.monitoring.timer.DefaultSystemTimer.KEY=VALUE

# 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

################################## WRITER #################################### Selection of monitoring data writer (classname)## The value must be a fully−qualified classname of a class implementing## kieker.monitoring.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 DummyWriterkieker .monitoring. writer .DummyWriter.key=value

######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 1.4 User Guide 69

Page 70: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

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=.### 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### 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=.### When flushing is disabled, it could require a lot of records before## finally any writing is done.kieker .monitoring. writer . filesystem .AsyncFsWriter. flush =true### 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.namedRecordPipe.PipeWriter### The name of the pipe used (must not be empty).kieker .monitoring. writer .namedRecordPipe.PipeWriter.pipeName=kieker−pipe

Kieker 1.4 User Guide 70

Page 71: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

######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.InitialContextFactorykieker .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

Kieker 1.4 User Guide 71

Page 72: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

kieker .monitoring. writer .database.SyncDbWriter.DriverClassname=com.mysql.jdbc.Driver### Connection string## Examples:## MySQL: jdbc :mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASSkieker .monitoring. writer .database.SyncDbWriter.ConnectionString=jdbc:mysql://HOSTNAME/

DBNAME?user=DBUSER&password=DBPASS### Name of the database table## (can be generated using the file table−for−monitoring.sql)kieker .monitoring. writer .database.SyncDbWriter.TableName=kiekerdata

######kieker.monitoring.writer=kieker.monitoring.writer.database.AsyncDbWriter### Database driver classname## Examples: MySQL −> com.mysql.jdbc.Driverkieker .monitoring. writer .database.AsyncDbWriter.DriverClassname=com.mysql.jdbc.Driver### Connection string## Examples:## MySQL: jdbc :mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS## DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASSkieker .monitoring. writer .database.AsyncDbWriter.ConnectionString=jdbc:mysql://HOSTNAME/

DBNAME?user=DBUSER&password=DBPASS### Name of the database table## (can be generated using the file table−for−monitoring.sql)kieker .monitoring. writer .database.AsyncDbWriter.TableName=kiekerdata### The number of concurrent Database connections.kieker .monitoring. writer .database.AsyncDbWriter.numberOfConnections=4### Load the initialExperimentId from the DB and increase it by 1## instead of using the value from the configuration .## (Currently not implemented!)kieker .monitoring. writer .database.AsyncDbWriter. loadInitialExperimentId =false### 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 1.4 User Guide 72

Page 73: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

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

Listing E.1: kieker.monitoring.properties

Kieker 1.4 User Guide 73

Page 74: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

F Additional Source Code Listings

F.1 MyNamedPipeManager and MyPipe

21 package bookstoreApplication;2223 import java. util .HashMap;2425 public class MyNamedPipeManager {2627 private static final MyNamedPipeManager PIPE MGR INSTANCE = new

MyNamedPipeManager();2829 /∗ Not synchronized! ∗/30 private final HashMap<String, MyPipe> pipeMap = new HashMap<String, MyPipe>();3132 public static MyNamedPipeManager getInstance() {33 return MyNamedPipeManager.PIPE MGR INSTANCE;34 }3536 /∗∗37 ∗ Returns a pipe with name pipeName. If a pipe with this name does not38 ∗ exist prior to the call , it will be created .39 ∗40 ∗ @param pipeName name of the (new) pipe.41 ∗ @return the pipe42 ∗ @throws IllegalArgumentException43 ∗ if the given name is null or has length zero.44 ∗/45 public synchronized MyPipe acquirePipe(final String pipeName)46 throws IllegalArgumentException {47 if ((pipeName == null) || (pipeName.length() == 0)) {48 throw new IllegalArgumentException(”Invalid connection name: ’” + pipeName + ”

’”);49 }50 MyPipe conn = this.pipeMap.get(pipeName);51 if (conn == null) {52 conn = new MyPipe(pipeName);53 this .pipeMap.put(pipeName, conn);54 }55 return conn;56 }57 }

Listing F.1: MyNamedPipeManager.java

Kieker 1.4 User Guide 74

Page 75: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

21 package bookstoreApplication;2223 import java. util . concurrent .LinkedBlockingQueue;24 import java. util . concurrent .TimeUnit;2526 public class MyPipe {27 private final String pipeName;28 private final LinkedBlockingQueue<PipeData> buffer =29 new LinkedBlockingQueue<PipeData>();3031 public MyPipe(final String pipeName) {32 this .pipeName = pipeName;33 }3435 public String getPipeName() {36 return this .pipeName;37 }3839 public void put( final PipeData data) throws InterruptedException {40 this . buffer .put(data);41 }4243 public PipeData poll( final long timeout) throws InterruptedException {44 return this . buffer . poll (timeout, TimeUnit.SECONDS);45 }4647 }

Listing F.2: MyPipe.java

21 package bookstoreApplication;2223 public class PipeData {24 private final long loggingTimestamp;25 private final Object [] recordData;2627 public PipeData(final long loggingTimestamp, final Object [] recordData) {28 this . loggingTimestamp = loggingTimestamp;29 this .recordData = recordData;30 }3132 public final long getLoggingTimestamp() {33 return this . loggingTimestamp;34 }3536 public final Object [] getRecordData() {37 return this .recordData;38 }39 }

Listing F.3: PipeData.java

Kieker 1.4 User Guide 75

Page 76: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

G Example Console Outputs

G.1 Quick Start Example (Chapter 2)

Apr 28, 2011 5:15:25 PM kieker.monitoring. core . configuration . Configuration createSingletonConfigurationINFO: Loading properties from properties file in classpath : ’META−INF/kieker.monitoring.properties’Apr 28, 2011 5:15:25 PM kieker.monitoring. core . configuration . Configuration loadConfigurationFromResourceWARNING: File ’META−INF/kieker.monitoring.properties’ not found in classpathApr 28, 2011 5:15:25 PM kieker.monitoring. core . controller . MonitoringController createInstanceINFO: Current State of kieker .monitoring (1.3−20110427) Status: ’enabled’

Name: ’KIEKER−SINGLETON’; Hostname: ’Kaapstad’; experimentID: ’1’WriterController :

Number of Inserts : ’0’Automatic assignment of logging timestamps: ’ true ’

Writer : ’ kieker .monitoring. writer . filesystem .AsyncFsWriter’Configuration :

kieker .monitoring. writer . filesystem .AsyncFsWriter.QueueFullBehavior=’0’kieker .monitoring. writer . filesystem .AsyncFsWriter.QueueSize=’10000’kieker .monitoring. writer . filesystem .AsyncFsWriter.customStoragePath=’’kieker .monitoring. writer . filesystem .AsyncFsWriter.storeInJavaIoTmpdir=’true’

Writer Threads (1):Finished : ’ false ’; Writing to Directory : ’/tmp/kieker−20110428−151525684−UTC−Kaapstad−

KIEKER−SINGLETON’Sampling Controller : Periodic Sensor available : Current Poolsize : ’0’; Scheduled Tasks: ’0’Bookstore.main: Starting request 0Bookstore.main: Starting request 1Apr 28, 2011 5:15:25 PM kieker.monitoring. writer . filesystem .MappingFileWriter writeMappingINFO: Registered monitoring record type with id ’1’: kieker .common.record.OperationExecutionRecordBookstore.main: Starting request 2Bookstore.main: Starting request 3Bookstore.main: Starting request 4

Listing G.1: Execution of the manually instrumented Bookstore application (Section 2.3)

Kieker 1.4 User Guide 76

Page 77: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Apr 28, 2011 3:46:50 PM kieker.common.record.MonitoringRecordTypeRegistry registerRecordTypeIdMappingINFO: Registered record type mapping 1/kieker.common.record.OperationExecutionRecordApr 28, 2011 3:46:50 PM kieker. analysis . reader . filesystem .FSDirectoryReader processInputFileINFO: < Loading /tmp/kieker−20110427−142244899−UTC−Kaapstad−KIEKER−SINGLETON/kieker

−20110427−142244920−UTC−Thread−1.datmaximum response time exceeded by 211238 ns: bookstoreApplication.Catalog.getBook(..)maximum response time exceeded by 193785 ns: bookstoreApplication.Catalog.getBook()maximum response time exceeded by 197205 ns: bookstoreApplication.Catalog.getBook(..)maximum response time exceeded by 226278 ns: bookstoreApplication.Catalog.getBook()maximum response time exceeded by 191895 ns: bookstoreApplication.Catalog.getBook(..)maximum response time exceeded by 229681 ns: bookstoreApplication.Catalog.getBook()maximum response time exceeded by 228173 ns: bookstoreApplication.Catalog.getBook(..)maximum response time exceeded by 196394 ns: bookstoreApplication.Catalog.getBook()maximum response time exceeded by 227399 ns: bookstoreApplication.Catalog.getBook(..)maximum response time exceeded by 227027 ns: bookstoreApplication.Catalog.getBook()Apr 28, 2011 3:46:50 PM kieker. analysis . reader . filesystem .FSReaderCons executeINFO: All reader threads provided FS READER TERMINATION MARKER

Listing G.2: Execution of the example analysis (Section 2.4)

Kieker 1.4 User Guide 77

Page 78: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

G.2 Trace Monitoring, Analysis & Visualization (Chapter 5)

Bookstore.main: Starting request 0Apr 28, 2011 4:28:29 PM kieker.monitoring. core . configuration . Configuration createSingletonConfigurationINFO: Loading properties from properties file in classpath : ’META−INF/kieker.monitoring.properties’Apr 28, 2011 4:28:29 PM kieker.monitoring. core . controller . MonitoringController createInstanceINFO: Current State of kieker .monitoring (1.3−20110427) Status: ’enabled’

Name: ’KIEKER’; Hostname: ’Kaapstad’; experimentID: ’1’WriterController :

Number of Inserts : ’0’Automatic assignment of logging timestamps: ’ true ’

Writer : ’ kieker .monitoring. writer . filesystem .AsyncFsWriter’Configuration :

kieker .monitoring. writer . filesystem .AsyncFsWriter.QueueFullBehavior=’0’kieker .monitoring. writer . filesystem .AsyncFsWriter.QueueSize=’10000’kieker .monitoring. writer . filesystem .AsyncFsWriter.customStoragePath=’’kieker .monitoring. writer . filesystem .AsyncFsWriter.storeInJavaIoTmpdir=’true’

Writer Threads (1):Finished : ’ false ’; Writing to Directory : ’/tmp/kieker−20110428−142829399−UTC−Kaapstad−

KIEKER’Sampling Controller : Periodic Sensor available : Current Poolsize : ’0’; Scheduled Tasks: ’0’Apr 28, 2011 4:28:29 PM kieker.monitoring. core . registry . ControlFlowRegistry <init>INFO: First threadId will be 7752665283541598209Apr 28, 2011 4:28:29 PM kieker.monitoring. writer . filesystem .MappingFileWriter writeMappingINFO: Registered monitoring record type with id ’1’: kieker .common.record.OperationExecutionRecord

Listing G.3: Execution of the Bookstore with AspectJ trace instrumentation (Section 5.1.1)

Kieker 1.4 User Guide 78

Page 79: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

H Ant Scripts

H.1 Quick Start Example (Chapter 2)

The following build.xml and build.properties files can be used for compiling and exe-cuting the manually instrumentated Bookstore application and the analysis, as describedin Chapter 2. The files are included in the directory examples/userguide/ch2-manual-

instrumentation/.In order to run the analysis of the application, it is necessary to pass the location of

the monitoring log directory. This is done via the parameter analysis.directory, e.g.:

. ant run−analysis −Danalysis.directory /tmp/kieker−20110428−142829399−UTC−Kaapstad/

Listing H.1: Command to compile and run the instrumented Bookstore via ant

build . dir =buildsrc . dir =srclib . dir =lib

jar . file .monitoring=BookstoreMonitoring.jarjar . file . analysis =BookstoreAnalysis. jar

jar . file .commons−logging=commons−logging−1.1.1.jarjar . file . kieker =kieker−∗.jar

main−class−monitoring=bookstoreApplication.BookstoreStartermain−class−analysis=bookstoreApplication. BookstoreAnalysisStarter

meta.dir=META−INF

msg.filesNotFound=One or more of the required libraries could not be found. Please add thefollowing files to the ${ lib . dir} directory : ${ jar . file .commons−logging}, ${jar.file . kieker }.

Listing H.2: build.properties

<project name=”Bookstore−Application” basedir=”.” default=”run−monitoring”>

<property file =”build . properties ” />

<condition property=”not−all−files−available”><resourcecount property=”num.requiredLibsFound” when=”ne” count=”2”><fileset dir =”${lib . dir}”><include name=”${jar.file .commons−logging}” />

Kieker 1.4 User Guide 79

Page 80: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<include name=”${jar.file . kieker}” /></fileset>

</resourcecount></condition>

<path id=”classpath”><fileset dir =”${lib . dir}” includes =”∗∗/∗.jar” />

</path>

<target name=”−check−files” if=”not−all−files−available”><fail message=”${msg.filesNotFound}” />

</target>

<target name=”run−monitoring” depends=”−check−files, −build−jar−monitoring”><java fork=”true” classname=”${main−class−monitoring}”><classpath><path refid=”classpath” /><path location=”${jar. file .monitoring}” />

</classpath></java>

</target>

<target name=”run−analysis” depends=”−check−files, −build−jar−analysis”><java fork=”true” classname=”${main−class−analysis}”><arg line=”${analysis . directory }” /><classpath><path refid=”classpath” /><path location=”${jar. file . analysis }” />

</classpath></java>

</target>

<target name=”−build−jar−monitoring” depends=”clean.monitoring, −compile”><jar destfile =”${jar. file .monitoring}” basedir=”${build. dir}”><manifest><attribute name=”Main−Class” value=”${main−class−monitoring}” />

</manifest></jar><delete dir=”${build. dir}” />

</target>

<target name=”−build−jar−analysis” depends=”clean.analysis, −compile”><jar destfile =”${jar. file . analysis }” basedir=”${build. dir}”><manifest><attribute name=”Main−Class” value=”${main−class−analysis}” />

</manifest></jar><delete dir=”${build. dir}” />

</target>

Kieker 1.4 User Guide 80

Page 81: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<target name=”−compile” depends=”−init”><javac srcdir=”${src. dir}” destdir =”${build. dir}” classpathref =”classpath” includeAntRuntime=

”false” /><mkdir dir=”${build.dir}/${meta.dir}” />

</target>

<target name=”−init”><delete dir=”${build. dir}” /><mkdir dir=”${build.dir}” />

</target>

<target name=”clean.monitoring”><delete file =”${jar. file .monitoring}” />

</target>

<target name=”clean.analysis”><delete file =”${jar. file . analysis }” />

</target>

<target name=”clean” depends=”clean.monitoring, clean. analysis ”></target>

</project>

Listing H.3: build.xml

Kieker 1.4 User Guide 81

Page 82: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

H.2 Custom Components (Chapters 3 and 4)

The following build.xml and build.properties files can be used for compiling andexecuting the manually instrumentated Bookstore application with the custom com-ponents, as described in Chapters 3 and 4. The files are included in the directoryexamples/userguide/ch3-4-custom-components/.

build . dir =buildsrc . dir =srclib . dir =libmeta.dir=META−INF

jar . file =BookstoreApplication. jarproperties . file =kieker.monitoring. properties

jar . file .commons−logging=commons−logging−1.1.1.jarjar . file . kieker =kieker−∗.jar

main−class=bookstoreApplication.Starter

meta.dir=META−INF

msg.filesNotFound=One or more of the required libraries could not be found. Please add thefollowing files to the ${ lib . dir} directory : ${ jar . file .commons−logging}, ${jar.file . kieker}

Listing H.4: build.properties

<project name=”Bookstore−Application” basedir=”.” default=”run”>

<property file =”build . properties ” />

<path id=”classpath”><fileset dir =”${lib . dir}” includes =”∗∗/∗.jar” />

</path>

<condition property=”not−all−files−available”><resourcecount property=”num.requiredLibsFound” when=”ne” count=”2”><fileset dir =”${lib . dir}”><include name=”${jar.file .commons−logging}” /><include name=”${jar.file . kieker}” />

</fileset></resourcecount>

</condition>

<target name=”−check−files” if=”not−all−files−available”><fail message=”${msg.filesNotFound}” />

</target>

<target name=”run” depends=”−check−files, −build−jar”><java fork=”true” classname=”${main−class}”>

Kieker 1.4 User Guide 82

Page 83: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<classpath><path refid=”classpath” /><path location=”${jar. file }” />

</classpath><jvmarg value=”−Dkieker.monitoring.configuration=${meta.dir}/${properties. file }” />

</java></target>

<target name=”−build−jar” depends=”−compile”><jar destfile =”${jar. file }” basedir=”${build. dir}”><manifest><attribute name=”Main−Class” value=”${main−class}” />

</manifest></jar><delete dir=”${build. dir}” />

</target>

<target name=”−compile” depends=”−init”><javac srcdir=”${src. dir}” destdir =”${build. dir}” classpathref =”classpath” includeAntRuntime=

”false” /><mkdir dir=”${build.dir}/${meta.dir}” /><copy file=”${meta.dir}/${properties . file }” tofile =”${build. dir}/${meta.dir}/${properties . file

}” /></target>

<target name=”−init” depends=”clean”><delete dir=”${build. dir}” /><mkdir dir=”${build.dir}” />

</target>

<target name=”clean”><delete file =”${jar. file }” />

</target>

</project>

Listing H.5: build.xml

Kieker 1.4 User Guide 83

Page 84: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

H.3 AspectJ-based Trace Monitoring (Chapter 5)

The following build.xml and build.properties files can be used for compiling and exe-cuting the Bookstore application instrumentated with AspectJ (see Chapter 5). The filesare included in the directory examples/userguide/ch5-trace-monitoring-aspectj/.

build . dir =buildsrc . dir =srclib . dir =libmeta.dir=META−INF

jar . file =BookstoreApplication. jarproperties . file =kieker.monitoring. properties

jar . file .commonslogging=commons−logging−1.1.1.jarjar . file . aspectjweaver=aspectjweaver−1.6.11.jarjar . file . kieker =kieker−∗.jar

main−class=bookstoreTracing.BookstoreStartermain−class−hostname−rewriter=bookstoreTracing.BookstoreHostnameRewriter

meta.dir=META−INF

msg.filesNotFound=One or more of the required libraries could not be found. Please add thefollowing files to the ${ lib . dir} directory : ${ jar . file .commonslogging}, ${jar. file .aspectjweaver}, ${ jar . file . kieker}

Listing H.6: build.properties

<project name=”Tutorial−Example” basedir=”.” default=”run”>

<property file =”build . properties ” />

<path id=”classpath”><fileset dir =”${lib . dir}” includes =”∗∗/∗.jar” />

</path>

<condition property=”not−all−files−available”><resourcecount property=”num.requiredLibsFound” when=”ne” count=”3”><fileset dir =”${lib . dir}”><include name=”${jar.file .commonslogging}” /><include name=”${jar.file . kieker}” /><include name=”${jar.file . aspectjweaver}” />

</fileset></resourcecount>

</condition>

<target name=”−check−files” if=”not−all−files−available”><fail message=”${msg.filesNotFound}” />

</target>

<target name=”run” depends=”−check−files, −build−jar”><java fork=”true” classname=”${main−class}”>

Kieker 1.4 User Guide 84

Page 85: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

<classpath><path refid=”classpath” /><path location=”${jar. file }” />

</classpath><arg line=”${num.requests}” />

<jvmarg value=”−javaagent:${lib.dir}/${jar . file . aspectjweaver}” /><jvmarg value=”−Dorg.aspectj.weaver.showWeaveInfo=true” /><jvmarg value=”−Daj.weaving.verbose=true” />

</java></target>

<target name=”run−hostname−rewriter” depends=”−check−files, −build−jar”><java fork=”true” classname=”${main−class−hostname−rewriter}”><arg line=”${analysis . directory }” /><classpath><path refid=”classpath” /><path location=”${jar. file }” />

</classpath></java>

</target>

<target name=”−build−jar” depends=”−compile”><copy file=”META−INF/aop.xml” tofile=”${build.dir}/META−INF/aop.xml” /><copy file=”META−INF/kieker.monitoring.properties” tofile=”${build. dir}/META−INF/kieker.

monitoring.properties” /><jar destfile =”${jar. file }” basedir=”${build. dir}”><manifest><attribute name=”Main−Class” value=”${main−class}” />

</manifest></jar><delete dir=”${build. dir}” />

</target>

<target name=”−compile” depends=”−init”><javac srcdir=”${src. dir}” destdir =”${build. dir}” classpathref =”classpath” includeAntRuntime=

”false” /></target>

<target name=”−init” depends=”clean”><delete dir=”${build. dir}” /><mkdir dir=”${build.dir}” />

</target>

<target name=”clean”><delete file =”${jar. file }” />

</target>

</project>

Listing H.7: build.xml

Kieker 1.4 User Guide 85

Page 86: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

I Libraries

The following table shows all libraries which are used by Kieker and explains them briefly.These libraries are included in the lib/ directory of both the Kieker binary and sourcedistributions.

The Apache Commons [8] library (commons-logging-1.1.1.jar) is the only third-party library always needed when using Kieker. The need to provide the additionallibraries in the classpath depends on the specific configuration. For example, the AspectJlibraries are only required when using AspectJ-based monitoring probes.

Filename License Description

aopalliance-alpha1.jar PD - v1.0 Providedes a common API foraspect-oriented programming(AOP)

aspectjrt-1.6.11.jar EPL - v 1.0 This jar-file contains the runtime li-brary for AspectJ programs.

aspectjtools-1.6.11.jar EPL - v 1.0 This package contains the tools(the AspectJ Compiler andBrowser) for AspectJ.

aspectjweaver-1.6.11.jar EPL - v 1.0 This jar contains the weaver-agentfor the aspect-oriented-extensionfor Java named AspectJ.

commons-cli-1.2.jar ASL - v2.0 Apache Commons CLI provides asimple API for working with thecommand line arguments and op-tions.

commons-logging-1.1.1.jar ASL - v2.0 Apache Commons Logging is athin adapter allowing configurablebridging to other, well known log-ging systems.

cxf-api-2.4.3.jar ASL - v2.0 Apache CXF is an open source ser-vices framework.

cxf-common-utilities-2.4.3.jar

ASL - v2.0 This package contains differentclasses for Apache CXF.

Kieker 1.4 User Guide 86

Page 87: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

cxf-rt-bindings-soap-2.4.3.jar

ASL - v2.0 This package contains necessaryfiles to use Apache CXF as wellwith the Simple Object Access Pro-tocol (SOAP).

cxf-rt-core-2.4.3.jar ASL - v2.0 This library contains the ApacheCXF Runtime Core.

derby-10.8.1.2.jar ASL - v2.0 Apache Derby is a lightweightdatabase written in Java whichcan also be used as an embeddeddatabase. This library contains thenecessary drivers for the databaseas well as the database manage-ment system itself.

javax.jms-1.1.jar CDDL - v1.0 Java Message Service is an API tosend and receive messages within aclient and to control so called Mes-sage Oriented Middleware (MOM).

javax.servlet-3.0.jar CDDL - v1.0 This package contains differentclasses for the work with servlets.

junit-4.10.jar CPL - v 1.0 This jar-file contains the necessaryclasses for the JUnit-tests, whichcan be used to test automaticallyJava classes.

log4j-1.2.16.jar ASL - v2.0 Apache log4j is a framework for thelogging of messages, errors and ex-ceptions in Java applications.

sigar-1.6.4.jar ASL - v2.0 Hyperic SIGAR (System Informa-tion Gatherer) provides a Java APIto system inventory and monitoringdata (Memory, CPU etc.). In addi-tion to the Jar file, it is requiredto add corresponding platform-specific native libraries to the class-path, which can be downloadedfrom [1]. Kieker’s lib/sigar-

native-libs/ folder already in-cludes the right libraries for 32 and64 bit Linux/Windows platforms.

Kieker 1.4 User Guide 87

Page 88: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

springframework.context-3.0.6.jar

ASL - v2.0 The spring framework delivers dif-ferent methods and classes to makethe handling with Java/Java EEeasier.

springframework.web-3.0.6.jar

ASL - v2.0 This library contains the web appli-cation context, multipart resolver,Struts support, JSF support andweb utilities for the spring frame-work.

ASL The Apache Software License

CDDL Common Development and Distribution License

CPL Common Public License

EPL Eclipse Public License

PD Public Domain

Kieker 1.4 User Guide 88

Page 89: Kieker 1.4 User Guide - eprints.uni-kiel.deeprints.uni-kiel.de/16537/9/kieker-1.4_userguide.pdf · 1 Introduction Modern software applications are often complex and have to ful ll

Bibliography

[1] Hyperic, Inc (2011). Hyperic SIGAR API. http://www.hyperic.com/products/

sigar.

[2] G. Kiczales, J. Lamping, A. Menhdhekar, C. Maeda, C. Lopes, J.-M. Loingtier, andJ. Irwin (1997). Aspect-oriented programming. In Proceedings of the 2007 EuropeanConference on Object-Oriented Programming (ECOOP ’97), volume 1241 of LectureNotes in Computer Science, pages 220–242. Springer.

[3] Oracle (2011). Java Messaging Service (JMS). http://www.oracle.com/

technetwork/java/jms/.

[4] OracleJava management extensions (jmx) technology. http://www.oracle.com/

technetwork/java/javase/tech/javamanagement-140525.html.

[5] Oracle (2011). Java Servlet Technology. http://www.oracle.com/technetwork/

java/index-jsp-135475.html.

[6] SpringSource (2011). Spring. http://www.springsource.org/.

[7] The Apache Foundation (2011). Apache CXF. http://cxf.apache.org/.

[8] The Apache Foundation (2011). Commons Logging. http://commons.apache.

org/logging/.

[9] The Eclipse Foundation (2011). The AspectJ Project. http://www.eclipse.org/

aspectj/.

[10] A. van Hoorn, M. Rohr, W. Hasselbring, J. Waller, J. Ehlers, S. Frey, and D. Kiesel-horst (Nov. 2009). Continuous monitoring of software services: Design and appli-cation of the Kieker framework. Technical Report TR-0921, Department of Com-puter Science, University of Kiel, Germany. http://www.informatik.uni-kiel.

de/uploads/tx_publication/vanhoorn_tr0921.pdf.

Kieker 1.4 User Guide 89