Skip to content

Commit 8fe9a11

Browse files
authored
Add configuration snippets for opentelemetry.io (#455)
1 parent 297a60d commit 8fe9a11

35 files changed

+942
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
id("java")
3+
}
4+
5+
val moduleName by extra { "io.opentelemetry.examples.docs.configuration" }
6+
7+
dependencies {
8+
implementation("io.opentelemetry:opentelemetry-sdk")
9+
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
10+
11+
implementation("io.opentelemetry:opentelemetry-exporter-otlp")
12+
implementation("io.opentelemetry:opentelemetry-exporter-logging")
13+
implementation("io.opentelemetry:opentelemetry-exporter-logging-otlp")
14+
implementation("io.opentelemetry:opentelemetry-exporter-zipkin")
15+
implementation("io.opentelemetry:opentelemetry-exporter-prometheus")
16+
implementation("io.opentelemetry:opentelemetry-sdk-extension-jaeger-remote-sampler")
17+
18+
implementation("io.opentelemetry.semconv:opentelemetry-semconv")
19+
implementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating:1.26.0-alpha")
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.OpenTelemetrySdk;
4+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
5+
6+
public class AutoConfiguredSdk {
7+
public static OpenTelemetrySdk autoconfiguredSdk() {
8+
return AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk();
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package otel;
2+
3+
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
4+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
5+
import io.opentelemetry.context.propagation.ContextPropagators;
6+
import io.opentelemetry.context.propagation.TextMapPropagator;
7+
8+
public class ContextPropagatorsConfig {
9+
public static ContextPropagators create() {
10+
return ContextPropagators.create(
11+
TextMapPropagator.composite(
12+
W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()));
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.common.CompletableResultCode;
4+
import io.opentelemetry.sdk.logs.data.LogRecordData;
5+
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
6+
import java.util.Collection;
7+
import java.util.logging.Level;
8+
import java.util.logging.Logger;
9+
10+
public class CustomLogRecordExporter implements LogRecordExporter {
11+
12+
private static final Logger logger = Logger.getLogger(CustomLogRecordExporter.class.getName());
13+
14+
@Override
15+
public CompletableResultCode export(Collection<LogRecordData> logs) {
16+
// Export the records. Typically, records are sent out of process via some network protocol, but
17+
// we simply log for illustrative purposes.
18+
System.out.println("Exporting logs");
19+
logs.forEach(log -> System.out.println("log record: " + log));
20+
return CompletableResultCode.ofSuccess();
21+
}
22+
23+
@Override
24+
public CompletableResultCode flush() {
25+
// Export any records which have been queued up but not yet exported.
26+
logger.log(Level.INFO, "flushing");
27+
return CompletableResultCode.ofSuccess();
28+
}
29+
30+
@Override
31+
public CompletableResultCode shutdown() {
32+
// Shutdown the exporter and cleanup any resources.
33+
logger.log(Level.INFO, "shutting down");
34+
return CompletableResultCode.ofSuccess();
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
4+
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
5+
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
6+
7+
public class CustomLogRecordExporterProvider implements ConfigurableLogRecordExporterProvider {
8+
9+
@Override
10+
public LogRecordExporter createExporter(ConfigProperties config) {
11+
// Callback invoked when OTEL_LOGS_EXPORTER includes the value from getName().
12+
return new CustomLogRecordExporter();
13+
}
14+
15+
@Override
16+
public String getName() {
17+
return "custom-exporter";
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package otel;
2+
3+
import io.opentelemetry.api.common.AttributeKey;
4+
import io.opentelemetry.context.Context;
5+
import io.opentelemetry.sdk.common.CompletableResultCode;
6+
import io.opentelemetry.sdk.logs.LogRecordProcessor;
7+
import io.opentelemetry.sdk.logs.ReadWriteLogRecord;
8+
9+
public class CustomLogRecordProcessor implements LogRecordProcessor {
10+
11+
@Override
12+
public void onEmit(Context context, ReadWriteLogRecord logRecord) {
13+
// Callback invoked when log record is emitted.
14+
// Enrich the record with a custom attribute.
15+
logRecord.setAttribute(AttributeKey.stringKey("my.custom.attribute"), "hello world");
16+
}
17+
18+
@Override
19+
public CompletableResultCode shutdown() {
20+
// Optionally shutdown the processor and cleanup any resources.
21+
return CompletableResultCode.ofSuccess();
22+
}
23+
24+
@Override
25+
public CompletableResultCode forceFlush() {
26+
// Optionally process any records which have been queued up but not yet processed.
27+
return CompletableResultCode.ofSuccess();
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.common.CompletableResultCode;
4+
import io.opentelemetry.sdk.common.export.MemoryMode;
5+
import io.opentelemetry.sdk.metrics.Aggregation;
6+
import io.opentelemetry.sdk.metrics.InstrumentType;
7+
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
8+
import io.opentelemetry.sdk.metrics.data.MetricData;
9+
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
10+
import io.opentelemetry.sdk.metrics.export.MetricExporter;
11+
import java.util.Collection;
12+
import java.util.logging.Level;
13+
import java.util.logging.Logger;
14+
15+
public class CustomMetricExporter implements MetricExporter {
16+
17+
private static final Logger logger = Logger.getLogger(CustomMetricExporter.class.getName());
18+
19+
@Override
20+
public CompletableResultCode export(Collection<MetricData> metrics) {
21+
// Export the records. Typically, records are sent out of process via some network protocol, but
22+
// we simply log for illustrative purposes.
23+
logger.log(Level.INFO, "Exporting metrics");
24+
metrics.forEach(metric -> logger.log(Level.INFO, "Metric: " + metric));
25+
return CompletableResultCode.ofSuccess();
26+
}
27+
28+
@Override
29+
public CompletableResultCode flush() {
30+
// Export any records which have been queued up but not yet exported.
31+
logger.log(Level.INFO, "flushing");
32+
return CompletableResultCode.ofSuccess();
33+
}
34+
35+
@Override
36+
public CompletableResultCode shutdown() {
37+
// Shutdown the exporter and cleanup any resources.
38+
logger.log(Level.INFO, "shutting down");
39+
return CompletableResultCode.ofSuccess();
40+
}
41+
42+
@Override
43+
public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) {
44+
// Specify the required aggregation temporality as a function of instrument type
45+
return AggregationTemporalitySelector.deltaPreferred()
46+
.getAggregationTemporality(instrumentType);
47+
}
48+
49+
@Override
50+
public MemoryMode getMemoryMode() {
51+
// Optionally specify the memory mode, indicating whether metric records can be reused or must
52+
// be immutable
53+
return MemoryMode.REUSABLE_DATA;
54+
}
55+
56+
@Override
57+
public Aggregation getDefaultAggregation(InstrumentType instrumentType) {
58+
// Optionally specify the default aggregation as a function of instrument kind
59+
return Aggregation.defaultAggregation();
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
4+
import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider;
5+
import io.opentelemetry.sdk.metrics.export.MetricExporter;
6+
7+
public class CustomMetricExporterProvider implements ConfigurableMetricExporterProvider {
8+
9+
@Override
10+
public MetricExporter createExporter(ConfigProperties config) {
11+
// Callback invoked when OTEL_METRICS_EXPORTER includes the value from getName().
12+
return new CustomMetricExporter();
13+
}
14+
15+
@Override
16+
public String getName() {
17+
return "custom-exporter";
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.common.CompletableResultCode;
4+
import io.opentelemetry.sdk.common.export.MemoryMode;
5+
import io.opentelemetry.sdk.metrics.Aggregation;
6+
import io.opentelemetry.sdk.metrics.InstrumentType;
7+
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
8+
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
9+
import io.opentelemetry.sdk.metrics.export.CollectionRegistration;
10+
import io.opentelemetry.sdk.metrics.export.MetricReader;
11+
import java.util.concurrent.Executors;
12+
import java.util.concurrent.ScheduledExecutorService;
13+
import java.util.concurrent.TimeUnit;
14+
import java.util.concurrent.atomic.AtomicReference;
15+
import java.util.logging.Level;
16+
import java.util.logging.Logger;
17+
18+
public class CustomMetricReader implements MetricReader {
19+
20+
private static final Logger logger = Logger.getLogger(CustomMetricExporter.class.getName());
21+
22+
private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
23+
private final AtomicReference<CollectionRegistration> collectionRef =
24+
new AtomicReference<>(CollectionRegistration.noop());
25+
26+
@Override
27+
public void register(CollectionRegistration collectionRegistration) {
28+
// Callback invoked when SdkMeterProvider is initialized, providing a handle to collect metrics.
29+
collectionRef.set(collectionRegistration);
30+
executorService.scheduleWithFixedDelay(this::collectMetrics, 0, 60, TimeUnit.SECONDS);
31+
}
32+
33+
private void collectMetrics() {
34+
// Collect metrics. Typically, records are sent out of process via some network protocol, but we
35+
// simply log for illustrative purposes.
36+
logger.log(Level.INFO, "Collecting metrics");
37+
collectionRef
38+
.get()
39+
.collectAllMetrics()
40+
.forEach(metric -> logger.log(Level.INFO, "Metric: " + metric));
41+
}
42+
43+
@Override
44+
public CompletableResultCode forceFlush() {
45+
// Export any records which have been queued up but not yet exported.
46+
logger.log(Level.INFO, "flushing");
47+
return CompletableResultCode.ofSuccess();
48+
}
49+
50+
@Override
51+
public CompletableResultCode shutdown() {
52+
// Shutdown the exporter and cleanup any resources.
53+
logger.log(Level.INFO, "shutting down");
54+
return CompletableResultCode.ofSuccess();
55+
}
56+
57+
@Override
58+
public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) {
59+
// Specify the required aggregation temporality as a function of instrument type
60+
return AggregationTemporalitySelector.deltaPreferred()
61+
.getAggregationTemporality(instrumentType);
62+
}
63+
64+
@Override
65+
public MemoryMode getMemoryMode() {
66+
// Optionally specify the memory mode, indicating whether metric records can be reused or must
67+
// be immutable
68+
return MemoryMode.REUSABLE_DATA;
69+
}
70+
71+
@Override
72+
public Aggregation getDefaultAggregation(InstrumentType instrumentType) {
73+
// Optionally specify the default aggregation as a function of instrument kind
74+
return Aggregation.defaultAggregation();
75+
}
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
4+
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
5+
import io.opentelemetry.sdk.resources.Resource;
6+
7+
public class CustomResourceProvider implements ResourceProvider {
8+
9+
@Override
10+
public Resource createResource(ConfigProperties config) {
11+
// Callback invoked to contribute to the resource.
12+
return Resource.builder().put("my.custom.resource.attribute", "abc123").build();
13+
}
14+
15+
@Override
16+
public int order() {
17+
// Optionally influence the order of invocation.
18+
return 0;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package otel;
2+
3+
import io.opentelemetry.api.common.Attributes;
4+
import io.opentelemetry.api.trace.SpanKind;
5+
import io.opentelemetry.context.Context;
6+
import io.opentelemetry.sdk.trace.data.LinkData;
7+
import io.opentelemetry.sdk.trace.samplers.Sampler;
8+
import io.opentelemetry.sdk.trace.samplers.SamplingResult;
9+
import java.util.List;
10+
11+
public class CustomSampler implements Sampler {
12+
@Override
13+
public SamplingResult shouldSample(
14+
Context parentContext,
15+
String traceId,
16+
String name,
17+
SpanKind spanKind,
18+
Attributes attributes,
19+
List<LinkData> parentLinks) {
20+
// Callback invoked when span is started, before any SpanProcessor is called.
21+
// If the SamplingDecision is:
22+
// - DROP: the span is dropped. A valid span context is created and SpanProcessor#onStart is
23+
// still called, but no data is recorded and SpanProcessor#onEnd is not called.
24+
// - RECORD_ONLY: the span is recorded but not sampled. Data is recorded to the span,
25+
// SpanProcessor#onStart and SpanProcessor#onEnd are called, but the span's sampled status
26+
// indicates it should not be exported out of process.
27+
// - RECORD_AND_SAMPLE: the span is recorded and sampled. Data is recorded to the span,
28+
// SpanProcessor#onStart and SpanProcessor#onEnd are called, and the span's sampled status
29+
// indicates it should be exported out of process.
30+
return SpanKind.SERVER == spanKind ? SamplingResult.recordAndSample() : SamplingResult.drop();
31+
}
32+
33+
@Override
34+
public String getDescription() {
35+
// Return a description of the sampler.
36+
return this.getClass().getSimpleName();
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package otel;
2+
3+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
4+
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider;
5+
import io.opentelemetry.sdk.trace.samplers.Sampler;
6+
7+
public class CustomSamplerProvider implements ConfigurableSamplerProvider {
8+
9+
@Override
10+
public Sampler createSampler(ConfigProperties config) {
11+
// Callback invoked when OTEL_TRACES_SAMPLER is set to the value from getName().
12+
return new CustomSampler();
13+
}
14+
15+
@Override
16+
public String getName() {
17+
return "custom-sampler";
18+
}
19+
}

0 commit comments

Comments
 (0)