opentelemetry.io/content/en/docs/languages/java/resources.md

3.8 KiB

title weight cSpell:ignore
Resources 70 getenv myhost SIGINT uuidgen WORKDIR

{{% docs/languages/resources-intro %}}

If you use the Java agent for automatic instrumentation you can learn how to setup resource detection following the Agent Configuration Guide.

For manual instrumentation, you will find some introductions on how to set up resource detection below.

Detecting resources from common environments

You can use ResourceProviders for filling in attributes related to common environments, like Container, Host or Operating System. These can be used with or without autoconfiguration.

To use those providers, add the following dependency:

{{< tabpane text=true >}} {{% tab Gradle %}}

dependencies {
    implementation("io.opentelemetry.instrumentation:opentelemetry-resources:{{% param vers.otel %}}-alpha");
}

{{% /tab %}} {{% tab Maven %}}

<project>
    <dependencies>
        <dependency>
            <groupId>io.opentelemetry.instrumentation</groupId>
            <artifactId>opentelemetry-resources</artifactId>
        </dependency>
    </dependencies>
</project>

{{< /tab >}} {{< /tabpane>}}

Next you can use them like the following in your code:

import io.opentelemetry.instrumentation.resources.ContainerResource;
import io.opentelemetry.instrumentation.resources.HostResource;
import io.opentelemetry.instrumentation.resources.OsResource;
import io.opentelemetry.instrumentation.resources.ProcessResource;
import io.opentelemetry.instrumentation.resources.ProcessRuntimeResource;

...
    Resource resource = Resource.getDefault()
      .merge(ContainerResource.get())
      .merge(HostResource.get())
      .merge(OsResource.get())
      .merge(ProcessResource.get())
      .merge(ProcessRuntimeResource.get())
      .merge(Resource.create(Attributes.builder()
        .put(ResourceAttributes.SERVICE_NAME, "dice-service")
        ...
        .build()));
...

Adding resources in code

Custom resources can be configured in your code like the following:

Resource resource = Resource.getDefault()
    .merge(Resource.create(Attributes.builder()
        .put(ResourceAttributes.SERVICE_NAME, "dice-service")
        .put(ResourceAttributes.SERVICE_VERSION, "0.1.0")
        .put(ResourceAttributes.SERVICE_INSTANCE_ID, "dice-service-1")
        .put(ResourceAttributes.HOST_NAME, System.getenv("HOSTNAME"))
        .put(ResourceAttributes.PROCESS_PID, ProcessHandle.current().pid())
        .build()));

SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
    .setResource(resource)
    ...
    .build();

SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
    .setResource(resource)
    ...
    .build();

SdkLoggerProvider sdkLoggerProvider = SdkLoggerProvider.builder()
    .setResource(resource)
    ...
    .build();

Next steps

Besides the Standard OpenTelemetry Resource Providers shown in the samples above, there are more resource providers that you can add to your configuration. These include: