Library/Framework | Versions |
---|---|
Akka HTTP | 10.0+ |
Apache HttpAsyncClient | 4.0+ |
Apache HttpClient | 2.0+ |
Armeria | 0.99.8+ |
AWS Lambda | 1.0+ |
AWS SDK | 1.11.x and 2.2.0+ |
Cassandra Driver | 3.0+ |
Couchbase Client | 2.0+ (not including 3.x yet) |
Dropwizard Views | 0.7+ |
Elasticsearch API | 5.0+ (not including 7.x yet) |
Elasticsearch REST Client | 5.0+ |
Finatra | 2.9+ |
Geode Client | 1.4+ |
Google HTTP Client | 1.19+ |
Grizzly | 2.0+ (disabled by default, see below) |
Grizzly Client | 1.9+ |
gRPC | 1.5+ |
Hibernate | 3.3+ |
HttpURLConnection | Java 7+ |
Hystrix | 1.4+ |
JAX-RS | 0.5+ |
JAX-RS Client | 2.0+ |
JDBC | Java 7+ |
Jedis | 1.4+ |
Jetty | 8.0+ |
JMS | 1.1+ |
JSP | 2.3+ |
Kafka | 0.11+ |
khttp | 0.1+ |
Kubernetes Client | 7.0+ |
Lettuce | 4.0+ (not including 6.x yet) |
Log4j 1 | 1.2+ |
Log4j 2 | 2.7+ |
Logback | 1.0+ |
MongoDB Drivers | 3.3+ |
Netty | 3.8+ |
OkHttp | 3.0+ |
Play | 2.3+ (not including 2.8.x yet) |
Play WS | 1.0+ |
RabbitMQ Client | 2.7+ |
Ratpack | 1.4+ |
Reactor | 3.1+ |
Rediscala | 1.8+ |
Redisson | 3.0+ |
RMI | Java 7+ |
RxJava | 1.0+ |
Servlet | 2.2+ |
Spark Web Framework | 2.3+ |
Spring Data | 1.8+ |
Spring Scheduling | 3.1+ |
Spring Web MVC | 3.1+ |
Spring Webflux | 5.0+ |
Spymemcached | 2.12+ |
Twilio | 6.6+ (not including 8.x yet) |
Vert.x | 3.0+ |
Vert.x RxJava2 | 3.5+ |
Some instrumentations can produce too many spans and make traces very noisy. For this reason the following instrumentations are disabled by default:
jdbc-datasource
which creates spans whenever java.sql.DataSource#getConnection
method is called.servlet-filter
which creates spans around Servlet Filter methods.servlet-service
which creates spans around Servlet methods.To enable them, add otel.integration.<name>.enabled
system property:
-Dotel.integration.jdbc-datasource.enabled=true
Whenever you use
Grizzly for
Servlet-based applications, you get better experience from Servlet-specific
support. As these two instrumentations conflict with each other, more generic
instrumentation for Grizzly http server is disabled by default. If needed,
you can enable it by add the following system property:
-Dotel.integration.grizzly.enabled=true
You can suppress auto-instrumentation of specific libraries by using
-Dotel.integration.[id].enabled=false
where id
is the instrumentation id
.
You can also exclude specific classes from being instrumented. This can be useful for a few reasons including:
This option should not be used lightly, as it can leave some instrumentation partially applied, which could have unknown side-effects.
System property | Environment variable | Purpose |
---|---|---|
otel.trace.classes.exclude | OTEL_TRACE_CLASSES_EXCLUDE | Suppresses all instrumentation for specific classes, format is “my.package.MyClass,my.package2.*” |
The agent injects several pieces of information about the current span into each logging event’s MDC copy. As a result any services or tools that parse the application logs can correlate traces/spans with log statements.
traceId
(same as Span.current().getSpanContext().getTraceIdAsHexString()
)spanId
(same as Span.current().getSpanContext().getSpanIdAsHexString()
)sampled
(same as Span.current().getSpanContext().isSampled()
)This information can be included in log statements produced by the logging library by specifying them in the pattern/format.
Example for Spring Boot configuration (which uses logback):
logging.pattern.console = %d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg t:%X{traceId} s:%X{spanId} %n
Library | Version |
---|---|
Log4j 1 | 1.2+ |
Log4j 2 | 2.7+ |
Logback | 1.0+ |
Configuration parameters names are very likely to change until GA.
The following configuration properties are common to all exporters:
System property | Environment variable | Purpose |
---|---|---|
otel.exporter | OTEL_EXPORTER | Exporter to be used, can be a comma-separated list to use multiple exporters. Currently does not support multiple metric exporters. Defaults to otlp . |
In order to configure the service name for the OTLP exporter, you must add
service.name
key to the OpenTelemetry Resource (see below). For example:OTEL_RESOURCE_ATTRIBUTES=service.name=myservice
.
System property | Environment variable | Purpose |
---|---|---|
otel.exporter=otlp (default) | OTEL_EXPORTER=otlp | To select OpenTelemetry exporter (default) |
otel.exporter.otlp.endpoint | OTEL_EXPORTER_OTLP_ENDPOINT | The OTLP endpoint to connect to, default is “localhost:55680” |
otel.exporter.otlp.insecure | OTEL_EXPORTER_OTLP_INSECURE | Whether to enable client transport security for the connection |
otel.exporter.otlp.headers | OTEL_EXPORTER_OTLP_HEADERS | The key-value pairs separated by semicolon to pass as request headers |
otel.exporter.otlp.timeout | OTEL_EXPORTER_OTLP_TIMEOUT | The max waiting time allowed to send each batch, default is 1000 |
Currently only supports gRPC.
System property | Environment variable | Purpose |
---|---|---|
otel.exporter=jaeger | OTEL_EXPORTER=jaeger | To select Jaeger exporter |
otel.exporter.jaeger.endpoint | OTEL_EXPORTER_JAEGER_ENDPOINT | The Jaeger endpoint to connect to, default is “localhost:14250”, currently only gRPC is supported. |
otel.exporter.jaeger.service.name | OTEL_EXPORTER_JAEGER_SERVICE_NAME | The service name of this JVM instance, default is “unknown”. |
System property | Environment variable | Purpose |
---|---|---|
otel.exporter=zipkin | OTEL_EXPORTER=zipkin | To select Zipkin exporter |
otel.exporter.zipkin.endpoint | OTEL_EXPORTER_ZIPKIN_ENDPOINT | The Zipkin endpoint to connect to, default is “http://localhost:9411/api/v2/spans”. Currently only HTTP is supported. |
otel.exporter.zipkin.service.name | OTEL_EXPORTER_ZIPKIN_SERVICE_NAME | The service name of this JVM instance, default is “unknown”. |
System property | Environment variable | Purpose |
---|---|---|
otel.exporter=prometheus | OTEL_EXPORTER=prometheus | To select Prometheus exporter |
otel.exporter.prometheus.port | OTEL_EXPORTER_PROMETHEUS_PORT | The local port used to bind the prometheus metric server, defaults to 9464 |
otel.exporter.prometheus.host | OTEL_EXPORTER_PROMETHEUS_HOST | The local address used to bind the prometheus metric server, defaults to “0.0.0.0” |
The logging exporter simply prints the name of the span along with its attributes to stdout. It is used mainly for testing and debugging.
System property | Environment variable | Purpose |
---|---|---|
otel.exporter=logging | OTEL_EXPORTER=logging | To select logging exporter |
otel.exporter.logging.prefix | OTEL_EXPORTER_LOGGING_PREFIX | An optional string that is printed in front of the span name and attributes. |
The propagator controls which distributed tracing header format is used.
If this is set to a comma-delimited list of the values, the multi-propagator will be used. The multi-propagator will try to extract the context from incoming requests using each of the configured propagator formats (in order), stopping after the first successful context extraction. The multi-propagator will inject the context into outgoing requests using all the configured propagator formats.
System property | Environment variable | Purpose |
---|---|---|
otel.propagators | OTEL_PROPAGATORS | Default is “tracecontext” (W3C). Other supported values are “b3”, “b3single”, “jaeger”, “ottracer”, “xray”. |
The OpenTelemetry Resource is a representation of the entity producing telemetry.
System property | Environment variable | Purpose |
---|---|---|
otel.resource.attributes | OTEL_RESOURCE_ATTRIBUTES | Used to specify resource attributes in format: key1=val1,key2=val2,key3=val3 |
The peer service
name
is the name of a remote service that is being connected to. It corresponds to
service.name
in the
Resource
for the local service.
System property | Environment variable | Purpose |
---|---|---|
otel.endpoint.peer.service.mapping | OTEL_ENDPOINT_PEER_SERVICE_MAPPING | Used to specify a mapping from hostnames or IP addresses to peer services, as a comma separated list of host=name pairs. The peer service name will be added as an attribute to a span whose host or IP match the mapping. For example, if set to 1.2.3.4=cats-service,dogs-abcdef123.serverlessapis.com=dogs-api, requests to 1.2.3.4 will have a peer.service attribute of cats-service and requests to dogs-abcdef123.serverlessapis.com will have one of dogs-api |
System property | Environment variable | Purpose |
---|---|---|
otel.bsp.schedule.delay | OTEL_BSP_SCHEDULE_DELAY | The interval in milliseconds between two consecutive exports (default: 5000) |
otel.bsp.max.queue | OTEL_BSP_MAX_QUEUE | Maximum queue size (default: 2048) |
otel.bsp.max.export.batch | OTEL_BSP_MAX_EXPORT_BATCH | Maximum batch size (default: 512) |
otel.bsp.export.timeout | OTEL_BSP_EXPORT_TIMEOUT | Maximum allowed time in milliseconds to export data (default: 30000) |
otel.bsp.export.sampled | OTEL_BSP_EXPORT_SAMPLED | Whether only sampled spans should be exported (default: true) |
System property | Environment variable | Purpose |
---|---|---|
otel.config.sampler.probability | OTEL_CONFIG_SAMPLER_PROBABILITY | Sampling probability between 0 and 1 (default: 1) |
otel.config.max.attrs | OTEL_CONFIG_MAX_ATTRS | Maximum number of attributes per span (default: 32) |
otel.config.max.events | OTEL_CONFIG_MAX_EVENTS | Maximum number of events per span (default: 128) |
otel.config.max.links | OTEL_CONFIG_MAX_LINKS | Maximum number of links per span (default: 32) |
otel.config.max.event.attrs | OTEL_CONFIG_MAX_EVENT_ATTRS | Maximum number of attributes per event (default: 32) |
otel.config.max.link.attrs | OTEL_CONFIG_MAX_LINK_ATTRS | Maximum number of attributes per link (default: 32) |
System property | Environment variable | Purpose |
---|---|---|
otel.imr.export.interval | OTEL_IMR_EXPORT_INTERVAL | The interval in milliseconds between pushes to the exporter (default: 60000) |
This is highly advanced behavior and still in the prototyping phase. It may change drastically or be removed completely. Use with caution
The OpenTelemetry API exposes SPI
hooks
for customizing its behavior, such as the Resource
attached to spans or the
Sampler
.
Because the auto instrumentation runs in a separate classpath than the
instrumented application, it is not possible for customization in the
application to take advantage of this customization. In order to provide such
customization, you can provide the path to a JAR file including an SPI
implementation using the system property otel.initializer.jar
. Note that this
JAR will need to shade the OpenTelemetry API in the same way as the agent does.
The simplest way to do this is to use the same shading configuration as the
agent from
here.
In addition, you will have to specify the
io.opentelemetry.javaagent.shaded.io.opentelemetry.api.trace.spi.TraceProvider
to the name of the class that implements the SPI.
Starting with 0.6.0, and prior to version 1.0.0,
opentelemetry-javaagent-all.jar
only supports manual instrumentation using theopentelemetry-api
version with the same version number as the Java agent you are using. Starting with 1.0.0, the Java agent will start supporting multiple (1.0.0+) versions ofopentelemetry-api
.
With auto-instrumentation it may be desirable to also add manual instrumentation. In this scenario, it is critical that both automatic and manual instrumentation stitch together properly. Two options exist to configure manual instrumentation with the appropriate span context:
@WithSpan
annotation: Simply annotate the functions or methods you wish to instrumentgetTracer
: Traditional way to instrument with OpenTelemetryBoth options require a dependency on the opentelemetry-api
library to get started.
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>0.10.0</version>
</dependency>
</dependencies>
dependencies {
compile('io.opentelemetry:opentelemetry-api:0.10.0')
}
@WithSpan
annotationAdd the trace annotation to your application’s code. Then, each time the application invokes the annotated method, it creates a span that denotes its duration and provides any thrown exceptions.
import io.opentelemetry.extensions.auto.annotations.WithSpan;
public class MyClass {
@WithSpan
public void MyLogic() {
<...>
}
}
An additional dependency is required for this annotation:
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-extension-auto-annotations</artifactId>
<version>0.10.0</version>
</dependency>
</dependencies>
dependencies {
compile('io.opentelemetry:opentelemetry-extension-auto-annotations:0.10.0')
}
@WithSpan
instrumentationThis is useful in case you have code that is over-instrumented using @WithSpan
,
and you want to suppress some of them without modifying the code.
System property | Environment variable | Purpose |
---|---|---|
trace.annotated.methods.exclude | TRACE_ANNOTATED_METHODS_EXCLUDE | Suppress @WithSpan instrumentation for specific methods, format is “my.package.MyClass1[method1,method2];my.package.MyClass2[method3]” |
See the Manual Instrumentation documentation for configuration information and examples.
To turn on the agent’s internal debug logging:
-Dio.opentelemetry.javaagent.slf4j.simpleLogger.defaultLogLevel=debug
Note these logs are extremely verbose. Enable debug logging only when needed. Debug logging negatively impacts the performance of your application.