Skip to content

Commit f720735

Browse files
JonasKunzjack-berg
andauthored
Implement new SemConv exporter health metrics (#7265)
Co-authored-by: jack-berg <[email protected]> Co-authored-by: Jack Berg <[email protected]>
1 parent 2c762e0 commit f720735

File tree

51 files changed

+2222
-338
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2222
-338
lines changed
Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,19 @@
11
Comparing source compatibility of opentelemetry-exporter-otlp-1.51.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.50.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
5+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable)
6+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
7+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
8+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable)
9+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
10+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
11+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable)
12+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
13+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
14+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable)
15+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
16+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
17+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable)
18+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
19+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
Comparing source compatibility of opentelemetry-exporter-zipkin-1.51.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.50.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
Comparing source compatibility of opentelemetry-sdk-common-1.51.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.50.0.jar
2-
No changes.
2+
+++ NEW ENUM: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion (compatible)
3+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
4+
+++ NEW INTERFACE: java.lang.constant.Constable
5+
+++ NEW INTERFACE: java.lang.Comparable
6+
+++ NEW INTERFACE: java.io.Serializable
7+
+++ NEW SUPERCLASS: java.lang.Enum
8+
+++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion LEGACY
9+
+++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion LATEST
10+
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.InternalTelemetryVersion valueOf(java.lang.String)
11+
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.InternalTelemetryVersion[] values()

exporters/common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
compileOnly("io.grpc:grpc-stub")
3030

3131
testImplementation(project(":sdk:common"))
32+
testImplementation(project(":sdk:testing"))
3233

3334
testImplementation("com.google.protobuf:protobuf-java-util")
3435
testImplementation("com.linecorp.armeria:armeria-junit5")

exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterMetrics.java

Lines changed: 0 additions & 138 deletions
This file was deleted.

exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/GrpcExporter.java

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import static io.opentelemetry.exporter.internal.grpc.GrpcExporterUtil.GRPC_STATUS_UNIMPLEMENTED;
1010

1111
import io.opentelemetry.api.metrics.MeterProvider;
12-
import io.opentelemetry.exporter.internal.ExporterMetrics;
1312
import io.opentelemetry.exporter.internal.FailedExportException;
1413
import io.opentelemetry.exporter.internal.marshal.Marshaler;
14+
import io.opentelemetry.exporter.internal.metrics.ExporterInstrumentation;
1515
import io.opentelemetry.sdk.common.CompletableResultCode;
16+
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
17+
import io.opentelemetry.sdk.internal.StandardComponentId;
1618
import io.opentelemetry.sdk.internal.ThrottlingLogger;
1719
import java.util.concurrent.atomic.AtomicBoolean;
1820
import java.util.function.Supplier;
@@ -38,45 +40,54 @@ public final class GrpcExporter<T extends Marshaler> {
3840

3941
private final String type;
4042
private final GrpcSender<T> grpcSender;
41-
private final ExporterMetrics exporterMetrics;
43+
private final ExporterInstrumentation exporterMetrics;
4244

4345
public GrpcExporter(
44-
String exporterName,
45-
String type,
4646
GrpcSender<T> grpcSender,
47-
Supplier<MeterProvider> meterProviderSupplier) {
48-
this.type = type;
47+
InternalTelemetryVersion internalTelemetryVersion,
48+
StandardComponentId componentId,
49+
Supplier<MeterProvider> meterProviderSupplier,
50+
String endpoint) {
51+
this.type = componentId.getStandardType().signal().logFriendlyName();
4952
this.grpcSender = grpcSender;
50-
this.exporterMetrics = ExporterMetrics.createGrpc(exporterName, type, meterProviderSupplier);
53+
this.exporterMetrics =
54+
new ExporterInstrumentation(
55+
internalTelemetryVersion, meterProviderSupplier, componentId, endpoint);
5156
}
5257

5358
public CompletableResultCode export(T exportRequest, int numItems) {
5459
if (isShutdown.get()) {
5560
return CompletableResultCode.ofFailure();
5661
}
5762

58-
exporterMetrics.addSeen(numItems);
63+
ExporterInstrumentation.Recording metricRecording =
64+
exporterMetrics.startRecordingExport(numItems);
5965

6066
CompletableResultCode result = new CompletableResultCode();
6167

6268
grpcSender.send(
6369
exportRequest,
64-
grpcResponse -> onResponse(result, numItems, grpcResponse),
65-
throwable -> onError(result, numItems, throwable));
70+
grpcResponse -> onResponse(result, metricRecording, grpcResponse),
71+
throwable -> onError(result, metricRecording, throwable));
6672

6773
return result;
6874
}
6975

