...
Distributed Tracing with OpenTelemetry and OSGi
...
Most of the distributed tracers compatible with OpenTelemetry API could be deployed into OSGi container and as such, the integration is fully available for Apache CXF services running inside the container. For a complete example please take a look on jax_rs_tracing_opentelemetry_osgi sample project, but here is the typical OSGi Blueprint snippet in case logging span exporter.
Code Block | ||||
---|---|---|---|---|
| ||||
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/blueprint/core"
xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
<bean id="tracingFeature" class="org.apache.cxf.tracing.opentelemetry.jaxrs.OpenTelemetryFeature">
<argument index="0">
<bean factory-ref="withPropagators" factory-method="build"/>
</argument>
<argument index="1" value="tracer" />
</bean>
<bean id="openTelemetrySdk" class="io.opentelemetry.sdk.OpenTelemetrySdk" factory-method="builder" />
<bean id="sdkTracerProvider" class="io.opentelemetry.sdk.trace.SdkTracerProvider" factory-method="builder" />
<bean id="withSampler" factory-ref="sdkTracerProvider" factory-method="setSampler">
<argument index="0">
<bean class="io.opentelemetry.sdk.trace.samplers.Sampler" factory-method="alwaysOn" />
</argument>
</bean>
<bean id="processor" class="io.opentelemetry.sdk.trace.export.BatchSpanProcessor" factory-method="builder">
<argument index="0">
<bean class="io.opentelemetry.exporter.logging.LoggingSpanExporter" factory-method="create" />
</argument>
</bean>
<bean id="withSpanProcessor" factory-ref="sdkTracerProvider" factory-method="addSpanProcessor">
<argument index="0">
<bean factory-ref="processor" factory-method="build"/>
</argument>
</bean>
<bean id="withTracerProvider" factory-ref="openTelemetrySdk" factory-method="setTracerProvider">
<argument index="0">
<bean factory-ref="withSpanProcessor" factory-method="build"/>
</argument>
</bean>
<bean id="withPropagators" factory-ref="withTracerProvider" factory-method="setPropagators">
<argument index="0">
<bean class="io.opentelemetry.context.propagation.ContextPropagators" factory-method="create">
<argument index="0">
<bean class="io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator" factory-method="getInstance" />
</argument>
</bean>
</argument>
</bean>
<cxf:bus>
<cxf:features>
<cxf:logging />
</cxf:features>
</cxf:bus>
<jaxrs:server id="catalogServer" address="/">
<jaxrs:serviceBeans>
...
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref component-id="tracingFeature" />
</jaxrs:providers>
</jaxrs:server>
</blueprint> |
Info |
---|
As of now, OpenTelemetry does not provide dedicated OSGi bundles and the service loader mechanism is not working very well. It is very likely that you may need to declare own span exporters. |
Accessing OpenTelemetry APIs
...