Update the OpenTelemetry SDK version to 1.47.0 (#13250)

Co-authored-by: Lauri Tulmin <ltulmin@splunk.com>
This commit is contained in:
OpenTelemetry Bot 2025-02-12 16:14:27 -08:00 committed by GitHub
parent 15358d6a3d
commit 129f224b84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
42 changed files with 773 additions and 160 deletions

View File

@ -751,6 +751,9 @@ targets:
- type: gradle
path: ./
target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent'
- type: gradle
path: ./
target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent'
- type: gradle
path: ./
target: ':instrumentation:pekko:pekko-actor-1.0:javaagent'

View File

@ -68,7 +68,8 @@ jobs:
cache-read-only: ${{ inputs.cache-read-only }}
- name: Generate license report
run: ./gradlew generateLicenseReport ${{ inputs.no-build-cache && '--no-build-cache' || '' }}
# with the build cache enabled occasionally produces outdated results
run: ./gradlew generateLicenseReport --no-build-cache
- name: Check licenses
run: |

View File

@ -5,7 +5,7 @@ plugins {
data class DependencySet(val group: String, val version: String, val modules: List<String>)
// this line is managed by .github/scripts/update-sdk-version.sh
val otelSdkVersion = "1.46.0"
val otelSdkVersion = "1.47.0"
val otelContribVersion = "1.43.0-alpha"
val otelSdkAlphaVersion = otelSdkVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1")

View File

@ -27,7 +27,7 @@ subprojects {
ext {
versions = [
// this line is managed by .github/scripts/update-sdk-version.sh
opentelemetrySdk : "1.46.0",
opentelemetrySdk : "1.47.0",
// these lines are managed by .github/scripts/update-version.sh
opentelemetryJavaagent : "2.13.0-SNAPSHOT",

View File

@ -23,7 +23,7 @@ version '1.0'
ext {
versions = [
// this line is managed by .github/scripts/update-sdk-version.sh
opentelemetrySdk : "1.46.0",
opentelemetrySdk : "1.47.0",
// these lines are managed by .github/scripts/update-version.sh
opentelemetryJavaagent : "2.13.0-SNAPSHOT",

View File

@ -120,11 +120,18 @@ public final class ApplicationOpenTelemetry127 implements OpenTelemetry {
}
private static ApplicationLoggerFactory getLoggerFactory() {
// this class is defined in opentelemetry-api-1.42
// this class is defined in opentelemetry-api-1.47
ApplicationLoggerFactory loggerFactory =
getLoggerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.incubator.logs.ApplicationLoggerFactory142Incubator");
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs.ApplicationLoggerFactory147Incubator");
if (loggerFactory == null) {
// this class is defined in opentelemetry-api-1.42
loggerFactory =
getLoggerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.incubator.logs.ApplicationLoggerFactory142Incubator");
}
if (loggerFactory == null) {
// this class is defined in opentelemetry-api-1.42
loggerFactory =
getLoggerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLoggerFactory142");
@ -147,10 +154,16 @@ public final class ApplicationOpenTelemetry127 implements OpenTelemetry {
}
private static ApplicationTracerFactory getTracerFactory() {
// this class is defined in opentelemetry-api-1.40
// this class is defined in opentelemetry-api-1.47
ApplicationTracerFactory tracerFactory =
getTracerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.trace.ApplicationTracerFactory140Incubator");
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace.ApplicationTracerFactory147Incubator");
if (tracerFactory == null) {
// this class is defined in opentelemetry-api-1.40
tracerFactory =
getTracerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.trace.ApplicationTracerFactory140Incubator");
}
if (tracerFactory == null) {
tracerFactory = new ApplicationTracerFactory127();
}

View File

@ -21,6 +21,9 @@ configurations.configureEach {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api:1.32.0")
}
if (name.equals("testRuntimeClasspath")) {
exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator")
}
}
}

View File

@ -9,6 +9,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleHistogram;
@ -44,6 +45,15 @@ class MeterTest {
.build();
}
@Test
void incubatingApiNotAvailable() {
assertThatThrownBy(
() ->
Class.forName(
"io.opentelemetry.extension.incubator.metrics.ExtendedDoubleGaugeBuilder"))
.isInstanceOf(ClassNotFoundException.class);
}
@Test
void longHistogram() {
LongHistogramBuilder builder =

View File

@ -21,16 +21,15 @@ configurations.configureEach {
force("io.opentelemetry:opentelemetry-api:1.37.0")
force("io.opentelemetry:opentelemetry-api-incubator:1.37.0-alpha")
}
if (name.startsWith("incubatorTest") || name.startsWith("noopTest")) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api-incubator:1.37.0-alpha")
}
} else if (name.startsWith("oldAndNewIncubatorTest")) {
if (name.startsWith("oldAndNewIncubatorTest")) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api-incubator:1.37.0-alpha")
force("io.opentelemetry:opentelemetry-extension-incubator:1.32.0-alpha")
}
}
if (name.equals("testRuntimeClasspath")) {
exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator")
}
}
}

View File

@ -9,6 +9,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleHistogram;
@ -44,6 +45,13 @@ class MeterTest {
.build();
}
@Test
void incubatingApiNotAvailable() {
assertThatThrownBy(
() -> Class.forName("io.opentelemetry.api.incubator.metrics.ExtendedLongGaugeBuilder"))
.isInstanceOf(ClassNotFoundException.class);
}
@Test
void longHistogram() {
LongHistogramBuilder builder =

View File

@ -20,11 +20,10 @@ configurations.configureEach {
if (name.endsWith("testRuntimeClasspath", true) || name.endsWith("testCompileClasspath", true)) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api:1.38.0")
force("io.opentelemetry:opentelemetry-api-incubator:1.38.0-alpha")
}
if (name.startsWith("incubatorTest") || name.startsWith("noopTest")) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api-incubator:1.38.0-alpha")
}
if (name.equals("testRuntimeClasspath")) {
exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator")
}
}
}

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_38.metric
import static io.opentelemetry.api.common.AttributeKey.stringKey;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleGauge;
@ -44,6 +45,13 @@ class MeterTest {
.build();
}
@Test
void incubatingApiNotAvailable() {
assertThatThrownBy(
() -> Class.forName("io.opentelemetry.api.incubator.metrics.ExtendedLongGaugeBuilder"))
.isInstanceOf(ClassNotFoundException.class);
}
@Test
void syncLongGauge() throws InterruptedException {
LongGaugeBuilder builder =

View File

@ -23,6 +23,7 @@ configurations.configureEach {
if (name.endsWith("testRuntimeClasspath", true) || name.endsWith("testCompileClasspath", true)) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api:1.40.0")
force("io.opentelemetry:opentelemetry-api-incubator:1.40.0-alpha")
}
}
}

View File

@ -24,8 +24,11 @@ public class OpenTelemetryApiIncubatorInstrumentationModule extends Instrumentat
@Override
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
// EventLogger was removed in 1.47, including it here prevents the instrumentation from applying
// to 1.47
return hasClassesNamed(
"application.io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram");
"application.io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram",
"application.io.opentelemetry.api.incubator.events.EventLogger");
}
@Override

