diff --git a/website_docs/_index.md b/website_docs/_index.md new file mode 100644 index 00000000000..f1031aac637 --- /dev/null +++ b/website_docs/_index.md @@ -0,0 +1,109 @@ +--- +title: "Java" +weight: 18 +description: > + + A language-specific implementation of OpenTelemetry in Java. +--- + +**Note**: As of 3/29 this is a copy of the documentation live on opentelemetry.io, and requires updates to become current with the current Java release. + +OpenTelemetry Java consists of the following repositories: + +- [opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java): + Components for manual instrumentation including API and SDK as well as + extensions, the OpenTracing shim and examples. +- [opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation): + Built on top of opentelemetry-java and provides a Java agent JAR that can be + attached to any Java 8+ application and dynamically injects bytecode to + capture telemetry from a number of popular libraries and frameworks. +- [opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib): + Provides helpful libraries and standalone OpenTelemetry-based utilities that + don't fit the express scope of the OpenTelemetry Java or Java Instrumentation + projects. For example, JMX metric gathering. + +## opentelemetry-java + +| Traces | Metrics | Logs | +| ------ | ------- | ------------ | +| Beta | Alpha | Experimental | + +### Components + +- Tracing API +- Tracing SDK +- Metrics API +- Metrics SDK +- OTLP Exporter +- Jaeger Trace Exporter +- Zipkin Trace Exporter +- Prometheus Metric Exporter +- Context Propagation +- OpenTracing Bridge +- OpenCensus Bridge + +### Releases + +Published releases are available on maven central. + +#### Maven + +```xml + + + io.opentelemetry + opentelemetry-api + 0.10.0 + + +``` + +#### Gradle + +```groovy +dependencies { + implementation('io.opentelemetry:opentelemetry-api:0.10.0') +} +``` + +#### Other + + - [releases](https://github.com/open-telemetry/opentelemetry-java/releases) + - [maven](https://mvnrepository.com/artifact/io.opentelemetry) + - [bintray](https://bintray.com/open-telemetry/maven/opentelemetry-java) + +### Additional Information + +- [Javadoc](https://www.javadoc.io/doc/io.opentelemetry) +- [Example code](https://github.com/open-telemetry/opentelemetry-java/tree/main/examples) + +## opentelemetry-java-instrumentation + +| Traces | Metrics | Logs | +| ------ | ------- | ------------ | +| Beta | Alpha | Experimental | + +### Releases + +> Published releases are *NOT* available on maven central, but will be by GA. + + - [releases](https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases) + - [bintray](https://bintray.com/open-telemetry/maven/opentelemetry-java-instrumentation) + +> Snapshots are also available as documented +> [here](https://github.com/open-telemetry/opentelemetry-java/blob/main/CONTRIBUTING.md#snapshots). + +### Additional Information + +- [Javadoc](https://www.javadoc.io/doc/io.opentelemetry) +- [Example code](https://github.com/open-telemetry/opentelemetry-java/tree/main/examples) + +## opentelemetry-java-contrib + +| Component | Status | +| ----------------- | ------ | +| JMX Metric Gather | Alpha | + +### Releases + + - [releases](https://github.com/open-telemetry/opentelemetry-java-contrib/releases) diff --git a/website_docs/automatic_instrumentation.md b/website_docs/automatic_instrumentation.md new file mode 100644 index 00000000000..58f8df04eaf --- /dev/null +++ b/website_docs/automatic_instrumentation.md @@ -0,0 +1,391 @@ +--- +title: "Automatic Instrumentation" +weight: 3 +--- + +**Note**: As of 3/29 this is a copy of the documentation live on opentelemetry.io, and requires updates to become current with the current Java release. + +## Supported Libraries and Frameworks + +| Library/Framework | Versions | +|---------------------------------------------------------------------------------------------------------------------------------------|--------------------------------| +| [Akka HTTP](https://doc.akka.io/docs/akka-http/current/index.html) | 10.0+ | +| [Apache HttpAsyncClient](https://hc.apache.org/index.html) | 4.0+ | +| [Apache HttpClient](https://hc.apache.org/index.html) | 2.0+ | +| [Armeria](https://armeria.dev) | 0.99.8+ | +| [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html) | 1.0+ | +| [AWS SDK](https://aws.amazon.com/sdk-for-java/) | 1.11.x and 2.2.0+ | +| [Cassandra Driver](https://github.com/datastax/java-driver) | 3.0+ | +| [Couchbase Client](https://github.com/couchbase/couchbase-java-client) | 2.0+ (not including 3.x yet) | +| [Dropwizard Views](https://www.dropwizard.io/en/latest/manual/views.html) | 0.7+ | +| [Elasticsearch API](https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html) | 5.0+ (not including 7.x yet) | +| [Elasticsearch REST Client](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html) | 5.0+ | +| [Finatra](https://github.com/twitter/finatra) | 2.9+ | +| [Geode Client](https://geode.apache.org/) | 1.4+ | +| [Google HTTP Client](https://github.com/googleapis/google-http-java-client) | 1.19+ | +| [Grizzly](https://javaee.github.io/grizzly/httpserverframework.html) | 2.0+ (disabled by default, see below) | +| [Grizzly Client](https://github.com/javaee/grizzly-ahc) | 1.9+ | +| [gRPC](https://github.com/grpc/grpc-java) | 1.5+ | +| [Hibernate](https://github.com/hibernate/hibernate-orm) | 3.3+ | +| [HttpURLConnection](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpURLConnection.html) | Java 7+ | +| [Hystrix](https://github.com/Netflix/Hystrix) | 1.4+ | +| [JAX-RS](https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/package-summary.html) | 0.5+ | +| [JAX-RS Client](https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/client/package-summary.html) | 2.0+ | +| [JDBC](https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/package-summary.html) | Java 7+ | +| [Jedis](https://github.com/xetorthio/jedis) | 1.4+ | +| [Jetty](https://www.eclipse.org/jetty/) | 8.0+ | +| [JMS](https://javaee.github.io/javaee-spec/javadocs/javax/jms/package-summary.html) | 1.1+ | +| [JSP](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/jsp/package-summary.html) | 2.3+ | +| [Kafka](https://kafka.apache.org/20/javadoc/overview-summary.html) | 0.11+ | +| [khttp](https://khttp.readthedocs.io) | 0.1+ | +| [Kubernetes Client](https://github.com/kubernetes-client/java) | 7.0+ | +| [Lettuce](https://github.com/lettuce-io/lettuce-core) | 4.0+ (not including 6.x yet) | +| [Log4j 1](https://logging.apache.org/log4j/1.2/) | 1.2+ | +| [Log4j 2](https://logging.apache.org/log4j/2.x/) | 2.7+ | +| [Logback](http://logback.qos.ch/) | 1.0+ | +| [MongoDB Drivers](https://mongodb.github.io/mongo-java-driver/) | 3.3+ | +| [Netty](https://github.com/netty/netty) | 3.8+ | +| [OkHttp](https://github.com/square/okhttp/) | 3.0+ | +| [Play](https://github.com/playframework/playframework) | 2.3+ (not including 2.8.x yet) | +| [Play WS](https://github.com/playframework/play-ws) | 1.0+ | +| [RabbitMQ Client](https://github.com/rabbitmq/rabbitmq-java-client) | 2.7+ | +| [Ratpack](https://github.com/ratpack/ratpack) | 1.4+ | +| [Reactor](https://github.com/reactor/reactor-core) | 3.1+ | +| [Rediscala](https://github.com/etaty/rediscala) | 1.8+ | +| [Redisson](https://github.com/redisson/redisson) | 3.0+ | +| [RMI](https://docs.oracle.com/en/java/javase/11/docs/api/java.rmi/java/rmi/package-summary.html) | Java 7+ | +| [RxJava](https://github.com/ReactiveX/RxJava) | 1.0+ | +| [Servlet](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/package-summary.html) | 2.2+ | +| [Spark Web Framework](https://github.com/perwendel/spark) | 2.3+ | +| [Spring Data](https://spring.io/projects/spring-data) | 1.8+ | +| [Spring Scheduling](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/package-summary.html) | 3.1+ | +| [Spring Web MVC](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/package-summary.html) | 3.1+ | +| [Spring Webflux](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/package-summary.html) | 5.0+ | +| [Spymemcached](https://github.com/couchbase/spymemcached) | 2.12+ | +| [Twilio](https://github.com/twilio/twilio-java) | 6.6+ (not including 8.x yet) | +| [Vert.x](https://vertx.io) | 3.0+ | +| [Vert.x RxJava2](https://vertx.io/docs/vertx-rx/java2/) | 3.5+ | + +### Disabled Instrumentations + +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..enabled` system property: +`-Dotel.integration.jdbc-datasource.enabled=true` + +### Grizzly Instrumentation + +Whenever you use +[Grizzly](https://javaee.github.io/grizzly/httpserverframework.html) 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` + +### Suppressing Instrumentation + +#### Specific Libraries + +You can suppress auto-instrumentation of specific libraries by using +`-Dotel.integration.[id].enabled=false` where `id` is the instrumentation `id`. + +#### Specific Classes + +You can also exclude specific classes from being instrumented. This can be +useful for a few reasons including: + +- To completely silence spans from a given class/package. +- As a quick workaround for an instrumentation bug, when byte code in one specific class is problematic. + +> 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.\*" | + +### Logger MDC auto-instrumentation + +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): + +```properties +logging.pattern.console = %d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %n +``` + +#### Supported logging libraries + +| Library | Version | +|---------|---------| +| Log4j 1 | 1.2+ | +| Log4j 2 | 2.7+ | +| Logback | 1.0+ | + +## Configuration Options + +> Configuration parameters names are very likely to change until GA. + +### Exporters + +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`. | + +#### OTLP exporter (both span and metric exporters) + +> In order to configure the service name for the OTLP exporter, you must add +`service.name` key to the OpenTelemetry Resource ([see +below](#opentelemetry-resource)). 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 | + +#### Jaeger exporter + +> 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". | + +#### Zipkin exporter + +| 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". | + +#### Prometheus exporter + +| 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" | + +#### Logging exporter + +> 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. | + +### Propagator + +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". | + +### OpenTelemetry Resource + +The [OpenTelemetry +Resource](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md) +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 | + +### Peer service name + +The [peer service +name](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-remote-service-attributes) +is the name of a remote service that is being connected to. It corresponds to +`service.name` in the +[Resource](https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions#service) +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` | + +### Batch span processor + +| 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) | + +### Trace config + +| 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) | + +### Interval metric reader + +| System property | Environment variable | Purpose | +|--------------------------|--------------------------|------------------------------------------------------------------------------| +| otel.imr.export.interval | OTEL_IMR_EXPORT_INTERVAL | The interval in milliseconds between pushes to the exporter (default: 60000) | + +#### Customizing the OpenTelemetry SDK + +> 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](https://github.com/open-telemetry/opentelemetry-java/blob/main/api/src/main/java/io/opentelemetry/trace/spi/TracerProviderFactory.java) +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](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/cfade733b899a2f02cfec7033c6a1efd7c54fd8b/java-agent/java-agent.gradle#L39). +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. + +## Manual Instrumentation + +> Starting with 0.6.0, and prior to version 1.0.0, `opentelemetry-javaagent-all.jar` +only supports manual instrumentation using the `opentelemetry-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 of `opentelemetry-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 instrument +- `getTracer`: Traditional way to instrument with OpenTelemetry + +Both options require a dependency on the `opentelemetry-api` library to get started. + +### Dependency + +#### Maven + +```xml + + + io.opentelemetry + opentelemetry-api + 0.10.0 + + +``` + +#### Gradle + +```groovy +dependencies { + compile('io.opentelemetry:opentelemetry-api:0.10.0') +} +``` + +### Configure `@WithSpan` annotation + +Add 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. + +```java +import io.opentelemetry.extensions.auto.annotations.WithSpan; + +public class MyClass { + @WithSpan + public void MyLogic() { + <...> + } +} +``` + +#### Dependency + +An additional dependency is required for this annotation: + +##### Maven + +```xml + + + io.opentelemetry + opentelemetry-extension-auto-annotations + 0.10.0 + + +``` + +##### Groovy + +```groovy +dependencies { + compile('io.opentelemetry:opentelemetry-extension-auto-annotations:0.10.0') +} +``` + +#### Suppressing `@WithSpan` instrumentation + +This 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]" | + +### Configure the OpenTelemetry getTracer + +See the [Manual Instrumentation documentation](/docs/java/manual_instrumentation/#instantiate-tracer) +for configuration information and examples. + +## Troubleshooting + +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. diff --git a/website_docs/getting_started.md b/website_docs/getting_started.md new file mode 100644 index 00000000000..27706e52bc6 --- /dev/null +++ b/website_docs/getting_started.md @@ -0,0 +1,58 @@ +--- +title: "Getting Started" +weight: 2 +--- + +**Note**: As of 3/29 this is a copy of the documentation live on opentelemetry.io, and requires updates to become current with the current Java release. + +## Automatic Instrumentation + +> Automatic instrumentation is applicable to trace data only today. + +Download the [latest version](/docs/java/#releases-1). This package includes +the instrumentation agent, instrumentations for all supported libraries and all +available data exporters. + +The instrumentation agent is enabled by passing the `-javaagent` flag to the JVM. + +```java +java -javaagent:path/to/opentelemetry-javaagent-all.jar \ + -jar myapp.jar +``` + +By default OpenTelemetry Java agent uses the [OTLP +exporter](https://github.com/open-telemetry/opentelemetry-java/tree/main/exporters/otlp) +configured to send data to a local [OpenTelemetry +Collector](https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/README.md) +at `localhost:55680`. + +Configuration parameters are passed as Java system properties (`-D` flags) or as +environment variables. For example: + +```java +java -javaagent:path/to/opentelemetry-javaagent-all.jar \ + -Dotel.exporter=zipkin \ + -jar myapp.jar +``` + +An exporter jar can be specified via the `otel.exporter.jar` system property: + +```java +java -javaagent:path/to/opentelemetry-javaagent-all.jar \ + -Dotel.exporter.jar=path/to/external-exporter.jar \ + -jar myapp.jar +``` + +For additional information, see the [Automatic Instrumentation documentation](/docs/java/automatic_instrumentation). + +## Manual Instrumentation + +Please see the [QuickStart Guide](https://github.com/open-telemetry/opentelemetry-java/blob/v1.0.0/QUICKSTART.md). + +#### Example + +Several +[examples](https://github.com/open-telemetry/opentelemetry-java/tree/main/examples) +are provided to get started. The [metrics +examples](https://github.com/open-telemetry/opentelemetry-java/tree/main/examples/metrics) +demonstrates how to generate other types of metrics. diff --git a/website_docs/instrumentation_examples.md b/website_docs/instrumentation_examples.md new file mode 100644 index 00000000000..6961f07401e --- /dev/null +++ b/website_docs/instrumentation_examples.md @@ -0,0 +1,26 @@ +--- +title: "Instrumentation Examples" +weight: 4 +--- + +**Note**: As of 3/29 this is a copy of the documentation live on opentelemetry.io, and requires updates to become current with the current Java release. + +Here are Some of the resources for Opentelemetry Instrumentation Examples + +## Community Resources + +### boot-opentelemetry-tempo + +Project demonstrating Complete Observability Stack utilizing [Prometheus](https://prometheus.io/), [Loki](https://grafana.com/oss/loki/) (_For distributed logging_), [Tempo](https://grafana.com/oss/tempo/) (_For Distributed tracing, this basically uses Jaeger Internally_), [Grafana](https://grafana.com/grafana/) for **Java/spring** based applications (_With OpenTelemetry auto / manual Instrumentation_) involving multiple microservices with DB interactions + +Checkout [boot-opentelemetry-tempo](https://github.com/mnadeem/boot-opentelemetry-tempo) and get started + +````bash +mvn clean package docker:build +```` + +````bash +docker-compose up +```` + + diff --git a/website_docs/manual_instrumentation.md b/website_docs/manual_instrumentation.md new file mode 100644 index 00000000000..f8c91a4bc58 --- /dev/null +++ b/website_docs/manual_instrumentation.md @@ -0,0 +1,393 @@ +--- +Title: "Manual Instrumentation" +Weight: 3 +--- + +**Note**: As of 3/29 this is a copy of the documentation live on opentelemetry.io, and requires updates to become current with the current Java release. + +## Traces + +### Instantiate `TracerProvider` and SDK + +In the [OpenTelemetry Tracing +API](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md), +the `TracerProvider` is the main entry point and is expected to be the stateful +object that holds any configuration. The `TracerProvider` provides access +to the [`Tracer`](#instantiate-tracer). + +```java + SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() + .addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build()) + .build(); + + OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() + .setTracerProvider(sdkTracerProvider) + .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) + .buildAndRegisterGlobal(); +``` + +### Instantiate `Tracer` + +In order to instrument, you must acquire a `Tracer`. A `Tracer` is responsible for +creating spans. To acquire a `Tracer` use the [OpenTelemetry Tracing +API](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md) +and specify the name and version of the [library +instrumenting](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/glossary.md#instrumentation-library) +the [instrumented +library](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/glossary.md#instrumented-library) +or application to be monitored. + +```java +Tracer tracer = + openTelemetry.getTracer("instrumentation-library-name","1.0.0"); +``` + +### Create Spans + +#### Basic + +To create a basic span, you only need to specify the name of the span. The +start and end time of the span is automatically set by the OpenTelemetry SDK. + +```java +Span span = tracer.spanBuilder("my span").startSpan(); +// put the span into the current Context +try (Scope scope = span.makeCurrent()) { + // your use case + ... +} catch (Throwable t) { + span.setStatus(StatusCode.ERROR, "Change it to your error message"); +} finally { + span.end(); // closing the scope does not end the span, this has to be done manually +} +``` + +#### Nested + +Most of the time, we want to correlate spans for nested operations. +OpenTelemetry supports tracing within processes and across remote processes. +For more information about how to share context between remote processes, see [Context +Propagation](#context-propagation). + +For a method `parentOne` calling a method `childOne`, the spans could be manually linked in the +following way: + +```java +void parentOne() { + Span parentSpan = tracer.spanBuilder("parent").startSpan(); + try { + childOne(parentSpan); + } finally { + parentSpan.end(); + } +} + +void childOne(Span parentSpan) { + Span childSpan = tracer.spanBuilder("child") + .setParent(Context.current().with(parentSpan)) + .startSpan(); + // do stuff + childSpan.end(); +} +``` + +The OpenTelemetry API also offers an automated way to propagate the parentSpan: + +```java +void parentTwo() { + Span parentSpan = tracer.spanBuilder("parent").startSpan(); + try(Scope scope = parentSpan.makeCurrent()) { + childTwo(); + } finally { + parentSpan.end(); + } +} +void childTwo() { + Span childSpan = tracer.spanBuilder("child") + // NOTE: setParent(...) is not required; + // `Span.current()` is automatically added as the parent + .startSpan(); + try(Scope scope = childSpan.makeCurrent()) { + // do stuff + } finally { + childSpan.end(); + } +} +``` + +To link spans from remote processes, it is sufficient to set the [Remote +Context](#context-propagation) as parent. + +```java +Span childRemoteParent = tracer.spanBuilder("Child").setParent(remoteContext).startSpan(); +``` + +### Enrich Spans + +#### Attributes + +In OpenTelemetry, you can create spans freely. It's up to the implementor to +annotate spans with attributes specific to the represented operation. Attributes +provide additional context on a span about the specific operation it tracks, +such as results or operation properties. + +```java +Span span = tracer.spanBuilder("/resource/path").setSpanKind(SpanKind.CLIENT).startSpan(); +span.setAttribute("http.method", "GET"); +span.setAttribute("http.url", url.toString()); +``` + +Some of these operations represent calls that use well-known protocols like +HTTP or database calls. For these operations, OpenTelemetry requires specific attributes +to be set. The full attribute list is available in the Semantic Conventions in +the cross-language specification. And, the standard attribute keys are available in the +`io.opentelemetry.api.trace.attributes.SemanticAttributes` class as constants. + +#### Events + +Spans can be annotated with named events that can carry zero or more [Span +Attributes](#attributes), each of which is itself a name/value map paired +automatically with a timestamp. + +```java +span.addEvent("Init"); +... +span.addEvent("End"); +``` + +```java +Attributes eventAttributes = Attributes.of( + AttributeKey.stringKey("key"), "value", + AttributeKey.longKey("result"), 0L); + +span.addEvent("End Computation", eventAttributes); +``` + +#### Links + +You can link a span to zero or more other spans that are causally related. +Use links to represent batched operations where a span was initiated by +multiple initiating spans, each representing a single incoming item being +processed in the batch. + +```java +Span child = tracer.spanBuilder("childWithLink") + .addLink(parentSpan1.getSpanContext()) + .addLink(parentSpan2.getSpanContext()) + .addLink(parentSpan3.getSpanContext()) + .addLink(remoteSpanContext) + .startSpan(); +``` + +For more information about how to read context from remote processes, see [Context +Propagation](#context-propagation). + +### Context Propagation + +OpenTelemetry provides a text-based approach to propagate context to remote +services. By default, the [W3C Trace Context](https://www.w3.org/TR/trace-context/) +format is used. + +The following example shows an outgoing HTTP request using +`HttpURLConnection`: + +```java +// Tell OpenTelemetry to inject the context in the HTTP headers +TextMapSetter setter = + new TextMapSetter() { + @Override + public void set(HttpURLConnection carrier, String key, String value) { + // Insert the context as Header + carrier.setRequestProperty(key, value); + } +}; + +URL url = new URL("http://127.0.0.1:8080/resource"); +Span outGoing = tracer.spanBuilder("/resource").setSpanKind(SpanKind.CLIENT).startSpan(); +try (Scope scope = outGoing.makeCurrent()) { + // Semantic Convention. + // (Note that to set these, Span does not *need* to be the current instance in Context or Scope.) + outGoing.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); + outGoing.setAttribute(SemanticAttributes.HTTP_URL, url.toString()); + HttpURLConnection transportLayer = (HttpURLConnection) url.openConnection(); + // Inject the request with the *current* Context, which contains our current Span. + openTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), transportLayer, setter); + // Make outgoing call +} finally { + outGoing.end(); +} +... +``` + +Similarly, you can use the text-based approach to read the W3C Trace Context +from incoming requests. The following example demonstrates processing an +incoming HTTP request using +[HttpExchange](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpExchange.html): + +```java +TextMapGetter getter = + new TextMapGetter<>() { + @Override + public String get(HttpExchange carrier, String key) { + if (carrier.getRequestHeaders().containsKey(key)) { + return carrier.getRequestHeaders().get(key).get(0); + } + return null; + } + + @Override + public Iterable keys(HttpExchange carrier) { + return carrier.getRequestHeaders().keySet(); + } +}; +... +public void handle(HttpExchange httpExchange) { + // Extract the SpanContext and other elements from the request. + Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator() + .extract(Context.current(), httpExchange, getter); + try (Scope scope = extractedContext.makeCurrent()) { + // Automatically use the extracted SpanContext as parent. + Span serverSpan = tracer.spanBuilder("GET /resource") + .setSpanKind(SpanKind.SERVER) + .startSpan(); + try { + // Add the attributes defined in the Semantic Conventions + serverSpan.setAttribute(SemanticAttributes.HTTP_METHOD, "GET"); + serverSpan.setAttribute(SemanticAttributes.HTTP_SCHEME, "http"); + serverSpan.setAttribute(SemanticAttributes.HTTP_HOST, "localhost:8080"); + serverSpan.setAttribute(SemanticAttributes.HTTP_TARGET, "/resource"); + // Serve the request + ... + } finally { + serverSpan.end(); + } + } +} +``` + +Other propagators are available as extensions, most notably +[Zipkin +B3](https://github.com/open-telemetry/opentelemetry-java/tree/main/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation). + +### Configuring the default OpenTelemetry SDK + +In order to configure the SDK, options can be passed to the builder method of `SdkTracerProvider`. The following demonstrates a SDK that writes traces through a logger. + +```java + SdkTracerProvider tracerProvider = SdkTracerProvider.builder() + .addSpanProcessor(BatchSpanProcessor.builder(new LoggingSpanExporter()).build()) + .build(); +``` + +### Processors + +The following processors are available today: + +#### SimpleSpanProcessor + +This span processor exports spans immediately after they end. + +Example: + +```java +SimpleSpanProcessor simpleSpansProcessor = SimpleSpanProcessor.builder(exporter).build(); +tracerManagement.addSpanProcessor(simpleSpansProcessor); +``` + +#### BatchSpanProcessor + +This span processor exports spans in batches. + +Example: + +```java +BatchSpanProcessor batchSpansProcessor = + BatchSpanProcessor.builder(exporter).build(); +tracerManagement.addSpanProcessor(batchSpansProcessor); +``` + +You can also specify a variety of configuration parameters: + +```java +BatchSpanProcessor batchSpansProcessor = + BatchSpanProcessor.builder(exporter) + .setExportOnlySampled(true) // send only sampled spans to the exporter + .setMaxExportBatchSize(512) // maximum batch size to use + .setMaxQueueSize(2048) // queue size; mmust be >= the export batch size + .setExporterTimeoutMillis( + 30_000) // max amount of time an export can run before getting interrupted + .setScheduleDelayMillis(5000) // set time between two different exports + .build(); +tracerManagement.addSpanProcessor(batchSpansProcessor); +``` + +#### MultiSpanProcessor + +A MultiSpanProcessor accepts a list of span processors. + +Example: + +```java +SpanProcessor multiSpanProcessor = + MultiSpanProcessor.create(Arrays.asList(simpleSpansProcessor, batchSpansProcessor)); +tracerManagement.addSpanProcessor(multiSpanProcessor); +``` + +### Exporters + +*TODO* + +### Sampling + +*TODO* + +## Metrics + +OpenTelemetry provides support for metrics, a time series of numbers that might +express things such as CPU utilization, request count for an HTTP server, or a +business metric such as transactions. + +All metrics can be annotated with labels. Labels are additional qualifiers that help +describe what subdivision of the measurements the metric represents. + +The following is an example of counter usage: + +```java +// Gets or creates a named meter instance +Meter meter = meterProvider.get("instrumentation-library-name", "1.0.0"); + +// Build counter e.g. LongCounter +LongCounter counter = meter + .longCounterBuilder("processed_jobs") + .setDescription("Processed jobs") + .setUnit("1") + .build(); + +// It is recommended that the API user keep a reference to a Bound Counter for the entire time or +// call unbind when no-longer needed. +BoundLongCounter someWorkCounter = counter.bind(Labels.of("Key", "SomeWork")); + +// Record data +someWorkCounter.add(123); + +// Alternatively, the user can use the unbounded counter and explicitly +// specify the labels set at call-time: +counter.add(123, Labels.of("Key", "SomeWork")); +``` + +`Observer` is an additional instrument supporting an asynchronous API and +collecting metric data on demand, once per collection interval. + +The following is an example of observer usage: + +```java +// Build observer e.g. LongSumObserver + LongSumObserver observer = meter + .longSumObserverBuilder("cpu_usage") + .setDescription("CPU Usage") + .setUnit("ms") + .setUpdater(result -> { + result.observe(getCpuUsage(), Labels.of("Key", "SomeWork")); + }) + .build(); +```