Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
4bb3e56
Add implementation for new exporter health metrics
JonasKunz Apr 9, 2025
dd651c3
Use new implementation in GRPC exporters
JonasKunz Apr 9, 2025
20959d8
Use new implementation in HTTP exporters
JonasKunz Apr 10, 2025
4bafbfa
Use new implementation in zipkin exporter
JonasKunz Apr 10, 2025
67fe9ec
Merge remote-tracking branch 'otel/main' into health-metrics
JonasKunz Apr 10, 2025
073ecee
add javadoc since tags
JonasKunz Apr 10, 2025
ba07867
spotless
JonasKunz Apr 10, 2025
5281d9a
Fix javadoc and style issues
JonasKunz Apr 10, 2025
e560424
Added test for HTTP Exporter
JonasKunz Apr 10, 2025
2f29ac2
Implemented duration metric
JonasKunz Apr 10, 2025
a2a78f7
spotless
JonasKunz Apr 10, 2025
0bfa4f4
Added GRPC test
JonasKunz Apr 11, 2025
149ffbd
Added server.* attributes
JonasKunz Apr 11, 2025
22ba608
Added tests for server.* attribute extraction
JonasKunz Apr 16, 2025
8522179
Adjust metric names to now merged semconv PR
JonasKunz Apr 17, 2025
d4afdc9
Merge remote-tracking branch 'otel/HEAD' into health-metrics
JonasKunz Apr 17, 2025
9adacd0
spotless
JonasKunz Apr 17, 2025
676b66c
Implement status code attributes
JonasKunz Apr 17, 2025
6d5bf61
Merge remote-tracking branch 'otel/main' into health-metrics
JonasKunz Apr 28, 2025
ec686d3
Renames
JonasKunz May 5, 2025
ad69fa5
Introduce interface as abstraction
JonasKunz May 5, 2025
a1cd746
Complete renaming of "HealthMetricLevel"
JonasKunz May 5, 2025
48b6320
Remove since tags
JonasKunz May 6, 2025
32943e1
Add tests for semconv attributes
JonasKunz May 6, 2025
d2db75d
Move standard component types to enum
JonasKunz May 6, 2025
5f94bb5
spotless
JonasKunz May 6, 2025
5b71238
Fix compilation
JonasKunz May 6, 2025
ba4dc7e
Merge remote-tracking branch 'otel/main' into health-metrics
JonasKunz May 6, 2025
bd6e410
Fix checks
JonasKunz May 6, 2025
7720b8d
Style fixes
JonasKunz May 6, 2025
68967e7
Move attribute references to instrumentation api
JonasKunz May 6, 2025
1b4948b
Fix tests
JonasKunz May 6, 2025
02aafc1
Fix http sender tests
JonasKunz May 6, 2025
923506e
Add E2E exporter tests
JonasKunz May 7, 2025
7360b62
Merge remote-tracking branch 'otel/HEAD' into health-metrics
JonasKunz May 7, 2025
05d1fba
Self-review fixes
JonasKunz May 7, 2025
e84ea68
Move ServerAttributesUtil call down
JonasKunz May 20, 2025
b919c7e
Remove StandardType interface
JonasKunz May 20, 2025
34cd9ec
Move Signal to upper level
JonasKunz May 20, 2025
374d214
Move namespace and unit to signal enum
JonasKunz May 20, 2025
a5f3178
Move signal to standalone enum
JonasKunz May 20, 2025
7fbf2db
Inline unnecessary ComponentId.put method
JonasKunz May 20, 2025
66cd86e
Add StandardComponentId to not have to pass the type around separately
JonasKunz May 20, 2025
4202870
Merge remote-tracking branch 'otel/main' into health-metrics
JonasKunz May 20, 2025
c5051ed
Rename InternalTelemetrySchemaVersion and its setters
JonasKunz May 20, 2025
1b037a5
Remove DISABLED telemetry schema version
JonasKunz May 20, 2025
3a89f42
Rename and move standard exporter types
JonasKunz May 20, 2025
aa96250
Exclude profiles exporter from metrics
JonasKunz May 20, 2025
b472345
apidiff
JonasKunz May 20, 2025
7d9b16e
fix japicmp
JonasKunz May 20, 2025
51edc50
Update exporters/common/src/test/java/io/opentelemetry/exporter/inter…
JonasKunz May 28, 2025
8ff0381
Update exporters/common/src/test/java/io/opentelemetry/exporter/inter…
JonasKunz May 28, 2025
a52d607
Review fixes
JonasKunz May 28, 2025
165f9a6
Merge remote-tracking branch 'otel/main' into health-metrics
JonasKunz May 28, 2025
03496e8
Use assum to early-out of test
JonasKunz May 28, 2025
b53cbe9
remove Signal.toString
JonasKunz May 30, 2025
6350dff
remove StandardComponentId.toString
JonasKunz May 30, 2025
e307e60
Remove InternalTelemetryVersion.V1_33
JonasKunz May 30, 2025
00b4f2f
spotless
JonasKunz May 30, 2025
8e89011
japicmp
jack-berg Jun 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
Comparing source compatibility of opentelemetry-exporter-otlp-1.51.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.50.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
Comparing source compatibility of opentelemetry-exporter-zipkin-1.51.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.50.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
11 changes: 10 additions & 1 deletion docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
Comparing source compatibility of opentelemetry-sdk-common-1.51.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.50.0.jar
No changes.
+++ NEW ENUM: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion (compatible)
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+++ NEW INTERFACE: java.lang.constant.Constable
+++ NEW INTERFACE: java.lang.Comparable
+++ NEW INTERFACE: java.io.Serializable
+++ NEW SUPERCLASS: java.lang.Enum
+++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion LEGACY
+++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.InternalTelemetryVersion LATEST
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.InternalTelemetryVersion valueOf(java.lang.String)
+++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.InternalTelemetryVersion[] values()
1 change: 1 addition & 0 deletions exporters/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ dependencies {
compileOnly("io.grpc:grpc-stub")

testImplementation(project(":sdk:common"))
testImplementation(project(":sdk:testing"))

testImplementation("com.google.protobuf:protobuf-java-util")
testImplementation("com.linecorp.armeria:armeria-junit5")
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
import static io.opentelemetry.exporter.internal.grpc.GrpcExporterUtil.GRPC_STATUS_UNIMPLEMENTED;

import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.exporter.internal.ExporterMetrics;
import io.opentelemetry.exporter.internal.FailedExportException;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.metrics.ExporterInstrumentation;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
import io.opentelemetry.sdk.internal.StandardComponentId;
import io.opentelemetry.sdk.internal.ThrottlingLogger;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
Expand All @@ -38,45 +40,54 @@ public final class GrpcExporter<T extends Marshaler> {

private final String type;
private final GrpcSender<T> grpcSender;
private final ExporterMetrics exporterMetrics;
private final ExporterInstrumentation exporterMetrics;

public GrpcExporter(
String exporterName,
String type,
GrpcSender<T> grpcSender,
Supplier<MeterProvider> meterProviderSupplier) {
this.type = type;
InternalTelemetryVersion internalTelemetryVersion,
StandardComponentId componentId,
Supplier<MeterProvider> meterProviderSupplier,
String endpoint) {
this.type = componentId.getStandardType().signal().logFriendlyName();
this.grpcSender = grpcSender;
this.exporterMetrics = ExporterMetrics.createGrpc(exporterName, type, meterProviderSupplier);
this.exporterMetrics =
new ExporterInstrumentation(
internalTelemetryVersion, meterProviderSupplier, componentId, endpoint);
}

public CompletableResultCode export(T exportRequest, int numItems) {
if (isShutdown.get()) {
return CompletableResultCode.ofFailure();
}

exporterMetrics.addSeen(numItems);
ExporterInstrumentation.Recording metricRecording =
exporterMetrics.startRecordingExport(numItems);

CompletableResultCode result = new CompletableResultCode();

grpcSender.send(
exportRequest,
grpcResponse -> onResponse(result, numItems, grpcResponse),
throwable -> onError(result, numItems, throwable));
grpcResponse -> onResponse(result, metricRecording, grpcResponse),
throwable -> onError(result, metricRecording, throwable));

return result;
}

private void onResponse(CompletableResultCode result, int numItems, GrpcResponse grpcResponse) {
private void onResponse(
CompletableResultCode result,
ExporterInstrumentation.Recording metricRecording,
GrpcResponse grpcResponse) {
int statusCode = grpcResponse.grpcStatusValue();

metricRecording.setGrpcStatusCode(statusCode);

if (statusCode == 0) {
exporterMetrics.addSuccess(numItems);
metricRecording.finishSuccessful();
result.succeed();
return;
}

exporterMetrics.addFailed(numItems);
metricRecording.finishFailed(String.valueOf(statusCode));
switch (statusCode) {
case GRPC_STATUS_UNIMPLEMENTED:
if (loggedUnimplemented.compareAndSet(false, true)) {
Expand Down Expand Up @@ -108,8 +119,11 @@ private void onResponse(CompletableResultCode result, int numItems, GrpcResponse
result.failExceptionally(FailedExportException.grpcFailedWithResponse(grpcResponse));
}

private void onError(CompletableResultCode result, int numItems, Throwable e) {
exporterMetrics.addFailed(numItems);
private void onError(
CompletableResultCode result,
ExporterInstrumentation.Recording metricRecording,
Throwable e) {
metricRecording.finishFailed(e);
logger.log(
Level.SEVERE,
"Failed to export "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
import io.opentelemetry.exporter.internal.TlsConfigHelper;
import io.opentelemetry.exporter.internal.compression.Compressor;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.sdk.common.InternalTelemetryVersion;
import io.opentelemetry.sdk.common.export.RetryPolicy;
import io.opentelemetry.sdk.internal.ComponentId;
import io.opentelemetry.sdk.internal.StandardComponentId;
import java.net.URI;
import java.time.Duration;
import java.util.ArrayList;
Expand Down Expand Up @@ -48,8 +51,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {

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

private final String exporterName;
private final String type;
private final StandardComponentId.ExporterType exporterType;
private final String grpcEndpointPath;
private final Supplier<BiFunction<Channel, String, MarshalerServiceStub<T, ?, ?>>>
grpcStubFactory;
Expand All @@ -63,21 +65,21 @@ public class GrpcExporterBuilder<T extends Marshaler> {
private TlsConfigHelper tlsConfigHelper = new TlsConfigHelper();
@Nullable private RetryPolicy retryPolicy = RetryPolicy.getDefault();
private Supplier<MeterProvider> meterProviderSupplier = GlobalOpenTelemetry::getMeterProvider;
private InternalTelemetryVersion internalTelemetryVersion = InternalTelemetryVersion.LEGACY;

private ClassLoader serviceClassLoader = GrpcExporterBuilder.class.getClassLoader();
@Nullable private ExecutorService executorService;

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

public GrpcExporterBuilder(
String exporterName,
String type,
StandardComponentId.ExporterType exporterType,
long defaultTimeoutSecs,
URI defaultEndpoint,
Supplier<BiFunction<Channel, String, MarshalerServiceStub<T, ?, ?>>> grpcStubFactory,
String grpcEndpointPath) {
this.exporterName = exporterName;
this.type = type;
this.exporterType = exporterType;
this.grpcEndpointPath = grpcEndpointPath;
timeoutNanos = TimeUnit.SECONDS.toNanos(defaultTimeoutSecs);
endpoint = defaultEndpoint;
Expand Down Expand Up @@ -150,6 +152,12 @@ public GrpcExporterBuilder<T> setMeterProvider(Supplier<MeterProvider> meterProv
return this;
}

public GrpcExporterBuilder<T> setInternalTelemetryVersion(
InternalTelemetryVersion internalTelemetryVersion) {
this.internalTelemetryVersion = internalTelemetryVersion;
return this;
}

public GrpcExporterBuilder<T> setServiceClassLoader(ClassLoader servieClassLoader) {
this.serviceClassLoader = servieClassLoader;
return this;
Expand All @@ -164,8 +172,7 @@ public GrpcExporterBuilder<T> setExecutorService(ExecutorService executorService
public GrpcExporterBuilder<T> copy() {
GrpcExporterBuilder<T> copy =
new GrpcExporterBuilder<>(
exporterName,
type,
exporterType,
TimeUnit.NANOSECONDS.toSeconds(timeoutNanos),
endpoint,
grpcStubFactory,
Expand All @@ -182,6 +189,7 @@ public GrpcExporterBuilder<T> copy() {
copy.retryPolicy = retryPolicy.toBuilder().build();
}
copy.meterProviderSupplier = meterProviderSupplier;
copy.internalTelemetryVersion = internalTelemetryVersion;
copy.grpcChannel = grpcChannel;
return copy;
}
Expand Down Expand Up @@ -227,16 +235,19 @@ public GrpcExporter<T> build() {
executorService));
LOGGER.log(Level.FINE, "Using GrpcSender: " + grpcSender.getClass().getName());

return new GrpcExporter<>(exporterName, type, grpcSender, meterProviderSupplier);
return new GrpcExporter<>(
grpcSender,
internalTelemetryVersion,
ComponentId.generateLazy(exporterType),
meterProviderSupplier,
endpoint.toString());
}

public String toString(boolean includePrefixAndSuffix) {
StringJoiner joiner =
includePrefixAndSuffix
? new StringJoiner(", ", "GrpcExporterBuilder{", "}")
: new StringJoiner(", ");
joiner.add("exporterName=" + exporterName);
joiner.add("type=" + type);
joiner.add("endpoint=" + endpoint.toString());
joiner.add("endpointPath=" + grpcEndpointPath);
joiner.add("timeoutNanos=" + timeoutNanos);
Expand All @@ -261,6 +272,8 @@ public String toString(boolean includePrefixAndSuffix) {
if (executorService != null) {
joiner.add("executorService=" + executorService);
}
joiner.add("exporterType=" + exporterType.toString());
joiner.add("internalTelemetrySchemaVersion=" + internalTelemetryVersion);
// Note: omit tlsConfigHelper because we can't log the configuration in any readable way
// Note: omit meterProviderSupplier because we can't log the configuration in any readable way
return joiner.toString();
Expand Down
Loading
Loading