View File

@ -27,12 +27,12 @@ import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import javax.annotation.Nullable;
final class ApplicationSpanBuilder140Incubator extends ApplicationSpanBuilder
public final class ApplicationSpanBuilder140Incubator extends ApplicationSpanBuilder
implements ExtendedSpanBuilder {
private final io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder agentBuilder;
ApplicationSpanBuilder140Incubator(io.opentelemetry.api.trace.SpanBuilder agentBuilder) {
public ApplicationSpanBuilder140Incubator(io.opentelemetry.api.trace.SpanBuilder agentBuilder) {
super(agentBuilder);
this.agentBuilder = (io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder) agentBuilder;
}

View File

@ -22,11 +22,10 @@ configurations.configureEach {
if (name.endsWith("testRuntimeClasspath", true) || name.endsWith("testCompileClasspath", true)) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api:1.42.0")
force("io.opentelemetry:opentelemetry-api-incubator:1.42.0-alpha")
}
if (name.startsWith("incubatorTest")) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api-incubator:1.42.0-alpha")
}
if (name.equals("testRuntimeClasspath")) {
exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator")
}
}
}

View File

@ -24,7 +24,11 @@ public class OpenTelemetryApiIncubatorInstrumentationModule extends Instrumentat
@Override
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
return hasClassesNamed("application.io.opentelemetry.api.incubator.logs.ExtendedLogger");
// EventLogger was removed in 1.47, including it here prevents the instrumentation from applying
// to 1.47
return hasClassesNamed(
"application.io.opentelemetry.api.incubator.logs.ExtendedLogger",
"application.io.opentelemetry.api.incubator.events.EventLogger");
}
@Override

View File

