blob: 5cb7df4fe2b1338c979d364a518991e1d62b528c [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<document>
<properties>
<title>Fulcrum YAAFI Avalon Container Interceptors</title>
<author email="siegfried.goeschl@it20one.at">Siegfried Goeschl</author>
</properties>
<body>
<section name="Overview">
<p>
The service solves a simple problem - how to monitor the execution time of
service invocations in a production environment. It allows to monitor a
a user-defined list of services and tresholds which affects the trace
level of the logger being used to write the performance data.
</p>
</section>
<section name="Captured Information">
<p>
During the execution the service captures the following information for
producing a meaning log
<table>
<tr>
<th>Item</th>
<th>Description</th>
</tr>
<tr>
<td>Transaction ID (TID)</td>
<td>the number of times the invocationDepth was zero</td>
</tr>
<tr>
<td>Invocation ID (IID)</td>
<td>the current number of inovking a service method</td>
</tr>
<tr>
<td>InvocationDepth (ID)</td>
<td>
the service invocation depth, e.g a value of "1" that
the currently invoked service method was invoked by
another service. A value of "0" indicates that the service
method was directly invoked from the caller therefore
starting a new transaction
</td>
</tr>
<tr>
<td>Mode (M)</td>
<td>
the invocation mode of the interceptor
<ul>
<li>0 ==> entering the service method</li>
<li>1 ==> leaving the the service method</li>
<li>2 ==> an exception occured</li>
</ul>
</td>
</tr>
<tr>
<td>ServiceName</td>
<td>the shorthand of the service being invoked</td>
</tr>
<tr>
<td>ServiceMethod</td>
<td>the name of the service method being invoked</td>
</tr>
<tr>
<td>Millis</td>
<td>the execution time in milliseconds</td>
</tr>
<tr>
<td>Method Signature</td>
<td>the name of the executing thread</td>
</tr>
</table>
</p>
</section>
<section name="Example Logfile">
<p>
Looking at the following <a href="performance.csv">example</a> you see that
<ul>
<li>that this was the 18th transaction during the lifetime of the container</li>
<li>the transaction spanned eight Avalon service invocations</li>
<li>SignatureService.sign is the top-level service invocation taking 140 ms</li>
<li>PdfSignatureService.isSupported is invoked by SignatureService.sign hence the invocation depth of "1"</li>
<li>PdfSignatureService.sign is also invoked by SignatureService.sign and took 140 ms</li>
<li>PdfSignatureService.sign invokes five other Avalon service methods to do its work</li>
</ul>
</p>
<source>
<![CDATA[
TID IID ID M ServiceName ServiceMethod Millis
18 28 0 1 SignatureService sign 140
18 29 1 1 PdfSignatureService isSupported 0
18 30 1 1 PdfSignatureService sign 140
18 31 2 1 CommandDispatcher exists 0
18 32 2 1 ResourceManagerService exists 0
18 33 2 1 ResourceManagerService exists 0
18 34 2 1 ResourceManagerService read 0
18 35 2 1 PKCS12KeyStore getCertificateEntry 0
]]>
</source>
</section>
<section name="Configuration">
<subsection name="Component Configuration">
<table>
<tr>
<th>Item</th>
<th>Datatype</th>
<th>Cardinality</th>
<th>Description</th>
</tr>
<tr>
<td>isEnabled</td>
<td>Boolean</td>
<td>[0|1]</td>
<td>
Turn the interceptor. If no value is supplied then "false" is used
thereby disabling all interceptor invocations.
</td>
</tr>
<tr>
<td>tresholds</td>
<td>Tree</td>
<td>[0|1]</td>
<td>
Contains a list of mappings from execution time to tracelevel
</td>
</tr>
<tr>
<td>tresholds/debug</td>
<td>Integer</td>
<td>[0|1]</td>
<td>
The minimum exeuction time for debug output
</td>
</tr>
<tr>
<td>tresholds/info</td>
<td>Integer</td>
<td>[0|1]</td>
<td>
The minimum exeuction time for info output
</td>
</tr>
<tr>
<td>tresholds/warn</td>
<td>Integer</td>
<td>[0|1]</td>
<td>
The minimum exeuction time for warn output
</td>
</tr>
<tr>
<td>tresholds/error</td>
<td>Integer</td>
<td>[0|1]</td>
<td>
The minimum exeuction time for error output
</td>
</tr>
<tr>
<td>tresholds/fatal</td>
<td>Integer</td>
<td>[0|1]</td>
<td>
The minimum exeuction time for fatal output
</td>
</tr>
<tr>
<td>services</td>
<td>Tree</td>
<td>[0|1]</td>
<td>
Contains a list of services to be monitored.
</td>
</tr>
<tr>
<td>services/service@name</td>
<td>String</td>
<td>[1..n]</td>
<td>
The name of an individual service to be monitored.
</td>
</tr>
</table>
</subsection>
<subsection name="Role Configuration">
<source><![CDATA[
<role
name="org.apache.fulcrum.yaafi.interceptor.performance.PerformanceInterceptorService"
shorthand="PerformanceInterceptorService"
default-class="org.apache.fulcrum.yaafi.interceptor.performance.PerformanceInterceptorServiceImpl"
logger="performance"
/>
]]></source>
</subsection>
<subsection name="Log4J Configuration">
<p>
The following Log4J configuration defines a custom
appender for the PerformanceInterceptorService. For
the layout we just add a timestamp since we produce
a CSV file to be analyzed with EXCEL or your tool
of choice
</p>
<source><![CDATA[
#
# Custom logfiles
#
log4j.category.yaafi.performance = DEBUG, performance
log4j.additivity.yaafi.performance = false
#
# Performance Appender
#
log4j.appender.performance = org.apache.log4j.FileAppender
log4j.appender.performance.file = ./temp/performance.csv
log4j.appender.performance.layout = org.apache.log4j.PatternLayout
log4j.appender.performance.layout.conversionPattern = %d;%m%n
log4j.appender.performance.append = true
]]></source>
</subsection>
</section>
<section name="Usage">
<p>
Monitor all exection times
</p>
<source>
<![CDATA[
<PerformanceInterceptorService>
<isEnabled>true</isEnabled>
<tresholds>
<debug millis="0"/>
<info millis="100"/>
<warn millis="500"/>
<error millis="1000"/>
<fatal millis="5000"/>
</tresholds>
<services>
<service name="*"/>
</services>
</PerformanceInterceptorService>
]]>
</source>
</section>
</body>
</document>