From 21cbf96b97d2253f95a1df4550ca80df5bf492d3 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 14 May 2024 23:44:01 +0800 Subject: [PATCH 01/51] add metric annotation instrumentation --- ...ntelemetry-instrumentation-annotations.txt | 38 +++- .../instrumentation/annotations/Counted.java | 95 ++++++++++ .../annotations/MetricAttribute.java | 39 ++++ .../instrumentation/annotations/Timed.java | 91 +++++++++ .../annotations/CountedUsageExamples.java | 19 ++ .../annotations/TimedUsageExamples.java | 19 ++ .../README.md | 5 + .../javaagent/build.gradle.kts | 46 +++++ .../counted/AnnotationExcludedMethods.java | 53 ++++++ .../counted/CountedHelper.java | 123 ++++++++++++ .../counted/CountedInstrumentation.java | 117 ++++++++++++ .../counted/CountedInstrumentationModule.java | 44 +++++ .../counted/KotlinCoroutineUtil.java | 32 ++++ .../counted/MethodRequest.java | 26 +++ .../annotations/counted/CountedExample.java | 60 ++++++ .../counted/CountedInstrumentationTest.java | 171 +++++++++++++++++ .../README.md | 5 + .../javaagent/build.gradle.kts | 46 +++++ .../timed/AnnotationExcludedMethods.java | 53 ++++++ .../timed/KotlinCoroutineUtil.java | 32 ++++ .../instrumentation/timed/MethodRequest.java | 26 +++ .../instrumentation/timed/TimedHelper.java | 163 ++++++++++++++++ .../timed/TimedInstrumentation.java | 125 ++++++++++++ .../timed/TimedInstrumentationModule.java | 43 +++++ .../test/annotations/timed/TimedExample.java | 61 ++++++ .../timed/TimedInstrumentationTest.java | 179 ++++++++++++++++++ settings.gradle.kts | 2 + 27 files changed, 1711 insertions(+), 2 deletions(-) create mode 100644 instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java create mode 100644 instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java create mode 100644 instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java create mode 100644 instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java create mode 100644 instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/README.md create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/README.md create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java create mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index f2ce28a1b43b..8c4c7b6c6a37 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,2 +1,36 @@ -Comparing source compatibility of opentelemetry-instrumentation-annotations-2.5.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.4.0.jar -No changes. \ No newline at end of file +Comparing source compatibility of against ++++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.Counted (not serializable) + +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. + +++ NEW INTERFACE: java.lang.annotation.Annotation + +++ NEW SUPERCLASS: java.lang.Object + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String[] additionalAttributes() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String description() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String returnValueAttribute() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String unit() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() + +++ NEW ANNOTATION: java.lang.annotation.Target + +++ NEW ELEMENT: value=java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.CONSTRUCTOR (+) + +++ NEW ANNOTATION: java.lang.annotation.Retention + +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) ++++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.MetricAttribute (not serializable) + +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. + +++ NEW INTERFACE: java.lang.annotation.Annotation + +++ NEW SUPERCLASS: java.lang.Object + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() + +++ NEW ANNOTATION: java.lang.annotation.Target + +++ NEW ELEMENT: value=java.lang.annotation.ElementType.PARAMETER (+) + +++ NEW ANNOTATION: java.lang.annotation.Retention + +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) ++++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.Timed (not serializable) + +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. + +++ NEW INTERFACE: java.lang.annotation.Annotation + +++ NEW SUPERCLASS: java.lang.Object + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String[] additionalAttributes() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String description() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String returnValueAttribute() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.concurrent.TimeUnit unit() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() + +++ NEW ANNOTATION: java.lang.annotation.Target + +++ NEW ELEMENT: value=java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.CONSTRUCTOR (+) + +++ NEW ANNOTATION: java.lang.annotation.Retention + +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java new file mode 100644 index 000000000000..0907f0210ae6 --- /dev/null +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java @@ -0,0 +1,95 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation creates a {@link io.opentelemetry.api.metrics.LongCounter Counter} instrument + * recording the number of invocations of the annotated method or constructor. + * + *

By default, the Counter instrument will have the following attributes: + * + *

+ * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the Counter instrument should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + */ +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Counted { + + /** + * Name of the Counter instrument. + * + *

The name should follow the instrument naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule + * + *

The default name is {@code method.invocation.count}. + */ + String value() default ""; + + /** + * Description of the instrument. + * + *

Description strings should follow the instrument description rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description + * + *

This property would not take effect if the value is not specified. + */ + String description() default ""; + + /** + * Unit of the instrument. + * + *

Unit strings should follow the instrument unit rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-unit + * + *

This property would not take effect if the value is not specified. + */ + String unit() default "{invocation}"; + + /** + * List of key-value pairs to supply additional attributes. + * + *

Example: + * + *

+   * {@literal @}Counted(
+   *     additionalAttributes = {
+   *       "key1", "value1",
+   *       "key2", "value2",
+   * })
+   * 
+ */ + String[] additionalAttributes() default {}; + + /** + * Attribute name for the return value. + * + *

The name of the attribute for the return value of the method call. {@link Object#toString()} + * will be called on the return value to convert it to a String. + * + *

By default, the instrument will not have an attribute with the return value. + * + *

Warning: be careful to fill it because it might cause an explosion of the cardinality on + * your metric + */ + String returnValueAttribute() default ""; +} diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java new file mode 100644 index 000000000000..39b753fb9b9e --- /dev/null +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation marks that a parameter of a method or constructor annotated with {@link Timed} or + * {@link Counted} should be added as an attribute to the instrument. + * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the attribute should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + */ +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface MetricAttribute { + + /** + * Optional name of the attribute. + * + *

If not specified and the code is compiled using the `{@code -parameters}` argument to + * `javac`, the parameter name will be used instead. If the parameter name is not available, e.g., + * because the code was not compiled with that flag, the attribute will be ignored. + * + *

Warning: be careful to fill it because it might cause an explosion of the cardinality on + * your metric + */ + String value() default ""; +} diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java new file mode 100644 index 000000000000..730dedd5f482 --- /dev/null +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java @@ -0,0 +1,91 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * This annotation creates a {@link io.opentelemetry.api.metrics.LongHistogram Histogram} instrument + * observing the duration of invocations of the annotated method or constructor. + * + *

By default, the Histogram instrument will have the following attributes: + * + *

+ * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the Histogram instrument should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + */ +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Timed { + + /** + * Name of the Histogram instrument. + * + *

The name should follow the instrument naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule + * + *

The default name is {@code method.invocation.duration}. + */ + String value() default ""; + + /** + * Description for the instrument. + * + *

Description strings should follow the instrument description rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description + */ + String description() default ""; + + /** + * The unit for the instrument. + * + *

Default is milliseconds. + */ + TimeUnit unit() default TimeUnit.MILLISECONDS; + + /** + * List of key-value pairs to supply additional attributes. + * + *

Example: + * + *

+   * {@literal @}Timed(
+   *     additionalAttributes = {
+   *       "key1", "value1",
+   *       "key2", "value2",
+   * })
+   * 
+ */ + String[] additionalAttributes() default {}; + + /** + * Attribute name for the return value. + * + *

The name of the attribute for the return value of the method call. {@link Object#toString()} + * will be called on the return value to convert it to a String. + * + *

By default, the instrument will not have an attribute with the return value. + * + *

Warning: be careful to fill it because it might cause an explosion of the cardinality on + * your metric + */ + String returnValueAttribute() default ""; +} diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java new file mode 100644 index 000000000000..46189a4932b1 --- /dev/null +++ b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +public class CountedUsageExamples { + + @Counted() + public void method1() {} + + @Counted("customizedName") + public void method2() {} + + @Counted + public void attributes( + @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} +} diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java new file mode 100644 index 000000000000..f9fc6ee8c87e --- /dev/null +++ b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +public class TimedUsageExamples { + + @Timed() + public void method1() {} + + @Timed("customizedName") + public void method2() {} + + @Timed + public void attributes( + @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md b/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md new file mode 100644 index 000000000000..f52a11a938c0 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md @@ -0,0 +1,5 @@ +# Settings for the OpenTelemetry Counted Instrumentation Annotations integration + +| Environment variable | Type | Default | Description | +|-----------------------------------------------------------------------------------------| ------ | ------- |-------------------------------------------------------------------------------------| +| `otel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by Counted annotation advices. | diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts new file mode 100644 index 000000000000..e20c13308be6 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +// note that muzzle is not run against the current SNAPSHOT instrumentation-annotations, but this is +// ok because the tests are run against the current SNAPSHOT instrumentation-annotations which will +// catch any muzzle issues in SNAPSHOT instrumentation-annotations + +muzzle { + pass { + group.set("io.opentelemetry") + module.set("opentelemetry-instrumentation-annotations") + versions.set("(,)") + } +} + +dependencies { + compileOnly(project(":instrumentation-annotations-support")) + + compileOnly(project(":javaagent-tooling")) + + // this instrumentation needs to do similar shading dance as opentelemetry-api-1.0 because + // the @WithSpan annotation references the OpenTelemetry API's SpanKind class + // + // see the comment in opentelemetry-api-1.0.gradle for more details + compileOnly(project(":opentelemetry-instrumentation-annotations-shaded-for-instrumenting", configuration = "shadow")) + + // Used by byte-buddy but not brought in as a transitive dependency. + compileOnly("com.google.code.findbugs:annotations") + testCompileOnly("com.google.code.findbugs:annotations") + + testImplementation(project(":instrumentation-annotations")) + testImplementation(project(":instrumentation-annotations-support")) + testImplementation("net.bytebuddy:byte-buddy") +} + +tasks { + compileTestJava { + options.compilerArgs.add("-parameters") + } + test { + jvmArgs( + "-Dotel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods=io.opentelemetry.test.annotations.counted.CountedExample[exampleIgnore]" + ) + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java new file mode 100644 index 000000000000..c5496df8cf4a --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.none; + +import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; +import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; +import java.util.Map; +import java.util.Set; +import net.bytebuddy.description.ByteCodeElement; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +public final class AnnotationExcludedMethods { + + private static final String COUNTED_METHODS_EXCLUDE_CONFIG = + "otel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods"; + + /* + Returns a matcher for all methods that should be excluded from auto-instrumentation by + annotation-based advices. + */ + public static ElementMatcher.Junction configureExcludedMethods() { + ElementMatcher.Junction result = none(); + + Map> excludedMethods = + MethodsConfigurationParser.parse( + InstrumentationConfig.get().getString(COUNTED_METHODS_EXCLUDE_CONFIG)); + for (Map.Entry> entry : excludedMethods.entrySet()) { + String className = entry.getKey(); + ElementMatcher.Junction matcher = + isDeclaredBy(ElementMatchers.named(className)); + + Set methodNames = entry.getValue(); + if (!methodNames.isEmpty()) { + matcher = matcher.and(namedOneOf(methodNames.toArray(new String[0]))); + } + + result = result.or(matcher); + } + + return result; + } + + private AnnotationExcludedMethods() {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java new file mode 100644 index 000000000000..62c1172ea7e4 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java @@ -0,0 +1,123 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import application.io.opentelemetry.instrumentation.annotations.Counted; +import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.internal.StringUtils; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.Meter; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public final class CountedHelper { + + private static final String INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotation-counted"; + private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; + private static final ConcurrentMap COUNTERS = new ConcurrentHashMap<>(); + private static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); + + private static void extractMetricAttributes( + MethodRequest methodRequest, AttributesBuilder attributesBuilder) { + Parameter[] parameters = methodRequest.method().getParameters(); + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { + MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); + String attributeKey = ""; + if (!StringUtils.isNullOrEmpty(annotation.value())) { + attributeKey = annotation.value(); + } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { + attributeKey = parameters[i].getName(); + } else { + continue; + } + attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); + } + } + } + + private static void extractAdditionAttributes( + String[] attributes, AttributesBuilder attributesBuilder) { + int length = attributes.length; + for (int i = 0; i + 1 < length; i += 2) { + attributesBuilder.put(attributes[i], attributes[i + 1]); + } + } + + public static void recordCountWithAttributes( + MethodRequest methodRequest, Object returnValue, Throwable throwable) { + Counted countedAnnotation = methodRequest.method().getAnnotation(Counted.class); + AttributesBuilder attributesBuilder = + getCommonAttributesBuilder(countedAnnotation, returnValue, throwable); + extractMetricAttributes(methodRequest, attributesBuilder); + getCounter(methodRequest.method()).add(1, attributesBuilder.build()); + } + + public static void recordCount(Method method, Object returnValue, Throwable throwable) { + Counted countedAnnotation = method.getAnnotation(Counted.class); + AttributesBuilder attributesBuilder = + getCommonAttributesBuilder(countedAnnotation, returnValue, throwable); + getCounter(method).add(1, attributesBuilder.build()); + } + + private static AttributesBuilder getCommonAttributesBuilder( + Counted countedAnnotation, Object returnValue, Throwable throwable) { + AttributesBuilder attributesBuilder = Attributes.builder(); + extractAdditionAttributes(countedAnnotation.additionalAttributes(), attributesBuilder); + extractReturnValue(countedAnnotation, returnValue, attributesBuilder); + extractException(throwable, attributesBuilder); + return attributesBuilder; + } + + private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { + if (null != throwable) { + attributesBuilder.put("exception", throwable.getClass().getName()); + } + } + + private static void extractReturnValue( + Counted countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { + if (null != countedAnnotation.returnValueAttribute() + && !countedAnnotation.returnValueAttribute().isEmpty()) { + attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); + } + } + + private static LongCounter getCounter(Method method) { + Counted countedAnnotation = method.getAnnotation(Counted.class); + String metricName = + (null == countedAnnotation.value() || countedAnnotation.value().isEmpty()) + ? COUNTED_DEFAULT_NAME + : countedAnnotation.value(); + if (!COUNTERS.containsKey(metricName)) { + synchronized (metricName) { + if (!COUNTERS.containsKey(metricName)) { + LongCounter longCounter = null; + if (COUNTED_DEFAULT_NAME.equals(metricName)) { + longCounter = METER.counterBuilder(metricName).build(); + } else { + longCounter = + METER + .counterBuilder(metricName) + .setDescription(countedAnnotation.description()) + .setUnit(countedAnnotation.unit()) + .build(); + } + COUNTERS.put(metricName, longCounter); + } + } + } + return COUNTERS.get(metricName); + } + + private CountedHelper() {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java new file mode 100644 index 000000000000..d8ef1a889539 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java @@ -0,0 +1,117 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import static io.opentelemetry.javaagent.instrumentation.counted.KotlinCoroutineUtil.isKotlinSuspendMethod; +import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; +import static net.bytebuddy.matcher.ElementMatchers.hasParameters; +import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.whereAny; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import java.lang.reflect.Method; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.annotation.AnnotationSource; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.implementation.bytecode.assign.Assigner; +import net.bytebuddy.matcher.ElementMatcher; + +public class CountedInstrumentation implements TypeInstrumentation { + + private final ElementMatcher.Junction annotatedMethodMatcher; + private final ElementMatcher.Junction annotatedParametersMatcher; + // this matcher matches all methods that should be excluded from transformation + private final ElementMatcher.Junction excludedMethodsMatcher; + + CountedInstrumentation() { + annotatedMethodMatcher = + isAnnotatedWith(named("application.io.opentelemetry.instrumentation.annotations.Counted")); + annotatedParametersMatcher = + hasParameters( + whereAny( + isAnnotatedWith( + named( + "application.io.opentelemetry.instrumentation.annotations.MetricAttribute")))); + // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation + excludedMethodsMatcher = + AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); + } + + @Override + public ElementMatcher typeMatcher() { + return declaresMethod(annotatedMethodMatcher); + } + + @Override + public void transform(TypeTransformer transformer) { + ElementMatcher.Junction countedMethods = + annotatedMethodMatcher.and(not(excludedMethodsMatcher)); + + ElementMatcher.Junction timedMethodsWithParameters = + countedMethods.and(annotatedParametersMatcher); + + ElementMatcher.Junction timedMethodsWithoutParameters = + countedMethods.and(not(annotatedParametersMatcher)); + + transformer.applyAdviceToMethod( + timedMethodsWithoutParameters, CountedInstrumentation.class.getName() + "$CountedAdvice"); + + // Only apply advice for tracing parameters as attributes if any of the parameters are annotated + // with @MetricsAttribute to avoid unnecessarily copying the arguments into an array. + transformer.applyAdviceToMethod( + timedMethodsWithParameters, + CountedInstrumentation.class.getName() + "$CountedAttributesAdvice"); + } + + @SuppressWarnings("unused") + public static class CountedAttributesAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Origin Method originMethod, + @Advice.Local("otelMethod") Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Local("otelRequest") MethodRequest request) { + + // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it + // to local variable so that there would be only one call to Class.getMethod. + method = originMethod; + request = new MethodRequest(method, args); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void onExit( + @Advice.Local("otelMethod") Method method, + @Advice.Local("otelRequest") MethodRequest request, + @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, + @Advice.Thrown Throwable throwable) { + CountedHelper.recordCountWithAttributes(request, returnValue, throwable); + } + } + + @SuppressWarnings("unused") + public static class CountedAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Origin Method originMethod, @Advice.Local("otelMethod") Method method) { + // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it + // to local variable so that there would be only one call to Class.getMethod. + method = originMethod; + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void onExit( + @Advice.Local("otelMethod") Method method, + @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, + @Advice.Thrown Throwable throwable) { + CountedHelper.recordCount(method, returnValue, throwable); + } + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java new file mode 100644 index 000000000000..c61f13f3bbca --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java @@ -0,0 +1,44 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +/** + * Instrumentation for methods annotated with {@link Counted} or {@link MetricAttribute} + * annotations. + */ +@AutoService(InstrumentationModule.class) +public class CountedInstrumentationModule extends InstrumentationModule { + + public CountedInstrumentationModule() { + super("opentelemetry-instrumentation-annotation-counted", "counted"); + } + + @Override + public int order() { + // Run first to ensure other automatic instrumentation is added after and therefore is executed + // earlier in the instrumented method and create the span to attach attributes to. + return -1000; + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("application.io.opentelemetry.instrumentation.annotations.Counted"); + } + + @Override + public List typeInstrumentations() { + return asList(new CountedInstrumentation()); + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java new file mode 100644 index 000000000000..557cc436498f --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import static net.bytebuddy.matcher.ElementMatchers.returns; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.method.ParameterList; +import net.bytebuddy.matcher.ElementMatcher; + +public final class KotlinCoroutineUtil { + + private KotlinCoroutineUtil() {} + + public static ElementMatcher isKotlinSuspendMethod() { + // kotlin suspend methods return Object and take kotlin.coroutines.Continuation as last argument + return returns(Object.class) + .and( + target -> { + ParameterList parameterList = target.getParameters(); + if (!parameterList.isEmpty()) { + String lastParameter = + parameterList.get(parameterList.size() - 1).getType().asErasure().getName(); + return "kotlin.coroutines.Continuation".equals(lastParameter); + } + return false; + }); + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java new file mode 100644 index 000000000000..8c151492d882 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.counted; + +import java.lang.reflect.Method; + +public final class MethodRequest { + private final Method method; + private final Object[] args; + + public MethodRequest(Method method, Object[] args) { + this.method = method; + this.args = args; + } + + public Method method() { + return this.method; + } + + public Object[] args() { + return this.args; + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java new file mode 100644 index 000000000000..801f4a10988f --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java @@ -0,0 +1,60 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.test.annotations.counted; + +import io.opentelemetry.instrumentation.annotations.Counted; + +public class CountedExample { + + public static final String ANOTHER_NAME_COUNT = "another.name.count"; + public static final String METRIC_DESCRIPTION = "I am the description."; + public static final String METRIC_UNIT = "ms"; + public static final String RETURN_STRING = "I am a return string."; + + @Counted + public void defaultExample() {} + + @Counted(ANOTHER_NAME_COUNT) + public void exampleWithAnotherName() {} + + @Counted(description = METRIC_DESCRIPTION) + public void exampleWithDescriptionAndDefaultValue() {} + + @Counted(unit = METRIC_UNIT) + public void exampleWithUnitAndDefaultValue() {} + + @Counted(value = "example.with.description.count", description = METRIC_DESCRIPTION) + public void exampleWithDescription() {} + + @Counted(value = "example.with.unit.count", unit = METRIC_UNIT) + public void exampleWithUnit() {} + + @Counted(additionalAttributes = {"key1", "value1", "key2", "value2"}) + public void exampleWithAdditionalAttributes1() {} + + @Counted(additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) + public void exampleWithAdditionalAttributes2() {} + + @Counted(returnValueAttribute = "returnValue") + public ReturnObject exampleWithReturnValueAttribute() { + return new ReturnObject(); + } + + @Counted + public void exampleWithException() { + throw new IllegalStateException("test exception."); + } + + @Counted + public void exampleIgnore() {} + + public static class ReturnObject { + @Override + public String toString() { + return RETURN_STRING; + } + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java new file mode 100644 index 000000000000..f3796189c73f --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java @@ -0,0 +1,171 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.test.annotations.counted; + +import static io.opentelemetry.test.annotations.counted.CountedExample.ANOTHER_NAME_COUNT; +import static io.opentelemetry.test.annotations.counted.CountedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.test.annotations.counted.CountedExample.METRIC_UNIT; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class CountedInstrumentationTest { + + @RegisterExtension + public static final AgentInstrumentationExtension testing = + AgentInstrumentationExtension.create(); + + public static final String INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotation-counted"; + + public static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; + + @Test + void testDefaultExample() { + new CountedExample().defaultExample(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME)); + } + + @Test + void testExampleWithAnotherName() { + new CountedExample().exampleWithAnotherName(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, metric -> metric.hasName(ANOTHER_NAME_COUNT)); + } + + @Test + void testExampleWithDescriptionAndDefaultValue() { + new CountedExample().exampleWithDescriptionAndDefaultValue(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasDescription("")); + } + + @Test + void testExampleWithUnitAndDefaultValue() { + new CountedExample().exampleWithUnitAndDefaultValue(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasUnit("")); + } + + @Test + void testExampleWithDescription() { + new CountedExample().exampleWithDescription(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric.hasName("example.with.description.count").hasDescription(METRIC_DESCRIPTION)); + } + + @Test + void testExampleWithUnit() { + new CountedExample().exampleWithUnit(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> metric.hasName("example.with.unit.count").hasUnit(METRIC_UNIT)); + } + + @Test + void testExampleWithAdditionalAttributes1() { + new CountedExample().exampleWithAdditionalAttributes1(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName(COUNTED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2")))); + })); + } + + @Test + void testExampleWithAdditionalAttributes2() { + new CountedExample().exampleWithAdditionalAttributes2(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName(COUNTED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key2"))) + && null + == p.getAttributes().get(AttributeKey.stringKey("key3"))); + })); + } + + @Test + void testExampleWithReturnAttribute() { + new CountedExample().exampleWithReturnValueAttribute(); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName(COUNTED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + CountedExample.RETURN_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))); + })); + } + + @Test + void testExampleWithException() { + try { + new CountedExample().exampleWithException(); + } catch (IllegalStateException e) { + // noop + } + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName(COUNTED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + IllegalStateException.class + .getName() + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("exception")))); + })); + } + + @Test + void testExampleIgnore() throws Exception { + new CountedExample().exampleIgnore(); + Thread.sleep(500); // sleep a bit just to make sure no metric is captured + assertThat(testing.metrics()).isEmpty(); + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md b/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md new file mode 100644 index 000000000000..a16004d9f4dd --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md @@ -0,0 +1,5 @@ +# Settings for the OpenTelemetry Timed Instrumentation Annotations integration + +| Environment variable | Type | Default | Description | +|-----------------------------------------------------------------------------------------| ------ | ------- |-----------------------------------------------------------------------------------| +| `otel.instrumentation.opentelemetry-instrumentation-annotation-Timed.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by Timed annotation advices. | diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts new file mode 100644 index 000000000000..ce5402c4d69c --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +// note that muzzle is not run against the current SNAPSHOT instrumentation-annotations, but this is +// ok because the tests are run against the current SNAPSHOT instrumentation-annotations which will +// catch any muzzle issues in SNAPSHOT instrumentation-annotations + +muzzle { + pass { + group.set("io.opentelemetry") + module.set("opentelemetry-instrumentation-annotations") + versions.set("(,)") + } +} + +dependencies { + compileOnly(project(":instrumentation-annotations-support")) + + compileOnly(project(":javaagent-tooling")) + + // this instrumentation needs to do similar shading dance as opentelemetry-api-1.0 because + // the @WithSpan annotation references the OpenTelemetry API's SpanKind class + // + // see the comment in opentelemetry-api-1.0.gradle for more details + compileOnly(project(":opentelemetry-instrumentation-annotations-shaded-for-instrumenting", configuration = "shadow")) + + // Used by byte-buddy but not brought in as a transitive dependency. + compileOnly("com.google.code.findbugs:annotations") + testCompileOnly("com.google.code.findbugs:annotations") + + testImplementation(project(":instrumentation-annotations")) + testImplementation(project(":instrumentation-annotations-support")) + testImplementation("net.bytebuddy:byte-buddy") +} + +tasks { + compileTestJava { + options.compilerArgs.add("-parameters") + } + test { + jvmArgs( + "-Dotel.instrumentation.opentelemetry-instrumentation-annotation-timed.exclude-methods=io.opentelemetry.test.annotations.timed.TimedExample[exampleIgnore]" + ) + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java new file mode 100644 index 000000000000..ea14c24f8aa0 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.none; + +import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; +import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; +import java.util.Map; +import java.util.Set; +import net.bytebuddy.description.ByteCodeElement; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +public final class AnnotationExcludedMethods { + + private static final String TIMED_METHODS_EXCLUDE_CONFIG = + "otel.instrumentation.opentelemetry-instrumentation-annotation-timed.exclude-methods"; + + /* + Returns a matcher for all methods that should be excluded from auto-instrumentation by + annotation-based advices. + */ + public static ElementMatcher.Junction configureExcludedMethods() { + ElementMatcher.Junction result = none(); + + Map> excludedMethods = + MethodsConfigurationParser.parse( + InstrumentationConfig.get().getString(TIMED_METHODS_EXCLUDE_CONFIG)); + for (Map.Entry> entry : excludedMethods.entrySet()) { + String className = entry.getKey(); + ElementMatcher.Junction matcher = + isDeclaredBy(ElementMatchers.named(className)); + + Set methodNames = entry.getValue(); + if (!methodNames.isEmpty()) { + matcher = matcher.and(namedOneOf(methodNames.toArray(new String[0]))); + } + + result = result.or(matcher); + } + + return result; + } + + private AnnotationExcludedMethods() {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java new file mode 100644 index 000000000000..c0e0e6c31379 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import static net.bytebuddy.matcher.ElementMatchers.returns; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.method.ParameterList; +import net.bytebuddy.matcher.ElementMatcher; + +public final class KotlinCoroutineUtil { + + private KotlinCoroutineUtil() {} + + public static ElementMatcher isKotlinSuspendMethod() { + // kotlin suspend methods return Object and take kotlin.coroutines.Continuation as last argument + return returns(Object.class) + .and( + target -> { + ParameterList parameterList = target.getParameters(); + if (!parameterList.isEmpty()) { + String lastParameter = + parameterList.get(parameterList.size() - 1).getType().asErasure().getName(); + return "kotlin.coroutines.Continuation".equals(lastParameter); + } + return false; + }); + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java new file mode 100644 index 000000000000..352e65d06611 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import java.lang.reflect.Method; + +public final class MethodRequest { + private final Method method; + private final Object[] args; + + public MethodRequest(Method method, Object[] args) { + this.method = method; + this.args = args; + } + + public Method method() { + return this.method; + } + + public Object[] args() { + return this.args; + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java new file mode 100644 index 000000000000..deaa1c21b306 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java @@ -0,0 +1,163 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import static java.util.concurrent.TimeUnit.MICROSECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; +import static java.util.concurrent.TimeUnit.SECONDS; + +import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.Timed; +// import io.opentelemetry.javaagent.instrumentation.timed.annotations.Timed; +// import io.opentelemetry.javaagent.instrumentation.timed.annotations.MetricAttribute; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.internal.StringUtils; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.Meter; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; + +public final class TimedHelper { + + private static final String INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotation-timed"; + private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; + + private static final ConcurrentMap HISTOGRAMS = + new ConcurrentHashMap<>(); + + private static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); + + private static void extractMetricAttributes( + MethodRequest methodRequest, AttributesBuilder attributesBuilder) { + Parameter[] parameters = methodRequest.method().getParameters(); + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { + MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); + String attributeKey = ""; + if (!StringUtils.isNullOrEmpty(annotation.value())) { + attributeKey = annotation.value(); + } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { + attributeKey = parameters[i].getName(); + } else { + continue; + } + attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); + } + } + } + + private static void extractAdditionAttributes( + String[] attributes, AttributesBuilder attributesBuilder) { + int length = attributes.length; + for (int i = 0; i + 1 < length; i += 2) { + attributesBuilder.put(attributes[i], attributes[i + 1]); + } + } + + public static void recordHistogramWithAttributes( + MethodRequest methodRequest, Throwable throwable, Object returnValue, long startNanoTime) { + Timed timedAnnotation = methodRequest.method().getAnnotation(Timed.class); + AttributesBuilder attributesBuilder = + getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); + double duration = getTransformedDuration(startNanoTime, timedAnnotation); + extractMetricAttributes(methodRequest, attributesBuilder); + getHistogram(timedAnnotation).record(duration, attributesBuilder.build()); + } + + public static void recordHistogram( + Method method, Throwable throwable, Object returnValue, long startNanoTime) { + Timed timedAnnotation = method.getAnnotation(Timed.class); + AttributesBuilder attributesBuilder = + getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); + double duration = getTransformedDuration(startNanoTime, timedAnnotation); + getHistogram(timedAnnotation).record(duration, attributesBuilder.build()); + } + + private static AttributesBuilder getCommonAttributeBuilder( + Throwable throwable, Object returnValue, Timed timedAnnotation) { + AttributesBuilder attributesBuilder = Attributes.builder(); + extractAdditionAttributes(timedAnnotation.additionalAttributes(), attributesBuilder); + extractReturnValue(timedAnnotation, returnValue, attributesBuilder); + extractException(throwable, attributesBuilder); + return attributesBuilder; + } + + private static double getTransformedDuration(long startNanoTime, Timed timedAnnotation) { + TimeUnit unit = extractTimeUnit(timedAnnotation); + long nanoDelta = System.nanoTime() - startNanoTime; + double duration = unit.convert(nanoDelta, NANOSECONDS); + return duration; + } + + private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { + if (null != throwable) { + attributesBuilder.put("exception", throwable.getClass().getName()); + } + } + + private static void extractReturnValue( + Timed countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { + if (null != countedAnnotation.returnValueAttribute() + && !countedAnnotation.returnValueAttribute().isEmpty()) { + attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); + } + } + + private static DoubleHistogram getHistogram(Timed timedAnnotation) { + String metricName = + (null == timedAnnotation.value() || timedAnnotation.value().isEmpty()) + ? TIMED_DEFAULT_NAME + : timedAnnotation.value(); + if (!HISTOGRAMS.containsKey(metricName)) { + synchronized (metricName) { + if (!HISTOGRAMS.containsKey(metricName)) { + DoubleHistogram doubleHistogram = null; + if (TIMED_DEFAULT_NAME.equals(metricName)) { + doubleHistogram = METER.histogramBuilder(metricName).build(); + } else { + String unitStr = extractUnitStr(timedAnnotation); + doubleHistogram = + METER + .histogramBuilder(metricName) + .setDescription(timedAnnotation.description()) + .setUnit(unitStr) + .build(); + } + HISTOGRAMS.put(metricName, doubleHistogram); + } + } + } + return HISTOGRAMS.get(metricName); + } + + private static TimeUnit extractTimeUnit(Timed timedAnnotation) { + if (null == timedAnnotation.unit()) { + return TimeUnit.MILLISECONDS; + } + return timedAnnotation.unit(); + } + + private static String extractUnitStr(Timed timedAnnotation) { + switch (timedAnnotation.unit()) { + case NANOSECONDS: + return "ns"; + case MICROSECONDS: + return "µs"; + case SECONDS: + return "s"; + default: + return "ms"; + } + } + + private TimedHelper() {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java new file mode 100644 index 000000000000..af92a66287c7 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java @@ -0,0 +1,125 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import static io.opentelemetry.javaagent.instrumentation.timed.KotlinCoroutineUtil.isKotlinSuspendMethod; +import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; +import static net.bytebuddy.matcher.ElementMatchers.hasParameters; +import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.whereAny; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import java.lang.reflect.Method; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.annotation.AnnotationSource; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.implementation.bytecode.assign.Assigner; +import net.bytebuddy.matcher.ElementMatcher; + +public class TimedInstrumentation implements TypeInstrumentation { + + private final ElementMatcher.Junction annotatedMethodMatcher; + private final ElementMatcher.Junction annotatedParametersMatcher; + // this matcher matches all methods that should be excluded from transformation + private final ElementMatcher.Junction excludedMethodsMatcher; + + TimedInstrumentation() { + annotatedMethodMatcher = + isAnnotatedWith(named("application.io.opentelemetry.instrumentation.annotations.Timed")); + annotatedParametersMatcher = + hasParameters( + whereAny( + isAnnotatedWith( + named( + "application.io.opentelemetry.instrumentation.annotations.MetricAttribute")))); + // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation + excludedMethodsMatcher = + AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); + } + + @Override + public ElementMatcher typeMatcher() { + return declaresMethod(annotatedMethodMatcher); + } + + @Override + public void transform(TypeTransformer transformer) { + ElementMatcher.Junction timedMethods = + annotatedMethodMatcher.and(not(excludedMethodsMatcher)); + + ElementMatcher.Junction timedMethodsWithParameters = + timedMethods.and(annotatedParametersMatcher); + + ElementMatcher.Junction timedMethodsWithoutParameters = + timedMethods.and(not(annotatedParametersMatcher)); + + transformer.applyAdviceToMethod( + timedMethodsWithoutParameters, TimedInstrumentation.class.getName() + "$TimedAdvice"); + + // Only apply advice for tracing parameters as attributes if any of the parameters are annotated + // with @MetricsAttribute to avoid unnecessarily copying the arguments into an array. + transformer.applyAdviceToMethod( + timedMethodsWithParameters, + TimedInstrumentation.class.getName() + "$TimedAttributesAdvice"); + } + + @SuppressWarnings("unused") + public static class TimedAttributesAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Origin Method originMethod, + @Advice.Local("otelMethod") Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Local("otelRequest") MethodRequest request, + @Advice.Local("startNanoTime") long startNanoTime) { + + // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it + // to local variable so that there would be only one call to Class.getMethod. + method = originMethod; + request = new MethodRequest(method, args); + startNanoTime = System.nanoTime(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void onExit( + @Advice.Local("otelMethod") Method method, + @Advice.Local("otelRequest") MethodRequest request, + @Advice.Local("startNanoTime") long startNanoTime, + @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, + @Advice.Thrown Throwable throwable) { + TimedHelper.recordHistogramWithAttributes(request, throwable, returnValue, startNanoTime); + } + } + + @SuppressWarnings("unused") + public static class TimedAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Origin Method originMethod, + @Advice.Local("otelMethod") Method method, + @Advice.Local("startNanoTime") long startNanoTime) { + // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it + // to local variable so that there would be only one call to Class.getMethod. + method = originMethod; + startNanoTime = System.nanoTime(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void onExit( + @Advice.Local("otelMethod") Method method, + @Advice.Local("startNanoTime") long startNanoTime, + @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, + @Advice.Thrown Throwable throwable) { + TimedHelper.recordHistogram(method, throwable, returnValue, startNanoTime); + } + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java new file mode 100644 index 000000000000..c8cd222d2810 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.timed; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +/** + * Instrumentation for methods annotated with {@link Timed} and {@link MetricAttribute} annotations. + */ +@AutoService(InstrumentationModule.class) +public class TimedInstrumentationModule extends InstrumentationModule { + + public TimedInstrumentationModule() { + super("opentelemetry-instrumentation-annotation-timed", "timed"); + } + + @Override + public int order() { + // Run first to ensure other automatic instrumentation is added after and therefore is executed + // earlier in the instrumented method and create the span to attach attributes to. + return -1000; + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("application.io.opentelemetry.instrumentation.annotations.Timed"); + } + + @Override + public List typeInstrumentations() { + return asList(new TimedInstrumentation()); + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java new file mode 100644 index 000000000000..db5ee37d0020 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java @@ -0,0 +1,61 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.test.annotations.timed; + +import io.opentelemetry.instrumentation.annotations.Timed; +import java.util.concurrent.TimeUnit; + +public class TimedExample { + public static final String ANOTHER_NAME_HISTOGRAM = "another.name.duration"; + public static final String METRIC_DESCRIPTION = "I am the description."; + public static final String RETURN_STRING = "I am a return string."; + + @Timed + public void defaultExample() {} + + @Timed(ANOTHER_NAME_HISTOGRAM) + public void exampleWithAnotherName() {} + + @Timed(description = METRIC_DESCRIPTION) + public void exampleWithDescriptionAndDefaultValue() {} + + @Timed(unit = TimeUnit.MICROSECONDS) + public void exampleWithUnitUSAndDefaultValue() {} + + @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) + public void exampleWithDescription() {} + + @Timed(value = "example.with.unit.duration", unit = TimeUnit.SECONDS) + public void exampleWithUnitSecondAnd2SecondLatency() throws InterruptedException { + Thread.sleep(2000); + } + + @Timed(additionalAttributes = {"key1", "value1", "key2", "value2"}) + public void exampleWithAdditionalAttributes1() {} + + @Timed(additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) + public void exampleWithAdditionalAttributes2() {} + + @Timed + public void exampleIgnore() {} + + @Timed + public void exampleWithException() { + throw new IllegalStateException("test"); + } + + @Timed(returnValueAttribute = "returnValue") + public ReturnObject exampleWithReturnValueAttribute() { + return new ReturnObject(); + } + + public static class ReturnObject { + @Override + public String toString() { + return RETURN_STRING; + } + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java new file mode 100644 index 000000000000..7456007eca30 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java @@ -0,0 +1,179 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.test.annotations.timed; + +import static io.opentelemetry.test.annotations.timed.TimedExample.ANOTHER_NAME_HISTOGRAM; +import static io.opentelemetry.test.annotations.timed.TimedExample.METRIC_DESCRIPTION; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class TimedInstrumentationTest { + + @RegisterExtension + public static final AgentInstrumentationExtension testing = + AgentInstrumentationExtension.create(); + + public static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; + + public static final String TIMED_INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotation-timed"; + + @Test + void testDefaultExample() { + new TimedExample().defaultExample(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME)); + } + + @Test + void testExampleWithAnotherName() { + new TimedExample().exampleWithAnotherName(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(ANOTHER_NAME_HISTOGRAM)); + } + + @Test + void testExampleWithDescriptionAndDefaultValue() { + new TimedExample().exampleWithDescriptionAndDefaultValue(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> metric.hasName(TIMED_DEFAULT_NAME).hasDescription("")); + } + + @Test + void testExampleWithUnitUSAndDefaultValue() { + new TimedExample().exampleWithUnitUSAndDefaultValue(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME).hasUnit("")); + } + + @Test + void testExampleWithDescription() { + new TimedExample().exampleWithDescription(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric.hasName("example.with.description.duration").hasDescription(METRIC_DESCRIPTION)); + } + + @Test + void testExampleWithUnitSecondAnd2SecondLatency() throws InterruptedException { + new TimedExample().exampleWithUnitSecondAnd2SecondLatency(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName("example.with.unit.duration") + .hasUnit("s") + .satisfies( + metricData -> { + assertThat(metricData.getHistogramData().getPoints()) + .allMatch(p -> p.getMax() < 5 && p.getMin() > 0); + })); + } + + @Test + void testExampleWithAdditionalAttributes1() { + new TimedExample().exampleWithAdditionalAttributes1(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName(TIMED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2")))); + })); + } + + @Test + void testExampleWithAdditionalAttributes2() { + new TimedExample().exampleWithAdditionalAttributes2(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName(TIMED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes().get(AttributeKey.stringKey("key2"))) + && null + == p.getAttributes().get(AttributeKey.stringKey("key3"))); + })); + } + + @Test + void testExampleIgnore() throws Exception { + new TimedExample().exampleIgnore(); + Thread.sleep(500); + assertThat(testing.metrics()).isEmpty(); + } + + @Test + void testExampleWithException() { + try { + new TimedExample().exampleWithException(); + } catch (IllegalStateException e) { + // noop + } + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName(TIMED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + IllegalStateException.class + .getName() + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("exception")))); + })); + } + + @Test + void testExampleWithReturnValueAttribute() { + new TimedExample().exampleWithReturnValueAttribute(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName(TIMED_DEFAULT_NAME) + .satisfies( + metricData -> { + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + TimedExample.RETURN_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))); + })); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index edb133b4a1f0..b09e868c7ba9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -433,6 +433,8 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.37:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent") include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent") include(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotation-counted:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotation-timed:javaagent") include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:testing") From ff05043d97372e00ab1dbc688172888aadd95071 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 9 Jun 2024 13:29:14 +0800 Subject: [PATCH 02/51] support returnValueAttribute and exception attribtue for Timed and Counted --- .../opentelemetry-instrumentation-annotations.txt | 2 +- .../javaagent/instrumentation/timed/TimedHelper.java | 4 +--- .../instrumentation/timed/TimedInstrumentationModule.java | 2 ++ .../opentelemetry/test/annotations/timed/TimedExample.java | 4 ++-- .../test/annotations/timed/TimedInstrumentationTest.java | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index 8c4c7b6c6a37..76f15ce4c21f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,4 +1,4 @@ -Comparing source compatibility of against +Comparing source compatibility of opentelemetry-instrumentation-annotations-2.5.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.4.0.jar +++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.Counted (not serializable) +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. +++ NEW INTERFACE: java.lang.annotation.Annotation diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java index deaa1c21b306..a93e54bb3f33 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java @@ -11,8 +11,6 @@ import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; import application.io.opentelemetry.instrumentation.annotations.Timed; -// import io.opentelemetry.javaagent.instrumentation.timed.annotations.Timed; -// import io.opentelemetry.javaagent.instrumentation.timed.annotations.MetricAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -122,7 +120,7 @@ private static DoubleHistogram getHistogram(Timed timedAnnotation) { if (!HISTOGRAMS.containsKey(metricName)) { DoubleHistogram doubleHistogram = null; if (TIMED_DEFAULT_NAME.equals(metricName)) { - doubleHistogram = METER.histogramBuilder(metricName).build(); + doubleHistogram = METER.histogramBuilder(metricName).setUnit("ms").build(); } else { String unitStr = extractUnitStr(timedAnnotation); doubleHistogram = diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java index c8cd222d2810..f5bbb9e0ecf6 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java @@ -8,6 +8,8 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; +import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.Timed; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java index db5ee37d0020..baa872fa1f26 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java @@ -22,8 +22,8 @@ public void exampleWithAnotherName() {} @Timed(description = METRIC_DESCRIPTION) public void exampleWithDescriptionAndDefaultValue() {} - @Timed(unit = TimeUnit.MICROSECONDS) - public void exampleWithUnitUSAndDefaultValue() {} + @Timed(unit = TimeUnit.NANOSECONDS) + public void exampleWithUnitNanoSecondAndDefaultValue() {} @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java index 7456007eca30..f93aba564aa3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java @@ -48,10 +48,10 @@ void testExampleWithDescriptionAndDefaultValue() { } @Test - void testExampleWithUnitUSAndDefaultValue() { - new TimedExample().exampleWithUnitUSAndDefaultValue(); + void testExampleWithUnitNanoSecondAndDefaultValue() { + new TimedExample().exampleWithUnitNanoSecondAndDefaultValue(); testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME).hasUnit("")); + TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME).hasUnit("ms")); } @Test From f5d339f87a3609c480aa325817487beab0fc33bd Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Jun 2024 16:28:41 +0300 Subject: [PATCH 03/51] move timed and counted instrumentation into same gradle module --- .../javaagent/build.gradle.kts | 2 +- .../counted/AnnotationExcludedMethods.java | 53 ------------------- .../counted/KotlinCoroutineUtil.java | 32 ----------- .../counted/MethodRequest.java | 26 --------- .../timed/AnnotationExcludedMethods.java | 53 ------------------- .../timed/KotlinCoroutineUtil.java | 32 ----------- .../instrumentation/timed/MethodRequest.java | 26 --------- .../README.md | 0 .../javaagent/build.gradle.kts | 2 +- .../AddingSpanAttributesInstrumentation.java | 0 .../AnnotationInstrumentationModule.java | 0 .../AnnotationSingletons.java | 0 .../MethodCodeAttributesGetter.java | 0 .../MethodRequestCodeAttributesGetter.java | 0 .../WithSpanInstrumentation.java | 0 ...hSpanParameterAttributeNamesExtractor.java | 0 ...dingSpanAttributesInstrumentationTest.java | 0 ...ctAttributesUsingAddingSpanAttributes.java | 0 .../test/annotation/TracedWithSpan.java | 0 .../WithSpanInstrumentationTest.java | 0 .../javaagent/build.gradle.kts | 9 +--- .../counted/CountedHelper.java | 1 + .../counted/CountedInstrumentation.java | 4 +- .../counted/CountedInstrumentationModule.java | 2 + .../instrumentation/timed/TimedHelper.java | 3 +- .../timed/TimedInstrumentation.java | 4 +- .../timed/TimedInstrumentationModule.java | 0 .../annotations/counted/CountedExample.java | 0 .../counted/CountedInstrumentationTest.java | 0 .../test/annotations/timed/TimedExample.java | 0 .../timed/TimedInstrumentationTest.java | 0 .../javaagent/build.gradle.kts | 9 ++++ .../AnnotationExcludedMethods.java | 0 .../KotlinCoroutineUtil.java | 0 .../MethodRequest.java | 0 javaagent/build.gradle.kts | 3 +- settings.gradle.kts | 6 +-- 37 files changed, 28 insertions(+), 239 deletions(-) delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java rename instrumentation/{opentelemetry-instrumentation-annotations-1.16 => opentelemetry-instrumentation-annotations}/README.md (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts (91%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AddingSpanAttributesInstrumentation.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationInstrumentationModule.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodCodeAttributesGetter.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequestCodeAttributesGetter.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanParameterAttributeNamesExtractor.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/AddingSpanAttributesInstrumentationTest.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/ExtractAttributesUsingAddingSpanAttributes.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/TracedWithSpan.java (100%) rename instrumentation/{ => opentelemetry-instrumentation-annotations}/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/WithSpanInstrumentationTest.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/build.gradle.kts (78%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java (98%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java (94%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java (90%) rename instrumentation/{opentelemetry-instrumentation-annotation-timed => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java (98%) rename instrumentation/{opentelemetry-instrumentation-annotation-timed => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java (94%) rename instrumentation/{opentelemetry-instrumentation-annotation-timed => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotation-counted => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotation-timed => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotation-timed => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6}/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java (100%) create mode 100644 instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/build.gradle.kts rename instrumentation/{opentelemetry-instrumentation-annotations-1.16 => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotations-1.16 => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/KotlinCoroutineUtil.java (100%) rename instrumentation/{opentelemetry-instrumentation-annotations-1.16 => opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequest.java (100%) diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/build.gradle.kts b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/build.gradle.kts index 3e1be05c41ff..8d937d750112 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/build.gradle.kts +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/build.gradle.kts @@ -30,7 +30,7 @@ dependencies { implementation("org.ow2.asm:asm-tree") implementation("org.ow2.asm:asm-util") - implementation(project(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")) + implementation(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent")) testInstrumentation(project(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent")) testInstrumentation(project(":instrumentation:reactor:reactor-3.1:javaagent")) diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java deleted file mode 100644 index c5496df8cf4a..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/AnnotationExcludedMethods.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.counted; - -import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; -import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; -import static net.bytebuddy.matcher.ElementMatchers.none; - -import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; -import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; -import java.util.Map; -import java.util.Set; -import net.bytebuddy.description.ByteCodeElement; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -public final class AnnotationExcludedMethods { - - private static final String COUNTED_METHODS_EXCLUDE_CONFIG = - "otel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods"; - - /* - Returns a matcher for all methods that should be excluded from auto-instrumentation by - annotation-based advices. - */ - public static ElementMatcher.Junction configureExcludedMethods() { - ElementMatcher.Junction result = none(); - - Map> excludedMethods = - MethodsConfigurationParser.parse( - InstrumentationConfig.get().getString(COUNTED_METHODS_EXCLUDE_CONFIG)); - for (Map.Entry> entry : excludedMethods.entrySet()) { - String className = entry.getKey(); - ElementMatcher.Junction matcher = - isDeclaredBy(ElementMatchers.named(className)); - - Set methodNames = entry.getValue(); - if (!methodNames.isEmpty()) { - matcher = matcher.and(namedOneOf(methodNames.toArray(new String[0]))); - } - - result = result.or(matcher); - } - - return result; - } - - private AnnotationExcludedMethods() {} -} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java deleted file mode 100644 index 557cc436498f..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/KotlinCoroutineUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.counted; - -import static net.bytebuddy.matcher.ElementMatchers.returns; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.method.ParameterList; -import net.bytebuddy.matcher.ElementMatcher; - -public final class KotlinCoroutineUtil { - - private KotlinCoroutineUtil() {} - - public static ElementMatcher isKotlinSuspendMethod() { - // kotlin suspend methods return Object and take kotlin.coroutines.Continuation as last argument - return returns(Object.class) - .and( - target -> { - ParameterList parameterList = target.getParameters(); - if (!parameterList.isEmpty()) { - String lastParameter = - parameterList.get(parameterList.size() - 1).getType().asErasure().getName(); - return "kotlin.coroutines.Continuation".equals(lastParameter); - } - return false; - }); - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java b/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java deleted file mode 100644 index 8c151492d882..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/MethodRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.counted; - -import java.lang.reflect.Method; - -public final class MethodRequest { - private final Method method; - private final Object[] args; - - public MethodRequest(Method method, Object[] args) { - this.method = method; - this.args = args; - } - - public Method method() { - return this.method; - } - - public Object[] args() { - return this.args; - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java deleted file mode 100644 index ea14c24f8aa0..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/AnnotationExcludedMethods.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.timed; - -import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; -import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; -import static net.bytebuddy.matcher.ElementMatchers.none; - -import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; -import io.opentelemetry.javaagent.tooling.config.MethodsConfigurationParser; -import java.util.Map; -import java.util.Set; -import net.bytebuddy.description.ByteCodeElement; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -public final class AnnotationExcludedMethods { - - private static final String TIMED_METHODS_EXCLUDE_CONFIG = - "otel.instrumentation.opentelemetry-instrumentation-annotation-timed.exclude-methods"; - - /* - Returns a matcher for all methods that should be excluded from auto-instrumentation by - annotation-based advices. - */ - public static ElementMatcher.Junction configureExcludedMethods() { - ElementMatcher.Junction result = none(); - - Map> excludedMethods = - MethodsConfigurationParser.parse( - InstrumentationConfig.get().getString(TIMED_METHODS_EXCLUDE_CONFIG)); - for (Map.Entry> entry : excludedMethods.entrySet()) { - String className = entry.getKey(); - ElementMatcher.Junction matcher = - isDeclaredBy(ElementMatchers.named(className)); - - Set methodNames = entry.getValue(); - if (!methodNames.isEmpty()) { - matcher = matcher.and(namedOneOf(methodNames.toArray(new String[0]))); - } - - result = result.or(matcher); - } - - return result; - } - - private AnnotationExcludedMethods() {} -} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java deleted file mode 100644 index c0e0e6c31379..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/KotlinCoroutineUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.timed; - -import static net.bytebuddy.matcher.ElementMatchers.returns; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.method.ParameterList; -import net.bytebuddy.matcher.ElementMatcher; - -public final class KotlinCoroutineUtil { - - private KotlinCoroutineUtil() {} - - public static ElementMatcher isKotlinSuspendMethod() { - // kotlin suspend methods return Object and take kotlin.coroutines.Continuation as last argument - return returns(Object.class) - .and( - target -> { - ParameterList parameterList = target.getParameters(); - if (!parameterList.isEmpty()) { - String lastParameter = - parameterList.get(parameterList.size() - 1).getType().asErasure().getName(); - return "kotlin.coroutines.Continuation".equals(lastParameter); - } - return false; - }); - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java deleted file mode 100644 index 352e65d06611..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/MethodRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.timed; - -import java.lang.reflect.Method; - -public final class MethodRequest { - private final Method method; - private final Object[] args; - - public MethodRequest(Method method, Object[] args) { - this.method = method; - this.args = args; - } - - public Method method() { - return this.method; - } - - public Object[] args() { - return this.args; - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/README.md b/instrumentation/opentelemetry-instrumentation-annotations/README.md similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/README.md rename to instrumentation/opentelemetry-instrumentation-annotations/README.md diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts similarity index 91% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts index 6ea1548e4354..e9f6b111a94c 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/build.gradle.kts @@ -16,8 +16,8 @@ muzzle { dependencies { compileOnly(project(":instrumentation-annotations-support")) - compileOnly(project(":javaagent-tooling")) + implementation(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent")) // this instrumentation needs to do similar shading dance as opentelemetry-api-1.0 because // the @WithSpan annotation references the OpenTelemetry API's SpanKind class diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AddingSpanAttributesInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AddingSpanAttributesInstrumentation.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AddingSpanAttributesInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AddingSpanAttributesInstrumentation.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationInstrumentationModule.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationInstrumentationModule.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationInstrumentationModule.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationSingletons.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodCodeAttributesGetter.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodCodeAttributesGetter.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodCodeAttributesGetter.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodCodeAttributesGetter.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequestCodeAttributesGetter.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequestCodeAttributesGetter.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequestCodeAttributesGetter.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequestCodeAttributesGetter.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanParameterAttributeNamesExtractor.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanParameterAttributeNamesExtractor.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanParameterAttributeNamesExtractor.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanParameterAttributeNamesExtractor.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/AddingSpanAttributesInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/AddingSpanAttributesInstrumentationTest.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/AddingSpanAttributesInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/AddingSpanAttributesInstrumentationTest.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/ExtractAttributesUsingAddingSpanAttributes.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/ExtractAttributesUsingAddingSpanAttributes.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/ExtractAttributesUsingAddingSpanAttributes.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/ExtractAttributesUsingAddingSpanAttributes.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/TracedWithSpan.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/TracedWithSpan.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/TracedWithSpan.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/TracedWithSpan.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/WithSpanInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/WithSpanInstrumentationTest.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/WithSpanInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/test/java/io/opentelemetry/test/annotation/WithSpanInstrumentationTest.java diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts similarity index 78% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts index e20c13308be6..cca08e10ea34 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts @@ -16,8 +16,8 @@ muzzle { dependencies { compileOnly(project(":instrumentation-annotations-support")) - compileOnly(project(":javaagent-tooling")) + implementation(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent")) // this instrumentation needs to do similar shading dance as opentelemetry-api-1.0 because // the @WithSpan annotation references the OpenTelemetry API's SpanKind class @@ -25,13 +25,8 @@ dependencies { // see the comment in opentelemetry-api-1.0.gradle for more details compileOnly(project(":opentelemetry-instrumentation-annotations-shaded-for-instrumenting", configuration = "shadow")) - // Used by byte-buddy but not brought in as a transitive dependency. - compileOnly("com.google.code.findbugs:annotations") - testCompileOnly("com.google.code.findbugs:annotations") - testImplementation(project(":instrumentation-annotations")) testImplementation(project(":instrumentation-annotations-support")) - testImplementation("net.bytebuddy:byte-buddy") } tasks { @@ -40,7 +35,7 @@ tasks { } test { jvmArgs( - "-Dotel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods=io.opentelemetry.test.annotations.counted.CountedExample[exampleIgnore]" + "-Dotel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods=io.opentelemetry.test.annotations.counted.CountedExample[exampleIgnore];io.opentelemetry.test.annotations.timed.TimedExample[exampleIgnore]" ) } } diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java index 62c1172ea7e4..127773f92e55 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java @@ -13,6 +13,7 @@ import io.opentelemetry.api.internal.StringUtils; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.concurrent.ConcurrentHashMap; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java similarity index 94% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java index d8ef1a889539..f0b5c726902d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.counted; -import static io.opentelemetry.javaagent.instrumentation.counted.KotlinCoroutineUtil.isKotlinSuspendMethod; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.hasParameters; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; @@ -15,6 +15,8 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.AnnotationExcludedMethods; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.annotation.AnnotationSource; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java similarity index 90% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java index c61f13f3bbca..3617dcc2c322 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java @@ -8,6 +8,8 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; +import application.io.opentelemetry.instrumentation.annotations.Counted; +import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java index a93e54bb3f33..4b21ff189bbe 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java @@ -5,9 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.timed; -import static java.util.concurrent.TimeUnit.MICROSECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; import application.io.opentelemetry.instrumentation.annotations.Timed; @@ -17,6 +15,7 @@ import io.opentelemetry.api.internal.StringUtils; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.concurrent.ConcurrentHashMap; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java similarity index 94% rename from instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java index af92a66287c7..b5b21ff304c8 100644 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.timed; -import static io.opentelemetry.javaagent.instrumentation.timed.KotlinCoroutineUtil.isKotlinSuspendMethod; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.hasParameters; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; @@ -15,6 +15,8 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.AnnotationExcludedMethods; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.annotation.AnnotationSource; diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotation-counted/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/build.gradle.kts new file mode 100644 index 000000000000..8c365ac278a8 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +dependencies { + compileOnly(project(":instrumentation-annotations-support")) + + compileOnly(project(":javaagent-tooling")) +} diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/AnnotationExcludedMethods.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/KotlinCoroutineUtil.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/KotlinCoroutineUtil.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/KotlinCoroutineUtil.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/KotlinCoroutineUtil.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequest.java similarity index 100% rename from instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/MethodRequest.java diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 89df36ddc9d6..f827214b1a5c 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -75,7 +75,8 @@ dependencies { baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-api:javaagent")) - baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")) + baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent")) + baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-2.6:javaagent")) baseJavaagentLibs(project(":instrumentation:executors:javaagent")) baseJavaagentLibs(project(":instrumentation:internal:internal-application-logger:javaagent")) baseJavaagentLibs(project(":instrumentation:internal:internal-class-loader:javaagent")) diff --git a/settings.gradle.kts b/settings.gradle.kts index b09e868c7ba9..b5f394f3e0f7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -433,9 +433,9 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.37:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent") include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent") include(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent") -include(":instrumentation:opentelemetry-instrumentation-annotation-counted:javaagent") -include(":instrumentation:opentelemetry-instrumentation-annotation-timed:javaagent") -include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-2.6:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:testing") include(":instrumentation:oracle-ucp-11.2:javaagent") From 22d6c4389a4e9850e7631bf94334a10c4e8f0077 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Jun 2024 17:05:39 +0300 Subject: [PATCH 04/51] Use a single instrumentation module for counted and timed instrumentation --- .../README.md | 5 -- .../README.md | 5 -- .../javaagent/build.gradle.kts | 46 ------------------- .../javaagent/build.gradle.kts | 2 +- .../v2_6}/CountedHelper.java | 39 +--------------- .../v2_6}/CountedInstrumentation.java | 2 +- .../v2_6/MetricsAnnotationHelper.java | 46 +++++++++++++++++++ ...tricsAnnotationInstrumentationModule.java} | 15 +++--- .../v2_6}/TimedHelper.java | 40 +--------------- .../v2_6}/TimedInstrumentation.java | 2 +- .../timed/TimedInstrumentationModule.java | 45 ------------------ .../v2_6}/counted/CountedExample.java | 2 +- .../counted/CountedInstrumentationTest.java | 15 +++--- .../v2_6}/timed/TimedExample.java | 2 +- .../v2_6}/timed/TimedInstrumentationTest.java | 13 +++--- 15 files changed, 76 insertions(+), 203 deletions(-) delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-counted/README.md delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/README.md delete mode 100644 instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{counted => instrumentationannotations/v2_6}/CountedHelper.java (68%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{counted => instrumentationannotations/v2_6}/CountedInstrumentation.java (98%) create mode 100644 instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{counted/CountedInstrumentationModule.java => instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java} (68%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{timed => instrumentationannotations/v2_6}/TimedHelper.java (73%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{timed => instrumentationannotations/v2_6}/TimedInstrumentation.java (98%) delete mode 100644 instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/{test/annotations => javaagent/instrumentation/instrumentationannotations/v2_6}/counted/CountedExample.java (94%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/{test/annotations => javaagent/instrumentation/instrumentationannotations/v2_6}/counted/CountedInstrumentationTest.java (90%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/{test/annotations => javaagent/instrumentation/instrumentationannotations/v2_6}/timed/TimedExample.java (95%) rename instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/{test/annotations => javaagent/instrumentation/instrumentationannotations/v2_6}/timed/TimedInstrumentationTest.java (92%) diff --git a/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md b/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md deleted file mode 100644 index f52a11a938c0..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-counted/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Settings for the OpenTelemetry Counted Instrumentation Annotations integration - -| Environment variable | Type | Default | Description | -|-----------------------------------------------------------------------------------------| ------ | ------- |-------------------------------------------------------------------------------------| -| `otel.instrumentation.opentelemetry-instrumentation-annotation-counted.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by Counted annotation advices. | diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md b/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md deleted file mode 100644 index a16004d9f4dd..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Settings for the OpenTelemetry Timed Instrumentation Annotations integration - -| Environment variable | Type | Default | Description | -|-----------------------------------------------------------------------------------------| ------ | ------- |-----------------------------------------------------------------------------------| -| `otel.instrumentation.opentelemetry-instrumentation-annotation-Timed.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by Timed annotation advices. | diff --git a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts deleted file mode 100644 index ce5402c4d69c..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotation-timed/javaagent/build.gradle.kts +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id("otel.javaagent-instrumentation") -} - -// note that muzzle is not run against the current SNAPSHOT instrumentation-annotations, but this is -// ok because the tests are run against the current SNAPSHOT instrumentation-annotations which will -// catch any muzzle issues in SNAPSHOT instrumentation-annotations - -muzzle { - pass { - group.set("io.opentelemetry") - module.set("opentelemetry-instrumentation-annotations") - versions.set("(,)") - } -} - -dependencies { - compileOnly(project(":instrumentation-annotations-support")) - - compileOnly(project(":javaagent-tooling")) - - // this instrumentation needs to do similar shading dance as opentelemetry-api-1.0 because - // the @WithSpan annotation references the OpenTelemetry API's SpanKind class - // - // see the comment in opentelemetry-api-1.0.gradle for more details - compileOnly(project(":opentelemetry-instrumentation-annotations-shaded-for-instrumenting", configuration = "shadow")) - - // Used by byte-buddy but not brought in as a transitive dependency. - compileOnly("com.google.code.findbugs:annotations") - testCompileOnly("com.google.code.findbugs:annotations") - - testImplementation(project(":instrumentation-annotations")) - testImplementation(project(":instrumentation-annotations-support")) - testImplementation("net.bytebuddy:byte-buddy") -} - -tasks { - compileTestJava { - options.compilerArgs.add("-parameters") - } - test { - jvmArgs( - "-Dotel.instrumentation.opentelemetry-instrumentation-annotation-timed.exclude-methods=io.opentelemetry.test.annotations.timed.TimedExample[exampleIgnore]" - ) - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts index cca08e10ea34..521fb5ef4de3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts @@ -35,7 +35,7 @@ tasks { } test { jvmArgs( - "-Dotel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods=io.opentelemetry.test.annotations.counted.CountedExample[exampleIgnore];io.opentelemetry.test.annotations.timed.TimedExample[exampleIgnore]" + "-Dotel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods=io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample[exampleIgnore];io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample[exampleIgnore]" ) } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java similarity index 68% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java index 127773f92e55..d1c002066fc8 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java @@ -3,56 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import application.io.opentelemetry.instrumentation.annotations.Counted; -import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; -import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.internal.StringUtils; import io.opentelemetry.api.metrics.LongCounter; -import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; -import java.lang.reflect.Parameter; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -public final class CountedHelper { +public final class CountedHelper extends MetricsAnnotationHelper { - private static final String INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotation-counted"; private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; private static final ConcurrentMap COUNTERS = new ConcurrentHashMap<>(); - private static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); - - private static void extractMetricAttributes( - MethodRequest methodRequest, AttributesBuilder attributesBuilder) { - Parameter[] parameters = methodRequest.method().getParameters(); - for (int i = 0; i < parameters.length; i++) { - if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { - MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); - String attributeKey = ""; - if (!StringUtils.isNullOrEmpty(annotation.value())) { - attributeKey = annotation.value(); - } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { - attributeKey = parameters[i].getName(); - } else { - continue; - } - attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); - } - } - } - - private static void extractAdditionAttributes( - String[] attributes, AttributesBuilder attributesBuilder) { - int length = attributes.length; - for (int i = 0; i + 1 < length; i += 2) { - attributesBuilder.put(attributes[i], attributes[i + 1]); - } - } public static void recordCountWithAttributes( MethodRequest methodRequest, Object returnValue, Throwable throwable) { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java index f0b5c726902d..51703ab0cb67 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java new file mode 100644 index 000000000000..4c95c1e76c90 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; + +import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.internal.StringUtils; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; +import java.lang.reflect.Parameter; + +public abstract class MetricsAnnotationHelper { + private static final String INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); + + static void extractMetricAttributes( + MethodRequest methodRequest, AttributesBuilder attributesBuilder) { + Parameter[] parameters = methodRequest.method().getParameters(); + for (int i = 0; i < parameters.length; i++) { + if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { + MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); + String attributeKey = ""; + if (!StringUtils.isNullOrEmpty(annotation.value())) { + attributeKey = annotation.value(); + } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { + attributeKey = parameters[i].getName(); + } else { + continue; + } + attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); + } + } + } + + static void extractAdditionAttributes(String[] attributes, AttributesBuilder attributesBuilder) { + int length = attributes.length; + for (int i = 0; i + 1 < length; i += 2) { + attributesBuilder.put(attributes[i], attributes[i + 1]); + } + } +} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java similarity index 68% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java index 3617dcc2c322..f2e1dbb28320 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/counted/CountedInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java @@ -3,13 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; import application.io.opentelemetry.instrumentation.annotations.Counted; import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.Timed; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -17,14 +18,14 @@ import net.bytebuddy.matcher.ElementMatcher; /** - * Instrumentation for methods annotated with {@link Counted} or {@link MetricAttribute} - * annotations. + * Instrumentation for methods annotated with {@link Counted}, {@link Timed} and {@link + * MetricAttribute} annotations. */ @AutoService(InstrumentationModule.class) -public class CountedInstrumentationModule extends InstrumentationModule { +public class MetricsAnnotationInstrumentationModule extends InstrumentationModule { - public CountedInstrumentationModule() { - super("opentelemetry-instrumentation-annotation-counted", "counted"); + public MetricsAnnotationInstrumentationModule() { + super("opentelemetry-instrumentation-annotations", "metrics-annotations"); } @Override @@ -41,6 +42,6 @@ public ElementMatcher.Junction classLoaderMatcher() { @Override public List typeInstrumentations() { - return asList(new CountedInstrumentation()); + return asList(new CountedInstrumentation(), new TimedInstrumentation()); } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java similarity index 73% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index 4b21ff189bbe..d8c2a240cfcf 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -3,63 +3,27 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; import application.io.opentelemetry.instrumentation.annotations.Timed; -import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.internal.StringUtils; import io.opentelemetry.api.metrics.DoubleHistogram; -import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; -import java.lang.reflect.Parameter; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -public final class TimedHelper { +public final class TimedHelper extends MetricsAnnotationHelper { - private static final String INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotation-timed"; private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; private static final ConcurrentMap HISTOGRAMS = new ConcurrentHashMap<>(); - private static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); - - private static void extractMetricAttributes( - MethodRequest methodRequest, AttributesBuilder attributesBuilder) { - Parameter[] parameters = methodRequest.method().getParameters(); - for (int i = 0; i < parameters.length; i++) { - if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { - MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); - String attributeKey = ""; - if (!StringUtils.isNullOrEmpty(annotation.value())) { - attributeKey = annotation.value(); - } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { - attributeKey = parameters[i].getName(); - } else { - continue; - } - attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); - } - } - } - - private static void extractAdditionAttributes( - String[] attributes, AttributesBuilder attributesBuilder) { - int length = attributes.length; - for (int i = 0; i + 1 < length; i += 2) { - attributesBuilder.put(attributes[i], attributes[i + 1]); - } - } - public static void recordHistogramWithAttributes( MethodRequest methodRequest, Throwable throwable, Object returnValue, long startNanoTime) { Timed timedAnnotation = methodRequest.method().getAnnotation(Timed.class); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java index b5b21ff304c8..a31237351edb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java deleted file mode 100644 index f5bbb9e0ecf6..000000000000 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/timed/TimedInstrumentationModule.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.timed; - -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static java.util.Arrays.asList; - -import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; -import application.io.opentelemetry.instrumentation.annotations.Timed; -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; -import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import java.util.List; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * Instrumentation for methods annotated with {@link Timed} and {@link MetricAttribute} annotations. - */ -@AutoService(InstrumentationModule.class) -public class TimedInstrumentationModule extends InstrumentationModule { - - public TimedInstrumentationModule() { - super("opentelemetry-instrumentation-annotation-timed", "timed"); - } - - @Override - public int order() { - // Run first to ensure other automatic instrumentation is added after and therefore is executed - // earlier in the instrumented method and create the span to attach attributes to. - return -1000; - } - - @Override - public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("application.io.opentelemetry.instrumentation.annotations.Timed"); - } - - @Override - public List typeInstrumentations() { - return asList(new TimedInstrumentation()); - } -} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java similarity index 94% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java index 801f4a10988f..bfa6e61f4103 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.test.annotations.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; import io.opentelemetry.instrumentation.annotations.Counted; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java similarity index 90% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java index f3796189c73f..df2b198a59d8 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.test.annotations.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; -import static io.opentelemetry.test.annotations.counted.CountedExample.ANOTHER_NAME_COUNT; -import static io.opentelemetry.test.annotations.counted.CountedExample.METRIC_DESCRIPTION; -import static io.opentelemetry.test.annotations.counted.CountedExample.METRIC_UNIT; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.ANOTHER_NAME_COUNT; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_UNIT; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -21,10 +21,9 @@ class CountedInstrumentationTest { public static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); - public static final String INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotation-counted"; - - public static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; + private static final String INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; @Test void testDefaultExample() { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java similarity index 95% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java index baa872fa1f26..299f196796a3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.test.annotations.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; import io.opentelemetry.instrumentation.annotations.Timed; import java.util.concurrent.TimeUnit; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java similarity index 92% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index f93aba564aa3..499c585c6362 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/test/annotations/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.test.annotations.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; -import static io.opentelemetry.test.annotations.timed.TimedExample.ANOTHER_NAME_HISTOGRAM; -import static io.opentelemetry.test.annotations.timed.TimedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.ANOTHER_NAME_HISTOGRAM; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.METRIC_DESCRIPTION; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -20,10 +20,9 @@ class TimedInstrumentationTest { public static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); - public static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; - - public static final String TIMED_INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotation-timed"; + private static final String TIMED_INSTRUMENTATION_NAME = + "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; @Test void testDefaultExample() { From aa3b47cf1cdfca5342d11b08ce453572f5ba6259 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 11 Jun 2024 11:09:23 +0300 Subject: [PATCH 05/51] Paratmeter.getName() synthesizes a name when it is not present --- .../v2_6/MetricsAnnotationHelper.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java index 4c95c1e76c90..242ed70ab70b 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java @@ -8,7 +8,6 @@ import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.internal.StringUtils; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Parameter; @@ -24,10 +23,10 @@ static void extractMetricAttributes( for (int i = 0; i < parameters.length; i++) { if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); - String attributeKey = ""; - if (!StringUtils.isNullOrEmpty(annotation.value())) { + String attributeKey; + if (!annotation.value().isEmpty()) { attributeKey = annotation.value(); - } else if (!StringUtils.isNullOrEmpty(parameters[i].getName())) { + } else if (parameters[i].isNamePresent()) { attributeKey = parameters[i].getName(); } else { continue; From d954ebebc1540574e71a09bbccc598af483ed6ab Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 10:55:34 +0300 Subject: [PATCH 06/51] cache counter/histogram per method --- .../v2_6/CountedHelper.java | 50 +++++++-------- .../v2_6/TimedHelper.java | 62 +++++++++---------- .../counted/CountedInstrumentationTest.java | 5 +- .../v2_6/timed/TimedInstrumentationTest.java | 2 + 4 files changed, 58 insertions(+), 61 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java index d1c002066fc8..d2d8484676c4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java @@ -11,13 +11,19 @@ import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; public final class CountedHelper extends MetricsAnnotationHelper { private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; - private static final ConcurrentMap COUNTERS = new ConcurrentHashMap<>(); + private static final ClassValue> counters = + new ClassValue>() { + @Override + protected Map computeValue(Class type) { + return new ConcurrentHashMap<>(); + } + }; public static void recordCountWithAttributes( MethodRequest methodRequest, Object returnValue, Throwable throwable) { @@ -59,30 +65,22 @@ private static void extractReturnValue( } private static LongCounter getCounter(Method method) { - Counted countedAnnotation = method.getAnnotation(Counted.class); - String metricName = - (null == countedAnnotation.value() || countedAnnotation.value().isEmpty()) - ? COUNTED_DEFAULT_NAME - : countedAnnotation.value(); - if (!COUNTERS.containsKey(metricName)) { - synchronized (metricName) { - if (!COUNTERS.containsKey(metricName)) { - LongCounter longCounter = null; - if (COUNTED_DEFAULT_NAME.equals(metricName)) { - longCounter = METER.counterBuilder(metricName).build(); - } else { - longCounter = - METER - .counterBuilder(metricName) - .setDescription(countedAnnotation.description()) - .setUnit(countedAnnotation.unit()) - .build(); - } - COUNTERS.put(metricName, longCounter); - } - } - } - return COUNTERS.get(metricName); + return counters + .get(method.getDeclaringClass()) + .computeIfAbsent( + method, + m -> { + Counted countedAnnotation = m.getAnnotation(Counted.class); + String metricName = + (null == countedAnnotation.value() || countedAnnotation.value().isEmpty()) + ? COUNTED_DEFAULT_NAME + : countedAnnotation.value(); + return METER + .counterBuilder(metricName) + .setDescription(countedAnnotation.description()) + .setUnit(countedAnnotation.unit()) + .build(); + }); } private CountedHelper() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index d8c2a240cfcf..44bf4cf117d2 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -13,16 +13,20 @@ import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; public final class TimedHelper extends MetricsAnnotationHelper { private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; - - private static final ConcurrentMap HISTOGRAMS = - new ConcurrentHashMap<>(); + private static final ClassValue> histograms = + new ClassValue>() { + @Override + protected Map computeValue(Class type) { + return new ConcurrentHashMap<>(); + } + }; public static void recordHistogramWithAttributes( MethodRequest methodRequest, Throwable throwable, Object returnValue, long startNanoTime) { @@ -31,7 +35,7 @@ public static void recordHistogramWithAttributes( getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); double duration = getTransformedDuration(startNanoTime, timedAnnotation); extractMetricAttributes(methodRequest, attributesBuilder); - getHistogram(timedAnnotation).record(duration, attributesBuilder.build()); + getHistogram(methodRequest.method()).record(duration, attributesBuilder.build()); } public static void recordHistogram( @@ -40,7 +44,7 @@ public static void recordHistogram( AttributesBuilder attributesBuilder = getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); double duration = getTransformedDuration(startNanoTime, timedAnnotation); - getHistogram(timedAnnotation).record(duration, attributesBuilder.build()); + getHistogram(method).record(duration, attributesBuilder.build()); } private static AttributesBuilder getCommonAttributeBuilder( @@ -55,8 +59,7 @@ private static AttributesBuilder getCommonAttributeBuilder( private static double getTransformedDuration(long startNanoTime, Timed timedAnnotation) { TimeUnit unit = extractTimeUnit(timedAnnotation); long nanoDelta = System.nanoTime() - startNanoTime; - double duration = unit.convert(nanoDelta, NANOSECONDS); - return duration; + return unit.convert(nanoDelta, NANOSECONDS); } private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { @@ -73,31 +76,24 @@ private static void extractReturnValue( } } - private static DoubleHistogram getHistogram(Timed timedAnnotation) { - String metricName = - (null == timedAnnotation.value() || timedAnnotation.value().isEmpty()) - ? TIMED_DEFAULT_NAME - : timedAnnotation.value(); - if (!HISTOGRAMS.containsKey(metricName)) { - synchronized (metricName) { - if (!HISTOGRAMS.containsKey(metricName)) { - DoubleHistogram doubleHistogram = null; - if (TIMED_DEFAULT_NAME.equals(metricName)) { - doubleHistogram = METER.histogramBuilder(metricName).setUnit("ms").build(); - } else { - String unitStr = extractUnitStr(timedAnnotation); - doubleHistogram = - METER - .histogramBuilder(metricName) - .setDescription(timedAnnotation.description()) - .setUnit(unitStr) - .build(); - } - HISTOGRAMS.put(metricName, doubleHistogram); - } - } - } - return HISTOGRAMS.get(metricName); + private static DoubleHistogram getHistogram(Method method) { + return histograms + .get(method.getDeclaringClass()) + .computeIfAbsent( + method, + m -> { + Timed timedAnnotation = m.getAnnotation(Timed.class); + String metricName = + (null == timedAnnotation.value() || timedAnnotation.value().isEmpty()) + ? TIMED_DEFAULT_NAME + : timedAnnotation.value(); + String unitStr = extractUnitStr(timedAnnotation); + return METER + .histogramBuilder(metricName) + .setDescription(timedAnnotation.description()) + .setUnit(unitStr) + .build(); + }); } private static TimeUnit extractTimeUnit(Timed timedAnnotation) { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java index df2b198a59d8..57fc04ea1c4f 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java @@ -43,14 +43,15 @@ void testExampleWithAnotherName() { void testExampleWithDescriptionAndDefaultValue() { new CountedExample().exampleWithDescriptionAndDefaultValue(); testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasDescription("")); + INSTRUMENTATION_NAME, + metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasDescription(METRIC_DESCRIPTION)); } @Test void testExampleWithUnitAndDefaultValue() { new CountedExample().exampleWithUnitAndDefaultValue(); testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasUnit("")); + INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasUnit(METRIC_UNIT)); } @Test diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index 499c585c6362..07c861cb4121 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -38,6 +38,7 @@ void testExampleWithAnotherName() { TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(ANOTHER_NAME_HISTOGRAM)); } + /* @Test void testExampleWithDescriptionAndDefaultValue() { new TimedExample().exampleWithDescriptionAndDefaultValue(); @@ -52,6 +53,7 @@ void testExampleWithUnitNanoSecondAndDefaultValue() { testing.waitAndAssertMetrics( TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME).hasUnit("ms")); } + */ @Test void testExampleWithDescription() { From 37733c1da0b1d0f443e66f62e25f7e075d2753ff Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 12:45:03 +0300 Subject: [PATCH 07/51] make named required for @Counted and @Timed --- .../instrumentation/annotations/Counted.java | 4 +- .../instrumentation/annotations/Timed.java | 4 +- .../v2_6/CountedHelper.java | 7 +- .../v2_6/TimedHelper.java | 7 +- .../v2_6/counted/CountedExample.java | 29 ++-- .../counted/CountedInstrumentationTest.java | 126 +++++++---------- .../v2_6/timed/TimedExample.java | 27 ++-- .../v2_6/timed/TimedInstrumentationTest.java | 133 +++++++----------- 8 files changed, 131 insertions(+), 206 deletions(-) diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java index 0907f0210ae6..7f2c79906f8f 100644 --- a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java @@ -40,10 +40,8 @@ * *

The name should follow the instrument naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule - * - *

The default name is {@code method.invocation.count}. */ - String value() default ""; + String value(); /** * Description of the instrument. diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java index 730dedd5f482..37d621027c90 100644 --- a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java @@ -41,10 +41,8 @@ * *

The name should follow the instrument naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule - * - *

The default name is {@code method.invocation.duration}. */ - String value() default ""; + String value(); /** * Description for the instrument. diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java index d2d8484676c4..e87a44e09f6f 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java @@ -16,7 +16,6 @@ public final class CountedHelper extends MetricsAnnotationHelper { - private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; private static final ClassValue> counters = new ClassValue>() { @Override @@ -71,12 +70,8 @@ private static LongCounter getCounter(Method method) { method, m -> { Counted countedAnnotation = m.getAnnotation(Counted.class); - String metricName = - (null == countedAnnotation.value() || countedAnnotation.value().isEmpty()) - ? COUNTED_DEFAULT_NAME - : countedAnnotation.value(); return METER - .counterBuilder(metricName) + .counterBuilder(countedAnnotation.value()) .setDescription(countedAnnotation.description()) .setUnit(countedAnnotation.unit()) .build(); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index 44bf4cf117d2..634d2d0972f4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -19,7 +19,6 @@ public final class TimedHelper extends MetricsAnnotationHelper { - private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; private static final ClassValue> histograms = new ClassValue>() { @Override @@ -83,13 +82,9 @@ private static DoubleHistogram getHistogram(Method method) { method, m -> { Timed timedAnnotation = m.getAnnotation(Timed.class); - String metricName = - (null == timedAnnotation.value() || timedAnnotation.value().isEmpty()) - ? TIMED_DEFAULT_NAME - : timedAnnotation.value(); String unitStr = extractUnitStr(timedAnnotation); return METER - .histogramBuilder(metricName) + .histogramBuilder(timedAnnotation.value()) .setDescription(timedAnnotation.description()) .setUnit(unitStr) .build(); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java index bfa6e61f4103..840f845d2a46 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java @@ -9,22 +9,13 @@ public class CountedExample { - public static final String ANOTHER_NAME_COUNT = "another.name.count"; + public static final String METRIC_NAME = "name.count"; public static final String METRIC_DESCRIPTION = "I am the description."; public static final String METRIC_UNIT = "ms"; public static final String RETURN_STRING = "I am a return string."; - @Counted - public void defaultExample() {} - - @Counted(ANOTHER_NAME_COUNT) - public void exampleWithAnotherName() {} - - @Counted(description = METRIC_DESCRIPTION) - public void exampleWithDescriptionAndDefaultValue() {} - - @Counted(unit = METRIC_UNIT) - public void exampleWithUnitAndDefaultValue() {} + @Counted(METRIC_NAME) + public void exampleWithName() {} @Counted(value = "example.with.description.count", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} @@ -32,23 +23,27 @@ public void exampleWithDescription() {} @Counted(value = "example.with.unit.count", unit = METRIC_UNIT) public void exampleWithUnit() {} - @Counted(additionalAttributes = {"key1", "value1", "key2", "value2"}) + @Counted( + value = "example.with.attributes.count", + additionalAttributes = {"key1", "value1", "key2", "value2"}) public void exampleWithAdditionalAttributes1() {} - @Counted(additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) + @Counted( + value = "example.with.attributes2.count", + additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) public void exampleWithAdditionalAttributes2() {} - @Counted(returnValueAttribute = "returnValue") + @Counted(value = "example.with.return.count", returnValueAttribute = "returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } - @Counted + @Counted("example.with.exception.count") public void exampleWithException() { throw new IllegalStateException("test exception."); } - @Counted + @Counted("example.ignore.count") public void exampleIgnore() {} public static class ReturnObject { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java index 57fc04ea1c4f..6bf61f72d085 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java @@ -5,8 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.ANOTHER_NAME_COUNT; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_NAME; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_UNIT; import static org.assertj.core.api.Assertions.assertThat; @@ -18,40 +18,16 @@ class CountedInstrumentationTest { @RegisterExtension - public static final AgentInstrumentationExtension testing = + private static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); private static final String INSTRUMENTATION_NAME = "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; - private static final String COUNTED_DEFAULT_NAME = "method.invocation.count"; - - @Test - void testDefaultExample() { - new CountedExample().defaultExample(); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME)); - } @Test void testExampleWithAnotherName() { - new CountedExample().exampleWithAnotherName(); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, metric -> metric.hasName(ANOTHER_NAME_COUNT)); - } - - @Test - void testExampleWithDescriptionAndDefaultValue() { - new CountedExample().exampleWithDescriptionAndDefaultValue(); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasDescription(METRIC_DESCRIPTION)); - } - - @Test - void testExampleWithUnitAndDefaultValue() { - new CountedExample().exampleWithUnitAndDefaultValue(); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, metric -> metric.hasName(COUNTED_DEFAULT_NAME).hasUnit(METRIC_UNIT)); + new CountedExample().exampleWithName(); + testing.waitAndAssertMetrics(INSTRUMENTATION_NAME, metric -> metric.hasName(METRIC_NAME)); } @Test @@ -78,20 +54,20 @@ void testExampleWithAdditionalAttributes1() { INSTRUMENTATION_NAME, metric -> metric - .hasName(COUNTED_DEFAULT_NAME) + .hasName("example.with.attributes.count") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key2")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2")))))); } @Test @@ -101,21 +77,23 @@ void testExampleWithAdditionalAttributes2() { INSTRUMENTATION_NAME, metric -> metric - .hasName(COUNTED_DEFAULT_NAME) + .hasName("example.with.attributes2.count") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key2"))) - && null - == p.getAttributes().get(AttributeKey.stringKey("key3"))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2"))) + && null + == p.getAttributes() + .get(AttributeKey.stringKey("key3"))))); } @Test @@ -125,16 +103,15 @@ void testExampleWithReturnAttribute() { INSTRUMENTATION_NAME, metric -> metric - .hasName(COUNTED_DEFAULT_NAME) + .hasName("example.with.return.count") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - CountedExample.RETURN_STRING.equals( - p.getAttributes() - .get(AttributeKey.stringKey("returnValue")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + CountedExample.RETURN_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))))); } @Test @@ -148,18 +125,17 @@ void testExampleWithException() { INSTRUMENTATION_NAME, metric -> metric - .hasName(COUNTED_DEFAULT_NAME) + .hasName("example.with.exception.count") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - IllegalStateException.class - .getName() - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("exception")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + IllegalStateException.class + .getName() + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("exception")))))); } @Test diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java index 299f196796a3..1317455c1807 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java @@ -9,22 +9,13 @@ import java.util.concurrent.TimeUnit; public class TimedExample { - public static final String ANOTHER_NAME_HISTOGRAM = "another.name.duration"; + public static final String METRIC_NAME = "name.duration"; public static final String METRIC_DESCRIPTION = "I am the description."; public static final String RETURN_STRING = "I am a return string."; - @Timed - public void defaultExample() {} - - @Timed(ANOTHER_NAME_HISTOGRAM) + @Timed(METRIC_NAME) public void exampleWithAnotherName() {} - @Timed(description = METRIC_DESCRIPTION) - public void exampleWithDescriptionAndDefaultValue() {} - - @Timed(unit = TimeUnit.NANOSECONDS) - public void exampleWithUnitNanoSecondAndDefaultValue() {} - @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} @@ -33,21 +24,25 @@ public void exampleWithUnitSecondAnd2SecondLatency() throws InterruptedException Thread.sleep(2000); } - @Timed(additionalAttributes = {"key1", "value1", "key2", "value2"}) + @Timed( + value = "example.with.attributes.duration", + additionalAttributes = {"key1", "value1", "key2", "value2"}) public void exampleWithAdditionalAttributes1() {} - @Timed(additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) + @Timed( + value = "example.with.attributes2.duration", + additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) public void exampleWithAdditionalAttributes2() {} - @Timed + @Timed("example.ignore.duration") public void exampleIgnore() {} - @Timed + @Timed("example.with.exception.duration") public void exampleWithException() { throw new IllegalStateException("test"); } - @Timed(returnValueAttribute = "returnValue") + @Timed(value = "example.with.return.duration", returnValueAttribute = "returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index 07c861cb4121..0b8727b9725a 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -5,8 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.ANOTHER_NAME_HISTOGRAM; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.METRIC_NAME; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -17,43 +17,17 @@ class TimedInstrumentationTest { @RegisterExtension - public static final AgentInstrumentationExtension testing = + private static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); private static final String TIMED_INSTRUMENTATION_NAME = "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; - private static final String TIMED_DEFAULT_NAME = "method.invocation.duration"; - - @Test - void testDefaultExample() { - new TimedExample().defaultExample(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME)); - } @Test void testExampleWithAnotherName() { new TimedExample().exampleWithAnotherName(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(ANOTHER_NAME_HISTOGRAM)); - } - - /* - @Test - void testExampleWithDescriptionAndDefaultValue() { - new TimedExample().exampleWithDescriptionAndDefaultValue(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, - metric -> metric.hasName(TIMED_DEFAULT_NAME).hasDescription("")); - } - - @Test - void testExampleWithUnitNanoSecondAndDefaultValue() { - new TimedExample().exampleWithUnitNanoSecondAndDefaultValue(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(TIMED_DEFAULT_NAME).hasUnit("ms")); + testing.waitAndAssertMetrics(TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(METRIC_NAME)); } - */ @Test void testExampleWithDescription() { @@ -74,10 +48,9 @@ void testExampleWithUnitSecondAnd2SecondLatency() throws InterruptedException { .hasName("example.with.unit.duration") .hasUnit("s") .satisfies( - metricData -> { - assertThat(metricData.getHistogramData().getPoints()) - .allMatch(p -> p.getMax() < 5 && p.getMin() > 0); - })); + metricData -> + assertThat(metricData.getHistogramData().getPoints()) + .allMatch(p -> p.getMax() < 5 && p.getMin() > 0))); } @Test @@ -87,20 +60,20 @@ void testExampleWithAdditionalAttributes1() { TIMED_INSTRUMENTATION_NAME, metric -> metric - .hasName(TIMED_DEFAULT_NAME) + .hasName("example.with.attributes.duration") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key2")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2")))))); } @Test @@ -110,21 +83,23 @@ void testExampleWithAdditionalAttributes2() { TIMED_INSTRUMENTATION_NAME, metric -> metric - .hasName(TIMED_DEFAULT_NAME) + .hasName("example.with.attributes2.duration") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes().get(AttributeKey.stringKey("key2"))) - && null - == p.getAttributes().get(AttributeKey.stringKey("key3"))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "value1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key1"))) + && "value2" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("key2"))) + && null + == p.getAttributes() + .get(AttributeKey.stringKey("key3"))))); } @Test @@ -145,18 +120,17 @@ void testExampleWithException() { TIMED_INSTRUMENTATION_NAME, metric -> metric - .hasName(TIMED_DEFAULT_NAME) + .hasName("example.with.exception.duration") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - IllegalStateException.class - .getName() - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("exception")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + IllegalStateException.class + .getName() + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("exception")))))); } @Test @@ -166,15 +140,14 @@ void testExampleWithReturnValueAttribute() { TIMED_INSTRUMENTATION_NAME, metric -> metric - .hasName(TIMED_DEFAULT_NAME) + .hasName("example.with.return.duration") .satisfies( - metricData -> { - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - TimedExample.RETURN_STRING.equals( - p.getAttributes() - .get(AttributeKey.stringKey("returnValue")))); - })); + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + TimedExample.RETURN_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))))); } } From 6cdfff94d92eeaac6e1e4ff687c5f9293dbdd285 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 13:55:37 +0300 Subject: [PATCH 08/51] change default unit to seconds --- .../instrumentation/annotations/Timed.java | 4 +-- .../v2_6/TimedHelper.java | 29 +++++++++---------- .../v2_6/timed/TimedExample.java | 6 ++-- .../v2_6/timed/TimedInstrumentationTest.java | 15 +++++----- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java index 37d621027c90..7ea5cd22a4ec 100644 --- a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java +++ b/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java @@ -55,9 +55,9 @@ /** * The unit for the instrument. * - *

Default is milliseconds. + *

Default is seconds. */ - TimeUnit unit() default TimeUnit.MILLISECONDS; + TimeUnit unit() default TimeUnit.SECONDS; /** * List of key-value pairs to supply additional attributes. diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index 634d2d0972f4..f134b61dab1e 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -56,7 +56,7 @@ private static AttributesBuilder getCommonAttributeBuilder( } private static double getTransformedDuration(long startNanoTime, Timed timedAnnotation) { - TimeUnit unit = extractTimeUnit(timedAnnotation); + TimeUnit unit = timedAnnotation.unit(); long nanoDelta = System.nanoTime() - startNanoTime; return unit.convert(nanoDelta, NANOSECONDS); } @@ -82,33 +82,32 @@ private static DoubleHistogram getHistogram(Method method) { method, m -> { Timed timedAnnotation = m.getAnnotation(Timed.class); - String unitStr = extractUnitStr(timedAnnotation); return METER .histogramBuilder(timedAnnotation.value()) .setDescription(timedAnnotation.description()) - .setUnit(unitStr) + .setUnit(toString(timedAnnotation.unit())) .build(); }); } - private static TimeUnit extractTimeUnit(Timed timedAnnotation) { - if (null == timedAnnotation.unit()) { - return TimeUnit.MILLISECONDS; - } - return timedAnnotation.unit(); - } - - private static String extractUnitStr(Timed timedAnnotation) { - switch (timedAnnotation.unit()) { + private static String toString(TimeUnit timeUnit) { + switch (timeUnit) { case NANOSECONDS: return "ns"; case MICROSECONDS: - return "µs"; + return "us"; + case MILLISECONDS: + return "ms"; case SECONDS: return "s"; - default: - return "ms"; + case MINUTES: + return "min"; + case HOURS: + return "h"; + case DAYS: + return "d"; } + throw new IllegalArgumentException("Unsupported time unit " + timeUnit); } private TimedHelper() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java index 1317455c1807..f488223d699a 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java @@ -14,13 +14,13 @@ public class TimedExample { public static final String RETURN_STRING = "I am a return string."; @Timed(METRIC_NAME) - public void exampleWithAnotherName() {} + public void exampleWithName() {} @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} - @Timed(value = "example.with.unit.duration", unit = TimeUnit.SECONDS) - public void exampleWithUnitSecondAnd2SecondLatency() throws InterruptedException { + @Timed(value = "example.with.unit.duration", unit = TimeUnit.MILLISECONDS) + public void exampleWithUnit() throws InterruptedException { Thread.sleep(2000); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index 0b8727b9725a..b089dcfb8591 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -24,9 +24,10 @@ class TimedInstrumentationTest { "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; @Test - void testExampleWithAnotherName() { - new TimedExample().exampleWithAnotherName(); - testing.waitAndAssertMetrics(TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(METRIC_NAME)); + void testExampleWithName() { + new TimedExample().exampleWithName(); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, metric -> metric.hasName(METRIC_NAME).hasUnit("s")); } @Test @@ -39,18 +40,18 @@ void testExampleWithDescription() { } @Test - void testExampleWithUnitSecondAnd2SecondLatency() throws InterruptedException { - new TimedExample().exampleWithUnitSecondAnd2SecondLatency(); + void testExampleWithUnit() throws InterruptedException { + new TimedExample().exampleWithUnit(); testing.waitAndAssertMetrics( TIMED_INSTRUMENTATION_NAME, metric -> metric .hasName("example.with.unit.duration") - .hasUnit("s") + .hasUnit("ms") .satisfies( metricData -> assertThat(metricData.getHistogramData().getPoints()) - .allMatch(p -> p.getMax() < 5 && p.getMin() > 0))); + .allMatch(p -> p.getMax() < 5000 && p.getMin() > 0))); } @Test From 771cc58fe5d7902e1ce38bcbce2f14bbac55eb04 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 15:59:31 +0300 Subject: [PATCH 09/51] resue code from @WithSpan implementation to extract method paramter attibutes --- .../v2_6/MetricsAnnotationHelper.java | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java index 242ed70ab70b..c1fff4fc5f36 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java @@ -9,31 +9,21 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.instrumentation.api.annotation.support.SpanAttributesExtractor; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Parameter; +import javax.annotation.Nullable; public abstract class MetricsAnnotationHelper { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); + private static final SpanAttributesExtractor PARAMETER_ATTRIBUTES = createAttributesExtractor(); static void extractMetricAttributes( MethodRequest methodRequest, AttributesBuilder attributesBuilder) { - Parameter[] parameters = methodRequest.method().getParameters(); - for (int i = 0; i < parameters.length; i++) { - if (parameters[i].isAnnotationPresent(MetricAttribute.class)) { - MetricAttribute annotation = parameters[i].getAnnotation(MetricAttribute.class); - String attributeKey; - if (!annotation.value().isEmpty()) { - attributeKey = annotation.value(); - } else if (parameters[i].isNamePresent()) { - attributeKey = parameters[i].getName(); - } else { - continue; - } - attributesBuilder.put(attributeKey, methodRequest.args()[i].toString()); - } - } + attributesBuilder.putAll( + PARAMETER_ATTRIBUTES.extract(methodRequest.method(), methodRequest.args())); } static void extractAdditionAttributes(String[] attributes, AttributesBuilder attributesBuilder) { @@ -42,4 +32,31 @@ static void extractAdditionAttributes(String[] attributes, AttributesBuilder att attributesBuilder.put(attributes[i], attributes[i + 1]); } } + + private static SpanAttributesExtractor createAttributesExtractor() { + return SpanAttributesExtractor.create( + (method, parameters) -> { + String[] attributeNames = new String[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + attributeNames[i] = attributeName(parameters[i]); + } + return attributeNames; + }); + } + + @Nullable + private static String attributeName(Parameter parameter) { + MetricAttribute annotation = parameter.getDeclaredAnnotation(MetricAttribute.class); + if (annotation == null) { + return null; + } + String value = annotation.value(); + if (!value.isEmpty()) { + return value; + } else if (parameter.isNamePresent()) { + return parameter.getName(); + } else { + return null; + } + } } From 42aa73b74f902a1fb0979159644ac5f02efd3d04 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 16:13:47 +0300 Subject: [PATCH 10/51] fractional duration --- .../instrumentationannotations/v2_6/TimedHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index f134b61dab1e..43c0a701fb20 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -58,7 +58,7 @@ private static AttributesBuilder getCommonAttributeBuilder( private static double getTransformedDuration(long startNanoTime, Timed timedAnnotation) { TimeUnit unit = timedAnnotation.unit(); long nanoDelta = System.nanoTime() - startNanoTime; - return unit.convert(nanoDelta, NANOSECONDS); + return (double) nanoDelta / NANOSECONDS.convert(1, unit); } private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { From c9ea9a0d060688730b97e5088fbba87584b855a1 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 18 Jun 2024 19:24:35 +0300 Subject: [PATCH 11/51] update samples --- .../instrumentation/annotations/CountedUsageExamples.java | 7 ++----- .../instrumentation/annotations/TimedUsageExamples.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java index 46189a4932b1..35b66aeeeeeb 100644 --- a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java +++ b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java @@ -7,13 +7,10 @@ public class CountedUsageExamples { - @Counted() - public void method1() {} - @Counted("customizedName") - public void method2() {} + public void method() {} - @Counted + @Counted("methodWithAttributes") public void attributes( @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} } diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java index f9fc6ee8c87e..7d33d0adf4f9 100644 --- a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java +++ b/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java @@ -7,13 +7,10 @@ public class TimedUsageExamples { - @Timed() - public void method1() {} - @Timed("customizedName") - public void method2() {} + public void method() {} - @Timed + @Timed("methodWithAttributes") public void attributes( @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} } From 43855a5279a866ca692ee8db99750cfe7feb4382 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 19 Jun 2024 16:05:27 +0300 Subject: [PATCH 12/51] handle async methods --- .../async/AsyncOperationEndHandler.java | 15 ++++++ .../async/AsyncOperationEndStrategy.java | 30 ++++++++++- .../async/AsyncOperationEndSupport.java | 45 +++++++++++----- .../async/Jdk8AsyncOperationEndStrategy.java | 19 ++++--- .../v10_0/GuavaAsyncOperationEndStrategy.java | 17 +++--- .../javaagent-kotlin/build.gradle.kts | 1 + .../kotlinxcoroutines/flow/FlowUtil.kt | 6 +-- .../flow/FlowInstrumentationHelper.java | 6 +-- .../v2_6/CountedHelper.java | 44 ++++++++++----- .../v2_6/CountedInstrumentation.java | 19 ++----- .../v2_6/TimedHelper.java | 53 +++++++++++++------ .../v2_6/TimedInstrumentation.java | 11 ++-- .../v2_6/counted/CountedExample.java | 6 +++ .../counted/CountedInstrumentationTest.java | 27 ++++++++++ .../v2_6/timed/TimedExample.java | 6 +++ .../v2_6/timed/TimedInstrumentationTest.java | 27 ++++++++++ .../ReactorAsyncOperationEndStrategy.java | 6 +-- .../RxJava2AsyncOperationEndStrategy.java | 6 +-- .../RxJava3AsyncOperationEndStrategy.java | 6 +-- 19 files changed, 249 insertions(+), 101 deletions(-) create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java new file mode 100644 index 000000000000..0d82aa16aa8b --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java @@ -0,0 +1,15 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support.async; + +import io.opentelemetry.context.Context; +import javax.annotation.Nullable; + +/** Callback that is called when async computation completes. */ +public interface AsyncOperationEndHandler { + void handle( + Context context, REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error); +} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java index 01dbaa55eef5..d3bba94fbe6c 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java @@ -11,7 +11,8 @@ /** * Implementations of this interface describe how to compose over {@linkplain #supports(Class) * supported} asynchronous computation types and delay marking the operation as ended by calling - * {@link Instrumenter#end(Context, Object, Object, Throwable)}. + * {@link Instrumenter#end(Context, Object, Object, Throwable)} or {@link + * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)}. */ public interface AsyncOperationEndStrategy { @@ -36,10 +37,35 @@ public interface AsyncOperationEndStrategy { * @return Either {@code asyncValue} or a value composing over {@code asyncValue} for notification * of completion. */ - Object end( + default Object end( Instrumenter instrumenter, Context context, REQUEST request, Object asyncValue, + Class responseType) { + return end(instrumenter::end, context, request, asyncValue, responseType); + } + + /** + * Composes over {@code asyncValue} and delays the {@link AsyncOperationEndHandler#handle(Context, + * Object, Object, Throwable)} call until after the asynchronous operation represented by {@code + * asyncValue} completes. + * + * @param handler The {@link AsyncOperationEndHandler} to be used to end the operation stored in + * the {@code context}. + * @param asyncValue Return value from the instrumented method. Must be an instance of a {@code + * asyncType} for which {@link #supports(Class)} returned true (in particular it must not be + * {@code null}). + * @param responseType Expected type of the response that should be obtained from the {@code + * asyncValue}. If the result of the async computation is instance of the passed type it will + * be passed when the {@code handler} is called. + * @return Either {@code asyncValue} or a value composing over {@code asyncValue} for notification + * of completion. + */ + Object end( + AsyncOperationEndHandler handler, + Context context, + REQUEST request, + Object asyncValue, Class responseType); } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java index 8bcbd5c3f978..50edfb7ab051 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java @@ -10,40 +10,59 @@ import javax.annotation.Nullable; /** - * A wrapper over {@link Instrumenter} that is able to defer {@link Instrumenter#end(Context, - * Object, Object, Throwable)} until asynchronous computation finishes. + * A wrapper over {@link AsyncOperationEndHandler} that is able to defer {@link + * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous + * computation finishes. */ public final class AsyncOperationEndSupport { /** - * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code syncInstrumenter}, + * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code instrumenter}, * configured for usage with asynchronous computations that are instances of {@code asyncType}. If * the result of the async computation ends up being an instance of {@code responseType} it will - * be passed as the response to the {@code syncInstrumenter} call; otherwise {@code null} value - * will be used as the response. + * be passed as the response to the {@code instrumenter} call; otherwise {@code null} value will + * be used as the response. */ public static AsyncOperationEndSupport create( - Instrumenter syncInstrumenter, + Instrumenter instrumenter, Class responseType, Class asyncType) { return new AsyncOperationEndSupport<>( - syncInstrumenter, + instrumenter::end, responseType, asyncType, AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); } - private final Instrumenter instrumenter; + /** + * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code handler}, + * configured for usage with asynchronous computations that are instances of {@code asyncType}. If + * the result of the async computation ends up being an instance of {@code responseType} it will + * be passed as the response to the {@code handler} call; otherwise {@code null} value will be + * used as the response. + */ + public static AsyncOperationEndSupport create( + AsyncOperationEndHandler handler, + Class responseType, + Class asyncType) { + return new AsyncOperationEndSupport<>( + handler, + responseType, + asyncType, + AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); + } + + private final AsyncOperationEndHandler handler; private final Class responseType; private final Class asyncType; @Nullable private final AsyncOperationEndStrategy asyncOperationEndStrategy; private AsyncOperationEndSupport( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Class responseType, Class asyncType, @Nullable AsyncOperationEndStrategy asyncOperationEndStrategy) { - this.instrumenter = instrumenter; + this.handler = handler; this.responseType = responseType; this.asyncType = asyncType; this.asyncOperationEndStrategy = asyncOperationEndStrategy; @@ -68,18 +87,18 @@ public ASYNC asyncEnd( Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { // we can end early if an exception was thrown if (throwable != null) { - instrumenter.end(context, request, null, throwable); + handler.handle(context, request, null, throwable); return asyncValue; } // use the configured strategy to compose over the asyncValue if (asyncOperationEndStrategy != null && asyncType.isInstance(asyncValue)) { return (ASYNC) - asyncOperationEndStrategy.end(instrumenter, context, request, asyncValue, responseType); + asyncOperationEndStrategy.end(handler, context, request, asyncValue, responseType); } // fall back to sync end() if asyncValue type doesn't match - instrumenter.end(context, request, tryToGetResponse(responseType, asyncValue), null); + handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); return asyncValue; } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java index c1eea3a419ed..38498bbbe894 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java @@ -8,7 +8,6 @@ import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -22,20 +21,20 @@ public boolean supports(Class asyncType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, Class responseType) { if (asyncValue instanceof CompletableFuture) { CompletableFuture future = (CompletableFuture) asyncValue; - if (tryToEndSynchronously(instrumenter, context, request, future, responseType)) { + if (tryToEndSynchronously(handler, context, request, future, responseType)) { return future; } - return endWhenComplete(instrumenter, context, request, future, responseType); + return endWhenComplete(handler, context, request, future, responseType); } CompletionStage stage = (CompletionStage) asyncValue; - return endWhenComplete(instrumenter, context, request, stage, responseType); + return endWhenComplete(handler, context, request, stage, responseType); } /** @@ -44,7 +43,7 @@ public Object end( * notification of completion. */ private static boolean tryToEndSynchronously( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, CompletableFuture future, @@ -56,9 +55,9 @@ private static boolean tryToEndSynchronously( try { Object potentialResponse = future.join(); - instrumenter.end(context, request, tryToGetResponse(responseType, potentialResponse), null); + handler.handle(context, request, tryToGetResponse(responseType, potentialResponse), null); } catch (Throwable t) { - instrumenter.end(context, request, null, t); + handler.handle(context, request, null, t); } return true; } @@ -68,13 +67,13 @@ private static boolean tryToEndSynchronously( * span will be ended. */ private static CompletionStage endWhenComplete( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, CompletionStage stage, Class responseType) { return stage.whenComplete( (result, exception) -> - instrumenter.end(context, request, tryToGetResponse(responseType, result), exception)); + handler.handle(context, request, tryToGetResponse(responseType, result), exception)); } } diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java index dbdbff784728..24287d362804 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java @@ -12,8 +12,8 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; public final class GuavaAsyncOperationEndStrategy implements AsyncOperationEndStrategy { // Visible for testing @@ -41,19 +41,19 @@ public boolean supports(Class returnType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, Class responseType) { ListenableFuture future = (ListenableFuture) asyncValue; - end(instrumenter, context, request, future, responseType); + end(handler, context, request, future, responseType); return future; } private void end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, ListenableFuture future, @@ -63,18 +63,17 @@ private void end( if (captureExperimentalSpanAttributes) { Span.fromContext(context).setAttribute(CANCELED_ATTRIBUTE_KEY, true); } - instrumenter.end(context, request, null, null); + handler.handle(context, request, null, null); } else { try { Object response = Uninterruptibles.getUninterruptibly(future); - instrumenter.end(context, request, tryToGetResponse(responseType, response), null); + handler.handle(context, request, tryToGetResponse(responseType, response), null); } catch (Throwable exception) { - instrumenter.end(context, request, null, exception); + handler.handle(context, request, null, exception); } } } else { - future.addListener( - () -> end(instrumenter, context, request, future, responseType), Runnable::run); + future.addListener(() -> end(handler, context, request, future, responseType), Runnable::run); } } } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/build.gradle.kts b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/build.gradle.kts index 755a2a9fa85f..1aa3ece053e8 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/build.gradle.kts +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0") compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") compileOnly(project(":instrumentation-api")) + compileOnly(project(":instrumentation-annotations-support")) } kotlin { diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt index 65008f55ca62..9e44348e3f4c 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt @@ -6,12 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onCompletion -fun onComplete(flow: Flow<*>, instrumenter: Instrumenter, context: Context, request: REQUEST & Any): Flow<*> { +fun onComplete(flow: Flow<*>, handler: AsyncOperationEndHandler, context: Context, request: REQUEST & Any): Flow<*> { return flow.onCompletion { cause: Throwable? -> - instrumenter.end(context, request, null, cause) + handler.handle(context, request, null, cause) } } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java index 02102afe01d0..0f0206d8c9fc 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java @@ -6,9 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import kotlinx.coroutines.flow.Flow; public final class FlowInstrumentationHelper { @@ -32,13 +32,13 @@ public boolean supports(Class returnType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, Class responseType) { Flow flow = (Flow) asyncValue; - return FlowUtilKt.onComplete(flow, instrumenter, context, request); + return FlowUtilKt.onComplete(flow, handler, context, request); } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java index e87a44e09f6f..6fc4dcfb997a 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java @@ -9,10 +9,13 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; public final class CountedHelper extends MetricsAnnotationHelper { @@ -24,20 +27,36 @@ protected Map computeValue(Class type) { } }; - public static void recordCountWithAttributes( + public static Object recordCountWithAttributes( MethodRequest methodRequest, Object returnValue, Throwable throwable) { - Counted countedAnnotation = methodRequest.method().getAnnotation(Counted.class); - AttributesBuilder attributesBuilder = - getCommonAttributesBuilder(countedAnnotation, returnValue, throwable); - extractMetricAttributes(methodRequest, attributesBuilder); - getCounter(methodRequest.method()).add(1, attributesBuilder.build()); + return recordCount( + methodRequest.method(), + returnValue, + throwable, + attributesBuilder -> extractMetricAttributes(methodRequest, attributesBuilder)); } - public static void recordCount(Method method, Object returnValue, Throwable throwable) { - Counted countedAnnotation = method.getAnnotation(Counted.class); - AttributesBuilder attributesBuilder = - getCommonAttributesBuilder(countedAnnotation, returnValue, throwable); - getCounter(method).add(1, attributesBuilder.build()); + public static Object recordCount(Method method, Object returnValue, Throwable throwable) { + return recordCount(method, returnValue, throwable, attributesBuilder -> {}); + } + + private static Object recordCount( + Method method, + Object returnValue, + Throwable throwable, + Consumer additionalAttributes) { + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( + (context, method1, object, error) -> { + Counted countedAnnotation = method1.getAnnotation(Counted.class); + AttributesBuilder attributesBuilder = + getCommonAttributesBuilder(countedAnnotation, object, error); + additionalAttributes.accept(attributesBuilder); + getCounter(method1).add(1, attributesBuilder.build()); + }, + Object.class, + method.getReturnType()); + return operationEndSupport.asyncEnd(Context.current(), method, returnValue, throwable); } private static AttributesBuilder getCommonAttributesBuilder( @@ -57,8 +76,7 @@ private static void extractException(Throwable throwable, AttributesBuilder attr private static void extractReturnValue( Counted countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { - if (null != countedAnnotation.returnValueAttribute() - && !countedAnnotation.returnValueAttribute().isEmpty()) { + if (returnValue != null && !countedAnnotation.returnValueAttribute().isEmpty()) { attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java index 51703ab0cb67..9491592b6d37 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java @@ -77,43 +77,32 @@ public static class CountedAttributesAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( - @Advice.Origin Method originMethod, - @Advice.Local("otelMethod") Method method, + @Advice.Origin Method method, @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, @Advice.Local("otelRequest") MethodRequest request) { - // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it // to local variable so that there would be only one call to Class.getMethod. - method = originMethod; request = new MethodRequest(method, args); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( - @Advice.Local("otelMethod") Method method, @Advice.Local("otelRequest") MethodRequest request, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - CountedHelper.recordCountWithAttributes(request, returnValue, throwable); + returnValue = CountedHelper.recordCountWithAttributes(request, returnValue, throwable); } } @SuppressWarnings("unused") public static class CountedAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.Origin Method originMethod, @Advice.Local("otelMethod") Method method) { - // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it - // to local variable so that there would be only one call to Class.getMethod. - method = originMethod; - } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( - @Advice.Local("otelMethod") Method method, + @Advice.Origin Method method, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - CountedHelper.recordCount(method, returnValue, throwable); + returnValue = CountedHelper.recordCount(method, returnValue, throwable); } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index 43c0a701fb20..38e470b37d0e 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -11,11 +11,14 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; public final class TimedHelper extends MetricsAnnotationHelper { @@ -27,23 +30,40 @@ protected Map computeValue(Class type) { } }; - public static void recordHistogramWithAttributes( - MethodRequest methodRequest, Throwable throwable, Object returnValue, long startNanoTime) { - Timed timedAnnotation = methodRequest.method().getAnnotation(Timed.class); - AttributesBuilder attributesBuilder = - getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); - double duration = getTransformedDuration(startNanoTime, timedAnnotation); - extractMetricAttributes(methodRequest, attributesBuilder); - getHistogram(methodRequest.method()).record(duration, attributesBuilder.build()); + public static Object recordHistogramWithAttributes( + MethodRequest methodRequest, Object returnValue, Throwable throwable, long startNanoTime) { + return recordHistogram( + methodRequest.method(), + returnValue, + throwable, + startNanoTime, + attributesBuilder -> extractMetricAttributes(methodRequest, attributesBuilder)); } - public static void recordHistogram( - Method method, Throwable throwable, Object returnValue, long startNanoTime) { - Timed timedAnnotation = method.getAnnotation(Timed.class); - AttributesBuilder attributesBuilder = - getCommonAttributeBuilder(throwable, returnValue, timedAnnotation); - double duration = getTransformedDuration(startNanoTime, timedAnnotation); - getHistogram(method).record(duration, attributesBuilder.build()); + public static Object recordHistogram( + Method method, Object returnValue, Throwable throwable, long startNanoTime) { + return recordHistogram(method, returnValue, throwable, startNanoTime, attributesBuilder -> {}); + } + + public static Object recordHistogram( + Method method, + Object returnValue, + Throwable throwable, + long startNanoTime, + Consumer additionalAttributes) { + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( + (context, method1, object, error) -> { + Timed timedAnnotation = method.getAnnotation(Timed.class); + AttributesBuilder attributesBuilder = + getCommonAttributeBuilder(error, object, timedAnnotation); + additionalAttributes.accept(attributesBuilder); + double duration = getTransformedDuration(startNanoTime, timedAnnotation); + getHistogram(method).record(duration, attributesBuilder.build()); + }, + Object.class, + method.getReturnType()); + return operationEndSupport.asyncEnd(Context.current(), method, returnValue, throwable); } private static AttributesBuilder getCommonAttributeBuilder( @@ -69,8 +89,7 @@ private static void extractException(Throwable throwable, AttributesBuilder attr private static void extractReturnValue( Timed countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { - if (null != countedAnnotation.returnValueAttribute() - && !countedAnnotation.returnValueAttribute().isEmpty()) { + if (returnValue != null && !countedAnnotation.returnValueAttribute().isEmpty()) { attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java index a31237351edb..6a40c70125bb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java @@ -77,27 +77,24 @@ public static class TimedAttributesAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( - @Advice.Origin Method originMethod, - @Advice.Local("otelMethod") Method method, + @Advice.Origin Method method, @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, @Advice.Local("otelRequest") MethodRequest request, @Advice.Local("startNanoTime") long startNanoTime) { - // Every usage of @Advice.Origin Method is replaced with a call to Class.getMethod, copy it // to local variable so that there would be only one call to Class.getMethod. - method = originMethod; request = new MethodRequest(method, args); startNanoTime = System.nanoTime(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( - @Advice.Local("otelMethod") Method method, @Advice.Local("otelRequest") MethodRequest request, @Advice.Local("startNanoTime") long startNanoTime, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - TimedHelper.recordHistogramWithAttributes(request, throwable, returnValue, startNanoTime); + returnValue = + TimedHelper.recordHistogramWithAttributes(request, returnValue, throwable, startNanoTime); } } @@ -121,7 +118,7 @@ public static void onExit( @Advice.Local("startNanoTime") long startNanoTime, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - TimedHelper.recordHistogram(method, throwable, returnValue, startNanoTime); + returnValue = TimedHelper.recordHistogram(method, returnValue, throwable, startNanoTime); } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java index 840f845d2a46..10e8a8d2d51a 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; import io.opentelemetry.instrumentation.annotations.Counted; +import java.util.concurrent.CompletableFuture; public class CountedExample { @@ -46,6 +47,11 @@ public void exampleWithException() { @Counted("example.ignore.count") public void exampleIgnore() {} + @Counted(value = "example.completable.future.count", returnValueAttribute = "returnValue") + public CompletableFuture completableFuture(CompletableFuture future) { + return future; + } + public static class ReturnObject { @Override public String toString() { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java index 6bf61f72d085..886f62ebc26d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -144,4 +145,30 @@ void testExampleIgnore() throws Exception { Thread.sleep(500); // sleep a bit just to make sure no metric is captured assertThat(testing.metrics()).isEmpty(); } + + @Test + void testCompletableFuture() throws Exception { + CompletableFuture future = new CompletableFuture<>(); + new CountedExample().completableFuture(future); + + Thread.sleep(500); // sleep a bit just to make sure no metric is captured + assertThat(testing.metrics()).isEmpty(); + + future.complete("Done"); + + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName("example.completable.future.count") + .satisfies( + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "Done" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))))); + } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java index f488223d699a..f229f0ea44f7 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; import io.opentelemetry.instrumentation.annotations.Timed; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class TimedExample { @@ -47,6 +48,11 @@ public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } + @Timed(value = "example.completable.future.duration", returnValueAttribute = "returnValue") + public CompletableFuture completableFuture(CompletableFuture future) { + return future; + } + public static class ReturnObject { @Override public String toString() { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index b089dcfb8591..32c7fac73455 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -151,4 +152,30 @@ void testExampleWithReturnValueAttribute() { p.getAttributes() .get(AttributeKey.stringKey("returnValue")))))); } + + @Test + void testCompletableFuture() throws Exception { + CompletableFuture future = new CompletableFuture<>(); + new TimedExample().completableFuture(future); + + Thread.sleep(500); // sleep a bit just to make sure no metric is captured + assertThat(testing.metrics()).isEmpty(); + + future.complete("Done"); + + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName("example.completable.future.duration") + .satisfies( + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + "Done" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("returnValue")))))); + } } diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java index 49f85ad0aea7..fe1237664f84 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java @@ -10,8 +10,8 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import org.reactivestreams.Publisher; @@ -44,7 +44,7 @@ public boolean supports(Class returnType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -54,7 +54,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object result, Throwable error) { - instrumenter.end(context, request, tryToGetResponse(responseType, result), error); + handler.handle(context, request, tryToGetResponse(responseType, result), error); } }; diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java index a66bda61749a..3c46a1277c42 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java @@ -10,8 +10,8 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -65,7 +65,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object response, Throwable error) { - instrumenter.end(context, request, tryToGetResponse(responseType, response), error); + handler.handle(context, request, tryToGetResponse(responseType, response), error); } }; diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java index 2814a15f42dc..c3aedd9f8fe8 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java @@ -10,8 +10,8 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - Instrumenter instrumenter, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -65,7 +65,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object response, Throwable error) { - instrumenter.end(context, request, tryToGetResponse(responseType, response), error); + handler.handle(context, request, tryToGetResponse(responseType, response), error); } }; From a844fa34e50230bd4965790f5773603597dde056 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 20 Jun 2024 16:17:08 +0300 Subject: [PATCH 13/51] move new annotations to incubator module --- .../kotlin/otel.java-conventions.gradle.kts | 1 + ...ntelemetry-instrumentation-annotations.txt | 36 +------------------ .../build.gradle.kts | 13 +++++++ .../instrumentation/annotations/Counted.java | 0 .../annotations/MetricAttribute.java | 0 .../instrumentation/annotations/Timed.java | 0 .../annotations/CountedUsageExamples.java | 0 .../annotations/TimedUsageExamples.java | 0 .../javaagent/build.gradle.kts | 4 +-- .../build.gradle.kts | 1 + settings.gradle.kts | 1 + 11 files changed, 19 insertions(+), 37 deletions(-) create mode 100644 instrumentation-annotations-incubator/build.gradle.kts rename {instrumentation-annotations => instrumentation-annotations-incubator}/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java (100%) rename {instrumentation-annotations => instrumentation-annotations-incubator}/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java (100%) rename {instrumentation-annotations => instrumentation-annotations-incubator}/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java (100%) rename {instrumentation-annotations => instrumentation-annotations-incubator}/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java (100%) rename {instrumentation-annotations => instrumentation-annotations-incubator}/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java (100%) diff --git a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts index 94b35baa54dc..c1b51f385bb6 100644 --- a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts @@ -467,6 +467,7 @@ configurations.configureEach { substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")).using(project(":instrumentation-api")) substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-incubator")).using(project(":instrumentation-api-incubator")) substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations")).using(project(":instrumentation-annotations")) + substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-incubator")).using(project(":instrumentation-annotations-incubator")) substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")).using( project(":instrumentation-annotations-support") ) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index 400966d1597a..a326f57f6bd0 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,36 +1,2 @@ Comparing source compatibility of opentelemetry-instrumentation-annotations-2.6.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.5.0.jar -+++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.Counted (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.annotation.Annotation - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String[] additionalAttributes() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String description() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String returnValueAttribute() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String unit() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() - +++ NEW ANNOTATION: java.lang.annotation.Target - +++ NEW ELEMENT: value=java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.CONSTRUCTOR (+) - +++ NEW ANNOTATION: java.lang.annotation.Retention - +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) -+++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.MetricAttribute (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.annotation.Annotation - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() - +++ NEW ANNOTATION: java.lang.annotation.Target - +++ NEW ELEMENT: value=java.lang.annotation.ElementType.PARAMETER (+) - +++ NEW ANNOTATION: java.lang.annotation.Retention - +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) -+++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.Timed (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.annotation.Annotation - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String[] additionalAttributes() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String description() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String returnValueAttribute() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.concurrent.TimeUnit unit() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() - +++ NEW ANNOTATION: java.lang.annotation.Target - +++ NEW ELEMENT: value=java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.CONSTRUCTOR (+) - +++ NEW ANNOTATION: java.lang.annotation.Retention - +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) +No changes. \ No newline at end of file diff --git a/instrumentation-annotations-incubator/build.gradle.kts b/instrumentation-annotations-incubator/build.gradle.kts new file mode 100644 index 000000000000..321ea11d7f85 --- /dev/null +++ b/instrumentation-annotations-incubator/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("otel.java-conventions") + id("otel.japicmp-conventions") + id("otel.publish-conventions") + + id("otel.animalsniffer-conventions") +} + +group = "io.opentelemetry.instrumentation" + +dependencies { + api("io.opentelemetry:opentelemetry-api") +} diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java similarity index 100% rename from instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java similarity index 100% rename from instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java diff --git a/instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java similarity index 100% rename from instrumentation-annotations/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java similarity index 100% rename from instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java rename to instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java diff --git a/instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java similarity index 100% rename from instrumentation-annotations/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java rename to instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts index 521fb5ef4de3..5e7a75094e16 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts @@ -9,7 +9,7 @@ plugins { muzzle { pass { group.set("io.opentelemetry") - module.set("opentelemetry-instrumentation-annotations") + module.set("opentelemetry-instrumentation-annotations-incubator") versions.set("(,)") } } @@ -25,7 +25,7 @@ dependencies { // see the comment in opentelemetry-api-1.0.gradle for more details compileOnly(project(":opentelemetry-instrumentation-annotations-shaded-for-instrumenting", configuration = "shadow")) - testImplementation(project(":instrumentation-annotations")) + testImplementation(project(":instrumentation-annotations-incubator")) testImplementation(project(":instrumentation-annotations-support")) } diff --git a/opentelemetry-instrumentation-annotations-shaded-for-instrumenting/build.gradle.kts b/opentelemetry-instrumentation-annotations-shaded-for-instrumenting/build.gradle.kts index 3dc29118754b..c1d3e35bd85d 100644 --- a/opentelemetry-instrumentation-annotations-shaded-for-instrumenting/build.gradle.kts +++ b/opentelemetry-instrumentation-annotations-shaded-for-instrumenting/build.gradle.kts @@ -9,6 +9,7 @@ group = "io.opentelemetry.javaagent" dependencies { implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations") + implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-incubator") } // OpenTelemetry Instrumentation Annotations shaded so that it can be used in instrumentation of diff --git a/settings.gradle.kts b/settings.gradle.kts index f48d89b1a0e8..21e2447bfa1c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -131,6 +131,7 @@ include(":bom-alpha") include(":instrumentation-api") include(":instrumentation-api-incubator") include(":instrumentation-annotations") +include(":instrumentation-annotations-incubator") include(":instrumentation-annotations-support") include(":instrumentation-annotations-support-testing") From 2c2c3d593062e7e57ddeaf9f302b29d9898fc64c Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 21 Jun 2024 16:03:30 +0300 Subject: [PATCH 14/51] rework static attribute support --- .../instrumentation/annotations/Counted.java | 24 +--- .../annotations/StaticMetricAttribute.java | 35 ++++++ .../annotations/StaticMetricAttributes.java | 30 +++++ .../instrumentation/annotations/Timed.java | 28 +---- .../api/annotation/support/MethodBinder.java | 37 ++++++ .../v2_6/CountedHelper.java | 85 +++++-------- .../v2_6/CountedInstrumentation.java | 4 +- .../v2_6/MetricsAnnotationHelper.java | 79 ++++++++---- .../v2_6/TimedHelper.java | 112 +++++++----------- .../v2_6/TimedInstrumentation.java | 4 +- .../v2_6/counted/CountedExample.java | 13 +- .../counted/CountedInstrumentationTest.java | 28 +---- .../v2_6/timed/TimedExample.java | 12 +- .../v2_6/timed/TimedInstrumentationTest.java | 28 +---- 14 files changed, 257 insertions(+), 262 deletions(-) create mode 100644 instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java create mode 100644 instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java index 7f2c79906f8f..63a60771836c 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java @@ -18,10 +18,9 @@ * *
    *
  • code.namespace: The fully qualified name of the class whose method is invoked. - *
  • code.function: The name of the annotated method, or "new" if the annotation is on a - * constructor. + *
  • code.function: The name of the annotated method. *
  • exception.type: This is only present if an Exception is thrown, and contains the - * {@link Class#getCanonicalName() canonical name} of the Exception. + * {@link Class#getName name} of the Exception class. *
* *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation @@ -63,28 +62,13 @@ */ String unit() default "{invocation}"; - /** - * List of key-value pairs to supply additional attributes. - * - *

Example: - * - *

-   * {@literal @}Counted(
-   *     additionalAttributes = {
-   *       "key1", "value1",
-   *       "key2", "value2",
-   * })
-   * 
- */ - String[] additionalAttributes() default {}; - /** * Attribute name for the return value. * *

The name of the attribute for the return value of the method call. {@link Object#toString()} - * will be called on the return value to convert it to a String. + * may be called on the return value to convert it to a String. * - *

By default, the instrument will not have an attribute with the return value. + *

By default, the instrument will not record an attribute with the return value. * *

Warning: be careful to fill it because it might cause an explosion of the cardinality on * your metric diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java new file mode 100644 index 000000000000..9af9fbf18da8 --- /dev/null +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation allows for adding attributes to the metrics recorded using {@link Timed} and + * {@link Counted} annotations. + * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the attribute should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(StaticMetricAttributes.class) +public @interface StaticMetricAttribute { + + /** Name of the attribute. */ + String name(); + + /** Value of the attribute. */ + String value(); +} diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java new file mode 100644 index 000000000000..7904538279c2 --- /dev/null +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation allows for adding attributes to the metrics recorded using {@link Timed} and + * {@link Counted} annotations. + * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the attribute should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface StaticMetricAttributes { + + /** Array of {@link StaticMetricAttribute} annotations describing the added attributes. */ + StaticMetricAttribute[] value(); +} diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java index 7ea5cd22a4ec..9dff708284a7 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java @@ -12,17 +12,16 @@ import java.util.concurrent.TimeUnit; /** - * This annotation creates a {@link io.opentelemetry.api.metrics.LongHistogram Histogram} instrument - * observing the duration of invocations of the annotated method or constructor. + * This annotation creates a {@link io.opentelemetry.api.metrics.DoubleHistogram Histogram} + * instrument observing the duration of invocations of the annotated method or constructor. * *

By default, the Histogram instrument will have the following attributes: * *

    *
  • code.namespace: The fully qualified name of the class whose method is invoked. - *
  • code.function: The name of the annotated method, or "new" of the annotation is on a - * constructor. + *
  • code.function: The name of the annotated method. *
  • exception.type: This is only present if an Exception is thrown, and contains the - * {@link Class#getCanonicalName canonical name} of the Exception. + * {@link Class#getName name} of the Exception class. *
* *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation @@ -59,28 +58,13 @@ */ TimeUnit unit() default TimeUnit.SECONDS; - /** - * List of key-value pairs to supply additional attributes. - * - *

Example: - * - *

-   * {@literal @}Timed(
-   *     additionalAttributes = {
-   *       "key1", "value1",
-   *       "key2", "value2",
-   * })
-   * 
- */ - String[] additionalAttributes() default {}; - /** * Attribute name for the return value. * *

The name of the attribute for the return value of the method call. {@link Object#toString()} - * will be called on the return value to convert it to a String. + * may be called on the return value to convert it to a String. * - *

By default, the instrument will not have an attribute with the return value. + *

By default, the instrument will not record an attribute with the return value. * *

Warning: be careful to fill it because it might cause an explosion of the cardinality on * your metric diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java new file mode 100644 index 000000000000..f52c4183407e --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support; + +import io.opentelemetry.api.common.AttributesBuilder; +import java.lang.reflect.Method; +import java.util.function.BiConsumer; +import javax.annotation.Nullable; + +public final class MethodBinder { + + @Nullable + public static BiConsumer bindReturnValue( + Method method, String attributeName) { + Class returnType = method.getReturnType(); + if (returnType == void.class) { + return null; + } + AttributeBinding binding = AttributeBindingFactory.createBinding(attributeName, returnType); + return binding::apply; + } + + @Nullable + public static BiConsumer bindParameters( + Method method, ParameterAttributeNamesExtractor parameterAttributeNamesExtractor) { + AttributeBindings bindings = AttributeBindings.bind(method, parameterAttributeNamesExtractor); + if (bindings.isEmpty()) { + return null; + } + return bindings::apply; + } + + private MethodBinder() {} +} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java index 6fc4dcfb997a..2261932e6c21 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java @@ -6,8 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import application.io.opentelemetry.instrumentation.annotations.Counted; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; @@ -15,85 +13,60 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; public final class CountedHelper extends MetricsAnnotationHelper { - private static final ClassValue> counters = - new ClassValue>() { + private static final ClassValue> counters = + new ClassValue>() { @Override - protected Map computeValue(Class type) { + protected Map computeValue(Class type) { return new ConcurrentHashMap<>(); } }; - public static Object recordCountWithAttributes( + public static Object recordWithAttributes( MethodRequest methodRequest, Object returnValue, Throwable throwable) { - return recordCount( - methodRequest.method(), - returnValue, - throwable, - attributesBuilder -> extractMetricAttributes(methodRequest, attributesBuilder)); + return record(methodRequest.method(), returnValue, throwable, methodRequest.args()); } - public static Object recordCount(Method method, Object returnValue, Throwable throwable) { - return recordCount(method, returnValue, throwable, attributesBuilder -> {}); + public static Object record(Method method, Object returnValue, Throwable throwable) { + return record(method, returnValue, throwable, null); } - private static Object recordCount( - Method method, - Object returnValue, - Throwable throwable, - Consumer additionalAttributes) { + private static Object record( + Method method, Object returnValue, Throwable throwable, Object[] arguments) { AsyncOperationEndSupport operationEndSupport = AsyncOperationEndSupport.create( - (context, method1, object, error) -> { - Counted countedAnnotation = method1.getAnnotation(Counted.class); - AttributesBuilder attributesBuilder = - getCommonAttributesBuilder(countedAnnotation, object, error); - additionalAttributes.accept(attributesBuilder); - getCounter(method1).add(1, attributesBuilder.build()); - }, + (context, m, object, error) -> getMethodCounter(m).record(object, arguments, error), Object.class, method.getReturnType()); return operationEndSupport.asyncEnd(Context.current(), method, returnValue, throwable); } - private static AttributesBuilder getCommonAttributesBuilder( - Counted countedAnnotation, Object returnValue, Throwable throwable) { - AttributesBuilder attributesBuilder = Attributes.builder(); - extractAdditionAttributes(countedAnnotation.additionalAttributes(), attributesBuilder); - extractReturnValue(countedAnnotation, returnValue, attributesBuilder); - extractException(throwable, attributesBuilder); - return attributesBuilder; + private static MethodCounter getMethodCounter(Method method) { + return counters.get(method.getDeclaringClass()).computeIfAbsent(method, MethodCounter::new); } - private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { - if (null != throwable) { - attributesBuilder.put("exception", throwable.getClass().getName()); - } - } + private static class MethodCounter { + private final LongCounter counter; + private final MetricAttributeHelper attributeHelper; + + MethodCounter(Method method) { + Counted countedAnnotation = method.getAnnotation(Counted.class); + counter = + METER + .counterBuilder(countedAnnotation.value()) + .setDescription(countedAnnotation.description()) + .setUnit(countedAnnotation.unit()) + .build(); - private static void extractReturnValue( - Counted countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { - if (returnValue != null && !countedAnnotation.returnValueAttribute().isEmpty()) { - attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); + String returnValueAttribute = countedAnnotation.returnValueAttribute(); + attributeHelper = new MetricAttributeHelper(method, returnValueAttribute); } - } - private static LongCounter getCounter(Method method) { - return counters - .get(method.getDeclaringClass()) - .computeIfAbsent( - method, - m -> { - Counted countedAnnotation = m.getAnnotation(Counted.class); - return METER - .counterBuilder(countedAnnotation.value()) - .setDescription(countedAnnotation.description()) - .setUnit(countedAnnotation.unit()) - .build(); - }); + void record(Object returnValue, Object[] arguments, Throwable throwable) { + counter.add(1, attributeHelper.getAttributes(returnValue, arguments, throwable)); + } } private CountedHelper() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java index 9491592b6d37..1c199a3868e9 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java @@ -90,7 +90,7 @@ public static void onExit( @Advice.Local("otelRequest") MethodRequest request, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - returnValue = CountedHelper.recordCountWithAttributes(request, returnValue, throwable); + returnValue = CountedHelper.recordWithAttributes(request, returnValue, throwable); } } @@ -102,7 +102,7 @@ public static void onExit( @Advice.Origin Method method, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - returnValue = CountedHelper.recordCount(method, returnValue, throwable); + returnValue = CountedHelper.record(method, returnValue, throwable); } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java index c1fff4fc5f36..9d1accc92c31 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java @@ -6,44 +6,44 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.Meter; -import io.opentelemetry.instrumentation.api.annotation.support.SpanAttributesExtractor; -import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; +import io.opentelemetry.instrumentation.api.annotation.support.MethodBinder; +import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; +import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.util.function.BiConsumer; import javax.annotation.Nullable; public abstract class MetricsAnnotationHelper { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); - private static final SpanAttributesExtractor PARAMETER_ATTRIBUTES = createAttributesExtractor(); + static final ParameterAttributeNamesExtractor PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR = + (method, parameters) -> { + String[] attributeNames = new String[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + attributeNames[i] = attributeName(parameters[i]); + } + return attributeNames; + }; - static void extractMetricAttributes( - MethodRequest methodRequest, AttributesBuilder attributesBuilder) { - attributesBuilder.putAll( - PARAMETER_ATTRIBUTES.extract(methodRequest.method(), methodRequest.args())); - } + static void addStaticAttributes(Method method, AttributesBuilder attributesBuilder) { + attributesBuilder.put( + CodeIncubatingAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()); + attributesBuilder.put(CodeIncubatingAttributes.CODE_FUNCTION, method.getName()); - static void extractAdditionAttributes(String[] attributes, AttributesBuilder attributesBuilder) { - int length = attributes.length; - for (int i = 0; i + 1 < length; i += 2) { - attributesBuilder.put(attributes[i], attributes[i + 1]); + StaticMetricAttribute[] staticMetricAttributes = + method.getDeclaredAnnotationsByType(StaticMetricAttribute.class); + for (StaticMetricAttribute staticMetricAttribute : staticMetricAttributes) { + attributesBuilder.put(staticMetricAttribute.name(), staticMetricAttribute.value()); } } - private static SpanAttributesExtractor createAttributesExtractor() { - return SpanAttributesExtractor.create( - (method, parameters) -> { - String[] attributeNames = new String[parameters.length]; - for (int i = 0; i < parameters.length; i++) { - attributeNames[i] = attributeName(parameters[i]); - } - return attributeNames; - }); - } - @Nullable private static String attributeName(Parameter parameter) { MetricAttribute annotation = parameter.getDeclaredAnnotation(MetricAttribute.class); @@ -59,4 +59,37 @@ private static String attributeName(Parameter parameter) { return null; } } + + static class MetricAttributeHelper { + private final BiConsumer bindParameters; + private final BiConsumer bindReturn; + private final Attributes staticAttributes; + + MetricAttributeHelper(Method method, String returnValueAttribute) { + bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); + bindReturn = + !returnValueAttribute.isEmpty() + ? MethodBinder.bindReturnValue(method, returnValueAttribute) + : null; + + AttributesBuilder attributesBuilder = Attributes.builder(); + addStaticAttributes(method, attributesBuilder); + staticAttributes = attributesBuilder.build(); + } + + Attributes getAttributes(Object returnValue, Object[] arguments, Throwable throwable) { + AttributesBuilder attributesBuilder = Attributes.builder(); + attributesBuilder.putAll(staticAttributes); + if (arguments != null && bindParameters != null) { + bindParameters.accept(attributesBuilder, arguments); + } + if (returnValue != null && bindReturn != null) { + bindReturn.accept(attributesBuilder, returnValue); + } + if (throwable != null) { + attributesBuilder.put("exception.type", throwable.getClass().getName()); + } + return attributesBuilder.build(); + } + } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java index 38e470b37d0e..07d11e4c3961 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java @@ -8,8 +8,6 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; import application.io.opentelemetry.instrumentation.annotations.Timed; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; @@ -18,98 +16,48 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; public final class TimedHelper extends MetricsAnnotationHelper { - private static final ClassValue> histograms = - new ClassValue>() { + private static final ClassValue> timers = + new ClassValue>() { @Override - protected Map computeValue(Class type) { + protected Map computeValue(Class type) { return new ConcurrentHashMap<>(); } }; - public static Object recordHistogramWithAttributes( + public static Object recordWithAttributes( MethodRequest methodRequest, Object returnValue, Throwable throwable, long startNanoTime) { - return recordHistogram( - methodRequest.method(), - returnValue, - throwable, - startNanoTime, - attributesBuilder -> extractMetricAttributes(methodRequest, attributesBuilder)); + return record( + methodRequest.method(), returnValue, throwable, startNanoTime, methodRequest.args()); } - public static Object recordHistogram( + public static Object record( Method method, Object returnValue, Throwable throwable, long startNanoTime) { - return recordHistogram(method, returnValue, throwable, startNanoTime, attributesBuilder -> {}); + return record(method, returnValue, throwable, startNanoTime, null); } - public static Object recordHistogram( + private static Object record( Method method, Object returnValue, Throwable throwable, long startNanoTime, - Consumer additionalAttributes) { + Object[] arguments) { AsyncOperationEndSupport operationEndSupport = AsyncOperationEndSupport.create( - (context, method1, object, error) -> { - Timed timedAnnotation = method.getAnnotation(Timed.class); - AttributesBuilder attributesBuilder = - getCommonAttributeBuilder(error, object, timedAnnotation); - additionalAttributes.accept(attributesBuilder); - double duration = getTransformedDuration(startNanoTime, timedAnnotation); - getHistogram(method).record(duration, attributesBuilder.build()); - }, + (context, m, object, error) -> + getMethodTimer(m).record(object, arguments, error, startNanoTime), Object.class, method.getReturnType()); return operationEndSupport.asyncEnd(Context.current(), method, returnValue, throwable); } - private static AttributesBuilder getCommonAttributeBuilder( - Throwable throwable, Object returnValue, Timed timedAnnotation) { - AttributesBuilder attributesBuilder = Attributes.builder(); - extractAdditionAttributes(timedAnnotation.additionalAttributes(), attributesBuilder); - extractReturnValue(timedAnnotation, returnValue, attributesBuilder); - extractException(throwable, attributesBuilder); - return attributesBuilder; + private static MethodTimer getMethodTimer(Method method) { + return timers.get(method.getDeclaringClass()).computeIfAbsent(method, MethodTimer::new); } - private static double getTransformedDuration(long startNanoTime, Timed timedAnnotation) { - TimeUnit unit = timedAnnotation.unit(); - long nanoDelta = System.nanoTime() - startNanoTime; - return (double) nanoDelta / NANOSECONDS.convert(1, unit); - } - - private static void extractException(Throwable throwable, AttributesBuilder attributesBuilder) { - if (null != throwable) { - attributesBuilder.put("exception", throwable.getClass().getName()); - } - } - - private static void extractReturnValue( - Timed countedAnnotation, Object returnValue, AttributesBuilder attributesBuilder) { - if (returnValue != null && !countedAnnotation.returnValueAttribute().isEmpty()) { - attributesBuilder.put(countedAnnotation.returnValueAttribute(), returnValue.toString()); - } - } - - private static DoubleHistogram getHistogram(Method method) { - return histograms - .get(method.getDeclaringClass()) - .computeIfAbsent( - method, - m -> { - Timed timedAnnotation = m.getAnnotation(Timed.class); - return METER - .histogramBuilder(timedAnnotation.value()) - .setDescription(timedAnnotation.description()) - .setUnit(toString(timedAnnotation.unit())) - .build(); - }); - } - - private static String toString(TimeUnit timeUnit) { + private static String timeUnitToString(TimeUnit timeUnit) { switch (timeUnit) { case NANOSECONDS: return "ns"; @@ -129,5 +77,35 @@ private static String toString(TimeUnit timeUnit) { throw new IllegalArgumentException("Unsupported time unit " + timeUnit); } + private static double getDuration(long startNanoTime, TimeUnit unit) { + long nanoDelta = System.nanoTime() - startNanoTime; + return (double) nanoDelta / NANOSECONDS.convert(1, unit); + } + + private static class MethodTimer { + private final TimeUnit unit; + private final DoubleHistogram histogram; + private final MetricAttributeHelper attributeHelper; + + MethodTimer(Method method) { + Timed timedAnnotation = method.getAnnotation(Timed.class); + unit = timedAnnotation.unit(); + histogram = + METER + .histogramBuilder(timedAnnotation.value()) + .setDescription(timedAnnotation.description()) + .setUnit(timeUnitToString(unit)) + .build(); + + String returnValueAttribute = timedAnnotation.returnValueAttribute(); + attributeHelper = new MetricAttributeHelper(method, returnValueAttribute); + } + + void record(Object returnValue, Object[] arguments, Throwable throwable, long startNanoTime) { + double duration = getDuration(startNanoTime, unit); + histogram.record(duration, attributeHelper.getAttributes(returnValue, arguments, throwable)); + } + } + private TimedHelper() {} } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java index 6a40c70125bb..3b66154a1d75 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java @@ -94,7 +94,7 @@ public static void onExit( @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { returnValue = - TimedHelper.recordHistogramWithAttributes(request, returnValue, throwable, startNanoTime); + TimedHelper.recordWithAttributes(request, returnValue, throwable, startNanoTime); } } @@ -118,7 +118,7 @@ public static void onExit( @Advice.Local("startNanoTime") long startNanoTime, @Advice.Return(typing = Assigner.Typing.DYNAMIC, readOnly = false) Object returnValue, @Advice.Thrown Throwable throwable) { - returnValue = TimedHelper.recordHistogram(method, returnValue, throwable, startNanoTime); + returnValue = TimedHelper.record(method, returnValue, throwable, startNanoTime); } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java index 10e8a8d2d51a..b4d875681416 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; import io.opentelemetry.instrumentation.annotations.Counted; +import io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; import java.util.concurrent.CompletableFuture; public class CountedExample { @@ -24,16 +25,12 @@ public void exampleWithDescription() {} @Counted(value = "example.with.unit.count", unit = METRIC_UNIT) public void exampleWithUnit() {} - @Counted( - value = "example.with.attributes.count", - additionalAttributes = {"key1", "value1", "key2", "value2"}) + @Counted("example.with.attributes.count") + @StaticMetricAttribute(name = "key1", value = "value1") + @StaticMetricAttribute(name = "key2", value = "value2") + @StaticMetricAttribute(name = "key2", value = "value2") public void exampleWithAdditionalAttributes1() {} - @Counted( - value = "example.with.attributes2.count", - additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) - public void exampleWithAdditionalAttributes2() {} - @Counted(value = "example.with.return.count", returnValueAttribute = "returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java index 886f62ebc26d..85a3de21f36e 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java @@ -71,32 +71,6 @@ void testExampleWithAdditionalAttributes1() { .get(AttributeKey.stringKey("key2")))))); } - @Test - void testExampleWithAdditionalAttributes2() { - new CountedExample().exampleWithAdditionalAttributes2(); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - metric -> - metric - .hasName("example.with.attributes2.count") - .satisfies( - metricData -> - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key2"))) - && null - == p.getAttributes() - .get(AttributeKey.stringKey("key3"))))); - } - @Test void testExampleWithReturnAttribute() { new CountedExample().exampleWithReturnValueAttribute(); @@ -136,7 +110,7 @@ void testExampleWithException() { .getName() .equals( p.getAttributes() - .get(AttributeKey.stringKey("exception")))))); + .get(AttributeKey.stringKey("exception.type")))))); } @Test diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java index f229f0ea44f7..5bfca8b7a40f 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; +import io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; import io.opentelemetry.instrumentation.annotations.Timed; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -25,16 +26,11 @@ public void exampleWithUnit() throws InterruptedException { Thread.sleep(2000); } - @Timed( - value = "example.with.attributes.duration", - additionalAttributes = {"key1", "value1", "key2", "value2"}) + @Timed("example.with.attributes.duration") + @StaticMetricAttribute(name = "key1", value = "value1") + @StaticMetricAttribute(name = "key2", value = "value2") public void exampleWithAdditionalAttributes1() {} - @Timed( - value = "example.with.attributes2.duration", - additionalAttributes = {"key1", "value1", "key2", "value2", "key3"}) - public void exampleWithAdditionalAttributes2() {} - @Timed("example.ignore.duration") public void exampleIgnore() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java index 32c7fac73455..9b2bd56af656 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java @@ -78,32 +78,6 @@ void testExampleWithAdditionalAttributes1() { .get(AttributeKey.stringKey("key2")))))); } - @Test - void testExampleWithAdditionalAttributes2() { - new TimedExample().exampleWithAdditionalAttributes2(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, - metric -> - metric - .hasName("example.with.attributes2.duration") - .satisfies( - metricData -> - assertThat(metricData.getData().getPoints()) - .allMatch( - p -> - "value1" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key1"))) - && "value2" - .equals( - p.getAttributes() - .get(AttributeKey.stringKey("key2"))) - && null - == p.getAttributes() - .get(AttributeKey.stringKey("key3"))))); - } - @Test void testExampleIgnore() throws Exception { new TimedExample().exampleIgnore(); @@ -132,7 +106,7 @@ void testExampleWithException() { .getName() .equals( p.getAttributes() - .get(AttributeKey.stringKey("exception")))))); + .get(AttributeKey.stringKey("exception.type")))))); } @Test From 3e3b10099ee4e552c356d3c0f7f6d21c14fca1c6 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 21 Jun 2024 16:52:11 +0300 Subject: [PATCH 15/51] disable indy --- .../v2_6/MetricsAnnotationInstrumentationModule.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java index f2e1dbb28320..f8e5128a162d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java @@ -40,6 +40,12 @@ public ElementMatcher.Junction classLoaderMatcher() { return hasClassesNamed("application.io.opentelemetry.instrumentation.annotations.Counted"); } + @Override + public boolean isIndyModule() { + // TimedInstrumentation does not work with indy + return false; + } + @Override public List typeInstrumentations() { return asList(new CountedInstrumentation(), new TimedInstrumentation()); From de28d298eeb6084c88c895eebdc7eda42d22a742 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 26 Jun 2024 15:18:43 +0300 Subject: [PATCH 16/51] add javadoc --- .../instrumentation/api/annotation/support/MethodBinder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java index f52c4183407e..0413b3298feb 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/MethodBinder.java @@ -10,8 +10,10 @@ import java.util.function.BiConsumer; import javax.annotation.Nullable; +/** Helper class for binding method parameters and return value to attributes. */ public final class MethodBinder { + /** Create binding for method return value. */ @Nullable public static BiConsumer bindReturnValue( Method method, String attributeName) { @@ -23,6 +25,7 @@ public static BiConsumer bindReturnValue( return binding::apply; } + /** Create binding for method parameters. */ @Nullable public static BiConsumer bindParameters( Method method, ParameterAttributeNamesExtractor parameterAttributeNamesExtractor) { From 8a01999446c93c4be4d0c9389aeb52983a811b4f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 10 Jul 2024 12:42:51 +0300 Subject: [PATCH 17/51] move classes to incubator package --- .../annotations/{ => incubator}/Counted.java | 2 +- .../{ => incubator}/MetricAttribute.java | 2 +- .../{ => incubator}/StaticMetricAttribute.java | 2 +- .../{ => incubator}/StaticMetricAttributes.java | 2 +- .../annotations/{ => incubator}/Timed.java | 2 +- .../{ => incubator}/CountedUsageExamples.java | 2 +- .../{ => incubator}/TimedUsageExamples.java | 2 +- .../javaagent/build.gradle.kts | 2 +- .../incubator}/CountedHelper.java | 4 ++-- .../incubator}/CountedInstrumentation.java | 7 ++++--- .../incubator}/MetricsAnnotationHelper.java | 8 ++++---- .../MetricsAnnotationInstrumentationModule.java | 16 ++++++++++------ .../incubator}/TimedHelper.java | 4 ++-- .../incubator}/TimedInstrumentation.java | 7 ++++--- .../incubator}/counted/CountedExample.java | 6 +++--- .../counted/CountedInstrumentationTest.java | 10 +++++----- .../incubator}/timed/TimedExample.java | 6 +++--- .../timed/TimedInstrumentationTest.java | 8 ++++---- javaagent/build.gradle.kts | 2 +- settings.gradle.kts | 2 +- 20 files changed, 51 insertions(+), 45 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/Counted.java (98%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/MetricAttribute.java (95%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/StaticMetricAttribute.java (94%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/StaticMetricAttributes.java (93%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/Timed.java (97%) rename instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/CountedUsageExamples.java (84%) rename instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/{ => incubator}/TimedUsageExamples.java (83%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6 => opentelemetry-instrumentation-annotations-incubator}/javaagent/build.gradle.kts (88%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/CountedHelper.java (98%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/CountedInstrumentation.java (96%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/MetricsAnnotationHelper.java (97%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/MetricsAnnotationInstrumentationModule.java (82%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/TimedHelper.java (98%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/TimedInstrumentation.java (96%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/counted/CountedExample.java (90%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/counted/CountedInstrumentationTest.java (95%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/timed/TimedExample.java (90%) rename instrumentation/opentelemetry-instrumentation-annotations/{opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6 => opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator}/timed/TimedInstrumentationTest.java (96%) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java similarity index 98% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index 63a60771836c..35e5cc3b001b 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java similarity index 95% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java index 39b753fb9b9e..975638922c30 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/MetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java similarity index 94% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java index 9af9fbf18da8..b65881016374 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java similarity index 93% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java index 7904538279c2..904c3daf81b7 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/StaticMetricAttributes.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java similarity index 97% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index 9dff708284a7..0944cc8b5311 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java similarity index 84% rename from instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java rename to instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java index 35b66aeeeeeb..0cd9adf68120 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/CountedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; public class CountedUsageExamples { diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java similarity index 83% rename from instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java rename to instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java index 7d33d0adf4f9..793c55f8de4b 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/TimedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.annotations; +package io.opentelemetry.instrumentation.annotations.incubator; public class TimedUsageExamples { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/build.gradle.kts similarity index 88% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/build.gradle.kts index 5e7a75094e16..f5e3d05ae1f4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/build.gradle.kts @@ -35,7 +35,7 @@ tasks { } test { jvmArgs( - "-Dotel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods=io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample[exampleIgnore];io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample[exampleIgnore]" + "-Dotel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods=io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample[exampleIgnore];io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample[exampleIgnore]" ) } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java index 2261932e6c21..cb0ac6493338 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; -import application.io.opentelemetry.instrumentation.annotations.Counted; +import application.io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java similarity index 96% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java index 1c199a3868e9..d18e6283f162 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; @@ -34,13 +34,14 @@ public class CountedInstrumentation implements TypeInstrumentation { CountedInstrumentation() { annotatedMethodMatcher = - isAnnotatedWith(named("application.io.opentelemetry.instrumentation.annotations.Counted")); + isAnnotatedWith( + named("application.io.opentelemetry.instrumentation.annotations.incubator.Counted")); annotatedParametersMatcher = hasParameters( whereAny( isAnnotatedWith( named( - "application.io.opentelemetry.instrumentation.annotations.MetricAttribute")))); + "application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute")))); // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation excludedMethodsMatcher = AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java similarity index 97% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 9d1accc92c31..37417fea71dc 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; -import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; -import application.io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -21,7 +21,7 @@ public abstract class MetricsAnnotationHelper { private static final String INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + "io.opentelemetry.opentelemetry-instrumentation-annotations-incubator"; static final Meter METER = GlobalOpenTelemetry.get().getMeter(INSTRUMENTATION_NAME); static final ParameterAttributeNamesExtractor PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR = (method, parameters) -> { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java similarity index 82% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java index f8e5128a162d..dce08cd60a6e 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/MetricsAnnotationInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; -import application.io.opentelemetry.instrumentation.annotations.Counted; -import application.io.opentelemetry.instrumentation.annotations.MetricAttribute; -import application.io.opentelemetry.instrumentation.annotations.Timed; +import application.io.opentelemetry.instrumentation.annotations.incubator.Counted; +import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.Timed; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -25,7 +25,10 @@ public class MetricsAnnotationInstrumentationModule extends InstrumentationModule { public MetricsAnnotationInstrumentationModule() { - super("opentelemetry-instrumentation-annotations", "metrics-annotations"); + super( + "opentelemetry-instrumentation-annotations", + "opentelemetry-instrumentation-annotations-incubator", + "metrics-annotations"); } @Override @@ -37,7 +40,8 @@ public int order() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("application.io.opentelemetry.instrumentation.annotations.Counted"); + return hasClassesNamed( + "application.io.opentelemetry.instrumentation.annotations.incubator.Counted"); } @Override diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java similarity index 98% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index 07d11e4c3961..f32c2b789f7d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import application.io.opentelemetry.instrumentation.annotations.Timed; +import application.io.opentelemetry.instrumentation.annotations.incubator.Timed; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java similarity index 96% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java index 3b66154a1d75..94c31d0c2d70 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.KotlinCoroutineUtil.isKotlinSuspendMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; @@ -34,13 +34,14 @@ public class TimedInstrumentation implements TypeInstrumentation { TimedInstrumentation() { annotatedMethodMatcher = - isAnnotatedWith(named("application.io.opentelemetry.instrumentation.annotations.Timed")); + isAnnotatedWith( + named("application.io.opentelemetry.instrumentation.annotations.incubator.Timed")); annotatedParametersMatcher = hasParameters( whereAny( isAnnotatedWith( named( - "application.io.opentelemetry.instrumentation.annotations.MetricAttribute")))); + "application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute")))); // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation excludedMethodsMatcher = AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java similarity index 90% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index b4d875681416..d25083b343a1 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; -import io.opentelemetry.instrumentation.annotations.Counted; -import io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; +import io.opentelemetry.instrumentation.annotations.incubator.Counted; +import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; import java.util.concurrent.CompletableFuture; public class CountedExample { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java similarity index 95% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java index 85a3de21f36e..5e10d4c9da8c 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_DESCRIPTION; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_NAME; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.counted.CountedExample.METRIC_UNIT; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_NAME; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_UNIT; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -23,7 +23,7 @@ class CountedInstrumentationTest { AgentInstrumentationExtension.create(); private static final String INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + "io.opentelemetry.opentelemetry-instrumentation-annotations-incubator"; @Test void testExampleWithAnotherName() { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java similarity index 90% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 5bfca8b7a40f..561ac764e134 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; -import io.opentelemetry.instrumentation.annotations.StaticMetricAttribute; -import io.opentelemetry.instrumentation.annotations.Timed; +import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; +import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java similarity index 96% rename from instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java rename to instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index 9b2bd56af656..134ccadf8faa 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/v2_6/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed; +package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.METRIC_DESCRIPTION; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.v2_6.timed.TimedExample.METRIC_NAME; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_DESCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_NAME; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -22,7 +22,7 @@ class TimedInstrumentationTest { AgentInstrumentationExtension.create(); private static final String TIMED_INSTRUMENTATION_NAME = - "io.opentelemetry.opentelemetry-instrumentation-annotations-2.6"; + "io.opentelemetry.opentelemetry-instrumentation-annotations-incubator"; @Test void testExampleWithName() { diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index f827214b1a5c..e801fd7cfd83 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -76,7 +76,7 @@ dependencies { baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-api:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent")) - baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-2.6:javaagent")) + baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-incubator:javaagent")) baseJavaagentLibs(project(":instrumentation:executors:javaagent")) baseJavaagentLibs(project(":instrumentation:internal:internal-application-logger:javaagent")) baseJavaagentLibs(project(":instrumentation:internal:internal-class-loader:javaagent")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 07174d810ee8..7a42e9854bd3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -459,8 +459,8 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent") include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent") include(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent") include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent") -include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-2.6:javaagent") include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent") +include(":instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-incubator:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:javaagent") include(":instrumentation:opentelemetry-instrumentation-api:testing") include(":instrumentation:oracle-ucp-11.2:javaagent") From 6ba7771280b3fc3c0d5a7ed216c2c5a54783f90d Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 13 Aug 2024 19:11:02 +0300 Subject: [PATCH 18/51] address review comment --- .../instrumentation/annotations/incubator/Counted.java | 2 +- .../annotations/incubator/MetricAttribute.java | 7 +++---- .../instrumentation/annotations/incubator/Timed.java | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index 35e5cc3b001b..3071a53c78f6 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -70,7 +70,7 @@ * *

By default, the instrument will not record an attribute with the return value. * - *

Warning: be careful to fill it because it might cause an explosion of the cardinality on + *

Warning: be careful using this because it might cause an explosion of the cardinality on * your metric */ String returnValueAttribute() default ""; diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java index 975638922c30..484db7b89516 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java @@ -20,20 +20,19 @@ *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation * processor. + * + *

Warning: be careful using this because it might cause an explosion of the cardinality on your + * metric. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface MetricAttribute { - /** * Optional name of the attribute. * *

If not specified and the code is compiled using the `{@code -parameters}` argument to * `javac`, the parameter name will be used instead. If the parameter name is not available, e.g., * because the code was not compiled with that flag, the attribute will be ignored. - * - *

Warning: be careful to fill it because it might cause an explosion of the cardinality on - * your metric */ String value() default ""; } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index 0944cc8b5311..d096defcde3f 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -66,7 +66,7 @@ * *

By default, the instrument will not record an attribute with the return value. * - *

Warning: be careful to fill it because it might cause an explosion of the cardinality on + *

Warning: be careful using this because it might cause an explosion of the cardinality on * your metric */ String returnValueAttribute() default ""; From 00103678737b245b61df817c4d8c4d9df1f02468 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 14 Aug 2024 16:19:08 +0300 Subject: [PATCH 19/51] move return value attribute to separate annotation --- .../annotations/incubator/Counted.java | 13 ------- .../incubator/MetricAttribute.java | 1 + .../MetricAttributeForReturnValue.java | 38 +++++++++++++++++++ .../annotations/incubator/Timed.java | 13 ------- .../incubator/CountedHelper.java | 4 +- .../incubator/MetricsAnnotationHelper.java | 9 +++-- .../incubator/TimedHelper.java | 4 +- .../incubator/counted/CountedExample.java | 7 +++- .../incubator/timed/TimedExample.java | 7 +++- 9 files changed, 57 insertions(+), 39 deletions(-) create mode 100644 instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index 3071a53c78f6..f5dcf2d39a4a 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -61,17 +61,4 @@ *

This property would not take effect if the value is not specified. */ String unit() default "{invocation}"; - - /** - * Attribute name for the return value. - * - *

The name of the attribute for the return value of the method call. {@link Object#toString()} - * may be called on the return value to convert it to a String. - * - *

By default, the instrument will not record an attribute with the return value. - * - *

Warning: be careful using this because it might cause an explosion of the cardinality on - * your metric - */ - String returnValueAttribute() default ""; } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java index 484db7b89516..d12ca1770eb1 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java @@ -27,6 +27,7 @@ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface MetricAttribute { + /** * Optional name of the attribute. * diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java new file mode 100644 index 000000000000..fbb6de40c52e --- /dev/null +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.annotations.incubator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation allows for adding method return value as attribute to the metrics recorded using + * {@link Timed} and {@link Counted} annotations. + * + *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation + * that the attribute should be created. + * + *

If you are a library developer, then probably you should NOT use this annotation, because it + * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation + * processor. + * + *

Warning: be careful using this because it might cause an explosion of the cardinality on your + * metric. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface MetricAttributeForReturnValue { + + /** + * Attribute name for the return value. + * + *

The name of the attribute for the return value of the method call. {@link Object#toString()} + * may be called on the return value to convert it to a String. + */ + String value(); +} diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index d096defcde3f..761b231741d0 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -57,17 +57,4 @@ *

Default is seconds. */ TimeUnit unit() default TimeUnit.SECONDS; - - /** - * Attribute name for the return value. - * - *

The name of the attribute for the return value of the method call. {@link Object#toString()} - * may be called on the return value to convert it to a String. - * - *

By default, the instrument will not record an attribute with the return value. - * - *

Warning: be careful using this because it might cause an explosion of the cardinality on - * your metric - */ - String returnValueAttribute() default ""; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java index cb0ac6493338..c54187c6c534 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java @@ -59,9 +59,7 @@ private static class MethodCounter { .setDescription(countedAnnotation.description()) .setUnit(countedAnnotation.unit()) .build(); - - String returnValueAttribute = countedAnnotation.returnValueAttribute(); - attributeHelper = new MetricAttributeHelper(method, returnValueAttribute); + attributeHelper = new MetricAttributeHelper(method); } void record(Object returnValue, Object[] arguments, Throwable throwable) { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 37417fea71dc..440925bd1f8c 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; import application.io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; @@ -65,11 +66,13 @@ static class MetricAttributeHelper { private final BiConsumer bindReturn; private final Attributes staticAttributes; - MetricAttributeHelper(Method method, String returnValueAttribute) { + MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); + MetricAttributeForReturnValue returnValueAttribute = + method.getAnnotation(MetricAttributeForReturnValue.class); bindReturn = - !returnValueAttribute.isEmpty() - ? MethodBinder.bindReturnValue(method, returnValueAttribute) + returnValueAttribute != null + ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) : null; AttributesBuilder attributesBuilder = Attributes.builder(); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index f32c2b789f7d..537d0e4efa1b 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -96,9 +96,7 @@ private static class MethodTimer { .setDescription(timedAnnotation.description()) .setUnit(timeUnitToString(unit)) .build(); - - String returnValueAttribute = timedAnnotation.returnValueAttribute(); - attributeHelper = new MetricAttributeHelper(method, returnValueAttribute); + attributeHelper = new MetricAttributeHelper(method); } void record(Object returnValue, Object[] arguments, Throwable throwable, long startNanoTime) { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index d25083b343a1..915933c53b3c 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; import io.opentelemetry.instrumentation.annotations.incubator.Counted; +import io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; import java.util.concurrent.CompletableFuture; @@ -31,7 +32,8 @@ public void exampleWithUnit() {} @StaticMetricAttribute(name = "key2", value = "value2") public void exampleWithAdditionalAttributes1() {} - @Counted(value = "example.with.return.count", returnValueAttribute = "returnValue") + @Counted(value = "example.with.return.count") + @MetricAttributeForReturnValue("returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } @@ -44,7 +46,8 @@ public void exampleWithException() { @Counted("example.ignore.count") public void exampleIgnore() {} - @Counted(value = "example.completable.future.count", returnValueAttribute = "returnValue") + @Counted(value = "example.completable.future.count") + @MetricAttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 561ac764e134..ae9f4ce93ef0 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; +import io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; @@ -39,12 +40,14 @@ public void exampleWithException() { throw new IllegalStateException("test"); } - @Timed(value = "example.with.return.duration", returnValueAttribute = "returnValue") + @Timed(value = "example.with.return.duration") + @MetricAttributeForReturnValue("returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } - @Timed(value = "example.completable.future.duration", returnValueAttribute = "returnValue") + @Timed(value = "example.completable.future.duration") + @MetricAttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } From f6887ae8867469dbdef1beb6fc12293b22d2152a Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 7 Jan 2025 21:14:02 +0800 Subject: [PATCH 20/51] update module name --- .../incubator/MetricsAnnotationInstrumentationModule.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java index dce08cd60a6e..05a790b5c8ff 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java @@ -26,7 +26,6 @@ public class MetricsAnnotationInstrumentationModule extends InstrumentationModul public MetricsAnnotationInstrumentationModule() { super( - "opentelemetry-instrumentation-annotations", "opentelemetry-instrumentation-annotations-incubator", "metrics-annotations"); } From 630eeac00fb5a1365650b70df98d1cef30b9c3c6 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 7 Jan 2025 21:24:26 +0800 Subject: [PATCH 21/51] update module name --- .../incubator/MetricsAnnotationInstrumentationModule.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java index 05a790b5c8ff..6c63097aa0cb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java @@ -25,9 +25,7 @@ public class MetricsAnnotationInstrumentationModule extends InstrumentationModule { public MetricsAnnotationInstrumentationModule() { - super( - "opentelemetry-instrumentation-annotations-incubator", - "metrics-annotations"); + super("opentelemetry-instrumentation-annotations-incubator", "metrics-annotations"); } @Override From 5eb706d4de4b65717e6a76309b2be546560ff703 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 28 Jan 2025 16:58:07 +0800 Subject: [PATCH 22/51] update to --- .../instrumentation/annotations/incubator/Counted.java | 2 +- .../instrumentation/annotations/incubator/Timed.java | 2 +- .../incubator/MetricsAnnotationHelper.java | 2 +- .../incubator/counted/CountedInstrumentationTest.java | 2 +- .../incubator/timed/TimedInstrumentationTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index f5dcf2d39a4a..5a35e606ece2 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -19,7 +19,7 @@ *

    *
  • code.namespace: The fully qualified name of the class whose method is invoked. *
  • code.function: The name of the annotated method. - *
  • exception.type: This is only present if an Exception is thrown, and contains the + *
  • error.type: This is only present if an Exception is thrown, and contains the * {@link Class#getName name} of the Exception class. *
* diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index 761b231741d0..f9b038ed84d4 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -20,7 +20,7 @@ *
    *
  • code.namespace: The fully qualified name of the class whose method is invoked. *
  • code.function: The name of the annotated method. - *
  • exception.type: This is only present if an Exception is thrown, and contains the + *
  • error.type: This is only present if an Exception is thrown, and contains the * {@link Class#getName name} of the Exception class. *
* diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 440925bd1f8c..78f9509d91db 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -90,7 +90,7 @@ Attributes getAttributes(Object returnValue, Object[] arguments, Throwable throw bindReturn.accept(attributesBuilder, returnValue); } if (throwable != null) { - attributesBuilder.put("exception.type", throwable.getClass().getName()); + attributesBuilder.put("error.type", throwable.getClass().getName()); } return attributesBuilder.build(); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java index 5e10d4c9da8c..8c235605dda5 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java @@ -110,7 +110,7 @@ void testExampleWithException() { .getName() .equals( p.getAttributes() - .get(AttributeKey.stringKey("exception.type")))))); + .get(AttributeKey.stringKey("error.type")))))); } @Test diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index 134ccadf8faa..cb6d72c9dc6d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -106,7 +106,7 @@ void testExampleWithException() { .getName() .equals( p.getAttributes() - .get(AttributeKey.stringKey("exception.type")))))); + .get(AttributeKey.stringKey("error.type")))))); } @Test From 06caf31192839f4cb47d581bae827b747cb1af8c Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 28 Jan 2025 17:12:09 +0800 Subject: [PATCH 23/51] update to --- .../instrumentation/annotations/incubator/Counted.java | 4 ++-- .../instrumentation/annotations/incubator/Timed.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index 5a35e606ece2..dd4957068f1d 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -19,8 +19,8 @@ *
    *
  • code.namespace: The fully qualified name of the class whose method is invoked. *
  • code.function: The name of the annotated method. - *
  • error.type: This is only present if an Exception is thrown, and contains the - * {@link Class#getName name} of the Exception class. + *
  • error.type: This is only present if an Exception is thrown, and contains the {@link + * Class#getName name} of the Exception class. *
* *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index f9b038ed84d4..c461a8f6f82f 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -20,8 +20,8 @@ *

    *
  • code.namespace: The fully qualified name of the class whose method is invoked. *
  • code.function: The name of the annotated method. - *
  • error.type: This is only present if an Exception is thrown, and contains the - * {@link Class#getName name} of the Exception class. + *
  • error.type: This is only present if an Exception is thrown, and contains the {@link + * Class#getName name} of the Exception class. *
* *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation From 6b6e3c4ef092732dc41c6a649ae176d3649493bf Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 9 Feb 2025 22:01:29 +0800 Subject: [PATCH 24/51] merge main, use 'code.function.name' instead of 'code.function --- .../incubator/MetricsAnnotationHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 78f9509d91db..9885d92dd789 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -36,7 +36,7 @@ public abstract class MetricsAnnotationHelper { static void addStaticAttributes(Method method, AttributesBuilder attributesBuilder) { attributesBuilder.put( CodeIncubatingAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()); - attributesBuilder.put(CodeIncubatingAttributes.CODE_FUNCTION, method.getName()); + attributesBuilder.put(CodeIncubatingAttributes.CODE_FUNCTION_NAME, method.getName()); StaticMetricAttribute[] staticMetricAttributes = method.getDeclaredAnnotationsByType(StaticMetricAttribute.class); From bb4cb9877299cc8af22826d82068c726b578c459 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Wed, 5 Mar 2025 21:22:47 +0800 Subject: [PATCH 25/51] change MetricsAttribute to Attritbute --- .fossa.yml | 15 ++++++++++++--- .../{MetricAttribute.java => Attribute.java} | 2 +- ...alue.java => AttributeForReturnValue.java} | 2 +- ...ricAttribute.java => StaticAttribute.java} | 4 ++-- ...cAttributes.java => StaticAttributes.java} | 6 +++--- .../incubator/CountedUsageExamples.java | 3 +-- .../incubator/TimedUsageExamples.java | 3 +-- .../incubator/MetricsAnnotationHelper.java | 19 +++++++++---------- ...etricsAnnotationInstrumentationModule.java | 6 +++--- .../incubator/counted/CountedExample.java | 14 +++++++------- .../incubator/timed/TimedExample.java | 12 ++++++------ 11 files changed, 46 insertions(+), 40 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{MetricAttribute.java => Attribute.java} (97%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{MetricAttributeForReturnValue.java => AttributeForReturnValue.java} (96%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{StaticMetricAttribute.java => StaticAttribute.java} (92%) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{StaticMetricAttributes.java => StaticAttributes.java} (83%) diff --git a/.fossa.yml b/.fossa.yml index b8327cee5a7d..e5d575b74a6f 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -7,6 +7,9 @@ targets: - type: gradle path: ./ target: ':instrumentation-annotations' + - type: gradle + path: ./ + target: ':instrumentation-annotations-incubator' - type: gradle path: ./ target: ':instrumentation-annotations-support' @@ -202,9 +205,6 @@ targets: - type: gradle path: ./ target: ':instrumentation:opentelemetry-extension-kotlin-1.0:javaagent' - - type: gradle - path: ./ - target: ':instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent' - type: gradle path: ./ target: ':instrumentation:opentelemetry-instrumentation-api:javaagent' @@ -763,6 +763,15 @@ targets: - type: gradle path: ./ target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-common:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-incubator:javaagent' - type: gradle path: ./ target: ':instrumentation:pekko:pekko-actor-1.0:javaagent' diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java similarity index 97% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index d12ca1770eb1..7d9f3cbbe220 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -26,7 +26,7 @@ */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) -public @interface MetricAttribute { +public @interface Attribute { /** * Optional name of the attribute. diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java similarity index 96% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java index fbb6de40c52e..b7388f9b0811 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/MetricAttributeForReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java @@ -26,7 +26,7 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface MetricAttributeForReturnValue { +public @interface AttributeForReturnValue { /** * Attribute name for the return value. diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java similarity index 92% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java index b65881016374..9fd329eb43b1 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java @@ -24,8 +24,8 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -@Repeatable(StaticMetricAttributes.class) -public @interface StaticMetricAttribute { +@Repeatable(StaticAttributes.class) +public @interface StaticAttribute { /** Name of the attribute. */ String name(); diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java similarity index 83% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java index 904c3daf81b7..33644eb248f9 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticMetricAttributes.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java @@ -23,8 +23,8 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface StaticMetricAttributes { +public @interface StaticAttributes { - /** Array of {@link StaticMetricAttribute} annotations describing the added attributes. */ - StaticMetricAttribute[] value(); + /** Array of {@link StaticAttribute} annotations describing the added attributes. */ + StaticAttribute[] value(); } diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java index 0cd9adf68120..a5c426fbab4f 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java @@ -11,6 +11,5 @@ public class CountedUsageExamples { public void method() {} @Counted("methodWithAttributes") - public void attributes( - @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} + public void attributes(@Attribute String attribute1, @Attribute("attribute2") long attribute2) {} } diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java index 793c55f8de4b..741fa76dafed 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java @@ -11,6 +11,5 @@ public class TimedUsageExamples { public void method() {} @Timed("methodWithAttributes") - public void attributes( - @MetricAttribute String attribute1, @MetricAttribute("attribute2") long attribute2) {} + public void attributes(@Attribute String attribute1, @Attribute("attribute2") long attribute2) {} } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 9885d92dd789..d0a843bf0371 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -5,9 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; -import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute; -import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; -import application.io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; +import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import application.io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -38,16 +38,15 @@ static void addStaticAttributes(Method method, AttributesBuilder attributesBuild CodeIncubatingAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()); attributesBuilder.put(CodeIncubatingAttributes.CODE_FUNCTION_NAME, method.getName()); - StaticMetricAttribute[] staticMetricAttributes = - method.getDeclaredAnnotationsByType(StaticMetricAttribute.class); - for (StaticMetricAttribute staticMetricAttribute : staticMetricAttributes) { - attributesBuilder.put(staticMetricAttribute.name(), staticMetricAttribute.value()); + StaticAttribute[] staticAttributes = method.getDeclaredAnnotationsByType(StaticAttribute.class); + for (StaticAttribute staticAttribute : staticAttributes) { + attributesBuilder.put(staticAttribute.name(), staticAttribute.value()); } } @Nullable private static String attributeName(Parameter parameter) { - MetricAttribute annotation = parameter.getDeclaredAnnotation(MetricAttribute.class); + Attribute annotation = parameter.getDeclaredAnnotation(Attribute.class); if (annotation == null) { return null; } @@ -68,8 +67,8 @@ static class MetricAttributeHelper { MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); - MetricAttributeForReturnValue returnValueAttribute = - method.getAnnotation(MetricAttributeForReturnValue.class); + AttributeForReturnValue returnValueAttribute = + method.getAnnotation(AttributeForReturnValue.class); bindReturn = returnValueAttribute != null ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java index 6c63097aa0cb..2a4c6e76ab62 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationInstrumentationModule.java @@ -8,8 +8,8 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; +import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; import application.io.opentelemetry.instrumentation.annotations.incubator.Counted; -import application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute; import application.io.opentelemetry.instrumentation.annotations.incubator.Timed; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; @@ -18,8 +18,8 @@ import net.bytebuddy.matcher.ElementMatcher; /** - * Instrumentation for methods annotated with {@link Counted}, {@link Timed} and {@link - * MetricAttribute} annotations. + * Instrumentation for methods annotated with {@link Counted}, {@link Timed} and {@link Attribute} + * annotations. */ @AutoService(InstrumentationModule.class) public class MetricsAnnotationInstrumentationModule extends InstrumentationModule { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 915933c53b3c..7ba8a23c3b74 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -5,9 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; -import io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; -import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; +import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import java.util.concurrent.CompletableFuture; public class CountedExample { @@ -27,13 +27,13 @@ public void exampleWithDescription() {} public void exampleWithUnit() {} @Counted("example.with.attributes.count") - @StaticMetricAttribute(name = "key1", value = "value1") - @StaticMetricAttribute(name = "key2", value = "value2") - @StaticMetricAttribute(name = "key2", value = "value2") + @StaticAttribute(name = "key1", value = "value1") + @StaticAttribute(name = "key2", value = "value2") + @StaticAttribute(name = "key2", value = "value2") public void exampleWithAdditionalAttributes1() {} @Counted(value = "example.with.return.count") - @MetricAttributeForReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } @@ -47,7 +47,7 @@ public void exampleWithException() { public void exampleIgnore() {} @Counted(value = "example.completable.future.count") - @MetricAttributeForReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index ae9f4ce93ef0..b660b9623914 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -5,8 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; -import io.opentelemetry.instrumentation.annotations.incubator.MetricAttributeForReturnValue; -import io.opentelemetry.instrumentation.annotations.incubator.StaticMetricAttribute; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -28,8 +28,8 @@ public void exampleWithUnit() throws InterruptedException { } @Timed("example.with.attributes.duration") - @StaticMetricAttribute(name = "key1", value = "value1") - @StaticMetricAttribute(name = "key2", value = "value2") + @StaticAttribute(name = "key1", value = "value1") + @StaticAttribute(name = "key2", value = "value2") public void exampleWithAdditionalAttributes1() {} @Timed("example.ignore.duration") @@ -41,13 +41,13 @@ public void exampleWithException() { } @Timed(value = "example.with.return.duration") - @MetricAttributeForReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public ReturnObject exampleWithReturnValueAttribute() { return new ReturnObject(); } @Timed(value = "example.completable.future.duration") - @MetricAttributeForReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } From e301a9b352adb7e7fb7ac8be0e8982e3fdc4b220 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 12 Apr 2025 21:54:54 +0800 Subject: [PATCH 26/51] update javadoc --- .../annotations/incubator/Attribute.java | 4 ++-- .../incubator/AttributeForReturnValue.java | 6 +++--- .../annotations/incubator/Counted.java | 20 +++++++++---------- .../annotations/incubator/Timed.java | 10 +++++----- .../incubator/MetricsAnnotationHelper.java | 4 ++-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index 7d9f3cbbe220..060ce43a4e10 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -12,10 +12,10 @@ /** * This annotation marks that a parameter of a method or constructor annotated with {@link Timed} or - * {@link Counted} should be added as an attribute to the instrument. + * {@link Counted} should be added as an attribute to the metric. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation - * that the attribute should be created. + * that the attribute should be captured. * *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java index b7388f9b0811..c672cde32c94 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java @@ -11,11 +11,11 @@ import java.lang.annotation.Target; /** - * This annotation allows for adding method return value as attribute to the metrics recorded using - * {@link Timed} and {@link Counted} annotations. + * This annotation allows for adding the method return value as an attribute to metrics recorded using + * the {@link Timed} and {@link Counted} annotations. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation - * that the attribute should be created. + * that the attribute should be captured. * *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index dd4957068f1d..45210dcec0cd 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -24,7 +24,7 @@ * * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation - * that the Counter instrument should be created. + * that a Counter metric should be captured. * *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation @@ -35,30 +35,30 @@ public @interface Counted { /** - * Name of the Counter instrument. + * Name of the Counter metric. * - *

The name should follow the instrument naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule + *

The name should follow the metric naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-name-syntax */ String value(); /** - * Description of the instrument. + * Description of the metric. * - *

Description strings should follow the instrument description rules: Description strings should follow the metric description rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description * - *

This property would not take effect if the value is not specified. + *

This property will not take effect if the value is not specified. */ String description() default ""; /** - * Unit of the instrument. + * Unit of the metric. * - *

Unit strings should follow the instrument unit rules: Unit strings should follow the metric unit rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-unit * - *

This property would not take effect if the value is not specified. + *

This property will not take effect if the value is not specified. */ String unit() default "{invocation}"; } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index c461a8f6f82f..b784d4506167 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -36,23 +36,23 @@ public @interface Timed { /** - * Name of the Histogram instrument. + * Name of the Histogram metric. * - *

The name should follow the instrument naming rule: The name should follow the metric naming rule: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule */ String value(); /** - * Description for the instrument. + * Description for the metric. * - *

Description strings should follow the instrument description rules: Description strings should follow the metric description rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description */ String description() default ""; /** - * The unit for the instrument. + * The unit for the metric. * *

Default is seconds. */ diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index d0a843bf0371..1468ba23d2eb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -35,8 +35,8 @@ public abstract class MetricsAnnotationHelper { static void addStaticAttributes(Method method, AttributesBuilder attributesBuilder) { attributesBuilder.put( - CodeIncubatingAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()); - attributesBuilder.put(CodeIncubatingAttributes.CODE_FUNCTION_NAME, method.getName()); + CodeIncubatingAttributes.CODE_FUNCTION_NAME, + method.getDeclaringClass().getName() + "." + method.getName()); StaticAttribute[] staticAttributes = method.getDeclaredAnnotationsByType(StaticAttribute.class); for (StaticAttribute staticAttribute : staticAttributes) { From e2b43a12703228ccce57531d7757a6a78b4b9011 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 12 Apr 2025 22:13:15 +0800 Subject: [PATCH 27/51] update javadoc --- .../annotations/incubator/AttributeForReturnValue.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java index c672cde32c94..f19b907b00fd 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java @@ -11,8 +11,8 @@ import java.lang.annotation.Target; /** - * This annotation allows for adding the method return value as an attribute to metrics recorded using - * the {@link Timed} and {@link Counted} annotations. + * This annotation allows for adding the method return value as an attribute to metrics recorded + * using the {@link Timed} and {@link Counted} annotations. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation * that the attribute should be captured. From f576d0e93913200de908c80573f92d587d66fcb7 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 12 Apr 2025 23:22:35 +0800 Subject: [PATCH 28/51] add Attribute test case for Counted --- .../incubator/CountedInstrumentation.java | 2 +- .../incubator/counted/CountedExample.java | 9 ++++-- .../counted/CountedInstrumentationTest.java | 29 +++++++++++++++++-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java index d18e6283f162..025a711579af 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedInstrumentation.java @@ -41,7 +41,7 @@ public class CountedInstrumentation implements TypeInstrumentation { whereAny( isAnnotatedWith( named( - "application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute")))); + "application.io.opentelemetry.instrumentation.annotations.incubator.Attribute")))); // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation excludedMethodsMatcher = AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 7ba8a23c3b74..dc353d9ded33 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; +import io.opentelemetry.instrumentation.annotations.incubator.Attribute; import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; @@ -26,11 +27,15 @@ public void exampleWithDescription() {} @Counted(value = "example.with.unit.count", unit = METRIC_UNIT) public void exampleWithUnit() {} - @Counted("example.with.attributes.count") + @Counted("example.with.static.attributes.count") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") @StaticAttribute(name = "key2", value = "value2") - public void exampleWithAdditionalAttributes1() {} + public void exampleWithStaticAttributes() {} + + @Counted("example.with.attributes.count") + public void exampleWithAttributes( + @Attribute String attribute1, @Attribute("custom_attr") long attribute2) {} @Counted(value = "example.with.return.count") @AttributeForReturnValue("returnValue") diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java index 8c235605dda5..a3beabd47e40 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java @@ -49,13 +49,13 @@ void testExampleWithUnit() { } @Test - void testExampleWithAdditionalAttributes1() { - new CountedExample().exampleWithAdditionalAttributes1(); + void testExampleWithStaticAttributes() { + new CountedExample().exampleWithStaticAttributes(); testing.waitAndAssertMetrics( INSTRUMENTATION_NAME, metric -> metric - .hasName("example.with.attributes.count") + .hasName("example.with.static.attributes.count") .satisfies( metricData -> assertThat(metricData.getData().getPoints()) @@ -71,6 +71,29 @@ void testExampleWithAdditionalAttributes1() { .get(AttributeKey.stringKey("key2")))))); } + @Test + void testExampleWithAttributes() { + new CountedExample().exampleWithAttributes("attr1", 2); + testing.waitAndAssertMetrics( + INSTRUMENTATION_NAME, + metric -> + metric + .hasName("example.with.attributes.count") + .satisfies( + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + Integer.valueOf(2) + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("custom_attr"))) + && "attr1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("attribute1")))))); + } + @Test void testExampleWithReturnAttribute() { new CountedExample().exampleWithReturnValueAttribute(); From 82d885ce02929e6c92f56de801a2f2197eba39a9 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 12 Apr 2025 23:41:25 +0800 Subject: [PATCH 29/51] add Attribute test case for Timed --- .../incubator/TimedInstrumentation.java | 2 +- .../counted/CountedInstrumentationTest.java | 4 +-- .../incubator/timed/TimedExample.java | 9 ++++-- .../timed/TimedInstrumentationTest.java | 29 +++++++++++++++++-- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java index 94c31d0c2d70..7ef2e2af5ab9 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedInstrumentation.java @@ -41,7 +41,7 @@ public class TimedInstrumentation implements TypeInstrumentation { whereAny( isAnnotatedWith( named( - "application.io.opentelemetry.instrumentation.annotations.incubator.MetricAttribute")))); + "application.io.opentelemetry.instrumentation.annotations.incubator.Attribute")))); // exclude all kotlin suspend methods, these are handle in kotlinx-coroutines instrumentation excludedMethodsMatcher = AnnotationExcludedMethods.configureExcludedMethods().or(isKotlinSuspendMethod()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java index a3beabd47e40..e69d498851fb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java @@ -84,10 +84,10 @@ void testExampleWithAttributes() { assertThat(metricData.getData().getPoints()) .allMatch( p -> - Integer.valueOf(2) + Long.valueOf(2) .equals( p.getAttributes() - .get(AttributeKey.stringKey("custom_attr"))) + .get(AttributeKey.longKey("custom_attr"))) && "attr1" .equals( p.getAttributes() diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index b660b9623914..bdca260a86e1 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; +import io.opentelemetry.instrumentation.annotations.incubator.Attribute; import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; @@ -27,10 +28,14 @@ public void exampleWithUnit() throws InterruptedException { Thread.sleep(2000); } - @Timed("example.with.attributes.duration") + @Timed("example.with.static.attributes.duration") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") - public void exampleWithAdditionalAttributes1() {} + public void exampleWithStaticAttributes() {} + + @Timed("example.with.attributes.duration") + public void exampleWithAttributes( + @Attribute String attribute1, @Attribute("custom_attr") long attribute2) {} @Timed("example.ignore.duration") public void exampleIgnore() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index cb6d72c9dc6d..973ac15005f9 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -56,13 +56,13 @@ void testExampleWithUnit() throws InterruptedException { } @Test - void testExampleWithAdditionalAttributes1() { - new TimedExample().exampleWithAdditionalAttributes1(); + void testExampleWithStaticAttributes() { + new TimedExample().exampleWithStaticAttributes(); testing.waitAndAssertMetrics( TIMED_INSTRUMENTATION_NAME, metric -> metric - .hasName("example.with.attributes.duration") + .hasName("example.with.static.attributes.duration") .satisfies( metricData -> assertThat(metricData.getData().getPoints()) @@ -78,6 +78,29 @@ void testExampleWithAdditionalAttributes1() { .get(AttributeKey.stringKey("key2")))))); } + @Test + void testExampleWithAttributes() { + new TimedExample().exampleWithAttributes("attr1", 2); + testing.waitAndAssertMetrics( + TIMED_INSTRUMENTATION_NAME, + metric -> + metric + .hasName("example.with.attributes.duration") + .satisfies( + metricData -> + assertThat(metricData.getData().getPoints()) + .allMatch( + p -> + Long.valueOf(2) + .equals( + p.getAttributes() + .get(AttributeKey.longKey("custom_attr"))) + && "attr1" + .equals( + p.getAttributes() + .get(AttributeKey.stringKey("attribute1")))))); + } + @Test void testExampleIgnore() throws Exception { new TimedExample().exampleIgnore(); From 292aec20e8126ec1daa5a46f7e3766dfbb42be8d Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 12 Apr 2025 23:57:15 +0800 Subject: [PATCH 30/51] update javadoc --- .../annotations/incubator/Attribute.java | 3 ++- .../incubator/counted/CountedExample.java | 14 ++++++++------ .../counted/CountedInstrumentationTest.java | 10 +++++++--- .../incubator/timed/TimedExample.java | 14 ++++++++------ .../incubator/timed/TimedInstrumentationTest.java | 8 ++++++-- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index 060ce43a4e10..599f6222bde2 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -33,7 +33,8 @@ * *

If not specified and the code is compiled using the `{@code -parameters}` argument to * `javac`, the parameter name will be used instead. If the parameter name is not available, e.g., - * because the code was not compiled with that flag, the attribute will be ignored. + * because the code was not compiled with that flag, the attribute will be ignored. `{@link + * Object#toString()}` may be called on the attribute value to convert it to a String. */ String value() default ""; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index dc353d9ded33..35de8ab45ee3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -16,7 +16,7 @@ public class CountedExample { public static final String METRIC_NAME = "name.count"; public static final String METRIC_DESCRIPTION = "I am the description."; public static final String METRIC_UNIT = "ms"; - public static final String RETURN_STRING = "I am a return string."; + public static final String TO_STRING = "I am a to string object."; @Counted(METRIC_NAME) public void exampleWithName() {} @@ -35,12 +35,14 @@ public void exampleWithStaticAttributes() {} @Counted("example.with.attributes.count") public void exampleWithAttributes( - @Attribute String attribute1, @Attribute("custom_attr") long attribute2) {} + @Attribute String attribute1, + @Attribute("custom_attr1") long attribute2, + @Attribute("custom_attr2") ToStringObject toStringObject) {} @Counted(value = "example.with.return.count") @AttributeForReturnValue("returnValue") - public ReturnObject exampleWithReturnValueAttribute() { - return new ReturnObject(); + public ToStringObject exampleWithReturnValueAttribute() { + return new ToStringObject(); } @Counted("example.with.exception.count") @@ -57,10 +59,10 @@ public CompletableFuture completableFuture(CompletableFuture fut return future; } - public static class ReturnObject { + public static class ToStringObject { @Override public String toString() { - return RETURN_STRING; + return TO_STRING; } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java index e69d498851fb..bed1b811ba64 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedInstrumentationTest.java @@ -8,6 +8,7 @@ import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_DESCRIPTION; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_NAME; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.METRIC_UNIT; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.TO_STRING; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -73,7 +74,7 @@ void testExampleWithStaticAttributes() { @Test void testExampleWithAttributes() { - new CountedExample().exampleWithAttributes("attr1", 2); + new CountedExample().exampleWithAttributes("attr1", 2, new CountedExample.ToStringObject()); testing.waitAndAssertMetrics( INSTRUMENTATION_NAME, metric -> @@ -87,7 +88,10 @@ void testExampleWithAttributes() { Long.valueOf(2) .equals( p.getAttributes() - .get(AttributeKey.longKey("custom_attr"))) + .get(AttributeKey.longKey("custom_attr1"))) + && TO_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("custom_attr2"))) && "attr1" .equals( p.getAttributes() @@ -107,7 +111,7 @@ void testExampleWithReturnAttribute() { assertThat(metricData.getData().getPoints()) .allMatch( p -> - CountedExample.RETURN_STRING.equals( + TO_STRING.equals( p.getAttributes() .get(AttributeKey.stringKey("returnValue")))))); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index bdca260a86e1..2e51261393d9 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -15,7 +15,7 @@ public class TimedExample { public static final String METRIC_NAME = "name.duration"; public static final String METRIC_DESCRIPTION = "I am the description."; - public static final String RETURN_STRING = "I am a return string."; + public static final String TO_STRING = "I am a return string."; @Timed(METRIC_NAME) public void exampleWithName() {} @@ -35,7 +35,9 @@ public void exampleWithStaticAttributes() {} @Timed("example.with.attributes.duration") public void exampleWithAttributes( - @Attribute String attribute1, @Attribute("custom_attr") long attribute2) {} + @Attribute String attribute1, + @Attribute("custom_attr") long attribute2, + @Attribute("custom_attr2") TimedExample.ToStringObject toStringObject) {} @Timed("example.ignore.duration") public void exampleIgnore() {} @@ -47,8 +49,8 @@ public void exampleWithException() { @Timed(value = "example.with.return.duration") @AttributeForReturnValue("returnValue") - public ReturnObject exampleWithReturnValueAttribute() { - return new ReturnObject(); + public ToStringObject exampleWithReturnValueAttribute() { + return new ToStringObject(); } @Timed(value = "example.completable.future.duration") @@ -57,10 +59,10 @@ public CompletableFuture completableFuture(CompletableFuture fut return future; } - public static class ReturnObject { + public static class ToStringObject { @Override public String toString() { - return RETURN_STRING; + return TO_STRING; } } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index 973ac15005f9..ee6e59f73e68 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.TO_STRING; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_DESCRIPTION; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_NAME; import static org.assertj.core.api.Assertions.assertThat; @@ -80,7 +81,7 @@ void testExampleWithStaticAttributes() { @Test void testExampleWithAttributes() { - new TimedExample().exampleWithAttributes("attr1", 2); + new TimedExample().exampleWithAttributes("attr1", 2, new TimedExample.ToStringObject()); testing.waitAndAssertMetrics( TIMED_INSTRUMENTATION_NAME, metric -> @@ -95,6 +96,9 @@ void testExampleWithAttributes() { .equals( p.getAttributes() .get(AttributeKey.longKey("custom_attr"))) + && TO_STRING.equals( + p.getAttributes() + .get(AttributeKey.stringKey("custom_attr2"))) && "attr1" .equals( p.getAttributes() @@ -145,7 +149,7 @@ void testExampleWithReturnValueAttribute() { assertThat(metricData.getData().getPoints()) .allMatch( p -> - TimedExample.RETURN_STRING.equals( + TimedExample.TO_STRING.equals( p.getAttributes() .get(AttributeKey.stringKey("returnValue")))))); } From 589e23a7b4f90432eaeed0f18f48cba94419ff3b Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 13 Apr 2025 00:31:37 +0800 Subject: [PATCH 31/51] rerun --- .../incubator/timed/TimedExample.java | 4 ++-- .../incubator/timed/TimedInstrumentationTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 2e51261393d9..32c767696c64 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -15,7 +15,7 @@ public class TimedExample { public static final String METRIC_NAME = "name.duration"; public static final String METRIC_DESCRIPTION = "I am the description."; - public static final String TO_STRING = "I am a return string."; + public static final String TO_STRING = "I am a to string object."; @Timed(METRIC_NAME) public void exampleWithName() {} @@ -36,7 +36,7 @@ public void exampleWithStaticAttributes() {} @Timed("example.with.attributes.duration") public void exampleWithAttributes( @Attribute String attribute1, - @Attribute("custom_attr") long attribute2, + @Attribute("custom_attr1") long attribute2, @Attribute("custom_attr2") TimedExample.ToStringObject toStringObject) {} @Timed("example.ignore.duration") diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index ee6e59f73e68..0ddc03d9976b 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -5,9 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; -import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted.CountedExample.TO_STRING; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_DESCRIPTION; import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.METRIC_NAME; +import static io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed.TimedExample.TO_STRING; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -95,7 +95,7 @@ void testExampleWithAttributes() { Long.valueOf(2) .equals( p.getAttributes() - .get(AttributeKey.longKey("custom_attr"))) + .get(AttributeKey.longKey("custom_attr1"))) && TO_STRING.equals( p.getAttributes() .get(AttributeKey.stringKey("custom_attr2"))) From e97b25e9a2b6c838b68e97830bcd767985b95b64 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Mon, 14 Apr 2025 21:52:18 +0800 Subject: [PATCH 32/51] update javadoc --- .../instrumentation/annotations/incubator/Counted.java | 2 +- .../annotations/incubator/StaticAttribute.java | 10 +++++----- .../annotations/incubator/StaticAttributes.java | 8 ++++---- .../instrumentation/annotations/incubator/Timed.java | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index 45210dcec0cd..d01776cfbe9b 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -37,7 +37,7 @@ /** * Name of the Counter metric. * - *

The name should follow the metric naming rule: The name should follow the metric naming rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-name-syntax */ String value(); diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java index 9fd329eb43b1..0edd842fd634 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttribute.java @@ -12,11 +12,11 @@ import java.lang.annotation.Target; /** - * This annotation allows for adding attributes to the metrics recorded using {@link Timed} and - * {@link Counted} annotations. + * This annotation allows for adding static attributes to the metrics recorded using {@link Timed} + * and {@link Counted} annotations. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation - * that the attribute should be created. + * that the static attributes should be captured. * *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation @@ -27,9 +27,9 @@ @Repeatable(StaticAttributes.class) public @interface StaticAttribute { - /** Name of the attribute. */ + /** Name of the static attribute. */ String name(); - /** Value of the attribute. */ + /** Value of the static attribute. */ String value(); } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java index 33644eb248f9..a28447086184 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/StaticAttributes.java @@ -11,11 +11,11 @@ import java.lang.annotation.Target; /** - * This annotation allows for adding attributes to the metrics recorded using {@link Timed} and - * {@link Counted} annotations. + * This annotation allows for adding static attributes to the metrics recorded using {@link Timed} + * and {@link Counted} annotations. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation - * that the attribute should be created. + * that the static attributes should be captured. * *

If you are a library developer, then probably you should NOT use this annotation, because it * is non-functional without the OpenTelemetry auto-instrumentation agent, or some other annotation @@ -25,6 +25,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface StaticAttributes { - /** Array of {@link StaticAttribute} annotations describing the added attributes. */ + /** Array of {@link StaticAttribute} annotations describing the attributes to capture. */ StaticAttribute[] value(); } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index b784d4506167..a138344b38f0 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -38,7 +38,7 @@ /** * Name of the Histogram metric. * - *

The name should follow the metric naming rule: The name should follow the metric naming rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule */ String value(); From 90c87bf0e3910fdeceb38e6d1e22efa8c35b8a7d Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 15 Apr 2025 22:46:30 +0800 Subject: [PATCH 33/51] remove timed.unit --- .../annotations/incubator/Timed.java | 8 ----- .../incubator/TimedHelper.java | 33 ++++--------------- .../incubator/timed/TimedExample.java | 6 ---- .../timed/TimedInstrumentationTest.java | 15 --------- 4 files changed, 6 insertions(+), 56 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index a138344b38f0..ee6c92b4802c 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -9,7 +9,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.util.concurrent.TimeUnit; /** * This annotation creates a {@link io.opentelemetry.api.metrics.DoubleHistogram Histogram} @@ -50,11 +49,4 @@ * href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description">https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-description */ String description() default ""; - - /** - * The unit for the metric. - * - *

Default is seconds. - */ - TimeUnit unit() default TimeUnit.SECONDS; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index 537d0e4efa1b..a152ad6064d2 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -57,51 +57,30 @@ private static MethodTimer getMethodTimer(Method method) { return timers.get(method.getDeclaringClass()).computeIfAbsent(method, MethodTimer::new); } - private static String timeUnitToString(TimeUnit timeUnit) { - switch (timeUnit) { - case NANOSECONDS: - return "ns"; - case MICROSECONDS: - return "us"; - case MILLISECONDS: - return "ms"; - case SECONDS: - return "s"; - case MINUTES: - return "min"; - case HOURS: - return "h"; - case DAYS: - return "d"; - } - throw new IllegalArgumentException("Unsupported time unit " + timeUnit); - } - - private static double getDuration(long startNanoTime, TimeUnit unit) { + private static double getDurationInSecond(long startNanoTime) { long nanoDelta = System.nanoTime() - startNanoTime; - return (double) nanoDelta / NANOSECONDS.convert(1, unit); + return (double) nanoDelta / NANOSECONDS.convert(1, TimeUnit.SECONDS); } private static class MethodTimer { - private final TimeUnit unit; private final DoubleHistogram histogram; private final MetricAttributeHelper attributeHelper; MethodTimer(Method method) { Timed timedAnnotation = method.getAnnotation(Timed.class); - unit = timedAnnotation.unit(); histogram = METER .histogramBuilder(timedAnnotation.value()) .setDescription(timedAnnotation.description()) - .setUnit(timeUnitToString(unit)) + .setUnit("s") .build(); attributeHelper = new MetricAttributeHelper(method); } void record(Object returnValue, Object[] arguments, Throwable throwable, long startNanoTime) { - double duration = getDuration(startNanoTime, unit); - histogram.record(duration, attributeHelper.getAttributes(returnValue, arguments, throwable)); + double durationInSecond = getDurationInSecond(startNanoTime); + histogram.record( + durationInSecond, attributeHelper.getAttributes(returnValue, arguments, throwable)); } } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 32c767696c64..54dbda5324f5 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -10,7 +10,6 @@ import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; public class TimedExample { public static final String METRIC_NAME = "name.duration"; @@ -23,11 +22,6 @@ public void exampleWithName() {} @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} - @Timed(value = "example.with.unit.duration", unit = TimeUnit.MILLISECONDS) - public void exampleWithUnit() throws InterruptedException { - Thread.sleep(2000); - } - @Timed("example.with.static.attributes.duration") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index 0ddc03d9976b..e3198517f0a4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -41,21 +41,6 @@ void testExampleWithDescription() { metric.hasName("example.with.description.duration").hasDescription(METRIC_DESCRIPTION)); } - @Test - void testExampleWithUnit() throws InterruptedException { - new TimedExample().exampleWithUnit(); - testing.waitAndAssertMetrics( - TIMED_INSTRUMENTATION_NAME, - metric -> - metric - .hasName("example.with.unit.duration") - .hasUnit("ms") - .satisfies( - metricData -> - assertThat(metricData.getHistogramData().getPoints()) - .allMatch(p -> p.getMax() < 5000 && p.getMin() > 0))); - } - @Test void testExampleWithStaticAttributes() { new TimedExample().exampleWithStaticAttributes(); From aaf4b3a9a403dd5e7ba7d8351fdc9bdb015611dd Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Mon, 21 Apr 2025 22:40:47 +0800 Subject: [PATCH 34/51] rename AsyncOperationEndXX to AsyncEndXX, rename AttributeForReturnValue to AttributeReturnValue --- CHANGELOG.md | 2 +- ...rnValue.java => AttributeReturnValue.java} | 2 +- ...onEndHandler.java => AsyncEndHandler.java} | 2 +- .../support/async/AsyncEndStrategies.java | 45 +++++++ ...sImpl.java => AsyncEndStrategiesImpl.java} | 16 +-- ...EndStrategy.java => AsyncEndStrategy.java} | 14 +-- .../support/async/AsyncEndSupport.java | 109 +++++++++++++++++ .../async/AsyncOperationEndStrategies.java | 46 ------- .../async/AsyncOperationEndSupport.java | 113 ------------------ ...trategy.java => Jdk8AsyncEndStrategy.java} | 10 +- ...portTest.java => AsyncEndSupportTest.java} | 18 +-- ...est.java => Jdk8AsyncEndStrategyTest.java} | 4 +- .../guava/v10_0/InstrumentationHelper.java | 14 +-- ...rategy.java => GuavaAsyncEndStrategy.java} | 20 ++-- ...java => GuavaAsyncEndStrategyBuilder.java} | 10 +- ...st.java => GuavaAsyncEndStrategyTest.java} | 13 +- .../kotlinxcoroutines/flow/FlowUtil.kt | 4 +- .../flow/FlowInstrumentationHelper.java | 15 ++- .../methods/MethodInstrumentation.java | 4 +- .../WithSpanInstrumentation.java | 10 +- .../WithSpanInstrumentation.java | 10 +- .../incubator/CountedHelper.java | 6 +- .../incubator/MetricsAnnotationHelper.java | 5 +- .../incubator/TimedHelper.java | 6 +- .../incubator/counted/CountedExample.java | 6 +- .../incubator/timed/TimedExample.java | 6 +- .../v3_1/ContextPropagationOperator.java | 25 ++-- ...tegy.java => ReactorAsyncEndStrategy.java} | 18 +-- ...va => ReactorAsyncEndStrategyBuilder.java} | 10 +- ....java => ReactorAsyncEndStrategyTest.java} | 22 ++-- ...tegy.java => RxJava2AsyncEndStrategy.java} | 18 +-- ...va => RxJava2AsyncEndStrategyBuilder.java} | 10 +- .../rxjava/v2_0/TracingAssembly.java | 16 +-- ....java => RxJava2AsyncEndStrategyTest.java} | 12 +- ...tegy.java => RxJava3AsyncEndStrategy.java} | 18 +-- ...va => RxJava3AsyncEndStrategyBuilder.java} | 10 +- ....java => RxJava3AsyncEndStrategyTest.java} | 12 +- .../rxjava/v3_0/TracingAssembly.java | 18 +-- .../rxjava/v3_1_1/TracingAssembly.java | 18 +-- .../annotations/WithSpanAspect.java | 11 +- .../v1_8/SpringDataInstrumentationModule.java | 4 +- .../javaagent/tooling/AgentInstaller.java | 4 +- ...es.java => WeakRefAsyncEndStrategies.java} | 30 +++-- 43 files changed, 375 insertions(+), 391 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{AttributeForReturnValue.java => AttributeReturnValue.java} (96%) rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncOperationEndHandler.java => AsyncEndHandler.java} (86%) create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncOperationEndStrategiesImpl.java => AsyncEndStrategiesImpl.java} (54%) rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncOperationEndStrategy.java => AsyncEndStrategy.java} (86%) create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java delete mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java delete mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{Jdk8AsyncOperationEndStrategy.java => Jdk8AsyncEndStrategy.java} (88%) rename instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncOperationEndSupportTest.java => AsyncEndSupportTest.java} (80%) rename instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/{Jdk8AsyncOperationEndStrategyTest.java => Jdk8AsyncEndStrategyTest.java} (95%) rename instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncOperationEndStrategy.java => GuavaAsyncEndStrategy.java} (79%) rename instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncOperationEndStrategyBuilder.java => GuavaAsyncEndStrategyBuilder.java} (58%) rename instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncOperationEndStrategyTest.java => GuavaAsyncEndStrategyTest.java} (89%) rename instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncOperationEndStrategy.java => ReactorAsyncEndStrategy.java} (86%) rename instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncOperationEndStrategyBuilder.java => ReactorAsyncEndStrategyBuilder.java} (57%) rename instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncOperationEndStrategyTest.java => ReactorAsyncEndStrategyTest.java} (93%) rename instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/{RxJava2AsyncOperationEndStrategy.java => RxJava2AsyncEndStrategy.java} (91%) rename instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/{RxJava2AsyncOperationEndStrategyBuilder.java => RxJava2AsyncEndStrategyBuilder.java} (57%) rename instrumentation/rxjava/rxjava-2.0/library/src/test/java/{RxJava2AsyncOperationEndStrategyTest.java => RxJava2AsyncEndStrategyTest.java} (98%) rename instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/{RxJava3AsyncOperationEndStrategy.java => RxJava3AsyncEndStrategy.java} (92%) rename instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/{RxJava3AsyncOperationEndStrategyBuilder.java => RxJava3AsyncEndStrategyBuilder.java} (57%) rename instrumentation/rxjava/rxjava-3-common/library/src/test/java/{RxJava3AsyncOperationEndStrategyTest.java => RxJava3AsyncEndStrategyTest.java} (98%) rename javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/{WeakRefAsyncOperationEndStrategies.java => WeakRefAsyncEndStrategies.java} (58%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 617f29cc5709..bf4642a66750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1995,7 +1995,7 @@ too disruptive to adopt right away. - `io.opentelemetry.instrumentation.graphql.GraphQLTelemetry` → `io.opentelemetry.instrumentation.graphql.v12_0.GraphQLTelemetry` - `io.opentelemetry.instrumentation.guava.GuavaAsyncOperationEndStrategy` - → `io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncOperationEndStrategy` + → `io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncEndStrategy` - `io.opentelemetry.instrumentation.hikaricp.HikariTelemetry` → `io.opentelemetry.instrumentation.hikaricp.v3_0.HikariTelemetry` - `io.opentelemetry.instrumentation.kafkaclients.KafkaTelemetry` diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java similarity index 96% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java index f19b907b00fd..600d545efb13 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java @@ -26,7 +26,7 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface AttributeForReturnValue { +public @interface AttributeReturnValue { /** * Attribute name for the return value. diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java similarity index 86% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java index 0d82aa16aa8b..80917fdb7baa 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; /** Callback that is called when async computation completes. */ -public interface AsyncOperationEndHandler { +public interface AsyncEndHandler { void handle( Context context, REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error); } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java new file mode 100644 index 000000000000..878a8c2804e6 --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support.async; + +import javax.annotation.Nullable; + +/** A global registry of {@link AsyncEndStrategy} implementations. */ +public abstract class AsyncEndStrategies { + private static volatile AsyncEndStrategies instance; + + /** + * Sets the actual strategies' registry implementation. The javaagent uses weak references to make + * unloading strategy classes possible. + * + *

This is supposed to be only called by the javaagent. Instrumentation must not call + * this. + */ + public static void internalSetStrategiesStorage(AsyncEndStrategies strategies) { + instance = strategies; + } + + /** Obtain instance of the async strategy registry. */ + public static AsyncEndStrategies instance() { + if (instance == null) { + instance = new AsyncEndStrategiesImpl(); + } + return instance; + } + + /** Add the passed {@code strategy} to the registry. */ + public abstract void registerStrategy(AsyncEndStrategy strategy); + + /** Remove the passed {@code strategy} from the registry. */ + public abstract void unregisterStrategy(AsyncEndStrategy strategy); + + /** + * Returns an {@link AsyncEndStrategy} that is able to compose over {@code returnType}, or {@code + * null} if passed type is not supported by any of the strategies stored in this registry. + */ + @Nullable + public abstract AsyncEndStrategy resolveStrategy(Class returnType); +} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java similarity index 54% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java index 39a13f586a39..d599bd38d88b 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java @@ -12,27 +12,27 @@ import javax.annotation.Nullable; /** Default strategies' registry implementation that uses strong references. */ -final class AsyncOperationEndStrategiesImpl extends AsyncOperationEndStrategies { - private final List strategies = new CopyOnWriteArrayList<>(); +final class AsyncEndStrategiesImpl extends AsyncEndStrategies { + private final List strategies = new CopyOnWriteArrayList<>(); - AsyncOperationEndStrategiesImpl() { - registerStrategy(Jdk8AsyncOperationEndStrategy.INSTANCE); + AsyncEndStrategiesImpl() { + registerStrategy(Jdk8AsyncEndStrategy.INSTANCE); } @Override - public void registerStrategy(AsyncOperationEndStrategy strategy) { + public void registerStrategy(AsyncEndStrategy strategy) { strategies.add(requireNonNull(strategy)); } @Override - public void unregisterStrategy(AsyncOperationEndStrategy strategy) { + public void unregisterStrategy(AsyncEndStrategy strategy) { strategies.remove(strategy); } @Nullable @Override - public AsyncOperationEndStrategy resolveStrategy(Class returnType) { - for (AsyncOperationEndStrategy strategy : strategies) { + public AsyncEndStrategy resolveStrategy(Class returnType) { + for (AsyncEndStrategy strategy : strategies) { if (strategy.supports(returnType)) { return strategy; } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java similarity index 86% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java index d3bba94fbe6c..c7bd719137e8 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java @@ -12,9 +12,9 @@ * Implementations of this interface describe how to compose over {@linkplain #supports(Class) * supported} asynchronous computation types and delay marking the operation as ended by calling * {@link Instrumenter#end(Context, Object, Object, Throwable)} or {@link - * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)}. + * AsyncEndHandler#handle(Context, Object, Object, Throwable)}. */ -public interface AsyncOperationEndStrategy { +public interface AsyncEndStrategy { /** * Returns true for every asynchronous computation type {@code asyncType} this strategy supports. @@ -47,12 +47,12 @@ default Object end( } /** - * Composes over {@code asyncValue} and delays the {@link AsyncOperationEndHandler#handle(Context, - * Object, Object, Throwable)} call until after the asynchronous operation represented by {@code + * Composes over {@code asyncValue} and delays the {@link AsyncEndHandler#handle(Context, Object, + * Object, Throwable)} call until after the asynchronous operation represented by {@code * asyncValue} completes. * - * @param handler The {@link AsyncOperationEndHandler} to be used to end the operation stored in - * the {@code context}. + * @param handler The {@link AsyncEndHandler} to be used to end the operation stored in the {@code + * context}. * @param asyncValue Return value from the instrumented method. Must be an instance of a {@code * asyncType} for which {@link #supports(Class)} returned true (in particular it must not be * {@code null}). @@ -63,7 +63,7 @@ default Object end( * of completion. */ Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java new file mode 100644 index 000000000000..a0b720ce713d --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java @@ -0,0 +1,109 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support.async; + +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import javax.annotation.Nullable; + +/** + * A wrapper over {@link AsyncEndHandler} that is able to defer {@link + * AsyncEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous computation + * finishes. + */ +public final class AsyncEndSupport { + + /** + * Returns a new {@link AsyncEndSupport} that wraps over passed {@code instrumenter}, configured + * for usage with asynchronous computations that are instances of {@code asyncType}. If the result + * of the async computation ends up being an instance of {@code responseType} it will be passed as + * the response to the {@code instrumenter} call; otherwise {@code null} value will be used as the + * response. + */ + public static AsyncEndSupport create( + Instrumenter instrumenter, + Class responseType, + Class asyncType) { + return new AsyncEndSupport<>( + instrumenter::end, + responseType, + asyncType, + AsyncEndStrategies.instance().resolveStrategy(asyncType)); + } + + /** + * Returns a new {@link AsyncEndSupport} that wraps over passed {@code handler}, configured for + * usage with asynchronous computations that are instances of {@code asyncType}. If the result of + * the async computation ends up being an instance of {@code responseType} it will be passed as + * the response to the {@code handler} call; otherwise {@code null} value will be used as the + * response. + */ + public static AsyncEndSupport create( + AsyncEndHandler handler, + Class responseType, + Class asyncType) { + return new AsyncEndSupport<>( + handler, responseType, asyncType, AsyncEndStrategies.instance().resolveStrategy(asyncType)); + } + + private final AsyncEndHandler handler; + private final Class responseType; + private final Class asyncType; + @Nullable private final AsyncEndStrategy asyncEndStrategy; + + private AsyncEndSupport( + AsyncEndHandler handler, + Class responseType, + Class asyncType, + @Nullable AsyncEndStrategy asyncEndStrategy) { + this.handler = handler; + this.responseType = responseType; + this.asyncType = asyncType; + this.asyncEndStrategy = asyncEndStrategy; + } + + /** + * Attempts to compose over passed {@code asyncValue} and delay the {@link + * Instrumenter#end(Context, Object, Object, Throwable)} call until the async operation completes. + * + *

This method will end the operation immediately if {@code throwable} is passed, if there is + * no {@link AsyncEndStrategy} for the {@code asyncType} used, or if there is a type mismatch + * between passed {@code asyncValue} and the {@code asyncType} that was used to create this + * object. + * + *

If the passed {@code asyncValue} is recognized as an asynchronous computation, the operation + * won't be {@link Instrumenter#end(Context, Object, Object, Throwable) ended} until {@code + * asyncValue} completes. + */ + @SuppressWarnings("unchecked") + @Nullable + public ASYNC asyncEnd( + Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { + // we can end early if an exception was thrown + if (throwable != null) { + handler.handle(context, request, null, throwable); + return asyncValue; + } + + // use the configured strategy to compose over the asyncValue + if (asyncEndStrategy != null && asyncType.isInstance(asyncValue)) { + return (ASYNC) asyncEndStrategy.end(handler, context, request, asyncValue, responseType); + } + + // fall back to sync end() if asyncValue type doesn't match + handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); + return asyncValue; + } + + @Nullable + public static RESPONSE tryToGetResponse( + Class responseType, @Nullable Object asyncValue) { + if (responseType.isInstance(asyncValue)) { + return responseType.cast(asyncValue); + } + return null; + } +} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java deleted file mode 100644 index 7b832fd10942..000000000000 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.annotation.support.async; - -import javax.annotation.Nullable; - -/** A global registry of {@link AsyncOperationEndStrategy} implementations. */ -public abstract class AsyncOperationEndStrategies { - private static volatile AsyncOperationEndStrategies instance; - - /** - * Sets the actual strategies' registry implementation. The javaagent uses weak references to make - * unloading strategy classes possible. - * - *

This is supposed to be only called by the javaagent. Instrumentation must not call - * this. - */ - public static void internalSetStrategiesStorage(AsyncOperationEndStrategies strategies) { - instance = strategies; - } - - /** Obtain instance of the async strategy registry. */ - public static AsyncOperationEndStrategies instance() { - if (instance == null) { - instance = new AsyncOperationEndStrategiesImpl(); - } - return instance; - } - - /** Add the passed {@code strategy} to the registry. */ - public abstract void registerStrategy(AsyncOperationEndStrategy strategy); - - /** Remove the passed {@code strategy} from the registry. */ - public abstract void unregisterStrategy(AsyncOperationEndStrategy strategy); - - /** - * Returns an {@link AsyncOperationEndStrategy} that is able to compose over {@code returnType}, - * or {@code null} if passed type is not supported by any of the strategies stored in this - * registry. - */ - @Nullable - public abstract AsyncOperationEndStrategy resolveStrategy(Class returnType); -} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java deleted file mode 100644 index 50edfb7ab051..000000000000 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.annotation.support.async; - -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import javax.annotation.Nullable; - -/** - * A wrapper over {@link AsyncOperationEndHandler} that is able to defer {@link - * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous - * computation finishes. - */ -public final class AsyncOperationEndSupport { - - /** - * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code instrumenter}, - * configured for usage with asynchronous computations that are instances of {@code asyncType}. If - * the result of the async computation ends up being an instance of {@code responseType} it will - * be passed as the response to the {@code instrumenter} call; otherwise {@code null} value will - * be used as the response. - */ - public static AsyncOperationEndSupport create( - Instrumenter instrumenter, - Class responseType, - Class asyncType) { - return new AsyncOperationEndSupport<>( - instrumenter::end, - responseType, - asyncType, - AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); - } - - /** - * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code handler}, - * configured for usage with asynchronous computations that are instances of {@code asyncType}. If - * the result of the async computation ends up being an instance of {@code responseType} it will - * be passed as the response to the {@code handler} call; otherwise {@code null} value will be - * used as the response. - */ - public static AsyncOperationEndSupport create( - AsyncOperationEndHandler handler, - Class responseType, - Class asyncType) { - return new AsyncOperationEndSupport<>( - handler, - responseType, - asyncType, - AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); - } - - private final AsyncOperationEndHandler handler; - private final Class responseType; - private final Class asyncType; - @Nullable private final AsyncOperationEndStrategy asyncOperationEndStrategy; - - private AsyncOperationEndSupport( - AsyncOperationEndHandler handler, - Class responseType, - Class asyncType, - @Nullable AsyncOperationEndStrategy asyncOperationEndStrategy) { - this.handler = handler; - this.responseType = responseType; - this.asyncType = asyncType; - this.asyncOperationEndStrategy = asyncOperationEndStrategy; - } - - /** - * Attempts to compose over passed {@code asyncValue} and delay the {@link - * Instrumenter#end(Context, Object, Object, Throwable)} call until the async operation completes. - * - *

This method will end the operation immediately if {@code throwable} is passed, if there is - * no {@link AsyncOperationEndStrategy} for the {@code asyncType} used, or if there is a type - * mismatch between passed {@code asyncValue} and the {@code asyncType} that was used to create - * this object. - * - *

If the passed {@code asyncValue} is recognized as an asynchronous computation, the operation - * won't be {@link Instrumenter#end(Context, Object, Object, Throwable) ended} until {@code - * asyncValue} completes. - */ - @SuppressWarnings("unchecked") - @Nullable - public ASYNC asyncEnd( - Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { - // we can end early if an exception was thrown - if (throwable != null) { - handler.handle(context, request, null, throwable); - return asyncValue; - } - - // use the configured strategy to compose over the asyncValue - if (asyncOperationEndStrategy != null && asyncType.isInstance(asyncValue)) { - return (ASYNC) - asyncOperationEndStrategy.end(handler, context, request, asyncValue, responseType); - } - - // fall back to sync end() if asyncValue type doesn't match - handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); - return asyncValue; - } - - @Nullable - public static RESPONSE tryToGetResponse( - Class responseType, @Nullable Object asyncValue) { - if (responseType.isInstance(asyncValue)) { - return responseType.cast(asyncValue); - } - return null; - } -} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java similarity index 88% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java index 38498bbbe894..57bf0b3a558b 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.api.annotation.support.async; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; import io.opentelemetry.context.Context; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -public enum Jdk8AsyncOperationEndStrategy implements AsyncOperationEndStrategy { +public enum Jdk8AsyncEndStrategy implements AsyncEndStrategy { INSTANCE; @Override @@ -21,7 +21,7 @@ public boolean supports(Class asyncType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -43,7 +43,7 @@ public Object end( * notification of completion. */ private static boolean tryToEndSynchronously( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, CompletableFuture future, @@ -67,7 +67,7 @@ private static boolean tryToEndSynchronously( * span will be ended. */ private static CompletionStage endWhenComplete( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, CompletionStage stage, diff --git a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java similarity index 80% rename from instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java rename to instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java index 667a2b50933f..71189c1e894d 100644 --- a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java +++ b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java @@ -22,14 +22,14 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class AsyncOperationEndSupportTest { +class AsyncEndSupportTest { @Mock Instrumenter instrumenter; @Test void shouldEndImmediatelyWhenExceptionWasPassed() { // given - AsyncOperationEndSupport underTest = - AsyncOperationEndSupport.create(instrumenter, String.class, CompletableFuture.class); + AsyncEndSupport underTest = + AsyncEndSupport.create(instrumenter, String.class, CompletableFuture.class); Context context = Context.root(); Exception exception = new RuntimeException("boom!"); @@ -47,8 +47,8 @@ void shouldEndImmediatelyWhenExceptionWasPassed() { @Test void shouldEndImmediatelyWhenWrongReturnTypeWasPassed() { // given - AsyncOperationEndSupport underTest = - AsyncOperationEndSupport.create(instrumenter, String.class, Future.class); + AsyncEndSupport underTest = + AsyncEndSupport.create(instrumenter, String.class, Future.class); Context context = Context.root(); CompletableFuture future = new CompletableFuture<>(); @@ -65,8 +65,8 @@ void shouldEndImmediatelyWhenWrongReturnTypeWasPassed() { @Test void shouldEndImmediatelyWhenAsyncWrapperIsOfWrongType() { // given - AsyncOperationEndSupport underTest = - AsyncOperationEndSupport.create(instrumenter, String.class, CompletableFuture.class); + AsyncEndSupport underTest = + AsyncEndSupport.create(instrumenter, String.class, CompletableFuture.class); Context context = Context.root(); @@ -82,8 +82,8 @@ void shouldEndImmediatelyWhenAsyncWrapperIsOfWrongType() { @Test void shouldReturnedDecoratedAsyncWrapper() { // given - AsyncOperationEndSupport underTest = - AsyncOperationEndSupport.create(instrumenter, String.class, CompletionStage.class); + AsyncEndSupport underTest = + AsyncEndSupport.create(instrumenter, String.class, CompletionStage.class); Context context = Context.root(); CompletableFuture future = new CompletableFuture<>(); diff --git a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java similarity index 95% rename from instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java rename to instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java index 21611d276164..73bd23b64c31 100644 --- a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java +++ b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java @@ -18,10 +18,10 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class Jdk8AsyncOperationEndStrategyTest { +class Jdk8AsyncEndStrategyTest { @Mock Instrumenter instrumenter; - AsyncOperationEndStrategy underTest = Jdk8AsyncOperationEndStrategy.INSTANCE; + AsyncEndStrategy underTest = Jdk8AsyncEndStrategy.INSTANCE; @Test void shouldEndOperationOnAlreadyCompletedFuture() { diff --git a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java index d1d8bbc637f0..0fb1d87fe51d 100644 --- a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java +++ b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java @@ -5,14 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.guava.v10_0; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; -import io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncEndStrategy; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class InstrumentationHelper { static { - asyncOperationEndStrategy = - GuavaAsyncOperationEndStrategy.builder() + asyncEndStrategy = + GuavaAsyncEndStrategy.builder() .setCaptureExperimentalSpanAttributes( AgentInstrumentationConfig.get() .getBoolean("otel.instrumentation.guava.experimental-span-attributes", false)) @@ -21,15 +21,15 @@ public final class InstrumentationHelper { registerAsyncSpanEndStrategy(); } - private static final GuavaAsyncOperationEndStrategy asyncOperationEndStrategy; + private static final GuavaAsyncEndStrategy asyncEndStrategy; private static void registerAsyncSpanEndStrategy() { - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); } /** * This method is invoked to trigger the runtime system to execute the static initializer block - * ensuring that the {@link GuavaAsyncOperationEndStrategy} is registered exactly once. + * ensuring that the {@link GuavaAsyncEndStrategy} is registered exactly once. */ public static void initialize() {} diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java similarity index 79% rename from instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java rename to instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java index 24287d362804..47714747fd17 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java @@ -5,32 +5,32 @@ package io.opentelemetry.instrumentation.guava.v10_0; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.Uninterruptibles; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; -public final class GuavaAsyncOperationEndStrategy implements AsyncOperationEndStrategy { +public final class GuavaAsyncEndStrategy implements AsyncEndStrategy { // Visible for testing static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("guava.canceled"); - public static GuavaAsyncOperationEndStrategy create() { + public static GuavaAsyncEndStrategy create() { return builder().build(); } - public static GuavaAsyncOperationEndStrategyBuilder builder() { - return new GuavaAsyncOperationEndStrategyBuilder(); + public static GuavaAsyncEndStrategyBuilder builder() { + return new GuavaAsyncEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - GuavaAsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { + GuavaAsyncEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -41,7 +41,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -53,7 +53,7 @@ public Object end( } private void end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, ListenableFuture future, diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java similarity index 58% rename from instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java rename to instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java index faf858f01a6f..8c374a608b6b 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java @@ -7,19 +7,19 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class GuavaAsyncOperationEndStrategyBuilder { +public final class GuavaAsyncEndStrategyBuilder { private boolean captureExperimentalSpanAttributes = false; - GuavaAsyncOperationEndStrategyBuilder() {} + GuavaAsyncEndStrategyBuilder() {} @CanIgnoreReturnValue - public GuavaAsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public GuavaAsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public GuavaAsyncOperationEndStrategy build() { - return new GuavaAsyncOperationEndStrategy(captureExperimentalSpanAttributes); + public GuavaAsyncEndStrategy build() { + return new GuavaAsyncEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java b/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java similarity index 89% rename from instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java rename to instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java index 04846144735f..3872823be585 100644 --- a/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java +++ b/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java @@ -18,7 +18,7 @@ import com.google.common.util.concurrent.SettableFuture; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,13 +26,13 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class GuavaAsyncOperationEndStrategyTest { +class GuavaAsyncEndStrategyTest { @Mock private Instrumenter instrumenter; @Mock private Span span; - private final AsyncOperationEndStrategy strategy = GuavaAsyncOperationEndStrategy.create(); + private final AsyncEndStrategy strategy = GuavaAsyncEndStrategy.create(); @Test void listenableFutureSupported() { @@ -90,14 +90,13 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(GuavaAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) - .thenReturn(span); + when(span.setAttribute(GuavaAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)).thenReturn(span); SettableFuture future = SettableFuture.create(); Context context = Context.root().with(span); - AsyncOperationEndStrategy strategy = - GuavaAsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + AsyncEndStrategy strategy = + GuavaAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); strategy.end(instrumenter, context, "request", future, String.class); future.cancel(true); diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt index dbd541182d86..2512d01f5147 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onCompletion -fun onComplete(flow: Flow<*>, handler: AsyncOperationEndHandler, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> +fun onComplete(flow: Flow<*>, handler: AsyncEndHandler, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> handler.handle(context, request, null, cause) } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java index 0f0206d8c9fc..ae522184384b 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java @@ -6,24 +6,23 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import kotlinx.coroutines.flow.Flow; public final class FlowInstrumentationHelper { - private static final FlowAsyncOperationEndStrategy asyncOperationEndStrategy = - new FlowAsyncOperationEndStrategy(); + private static final FlowAsyncEndStrategy asyncEndStrategy = new FlowAsyncEndStrategy(); static { - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); } public static void initialize() {} private FlowInstrumentationHelper() {} - private static final class FlowAsyncOperationEndStrategy implements AsyncOperationEndStrategy { + private static final class FlowAsyncEndStrategy implements AsyncEndStrategy { @Override public boolean supports(Class returnType) { @@ -32,7 +31,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java index 983cf7e491e4..c5e5dfa0b468 100644 --- a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java +++ b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java @@ -15,7 +15,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -94,7 +94,7 @@ public static void stopSpan( scope.close(); returnValue = - AsyncOperationEndSupport.create(instrumenter(), Void.class, method.getReturnType()) + AsyncEndSupport.create(instrumenter(), Void.class, method.getReturnType()) .asyncEnd(context, classAndMethod, returnValue, throwable); } } diff --git a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java index 4d99fcafbd3d..8f406a992d0d 100644 --- a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java +++ b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java @@ -18,7 +18,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; @@ -149,8 +149,8 @@ public static void stopSpan( } scope.close(); - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create( + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create( WithSpanSingletons.instrumenter(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, method, returnValue, throwable); } @@ -195,8 +195,8 @@ public static void stopSpan( return; } scope.close(); - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create( + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create( WithSpanSingletons.instrumenterWithAttributes(), Object.class, method.getReturnType()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java index 74d9d84c00d3..fd0e706d5b74 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java @@ -17,7 +17,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -110,8 +110,8 @@ public static void stopSpan( } scope.close(); - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create(instrumenter(), Object.class, method.getReturnType()); + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create(instrumenter(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, method, returnValue, throwable); } } @@ -154,8 +154,8 @@ public static void stopSpan( return; } scope.close(); - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create( + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create( instrumenterWithAttributes(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, request, returnValue, throwable); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java index c54187c6c534..068d564f9824 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java @@ -8,7 +8,7 @@ import application.io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; @@ -35,8 +35,8 @@ public static Object record(Method method, Object returnValue, Throwable throwab private static Object record( Method method, Object returnValue, Throwable throwable, Object[] arguments) { - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create( + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create( (context, m, object, error) -> getMethodCounter(m).record(object, arguments, error), Object.class, method.getReturnType()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 1468ba23d2eb..21866a54d509 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import application.io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; @@ -67,8 +67,7 @@ static class MetricAttributeHelper { MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); - AttributeForReturnValue returnValueAttribute = - method.getAnnotation(AttributeForReturnValue.class); + AttributeReturnValue returnValueAttribute = method.getAnnotation(AttributeReturnValue.class); bindReturn = returnValueAttribute != null ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index a152ad6064d2..3c1730775ea3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -10,7 +10,7 @@ import application.io.opentelemetry.instrumentation.annotations.incubator.Timed; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; @@ -44,8 +44,8 @@ private static Object record( Throwable throwable, long startNanoTime, Object[] arguments) { - AsyncOperationEndSupport operationEndSupport = - AsyncOperationEndSupport.create( + AsyncEndSupport operationEndSupport = + AsyncEndSupport.create( (context, m, object, error) -> getMethodTimer(m).record(object, arguments, error, startNanoTime), Object.class, diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 35de8ab45ee3..16c5ce4ff0d4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import java.util.concurrent.CompletableFuture; @@ -40,7 +40,7 @@ public void exampleWithAttributes( @Attribute("custom_attr2") ToStringObject toStringObject) {} @Counted(value = "example.with.return.count") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @@ -54,7 +54,7 @@ public void exampleWithException() { public void exampleIgnore() {} @Counted(value = "example.completable.future.count") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 54dbda5324f5..75f2987b1b17 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; @@ -42,13 +42,13 @@ public void exampleWithException() { } @Timed(value = "example.with.return.duration") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @Timed(value = "example.completable.future.duration") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java index 3d554240c21b..fc1905270f95 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java @@ -26,7 +26,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -95,7 +95,7 @@ public static ContextPropagationOperatorBuilder builder() { return new ContextPropagationOperatorBuilder(); } - private final ReactorAsyncOperationEndStrategy asyncOperationEndStrategy; + private final ReactorAsyncEndStrategy asyncEndStrategy; private static final Object TRACE_CONTEXT_KEY = new Object() { @@ -150,8 +150,8 @@ public static Context getOpenTelemetryContextFromContextView( } ContextPropagationOperator(boolean captureExperimentalSpanAttributes) { - this.asyncOperationEndStrategy = - ReactorAsyncOperationEndStrategy.builder() + this.asyncEndStrategy = + ReactorAsyncEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); } @@ -167,9 +167,8 @@ public void registerOnEachOperator() { if (enabled) { return; } - Hooks.onEachOperator( - TracingSubscriber.class.getName(), tracingLift(asyncOperationEndStrategy)); - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + Hooks.onEachOperator(TracingSubscriber.class.getName(), tracingLift(asyncEndStrategy)); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); registerScheduleHook(RunnableWrapper.class.getName(), RunnableWrapper::new); enabled = true; } @@ -193,15 +192,15 @@ public void resetOnEachOperator() { return; } Hooks.resetOnEachOperator(TracingSubscriber.class.getName()); - AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); enabled = false; } } private static Function, ? extends Publisher> tracingLift( - ReactorAsyncOperationEndStrategy asyncOperationEndStrategy) { + ReactorAsyncEndStrategy asyncEndStrategy) { return Operators.lift( - ContextPropagationOperator::shouldInstrument, new Lifter<>(asyncOperationEndStrategy)); + ContextPropagationOperator::shouldInstrument, new Lifter<>(asyncEndStrategy)); } /** Forces Mono to run in traceContext scope. */ @@ -276,10 +275,10 @@ private static class Lifter /** Holds reference to strategy to prevent it from being collected. */ @SuppressWarnings({"FieldCanBeLocal", "UnusedVariable"}) - private final ReactorAsyncOperationEndStrategy asyncOperationEndStrategy; + private final ReactorAsyncEndStrategy asyncEndStrategy; - public Lifter(ReactorAsyncOperationEndStrategy asyncOperationEndStrategy) { - this.asyncOperationEndStrategy = asyncOperationEndStrategy; + public Lifter(ReactorAsyncEndStrategy asyncEndStrategy) { + this.asyncEndStrategy = asyncEndStrategy; } @Override diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java similarity index 86% rename from instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java rename to instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java index fe1237664f84..bf328161d84e 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java @@ -5,35 +5,35 @@ package io.opentelemetry.instrumentation.reactor.v3_1; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -public final class ReactorAsyncOperationEndStrategy implements AsyncOperationEndStrategy { +public final class ReactorAsyncEndStrategy implements AsyncEndStrategy { // Visible for testing static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("reactor.canceled"); - public static ReactorAsyncOperationEndStrategy create() { + public static ReactorAsyncEndStrategy create() { return builder().build(); } - public static ReactorAsyncOperationEndStrategyBuilder builder() { - return new ReactorAsyncOperationEndStrategyBuilder(); + public static ReactorAsyncEndStrategyBuilder builder() { + return new ReactorAsyncEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - ReactorAsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { + ReactorAsyncEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -44,7 +44,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java similarity index 57% rename from instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java rename to instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java index cd745a94a8b4..ad8c6b7d4f46 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java @@ -7,19 +7,19 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class ReactorAsyncOperationEndStrategyBuilder { +public final class ReactorAsyncEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - ReactorAsyncOperationEndStrategyBuilder() {} + ReactorAsyncEndStrategyBuilder() {} @CanIgnoreReturnValue - public ReactorAsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public ReactorAsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public ReactorAsyncOperationEndStrategy build() { - return new ReactorAsyncOperationEndStrategy(captureExperimentalSpanAttributes); + public ReactorAsyncEndStrategy build() { + return new ReactorAsyncEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java similarity index 93% rename from instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java rename to instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java index 8745b0b382e4..5189ca0c0040 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java +++ b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java @@ -12,7 +12,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -26,13 +26,13 @@ @ExtendWith(MockitoExtension.class) @SuppressWarnings("ClassCanBeStatic") -class ReactorAsyncOperationEndStrategyTest { +class ReactorAsyncEndStrategyTest { @Mock private Instrumenter instrumenter; @Mock private Span span; - private final AsyncOperationEndStrategy strategy = ReactorAsyncOperationEndStrategy.create(); + private final AsyncEndStrategy strategy = ReactorAsyncEndStrategy.create(); @Nested class MonoTest { @@ -107,13 +107,11 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(ReactorAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) + when(span.setAttribute(ReactorAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) .thenReturn(span); - AsyncOperationEndStrategy strategy = - ReactorAsyncOperationEndStrategy.builder() - .setCaptureExperimentalSpanAttributes(true) - .build(); + AsyncEndStrategy strategy = + ReactorAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); UnicastProcessor source = UnicastProcessor.create(); Mono mono = source.singleOrEmpty(); @@ -250,13 +248,11 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(ReactorAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) + when(span.setAttribute(ReactorAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) .thenReturn(span); - AsyncOperationEndStrategy strategy = - ReactorAsyncOperationEndStrategy.builder() - .setCaptureExperimentalSpanAttributes(true) - .build(); + AsyncEndStrategy strategy = + ReactorAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); UnicastProcessor source = UnicastProcessor.create(); Context context = Context.root().with(span); diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java similarity index 91% rename from instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java rename to instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java index 3c46a1277c42..970abf22653d 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.rxjava.v2_0; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; @@ -24,21 +24,21 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.reactivestreams.Publisher; -public final class RxJava2AsyncOperationEndStrategy implements AsyncOperationEndStrategy { +public final class RxJava2AsyncEndStrategy implements AsyncEndStrategy { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); - public static RxJava2AsyncOperationEndStrategy create() { + public static RxJava2AsyncEndStrategy create() { return builder().build(); } - public static RxJava2AsyncOperationEndStrategyBuilder builder() { - return new RxJava2AsyncOperationEndStrategyBuilder(); + public static RxJava2AsyncEndStrategyBuilder builder() { + return new RxJava2AsyncEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - RxJava2AsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { + RxJava2AsyncEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java similarity index 57% rename from instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java rename to instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java index a62a9a489954..628c2d8da54a 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java @@ -7,20 +7,20 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class RxJava2AsyncOperationEndStrategyBuilder { +public final class RxJava2AsyncEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - RxJava2AsyncOperationEndStrategyBuilder() {} + RxJava2AsyncEndStrategyBuilder() {} @CanIgnoreReturnValue - public RxJava2AsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public RxJava2AsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public RxJava2AsyncOperationEndStrategy build() { - return new RxJava2AsyncOperationEndStrategy(captureExperimentalSpanAttributes); + public RxJava2AsyncEndStrategy build() { + return new RxJava2AsyncEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java index 30a4292366e3..15102c897283 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java @@ -24,7 +24,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; import io.reactivex.Completable; import io.reactivex.CompletableObserver; @@ -251,15 +251,15 @@ private static void enableMaybe() { })); } - private static RxJava2AsyncOperationEndStrategy asyncOperationEndStrategy; + private static RxJava2AsyncEndStrategy asyncEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncOperationEndStrategy = - RxJava2AsyncOperationEndStrategy.builder() + asyncEndStrategy = + RxJava2AsyncEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -301,9 +301,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncOperationEndStrategy != null) { - AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); - asyncOperationEndStrategy = null; + if (asyncEndStrategy != null) { + AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); + asyncEndStrategy = null; } } diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java b/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java similarity index 98% rename from instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java rename to instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java index d31f55b21c48..375a404bfdf0 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.rxjava.v2_0.RxJava2AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v2_0.RxJava2AsyncEndStrategy; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; @@ -41,14 +41,14 @@ import org.reactivestreams.Subscription; @ExtendWith(MockitoExtension.class) -public class RxJava2AsyncOperationEndStrategyTest { +public class RxJava2AsyncEndStrategyTest { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); @Mock Instrumenter instrumenter; @Mock Span span; - private final AsyncOperationEndStrategy underTest = RxJava2AsyncOperationEndStrategy.create(); - private final RxJava2AsyncOperationEndStrategy underTestWithExperimentalAttributes = - RxJava2AsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + private final AsyncEndStrategy underTest = RxJava2AsyncEndStrategy.create(); + private final RxJava2AsyncEndStrategy underTestWithExperimentalAttributes = + RxJava2AsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); @Nested class CompletableTest { diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java similarity index 92% rename from instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java rename to instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java index c3aedd9f8fe8..867c4bb7ba0d 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.rxjava.v3.common; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; @@ -24,21 +24,21 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.reactivestreams.Publisher; -public final class RxJava3AsyncOperationEndStrategy implements AsyncOperationEndStrategy { +public final class RxJava3AsyncEndStrategy implements AsyncEndStrategy { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); - public static RxJava3AsyncOperationEndStrategy create() { + public static RxJava3AsyncEndStrategy create() { return builder().build(); } - public static RxJava3AsyncOperationEndStrategyBuilder builder() { - return new RxJava3AsyncOperationEndStrategyBuilder(); + public static RxJava3AsyncEndStrategyBuilder builder() { + return new RxJava3AsyncEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - RxJava3AsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { + RxJava3AsyncEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java similarity index 57% rename from instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java rename to instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java index 60c9e994141f..92fbb5765084 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java @@ -7,20 +7,20 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class RxJava3AsyncOperationEndStrategyBuilder { +public final class RxJava3AsyncEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - RxJava3AsyncOperationEndStrategyBuilder() {} + RxJava3AsyncEndStrategyBuilder() {} @CanIgnoreReturnValue - public RxJava3AsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public RxJava3AsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public RxJava3AsyncOperationEndStrategy build() { - return new RxJava3AsyncOperationEndStrategy(captureExperimentalSpanAttributes); + public RxJava3AsyncEndStrategy build() { + return new RxJava3AsyncEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java b/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java similarity index 98% rename from instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java rename to instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java index f3fbd8144e23..2b332e772d6f 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; @@ -41,14 +41,14 @@ import org.reactivestreams.Subscription; @ExtendWith(MockitoExtension.class) -public class RxJava3AsyncOperationEndStrategyTest { +public class RxJava3AsyncEndStrategyTest { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); @Mock Instrumenter instrumenter; @Mock Span span; - private final AsyncOperationEndStrategy underTest = RxJava3AsyncOperationEndStrategy.create(); - private final RxJava3AsyncOperationEndStrategy underTestWithExperimentalAttributes = - RxJava3AsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + private final AsyncEndStrategy underTest = RxJava3AsyncEndStrategy.create(); + private final RxJava3AsyncEndStrategy underTestWithExperimentalAttributes = + RxJava3AsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); @Nested class CompletableTest { diff --git a/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java b/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java index 191a2ebf9b1f..5e6e5c618797 100644 --- a/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java @@ -24,9 +24,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingCompletableObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingMaybeObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingSingleObserver; @@ -253,15 +253,15 @@ private static void enableMaybe() { })); } - private static RxJava3AsyncOperationEndStrategy asyncOperationEndStrategy; + private static RxJava3AsyncEndStrategy asyncEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncOperationEndStrategy = - RxJava3AsyncOperationEndStrategy.builder() + asyncEndStrategy = + RxJava3AsyncEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -303,9 +303,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncOperationEndStrategy != null) { - AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); - asyncOperationEndStrategy = null; + if (asyncEndStrategy != null) { + AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); + asyncEndStrategy = null; } } diff --git a/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java b/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java index 10726a499728..1f2bebb1761a 100644 --- a/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java @@ -24,9 +24,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingCompletableObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingMaybeObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingSingleObserver; @@ -253,15 +253,15 @@ private static void enableMaybe() { })); } - private static RxJava3AsyncOperationEndStrategy asyncOperationEndStrategy; + private static RxJava3AsyncEndStrategy asyncEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncOperationEndStrategy = - RxJava3AsyncOperationEndStrategy.builder() + asyncEndStrategy = + RxJava3AsyncEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); + AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -303,9 +303,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncOperationEndStrategy != null) { - AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); - asyncOperationEndStrategy = null; + if (asyncEndStrategy != null) { + AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); + asyncEndStrategy = null; } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java index 89ff79dd6ab9..86464c709b3f 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java @@ -13,7 +13,7 @@ import io.opentelemetry.instrumentation.annotations.WithSpan; import io.opentelemetry.instrumentation.api.annotation.support.MethodSpanAttributesExtractor; import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.aspectj.lang.ProceedingJoinPoint; @@ -72,17 +72,16 @@ public Object traceMethod(ProceedingJoinPoint pjp) throws Throwable { } Context context = instrumenter.start(parentContext, request); - AsyncOperationEndSupport asyncOperationEndSupport = - AsyncOperationEndSupport.create( - instrumenter, Object.class, request.method().getReturnType()); + AsyncEndSupport asyncEndSupport = + AsyncEndSupport.create(instrumenter, Object.class, request.method().getReturnType()); Object response; try (Scope ignored = context.makeCurrent()) { response = pjp.proceed(); } catch (Throwable t) { - asyncOperationEndSupport.asyncEnd(context, request, null, t); + asyncEndSupport.asyncEnd(context, request, null, t); throw t; } - return asyncOperationEndSupport.asyncEnd(context, request, response, null); + return asyncEndSupport.asyncEnd(context, request, response, null); } } diff --git a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java index b751e6977f99..bda558b15e40 100644 --- a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java +++ b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java @@ -14,7 +14,7 @@ import com.google.auto.service.AutoService; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -132,7 +132,7 @@ public Object invoke(MethodInvocation methodInvocation) throws Throwable { if (Object.class == type && MONO_CLASS != null && MONO_CLASS.isInstance(result)) { type = MONO_CLASS; } - return AsyncOperationEndSupport.create(instrumenter(), Void.class, type) + return AsyncEndSupport.create(instrumenter(), Void.class, type) .asyncEnd(context, classAndMethod, result, null); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 5a08597845f1..8a49feab10d2 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -33,7 +33,7 @@ import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; import io.opentelemetry.javaagent.extension.instrumentation.internal.EarlyInstrumentationModule; -import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncOperationEndStrategies; +import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncEndStrategies; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilderImpl; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesBridge; @@ -119,7 +119,7 @@ private static void installBytebuddyAgent( Iterable agentListeners, EarlyInitAgentConfig earlyConfig) { - WeakRefAsyncOperationEndStrategies.initialize(); + WeakRefAsyncEndStrategies.initialize(); EmbeddedInstrumentationProperties.setPropertiesLoader(extensionClassLoader); setDefineClassHandler(); FieldBackedImplementationConfiguration.configure(earlyConfig); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java similarity index 58% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java index 6db566e1466f..802f5b5129a3 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java @@ -5,53 +5,51 @@ package io.opentelemetry.javaagent.tooling.asyncannotationsupport; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -import io.opentelemetry.instrumentation.api.annotation.support.async.Jdk8AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.Jdk8AsyncEndStrategy; import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.annotation.Nullable; -public final class WeakRefAsyncOperationEndStrategies extends AsyncOperationEndStrategies { +public final class WeakRefAsyncEndStrategies extends AsyncEndStrategies { /** * Use the weak reference strategy in the agent. This will prevent leaking reference to * strategies' classloaders, in case applications get undeployed (and all their classes unloaded). */ public static void initialize() { - AsyncOperationEndStrategies.internalSetStrategiesStorage( - new WeakRefAsyncOperationEndStrategies()); + AsyncEndStrategies.internalSetStrategiesStorage(new WeakRefAsyncEndStrategies()); } - private final List> strategies = - new CopyOnWriteArrayList<>(); + private final List> strategies = new CopyOnWriteArrayList<>(); - private WeakRefAsyncOperationEndStrategies() { - registerStrategy(Jdk8AsyncOperationEndStrategy.INSTANCE); + private WeakRefAsyncEndStrategies() { + registerStrategy(Jdk8AsyncEndStrategy.INSTANCE); } @Override - public void registerStrategy(AsyncOperationEndStrategy strategy) { + public void registerStrategy(AsyncEndStrategy strategy) { strategies.add(new WeakReference<>(strategy)); } @Override - public void unregisterStrategy(AsyncOperationEndStrategy strategy) { + public void unregisterStrategy(AsyncEndStrategy strategy) { strategies.removeIf( ref -> { - AsyncOperationEndStrategy s = ref.get(); + AsyncEndStrategy s = ref.get(); return s == null || s == strategy; }); } @Nullable @Override - public AsyncOperationEndStrategy resolveStrategy(Class returnType) { + public AsyncEndStrategy resolveStrategy(Class returnType) { boolean purgeCollectedWeakReferences = false; try { - for (WeakReference ref : strategies) { - AsyncOperationEndStrategy s = ref.get(); + for (WeakReference ref : strategies) { + AsyncEndStrategy s = ref.get(); if (s == null) { purgeCollectedWeakReferences = true; } else if (s.supports(returnType)) { From bd31e37a37581bf04b7b2db1e34a45c69efd969f Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Mon, 21 Apr 2025 22:51:35 +0800 Subject: [PATCH 35/51] update javadoc for Attribute and AttributeReturnValue --- .../instrumentation/annotations/incubator/Attribute.java | 6 ++++-- .../annotations/incubator/AttributeReturnValue.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index 599f6222bde2..21b520d90d82 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -14,6 +14,9 @@ * This annotation marks that a parameter of a method or constructor annotated with {@link Timed} or * {@link Counted} should be added as an attribute to the metric. * + *

By default, the `{@link Object#toString()}` will be called on the parameter value to convert + * it to a String. + * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation * that the attribute should be captured. * @@ -33,8 +36,7 @@ * *

If not specified and the code is compiled using the `{@code -parameters}` argument to * `javac`, the parameter name will be used instead. If the parameter name is not available, e.g., - * because the code was not compiled with that flag, the attribute will be ignored. `{@link - * Object#toString()}` may be called on the attribute value to convert it to a String. + * because the code was not compiled with that flag, the attribute will be ignored. */ String value() default ""; } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java index 600d545efb13..14aae7de3d4a 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java @@ -14,6 +14,9 @@ * This annotation allows for adding the method return value as an attribute to metrics recorded * using the {@link Timed} and {@link Counted} annotations. * + *

By default, the {@link Object#toString()} will be called on the return value to convert it to + * a String. + * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation * that the attribute should be captured. * @@ -31,8 +34,7 @@ /** * Attribute name for the return value. * - *

The name of the attribute for the return value of the method call. {@link Object#toString()} - * may be called on the return value to convert it to a String. + *

The name of the attribute for the return value of the method call. */ String value(); } From efbf2cd7e00e7cd5b34b8530801a0ce5d32edf15 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Mon, 21 Apr 2025 23:09:58 +0800 Subject: [PATCH 36/51] revert change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf4642a66750..617f29cc5709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1995,7 +1995,7 @@ too disruptive to adopt right away. - `io.opentelemetry.instrumentation.graphql.GraphQLTelemetry` → `io.opentelemetry.instrumentation.graphql.v12_0.GraphQLTelemetry` - `io.opentelemetry.instrumentation.guava.GuavaAsyncOperationEndStrategy` - → `io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncEndStrategy` + → `io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncOperationEndStrategy` - `io.opentelemetry.instrumentation.hikaricp.HikariTelemetry` → `io.opentelemetry.instrumentation.hikaricp.v3_0.HikariTelemetry` - `io.opentelemetry.instrumentation.kafkaclients.KafkaTelemetry` From d5a7365f8eecd7665b337777932379f15698158d Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 22 Apr 2025 21:03:31 +0800 Subject: [PATCH 37/51] Revert "rename AsyncOperationEndXX to AsyncEndXX, rename AttributeForReturnValue to AttributeReturnValue" This reverts commit aaf4b3a9a403dd5e7ba7d8351fdc9bdb015611dd. --- ...alue.java => AttributeForReturnValue.java} | 2 +- .../support/async/AsyncEndStrategies.java | 45 ------- .../support/async/AsyncEndSupport.java | 109 ----------------- ...ler.java => AsyncOperationEndHandler.java} | 2 +- .../async/AsyncOperationEndStrategies.java | 46 +++++++ ...a => AsyncOperationEndStrategiesImpl.java} | 16 +-- ...gy.java => AsyncOperationEndStrategy.java} | 14 +-- .../async/AsyncOperationEndSupport.java | 113 ++++++++++++++++++ ...ava => Jdk8AsyncOperationEndStrategy.java} | 10 +- ...java => AsyncOperationEndSupportTest.java} | 18 +-- ...=> Jdk8AsyncOperationEndStrategyTest.java} | 4 +- .../guava/v10_0/InstrumentationHelper.java | 14 +-- ...va => GuavaAsyncOperationEndStrategy.java} | 20 ++-- ...uavaAsyncOperationEndStrategyBuilder.java} | 10 +- ...> GuavaAsyncOperationEndStrategyTest.java} | 13 +- .../kotlinxcoroutines/flow/FlowUtil.kt | 4 +- .../flow/FlowInstrumentationHelper.java | 15 +-- .../methods/MethodInstrumentation.java | 4 +- .../WithSpanInstrumentation.java | 10 +- .../WithSpanInstrumentation.java | 10 +- .../incubator/CountedHelper.java | 6 +- .../incubator/MetricsAnnotationHelper.java | 5 +- .../incubator/TimedHelper.java | 6 +- .../incubator/counted/CountedExample.java | 6 +- .../incubator/timed/TimedExample.java | 6 +- .../v3_1/ContextPropagationOperator.java | 25 ++-- ... => ReactorAsyncOperationEndStrategy.java} | 18 +-- ...ctorAsyncOperationEndStrategyBuilder.java} | 10 +- ...ReactorAsyncOperationEndStrategyTest.java} | 22 ++-- ... => RxJava2AsyncOperationEndStrategy.java} | 18 +-- ...ava2AsyncOperationEndStrategyBuilder.java} | 10 +- .../rxjava/v2_0/TracingAssembly.java | 16 +-- ...RxJava2AsyncOperationEndStrategyTest.java} | 12 +- ... => RxJava3AsyncOperationEndStrategy.java} | 18 +-- ...ava3AsyncOperationEndStrategyBuilder.java} | 10 +- ...RxJava3AsyncOperationEndStrategyTest.java} | 12 +- .../rxjava/v3_0/TracingAssembly.java | 18 +-- .../rxjava/v3_1_1/TracingAssembly.java | 18 +-- .../annotations/WithSpanAspect.java | 11 +- .../v1_8/SpringDataInstrumentationModule.java | 4 +- .../javaagent/tooling/AgentInstaller.java | 4 +- ...> WeakRefAsyncOperationEndStrategies.java} | 30 ++--- 42 files changed, 390 insertions(+), 374 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{AttributeReturnValue.java => AttributeForReturnValue.java} (96%) delete mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java delete mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncEndHandler.java => AsyncOperationEndHandler.java} (86%) create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncEndStrategiesImpl.java => AsyncOperationEndStrategiesImpl.java} (54%) rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncEndStrategy.java => AsyncOperationEndStrategy.java} (86%) create mode 100644 instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{Jdk8AsyncEndStrategy.java => Jdk8AsyncOperationEndStrategy.java} (88%) rename instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncEndSupportTest.java => AsyncOperationEndSupportTest.java} (80%) rename instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/{Jdk8AsyncEndStrategyTest.java => Jdk8AsyncOperationEndStrategyTest.java} (95%) rename instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncEndStrategy.java => GuavaAsyncOperationEndStrategy.java} (79%) rename instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncEndStrategyBuilder.java => GuavaAsyncOperationEndStrategyBuilder.java} (58%) rename instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/{GuavaAsyncEndStrategyTest.java => GuavaAsyncOperationEndStrategyTest.java} (89%) rename instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncEndStrategy.java => ReactorAsyncOperationEndStrategy.java} (86%) rename instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncEndStrategyBuilder.java => ReactorAsyncOperationEndStrategyBuilder.java} (57%) rename instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/{ReactorAsyncEndStrategyTest.java => ReactorAsyncOperationEndStrategyTest.java} (93%) rename instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/{RxJava2AsyncEndStrategy.java => RxJava2AsyncOperationEndStrategy.java} (91%) rename instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/{RxJava2AsyncEndStrategyBuilder.java => RxJava2AsyncOperationEndStrategyBuilder.java} (57%) rename instrumentation/rxjava/rxjava-2.0/library/src/test/java/{RxJava2AsyncEndStrategyTest.java => RxJava2AsyncOperationEndStrategyTest.java} (98%) rename instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/{RxJava3AsyncEndStrategy.java => RxJava3AsyncOperationEndStrategy.java} (92%) rename instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/{RxJava3AsyncEndStrategyBuilder.java => RxJava3AsyncOperationEndStrategyBuilder.java} (57%) rename instrumentation/rxjava/rxjava-3-common/library/src/test/java/{RxJava3AsyncEndStrategyTest.java => RxJava3AsyncOperationEndStrategyTest.java} (98%) rename javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/{WeakRefAsyncEndStrategies.java => WeakRefAsyncOperationEndStrategies.java} (58%) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java similarity index 96% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java index 14aae7de3d4a..b7b806d5a358 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java @@ -29,7 +29,7 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface AttributeReturnValue { +public @interface AttributeForReturnValue { /** * Attribute name for the return value. diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java deleted file mode 100644 index 878a8c2804e6..000000000000 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategies.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.annotation.support.async; - -import javax.annotation.Nullable; - -/** A global registry of {@link AsyncEndStrategy} implementations. */ -public abstract class AsyncEndStrategies { - private static volatile AsyncEndStrategies instance; - - /** - * Sets the actual strategies' registry implementation. The javaagent uses weak references to make - * unloading strategy classes possible. - * - *

This is supposed to be only called by the javaagent. Instrumentation must not call - * this. - */ - public static void internalSetStrategiesStorage(AsyncEndStrategies strategies) { - instance = strategies; - } - - /** Obtain instance of the async strategy registry. */ - public static AsyncEndStrategies instance() { - if (instance == null) { - instance = new AsyncEndStrategiesImpl(); - } - return instance; - } - - /** Add the passed {@code strategy} to the registry. */ - public abstract void registerStrategy(AsyncEndStrategy strategy); - - /** Remove the passed {@code strategy} from the registry. */ - public abstract void unregisterStrategy(AsyncEndStrategy strategy); - - /** - * Returns an {@link AsyncEndStrategy} that is able to compose over {@code returnType}, or {@code - * null} if passed type is not supported by any of the strategies stored in this registry. - */ - @Nullable - public abstract AsyncEndStrategy resolveStrategy(Class returnType); -} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java deleted file mode 100644 index a0b720ce713d..000000000000 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupport.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.annotation.support.async; - -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import javax.annotation.Nullable; - -/** - * A wrapper over {@link AsyncEndHandler} that is able to defer {@link - * AsyncEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous computation - * finishes. - */ -public final class AsyncEndSupport { - - /** - * Returns a new {@link AsyncEndSupport} that wraps over passed {@code instrumenter}, configured - * for usage with asynchronous computations that are instances of {@code asyncType}. If the result - * of the async computation ends up being an instance of {@code responseType} it will be passed as - * the response to the {@code instrumenter} call; otherwise {@code null} value will be used as the - * response. - */ - public static AsyncEndSupport create( - Instrumenter instrumenter, - Class responseType, - Class asyncType) { - return new AsyncEndSupport<>( - instrumenter::end, - responseType, - asyncType, - AsyncEndStrategies.instance().resolveStrategy(asyncType)); - } - - /** - * Returns a new {@link AsyncEndSupport} that wraps over passed {@code handler}, configured for - * usage with asynchronous computations that are instances of {@code asyncType}. If the result of - * the async computation ends up being an instance of {@code responseType} it will be passed as - * the response to the {@code handler} call; otherwise {@code null} value will be used as the - * response. - */ - public static AsyncEndSupport create( - AsyncEndHandler handler, - Class responseType, - Class asyncType) { - return new AsyncEndSupport<>( - handler, responseType, asyncType, AsyncEndStrategies.instance().resolveStrategy(asyncType)); - } - - private final AsyncEndHandler handler; - private final Class responseType; - private final Class asyncType; - @Nullable private final AsyncEndStrategy asyncEndStrategy; - - private AsyncEndSupport( - AsyncEndHandler handler, - Class responseType, - Class asyncType, - @Nullable AsyncEndStrategy asyncEndStrategy) { - this.handler = handler; - this.responseType = responseType; - this.asyncType = asyncType; - this.asyncEndStrategy = asyncEndStrategy; - } - - /** - * Attempts to compose over passed {@code asyncValue} and delay the {@link - * Instrumenter#end(Context, Object, Object, Throwable)} call until the async operation completes. - * - *

This method will end the operation immediately if {@code throwable} is passed, if there is - * no {@link AsyncEndStrategy} for the {@code asyncType} used, or if there is a type mismatch - * between passed {@code asyncValue} and the {@code asyncType} that was used to create this - * object. - * - *

If the passed {@code asyncValue} is recognized as an asynchronous computation, the operation - * won't be {@link Instrumenter#end(Context, Object, Object, Throwable) ended} until {@code - * asyncValue} completes. - */ - @SuppressWarnings("unchecked") - @Nullable - public ASYNC asyncEnd( - Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { - // we can end early if an exception was thrown - if (throwable != null) { - handler.handle(context, request, null, throwable); - return asyncValue; - } - - // use the configured strategy to compose over the asyncValue - if (asyncEndStrategy != null && asyncType.isInstance(asyncValue)) { - return (ASYNC) asyncEndStrategy.end(handler, context, request, asyncValue, responseType); - } - - // fall back to sync end() if asyncValue type doesn't match - handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); - return asyncValue; - } - - @Nullable - public static RESPONSE tryToGetResponse( - Class responseType, @Nullable Object asyncValue) { - if (responseType.isInstance(asyncValue)) { - return responseType.cast(asyncValue); - } - return null; - } -} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java similarity index 86% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java index 80917fdb7baa..0d82aa16aa8b 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndHandler.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; /** Callback that is called when async computation completes. */ -public interface AsyncEndHandler { +public interface AsyncOperationEndHandler { void handle( Context context, REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error); } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java new file mode 100644 index 000000000000..7b832fd10942 --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategies.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support.async; + +import javax.annotation.Nullable; + +/** A global registry of {@link AsyncOperationEndStrategy} implementations. */ +public abstract class AsyncOperationEndStrategies { + private static volatile AsyncOperationEndStrategies instance; + + /** + * Sets the actual strategies' registry implementation. The javaagent uses weak references to make + * unloading strategy classes possible. + * + *

This is supposed to be only called by the javaagent. Instrumentation must not call + * this. + */ + public static void internalSetStrategiesStorage(AsyncOperationEndStrategies strategies) { + instance = strategies; + } + + /** Obtain instance of the async strategy registry. */ + public static AsyncOperationEndStrategies instance() { + if (instance == null) { + instance = new AsyncOperationEndStrategiesImpl(); + } + return instance; + } + + /** Add the passed {@code strategy} to the registry. */ + public abstract void registerStrategy(AsyncOperationEndStrategy strategy); + + /** Remove the passed {@code strategy} from the registry. */ + public abstract void unregisterStrategy(AsyncOperationEndStrategy strategy); + + /** + * Returns an {@link AsyncOperationEndStrategy} that is able to compose over {@code returnType}, + * or {@code null} if passed type is not supported by any of the strategies stored in this + * registry. + */ + @Nullable + public abstract AsyncOperationEndStrategy resolveStrategy(Class returnType); +} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java similarity index 54% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java index d599bd38d88b..39a13f586a39 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategiesImpl.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategiesImpl.java @@ -12,27 +12,27 @@ import javax.annotation.Nullable; /** Default strategies' registry implementation that uses strong references. */ -final class AsyncEndStrategiesImpl extends AsyncEndStrategies { - private final List strategies = new CopyOnWriteArrayList<>(); +final class AsyncOperationEndStrategiesImpl extends AsyncOperationEndStrategies { + private final List strategies = new CopyOnWriteArrayList<>(); - AsyncEndStrategiesImpl() { - registerStrategy(Jdk8AsyncEndStrategy.INSTANCE); + AsyncOperationEndStrategiesImpl() { + registerStrategy(Jdk8AsyncOperationEndStrategy.INSTANCE); } @Override - public void registerStrategy(AsyncEndStrategy strategy) { + public void registerStrategy(AsyncOperationEndStrategy strategy) { strategies.add(requireNonNull(strategy)); } @Override - public void unregisterStrategy(AsyncEndStrategy strategy) { + public void unregisterStrategy(AsyncOperationEndStrategy strategy) { strategies.remove(strategy); } @Nullable @Override - public AsyncEndStrategy resolveStrategy(Class returnType) { - for (AsyncEndStrategy strategy : strategies) { + public AsyncOperationEndStrategy resolveStrategy(Class returnType) { + for (AsyncOperationEndStrategy strategy : strategies) { if (strategy.supports(returnType)) { return strategy; } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java similarity index 86% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java index c7bd719137e8..d3bba94fbe6c 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java @@ -12,9 +12,9 @@ * Implementations of this interface describe how to compose over {@linkplain #supports(Class) * supported} asynchronous computation types and delay marking the operation as ended by calling * {@link Instrumenter#end(Context, Object, Object, Throwable)} or {@link - * AsyncEndHandler#handle(Context, Object, Object, Throwable)}. + * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)}. */ -public interface AsyncEndStrategy { +public interface AsyncOperationEndStrategy { /** * Returns true for every asynchronous computation type {@code asyncType} this strategy supports. @@ -47,12 +47,12 @@ default Object end( } /** - * Composes over {@code asyncValue} and delays the {@link AsyncEndHandler#handle(Context, Object, - * Object, Throwable)} call until after the asynchronous operation represented by {@code + * Composes over {@code asyncValue} and delays the {@link AsyncOperationEndHandler#handle(Context, + * Object, Object, Throwable)} call until after the asynchronous operation represented by {@code * asyncValue} completes. * - * @param handler The {@link AsyncEndHandler} to be used to end the operation stored in the {@code - * context}. + * @param handler The {@link AsyncOperationEndHandler} to be used to end the operation stored in + * the {@code context}. * @param asyncValue Return value from the instrumented method. Must be an instance of a {@code * asyncType} for which {@link #supports(Class)} returned true (in particular it must not be * {@code null}). @@ -63,7 +63,7 @@ default Object end( * of completion. */ Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java new file mode 100644 index 000000000000..50edfb7ab051 --- /dev/null +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java @@ -0,0 +1,113 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.annotation.support.async; + +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import javax.annotation.Nullable; + +/** + * A wrapper over {@link AsyncOperationEndHandler} that is able to defer {@link + * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous + * computation finishes. + */ +public final class AsyncOperationEndSupport { + + /** + * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code instrumenter}, + * configured for usage with asynchronous computations that are instances of {@code asyncType}. If + * the result of the async computation ends up being an instance of {@code responseType} it will + * be passed as the response to the {@code instrumenter} call; otherwise {@code null} value will + * be used as the response. + */ + public static AsyncOperationEndSupport create( + Instrumenter instrumenter, + Class responseType, + Class asyncType) { + return new AsyncOperationEndSupport<>( + instrumenter::end, + responseType, + asyncType, + AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); + } + + /** + * Returns a new {@link AsyncOperationEndSupport} that wraps over passed {@code handler}, + * configured for usage with asynchronous computations that are instances of {@code asyncType}. If + * the result of the async computation ends up being an instance of {@code responseType} it will + * be passed as the response to the {@code handler} call; otherwise {@code null} value will be + * used as the response. + */ + public static AsyncOperationEndSupport create( + AsyncOperationEndHandler handler, + Class responseType, + Class asyncType) { + return new AsyncOperationEndSupport<>( + handler, + responseType, + asyncType, + AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); + } + + private final AsyncOperationEndHandler handler; + private final Class responseType; + private final Class asyncType; + @Nullable private final AsyncOperationEndStrategy asyncOperationEndStrategy; + + private AsyncOperationEndSupport( + AsyncOperationEndHandler handler, + Class responseType, + Class asyncType, + @Nullable AsyncOperationEndStrategy asyncOperationEndStrategy) { + this.handler = handler; + this.responseType = responseType; + this.asyncType = asyncType; + this.asyncOperationEndStrategy = asyncOperationEndStrategy; + } + + /** + * Attempts to compose over passed {@code asyncValue} and delay the {@link + * Instrumenter#end(Context, Object, Object, Throwable)} call until the async operation completes. + * + *

This method will end the operation immediately if {@code throwable} is passed, if there is + * no {@link AsyncOperationEndStrategy} for the {@code asyncType} used, or if there is a type + * mismatch between passed {@code asyncValue} and the {@code asyncType} that was used to create + * this object. + * + *

If the passed {@code asyncValue} is recognized as an asynchronous computation, the operation + * won't be {@link Instrumenter#end(Context, Object, Object, Throwable) ended} until {@code + * asyncValue} completes. + */ + @SuppressWarnings("unchecked") + @Nullable + public ASYNC asyncEnd( + Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { + // we can end early if an exception was thrown + if (throwable != null) { + handler.handle(context, request, null, throwable); + return asyncValue; + } + + // use the configured strategy to compose over the asyncValue + if (asyncOperationEndStrategy != null && asyncType.isInstance(asyncValue)) { + return (ASYNC) + asyncOperationEndStrategy.end(handler, context, request, asyncValue, responseType); + } + + // fall back to sync end() if asyncValue type doesn't match + handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); + return asyncValue; + } + + @Nullable + public static RESPONSE tryToGetResponse( + Class responseType, @Nullable Object asyncValue) { + if (responseType.isInstance(asyncValue)) { + return responseType.cast(asyncValue); + } + return null; + } +} diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java similarity index 88% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java index 57bf0b3a558b..38498bbbe894 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.api.annotation.support.async; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import io.opentelemetry.context.Context; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -public enum Jdk8AsyncEndStrategy implements AsyncEndStrategy { +public enum Jdk8AsyncOperationEndStrategy implements AsyncOperationEndStrategy { INSTANCE; @Override @@ -21,7 +21,7 @@ public boolean supports(Class asyncType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -43,7 +43,7 @@ public Object end( * notification of completion. */ private static boolean tryToEndSynchronously( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, CompletableFuture future, @@ -67,7 +67,7 @@ private static boolean tryToEndSynchronously( * span will be ended. */ private static CompletionStage endWhenComplete( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, CompletionStage stage, diff --git a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java similarity index 80% rename from instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java rename to instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java index 71189c1e894d..667a2b50933f 100644 --- a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncEndSupportTest.java +++ b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupportTest.java @@ -22,14 +22,14 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class AsyncEndSupportTest { +class AsyncOperationEndSupportTest { @Mock Instrumenter instrumenter; @Test void shouldEndImmediatelyWhenExceptionWasPassed() { // given - AsyncEndSupport underTest = - AsyncEndSupport.create(instrumenter, String.class, CompletableFuture.class); + AsyncOperationEndSupport underTest = + AsyncOperationEndSupport.create(instrumenter, String.class, CompletableFuture.class); Context context = Context.root(); Exception exception = new RuntimeException("boom!"); @@ -47,8 +47,8 @@ void shouldEndImmediatelyWhenExceptionWasPassed() { @Test void shouldEndImmediatelyWhenWrongReturnTypeWasPassed() { // given - AsyncEndSupport underTest = - AsyncEndSupport.create(instrumenter, String.class, Future.class); + AsyncOperationEndSupport underTest = + AsyncOperationEndSupport.create(instrumenter, String.class, Future.class); Context context = Context.root(); CompletableFuture future = new CompletableFuture<>(); @@ -65,8 +65,8 @@ void shouldEndImmediatelyWhenWrongReturnTypeWasPassed() { @Test void shouldEndImmediatelyWhenAsyncWrapperIsOfWrongType() { // given - AsyncEndSupport underTest = - AsyncEndSupport.create(instrumenter, String.class, CompletableFuture.class); + AsyncOperationEndSupport underTest = + AsyncOperationEndSupport.create(instrumenter, String.class, CompletableFuture.class); Context context = Context.root(); @@ -82,8 +82,8 @@ void shouldEndImmediatelyWhenAsyncWrapperIsOfWrongType() { @Test void shouldReturnedDecoratedAsyncWrapper() { // given - AsyncEndSupport underTest = - AsyncEndSupport.create(instrumenter, String.class, CompletionStage.class); + AsyncOperationEndSupport underTest = + AsyncOperationEndSupport.create(instrumenter, String.class, CompletionStage.class); Context context = Context.root(); CompletableFuture future = new CompletableFuture<>(); diff --git a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java similarity index 95% rename from instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java rename to instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java index 73bd23b64c31..21611d276164 100644 --- a/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncEndStrategyTest.java +++ b/instrumentation-annotations-support/src/test/groovy/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategyTest.java @@ -18,10 +18,10 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class Jdk8AsyncEndStrategyTest { +class Jdk8AsyncOperationEndStrategyTest { @Mock Instrumenter instrumenter; - AsyncEndStrategy underTest = Jdk8AsyncEndStrategy.INSTANCE; + AsyncOperationEndStrategy underTest = Jdk8AsyncOperationEndStrategy.INSTANCE; @Test void shouldEndOperationOnAlreadyCompletedFuture() { diff --git a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java index 0fb1d87fe51d..d1d8bbc637f0 100644 --- a/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java +++ b/instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/InstrumentationHelper.java @@ -5,14 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.guava.v10_0; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; -import io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.guava.v10_0.GuavaAsyncOperationEndStrategy; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class InstrumentationHelper { static { - asyncEndStrategy = - GuavaAsyncEndStrategy.builder() + asyncOperationEndStrategy = + GuavaAsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes( AgentInstrumentationConfig.get() .getBoolean("otel.instrumentation.guava.experimental-span-attributes", false)) @@ -21,15 +21,15 @@ public final class InstrumentationHelper { registerAsyncSpanEndStrategy(); } - private static final GuavaAsyncEndStrategy asyncEndStrategy; + private static final GuavaAsyncOperationEndStrategy asyncOperationEndStrategy; private static void registerAsyncSpanEndStrategy() { - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); } /** * This method is invoked to trigger the runtime system to execute the static initializer block - * ensuring that the {@link GuavaAsyncEndStrategy} is registered exactly once. + * ensuring that the {@link GuavaAsyncOperationEndStrategy} is registered exactly once. */ public static void initialize() {} diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java similarity index 79% rename from instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java rename to instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java index 47714747fd17..24287d362804 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategy.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java @@ -5,32 +5,32 @@ package io.opentelemetry.instrumentation.guava.v10_0; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.Uninterruptibles; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; -public final class GuavaAsyncEndStrategy implements AsyncEndStrategy { +public final class GuavaAsyncOperationEndStrategy implements AsyncOperationEndStrategy { // Visible for testing static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("guava.canceled"); - public static GuavaAsyncEndStrategy create() { + public static GuavaAsyncOperationEndStrategy create() { return builder().build(); } - public static GuavaAsyncEndStrategyBuilder builder() { - return new GuavaAsyncEndStrategyBuilder(); + public static GuavaAsyncOperationEndStrategyBuilder builder() { + return new GuavaAsyncOperationEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - GuavaAsyncEndStrategy(boolean captureExperimentalSpanAttributes) { + GuavaAsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -41,7 +41,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, @@ -53,7 +53,7 @@ public Object end( } private void end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, ListenableFuture future, diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java similarity index 58% rename from instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java rename to instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java index 8c374a608b6b..faf858f01a6f 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyBuilder.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyBuilder.java @@ -7,19 +7,19 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class GuavaAsyncEndStrategyBuilder { +public final class GuavaAsyncOperationEndStrategyBuilder { private boolean captureExperimentalSpanAttributes = false; - GuavaAsyncEndStrategyBuilder() {} + GuavaAsyncOperationEndStrategyBuilder() {} @CanIgnoreReturnValue - public GuavaAsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public GuavaAsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public GuavaAsyncEndStrategy build() { - return new GuavaAsyncEndStrategy(captureExperimentalSpanAttributes); + public GuavaAsyncOperationEndStrategy build() { + return new GuavaAsyncOperationEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java b/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java similarity index 89% rename from instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java rename to instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java index 3872823be585..04846144735f 100644 --- a/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncEndStrategyTest.java +++ b/instrumentation/guava-10.0/library/src/test/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategyTest.java @@ -18,7 +18,7 @@ import com.google.common.util.concurrent.SettableFuture; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,13 +26,13 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class GuavaAsyncEndStrategyTest { +class GuavaAsyncOperationEndStrategyTest { @Mock private Instrumenter instrumenter; @Mock private Span span; - private final AsyncEndStrategy strategy = GuavaAsyncEndStrategy.create(); + private final AsyncOperationEndStrategy strategy = GuavaAsyncOperationEndStrategy.create(); @Test void listenableFutureSupported() { @@ -90,13 +90,14 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(GuavaAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)).thenReturn(span); + when(span.setAttribute(GuavaAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) + .thenReturn(span); SettableFuture future = SettableFuture.create(); Context context = Context.root().with(span); - AsyncEndStrategy strategy = - GuavaAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + AsyncOperationEndStrategy strategy = + GuavaAsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); strategy.end(instrumenter, context, "request", future, String.class); future.cancel(true); diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt index 2512d01f5147..dbd541182d86 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onCompletion -fun onComplete(flow: Flow<*>, handler: AsyncEndHandler, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> +fun onComplete(flow: Flow<*>, handler: AsyncOperationEndHandler, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> handler.handle(context, request, null, cause) } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java index ae522184384b..0f0206d8c9fc 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java @@ -6,23 +6,24 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import kotlinx.coroutines.flow.Flow; public final class FlowInstrumentationHelper { - private static final FlowAsyncEndStrategy asyncEndStrategy = new FlowAsyncEndStrategy(); + private static final FlowAsyncOperationEndStrategy asyncOperationEndStrategy = + new FlowAsyncOperationEndStrategy(); static { - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); } public static void initialize() {} private FlowInstrumentationHelper() {} - private static final class FlowAsyncEndStrategy implements AsyncEndStrategy { + private static final class FlowAsyncOperationEndStrategy implements AsyncOperationEndStrategy { @Override public boolean supports(Class returnType) { @@ -31,7 +32,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java index c5e5dfa0b468..983cf7e491e4 100644 --- a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java +++ b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentation.java @@ -15,7 +15,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -94,7 +94,7 @@ public static void stopSpan( scope.close(); returnValue = - AsyncEndSupport.create(instrumenter(), Void.class, method.getReturnType()) + AsyncOperationEndSupport.create(instrumenter(), Void.class, method.getReturnType()) .asyncEnd(context, classAndMethod, returnValue, throwable); } } diff --git a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java index 8f406a992d0d..4d99fcafbd3d 100644 --- a/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java +++ b/instrumentation/opentelemetry-extension-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extensionannotations/WithSpanInstrumentation.java @@ -18,7 +18,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; @@ -149,8 +149,8 @@ public static void stopSpan( } scope.close(); - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create( + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( WithSpanSingletons.instrumenter(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, method, returnValue, throwable); } @@ -195,8 +195,8 @@ public static void stopSpan( return; } scope.close(); - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create( + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( WithSpanSingletons.instrumenterWithAttributes(), Object.class, method.getReturnType()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java index fd0e706d5b74..74d9d84c00d3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-1.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/WithSpanInstrumentation.java @@ -17,7 +17,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -110,8 +110,8 @@ public static void stopSpan( } scope.close(); - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create(instrumenter(), Object.class, method.getReturnType()); + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create(instrumenter(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, method, returnValue, throwable); } } @@ -154,8 +154,8 @@ public static void stopSpan( return; } scope.close(); - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create( + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( instrumenterWithAttributes(), Object.class, method.getReturnType()); returnValue = operationEndSupport.asyncEnd(context, request, returnValue, throwable); } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java index 068d564f9824..c54187c6c534 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java @@ -8,7 +8,7 @@ import application.io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; @@ -35,8 +35,8 @@ public static Object record(Method method, Object returnValue, Throwable throwab private static Object record( Method method, Object returnValue, Throwable throwable, Object[] arguments) { - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create( + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( (context, m, object, error) -> getMethodCounter(m).record(object, arguments, error), Object.class, method.getReturnType()); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 21866a54d509..1468ba23d2eb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; +import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import application.io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; @@ -67,7 +67,8 @@ static class MetricAttributeHelper { MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); - AttributeReturnValue returnValueAttribute = method.getAnnotation(AttributeReturnValue.class); + AttributeForReturnValue returnValueAttribute = + method.getAnnotation(AttributeForReturnValue.class); bindReturn = returnValueAttribute != null ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index 3c1730775ea3..a152ad6064d2 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -10,7 +10,7 @@ import application.io.opentelemetry.instrumentation.annotations.incubator.Timed; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.javaagent.instrumentation.instrumentationannotations.MethodRequest; import java.lang.reflect.Method; import java.util.Map; @@ -44,8 +44,8 @@ private static Object record( Throwable throwable, long startNanoTime, Object[] arguments) { - AsyncEndSupport operationEndSupport = - AsyncEndSupport.create( + AsyncOperationEndSupport operationEndSupport = + AsyncOperationEndSupport.create( (context, m, object, error) -> getMethodTimer(m).record(object, arguments, error, startNanoTime), Object.class, diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 16c5ce4ff0d4..35de8ab45ee3 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import java.util.concurrent.CompletableFuture; @@ -40,7 +40,7 @@ public void exampleWithAttributes( @Attribute("custom_attr2") ToStringObject toStringObject) {} @Counted(value = "example.with.return.count") - @AttributeReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @@ -54,7 +54,7 @@ public void exampleWithException() { public void exampleIgnore() {} @Counted(value = "example.completable.future.count") - @AttributeReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 75f2987b1b17..54dbda5324f5 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; @@ -42,13 +42,13 @@ public void exampleWithException() { } @Timed(value = "example.with.return.duration") - @AttributeReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @Timed(value = "example.completable.future.duration") - @AttributeReturnValue("returnValue") + @AttributeForReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java index fc1905270f95..3d554240c21b 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ContextPropagationOperator.java @@ -26,7 +26,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -95,7 +95,7 @@ public static ContextPropagationOperatorBuilder builder() { return new ContextPropagationOperatorBuilder(); } - private final ReactorAsyncEndStrategy asyncEndStrategy; + private final ReactorAsyncOperationEndStrategy asyncOperationEndStrategy; private static final Object TRACE_CONTEXT_KEY = new Object() { @@ -150,8 +150,8 @@ public static Context getOpenTelemetryContextFromContextView( } ContextPropagationOperator(boolean captureExperimentalSpanAttributes) { - this.asyncEndStrategy = - ReactorAsyncEndStrategy.builder() + this.asyncOperationEndStrategy = + ReactorAsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); } @@ -167,8 +167,9 @@ public void registerOnEachOperator() { if (enabled) { return; } - Hooks.onEachOperator(TracingSubscriber.class.getName(), tracingLift(asyncEndStrategy)); - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + Hooks.onEachOperator( + TracingSubscriber.class.getName(), tracingLift(asyncOperationEndStrategy)); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); registerScheduleHook(RunnableWrapper.class.getName(), RunnableWrapper::new); enabled = true; } @@ -192,15 +193,15 @@ public void resetOnEachOperator() { return; } Hooks.resetOnEachOperator(TracingSubscriber.class.getName()); - AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); enabled = false; } } private static Function, ? extends Publisher> tracingLift( - ReactorAsyncEndStrategy asyncEndStrategy) { + ReactorAsyncOperationEndStrategy asyncOperationEndStrategy) { return Operators.lift( - ContextPropagationOperator::shouldInstrument, new Lifter<>(asyncEndStrategy)); + ContextPropagationOperator::shouldInstrument, new Lifter<>(asyncOperationEndStrategy)); } /** Forces Mono to run in traceContext scope. */ @@ -275,10 +276,10 @@ private static class Lifter /** Holds reference to strategy to prevent it from being collected. */ @SuppressWarnings({"FieldCanBeLocal", "UnusedVariable"}) - private final ReactorAsyncEndStrategy asyncEndStrategy; + private final ReactorAsyncOperationEndStrategy asyncOperationEndStrategy; - public Lifter(ReactorAsyncEndStrategy asyncEndStrategy) { - this.asyncEndStrategy = asyncEndStrategy; + public Lifter(ReactorAsyncOperationEndStrategy asyncOperationEndStrategy) { + this.asyncOperationEndStrategy = asyncOperationEndStrategy; } @Override diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java similarity index 86% rename from instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java rename to instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java index bf328161d84e..fe1237664f84 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategy.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java @@ -5,35 +5,35 @@ package io.opentelemetry.instrumentation.reactor.v3_1; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -public final class ReactorAsyncEndStrategy implements AsyncEndStrategy { +public final class ReactorAsyncOperationEndStrategy implements AsyncOperationEndStrategy { // Visible for testing static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("reactor.canceled"); - public static ReactorAsyncEndStrategy create() { + public static ReactorAsyncOperationEndStrategy create() { return builder().build(); } - public static ReactorAsyncEndStrategyBuilder builder() { - return new ReactorAsyncEndStrategyBuilder(); + public static ReactorAsyncOperationEndStrategyBuilder builder() { + return new ReactorAsyncOperationEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - ReactorAsyncEndStrategy(boolean captureExperimentalSpanAttributes) { + ReactorAsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -44,7 +44,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java similarity index 57% rename from instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java rename to instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java index ad8c6b7d4f46..cd745a94a8b4 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyBuilder.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyBuilder.java @@ -7,19 +7,19 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class ReactorAsyncEndStrategyBuilder { +public final class ReactorAsyncOperationEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - ReactorAsyncEndStrategyBuilder() {} + ReactorAsyncOperationEndStrategyBuilder() {} @CanIgnoreReturnValue - public ReactorAsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public ReactorAsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public ReactorAsyncEndStrategy build() { - return new ReactorAsyncEndStrategy(captureExperimentalSpanAttributes); + public ReactorAsyncOperationEndStrategy build() { + return new ReactorAsyncOperationEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java similarity index 93% rename from instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java rename to instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java index 5189ca0c0040..8745b0b382e4 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncEndStrategyTest.java +++ b/instrumentation/reactor/reactor-3.1/library/src/test/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategyTest.java @@ -12,7 +12,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -26,13 +26,13 @@ @ExtendWith(MockitoExtension.class) @SuppressWarnings("ClassCanBeStatic") -class ReactorAsyncEndStrategyTest { +class ReactorAsyncOperationEndStrategyTest { @Mock private Instrumenter instrumenter; @Mock private Span span; - private final AsyncEndStrategy strategy = ReactorAsyncEndStrategy.create(); + private final AsyncOperationEndStrategy strategy = ReactorAsyncOperationEndStrategy.create(); @Nested class MonoTest { @@ -107,11 +107,13 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(ReactorAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) + when(span.setAttribute(ReactorAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) .thenReturn(span); - AsyncEndStrategy strategy = - ReactorAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + AsyncOperationEndStrategy strategy = + ReactorAsyncOperationEndStrategy.builder() + .setCaptureExperimentalSpanAttributes(true) + .build(); UnicastProcessor source = UnicastProcessor.create(); Mono mono = source.singleOrEmpty(); @@ -248,11 +250,13 @@ void endsSpanOnCancel() { @Test void endsSpanOnCancelExperimentalAttribute() { when(span.storeInContext(any())).thenCallRealMethod(); - when(span.setAttribute(ReactorAsyncEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) + when(span.setAttribute(ReactorAsyncOperationEndStrategy.CANCELED_ATTRIBUTE_KEY, true)) .thenReturn(span); - AsyncEndStrategy strategy = - ReactorAsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + AsyncOperationEndStrategy strategy = + ReactorAsyncOperationEndStrategy.builder() + .setCaptureExperimentalSpanAttributes(true) + .build(); UnicastProcessor source = UnicastProcessor.create(); Context context = Context.root().with(span); diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java similarity index 91% rename from instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java rename to instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java index 970abf22653d..3c46a1277c42 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategy.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.rxjava.v2_0; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; @@ -24,21 +24,21 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.reactivestreams.Publisher; -public final class RxJava2AsyncEndStrategy implements AsyncEndStrategy { +public final class RxJava2AsyncOperationEndStrategy implements AsyncOperationEndStrategy { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); - public static RxJava2AsyncEndStrategy create() { + public static RxJava2AsyncOperationEndStrategy create() { return builder().build(); } - public static RxJava2AsyncEndStrategyBuilder builder() { - return new RxJava2AsyncEndStrategyBuilder(); + public static RxJava2AsyncOperationEndStrategyBuilder builder() { + return new RxJava2AsyncOperationEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - RxJava2AsyncEndStrategy(boolean captureExperimentalSpanAttributes) { + RxJava2AsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java similarity index 57% rename from instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java rename to instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java index 628c2d8da54a..a62a9a489954 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncEndStrategyBuilder.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategyBuilder.java @@ -7,20 +7,20 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class RxJava2AsyncEndStrategyBuilder { +public final class RxJava2AsyncOperationEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - RxJava2AsyncEndStrategyBuilder() {} + RxJava2AsyncOperationEndStrategyBuilder() {} @CanIgnoreReturnValue - public RxJava2AsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public RxJava2AsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public RxJava2AsyncEndStrategy build() { - return new RxJava2AsyncEndStrategy(captureExperimentalSpanAttributes); + public RxJava2AsyncOperationEndStrategy build() { + return new RxJava2AsyncOperationEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java index 15102c897283..30a4292366e3 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingAssembly.java @@ -24,7 +24,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; import io.reactivex.Completable; import io.reactivex.CompletableObserver; @@ -251,15 +251,15 @@ private static void enableMaybe() { })); } - private static RxJava2AsyncEndStrategy asyncEndStrategy; + private static RxJava2AsyncOperationEndStrategy asyncOperationEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncEndStrategy = - RxJava2AsyncEndStrategy.builder() + asyncOperationEndStrategy = + RxJava2AsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -301,9 +301,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncEndStrategy != null) { - AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); - asyncEndStrategy = null; + if (asyncOperationEndStrategy != null) { + AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); + asyncOperationEndStrategy = null; } } diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java b/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java similarity index 98% rename from instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java rename to instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java index 375a404bfdf0..d31f55b21c48 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncEndStrategyTest.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/test/java/RxJava2AsyncOperationEndStrategyTest.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.rxjava.v2_0.RxJava2AsyncEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v2_0.RxJava2AsyncOperationEndStrategy; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; @@ -41,14 +41,14 @@ import org.reactivestreams.Subscription; @ExtendWith(MockitoExtension.class) -public class RxJava2AsyncEndStrategyTest { +public class RxJava2AsyncOperationEndStrategyTest { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); @Mock Instrumenter instrumenter; @Mock Span span; - private final AsyncEndStrategy underTest = RxJava2AsyncEndStrategy.create(); - private final RxJava2AsyncEndStrategy underTestWithExperimentalAttributes = - RxJava2AsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + private final AsyncOperationEndStrategy underTest = RxJava2AsyncOperationEndStrategy.create(); + private final RxJava2AsyncOperationEndStrategy underTestWithExperimentalAttributes = + RxJava2AsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); @Nested class CompletableTest { diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java similarity index 92% rename from instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java rename to instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java index 867c4bb7ba0d..c3aedd9f8fe8 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategy.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java @@ -5,13 +5,13 @@ package io.opentelemetry.instrumentation.rxjava.v3.common; -import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport.tryToGetResponse; +import static io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport.tryToGetResponse; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndHandler; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; @@ -24,21 +24,21 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.reactivestreams.Publisher; -public final class RxJava3AsyncEndStrategy implements AsyncEndStrategy { +public final class RxJava3AsyncOperationEndStrategy implements AsyncOperationEndStrategy { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); - public static RxJava3AsyncEndStrategy create() { + public static RxJava3AsyncOperationEndStrategy create() { return builder().build(); } - public static RxJava3AsyncEndStrategyBuilder builder() { - return new RxJava3AsyncEndStrategyBuilder(); + public static RxJava3AsyncOperationEndStrategyBuilder builder() { + return new RxJava3AsyncOperationEndStrategyBuilder(); } private final boolean captureExperimentalSpanAttributes; - RxJava3AsyncEndStrategy(boolean captureExperimentalSpanAttributes) { + RxJava3AsyncOperationEndStrategy(boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; } @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncEndHandler handler, + AsyncOperationEndHandler handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java similarity index 57% rename from instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java rename to instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java index 92fbb5765084..60c9e994141f 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncEndStrategyBuilder.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategyBuilder.java @@ -7,20 +7,20 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; -public final class RxJava3AsyncEndStrategyBuilder { +public final class RxJava3AsyncOperationEndStrategyBuilder { private boolean captureExperimentalSpanAttributes; - RxJava3AsyncEndStrategyBuilder() {} + RxJava3AsyncOperationEndStrategyBuilder() {} @CanIgnoreReturnValue - public RxJava3AsyncEndStrategyBuilder setCaptureExperimentalSpanAttributes( + public RxJava3AsyncOperationEndStrategyBuilder setCaptureExperimentalSpanAttributes( boolean captureExperimentalSpanAttributes) { this.captureExperimentalSpanAttributes = captureExperimentalSpanAttributes; return this; } - public RxJava3AsyncEndStrategy build() { - return new RxJava3AsyncEndStrategy(captureExperimentalSpanAttributes); + public RxJava3AsyncOperationEndStrategy build() { + return new RxJava3AsyncOperationEndStrategy(captureExperimentalSpanAttributes); } } diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java b/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java similarity index 98% rename from instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java rename to instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java index 2b332e772d6f..f3fbd8144e23 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncEndStrategyTest.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/test/java/RxJava3AsyncOperationEndStrategyTest.java @@ -13,9 +13,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; @@ -41,14 +41,14 @@ import org.reactivestreams.Subscription; @ExtendWith(MockitoExtension.class) -public class RxJava3AsyncEndStrategyTest { +public class RxJava3AsyncOperationEndStrategyTest { private static final AttributeKey CANCELED_ATTRIBUTE_KEY = AttributeKey.booleanKey("rxjava.canceled"); @Mock Instrumenter instrumenter; @Mock Span span; - private final AsyncEndStrategy underTest = RxJava3AsyncEndStrategy.create(); - private final RxJava3AsyncEndStrategy underTestWithExperimentalAttributes = - RxJava3AsyncEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); + private final AsyncOperationEndStrategy underTest = RxJava3AsyncOperationEndStrategy.create(); + private final RxJava3AsyncOperationEndStrategy underTestWithExperimentalAttributes = + RxJava3AsyncOperationEndStrategy.builder().setCaptureExperimentalSpanAttributes(true).build(); @Nested class CompletableTest { diff --git a/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java b/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java index 5e6e5c618797..191a2ebf9b1f 100644 --- a/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-3.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_0/TracingAssembly.java @@ -24,9 +24,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingCompletableObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingMaybeObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingSingleObserver; @@ -253,15 +253,15 @@ private static void enableMaybe() { })); } - private static RxJava3AsyncEndStrategy asyncEndStrategy; + private static RxJava3AsyncOperationEndStrategy asyncOperationEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncEndStrategy = - RxJava3AsyncEndStrategy.builder() + asyncOperationEndStrategy = + RxJava3AsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -303,9 +303,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncEndStrategy != null) { - AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); - asyncEndStrategy = null; + if (asyncOperationEndStrategy != null) { + AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); + asyncOperationEndStrategy = null; } } diff --git a/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java b/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java index 1f2bebb1761a..10726a499728 100644 --- a/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java +++ b/instrumentation/rxjava/rxjava-3.1.1/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3_1_1/TracingAssembly.java @@ -24,9 +24,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.instrumentation.api.internal.GuardedBy; -import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncEndStrategy; +import io.opentelemetry.instrumentation.rxjava.v3.common.RxJava3AsyncOperationEndStrategy; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingCompletableObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingMaybeObserver; import io.opentelemetry.instrumentation.rxjava.v3.common.TracingSingleObserver; @@ -253,15 +253,15 @@ private static void enableMaybe() { })); } - private static RxJava3AsyncEndStrategy asyncEndStrategy; + private static RxJava3AsyncOperationEndStrategy asyncOperationEndStrategy; private static void enableWithSpanStrategy(boolean captureExperimentalSpanAttributes) { - asyncEndStrategy = - RxJava3AsyncEndStrategy.builder() + asyncOperationEndStrategy = + RxJava3AsyncOperationEndStrategy.builder() .setCaptureExperimentalSpanAttributes(captureExperimentalSpanAttributes) .build(); - AsyncEndStrategies.instance().registerStrategy(asyncEndStrategy); + AsyncOperationEndStrategies.instance().registerStrategy(asyncOperationEndStrategy); } @GuardedBy("TracingAssembly.class") @@ -303,9 +303,9 @@ private static void disableMaybe() { } private static void disableWithSpanStrategy() { - if (asyncEndStrategy != null) { - AsyncEndStrategies.instance().unregisterStrategy(asyncEndStrategy); - asyncEndStrategy = null; + if (asyncOperationEndStrategy != null) { + AsyncOperationEndStrategies.instance().unregisterStrategy(asyncOperationEndStrategy); + asyncOperationEndStrategy = null; } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java index 86464c709b3f..89ff79dd6ab9 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java @@ -13,7 +13,7 @@ import io.opentelemetry.instrumentation.annotations.WithSpan; import io.opentelemetry.instrumentation.api.annotation.support.MethodSpanAttributesExtractor; import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import org.aspectj.lang.ProceedingJoinPoint; @@ -72,16 +72,17 @@ public Object traceMethod(ProceedingJoinPoint pjp) throws Throwable { } Context context = instrumenter.start(parentContext, request); - AsyncEndSupport asyncEndSupport = - AsyncEndSupport.create(instrumenter, Object.class, request.method().getReturnType()); + AsyncOperationEndSupport asyncOperationEndSupport = + AsyncOperationEndSupport.create( + instrumenter, Object.class, request.method().getReturnType()); Object response; try (Scope ignored = context.makeCurrent()) { response = pjp.proceed(); } catch (Throwable t) { - asyncEndSupport.asyncEnd(context, request, null, t); + asyncOperationEndSupport.asyncEnd(context, request, null, t); throw t; } - return asyncEndSupport.asyncEnd(context, request, response, null); + return asyncOperationEndSupport.asyncEnd(context, request, response, null); } } diff --git a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java index bda558b15e40..b751e6977f99 100644 --- a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java +++ b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/v1_8/SpringDataInstrumentationModule.java @@ -14,7 +14,7 @@ import com.google.auto.service.AutoService; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndSupport; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndSupport; import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -132,7 +132,7 @@ public Object invoke(MethodInvocation methodInvocation) throws Throwable { if (Object.class == type && MONO_CLASS != null && MONO_CLASS.isInstance(result)) { type = MONO_CLASS; } - return AsyncEndSupport.create(instrumenter(), Void.class, type) + return AsyncOperationEndSupport.create(instrumenter(), Void.class, type) .asyncEnd(context, classAndMethod, result, null); } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 8a49feab10d2..5a08597845f1 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -33,7 +33,7 @@ import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; import io.opentelemetry.javaagent.extension.instrumentation.internal.EarlyInstrumentationModule; -import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncEndStrategies; +import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncOperationEndStrategies; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilderImpl; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesBridge; @@ -119,7 +119,7 @@ private static void installBytebuddyAgent( Iterable agentListeners, EarlyInitAgentConfig earlyConfig) { - WeakRefAsyncEndStrategies.initialize(); + WeakRefAsyncOperationEndStrategies.initialize(); EmbeddedInstrumentationProperties.setPropertiesLoader(extensionClassLoader); setDefineClassHandler(); FieldBackedImplementationConfiguration.configure(earlyConfig); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java similarity index 58% rename from javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java index 802f5b5129a3..6db566e1466f 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncEndStrategies.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/asyncannotationsupport/WeakRefAsyncOperationEndStrategies.java @@ -5,51 +5,53 @@ package io.opentelemetry.javaagent.tooling.asyncannotationsupport; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategies; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncEndStrategy; -import io.opentelemetry.instrumentation.api.annotation.support.async.Jdk8AsyncEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; +import io.opentelemetry.instrumentation.api.annotation.support.async.Jdk8AsyncOperationEndStrategy; import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.annotation.Nullable; -public final class WeakRefAsyncEndStrategies extends AsyncEndStrategies { +public final class WeakRefAsyncOperationEndStrategies extends AsyncOperationEndStrategies { /** * Use the weak reference strategy in the agent. This will prevent leaking reference to * strategies' classloaders, in case applications get undeployed (and all their classes unloaded). */ public static void initialize() { - AsyncEndStrategies.internalSetStrategiesStorage(new WeakRefAsyncEndStrategies()); + AsyncOperationEndStrategies.internalSetStrategiesStorage( + new WeakRefAsyncOperationEndStrategies()); } - private final List> strategies = new CopyOnWriteArrayList<>(); + private final List> strategies = + new CopyOnWriteArrayList<>(); - private WeakRefAsyncEndStrategies() { - registerStrategy(Jdk8AsyncEndStrategy.INSTANCE); + private WeakRefAsyncOperationEndStrategies() { + registerStrategy(Jdk8AsyncOperationEndStrategy.INSTANCE); } @Override - public void registerStrategy(AsyncEndStrategy strategy) { + public void registerStrategy(AsyncOperationEndStrategy strategy) { strategies.add(new WeakReference<>(strategy)); } @Override - public void unregisterStrategy(AsyncEndStrategy strategy) { + public void unregisterStrategy(AsyncOperationEndStrategy strategy) { strategies.removeIf( ref -> { - AsyncEndStrategy s = ref.get(); + AsyncOperationEndStrategy s = ref.get(); return s == null || s == strategy; }); } @Nullable @Override - public AsyncEndStrategy resolveStrategy(Class returnType) { + public AsyncOperationEndStrategy resolveStrategy(Class returnType) { boolean purgeCollectedWeakReferences = false; try { - for (WeakReference ref : strategies) { - AsyncEndStrategy s = ref.get(); + for (WeakReference ref : strategies) { + AsyncOperationEndStrategy s = ref.get(); if (s == null) { purgeCollectedWeakReferences = true; } else if (s.supports(returnType)) { From f92cd3eccecdfd074b80f941b202aa59d2264d5e Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 22 Apr 2025 21:07:59 +0800 Subject: [PATCH 38/51] rename AttributeForReturnValue to AttributeReturnValue --- ...tributeForReturnValue.java => AttributeReturnValue.java} | 2 +- .../incubator/MetricsAnnotationHelper.java | 5 ++--- .../incubator/counted/CountedExample.java | 6 +++--- .../incubator/timed/TimedExample.java | 6 +++--- 4 files changed, 9 insertions(+), 10 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{AttributeForReturnValue.java => AttributeReturnValue.java} (96%) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java similarity index 96% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java index b7b806d5a358..14aae7de3d4a 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeForReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java @@ -29,7 +29,7 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface AttributeForReturnValue { +public @interface AttributeReturnValue { /** * Attribute name for the return value. diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 1468ba23d2eb..21866a54d509 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import application.io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; @@ -67,8 +67,7 @@ static class MetricAttributeHelper { MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); - AttributeForReturnValue returnValueAttribute = - method.getAnnotation(AttributeForReturnValue.class); + AttributeReturnValue returnValueAttribute = method.getAnnotation(AttributeReturnValue.class); bindReturn = returnValueAttribute != null ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 35de8ab45ee3..16c5ce4ff0d4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import java.util.concurrent.CompletableFuture; @@ -40,7 +40,7 @@ public void exampleWithAttributes( @Attribute("custom_attr2") ToStringObject toStringObject) {} @Counted(value = "example.with.return.count") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @@ -54,7 +54,7 @@ public void exampleWithException() { public void exampleIgnore() {} @Counted(value = "example.completable.future.count") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 54dbda5324f5..75f2987b1b17 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeForReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; @@ -42,13 +42,13 @@ public void exampleWithException() { } @Timed(value = "example.with.return.duration") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @Timed(value = "example.completable.future.duration") - @AttributeForReturnValue("returnValue") + @AttributeReturnValue("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } From 771fe713897b5c6e5cb645f14a979c4861538efd Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Thu, 24 Apr 2025 21:20:28 +0800 Subject: [PATCH 39/51] rename --- .../instrumentation/annotations/incubator/Attribute.java | 3 +-- ...{AttributeReturnValue.java => ReturnValueAttribute.java} | 5 ++--- .../incubator/MetricsAnnotationHelper.java | 4 ++-- .../incubator/counted/CountedExample.java | 6 +++--- .../incubator/timed/TimedExample.java | 6 +++--- 5 files changed, 11 insertions(+), 13 deletions(-) rename instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/{AttributeReturnValue.java => ReturnValueAttribute.java} (88%) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index 21b520d90d82..7b7fe0eb1b6e 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -14,8 +14,7 @@ * This annotation marks that a parameter of a method or constructor annotated with {@link Timed} or * {@link Counted} should be added as an attribute to the metric. * - *

By default, the `{@link Object#toString()}` will be called on the parameter value to convert - * it to a String. + *

`{@link Object#toString()}` will be called on the parameter value to convert it to a String. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation * that the attribute should be captured. diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/ReturnValueAttribute.java similarity index 88% rename from instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java rename to instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/ReturnValueAttribute.java index 14aae7de3d4a..52299e8628f6 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/AttributeReturnValue.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/ReturnValueAttribute.java @@ -14,8 +14,7 @@ * This annotation allows for adding the method return value as an attribute to metrics recorded * using the {@link Timed} and {@link Counted} annotations. * - *

By default, the {@link Object#toString()} will be called on the return value to convert it to - * a String. + *

{@link Object#toString()} will be called on the return value to convert it to a String. * *

Application developers can use this annotation to signal OpenTelemetry auto-instrumentation * that the attribute should be captured. @@ -29,7 +28,7 @@ */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface AttributeReturnValue { +public @interface ReturnValueAttribute { /** * Attribute name for the return value. diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 21866a54d509..b6bc0927a273 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator; import application.io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import application.io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; +import application.io.opentelemetry.instrumentation.annotations.incubator.ReturnValueAttribute; import application.io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; @@ -67,7 +67,7 @@ static class MetricAttributeHelper { MetricAttributeHelper(Method method) { bindParameters = MethodBinder.bindParameters(method, PARAMETER_ATTRIBUTE_NAMES_EXTRACTOR); - AttributeReturnValue returnValueAttribute = method.getAnnotation(AttributeReturnValue.class); + ReturnValueAttribute returnValueAttribute = method.getAnnotation(ReturnValueAttribute.class); bindReturn = returnValueAttribute != null ? MethodBinder.bindReturnValue(method, returnValueAttribute.value()) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 16c5ce4ff0d4..6e65177a283b 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.counted; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; import io.opentelemetry.instrumentation.annotations.incubator.Counted; +import io.opentelemetry.instrumentation.annotations.incubator.ReturnValueAttribute; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import java.util.concurrent.CompletableFuture; @@ -40,7 +40,7 @@ public void exampleWithAttributes( @Attribute("custom_attr2") ToStringObject toStringObject) {} @Counted(value = "example.with.return.count") - @AttributeReturnValue("returnValue") + @ReturnValueAttribute("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @@ -54,7 +54,7 @@ public void exampleWithException() { public void exampleIgnore() {} @Counted(value = "example.completable.future.count") - @AttributeReturnValue("returnValue") + @ReturnValueAttribute("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 75f2987b1b17..54fefbcb546b 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationannotations.incubator.timed; import io.opentelemetry.instrumentation.annotations.incubator.Attribute; -import io.opentelemetry.instrumentation.annotations.incubator.AttributeReturnValue; +import io.opentelemetry.instrumentation.annotations.incubator.ReturnValueAttribute; import io.opentelemetry.instrumentation.annotations.incubator.StaticAttribute; import io.opentelemetry.instrumentation.annotations.incubator.Timed; import java.util.concurrent.CompletableFuture; @@ -42,13 +42,13 @@ public void exampleWithException() { } @Timed(value = "example.with.return.duration") - @AttributeReturnValue("returnValue") + @ReturnValueAttribute("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } @Timed(value = "example.completable.future.duration") - @AttributeReturnValue("returnValue") + @ReturnValueAttribute("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; } From 874ad04f13fde7bca3d4441aec3e0a357cbbae1f Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Thu, 24 Apr 2025 23:04:38 +0800 Subject: [PATCH 40/51] rename AsyncOperationEndHandler#handle to AsyncOperationCallback#onEnd --- ...dHandler.java => AsyncOperationCallback.java} | 4 ++-- .../support/async/AsyncOperationEndStrategy.java | 10 +++++----- .../support/async/AsyncOperationEndSupport.java | 16 ++++++++-------- .../async/Jdk8AsyncOperationEndStrategy.java | 12 ++++++------ .../v10_0/GuavaAsyncOperationEndStrategy.java | 12 ++++++------ .../kotlinxcoroutines/flow/FlowUtil.kt | 6 +++--- .../flow/FlowInstrumentationHelper.java | 4 ++-- .../v3_1/ReactorAsyncOperationEndStrategy.java | 6 +++--- .../v2_0/RxJava2AsyncOperationEndStrategy.java | 6 +++--- .../common/RxJava3AsyncOperationEndStrategy.java | 6 +++--- 10 files changed, 41 insertions(+), 41 deletions(-) rename instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/{AsyncOperationEndHandler.java => AsyncOperationCallback.java} (83%) diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationCallback.java similarity index 83% rename from instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java rename to instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationCallback.java index 0d82aa16aa8b..f409e2627117 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndHandler.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationCallback.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; /** Callback that is called when async computation completes. */ -public interface AsyncOperationEndHandler { - void handle( +public interface AsyncOperationCallback { + void onEnd( Context context, REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error); } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java index d3bba94fbe6c..c78e9629aebe 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndStrategy.java @@ -12,7 +12,7 @@ * Implementations of this interface describe how to compose over {@linkplain #supports(Class) * supported} asynchronous computation types and delay marking the operation as ended by calling * {@link Instrumenter#end(Context, Object, Object, Throwable)} or {@link - * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)}. + * AsyncOperationCallback#onEnd(Context, Object, Object, Throwable)}. */ public interface AsyncOperationEndStrategy { @@ -47,12 +47,12 @@ default Object end( } /** - * Composes over {@code asyncValue} and delays the {@link AsyncOperationEndHandler#handle(Context, + * Composes over {@code asyncValue} and delays the {@link AsyncOperationCallback#onEnd(Context, * Object, Object, Throwable)} call until after the asynchronous operation represented by {@code * asyncValue} completes. * - * @param handler The {@link AsyncOperationEndHandler} to be used to end the operation stored in - * the {@code context}. + * @param handler The {@link AsyncOperationCallback} to be used to end the operation stored in the + * {@code context}. * @param asyncValue Return value from the instrumented method. Must be an instance of a {@code * asyncType} for which {@link #supports(Class)} returned true (in particular it must not be * {@code null}). @@ -63,7 +63,7 @@ default Object end( * of completion. */ Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java index 50edfb7ab051..08dc92c01810 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/AsyncOperationEndSupport.java @@ -10,9 +10,9 @@ import javax.annotation.Nullable; /** - * A wrapper over {@link AsyncOperationEndHandler} that is able to defer {@link - * AsyncOperationEndHandler#handle(Context, Object, Object, Throwable)} until asynchronous - * computation finishes. + * A wrapper over {@link AsyncOperationCallback} that is able to defer {@link + * AsyncOperationCallback#onEnd(Context, Object, Object, Throwable)} until asynchronous computation + * finishes. */ public final class AsyncOperationEndSupport { @@ -42,7 +42,7 @@ public static AsyncOperationEndSupport cr * used as the response. */ public static AsyncOperationEndSupport create( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Class responseType, Class asyncType) { return new AsyncOperationEndSupport<>( @@ -52,13 +52,13 @@ public static AsyncOperationEndSupport cr AsyncOperationEndStrategies.instance().resolveStrategy(asyncType)); } - private final AsyncOperationEndHandler handler; + private final AsyncOperationCallback handler; private final Class responseType; private final Class asyncType; @Nullable private final AsyncOperationEndStrategy asyncOperationEndStrategy; private AsyncOperationEndSupport( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Class responseType, Class asyncType, @Nullable AsyncOperationEndStrategy asyncOperationEndStrategy) { @@ -87,7 +87,7 @@ public ASYNC asyncEnd( Context context, REQUEST request, @Nullable ASYNC asyncValue, @Nullable Throwable throwable) { // we can end early if an exception was thrown if (throwable != null) { - handler.handle(context, request, null, throwable); + handler.onEnd(context, request, null, throwable); return asyncValue; } @@ -98,7 +98,7 @@ public ASYNC asyncEnd( } // fall back to sync end() if asyncValue type doesn't match - handler.handle(context, request, tryToGetResponse(responseType, asyncValue), null); + handler.onEnd(context, request, tryToGetResponse(responseType, asyncValue), null); return asyncValue; } diff --git a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java index 38498bbbe894..84b6dcf9b9d9 100644 --- a/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java +++ b/instrumentation-annotations-support/src/main/java/io/opentelemetry/instrumentation/api/annotation/support/async/Jdk8AsyncOperationEndStrategy.java @@ -21,7 +21,7 @@ public boolean supports(Class asyncType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, @@ -43,7 +43,7 @@ public Object end( * notification of completion. */ private static boolean tryToEndSynchronously( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, CompletableFuture future, @@ -55,9 +55,9 @@ private static boolean tryToEndSynchronously( try { Object potentialResponse = future.join(); - handler.handle(context, request, tryToGetResponse(responseType, potentialResponse), null); + handler.onEnd(context, request, tryToGetResponse(responseType, potentialResponse), null); } catch (Throwable t) { - handler.handle(context, request, null, t); + handler.onEnd(context, request, null, t); } return true; } @@ -67,13 +67,13 @@ private static boolean tryToEndSynchronously( * span will be ended. */ private static CompletionStage endWhenComplete( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, CompletionStage stage, Class responseType) { return stage.whenComplete( (result, exception) -> - handler.handle(context, request, tryToGetResponse(responseType, result), exception)); + handler.onEnd(context, request, tryToGetResponse(responseType, result), exception)); } } diff --git a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java index 24287d362804..62a47bd1a5d3 100644 --- a/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java +++ b/instrumentation/guava-10.0/library/src/main/java/io/opentelemetry/instrumentation/guava/v10_0/GuavaAsyncOperationEndStrategy.java @@ -12,7 +12,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; public final class GuavaAsyncOperationEndStrategy implements AsyncOperationEndStrategy { @@ -41,7 +41,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, @@ -53,7 +53,7 @@ public Object end( } private void end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, ListenableFuture future, @@ -63,13 +63,13 @@ private void end( if (captureExperimentalSpanAttributes) { Span.fromContext(context).setAttribute(CANCELED_ATTRIBUTE_KEY, true); } - handler.handle(context, request, null, null); + handler.onEnd(context, request, null, null); } else { try { Object response = Uninterruptibles.getUninterruptibly(future); - handler.handle(context, request, tryToGetResponse(responseType, response), null); + handler.onEnd(context, request, tryToGetResponse(responseType, response), null); } catch (Throwable exception) { - handler.handle(context, request, null, exception); + handler.onEnd(context, request, null, exception); } } } else { diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt index dbd541182d86..84994f957fbe 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent-kotlin/src/main/kotlin/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowUtil.kt @@ -6,10 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onCompletion -fun onComplete(flow: Flow<*>, handler: AsyncOperationEndHandler, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> - handler.handle(context, request, null, cause) +fun onComplete(flow: Flow<*>, handler: AsyncOperationCallback, context: Context, request: REQUEST & Any): Flow<*> = flow.onCompletion { cause: Throwable? -> + handler.onEnd(context, request, null, cause) } diff --git a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java index 0f0206d8c9fc..fcc83dfa446c 100644 --- a/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java +++ b/instrumentation/kotlinx-coroutines/kotlinx-coroutines-flow-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/flow/FlowInstrumentationHelper.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.flow; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategies; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import kotlinx.coroutines.flow.Flow; @@ -32,7 +32,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, diff --git a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java index fe1237664f84..b3242a263aca 100644 --- a/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java +++ b/instrumentation/reactor/reactor-3.1/library/src/main/java/io/opentelemetry/instrumentation/reactor/v3_1/ReactorAsyncOperationEndStrategy.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -44,7 +44,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, @@ -54,7 +54,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object result, Throwable error) { - handler.handle(context, request, tryToGetResponse(responseType, result), error); + handler.onEnd(context, request, tryToGetResponse(responseType, result), error); } }; diff --git a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java index 3c46a1277c42..a27079f788ba 100644 --- a/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/RxJava2AsyncOperationEndStrategy.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.reactivex.Completable; import io.reactivex.Flowable; @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, @@ -65,7 +65,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object response, Throwable error) { - handler.handle(context, request, tryToGetResponse(responseType, response), error); + handler.onEnd(context, request, tryToGetResponse(responseType, response), error); } }; diff --git a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java index c3aedd9f8fe8..1aee89f42e27 100644 --- a/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java +++ b/instrumentation/rxjava/rxjava-3-common/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v3/common/RxJava3AsyncOperationEndStrategy.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndHandler; +import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationCallback; import io.opentelemetry.instrumentation.api.annotation.support.async.AsyncOperationEndStrategy; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; @@ -55,7 +55,7 @@ public boolean supports(Class returnType) { @Override public Object end( - AsyncOperationEndHandler handler, + AsyncOperationCallback handler, Context context, REQUEST request, Object asyncValue, @@ -65,7 +65,7 @@ public Object end( new EndOnFirstNotificationConsumer(context) { @Override protected void end(Object response, Throwable error) { - handler.handle(context, request, tryToGetResponse(responseType, response), error); + handler.onEnd(context, request, tryToGetResponse(responseType, response), error); } }; From 298704ae178d03ecdf5774e01dfed0d0eab152ae Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Mon, 12 May 2025 23:41:06 +0800 Subject: [PATCH 41/51] update README.md for instrumentation-annotations --- .../opentelemetry-instrumentation-annotations/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/README.md b/instrumentation/opentelemetry-instrumentation-annotations/README.md index aa7476f0a5b9..172efe278037 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/README.md +++ b/instrumentation/opentelemetry-instrumentation-annotations/README.md @@ -1,7 +1,6 @@ # Settings for the OpenTelemetry Instrumentation Annotations integration -Instruments methods annotated with OpenTelemetry instrumentation annotations, such as @WithSpan and -@SpanAttribute. +Instruments methods annotated with OpenTelemetry instrumentation annotations, such as @WithSpan, @SpanAttribute, @Counted and @Timed. | Environment variable | Type | Default | Description | | -------------------------------------------------------------------------------- | ------ | ------- | --------------------------------------------------------------------------------- | From cfaeb91dd6b7bbaf765482f322701c955ee76465 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Wed, 21 May 2025 22:52:12 +0800 Subject: [PATCH 42/51] fix fossa --- .fossa.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.fossa.yml b/.fossa.yml index b4b98c888b14..2b9eb23203da 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -766,6 +766,9 @@ targets: - type: gradle path: ./ target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent' - type: gradle path: ./ target: ':instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-1.16:javaagent' @@ -775,9 +778,6 @@ targets: - type: gradle path: ./ target: ':instrumentation:opentelemetry-instrumentation-annotations:opentelemetry-instrumentation-annotations-incubator:javaagent' - - type: gradle - path: ./ - target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent' - type: gradle path: ./ target: ':instrumentation:pekko:pekko-actor-1.0:javaagent' From 166b4453922760db326819a8b52d601e78a742ae Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 10 Jun 2025 22:20:49 +0800 Subject: [PATCH 43/51] for re-run ci --- .../opentelemetry-instrumentation-annotations/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/README.md b/instrumentation/opentelemetry-instrumentation-annotations/README.md index 172efe278037..a1566060a14c 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/README.md +++ b/instrumentation/opentelemetry-instrumentation-annotations/README.md @@ -5,3 +5,5 @@ Instruments methods annotated with OpenTelemetry instrumentation annotations, su | Environment variable | Type | Default | Description | | -------------------------------------------------------------------------------- | ------ | ------- | --------------------------------------------------------------------------------- | | `otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by annotation-based advices. | + +for rerun ci From 5dbf7406eb5c35a4e92fc974eb0fa28d82ca53b6 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Tue, 10 Jun 2025 22:29:35 +0800 Subject: [PATCH 44/51] remove test --- .../opentelemetry-instrumentation-annotations/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/README.md b/instrumentation/opentelemetry-instrumentation-annotations/README.md index a1566060a14c..1f235fe60c89 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/README.md +++ b/instrumentation/opentelemetry-instrumentation-annotations/README.md @@ -6,4 +6,3 @@ Instruments methods annotated with OpenTelemetry instrumentation annotations, su | -------------------------------------------------------------------------------- | ------ | ------- | --------------------------------------------------------------------------------- | | `otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by annotation-based advices. | -for rerun ci From 2bbca47ae6196a34a0d4a6bfa5ebb938728d7cc3 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Tue, 10 Jun 2025 14:34:34 +0000 Subject: [PATCH 45/51] ./gradlew spotlessApply --- .../opentelemetry-instrumentation-annotations/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/README.md b/instrumentation/opentelemetry-instrumentation-annotations/README.md index 1f235fe60c89..172efe278037 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/README.md +++ b/instrumentation/opentelemetry-instrumentation-annotations/README.md @@ -5,4 +5,3 @@ Instruments methods annotated with OpenTelemetry instrumentation annotations, su | Environment variable | Type | Default | Description | | -------------------------------------------------------------------------------- | ------ | ------- | --------------------------------------------------------------------------------- | | `otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods` | String | | All methods to be excluded from auto-instrumentation by annotation-based advices. | - From cff297fc73a4223404b283085e3e91f77ad6c2c9 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 6 Jul 2025 19:40:56 +0800 Subject: [PATCH 46/51] use semconv stable --- .../incubator/MetricsAnnotationHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index b6bc0927a273..51a838be21ed 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -14,7 +14,7 @@ import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.instrumentation.api.annotation.support.MethodBinder; import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor; -import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; +import io.opentelemetry.semconv.CodeAttributes; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.function.BiConsumer; @@ -35,7 +35,7 @@ public abstract class MetricsAnnotationHelper { static void addStaticAttributes(Method method, AttributesBuilder attributesBuilder) { attributesBuilder.put( - CodeIncubatingAttributes.CODE_FUNCTION_NAME, + CodeAttributes.CODE_FUNCTION_NAME, method.getDeclaringClass().getName() + "." + method.getName()); StaticAttribute[] staticAttributes = method.getDeclaredAnnotationsByType(StaticAttribute.class); From 5d33384e8a2be5677de8a6995d202f636db0ad80 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 19 Jul 2025 15:05:19 +0800 Subject: [PATCH 47/51] change value to name --- .../annotations/incubator/Attribute.java | 2 +- .../annotations/incubator/Counted.java | 2 +- .../annotations/incubator/Timed.java | 2 +- .../incubator/CountedUsageExamples.java | 7 +++--- .../incubator/TimedUsageExamples.java | 7 +++--- .../incubator/counted/CountedExample.java | 22 +++++++++---------- .../incubator/timed/TimedExample.java | 20 ++++++++--------- .../timed/TimedInstrumentationTest.java | 2 +- 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java index 7b7fe0eb1b6e..49a12942e38f 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Attribute.java @@ -37,5 +37,5 @@ * `javac`, the parameter name will be used instead. If the parameter name is not available, e.g., * because the code was not compiled with that flag, the attribute will be ignored. */ - String value() default ""; + String name() default ""; } diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java index d01776cfbe9b..913011258e98 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Counted.java @@ -40,7 +40,7 @@ *

The name should follow the metric naming rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-name-syntax */ - String value(); + String name(); /** * Description of the metric. diff --git a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java index ee6c92b4802c..3c65fcd6576a 100644 --- a/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java +++ b/instrumentation-annotations-incubator/src/main/java/io/opentelemetry/instrumentation/annotations/incubator/Timed.java @@ -40,7 +40,7 @@ *

The name should follow the metric naming rules: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument-naming-rule */ - String value(); + String name(); /** * Description for the metric. diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java index a5c426fbab4f..3beb58c1576b 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/CountedUsageExamples.java @@ -7,9 +7,10 @@ public class CountedUsageExamples { - @Counted("customizedName") + @Counted(name = "customizedName") public void method() {} - @Counted("methodWithAttributes") - public void attributes(@Attribute String attribute1, @Attribute("attribute2") long attribute2) {} + @Counted(name = "methodWithAttributes") + public void attributes( + @Attribute String attribute1, @Attribute(name = "attribute2") long attribute2) {} } diff --git a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java index 741fa76dafed..7328b9d5aa3c 100644 --- a/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java +++ b/instrumentation-annotations-incubator/src/test/java/io/opentelemetry/instrumentation/annotations/incubator/TimedUsageExamples.java @@ -7,9 +7,10 @@ public class TimedUsageExamples { - @Timed("customizedName") + @Timed(name = "customizedName") public void method() {} - @Timed("methodWithAttributes") - public void attributes(@Attribute String attribute1, @Attribute("attribute2") long attribute2) {} + @Timed(name = "methodWithAttributes") + public void attributes( + @Attribute String attribute1, @Attribute(name = "attribute2") long attribute2) {} } diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 6e65177a283b..b94ccf288d63 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -18,42 +18,42 @@ public class CountedExample { public static final String METRIC_UNIT = "ms"; public static final String TO_STRING = "I am a to string object."; - @Counted(METRIC_NAME) + @Counted(name = METRIC_NAME) public void exampleWithName() {} - @Counted(value = "example.with.description.count", description = METRIC_DESCRIPTION) + @Counted(name = "example.with.description.count", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} - @Counted(value = "example.with.unit.count", unit = METRIC_UNIT) + @Counted(name = "example.with.unit.count", unit = METRIC_UNIT) public void exampleWithUnit() {} - @Counted("example.with.static.attributes.count") + @Counted(name = "example.with.static.attributes.count") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") @StaticAttribute(name = "key2", value = "value2") public void exampleWithStaticAttributes() {} - @Counted("example.with.attributes.count") + @Counted(name = "example.with.attributes.count") public void exampleWithAttributes( @Attribute String attribute1, - @Attribute("custom_attr1") long attribute2, - @Attribute("custom_attr2") ToStringObject toStringObject) {} + @Attribute(name = "custom_attr1") long attribute2, + @Attribute(name = "custom_attr2") ToStringObject toStringObject) {} - @Counted(value = "example.with.return.count") + @Counted(name = "example.with.return.count") @ReturnValueAttribute("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } - @Counted("example.with.exception.count") + @Counted(name = "example.with.exception.count") public void exampleWithException() { throw new IllegalStateException("test exception."); } - @Counted("example.ignore.count") + @Counted(name = "example.ignore.count") public void exampleIgnore() {} - @Counted(value = "example.completable.future.count") + @Counted(name = "example.completable.future.count") @ReturnValueAttribute("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 54fefbcb546b..2aa5b73c41b4 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -16,38 +16,38 @@ public class TimedExample { public static final String METRIC_DESCRIPTION = "I am the description."; public static final String TO_STRING = "I am a to string object."; - @Timed(METRIC_NAME) + @Timed(name = METRIC_NAME) public void exampleWithName() {} - @Timed(value = "example.with.description.duration", description = METRIC_DESCRIPTION) + @Timed(name = "example.with.description.duration", description = METRIC_DESCRIPTION) public void exampleWithDescription() {} - @Timed("example.with.static.attributes.duration") + @Timed(name = "example.with.static.attributes.duration") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") public void exampleWithStaticAttributes() {} - @Timed("example.with.attributes.duration") + @Timed(name = "example.with.attributes.duration") public void exampleWithAttributes( @Attribute String attribute1, - @Attribute("custom_attr1") long attribute2, - @Attribute("custom_attr2") TimedExample.ToStringObject toStringObject) {} + @Attribute(name = "custom_attr1") long attribute2, + @Attribute(name = "custom_attr2") TimedExample.ToStringObject toStringObject) {} - @Timed("example.ignore.duration") + @Timed(name = "example.ignore.duration") public void exampleIgnore() {} - @Timed("example.with.exception.duration") + @Timed(name = "example.with.exception.duration") public void exampleWithException() { throw new IllegalStateException("test"); } - @Timed(value = "example.with.return.duration") + @Timed(name = "example.with.return.duration") @ReturnValueAttribute("returnValue") public ToStringObject exampleWithReturnValueAttribute() { return new ToStringObject(); } - @Timed(value = "example.completable.future.duration") + @Timed(name = "example.completable.future.duration") @ReturnValueAttribute("returnValue") public CompletableFuture completableFuture(CompletableFuture future) { return future; diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java index e3198517f0a4..e4c42463934f 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedInstrumentationTest.java @@ -122,7 +122,7 @@ void testExampleWithException() { } @Test - void testExampleWithReturnValueAttribute() { + void testExampleWithReturnNameAttribute() { new TimedExample().exampleWithReturnValueAttribute(); testing.waitAndAssertMetrics( TIMED_INSTRUMENTATION_NAME, From 00b5577fa62e3e28ff851dacc7f959874b4c9365 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sat, 19 Jul 2025 15:24:41 +0800 Subject: [PATCH 48/51] change value to name --- .../instrumentationannotations/incubator/CountedHelper.java | 2 +- .../incubator/MetricsAnnotationHelper.java | 6 +++--- .../instrumentationannotations/incubator/TimedHelper.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java index c54187c6c534..72b9f929a292 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/CountedHelper.java @@ -55,7 +55,7 @@ private static class MethodCounter { Counted countedAnnotation = method.getAnnotation(Counted.class); counter = METER - .counterBuilder(countedAnnotation.value()) + .counterBuilder(countedAnnotation.name()) .setDescription(countedAnnotation.description()) .setUnit(countedAnnotation.unit()) .build(); diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java index 51a838be21ed..f3b78dac02cb 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/MetricsAnnotationHelper.java @@ -50,9 +50,9 @@ private static String attributeName(Parameter parameter) { if (annotation == null) { return null; } - String value = annotation.value(); - if (!value.isEmpty()) { - return value; + String name = annotation.name(); + if (!name.isEmpty()) { + return name; } else if (parameter.isNamePresent()) { return parameter.getName(); } else { diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java index a152ad6064d2..6c8ba93780cf 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/TimedHelper.java @@ -70,7 +70,7 @@ private static class MethodTimer { Timed timedAnnotation = method.getAnnotation(Timed.class); histogram = METER - .histogramBuilder(timedAnnotation.value()) + .histogramBuilder(timedAnnotation.name()) .setDescription(timedAnnotation.description()) .setUnit("s") .build(); From 1e16d9d42d2c6f3b149da7a7ed62c28b59f86cc5 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 27 Jul 2025 21:15:20 +0800 Subject: [PATCH 49/51] remove deplicate annotation case --- .../incubator/counted/CountedExample.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index b94ccf288d63..92763639838d 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -30,7 +30,6 @@ public void exampleWithUnit() {} @Counted(name = "example.with.static.attributes.count") @StaticAttribute(name = "key1", value = "value1") @StaticAttribute(name = "key2", value = "value2") - @StaticAttribute(name = "key2", value = "value2") public void exampleWithStaticAttributes() {} @Counted(name = "example.with.attributes.count") From 6939ed4ba0ab8b0af3ba30a54f8de1304d28e110 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 27 Jul 2025 21:34:46 +0800 Subject: [PATCH 50/51] add overlay case for StaticAttribtue --- .../incubator/counted/CountedExample.java | 1 + .../instrumentationannotations/incubator/timed/TimedExample.java | 1 + 2 files changed, 2 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java index 92763639838d..a349b91bed31 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/counted/CountedExample.java @@ -29,6 +29,7 @@ public void exampleWithUnit() {} @Counted(name = "example.with.static.attributes.count") @StaticAttribute(name = "key1", value = "value1") + @StaticAttribute(name = "key2", value = "value3") @StaticAttribute(name = "key2", value = "value2") public void exampleWithStaticAttributes() {} diff --git a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java index 2aa5b73c41b4..924316144139 100644 --- a/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java +++ b/instrumentation/opentelemetry-instrumentation-annotations/opentelemetry-instrumentation-annotations-incubator/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationannotations/incubator/timed/TimedExample.java @@ -24,6 +24,7 @@ public void exampleWithDescription() {} @Timed(name = "example.with.static.attributes.duration") @StaticAttribute(name = "key1", value = "value1") + @StaticAttribute(name = "key2", value = "value3") @StaticAttribute(name = "key2", value = "value2") public void exampleWithStaticAttributes() {} From 6da511d9ff98118aedc9ead2720c3842d63672e0 Mon Sep 17 00:00:00 2001 From: Duncan-tree-zhou Date: Sun, 21 Sep 2025 20:50:37 +0800 Subject: [PATCH 51/51] skip test task check for instrumentation-annotations-incubator because we don't have test task on it. --- instrumentation-annotations-incubator/build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/instrumentation-annotations-incubator/build.gradle.kts b/instrumentation-annotations-incubator/build.gradle.kts index 321ea11d7f85..7a0e2dac5de6 100644 --- a/instrumentation-annotations-incubator/build.gradle.kts +++ b/instrumentation-annotations-incubator/build.gradle.kts @@ -11,3 +11,10 @@ group = "io.opentelemetry.instrumentation" dependencies { api("io.opentelemetry:opentelemetry-api") } + +tasks.test { + // This module does not have tests, but has example classes in the test directory. Gradle 9 fails + // the build when there are source files in the test directory but no tests to run so we disable + // the test task. + enabled = false +}