Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
xml
xml
<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

...