Skip to content

Commit faf99ae

Browse files
2508: Logging Exporter Example for Trace and Metrics (open-telemetry#2789)
* Added example for logging exporter * Used global otel for tracing * Revert "Used global otel for tracing" This reverts commit 8f26773. * Register the trace provider as global
1 parent 817ce57 commit faf99ae

File tree

4 files changed

+127
-1
lines changed

4 files changed

+127
-1
lines changed

examples/logging/build.gradle

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id 'java'
3+
}
4+
5+
description = "OpenTelemetry Examples for logging exporters"
6+
ext.moduleName = "io.opentelemetry.examples.logging"
7+
8+
dependencies {
9+
compile("io.opentelemetry:opentelemetry-api")
10+
compile("io.opentelemetry:opentelemetry-api-metrics:${openTelemetryAlphaVersion}")
11+
compile("io.opentelemetry:opentelemetry-exporter-logging")
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.opentelemetry.example.logging;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.exporter.logging.LoggingMetricExporter;
5+
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
6+
import io.opentelemetry.sdk.OpenTelemetrySdk;
7+
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
8+
import io.opentelemetry.sdk.metrics.export.IntervalMetricReader;
9+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
10+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
11+
import java.util.Collections;
12+
13+
/**
14+
* All SDK management takes place here, away from the instrumentation code, which should only access
15+
* the OpenTelemetry APIs.
16+
*/
17+
public class ExampleConfiguration {
18+
19+
/** The number of milliseconds between metric exports. */
20+
private static final long METRIC_EXPORT_INTERVAL_MS = 800L;
21+
22+
/**
23+
* Initializes an OpenTelemetry SDK with a logging exporter and a SimpleSpanProcessor.
24+
*
25+
* @return A ready-to-use {@link OpenTelemetry} instance.
26+
*/
27+
public static OpenTelemetry initOpenTelemetry() {
28+
// This will be used to create instruments
29+
SdkMeterProvider meterProvider = SdkMeterProvider.builder().buildAndRegisterGlobal();
30+
31+
// Create an instance of IntervalMetricReader and configure it
32+
// to read metrics from the meterProvider and export them to the logging exporter
33+
IntervalMetricReader.builder()
34+
.setMetricExporter(new LoggingMetricExporter())
35+
.setMetricProducers(Collections.singleton(meterProvider))
36+
.setExportIntervalMillis(METRIC_EXPORT_INTERVAL_MS)
37+
.build();
38+
39+
// Tracer provider configured to export spans with SimpleSpanProcessor using
40+
// the logging exporter.
41+
SdkTracerProvider tracerProvider =
42+
SdkTracerProvider.builder()
43+
.addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter()))
44+
.build();
45+
return OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal();
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.opentelemetry.example.logging;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.api.metrics.GlobalMetricsProvider;
5+
import io.opentelemetry.api.metrics.LongCounter;
6+
import io.opentelemetry.api.trace.Span;
7+
import io.opentelemetry.api.trace.Tracer;
8+
9+
/**
10+
* An example of using {@link io.opentelemetry.exporter.logging.LoggingSpanExporter} and {@link
11+
* io.opentelemetry.exporter.logging.LoggingMetricExporter}.
12+
*/
13+
public class LoggingExporterExample {
14+
private static final String INSTRUMENTATION_NAME = LoggingExporterExample.class.getName();
15+
16+
private final Tracer tracer;
17+
private final LongCounter counter;
18+
19+
public LoggingExporterExample(OpenTelemetry openTelemetry) {
20+
tracer = openTelemetry.getTracer(INSTRUMENTATION_NAME);
21+
counter =
22+
GlobalMetricsProvider.getMeter(INSTRUMENTATION_NAME)
23+
.longCounterBuilder("work_done")
24+
.build();
25+
}
26+
27+
public void myWonderfulUseCase() {
28+
Span span = this.tracer.spanBuilder("start my wonderful use case").startSpan();
29+
span.addEvent("Event 0");
30+
doWork();
31+
span.addEvent("Event 1");
32+
span.end();
33+
}
34+
35+
private void doWork() {
36+
Span span = this.tracer.spanBuilder("doWork").startSpan();
37+
try {
38+
Thread.sleep(1000);
39+
counter.add(1);
40+
} catch (InterruptedException e) {
41+
// do the right thing here
42+
} finally {
43+
span.end();
44+
}
45+
}
46+
47+
public static void main(String[] args) {
48+
// it is important to initialize your SDK as early as possible in your application's lifecycle
49+
OpenTelemetry oTel = ExampleConfiguration.initOpenTelemetry();
50+
51+
// Start the example
52+
LoggingExporterExample example = new LoggingExporterExample(oTel);
53+
// Generate a few sample spans
54+
for (int i = 0; i < 5; i++) {
55+
example.myWonderfulUseCase();
56+
}
57+
58+
try {
59+
// Flush out the metrics that have not yet been exported
60+
Thread.sleep(1000L);
61+
} catch (InterruptedException e) {
62+
}
63+
64+
System.out.println("Bye");
65+
}
66+
}

examples/settings.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ include ":opentelemetry-examples-grpc",
1919
":opentelemetry-examples-prometheus",
2020
":opentelemetry-examples-otlp",
2121
":opentelemetry-examples-sdk-usage",
22-
":opentelemetry-examples-zipkin"
22+
":opentelemetry-examples-zipkin",
23+
":opentelemetry-examples-logging"
2324

2425
rootProject.children.each {
2526
it.projectDir = "$rootDir/" + it.name

0 commit comments

Comments
 (0)