@ -1,74 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.incubator.logs;
import application.io.opentelemetry.api.common.KeyValue;
import application.io.opentelemetry.api.common.Value;
import application.io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogRecordBuilder;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
class ApplicationLogRecordBuilder142 extends ApplicationLogRecordBuilder
implements LogRecordBuilder {
private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder;
ApplicationLogRecordBuilder142(io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
super(agentLogRecordBuilder);
this.agentLogRecordBuilder = agentLogRecordBuilder;
}
@Override
public LogRecordBuilder setBody(Value<?> body) {
agentLogRecordBuilder.setBody(convertValue(body));
return this;
}
@SuppressWarnings("unchecked")
private static io.opentelemetry.api.common.Value<?> convertValue(Value<?> value) {
if (value == null) {
return null;
}
switch (value.getType()) {
case STRING:
return io.opentelemetry.api.common.Value.of((String) value.getValue());
case BOOLEAN:
return io.opentelemetry.api.common.Value.of((Boolean) value.getValue());
case LONG:
return io.opentelemetry.api.common.Value.of((Long) value.getValue());
case DOUBLE:
return io.opentelemetry.api.common.Value.of((Double) value.getValue());
case ARRAY:
List<Value<?>> values = (List<Value<?>>) value.getValue();
List<io.opentelemetry.api.common.Value<?>> convertedValues = new ArrayList<>();
for (Value<?> source : values) {
convertedValues.add(convertValue(source));
}
return io.opentelemetry.api.common.Value.of(convertedValues);
case KEY_VALUE_LIST:
List<KeyValue> keyValueList = (List<KeyValue>) value.getValue();
io.opentelemetry.api.common.KeyValue[] convertedKeyValueList =
new io.opentelemetry.api.common.KeyValue[keyValueList.size()];
int i = 0;
for (KeyValue source : keyValueList) {
convertedKeyValueList[i++] =
io.opentelemetry.api.common.KeyValue.of(
source.getKey(), convertValue(source.getValue()));
}
return io.opentelemetry.api.common.Value.of(convertedKeyValueList);
case BYTES:
ByteBuffer byteBuffer = (ByteBuffer) value.getValue();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
break;
}
throw new IllegalStateException("Unhandled value type: " + value.getType());
}
}

View File

@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.incuba
import application.io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.logs.ApplicationLogger140Incubator;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLogRecordBuilder142;
class ApplicationLogger142Incubator extends ApplicationLogger140Incubator {

View File

@ -13,12 +13,13 @@ import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
class ApplicationLogRecordBuilder142 extends ApplicationLogRecordBuilder
public class ApplicationLogRecordBuilder142 extends ApplicationLogRecordBuilder
implements LogRecordBuilder {
private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder;
ApplicationLogRecordBuilder142(io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
public ApplicationLogRecordBuilder142(
io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
super(agentLogRecordBuilder);
this.agentLogRecordBuilder = agentLogRecordBuilder;
}

View File

@ -6,6 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.awaitility.Awaitility.await;
import io.opentelemetry.api.GlobalOpenTelemetry;
@ -54,6 +55,12 @@ class LoggerTest {
.build();
}
@Test
void incubatingApiNotAvailable() {
assertThatThrownBy(() -> Class.forName("io.opentelemetry.api.incubator.logs.ExtendedLogger"))
.isInstanceOf(ClassNotFoundException.class);
}
@Test
void logRecordBuilder() {
SpanContext spanContext =

View File

@ -0,0 +1,22 @@
plugins {
id("otel.javaagent-instrumentation")
}
dependencies {
compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "v1_47"))
compileOnly("io.opentelemetry:opentelemetry-api-incubator")
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.10:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.15:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.27:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.31:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.32:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.37:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent"))
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent"))
testImplementation("io.opentelemetry:opentelemetry-api-incubator")
}

View File

@ -0,0 +1,39 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator;
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
import static java.util.Collections.singletonList;
import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
import java.util.List;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiIncubatorInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.47", "opentelemetry-api-incubator-1.47");
}
@Override
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
return hasClassesNamed("application.io.opentelemetry.api.incubator.logs.ExtendedLogger");
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryIncubatorInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.none;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.metrics.ApplicationMeterFactory140Incubator;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs.ApplicationLoggerFactory147Incubator;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace.ApplicationTracerFactory147Incubator;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
public class OpenTelemetryIncubatorInstrumentation implements TypeInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return named("application.io.opentelemetry.api.GlobalOpenTelemetry");
}
@Override
public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod(
none(), OpenTelemetryIncubatorInstrumentation.class.getName() + "$InitAdvice");
}
@SuppressWarnings({"ReturnValueIgnored", "unused"})
public static class InitAdvice {
@Advice.OnMethodEnter
public static void init() {
// the sole purpose of this advice is to ensure that ApplicationLoggerFactory147Incubator is
// recognized as helper class and injected into class loader
ApplicationLoggerFactory147Incubator.class.getName();
// 1.40 instrumentation does not apply on 1.47, we include only the metrics part here
ApplicationMeterFactory140Incubator.class.getName();
ApplicationTracerFactory147Incubator.class.getName();
}
}
}

View File

@ -0,0 +1,28 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs;
import application.io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLogRecordBuilder142;
public class ApplicationLogRecordBuilder147Incubator extends ApplicationLogRecordBuilder142
implements ExtendedLogRecordBuilder {
private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder;
ApplicationLogRecordBuilder147Incubator(LogRecordBuilder agentLogRecordBuilder) {
super(agentLogRecordBuilder);
this.agentLogRecordBuilder = agentLogRecordBuilder;
}
@Override
public ExtendedLogRecordBuilder setEventName(String eventName) {
((io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder) agentLogRecordBuilder)
.setEventName(eventName);
return this;
}
}

View File

