From b9544744370fdfbfede7acbab9c9fe1e92af7065 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Fri, 14 Jun 2024 15:40:21 +0800 Subject: [PATCH 01/13] support pulsar messaging.publish.duration semantic --- .../build.gradle.kts | 1 + .../messaging/MessagingMetricsAdvice.java | 39 ++++++ .../messaging/MessagingProducerMetrics.java | 79 ++++++++++++ .../MessagingProducerMetricsTest.java | 119 ++++++++++++++++++ .../v2_8/telemetry/PulsarSingletons.java | 4 +- 5 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java create mode 100644 instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java create mode 100644 instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java diff --git a/instrumentation-api-incubator/build.gradle.kts b/instrumentation-api-incubator/build.gradle.kts index 6acb75e5f79d..f901051e5438 100644 --- a/instrumentation-api-incubator/build.gradle.kts +++ b/instrumentation-api-incubator/build.gradle.kts @@ -12,6 +12,7 @@ group = "io.opentelemetry.instrumentation" dependencies { api("io.opentelemetry.semconv:opentelemetry-semconv") + api("io.opentelemetry.semconv:opentelemetry-semconv-incubating") api(project(":instrumentation-api")) implementation("io.opentelemetry:opentelemetry-api-incubator") diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java new file mode 100644 index 000000000000..01d266d4670b --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.semconv.messaging; + +import static java.util.Arrays.asList; +import static java.util.Collections.unmodifiableList; + +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder; +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.semconv.ErrorAttributes; +import io.opentelemetry.semconv.ServerAttributes; +import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; +import java.util.List; + +public class MessagingMetricsAdvice { + static final List DURATION_SECONDS_BUCKETS = + unmodifiableList( + asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); + + static void applyPublishDurationAdvice(DoubleHistogramBuilder builder) { + if (!(builder instanceof ExtendedDoubleHistogramBuilder)) { + return; + } + ((ExtendedDoubleHistogramBuilder) builder) + .setAttributesAdvice( + asList( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + MessagingIncubatingAttributes.MESSAGING_OPERATION, + MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, + ErrorAttributes.ERROR_TYPE, + ServerAttributes.SERVER_PORT, + ServerAttributes.SERVER_ADDRESS)); + } + private MessagingMetricsAdvice() {} +} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java new file mode 100644 index 000000000000..8dda57a4203b --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -0,0 +1,79 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.semconv.messaging; + +import static java.util.logging.Level.FINE; + +import com.google.auto.value.AutoValue; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.ContextKey; +import io.opentelemetry.instrumentation.api.instrumenter.OperationListener; +import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics; +import io.opentelemetry.instrumentation.api.internal.OperationMetricsUtil; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +public class MessagingProducerMetrics implements OperationListener { + private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1); + + private static final ContextKey PULSAR_PUBLISH_METRICS_STATE = + ContextKey.named("pulsar-producer-metrics-state"); + private static final Logger logger = Logger.getLogger(MessagingProducerMetrics.class.getName()); + + + private final DoubleHistogram publishDurationHistogram; + private MessagingProducerMetrics(Meter meter) { + DoubleHistogramBuilder durationBuilder = + meter + .histogramBuilder("messaging.publish.duration") + .setDescription("Measures the duration of publish operation.") + .setExplicitBucketBoundariesAdvice(MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS) + .setUnit("s"); + MessagingMetricsAdvice.applyPublishDurationAdvice(durationBuilder); + publishDurationHistogram = durationBuilder.build(); + } + + public static OperationMetrics get() { + return OperationMetricsUtil.create("messaging produce", MessagingProducerMetrics::new); + } + + @Override + @CanIgnoreReturnValue + public Context onStart(Context context, Attributes startAttributes, long startNanos) { + return context.with( + PULSAR_PUBLISH_METRICS_STATE, + new AutoValue_MessagingProducerMetrics_State(startAttributes, startNanos)); + } + + @Override + public void onEnd(Context context, Attributes endAttributes, long endNanos) { + MessagingProducerMetrics.State state = context.get(PULSAR_PUBLISH_METRICS_STATE); + if (state == null) { + logger.log( + FINE, + "No state present when ending context {0}. Cannot record pulsar publish metrics.", + context); + return; + } + + Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build(); + + publishDurationHistogram.record((endNanos - state.startTimeNanos()) / NANOS_PER_S, attributes, context); + } + + @AutoValue + abstract static class State { + + abstract Attributes startAttributes(); + + abstract long startTimeNanos(); + } +} diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java new file mode 100644 index 000000000000..ea41e02e0870 --- /dev/null +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -0,0 +1,119 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.semconv.messaging; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.OperationListener; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; +import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; +import io.opentelemetry.semconv.ServerAttributes; +import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.Test; + +public class MessagingProducerMetricsTest { + + static final double[] DURATION_BUCKETS = + MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); + + @Test + void collectsMetrics() { + InMemoryMetricReader metricReader = InMemoryMetricReader.create(); + SdkMeterProvider meterProvider = + SdkMeterProvider.builder().registerMetricReader(metricReader).build(); + + OperationListener listener = MessagingProducerMetrics.get().create(meterProvider.get("test")); + + Attributes requestAttributes = + Attributes.builder() + .put(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "pulsar") + .put(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + "persistent://public/default/topic") + .put(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish") + .put(ServerAttributes.SERVER_PORT, 6650) + .put(ServerAttributes.SERVER_ADDRESS, "localhost") + .build(); + + Attributes responseAttributes = + Attributes.builder() + .put(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, "1:1:0:0") + .put(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 2) + .build(); + + Context parent = + Context.root() + .with( + Span.wrap( + SpanContext.create( + "ff01020304050600ff0a0b0c0d0e0f00", + "090a0b0c0d0e0f00", + TraceFlags.getSampled(), + TraceState.getDefault()))); + + Context context1 = listener.onStart(parent, requestAttributes, nanos(100)); + + assertThat(metricReader.collectAllMetrics()).isEmpty(); + + Context context2 = listener.onStart(Context.root(), requestAttributes, nanos(150)); + + assertThat(metricReader.collectAllMetrics()).isEmpty(); + + listener.onEnd(context1, responseAttributes, nanos(250)); + + assertThat(metricReader.collectAllMetrics()) + .satisfiesExactlyInAnyOrder( + metric -> + OpenTelemetryAssertions.assertThat(metric) + .hasName("messaging.publish.duration") + .hasUnit("s") + .hasDescription("Measures the duration of publish operation.") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point + .hasSum(0.15 /* seconds */) + .hasAttributesSatisfying( + equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, + "pulsar"), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + "persistent://public/default/topic"), + equalTo(ServerAttributes.SERVER_PORT, 6650), + equalTo(ServerAttributes.SERVER_ADDRESS, "localhost")) + .hasExemplarsSatisfying( + exemplar -> + exemplar + .hasTraceId("ff01020304050600ff0a0b0c0d0e0f00") + .hasSpanId("090a0b0c0d0e0f00")) + .hasBucketBoundaries(DURATION_BUCKETS)))); + + listener.onEnd(context2, responseAttributes, nanos(300)); + + assertThat(metricReader.collectAllMetrics()) + .satisfiesExactlyInAnyOrder( + metric -> + OpenTelemetryAssertions.assertThat(metric) + .hasName("messaging.publish.duration") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> point.hasSum(0.3 /* seconds */)))); + } + + private static long nanos(int millis) { + return TimeUnit.MILLISECONDS.toNanos(millis); + } +} diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java index 498c075f68d6..0b15cf51f025 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesGetter; +import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingProducerMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -136,7 +137,8 @@ private static Instrumenter createProducerInstrumenter() { .addAttributesExtractor( createMessagingAttributesExtractor(getter, MessageOperation.PUBLISH)) .addAttributesExtractor( - ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())); + ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())) + .addOperationMetrics(MessagingProducerMetrics.get()); if (InstrumentationConfig.get() .getBoolean("otel.instrumentation.pulsar.experimental-span-attributes", false)) { From d855f97adfd4228a4c50e39ca04ff428c2d84108 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Fri, 14 Jun 2024 16:28:34 +0800 Subject: [PATCH 02/13] code style --- .../semconv/messaging/MessagingMetricsAdvice.java | 1 + .../semconv/messaging/MessagingProducerMetrics.java | 5 +++-- .../semconv/messaging/MessagingProducerMetricsTest.java | 9 ++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java index 01d266d4670b..730f82c7ded2 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java @@ -35,5 +35,6 @@ static void applyPublishDurationAdvice(DoubleHistogramBuilder builder) { ServerAttributes.SERVER_PORT, ServerAttributes.SERVER_ADDRESS)); } + private MessagingMetricsAdvice() {} } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 8dda57a4203b..7dc4400a9738 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -28,8 +28,8 @@ public class MessagingProducerMetrics implements OperationListener { ContextKey.named("pulsar-producer-metrics-state"); private static final Logger logger = Logger.getLogger(MessagingProducerMetrics.class.getName()); - private final DoubleHistogram publishDurationHistogram; + private MessagingProducerMetrics(Meter meter) { DoubleHistogramBuilder durationBuilder = meter @@ -66,7 +66,8 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) { Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build(); - publishDurationHistogram.record((endNanos - state.startTimeNanos()) / NANOS_PER_S, attributes, context); + publishDurationHistogram.record( + (endNanos - state.startTimeNanos()) / NANOS_PER_S, attributes, context); } @AutoValue diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java index ea41e02e0870..03d3505f1e8a 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -39,7 +39,8 @@ void collectsMetrics() { Attributes requestAttributes = Attributes.builder() .put(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "pulsar") - .put(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + .put( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "persistent://public/default/topic") .put(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish") .put(ServerAttributes.SERVER_PORT, 6650) @@ -86,10 +87,12 @@ void collectsMetrics() { point .hasSum(0.15 /* seconds */) .hasAttributesSatisfying( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, "pulsar"), equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + MessagingIncubatingAttributes + .MESSAGING_DESTINATION_NAME, "persistent://public/default/topic"), equalTo(ServerAttributes.SERVER_PORT, 6650), equalTo(ServerAttributes.SERVER_ADDRESS, "localhost")) From b5d512bdff50029ed4792a32d6bec4cd4fb4fc56 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 17 Jun 2024 20:33:59 +0800 Subject: [PATCH 03/13] Update instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java Co-authored-by: Lauri Tulmin --- .../api/incubator/semconv/messaging/MessagingMetricsAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java index 730f82c7ded2..6c0ef92be758 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java @@ -15,7 +15,7 @@ import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.List; -public class MessagingMetricsAdvice { +final class MessagingMetricsAdvice { static final List DURATION_SECONDS_BUCKETS = unmodifiableList( asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); From 3de71a852f062fde81234fe2908cc3b6bff06148 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 17 Jun 2024 20:34:45 +0800 Subject: [PATCH 04/13] Update instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java Co-authored-by: Lauri Tulmin --- .../incubator/semconv/messaging/MessagingProducerMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 7dc4400a9738..4a11c53b804b 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -21,7 +21,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; -public class MessagingProducerMetrics implements OperationListener { +public final class MessagingProducerMetrics implements OperationListener { private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1); private static final ContextKey PULSAR_PUBLISH_METRICS_STATE = From 6bb2c90abcf705a57c4fdc0d9ab7838f6ed2319a Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 17 Jun 2024 20:35:56 +0800 Subject: [PATCH 05/13] Update instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java Co-authored-by: Steve Rao --- .../semconv/messaging/MessagingProducerMetricsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java index 03d3505f1e8a..8b1ed642add4 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -25,7 +25,7 @@ public class MessagingProducerMetricsTest { - static final double[] DURATION_BUCKETS = + private static final double[] DURATION_BUCKETS = MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); @Test From 6f68ebd42dd63fed0a686a0edca900ba6e06b28b Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 17 Jun 2024 20:36:41 +0800 Subject: [PATCH 06/13] Update instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java Co-authored-by: Steve Rao --- .../semconv/messaging/MessagingProducerMetricsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java index 8b1ed642add4..491387253ee9 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; -public class MessagingProducerMetricsTest { +class MessagingProducerMetricsTest { private static final double[] DURATION_BUCKETS = MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); From 9f42598dc8d8b682d6ea7fcd7b5c263e3714d795 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 18 Jun 2024 00:01:10 +0800 Subject: [PATCH 07/13] fix with cr --- .../build.gradle.kts | 2 +- .../messaging/MessagingMetricsAdvice.java | 20 ++++++++++++++----- .../messaging/MessagingProducerMetrics.java | 13 ++++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/instrumentation-api-incubator/build.gradle.kts b/instrumentation-api-incubator/build.gradle.kts index f901051e5438..00d887da1b25 100644 --- a/instrumentation-api-incubator/build.gradle.kts +++ b/instrumentation-api-incubator/build.gradle.kts @@ -12,7 +12,6 @@ group = "io.opentelemetry.instrumentation" dependencies { api("io.opentelemetry.semconv:opentelemetry-semconv") - api("io.opentelemetry.semconv:opentelemetry-semconv-incubating") api(project(":instrumentation-api")) implementation("io.opentelemetry:opentelemetry-api-incubator") @@ -22,6 +21,7 @@ dependencies { testImplementation(project(":testing-common")) testImplementation("io.opentelemetry:opentelemetry-sdk") testImplementation("io.opentelemetry:opentelemetry-sdk-testing") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") } tasks { diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java index 6c0ef92be758..8ada61c1683f 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java @@ -8,11 +8,11 @@ import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; import io.opentelemetry.semconv.ErrorAttributes; import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.List; final class MessagingMetricsAdvice { @@ -20,6 +20,16 @@ final class MessagingMetricsAdvice { unmodifiableList( asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); + // copied from MessagingIncubatingAttributes + private static final AttributeKey MESSAGING_SYSTEM = + AttributeKey.stringKey("messaging.system"); + private static final AttributeKey MESSAGING_DESTINATION_NAME = + AttributeKey.stringKey("messaging.destination.name"); + private static final AttributeKey MESSAGING_OPERATION = + AttributeKey.stringKey("messaging.operation"); + private static final AttributeKey MESSAGING_BATCH_MESSAGE_COUNT = + AttributeKey.longKey("messaging.batch.message_count"); + static void applyPublishDurationAdvice(DoubleHistogramBuilder builder) { if (!(builder instanceof ExtendedDoubleHistogramBuilder)) { return; @@ -27,10 +37,10 @@ static void applyPublishDurationAdvice(DoubleHistogramBuilder builder) { ((ExtendedDoubleHistogramBuilder) builder) .setAttributesAdvice( asList( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - MessagingIncubatingAttributes.MESSAGING_OPERATION, - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, + MESSAGING_SYSTEM, + MESSAGING_DESTINATION_NAME, + MESSAGING_OPERATION, + MESSAGING_BATCH_MESSAGE_COUNT, ErrorAttributes.ERROR_TYPE, ServerAttributes.SERVER_PORT, ServerAttributes.SERVER_ADDRESS)); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 4a11c53b804b..0800436f96d3 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -21,11 +21,16 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +/** + * {@link OperationListener} which keeps track of Producer + * metrics. + */ public final class MessagingProducerMetrics implements OperationListener { private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1); - private static final ContextKey PULSAR_PUBLISH_METRICS_STATE = - ContextKey.named("pulsar-producer-metrics-state"); + private static final ContextKey MESSAGING_PRODUCER_METRICS_STATE = + ContextKey.named("messaging-producer-metrics-state"); private static final Logger logger = Logger.getLogger(MessagingProducerMetrics.class.getName()); private final DoubleHistogram publishDurationHistogram; @@ -49,13 +54,13 @@ public static OperationMetrics get() { @CanIgnoreReturnValue public Context onStart(Context context, Attributes startAttributes, long startNanos) { return context.with( - PULSAR_PUBLISH_METRICS_STATE, + MESSAGING_PRODUCER_METRICS_STATE, new AutoValue_MessagingProducerMetrics_State(startAttributes, startNanos)); } @Override public void onEnd(Context context, Attributes endAttributes, long endNanos) { - MessagingProducerMetrics.State state = context.get(PULSAR_PUBLISH_METRICS_STATE); + MessagingProducerMetrics.State state = context.get(MESSAGING_PRODUCER_METRICS_STATE); if (state == null) { logger.log( FINE, From 8b5e585843ef97356b32df97520f2c64d2e5031c Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 18 Jun 2024 15:14:19 +0800 Subject: [PATCH 08/13] Add pulsar metrics test --- .../messaging/MessagingProducerMetrics.java | 2 +- .../pulsar/v2_8/AbstractPulsarClientTest.java | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 0800436f96d3..8a2824793bb8 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -64,7 +64,7 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) { if (state == null) { logger.log( FINE, - "No state present when ending context {0}. Cannot record pulsar publish metrics.", + "No state present when ending context {0}. Cannot record produce publish metrics.", context); return; } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index f32daa20e074..bebbffd773c2 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -15,6 +15,8 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static java.util.Arrays.asList; +import static java.util.Collections.unmodifiableList; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -22,6 +24,7 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; import java.time.Duration; @@ -77,6 +80,12 @@ abstract class AbstractPulsarClientTest { private static final AttributeKey MESSAGE_TYPE = AttributeKey.stringKey("messaging.pulsar.message.type"); + private static final List DURATION_SECONDS_BUCKETS = + unmodifiableList( + asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); + private static final double[] DURATION_BUCKETS = + DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); + @BeforeAll static void beforeAll() throws PulsarClientException { pulsar = @@ -163,6 +172,26 @@ void testConsumeNonPartitionedTopicUsingBatchReceive() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( batchReceiveAttributes(topic, null, false)))); + + assertThat(testing.metrics()) + .satisfiesExactlyInAnyOrder( + metric -> + OpenTelemetryAssertions.assertThat(metric) + .hasName("messaging.publish.duration") + .hasUnit("s") + .hasDescription("Measures the duration of publish operation.") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point + .hasSumGreaterThan(0.0) + .hasAttributesSatisfying( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(SERVER_PORT, brokerPort), + equalTo(SERVER_ADDRESS, brokerHost)) + .hasBucketBoundaries(DURATION_BUCKETS)))); } @Test From 53b2dee0427c49617f701f271ac258bf8d3b651f Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 18 Jun 2024 18:17:40 +0800 Subject: [PATCH 09/13] Update doc url --- .../incubator/semconv/messaging/MessagingProducerMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 8a2824793bb8..44d5b243744a 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -23,7 +23,7 @@ /** * {@link OperationListener} which keeps track of Producer + * href="https://github.com/open-telemetry/semantic-conventions/blob/v1.26.0/docs/messaging/messaging-metrics.md#metric-messagingpublishduration">Producer * metrics. */ public final class MessagingProducerMetrics implements OperationListener { From df187f432dfc7ade4ab5f5d51102ca8edec5f849 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 18 Jun 2024 23:18:10 +0800 Subject: [PATCH 10/13] use array --- .../pulsar/v2_8/AbstractPulsarClientTest.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index bebbffd773c2..18deed26be82 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -15,8 +15,6 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; -import static java.util.Arrays.asList; -import static java.util.Collections.unmodifiableList; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -79,12 +77,9 @@ abstract class AbstractPulsarClientTest { private static final AttributeKey MESSAGE_TYPE = AttributeKey.stringKey("messaging.pulsar.message.type"); - - private static final List DURATION_SECONDS_BUCKETS = - unmodifiableList( - asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); - private static final double[] DURATION_BUCKETS = - DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); + private static final double[] DURATION_BUCKETS = new double[] { + 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0 + }; @BeforeAll static void beforeAll() throws PulsarClientException { From e2d5e0982cc41aa5aac82d89f24d0b8a7b7e5521 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 18 Jun 2024 23:33:31 +0800 Subject: [PATCH 11/13] use array --- .../pulsar/v2_8/AbstractPulsarClientTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index 18deed26be82..7883d5082c4f 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -77,9 +77,10 @@ abstract class AbstractPulsarClientTest { private static final AttributeKey MESSAGE_TYPE = AttributeKey.stringKey("messaging.pulsar.message.type"); - private static final double[] DURATION_BUCKETS = new double[] { - 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0 - }; + private static final double[] DURATION_BUCKETS = + new double[] { + 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0 + }; @BeforeAll static void beforeAll() throws PulsarClientException { From 562f05967d717783c8c1e13841ed3ca22b546737 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 24 Mar 2025 17:52:55 +0800 Subject: [PATCH 12/13] update pulsar semantic --- .../semconv/messaging/MessageOperation.java | 2 + .../MessagingAttributesExtractor.java | 26 ++- .../MessagingAttributesExtractorBuilder.java | 6 +- .../messaging/MessagingConsumerMetrics.java | 8 +- .../messaging/MessagingMetricsAdvice.java | 10 +- .../messaging/MessagingProducerMetrics.java | 4 +- .../MessagingProducerMetricsTest.java | 4 +- .../v2_8/telemetry/PulsarSingletons.java | 14 +- .../pulsar/v2_8/AbstractPulsarClientTest.java | 66 ++++---- .../pulsar/v2_8/PulsarClientTest.java | 153 +++++++++--------- .../pulsar/v1_0/SpringPulsarSingletons.java | 2 +- .../spring/pulsar/v1_0/SpringPulsarTest.java | 2 +- .../SpringPulsarSuppressReceiveSpansTest.java | 2 +- .../pulsar/v1_0/AbstractSpringPulsarTest.java | 12 +- 14 files changed, 170 insertions(+), 141 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessageOperation.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessageOperation.java index e7ef5c479ed0..378a918e6921 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessageOperation.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessageOperation.java @@ -13,8 +13,10 @@ * that may be used in a messaging system. */ public enum MessageOperation { + CREATE, PUBLISH, RECEIVE, + SEND, PROCESS; /** diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java index bdf5ab879786..7a4e81e99a1a 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.messaging; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; import io.opentelemetry.api.common.AttributeKey; @@ -28,6 +29,8 @@ public final class MessagingAttributesExtractor implements AttributesExtractor, SpanKeyProvider { // copied from MessagingIncubatingAttributes + private static final AttributeKey MESSAGING_OPERATION_NAME = + stringKey("messaging.operation.name"); private static final AttributeKey MESSAGING_BATCH_MESSAGE_COUNT = AttributeKey.longKey("messaging.batch.message_count"); private static final AttributeKey MESSAGING_CLIENT_ID = @@ -50,8 +53,8 @@ public final class MessagingAttributesExtractor AttributeKey.longKey("messaging.message.envelope.size"); private static final AttributeKey MESSAGING_MESSAGE_ID = AttributeKey.stringKey("messaging.message.id"); - private static final AttributeKey MESSAGING_OPERATION = - AttributeKey.stringKey("messaging.operation"); + private static final AttributeKey MESSAGING_OPERATION_TYPE = + stringKey("messaging.operation.type"); private static final AttributeKey MESSAGING_SYSTEM = AttributeKey.stringKey("messaging.system"); @@ -72,24 +75,35 @@ public static AttributesExtractor create( */ public static MessagingAttributesExtractorBuilder builder( MessagingAttributesGetter getter, MessageOperation operation) { - return new MessagingAttributesExtractorBuilder<>(getter, operation); + return new MessagingAttributesExtractorBuilder<>(getter, operation,""); + } + + public static MessagingAttributesExtractorBuilder builder( + MessagingAttributesGetter getter, MessageOperation operation, String operationName) { + return new MessagingAttributesExtractorBuilder<>(getter, operation, operationName); } private final MessagingAttributesGetter getter; private final MessageOperation operation; private final List capturedHeaders; + private final String operationName; MessagingAttributesExtractor( MessagingAttributesGetter getter, MessageOperation operation, - List capturedHeaders) { + List capturedHeaders, + String operationName) { this.getter = getter; this.operation = operation; this.capturedHeaders = CapturedMessageHeadersUtil.lowercase(capturedHeaders); + this.operationName = operationName; } @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { + if (operationName != null) { + internalSet(attributes, MESSAGING_OPERATION_NAME, operationName); + } internalSet(attributes, MESSAGING_SYSTEM, getter.getSystem(request)); boolean isTemporaryDestination = getter.isTemporaryDestination(request); if (isTemporaryDestination) { @@ -112,7 +126,7 @@ public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST attributes, MESSAGING_MESSAGE_ENVELOPE_SIZE, getter.getMessageEnvelopeSize(request)); internalSet(attributes, MESSAGING_CLIENT_ID, getter.getClientId(request)); if (operation != null) { - internalSet(attributes, MESSAGING_OPERATION, operation.operationName()); + internalSet(attributes, MESSAGING_OPERATION_TYPE, operation.operationName()); } } @@ -147,6 +161,8 @@ public SpanKey internalGetSpanKey() { switch (operation) { case PUBLISH: + case CREATE: + case SEND: return SpanKey.PRODUCER; case RECEIVE: return SpanKey.CONSUMER_RECEIVE; diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java index 769de0862362..d5865c81df36 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java @@ -19,11 +19,13 @@ public final class MessagingAttributesExtractorBuilder { final MessagingAttributesGetter getter; final MessageOperation operation; List capturedHeaders = emptyList(); + final String operationName; MessagingAttributesExtractorBuilder( - MessagingAttributesGetter getter, MessageOperation operation) { + MessagingAttributesGetter getter, MessageOperation operation, String operationName) { this.getter = getter; this.operation = operation; + this.operationName = operationName; } /** @@ -47,6 +49,6 @@ public MessagingAttributesExtractorBuilder setCapturedHeaders * MessagingAttributesExtractorBuilder}. */ public AttributesExtractor build() { - return new MessagingAttributesExtractor<>(getter, operation, capturedHeaders); + return new MessagingAttributesExtractor<>(getter, operation, capturedHeaders, operationName); } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java index fec179dc8da8..d975043e2adb 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java @@ -45,8 +45,8 @@ public final class MessagingConsumerMetrics implements OperationListener { private MessagingConsumerMetrics(Meter meter) { DoubleHistogramBuilder durationBuilder = meter - .histogramBuilder("messaging.receive.duration") - .setDescription("Measures the duration of receive operation.") + .histogramBuilder("messaging.client.operation.duration") + .setDescription("Duration of messaging operation initiated by a producer or consumer client.") .setExplicitBucketBoundariesAdvice(MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS) .setUnit("s"); MessagingMetricsAdvice.applyReceiveDurationAdvice(durationBuilder); @@ -54,8 +54,8 @@ private MessagingConsumerMetrics(Meter meter) { LongCounterBuilder longCounterBuilder = meter - .counterBuilder("messaging.receive.messages") - .setDescription("Measures the number of received messages.") + .counterBuilder("messaging.client.consumed.messages") + .setDescription("Number of messages that were delivered to the application.") .setUnit("{message}"); MessagingMetricsAdvice.applyReceiveMessagesAdvice(longCounterBuilder); receiveMessageCount = longCounterBuilder.build(); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java index f87c814d2a31..c6a1c0d36b4a 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingMetricsAdvice.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.messaging; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; @@ -23,12 +24,14 @@ final class MessagingMetricsAdvice { asList(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0)); // copied from MessagingIncubatingAttributes + private static final AttributeKey MESSAGING_OPERATION_NAME = + stringKey("messaging.operation.name"); private static final AttributeKey MESSAGING_SYSTEM = AttributeKey.stringKey("messaging.system"); private static final AttributeKey MESSAGING_DESTINATION_NAME = AttributeKey.stringKey("messaging.destination.name"); - private static final AttributeKey MESSAGING_OPERATION = - AttributeKey.stringKey("messaging.operation"); + private static final AttributeKey MESSAGING_OPERATION_TYPE = + stringKey("messaging.operation.type"); private static final AttributeKey MESSAGING_DESTINATION_PARTITION_ID = AttributeKey.stringKey("messaging.destination.partition.id"); private static final AttributeKey MESSAGING_DESTINATION_TEMPLATE = @@ -36,9 +39,10 @@ final class MessagingMetricsAdvice { private static final List> MESSAGING_ATTRIBUTES = asList( + MESSAGING_OPERATION_NAME, MESSAGING_SYSTEM, MESSAGING_DESTINATION_NAME, - MESSAGING_OPERATION, + MESSAGING_OPERATION_TYPE, MESSAGING_DESTINATION_PARTITION_ID, MESSAGING_DESTINATION_TEMPLATE, ErrorAttributes.ERROR_TYPE, diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 44d5b243744a..2fea34a3b1f6 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -38,8 +38,8 @@ public final class MessagingProducerMetrics implements OperationListener { private MessagingProducerMetrics(Meter meter) { DoubleHistogramBuilder durationBuilder = meter - .histogramBuilder("messaging.publish.duration") - .setDescription("Measures the duration of publish operation.") + .histogramBuilder("messaging.client.operation.duration") + .setDescription("Duration of messaging operation initiated by a producer or consumer client.") .setExplicitBucketBoundariesAdvice(MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS) .setUnit("s"); MessagingMetricsAdvice.applyPublishDurationAdvice(durationBuilder); diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java index f2f199718e82..6d75b4797bd7 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -77,7 +77,7 @@ void collectsMetrics() { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.publish.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") .hasDescription("Measures the duration of publish operation.") .hasHistogramSatisfying( @@ -113,7 +113,7 @@ void collectsMetrics() { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.publish.duration") + .hasName("messaging.client.operation.duration") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java index c26022efea02..ba16ac96e256 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java @@ -76,7 +76,7 @@ private static Instrumenter createConsumerReceiveInstrument INSTRUMENTATION_NAME, MessagingSpanNameExtractor.create(getter, MessageOperation.RECEIVE)) .addAttributesExtractor( - createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE)) + createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE, "receive")) .addOperationMetrics(MessagingConsumerMetrics.get()) .addAttributesExtractor( ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())); @@ -99,7 +99,7 @@ private static Instrumenter createConsumerBatchReceive INSTRUMENTATION_NAME, MessagingSpanNameExtractor.create(getter, MessageOperation.RECEIVE)) .addAttributesExtractor( - createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE)) + createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE, "receive")) .addAttributesExtractor( ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())) .addSpanLinksExtractor(new PulsarBatchRequestSpanLinksExtractor(PROPAGATOR)) @@ -117,7 +117,7 @@ private static Instrumenter createConsumerProcessInstrument INSTRUMENTATION_NAME, MessagingSpanNameExtractor.create(getter, MessageOperation.PROCESS)) .addAttributesExtractor( - createMessagingAttributesExtractor(getter, MessageOperation.PROCESS)); + createMessagingAttributesExtractor(getter, MessageOperation.PROCESS, "process")); if (receiveInstrumentationEnabled) { SpanLinksExtractor spanLinksExtractor = @@ -136,9 +136,9 @@ private static Instrumenter createProducerInstrumenter() { Instrumenter.builder( TELEMETRY, INSTRUMENTATION_NAME, - MessagingSpanNameExtractor.create(getter, MessageOperation.PUBLISH)) + MessagingSpanNameExtractor.create(getter, MessageOperation.SEND)) .addAttributesExtractor( - createMessagingAttributesExtractor(getter, MessageOperation.PUBLISH)) + createMessagingAttributesExtractor(getter, MessageOperation.SEND, "send")) .addAttributesExtractor( ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter())) .addOperationMetrics(MessagingProducerMetrics.get()); @@ -152,8 +152,8 @@ private static Instrumenter createProducerInstrumenter() { } private static AttributesExtractor createMessagingAttributesExtractor( - MessagingAttributesGetter getter, MessageOperation operation) { - return MessagingAttributesExtractor.builder(getter, operation) + MessagingAttributesGetter getter, MessageOperation operation, String operationName) { + return MessagingAttributesExtractor.builder(getter, operation, operationName) .setCapturedHeaders(capturedHeaders) .build(); } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index 993e53536f8b..f90c75283a29 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -15,7 +15,8 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_TYPE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; @@ -157,7 +158,7 @@ void testConsumeNonPartitionedTopicUsingBatchReceive() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -179,9 +180,10 @@ void testConsumeNonPartitionedTopicUsingBatchReceive() throws Exception { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.receive.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") - .hasDescription("Measures the duration of receive operation.") + .hasDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -190,32 +192,28 @@ void testConsumeNonPartitionedTopicUsingBatchReceive() throws Exception { .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) - .hasBucketBoundaries(DURATION_BUCKETS))), - metric -> - assertThat(metric) - .hasName("messaging.publish.duration") - .hasUnit("s") - .hasDescription("Measures the duration of publish operation.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( + .hasBucketBoundaries(DURATION_BUCKETS), point -> point .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) .hasBucketBoundaries(DURATION_BUCKETS))), metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> sum.hasPointsSatisfying( @@ -224,6 +222,8 @@ void testConsumeNonPartitionedTopicUsingBatchReceive() throws Exception { .hasValue(1) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost))))); @@ -269,7 +269,7 @@ void testConsumeNonPartitionedTopicUsingBatchReceiveAsync() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -295,9 +295,10 @@ void testConsumeNonPartitionedTopicUsingBatchReceiveAsync() throws Exception { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.receive.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") - .hasDescription("Measures the duration of receive operation.") + .hasDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -306,32 +307,28 @@ void testConsumeNonPartitionedTopicUsingBatchReceiveAsync() throws Exception { .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) - .hasBucketBoundaries(DURATION_BUCKETS))), - metric -> - assertThat(metric) - .hasName("messaging.publish.duration") - .hasUnit("s") - .hasDescription("Measures the duration of publish operation.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( + .hasBucketBoundaries(DURATION_BUCKETS), point -> point .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) .hasBucketBoundaries(DURATION_BUCKETS))), metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> sum.hasPointsSatisfying( @@ -340,6 +337,8 @@ void testConsumeNonPartitionedTopicUsingBatchReceiveAsync() throws Exception { .hasValue(1) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost))))); @@ -352,10 +351,11 @@ static List sendAttributes( new ArrayList<>( Arrays.asList( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), equalTo(MESSAGE_TYPE, "normal"))); @@ -390,10 +390,11 @@ static List receiveAttributes( new ArrayList<>( Arrays.asList( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { @@ -419,8 +420,9 @@ static List processAttributes( new ArrayList<>( Arrays.asList( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "process"), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_OPERATION_TYPE, "process"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarClientTest.java index a2c4c94b69bc..0fca7a073a7d 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarClientTest.java @@ -12,6 +12,8 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_TYPE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.trace.SpanKind; @@ -65,7 +67,7 @@ void testConsumeNonPartitionedTopic() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -117,7 +119,7 @@ void testConsumeNonPartitionedTopicUsingReceive() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -139,9 +141,10 @@ void testConsumeNonPartitionedTopicUsingReceive() throws Exception { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.receive.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") - .hasDescription("Measures the duration of receive operation.") + .hasDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -150,15 +153,28 @@ void testConsumeNonPartitionedTopicUsingReceive() throws Exception { .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(SERVER_PORT, brokerPort), + equalTo(SERVER_ADDRESS, brokerHost)) + .hasBucketBoundaries(DURATION_BUCKETS), + point -> + point + .hasSumGreaterThan(0.0) + .hasAttributesSatisfying( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) .hasBucketBoundaries(DURATION_BUCKETS))), metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> { sum.hasPointsSatisfying( @@ -167,28 +183,13 @@ void testConsumeNonPartitionedTopicUsingReceive() throws Exception { .hasValue(1) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)); }); - }), - metric -> - assertThat(metric) - .hasName("messaging.publish.duration") - .hasUnit("s") - .hasDescription("Measures the duration of publish operation.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point - .hasSumGreaterThan(0.0) - .hasAttributesSatisfying( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(SERVER_PORT, brokerPort), - equalTo(SERVER_ADDRESS, brokerHost)) - .hasBucketBoundaries(DURATION_BUCKETS)))); + })); } @Test @@ -227,7 +228,7 @@ void testConsumeNonPartitionedTopicUsingReceiveAsync() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -253,9 +254,10 @@ void testConsumeNonPartitionedTopicUsingReceiveAsync() throws Exception { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.receive.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") - .hasDescription("Measures the duration of receive operation.") + .hasDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -264,15 +266,28 @@ void testConsumeNonPartitionedTopicUsingReceiveAsync() throws Exception { .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(SERVER_PORT, brokerPort), + equalTo(SERVER_ADDRESS, brokerHost)) + .hasBucketBoundaries(DURATION_BUCKETS), + point -> + point + .hasSumGreaterThan(0.0) + .hasAttributesSatisfying( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) .hasBucketBoundaries(DURATION_BUCKETS))), metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> { sum.hasPointsSatisfying( @@ -281,28 +296,13 @@ void testConsumeNonPartitionedTopicUsingReceiveAsync() throws Exception { .hasValue(1) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)); }); - }), - metric -> - assertThat(metric) - .hasName("messaging.publish.duration") - .hasUnit("s") - .hasDescription("Measures the duration of publish operation.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point - .hasSumGreaterThan(0.0) - .hasAttributesSatisfying( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(SERVER_PORT, brokerPort), - equalTo(SERVER_ADDRESS, brokerHost)) - .hasBucketBoundaries(DURATION_BUCKETS)))); + })); } @Test @@ -332,7 +332,7 @@ void testConsumeNonPartitionedTopicUsingReceiveWithTimeout() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -354,9 +354,10 @@ void testConsumeNonPartitionedTopicUsingReceiveWithTimeout() throws Exception { .satisfiesExactlyInAnyOrder( metric -> assertThat(metric) - .hasName("messaging.receive.duration") + .hasName("messaging.client.operation.duration") .hasUnit("s") - .hasDescription("Measures the duration of receive operation.") + .hasDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -365,15 +366,28 @@ void testConsumeNonPartitionedTopicUsingReceiveWithTimeout() throws Exception { .hasSumGreaterThan(0.0) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(SERVER_PORT, brokerPort), + equalTo(SERVER_ADDRESS, brokerHost)) + .hasBucketBoundaries(DURATION_BUCKETS), + point -> + point + .hasSumGreaterThan(0.0) + .hasAttributesSatisfying( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)) .hasBucketBoundaries(DURATION_BUCKETS))), metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> { sum.hasPointsSatisfying( @@ -382,28 +396,13 @@ void testConsumeNonPartitionedTopicUsingReceiveWithTimeout() throws Exception { .hasValue(1) .hasAttributesSatisfying( equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, topic), equalTo(SERVER_PORT, brokerPort), equalTo(SERVER_ADDRESS, brokerHost)); }); - }), - metric -> - assertThat(metric) - .hasName("messaging.publish.duration") - .hasUnit("s") - .hasDescription("Measures the duration of publish operation.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point - .hasSumGreaterThan(0.0) - .hasAttributesSatisfying( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(SERVER_PORT, brokerPort), - equalTo(SERVER_ADDRESS, brokerHost)) - .hasBucketBoundaries(DURATION_BUCKETS)))); + })); } @Test @@ -442,7 +441,7 @@ void captureMessageHeaderAsSpanAttribute() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -502,7 +501,7 @@ void testConsumePartitionedTopic() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + "-partition-0 publish") + span.hasName(topic + "-partition-0 send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -564,7 +563,7 @@ void testConsumeMultiTopics() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent1").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic1 + " publish") + span.hasName(topic1 + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -592,7 +591,7 @@ void testConsumeMultiTopics() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent2").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic2 + " publish") + span.hasName(topic2 + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( @@ -644,9 +643,9 @@ void testConsumePartitionedTopicUsingBatchReceive() throws Exception { .satisfiesOnlyOnce( metric -> assertThat(metric) - .hasName("messaging.receive.messages") + .hasName("messaging.client.consumed.messages") .hasUnit("{message}") - .hasDescription("Measures the number of received messages.") + .hasDescription("Number of messages that were delivered to the application.") .hasLongSumSatisfying( sum -> { sum.satisfies( @@ -694,7 +693,7 @@ void testSendMessageWithTxn() throws Exception { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent1").hasKind(SpanKind.INTERNAL).hasNoParent(), span -> - span.hasName(topic + " publish") + span.hasName(topic + " send") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)))); } diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java index fc9c454dcda2..90bc9bbd9b5e 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java @@ -34,7 +34,7 @@ public final class SpringPulsarSingletons { INSTRUMENTATION_NAME, MessagingSpanNameExtractor.create(getter, operation)) .addAttributesExtractor( - MessagingAttributesExtractor.builder(getter, operation) + MessagingAttributesExtractor.builder(getter, operation, "process") .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) .build()); if (messagingReceiveInstrumentationEnabled) { diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java index 2fba60091be1..4574e9d80781 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java @@ -27,7 +27,7 @@ protected void assertSpringPulsar() { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasNoParent(), span -> { - span.hasName(OTEL_TOPIC + " publish") + span.hasName(OTEL_TOPIC + " send") .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly(publishAttributes()); diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java index f4abc0b566c6..6d2cddcfff4b 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java @@ -19,7 +19,7 @@ protected void assertSpringPulsar() { trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasNoParent(), span -> - span.hasName(OTEL_TOPIC + " publish") + span.hasName(OTEL_TOPIC + " send") .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly(publishAttributes()), diff --git a/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java index 336a722fa030..7db77c750bec 100644 --- a/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java @@ -13,7 +13,8 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION_TYPE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Arrays.asList; @@ -115,7 +116,8 @@ static void teardown() { protected List publishAttributes() { return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_OPERATION_NAME, "send"), + equalTo(MESSAGING_OPERATION_TYPE, "send"), equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), @@ -127,7 +129,8 @@ protected List publishAttributes() { protected List processAttributes() { return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_OPERATION_NAME, "process"), + equalTo(MESSAGING_OPERATION_TYPE, "process"), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC)); @@ -136,7 +139,8 @@ protected List processAttributes() { protected List receiveAttributes() { return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_OPERATION_NAME, "receive"), + equalTo(MESSAGING_OPERATION_TYPE, "receive"), equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), satisfies(MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isNotNegative), From 126e61bdc434cba462188ab3caafd2f4eb8d0128 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 24 Mar 2025 18:15:25 +0800 Subject: [PATCH 13/13] fix spotless --- .../semconv/messaging/MessagingAttributesExtractor.java | 6 ++++-- .../messaging/MessagingAttributesExtractorBuilder.java | 4 +++- .../semconv/messaging/MessagingConsumerMetrics.java | 3 ++- .../semconv/messaging/MessagingProducerMetrics.java | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java index 7a4e81e99a1a..4f1cff6b423e 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java @@ -75,11 +75,13 @@ public static AttributesExtractor create( */ public static MessagingAttributesExtractorBuilder builder( MessagingAttributesGetter getter, MessageOperation operation) { - return new MessagingAttributesExtractorBuilder<>(getter, operation,""); + return new MessagingAttributesExtractorBuilder<>(getter, operation, ""); } public static MessagingAttributesExtractorBuilder builder( - MessagingAttributesGetter getter, MessageOperation operation, String operationName) { + MessagingAttributesGetter getter, + MessageOperation operation, + String operationName) { return new MessagingAttributesExtractorBuilder<>(getter, operation, operationName); } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java index d5865c81df36..765c9fe33755 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorBuilder.java @@ -22,7 +22,9 @@ public final class MessagingAttributesExtractorBuilder { final String operationName; MessagingAttributesExtractorBuilder( - MessagingAttributesGetter getter, MessageOperation operation, String operationName) { + MessagingAttributesGetter getter, + MessageOperation operation, + String operationName) { this.getter = getter; this.operation = operation; this.operationName = operationName; diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java index d975043e2adb..c84bbe0b9fc6 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingConsumerMetrics.java @@ -46,7 +46,8 @@ private MessagingConsumerMetrics(Meter meter) { DoubleHistogramBuilder durationBuilder = meter .histogramBuilder("messaging.client.operation.duration") - .setDescription("Duration of messaging operation initiated by a producer or consumer client.") + .setDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .setExplicitBucketBoundariesAdvice(MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS) .setUnit("s"); MessagingMetricsAdvice.applyReceiveDurationAdvice(durationBuilder); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java index 2fea34a3b1f6..b23cffc50d4e 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetrics.java @@ -39,7 +39,8 @@ private MessagingProducerMetrics(Meter meter) { DoubleHistogramBuilder durationBuilder = meter .histogramBuilder("messaging.client.operation.duration") - .setDescription("Duration of messaging operation initiated by a producer or consumer client.") + .setDescription( + "Duration of messaging operation initiated by a producer or consumer client.") .setExplicitBucketBoundariesAdvice(MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS) .setUnit("s"); MessagingMetricsAdvice.applyPublishDurationAdvice(durationBuilder);