Skip to main content

Java OpenTelemetry auto-instrumentation

Perhaps the most convenient way to start capturing telemetry from Java (or, generally speaking, JVM) is to incorporate OpenTelemetry Instrumentation for Java. It automatically detects when one of the popular libraries is being used in the service and injects the instrumentation without writing any code. It’s also possible to mix automatic instrumentation with manual instrumentation if needed. This method works for all Java 8+ JVMs.

tip

If the OTLP Java exporter fails due to missing system libraries, we recommend using the Zipkin exporter.

Micro Lesson

Tutorial: Auto-instrumentation of a Java app by OpenTelemetry for K8s Environment.

Installation

The Java agent and configuration needs to be provided for each of the monitored service instances. The address of the OpenTelemetry Collector (or Collector/Agent) needs to be prepared first (COLLECTOR_HOSTNAME) and the desired name of the service (SERVICE_NAME) and application (APPLICATION_NAME).

Instruction below applies to OpenTelemetry Java Auto Instrumentation in version 1.16.0.

Step 1: Download and distribute the agent JAR

The agent should be downloaded and distributed to each of the service hosts or containers, as the JVM will need access to it.

Step 2: Update the JVM configuration (valid for version 1.16.0)

Either of the following options could be used as the template, with the following changes:

  • The path to the javaagent JAR file needs to replaced with the location of the file downloaded and distributed in step 1.

  • COLLECTOR_HOSTNAME must be provided with the location of the OpenTelemetry Collector/Agent (recommended for production) or Sumo Logic HTTP Traces source. Refer to the following setup instructions if you don't have yet collector installed:

  • SERVICE_NAME needs to be replaced with the name used for the identification of the service.

  • APPLICATION_NAME needs to be replaced with the name used for the identification of the application.

The following environment variables need to be made accessible by JVM:

JAVA_TOOL_OPTIONS="-javaagent:path/to/opentelemetry-javaagent.jar"

OTEL_TRACES_EXPORTER=otlp
OTEL_METRICS_EXPORTER=none
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://COLLECTOR_HOSTNAME:4318/v1/traces
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf
OTEL_SERVICE_NAME=SERVICE_NAME
OTEL_RESOURCE_ATTRIBUTES=application=APPLICATION_NAME

Option 2: Changing the java command line

The command line of the service needs to be appended with the following attributes:

java -javaagent:path/to/opentelemetry-javaagent.jar \
-Dotel.traces.exporter=otlp \
-Dotel.metrics.exporter=none \
-Dotel.exporter.otlp.traces.endpoint=http://COLLECTOR_HOSTNAME:4318/v1/traces \
-Dotel.exporter.otlp.traces.protocol=http/protobuf \
-Dotel.service.name=SERVICE_NAME \
-Dotel.resource.attributes=application=APPLICATION_NAME \
...

Troubleshooting

To confirm the instrumentation was installed, after starting the service, the following log lines are to be expected in the console:

[otel.javaagent 2022-08-19 09:58:00:822 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.16.0

When errors are present in the console, describing that some system libraries are missing or that connection cannot be established, a Zipkin exporter can be used instead of OTLP, for example:

OTEL_TRACES_EXPORTER=zipkin
OTEL_EXPORTER_ZIPKIN_ENDPOINT=http://OPENTELEMETRY_COLLECTOR_HOSTNAME:9411/api/v2/spans
OTEL_SERVICE_NAME=SERVICE_NAME
OTEL_RESOURCE_ATTRIBUTES=application=APPLICATION_NAME
Legal
Privacy Statement
Terms of Use

Copyright © 2023 by Sumo Logic, Inc.