@ -0,0 +1,30 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs;
import application.io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
import application.io.opentelemetry.api.incubator.logs.ExtendedLogger;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger;
class ApplicationLogger147Incubator extends ApplicationLogger implements ExtendedLogger {
private final io.opentelemetry.api.logs.Logger agentLogger;
ApplicationLogger147Incubator(io.opentelemetry.api.logs.Logger agentLogger) {
super(agentLogger);
this.agentLogger = agentLogger;
}
@Override
public boolean isEnabled() {
return ((io.opentelemetry.api.incubator.logs.ExtendedLogger) agentLogger).isEnabled();
}
@Override
public ExtendedLogRecordBuilder logRecordBuilder() {
return new ApplicationLogRecordBuilder147Incubator(agentLogger.logRecordBuilder());
}
}

View File

@ -0,0 +1,19 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerFactory;
// this class is used from opentelemetry-api-1.27.0 via reflection
public class ApplicationLoggerFactory147Incubator implements ApplicationLoggerFactory {
@Override
public ApplicationLogger newLogger(Logger agentLogger) {
return new ApplicationLogger147Incubator(agentLogger);
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace;
import application.io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
import application.io.opentelemetry.api.incubator.trace.ExtendedTracer;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.ApplicationTracer;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.trace.ApplicationSpanBuilder140Incubator;
final class ApplicationTracer147Incubator extends ApplicationTracer implements ExtendedTracer {
private final Tracer agentTracer;
ApplicationTracer147Incubator(Tracer agentTracer) {
super(agentTracer);
this.agentTracer = agentTracer;
}
@Override
public ExtendedSpanBuilder spanBuilder(String spanName) {
return new ApplicationSpanBuilder140Incubator(agentTracer.spanBuilder(spanName));
}
@Override
public boolean isEnabled() {
return ((io.opentelemetry.api.incubator.trace.ExtendedTracer) agentTracer).isEnabled();
}
}

View File

@ -0,0 +1,19 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.ApplicationTracer;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.ApplicationTracerFactory;
// this class is used from opentelemetry-api-1.27.0 via reflection
public class ApplicationTracerFactory147Incubator implements ApplicationTracerFactory {
@Override
public ApplicationTracer newTracer(Tracer agentTracer) {
return new ApplicationTracer147Incubator(agentTracer);
}
}

View File

@ -0,0 +1,149 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.logs;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.KeyValue;
import io.opentelemetry.api.common.Value;
import io.opentelemetry.api.common.ValueType;
import io.opentelemetry.api.incubator.logs.ExtendedLogger;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData;
import io.opentelemetry.sdk.trace.IdGenerator;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
class LoggerTest {
@RegisterExtension
static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create();
private String instrumentationName;
private Logger logger;
@BeforeEach
void setupLogger(TestInfo test) {
instrumentationName = "test-" + test.getDisplayName();
logger =
GlobalOpenTelemetry.get()
.getLogsBridge()
.loggerBuilder(instrumentationName)
.setInstrumentationVersion("1.2.3")
.setSchemaUrl("http://schema.org")
.build();
}
@Test
void logRecordBuilder() {
assertThat(logger).isInstanceOf(ExtendedLogger.class);
SpanContext spanContext =
SpanContext.create(
IdGenerator.random().generateTraceId(),
IdGenerator.random().generateSpanId(),
TraceFlags.getDefault(),
TraceState.getDefault());
((ExtendedLogger) logger)
.logRecordBuilder()
.setEventName("eventName")
.setTimestamp(1, TimeUnit.SECONDS)
.setTimestamp(Instant.now())
.setContext(Context.current().with(Span.wrap(spanContext)))
.setSeverity(Severity.DEBUG)
.setSeverityText("debug")
.setBody("body")
.setAttribute(AttributeKey.stringKey("key"), "value")
.setAllAttributes(Attributes.builder().put("key", "value").build())
.emit();
await()
.untilAsserted(
() ->
assertThat(testing.logRecords())
.satisfiesExactly(
logRecordData -> {
assertThat(logRecordData.getInstrumentationScopeInfo().getName())
.isEqualTo(instrumentationName);
assertThat(((ExtendedLogRecordData) logRecordData).getEventName())
.isEqualTo("eventName");
assertThat(logRecordData.getInstrumentationScopeInfo().getVersion())
.isEqualTo("1.2.3");
assertThat(logRecordData.getTimestampEpochNanos()).isGreaterThan(0);
assertThat(logRecordData.getSpanContext()).isEqualTo(spanContext);
assertThat(logRecordData.getSeverity()).isEqualTo(Severity.DEBUG);
assertThat(logRecordData.getSeverityText()).isEqualTo("debug");
assertThat(logRecordData.getBodyValue().getType())
.isEqualTo(ValueType.STRING);
assertThat(logRecordData.getBodyValue().getValue()).isEqualTo("body");
assertThat(logRecordData.getAttributes())
.isEqualTo(Attributes.builder().put("key", "value").build());
}));
}
private static Stream<Arguments> bodyValues() {
return Stream.of(
Arguments.of(Value.of("hello")),
Arguments.of(Value.of(42)),
Arguments.of(Value.of(42.42)),
Arguments.of(Value.of(true)),
Arguments.of(Value.of(new byte[] {4, 2})),
Arguments.of(Value.of(Value.of("hello"), Value.of(42))),
Arguments.of(Value.of(KeyValue.of("key", Value.of(42)))));
}
@ParameterizedTest
@MethodSource("bodyValues")
void logBodyValue() {
Value<?> value = Value.of(42);
logger.logRecordBuilder().setBody(value).emit();
await()
.untilAsserted(
() ->
assertThat(testing.logRecords())
.satisfiesExactly(
logRecordData -> {
assertThat(logRecordData.getBodyValue().getType())
.isEqualTo(value.getType());
assertThat(logRecordData.getBodyValue().getValue())
.isEqualTo(value.getValue());
}));
}
@Test
void logNullBody() {
Value<?> value = null;
logger.logRecordBuilder().setBody(value).emit();
await()
.untilAsserted(
() ->
assertThat(testing.logRecords())
.satisfiesExactly(
logRecordData -> assertThat(logRecordData.getBodyValue()).isNull()));
}
}

View File

@ -0,0 +1,85 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.metrics;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounter;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleGauge;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleUpDownCounter;
import io.opentelemetry.api.incubator.metrics.ExtendedLongCounter;
import io.opentelemetry.api.incubator.metrics.ExtendedLongGauge;
import io.opentelemetry.api.incubator.metrics.ExtendedLongHistogram;
import io.opentelemetry.api.incubator.metrics.ExtendedLongUpDownCounter;
import io.opentelemetry.api.metrics.DoubleCounter;
import io.opentelemetry.api.metrics.DoubleGauge;
import io.opentelemetry.api.metrics.DoubleGaugeBuilder;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
import io.opentelemetry.api.metrics.DoubleUpDownCounter;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.LongCounterBuilder;
import io.opentelemetry.api.metrics.LongGauge;
import io.opentelemetry.api.metrics.LongHistogram;
import io.opentelemetry.api.metrics.LongUpDownCounter;
import io.opentelemetry.api.metrics.LongUpDownCounterBuilder;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
class MeterTest {
@RegisterExtension
static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create();
@Test
void isEnabled() {
Meter disabledMeter = testing.getOpenTelemetry().getMeter("disabled-meter");
Meter enabledMeter = testing.getOpenTelemetry().getMeter("enabled-meter");
testEnabled(disabledMeter, false);
testEnabled(enabledMeter, true);
}
private static void testEnabled(Meter meter, boolean expected) {
LongCounterBuilder counterBuilder = meter.counterBuilder("test");
LongCounter longCounter = counterBuilder.build();
assertThat(longCounter).isInstanceOf(ExtendedLongCounter.class);
assertThat(((ExtendedLongCounter) longCounter).isEnabled()).isEqualTo(expected);
DoubleCounter doubleCounter = counterBuilder.ofDoubles().build();
assertThat(doubleCounter).isInstanceOf(ExtendedDoubleCounter.class);
assertThat(((ExtendedDoubleCounter) doubleCounter).isEnabled()).isEqualTo(expected);
LongUpDownCounterBuilder upDownCounterBuilder = meter.upDownCounterBuilder("test");
LongUpDownCounter longUpDownCounter = upDownCounterBuilder.build();
assertThat(longUpDownCounter).isInstanceOf(ExtendedLongUpDownCounter.class);
assertThat(((ExtendedLongUpDownCounter) longUpDownCounter).isEnabled()).isEqualTo(expected);
DoubleUpDownCounter doubleUpDownCounter = upDownCounterBuilder.ofDoubles().build();
assertThat(doubleUpDownCounter).isInstanceOf(ExtendedDoubleUpDownCounter.class);
assertThat(((ExtendedDoubleUpDownCounter) doubleUpDownCounter).isEnabled()).isEqualTo(expected);
DoubleGaugeBuilder gaugeBuilder = meter.gaugeBuilder("test");
DoubleGauge doubleGauge = gaugeBuilder.build();
assertThat(doubleGauge).isInstanceOf(ExtendedDoubleGauge.class);
assertThat(((ExtendedDoubleGauge) doubleGauge).isEnabled()).isEqualTo(expected);
LongGauge longGauge = gaugeBuilder.ofLongs().build();
assertThat(longGauge).isInstanceOf(ExtendedLongGauge.class);
assertThat(((ExtendedLongGauge) longGauge).isEnabled()).isEqualTo(expected);
DoubleHistogramBuilder histogramBuilder = meter.histogramBuilder("test");
DoubleHistogram doubleHistogram = histogramBuilder.build();
assertThat(doubleHistogram).isInstanceOf(ExtendedDoubleHistogram.class);
assertThat(((ExtendedDoubleHistogram) doubleHistogram).isEnabled()).isEqualTo(expected);
LongHistogram longHistogram = histogramBuilder.ofLongs().build();
assertThat(longHistogram).isInstanceOf(ExtendedLongHistogram.class);
assertThat(((ExtendedLongHistogram) longHistogram).isEnabled()).isEqualTo(expected);
}
}

View File

@ -0,0 +1,117 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.trace;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
import io.opentelemetry.api.incubator.trace.ExtendedTracer;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
class TracerTest {
@RegisterExtension
private static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
@Test
void isEnabled() {
Tracer disabledTracer = testing.getOpenTelemetry().getTracer("disabled-tracer");
Tracer enabledTracer = testing.getOpenTelemetry().getTracer("enabled-tracer");
testEnabled(disabledTracer, false);
testEnabled(enabledTracer, true);
}
private static void testEnabled(Tracer tracer, boolean expected) {
assertThat(tracer).isInstanceOf(ExtendedTracer.class);
assertThat(((ExtendedTracer) tracer).isEnabled()).isEqualTo(expected);
}
@Test
void extendedSpanBuilder() {
Tracer tracer = testing.getOpenTelemetry().getTracer("test");
assertThat(tracer).isInstanceOf(ExtendedTracer.class);
ExtendedTracer extendedTracer = (ExtendedTracer) tracer;
ExtendedSpanBuilder builder = extendedTracer.spanBuilder("test");
{
Span span = builder.startAndCall(Span::current);
assertThat(span.getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
{
Span span = builder.startAndCall(Span::current, (s, t) -> {});
assertThat(span.getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
{
AtomicReference<Span> spanRef = new AtomicReference<>();
assertThatThrownBy(
() ->
builder.startAndCall(
() -> {
throw new IllegalStateException("fail");
},
(s, t) -> spanRef.set(s)))
.isInstanceOf(IllegalStateException.class);
assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
{
AtomicReference<Span> spanRef = new AtomicReference<>();
builder.startAndRun(() -> spanRef.set(Span.current()));
assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
{
AtomicReference<Span> spanRef = new AtomicReference<>();
builder.startAndRun(() -> spanRef.set(Span.current()), (s, t) -> {});
assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
{
AtomicReference<Span> spanRef = new AtomicReference<>();
assertThatThrownBy(
() ->
builder.startAndRun(
() -> {
throw new IllegalStateException("fail");
},
(s, t) -> spanRef.set(s)))
.isInstanceOf(IllegalStateException.class);
assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid());
}
Map<String, String> map = new HashMap<>();
Context context =
Context.root()
.with(
Span.wrap(
SpanContext.create(
TraceId.fromLongs(0, 1),
SpanId.fromLong(2),
TraceFlags.getDefault(),
TraceState.getDefault())));
W3CTraceContextPropagator.getInstance()
.inject(context, map, (m, key, value) -> m.put(key, value));
builder.setParentFrom(ContextPropagators.create(W3CTraceContextPropagator.getInstance()), map);
Span span = builder.startSpan();
assertThat(span.getSpanContext().getTraceId()).isEqualTo(TraceId.fromLongs(0, 1));
}
}

View File

@ -13,8 +13,7 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.api.incubator.events.EventLogger;
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider;
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsUtil;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.internal.DaemonThreadFactory;
@ -57,14 +56,16 @@ final class JarAnalyzer implements ClassFileTransformer {
private final Set<URI> seenUris = new HashSet<>();
private final BlockingQueue<URL> toProcess = new LinkedBlockingDeque<>();
private JarAnalyzer(OpenTelemetry unused, int jarsPerSecond) {
// TODO(jack-berg): Use OpenTelemetry to obtain EventLogger when event API is stable
EventLogger eventLogger =
GlobalEventLoggerProvider.get()
.eventLoggerBuilder(JmxRuntimeMetricsUtil.getInstrumentationName())
.setInstrumentationVersion(JmxRuntimeMetricsUtil.getInstrumentationVersion())
.build();
Worker worker = new Worker(eventLogger, toProcess, jarsPerSecond);
private JarAnalyzer(OpenTelemetry openTelemetry, int jarsPerSecond) {
ExtendedLogRecordBuilder logRecordBuilder =
(ExtendedLogRecordBuilder)
openTelemetry
.getLogsBridge()
.loggerBuilder(JmxRuntimeMetricsUtil.getInstrumentationName())
.setInstrumentationVersion(JmxRuntimeMetricsUtil.getInstrumentationVersion())
.build()
.logRecordBuilder();
Worker worker = new Worker(logRecordBuilder, toProcess, jarsPerSecond);
Thread workerThread =
new DaemonThreadFactory(JarAnalyzer.class.getSimpleName() + "_WorkerThread")
.newThread(worker);
@ -152,11 +153,12 @@ final class JarAnalyzer implements ClassFileTransformer {
private static final class Worker implements Runnable {
private final EventLogger eventLogger;
private final ExtendedLogRecordBuilder eventLogger;
private final BlockingQueue<URL> toProcess;
private final io.opentelemetry.sdk.internal.RateLimiter rateLimiter;
private Worker(EventLogger eventLogger, BlockingQueue<URL> toProcess, int jarsPerSecond) {
private Worker(
ExtendedLogRecordBuilder eventLogger, BlockingQueue<URL> toProcess, int jarsPerSecond) {
this.eventLogger = eventLogger;
this.toProcess = toProcess;
this.rateLimiter =
@ -166,7 +168,7 @@ final class JarAnalyzer implements ClassFileTransformer {
/**
* Continuously poll the {@link #toProcess} for archive {@link URL}s, and process each wit
* {@link #processUrl(EventLogger, URL)}.
* {@link #processUrl(ExtendedLogRecordBuilder, URL)}.
*/
@Override
public void run() {
@ -200,7 +202,7 @@ final class JarAnalyzer implements ClassFileTransformer {
* Process the {@code archiveUrl}, extracting metadata from it and emitting an event with the
* content.
*/
static void processUrl(EventLogger eventLogger, URL archiveUrl) {
static void processUrl(ExtendedLogRecordBuilder eventLogger, URL archiveUrl) {
JarDetails jarDetails;
try {
jarDetails = JarDetails.forUrl(archiveUrl);
@ -239,6 +241,6 @@ final class JarAnalyzer implements ClassFileTransformer {
builder.put(PACKAGE_CHECKSUM, packageChecksum);
builder.put(PACKAGE_CHECKSUM_ALGORITHM, "SHA1");
eventLogger.builder(EVENT_NAME_INFO).setAttributes(builder.build()).emit();
eventLogger.setEventName(EVENT_NAME_INFO).setAllAttributes(builder.build()).emit();
}
}

View File

@ -12,6 +12,7 @@ import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.sdk.logs.data.LogRecordData;
import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData;
import java.util.List;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
@ -39,10 +40,7 @@ class JarAnalyzerInstallerTest {
.filter(
record ->
"package.info"
.equals(
record
.getAttributes()
.get(AttributeKey.stringKey("event.name"))))
.equals(((ExtendedLogRecordData) record).getEventName()))
.collect(toList()),
(eventList) -> !eventList.isEmpty());

View File

@ -21,8 +21,7 @@ import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.incubator.events.EventBuilder;
import io.opentelemetry.api.incubator.events.EventLogger;
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
import java.io.File;
@ -41,15 +40,14 @@ class JarAnalyzerTest {
@ParameterizedTest
@MethodSource("processUrlArguments")
void processUrl_EmitsEvents(URL archiveUrl, Consumer<AttributesAssert> attributesConsumer) {
EventLogger eventLogger = mock(EventLogger.class);
EventBuilder builder = mock(EventBuilder.class);
when(eventLogger.builder(eq("package.info"))).thenReturn(builder);
when(builder.setAttributes(any())).thenReturn(builder);
ExtendedLogRecordBuilder builder = mock(ExtendedLogRecordBuilder.class);
when(builder.setEventName(eq("package.info"))).thenReturn(builder);
when(builder.setAllAttributes(any())).thenReturn(builder);
JarAnalyzer.processUrl(eventLogger, archiveUrl);
JarAnalyzer.processUrl(builder, archiveUrl);
ArgumentCaptor<Attributes> attributesArgumentCaptor = ArgumentCaptor.forClass(Attributes.class);
verify(builder).setAttributes(attributesArgumentCaptor.capture());
verify(builder).setAllAttributes(attributesArgumentCaptor.capture());
attributesConsumer.accept(assertThat(attributesArgumentCaptor.getValue()));
}

View File

@ -7,19 +7,16 @@ package io.opentelemetry.javaagent.tooling
import io.opentelemetry.api.GlobalOpenTelemetry
import io.opentelemetry.api.OpenTelemetry
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider
import spock.lang.Specification
class OpenTelemetryInstallerTest extends Specification {
void setup() {
GlobalOpenTelemetry.resetForTest()
GlobalEventLoggerProvider.resetForTest()
}
void cleanup() {
GlobalOpenTelemetry.resetForTest()
GlobalEventLoggerProvider.resetForTest()
}
def "should initialize GlobalOpenTelemetry"() {

View File

@ -10,7 +10,6 @@ import static java.util.Collections.singletonMap;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider;
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
@ -33,7 +32,6 @@ class ConfigurationPropertiesSupplierTest {
@AfterAll
static void cleanUp() {
GlobalOpenTelemetry.resetForTest();
GlobalEventLoggerProvider.resetForTest();
}
// regression for https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/6696

View File

@ -8,7 +8,6 @@ package io.opentelemetry.javaagent.tooling.config;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.incubator.events.GlobalEventLoggerProvider;
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
@ -21,7 +20,6 @@ class OtlpProtocolPropertiesSupplierTest {
@AfterEach
void cleanUp() {
GlobalOpenTelemetry.resetForTest();
GlobalEventLoggerProvider.resetForTest();
}
@SetSystemProperty(

50
licenses/licenses.md generated
View File

@ -62,91 +62,91 @@
> - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.46.0`
**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.46.0-alpha`
**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.47.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.46.0`
**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.46.0`
**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.46.0`
**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.46.0`
**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.46.0`
**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.46.0`
**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.46.0-alpha`
**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.47.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.46.0`
**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.46.0`
**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.46.0`
**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.46.0`
**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.46.0`
**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.46.0`
**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.46.0`
**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.46.0`
**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.46.0-alpha`
**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.47.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.46.0`
**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.46.0`
**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**32** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.46.0`
**32** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**33** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.46.0`
**33** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.47.0`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
@ -225,15 +225,15 @@
> - **POM Project URL**: [http://www.jetbrains.org](http://www.jetbrains.org)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.1.0`
**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.1.10`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**52** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.1.0`
**52** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.1.10`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
**53** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.1.0`
**53** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.1.10`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)

View File

@ -72,6 +72,13 @@ val v1_42Deps by configurations.creating {
exclude("io.opentelemetry", "opentelemetry-bom")
exclude("io.opentelemetry", "opentelemetry-bom-alpha")
}
val v1_47Deps by configurations.creating {
isCanBeResolved = true
isCanBeConsumed = false
// exclude the bom added by dependencyManagement
exclude("io.opentelemetry", "opentelemetry-bom")
exclude("io.opentelemetry", "opentelemetry-bom-alpha")
}
// configuration for publishing the shadowed artifact
val v1_10 by configurations.creating {
isCanBeConsumed = true
@ -109,6 +116,10 @@ val v1_42 by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
}
val v1_47 by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
}
dependencies {
latestDeps("io.opentelemetry:opentelemetry-api")
@ -175,6 +186,11 @@ dependencies {
strictly("1.42.0-alpha")
}
}
v1_47Deps("io.opentelemetry:$it") {
version {
strictly("1.47.0-alpha")
}
}
}
}
@ -226,6 +242,10 @@ tasks {
configurations = listOf(v1_42Deps)
archiveClassifier.set("v1_42")
}
val v1_47Shadow by registering(ShadowJar::class) {
configurations = listOf(v1_47Deps)
archiveClassifier.set("v1_47")
}
artifacts {
add(v1_10.name, v1_10Shadow)
@ -237,5 +257,6 @@ tasks {
add(v1_38.name, v1_38Shadow)
add(v1_40.name, v1_40Shadow)
add(v1_42.name, v1_42Shadow)
add(v1_47.name, v1_47Shadow)
}
}

View File

@ -426,6 +426,7 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.37:javaagent")
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent")
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent")
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent")
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent")
include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent")
include(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent")
include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")

View File

@ -42,6 +42,7 @@ import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryData;
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryPointData;
import io.opentelemetry.sdk.metrics.internal.data.ImmutableValueAtQuantile;
import io.opentelemetry.sdk.testing.logs.TestLogRecordData;
import io.opentelemetry.sdk.testing.logs.internal.TestExtendedLogRecordData;
import io.opentelemetry.sdk.testing.trace.TestSpanData;
import io.opentelemetry.sdk.trace.data.EventData;
import io.opentelemetry.sdk.trace.data.LinkData;
@ -96,6 +97,8 @@ public final class AgentTestingExporterAccess {
// opentelemetry-api-1.27:javaagent tests use an older version of opentelemetry-api where Value
// class is missing
private static final boolean canUseValue = classAvailable("io.opentelemetry.api.common.Value");
private static final boolean hasExtendedLogRecordData =
classAvailable("io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData");
static {
try {
@ -416,6 +419,9 @@ public final class AgentTestingExporterAccess {
LogRecord logRecord,
io.opentelemetry.sdk.resources.Resource resource,
InstrumentationScopeInfo instrumentationScopeInfo) {
if (hasExtendedLogRecordData) {
return createExtendedLogData(logRecord, resource, instrumentationScopeInfo);
}
TestLogRecordData.Builder builder =
TestLogRecordData.builder()
.setResource(resource)
@ -438,6 +444,29 @@ public final class AgentTestingExporterAccess {
return builder.build();
}
private static LogRecordData createExtendedLogData(
LogRecord logRecord,
io.opentelemetry.sdk.resources.Resource resource,
InstrumentationScopeInfo instrumentationScopeInfo) {
TestExtendedLogRecordData.Builder builder =
TestExtendedLogRecordData.builder()
.setResource(resource)
.setInstrumentationScopeInfo(instrumentationScopeInfo)
.setTimestamp(logRecord.getTimeUnixNano(), TimeUnit.NANOSECONDS)
.setSpanContext(
SpanContext.create(
bytesToHex(logRecord.getTraceId().toByteArray()),
bytesToHex(logRecord.getSpanId().toByteArray()),
TraceFlags.getDefault(),
TraceState.getDefault()))
.setSeverity(fromProto(logRecord.getSeverityNumber()))
.setSeverityText(logRecord.getSeverityText())
.setAttributes(fromProto(logRecord.getAttributesList()))
.setEventName(logRecord.getEventName())
.setBodyValue(getBodyValue(logRecord.getBody()));
return builder.build();
}
private static Value<?> getBodyValue(AnyValue value) {
switch (value.getValueCase()) {
case STRING_VALUE: