Author: buildbot
Date: Thu Sep 17 02:47:29 2015
New Revision: 965707
Log:
Production update by buildbot for cxf
Modified:
websites/production/cxf/content/cache/docs.pageCache
websites/production/cxf/content/docs/using-apache-htrace.html
Modified: websites/production/cxf/content/cache/docs.pageCache
==============================================================================
Binary files - no diff available.
Modified: websites/production/cxf/content/docs/using-apache-htrace.html
==============================================================================
--- websites/production/cxf/content/docs/using-apache-htrace.html (original)
+++ websites/production/cxf/content/docs/using-apache-htrace.html Thu Sep 17
02:47:29 2015
@@ -117,12 +117,16 @@ Apache CXF -- Using Apache HTrace
<!-- Content -->
<div class="wiki-content">
<div id="ConfluenceContent"><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1442454416442 {padding: 0px;}
-div.rbtoc1442454416442 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1442454416442 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1442458012720 {padding: 0px;}
+div.rbtoc1442458012720 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1442458012720 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1442454416442">
-<ul class="toc-indentation"><li><a shape="rect"
href="#UsingApacheHTrace-Overview">Overview</a></li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracinginNutshell">Distributed Tracing in
Nutshell</a></li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracinginApacheCXF">Distributed Tracing in
Apache CXF</a></li><li><a shape="rect"
href="#UsingApacheHTrace-ConfiguringClientconfigure.client">Configuring
Client</a></li><li><a shape="rect"
href="#UsingApacheHTrace-ConfiguringServerconfigure.server">Configuring
Server</a></li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracingInAction:UsageScenarios">Distributed
Tracing In Action: Usage Scenarios</a>
+/*]]>*/</style></p><div class="toc-macro rbtoc1442458012720">
+<ul class="toc-indentation"><li><a shape="rect"
href="#UsingApacheHTrace-Overview">Overview</a></li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracinginNutshell">Distributed Tracing in
Nutshell</a></li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracinginApacheCXF">Distributed Tracing in
Apache CXF</a></li><li><a shape="rect"
href="#UsingApacheHTrace-ConfiguringClientconfigure.client">Configuring
Client</a>
+<ul class="toc-indentation"><li><a shape="rect"
href="#UsingApacheHTrace-Configuringtracingheadernames">Configuring tracing
header names</a></li></ul>
+</li><li><a shape="rect"
href="#UsingApacheHTrace-ConfiguringServerconfigure.server">Configuring
Server</a>
+<ul class="toc-indentation"><li><a shape="rect"
href="#UsingApacheHTrace-Configuringtracingheadernames.1">Configuring tracing
header names</a></li></ul>
+</li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracingInAction:UsageScenarios">Distributed
Tracing In Action: Usage Scenarios</a>
<ul class="toc-indentation"><li><a shape="rect"
href="#UsingApacheHTrace-Example#1:ClientandServerwithdefaultdistributedtracingconfigured">Example
#1: Client and Server with default distributed tracing
configured</a></li><li><a shape="rect"
href="#UsingApacheHTrace-Example#2:ClientandServerwithnestedtrace">Example #2:
Client and Server with nested trace</a></li><li><a shape="rect"
href="#UsingApacheHTrace-Example#3:ClientandServertracewithtimeline">Example
#3: Client and Server trace with timeline</a></li><li><a shape="rect"
href="#UsingApacheHTrace-Example#4:ClientandServerwithannotatedtrace(key/value)">Example
#4: Client and Server with annotated trace (key/value)</a></li><li><a
shape="rect"
href="#UsingApacheHTrace-Example#5:ClientandServerwithparalleltrace(involvingthreadpools)">Example
#5: Client and Server with parallel trace (involving thread
pools)</a></li><li><a shape="rect"
href="#UsingApacheHTrace-Example#6:ClientandServerwithasynchronousJAX-RSservice(server-side)">Exampl
e #6: Client and Server with asynchronous JAX-RS service
(server-side)</a></li><li><a shape="rect"
href="#UsingApacheHTrace-Example#7:ClientandServerwithasynchronousinvocation(client-side)">Example
#7: Client and Server with asynchronous invocation (client-side)</a></li></ul>
</li><li><a shape="rect" href="#UsingApacheHTrace-FutureWork">Future
Work</a></li></ul>
</div><h1 id="UsingApacheHTrace-Overview">Overview</h1><p><a shape="rect"
class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a> is a
tracing framework intended for use with distributed systems written in java.
Since version <strong>3.1.3</strong>, Apache CXF fully supports integration
with <a shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a>, both on
client side and server side. This section gives a complete overview on how
distributed tracing support is supported in JAX-RS applications built on top of
Apache CXF.</p><h1
id="UsingApacheHTrace-DistributedTracinginNutshell">Distributed Tracing in
Nutshell</h1><p>Distributed tracing, first described by Google in <a
shape="rect" class="external-link"
href="http://research.google.com/pubs/pub36356.html" rel="nofollow">Dapper, a
Large-Scale Distributed Systems Tracing Infrastructure</a> paper became
increasingly important topic these days. With
microservices (aka SOA) gaining more and more adoption, the typical
applications are built using dozens or even hundreds of small, distributed
pieces. The end-to-end traceability of the requests (or any kind of work
performed on user's behalf) is hard task to accomplish, particularly taking
into account asyncronous or/and concurrent invocations. <a shape="rect"
class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a> is
inspired by <a shape="rect" class="external-link"
href="http://research.google.com/pubs/pub36356.html" rel="nofollow">Dapper, a
Large-Scale Distributed Systems Tracing Infrastructure</a> paper and
essentially is a full-fledged distributed tracing framework.</p><p>Distributed
tracing is additional instrumentation layer on top of new or existing
applications. In terms of distributed tracing, <strong>span</strong> represents
a basic unit of work. For example, executing database query is a
<strong>span</strong>. <strong>Spans</strong>
are identified by a unique 64-bit ID for the <strong>span</strong> and another
64-bit ID for the <strong>trace</strong> the span is a <strong>part</strong>
of. <strong>Spans</strong> also have other data, such as
<strong>descriptions</strong>, <strong>timelines</strong>,<strong> key-value
annotations</strong>, the <strong>ID</strong> of the <strong>span</strong> that
caused them (parent), and <strong>process</strong> ID’s (normally IP
address and process name). Spans are started and stopped, and they keep track
of their timing information. Once <strong>span</strong> is created, it should
be stopped at some point in the future. In turn, <strong>trace</strong> is a
set of spans forming a tree-like structure. For example, if you are running a
JAX-RS service, a trace might be formed by a <strong>PUT</strong>
request.</p><p>From implementation prospective, and in context of Java
applications, <strong>spans</strong> are attached to their threads (in general,
thread which created the
<strong>span</strong> should close it). However it is possible to transfer
<strong>spans</strong> from thread to thread in order to model a complex
execution flows. It is also possible to have many <strong>spans</strong> in the
same thread, as long as they are properly created and closed. In the next
sections we are going to see the examples of that.</p><p>Another two important
concepts of in context of distributed tracing are <strong>span
receivers</strong> and <strong>samplers</strong>. Essentially, all spans
(including start/stop time, key/value annotations, timelines, ..) should be
persisted (or collected) somewhere. <strong>Span receiver</strong> is a
collector within a process that is the destination of <strong>spans</strong>
when a trace is running (it could be a console, local file, data store, ...).
<a shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a> provides
span receivers for <a shape="rect" class="external-link" h
ref="http://hbase.apache.org">Apache HBase</a>, <a shape="rect"
class="external-link" href="https://flume.apache.org/">Apache Flume</a> and <a
shape="rect" class="external-link" href="http://zipkin.io/"
rel="nofollow">Twitter Zipkin</a>. From other side, <strong>samplers</strong>
allow to control the frequency of the tracing (all the time, never, probability
driven, ...). Using the <strong>sampler</strong> is the way to minimize tracing
overhead (or just amount of traces) by limiting them to particular
conditions.</p><h1
id="UsingApacheHTrace-DistributedTracinginApacheCXF">Distributed Tracing in
Apache CXF</h1><p><a shape="rect" href="http://cxf.apache.org/">Apache CXF</a>
is a very popular framework for building services and web APIs. No doubts, it
is going to play even more important role in context of microservices
architecture letting developers to quickly build and deploy individual
JAX-RS/JAX-WS services. As it was just mentioned before, distributed tracing is
an essential tec
hnique to monitor the application as whole, breaking the request to individual
service traces as it goes through and crosses the boundaries of threads,
processes and machines.</p><p>The current integration of distributed tracing in
<a shape="rect" href="http://cxf.apache.org/">Apache CXF</a> supports <a
shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a> only in
JAX-RS 2.x applications. From high-level prospective, it consists of three main
parts:</p><ul style="list-style-type:
square;"><li><strong>TracerContext</strong> (injectable through
<strong>@Context</strong> annotation)</li><li><strong>HTraceProvider</strong>
(server-side JAX-RS provider) and <strong>HTraceClientProvider</strong>
(client-side JAX-RS provider)</li><li><strong>HTraceFeature</strong>
(server-side <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a>
feature to simplify <a shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/inde
x.html">Apache HTrace</a> configuration and integration)</li></ul><p><a
shape="rect" href="http://cxf.apache.org/">Apache CXF</a> uses HTTP headers to
hand off tracing context from the client to the service and from the service to
service. Those headers are used internally by <strong>HTraceProvider</strong>
and <strong>HTraceClientProvider</strong>, but are configurable. The default
header names are declared in the TracerHeaders class:</p><ul
style="list-style-type: square;"><li><strong>X-Trace-Id</strong>: contains a
current trace ID</li><li><strong>X-Span-Id</strong>: contains a current span
ID</li></ul><p>By default, <strong>HTraceProvider</strong> will try pass the
currently active <strong>span</strong> through HTTP headers on each service
invocation. If there is no active span, the new span will be created and passed
through HTTP headers on per-invocation basis. Essentially, just registering the
<strong>HTraceProvider</strong> on the client and
<strong>HTraceClientProvider</str
ong> on the server is enough to have tracing context to be properly passed
everywhere. The only configuration part which is necessary are <strong>span
receiver(s)</strong> and <strong>sampler</strong>.</p><p>It is also worth to
mention the way <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a>
attaches the description to <strong>spans</strong>. With regards to the client
integration, the description becomes a full URL being invoked prefixed by HTTP
method, for example: <strong>GET </strong><a shape="rect" class="external-link"
href="http://localhost:8282/books"
rel="nofollow"><strong>http://localhost:8282</strong>/books</a>. On the server
side integration, the description becomes a relation JAX-RS resource path
prefixed by HTTP method, f.e.: <strong>GET books, POST book/123</strong></p><h1
id="UsingApacheHTrace-ConfiguringClientconfigure.client">Configuring Client
<span class="confluence-anchor-link"
id="UsingApacheHTrace-configure.client"></span></h1><p>There are a couple
of way the JAX-RS client could be configured, depending on the client
implementation. <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a>
provides its own <strong>WebClient</strong> which could be configured just like
that (in future versions, there would be a simpler ways to do that using client
specific features):</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
@@ -148,7 +152,11 @@ final Response response = client
.request()
.accept(MediaType.APPLICATION_JSON)
.get();</pre>
-</div></div><h1
id="UsingApacheHTrace-ConfiguringServerconfigure.server">Configuring Server
<span class="confluence-anchor-link"
id="UsingApacheHTrace-configure.server"></span></h1><p>Server configuration is
a bit simpler than client one thanks to the feature class
available, <strong>HTraceFeature</strong>. Depending on the way
the <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a> is used
to configure JAX-RS services, it could be part of JAX-RS application
configuration, for example:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
+</div></div><h3
id="UsingApacheHTrace-Configuringtracingheadernames">Configuring tracing header
names</h3><p>To change the default HTTP header names, used to transfer the
tracing context from client to server, it is enough to define two properties
only: <strong>TracerHeaders.HEADER_SPAN_ID</strong> and
<strong>TracerHeaders.HEADER_TRACE_ID</strong>. For example:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">final ClientConfiguration config =
WebClient.getConfig(client);
+config.getRequestContext().put(TracerHeaders.HEADER_SPAN_ID,
"CUSTOM_HEADER_SPAN_ID");
+config.getRequestContext().put(TracerHeaders.HEADER_TRACE_ID,
"CUSTOM_HEADER_TRACE_ID");</pre>
+</div></div><div class="confluence-information-macro
confluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>It is very important to keep
client and server HTTP headers configuration in sync, otherwise the server
won't be able to establish the current tracing context
properly.</p></div></div><h1
id="UsingApacheHTrace-ConfiguringServerconfigure.server">Configuring Server
<span class="confluence-anchor-link"
id="UsingApacheHTrace-configure.server"></span></h1><p>Server configuration is
a bit simpler than client one thanks to the feature class
available, <strong>HTraceFeature</strong>. Depending on the way
the <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a> is used
to configure JAX-RS services, it could be part of JAX-RS application
configuration, for example:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeCo
ntent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@ApplicationPath("/")
public class CatalogApplication extends Application {
@Override
@@ -173,7 +181,16 @@ final JAXRSServerFactoryBean factory = R
factory.setFeatures(Arrays.< Feature >asList(new
HTraceFeature(HTraceConfiguration.fromMap(properties))));
...
return factory.create();</pre>
-</div></div><p>Once the <strong>span receiver(s)</strong> and
<strong>sampler</strong> are properly configured, all generated
<strong>spans</strong> are going to be collected and available for analysis
and/or visualization.</p><h1
id="UsingApacheHTrace-DistributedTracingInAction:UsageScenarios">Distributed
Tracing In Action: Usage Scenarios</h1><p>In the following subsections we are
going to walk through many different scenarios to illustrate the distributed
tracing in action, starting from the simplest ones and finishing with
asynchronous JAX-RS services. All examples assume that configuration
<strong>has been done</strong> (see please <a shape="rect"
href="using-apache-htrace.html">Configuring Client</a> and <a shape="rect"
href="using-apache-htrace.html">Configuring Server</a> sections above).</p><h2
id="UsingApacheHTrace-Example#1:ClientandServerwithdefaultdistributedtracingconfigured">Example
#1: Client and Server with default distributed tracing configured</h2><p>In
the f
irst example we are going to see the effect of using default configuration on
the client and on the server, with
only <strong>HTraceClientProvider</strong>  and
<strong>HTraceProvider</strong> registered. The JAX-RS resource endpoint is
pretty basic stubbed method:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Once the <strong>span receiver(s)</strong> and
<strong>sampler</strong> are properly configured, all generated
<strong>spans</strong> are going to be collected and available for analysis
and/or visualization.</p><h3
id="UsingApacheHTrace-Configuringtracingheadernames.1">Configuring tracing
header names</h3><p>As with the client, to change the default HTTP header
names, used to establish the tracing context on the server, it is enough to
define two properties only: <strong>TracerHeaders.HEADER_SPAN_ID</strong> and
<strong>TracerHeaders.HEADER_TRACE_ID</strong>. For example:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">final Map<String, Object> headers = new
HashMap<String, Object>();
+headers.put(TracerHeaders.HEADER_SPAN_ID, "CUSTOM_HEADER_SPAN_ID");
+headers.put(TracerHeaders.HEADER_TRACE_ID, "CUSTOM_HEADER_TRACE_ID");
+
+final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+sf.setProperties(headers);
+...
+sf.create();</pre>
+</div></div><div class="confluence-information-macro
confluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>It is very important to keep
client and server HTTP headers configuration in sync, otherwise the server
won't be able to establish the current tracing context
properly.</p></div></div><h1
id="UsingApacheHTrace-DistributedTracingInAction:UsageScenarios">Distributed
Tracing In Action: Usage Scenarios</h1><p>In the following subsections we are
going to walk through many different scenarios to illustrate the distributed
tracing in action, starting from the simplest ones and finishing with
asynchronous JAX-RS services. All examples assume that configuration
<strong>has been done</strong> (see please <a shape="rect"
href="using-apache-htrace.html">Configuring Client</a> and <a shape="rect"
href="using-apache-htrace.html">Configuring Server</a> secti
ons above).</p><h2
id="UsingApacheHTrace-Example#1:ClientandServerwithdefaultdistributedtracingconfigured">Example
#1: Client and Server with default distributed tracing configured</h2><p>In
the first example we are going to see the effect of using default configuration
on the client and on the server, with
only <strong>HTraceClientProvider</strong>  and
<strong>HTraceProvider</strong> registered. The JAX-RS resource endpoint is
pretty basic stubbed method:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@Produces( { MediaType.APPLICATION_JSON } )
@GET
public Collection<Book> getBooks() {
@@ -293,7 +310,7 @@ public Collection<Book> getBooks()
.accept(MediaType.APPLICATION_JSON)
.async()
.get();</pre>
-</div></div><p>In this respect, there is no difference from the caller
prospective however a bit more work is going under the hood to transfer the
active tracing span from JAX-RS client request filter to client response filter
as in general those are executed in different threads (similarly to server-side
asynchronous JAX-RS resource invocation). The actual invocation of the request
by the client (with process name <strong><span class="label label-default
service-filter-label
service-tag-filtered">jaxrsclient/192.168.0.100</span></strong>) and consequent
invocation of the service on the server side (process name<strong> <span
class="label label-default
service-filter-label">jaxrsserver/192.168.0.100</span></strong>) is going to
generate the following sample traces:</p><p><span
class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img
class="confluence-embedded-image" height="250"
src="using-apache-htrace.data/image2015-9-16%2021:9:56.png"></span></p><h1
id="Using
ApacheHTrace-FutureWork">Future Work</h1><p>TODO</p></div>
+</div></div><p>In this respect, there is no difference from the caller
prospective however a bit more work is going under the hood to transfer the
active tracing span from JAX-RS client request filter to client response filter
as in general those are executed in different threads (similarly to server-side
asynchronous JAX-RS resource invocation). The actual invocation of the request
by the client (with process name <strong><span class="label label-default
service-filter-label
service-tag-filtered">jaxrsclient/192.168.0.100</span></strong>) and consequent
invocation of the service on the server side (process name<strong> <span
class="label label-default
service-filter-label">jaxrsserver/192.168.0.100</span></strong>) is going to
generate the following sample traces:</p><p><span
class="confluence-embedded-file-wrapper confluence-embedded-manual-size"><img
class="confluence-embedded-image" height="250"
src="using-apache-htrace.data/image2015-9-16%2021:9:56.png"></span></p><h1
id="Using
ApacheHTrace-FutureWork">Future Work</h1><p>The <a shape="rect"
href="http://cxf.apache.org/">Apache CXF</a> is very proud to offer <a
shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a>
integration. At the current stage, it was a conscious decision to keep the
minimal API and provide the set of necessary features only. However, there is a
strong commitment to evolve not only <a shape="rect" class="external-link"
href="http://htrace.incubator.apache.org/index.html">Apache HTrace</a>
integration, but the distributed tracing support in general.</p></div>
</div>
<!-- Content -->
</td>