Author: buildbot
Date: Tue Mar 14 02:47:38 2017
New Revision: 1008292
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 Tue Mar 14
02:47:38 2017
@@ -33,6 +33,8 @@
<script src='/resources/highlighter/scripts/shCore.js'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'></script>
+<script src='/resources/highlighter/scripts/shBrushXml.js'></script>
+<script src='/resources/highlighter/scripts/shBrushBash.js'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
@@ -117,18 +119,18 @@ Apache CXF -- Using Apache HTrace
<!-- Content -->
<div class="wiki-content">
<div id="ConfluenceContent"><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1485917207094 {padding: 0px;}
-div.rbtoc1485917207094 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1485917207094 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1489459622897 {padding: 0px;}
+div.rbtoc1489459622897 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1489459622897 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1485917207094">
+/*]]>*/</style></p><div class="toc-macro rbtoc1489459622897">
<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-DistributedTracinginApacheCXFusingApacheHTrace">Distributed
Tracing in Apache CXF using Apache HTrace</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-DistributedTracingApacheHTraceandJAX-WSsupport">Distributed
Tracing Apache HTrace and JAX-WS support</a></li><li><a shape="rect"
href="#UsingApacheHTrace-FutureWork">Future Work</a></li></ul>
+</li><li><a shape="rect"
href="#UsingApacheHTrace-DistributedTracingApacheHTraceandJAX-WSsupport">Distributed
Tracing Apache HTrace and JAX-WS support</a></li><li><a shape="rect"
href="#UsingApacheHTrace-PropagatingTraceDetailsToLogs">Propagating Trace
Details To Logs</a></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 128-bit ID. <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/tracer</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 and
downstream work.</p><p>From implementation perspective, 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</str
ong> 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 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"
href="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-DistributedTracinginApacheCXFusingApacheHTrace">Distributed
Tracing in Apache CXF using Apache HTrace</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 technique to monitor the
application as whole, breaking the req
uest 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>
(<strong>4.x+</strong> release branch) 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/index.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-Span-Id</strong>: contains a current span
ID</li></ul><p>By default, <strong>HTraceProvider</strong> will try to pass the
currently active <strong>span</strong> through HTTP headers on each service
invocation. If there is no active spans, the new span will be created and
passed through HTTP headers on per-invocation basis. Essentially, just
registering the <strong>HTraceClientProvider</strong> on the client
and <strong>HTraceProvider</strong> on the server is enough to have
tracing context to be properly passed ev
erywhere. The only configuration part which is necessary are <strong>span
receiver(s)</strong> and <strong>sampler</strong>(s).</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 relative 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
ways the JAX-RS client could be configured, depending on the client im
plementation. <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">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">final Map<String, String> properties = new
HashMap<String, String>();
properties.put(Tracer.SPAN_RECEIVER_CLASSES_KEY, ...);
@@ -356,7 +358,24 @@ factory.getOutInterceptors().add(new HTr
factory.getInInterceptors().add(new HTraceClientStopInterceptor());
...
factory.create();</pre>
-</div></div><h1 id="UsingApacheHTrace-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></div><h1
id="UsingApacheHTrace-PropagatingTraceDetailsToLogs">Propagating Trace Details
To Logs</h1><p>In order to have better correlation between ongoing traces and
logs, <a shape="rect" href="http://cxf.apache.org/">Apache CXF</a> since
<strong>3.1.11</strong> / <strong>3.2.0</strong> releases distributes a helpful
extension for <a shape="rect" class="external-link"
href="https://logback.qos.ch/" rel="nofollow">Logback</a> users,
<strong>LogbackSpanConverter</strong>. This converter can be used to complement
log records with current trace details, such as tracer id and span id. For
example, here is a simple <strong>logback.xml</strong> configuration
file.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="5 seconds">
+ <conversionRule conversionWord="trace"
converterClass="org.apache.cxf.tracing.htrace.ext.LogbackSpanConverter" />
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>[%level] [%trace] %d{yyyy-MM-dd HH:mm:ss.SSS}
%logger{36} %msg%n</pattern>
+ </encoder>
+ </appender>
+ <root level="INFO">
+ <appender-ref ref="STDOUT" />
+ </root>
+</configuration></pre>
+</div></div><p>In this case the tracing details will be propagated to each log
record in following format: <strong><tracer_id>, span: <span
id></strong>. For example:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: bash; gutter: false; theme: Default"
style="font-size:12px;">[INFO] [-, -] 2017-03-11 14:40:13.603
org.eclipse.jetty.server.Server Started @2731ms
+[INFO] [tracer-server/192.168.0.101, span: 6d3e0d975d4c883cce12aee1fd8f3e7e]
2017-03-11 14:40:24.013 com.example.rs.PeopleRestService Getting all employees
+[INFO] [tracer-server/192.168.0.101, span: 6d3e0d975d4c883c7592f4c2317dec22]
2017-03-11 14:40:28.017 com.example.rs.PeopleRestService Looking up manager in
the DB database</pre>
+</div></div><p>The special <strong>[-, -]</strong> placeholder indicates that
no trace details are being available at the moment of logging the
record.</p><h1 id="UsingApacheHTrace-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>