-
Notifications
You must be signed in to change notification settings - Fork 775
/
OpenTelemetrySdk.java
158 lines (134 loc) · 4.77 KB
/
OpenTelemetrySdk.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.metrics.MeterBuilder;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.TracerBuilder;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import javax.annotation.concurrent.ThreadSafe;
/** The SDK implementation of {@link OpenTelemetry}. */
@ThreadSafe
public final class OpenTelemetrySdk implements OpenTelemetry {
private final ObfuscatedTracerProvider tracerProvider;
private final ObfuscatedMeterProvider meterProvider;
private final SdkLoggerProvider loggerProvider;
private final ContextPropagators propagators;
OpenTelemetrySdk(
SdkTracerProvider tracerProvider,
SdkMeterProvider meterProvider,
SdkLoggerProvider loggerProvider,
ContextPropagators propagators) {
this.tracerProvider = new ObfuscatedTracerProvider(tracerProvider);
this.meterProvider = new ObfuscatedMeterProvider(meterProvider);
this.loggerProvider = loggerProvider;
this.propagators = propagators;
}
/**
* Returns a new {@link OpenTelemetrySdkBuilder} for configuring an instance of {@linkplain
* OpenTelemetrySdk the OpenTelemetry SDK}.
*/
public static OpenTelemetrySdkBuilder builder() {
return new OpenTelemetrySdkBuilder();
}
@Override
public TracerProvider getTracerProvider() {
return tracerProvider;
}
/** Returns the {@link SdkTracerProvider} for this {@link OpenTelemetrySdk}. */
public SdkTracerProvider getSdkTracerProvider() {
return tracerProvider.unobfuscate();
}
@Override
public MeterProvider getMeterProvider() {
return meterProvider;
}
/** Returns the {@link SdkMeterProvider} for this {@link OpenTelemetrySdk}. */
public SdkMeterProvider getSdkMeterProvider() {
return meterProvider.unobfuscate();
}
/**
* Returns the {@link SdkLoggerProvider} for this {@link OpenTelemetrySdk}.
*
* @since 1.19.0
*/
public SdkLoggerProvider getSdkLoggerProvider() {
return loggerProvider;
}
@Override
public ContextPropagators getPropagators() {
return propagators;
}
@Override
public String toString() {
return "OpenTelemetrySdk{"
+ "tracerProvider="
+ tracerProvider.unobfuscate()
+ ", meterProvider="
+ meterProvider.unobfuscate()
+ ", loggerProvider="
+ loggerProvider
+ ", propagators="
+ propagators
+ "}";
}
/**
* This class allows the SDK to unobfuscate an obfuscated static global provider.
*
* <p>Static global providers are obfuscated when they are returned from the API to prevent users
* from casting them to their SDK specific implementation. For example, we do not want users to
* use patterns like {@code (SdkTracerProvider) openTelemetry.getTracerProvider()}.
*/
@ThreadSafe
// Visible for testing
static class ObfuscatedTracerProvider implements TracerProvider {
private final SdkTracerProvider delegate;
ObfuscatedTracerProvider(SdkTracerProvider delegate) {
this.delegate = delegate;
}
@Override
public Tracer get(String instrumentationScopeName) {
return delegate.get(instrumentationScopeName);
}
@Override
public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) {
return delegate.get(instrumentationScopeName, instrumentationScopeVersion);
}
@Override
public TracerBuilder tracerBuilder(String instrumentationScopeName) {
return delegate.tracerBuilder(instrumentationScopeName);
}
public SdkTracerProvider unobfuscate() {
return delegate;
}
}
/**
* This class allows the SDK to unobfuscate an obfuscated static global provider.
*
* <p>Static global providers are obfuscated when they are returned from the API to prevent users
* from casting them to their SDK specific implementation. For example, we do not want users to
* use patterns like {@code (SdkMeterProvider) openTelemetry.getMeterProvider()}.
*/
@ThreadSafe
// Visible for testing
static class ObfuscatedMeterProvider implements MeterProvider {
private final SdkMeterProvider delegate;
ObfuscatedMeterProvider(SdkMeterProvider delegate) {
this.delegate = delegate;
}
@Override
public MeterBuilder meterBuilder(String instrumentationScopeName) {
return delegate.meterBuilder(instrumentationScopeName);
}
public SdkMeterProvider unobfuscate() {
return delegate;
}
}
}