70-
private void onResponse(CompletableResultCode result, int numItems, GrpcResponse grpcResponse) {
76+
private void onResponse(
77+
CompletableResultCode result,
78+
ExporterInstrumentation.Recording metricRecording,
79+
GrpcResponse grpcResponse) {
7180
int statusCode = grpcResponse.grpcStatusValue();
7281

82+
metricRecording.setGrpcStatusCode(statusCode);
83+
7384
if (statusCode == 0) {
74-
exporterMetrics.addSuccess(numItems);
85+
metricRecording.finishSuccessful();
7586
result.succeed();
7687
return;
7788
}
7889

79-
exporterMetrics.addFailed(numItems);
90+
metricRecording.finishFailed(String.valueOf(statusCode));
8091
switch (statusCode) {
8192
case GRPC_STATUS_UNIMPLEMENTED:
8293
if (loggedUnimplemented.compareAndSet(false, true)) {
@@ -108,8 +119,11 @@ private void onResponse(CompletableResultCode result, int numItems, GrpcResponse
108119
result.failExceptionally(FailedExportException.grpcFailedWithResponse(grpcResponse));
109120
}
110121

111-
private void onError(CompletableResultCode result, int numItems, Throwable e) {
112-
exporterMetrics.addFailed(numItems);
122+
private void onError(
123+
CompletableResultCode result,
124+
ExporterInstrumentation.Recording metricRecording,
125+
Throwable e) {
126+
metricRecording.finishFailed(e);
113127
logger.log(
114128
Level.SEVERE,
115129
"Failed to export "

exporters/common/src/main/java/io/opentelemetry/exporter/internal/grpc/GrpcExporterBuilder.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
import io.opentelemetry.exporter.internal.TlsConfigHelper;
1515
import io.opentelemetry.exporter.internal.compression.Compressor;
1616
import io.opentelemetry.exporter.internal.marshal.Marshaler;
17+
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
1718
import io.opentelemetry.sdk.common.export.RetryPolicy;
19+
import io.opentelemetry.sdk.internal.ComponentId;
20+
import io.opentelemetry.sdk.internal.StandardComponentId;
1821
import java.net.URI;
1922
import java.time.Duration;
2023
import java.util.ArrayList;
@@ -48,8 +51,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
4851

4952
private static final Logger LOGGER = Logger.getLogger(GrpcExporterBuilder.class.getName());
5053

51-
private final String exporterName;
52-
private final String type;
54+
private final StandardComponentId.ExporterType exporterType;
5355
private final String grpcEndpointPath;
5456
private final Supplier<BiFunction<Channel, String, MarshalerServiceStub<T, ?, ?>>>
5557
grpcStubFactory;
@@ -63,21 +65,21 @@ public class GrpcExporterBuilder<T extends Marshaler> {
6365
private TlsConfigHelper tlsConfigHelper = new TlsConfigHelper();
6466
@Nullable private RetryPolicy retryPolicy = RetryPolicy.getDefault();
6567
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
68+
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;
69+
6670
private ClassLoader serviceClassLoader = GrpcExporterBuilder.class.getClassLoader();
6771
@Nullable private ExecutorService executorService;
6872

6973
// Use Object type since gRPC may not be on the classpath.
7074
@Nullable private Object grpcChannel;
7175

7276
public GrpcExporterBuilder(
73-
String exporterName,
74-
String type,
77+
StandardComponentId.ExporterType exporterType,
7578
long defaultTimeoutSecs,
7679
URI defaultEndpoint,
7780
Supplier<BiFunction<Channel, String, MarshalerServiceStub<T, ?, ?>>> grpcStubFactory,
7881
String grpcEndpointPath) {
79-
this.exporterName = exporterName;
80-
this.type = type;
82+
this.exporterType = exporterType;
8183
this.grpcEndpointPath = grpcEndpointPath;
8284
timeoutNanos = TimeUnit.SECONDS.toNanos(defaultTimeoutSecs);
8385
endpoint = defaultEndpoint;
@@ -150,6 +152,12 @@ public GrpcExporterBuilder<T> setMeterProvider(Supplier<MeterProvider> meterProv
150152
return this;
151153
}
152154

155+
public GrpcExporterBuilder<T> setInternalTelemetryVersion(
156+
InternalTelemetryVersion internalTelemetryVersion) {
157+
this.internalTelemetryVersion = internalTelemetryVersion;
158+
return this;
159+
}
160+
153161
public GrpcExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
154162
this.serviceClassLoader = servieClassLoader;
155163
return this;
@@ -164,8 +172,7 @@ public GrpcExporterBuilder<T> setExecutorService(ExecutorService executorService
164172
public GrpcExporterBuilder<T> copy() {
165173
GrpcExporterBuilder<T> copy =
166174
new GrpcExporterBuilder<>(
167-
exporterName,
168-
type,
175+
exporterType,
169176
TimeUnit.NANOSECONDS.toSeconds(timeoutNanos),
170177
endpoint,
171178
grpcStubFactory,
@@ -182,6 +189,7 @@ public GrpcExporterBuilder<T> copy() {
182189
copy.retryPolicy = retryPolicy.toBuilder().build();
183190
}
184191
copy.meterProviderSupplier = meterProviderSupplier;
192+
copy.internalTelemetryVersion = internalTelemetryVersion;
185193
copy.grpcChannel = grpcChannel;
186194
return copy;
187195
}
@@ -227,16 +235,19 @@ public GrpcExporter<T> build() {
227235
executorService));
228236
LOGGER.log(Level.FINE, "Using GrpcSender: " + grpcSender.getClass().getName());
229237

230-
return new GrpcExporter<>(exporterName, type, grpcSender, meterProviderSupplier);
238+
return new GrpcExporter<>(
239+
grpcSender,
240+
internalTelemetryVersion,
241+
ComponentId.generateLazy(exporterType),
242+
meterProviderSupplier,
243+
endpoint.toString());
231244
}
232245

233246
public String toString(boolean includePrefixAndSuffix) {
234247
StringJoiner joiner =
235248
includePrefixAndSuffix
236249
? new StringJoiner(", ", "GrpcExporterBuilder{", "}")
237250
: new StringJoiner(", ");
238-
joiner.add("exporterName=" + exporterName);
239-
joiner.add("type=" + type);
240251
joiner.add("endpoint=" + endpoint.toString());
241252
joiner.add("endpointPath=" + grpcEndpointPath);
242253
joiner.add("timeoutNanos=" + timeoutNanos);
@@ -261,6 +272,8 @@ public String toString(boolean includePrefixAndSuffix) {
261272
if (executorService != null) {
262273
joiner.add("executorService=" + executorService);
263274
}
275+
joiner.add("exporterType=" + exporterType.toString());
276+
joiner.add("internalTelemetrySchemaVersion=" + internalTelemetryVersion);
264277
// Note: omit tlsConfigHelper because we can't log the configuration in any readable way
265278
// Note: omit meterProviderSupplier because we can't log the configuration in any readable way
266279
return joiner.toString();

0 commit comments

Comments
 (0)