blob: f59adfb5b2bf93a625e0a14629d164c2fb5461bf [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>EJB Request Logging</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
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
. <a href="http://www.apache.org/licenses/LICENSE-2.0" class="bare">http://www.apache.org/licenses/LICENSE-2.0</a> . 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.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Both client-side and server-side request logging is supported and
includes various invocation times aimed at helping to identify where
time is going in a request.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_client_side">Client-side</h2>
<div class="sectionbody">
<div class="paragraph">
<p>On the client requests/responses are logged on java.util.logging
<code>FINEST</code> level in category <code>OpenEJB.client</code>. The code is similar to the
following:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">final long time = System.nanoTime() - start;
final String message = String.format("Invocation %sns - %s - Request(%s) - Response(%s)", time, conn.getURI(), req, res);
logger.log(Level.FINEST, message);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that the check to see if FINEST is enabled is cached for
performance reasons, so it must be set at VM startup.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_server_side">Server-side</h2>
<div class="sectionbody">
<div class="paragraph">
<p>On the server requests/responses are logged in java.util.logging <code>FINE</code>
in category`"OpenEJB.server.remote.ejb`. The code for that is similar to
this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">logger.fine("EJB REQUEST: " + req + " -- RESPONSE: " + res);</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_request_times">Request times</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Three times are tracked per request and logged in the above statements
as part of the formatting of the EJB Response. They&#8217;re best understood
in reverse:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Container time</strong>&#8201;&#8212;&#8201;this is the raw time of invoking the bean
including its interceptors and any transaction begin/commit time. This
time is effectively "business logic".</p>
</li>
<li>
<p><strong>Server time</strong>&#8201;&#8212;&#8201;this timer starts the (nano)second the request is
seen by the server and the (nano)second the response is actually
written. The serverTime minus the containerTime will effectively show
you how long serialization and deserialization is taking pre request.</p>
</li>
<li>
<p><strong>Client time</strong>&#8201;&#8212;&#8201;entire begin to end including attempting to contact
the server and fully reading the response. The clientTime minus the
serverTime will show network latency for the most part.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The container time and server time are written in the EJB response and
visible to the client. The client will log all three times, the server
will log the first two. All log statements are on a single line.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bean_time_and_jmx_statistics">Bean-time and JMX Statistics</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The above information applies purely to remote EJB calls made over a
network. Calls on <code>@Remote</code> or <code>@Local</code> interfaces between two
components in the same server are not logged.</p>
</div>
<div class="paragraph">
<p>However, <strong>all</strong> EJB invocations to business methods <em>or</em> callbacks like
<code>@PostConstruct</code> are tracked for statistical analysis. By default a
floating window of 2000 samples are kept. The time tracked is purely
<strong>bean time</strong> which includes interceptors, decorators and the bean itself,
but does not include other container services like transactions or
security.</p>
</div>
<div class="paragraph">
<p>This information is available in JMX. A sample JMX ObjectName for a
<code>CounterBean</code> will look like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">openejb.management:J2EEServer=openejb,J2EEApplication=null,EJBModule=StatsModule,StatelessSessionBean=CounterBean,j2eeType=Invocations,name=CounterBean</code></pre>
</div>
</div>
<div class="paragraph">
<p>All beans have the following MBean attributes, listed here in shorthand:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=InvocationCount, type=long, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=, name=InvocationTime,
type=long, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=MonitoredMethods, type=long, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanOperationInfo[description=,
name=FilterAttributes, returnType=void,
signature=[javax.management.MBeanParameterInfo[description="",
name=excludeRegex, type=java.lang.String, descriptor=\{}],
javax.management.MBeanParameterInfo[description="", name=includeRegex,
type=java.lang.String, descriptor=\{}]], impact=unknown, descriptor=\{}]</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Then for every method there will be these attributes and operations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Count, type=long, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().GeometricMean, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Kurtosis, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Max, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Mean, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Min, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile01, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile10, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile25, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile50, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile75, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile90, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Percentile99, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().SampleSize, type=int, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Skewness, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().StandardDeviation, type=double, read-only,
descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Sum, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Sumsq, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanAttributeInfo[description=,
name=someMethod().Variance, type=double, read-only, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanOperationInfo[description=,
name=someMethod().setSampleSize, returnType=void,
signature=[javax.management.MBeanParameterInfo[description=, name=p1,
type=int, descriptor=\{}]], impact=unknown, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanOperationInfo[description=,
name=someMethod().sortedValues, returnType=[D, signature=[],
impact=unknown, descriptor=\{}]</p>
</li>
<li>
<p>javax.management.MBeanOperationInfo[description=,
name=someMethod().values, returnType=[D, signature=[], impact=unknown,
descriptor=\{}]</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>