Skip to content

Bridge log body any value #12204

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import static java.util.concurrent.TimeUnit.MILLISECONDS;

import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Value;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
Expand Down Expand Up @@ -173,7 +174,7 @@ void testStringMapMessage() {
testing.waitAndAssertLogRecords(
logRecord ->
logRecord
.hasBody("")
.hasBody((Value<?>) null)
.hasInstrumentationScope(InstrumentationScopeInfo.builder("abc").build())
.hasSeverity(Severity.INFO)
.hasSeverityText("INFO")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_10.metrics.ApplicationMeterFactory;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_10.metrics.ApplicationMeterProvider;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_15.metrics.ApplicationMeterFactory115;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerFactory;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerFactory127;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerProvider;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_4.trace.ApplicationTracerProvider14;
import java.lang.reflect.InvocationTargetException;
Expand All @@ -39,7 +41,8 @@ private ApplicationOpenTelemetry127() {
new ApplicationContextPropagators(agentOpenTelemetry.getPropagators());
applicationMeterProvider =
new ApplicationMeterProvider(getMeterFactory(), agentOpenTelemetry.getMeterProvider());
applicationLoggerProvider = new ApplicationLoggerProvider(agentOpenTelemetry.getLogsBridge());
applicationLoggerProvider =
new ApplicationLoggerProvider(getLoggerFactory(), agentOpenTelemetry.getLogsBridge());
}

@Override
Expand Down Expand Up @@ -105,9 +108,29 @@ private static ApplicationMeterFactory getMeterFactory() {
}

private static ApplicationMeterFactory getMeterFactory(String className) {
return getFactory(className, ApplicationMeterFactory.class);
}

private static ApplicationLoggerFactory getLoggerFactory() {
// this class is defined in opentelemetry-api-1.42
ApplicationLoggerFactory loggerFactory =
getLoggerFactory(
"io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLoggerFactory142");
if (loggerFactory == null) {
loggerFactory = new ApplicationLoggerFactory127();
}

return loggerFactory;
}

private static ApplicationLoggerFactory getLoggerFactory(String className) {
return getFactory(className, ApplicationLoggerFactory.class);
}

private static <T> T getFactory(String className, Class<T> factoryClass) {
try {
Class<?> clazz = Class.forName(className);
return (ApplicationMeterFactory) clazz.getConstructor().newInstance();
return factoryClass.cast(clazz.getConstructor().newInstance());
} catch (ClassNotFoundException
| NoSuchMethodException
| InstantiationException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
import java.time.Instant;
import java.util.concurrent.TimeUnit;

class ApplicationLogRecordBuilder implements LogRecordBuilder {
public class ApplicationLogRecordBuilder implements LogRecordBuilder {

private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder;

ApplicationLogRecordBuilder(io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
protected ApplicationLogRecordBuilder(
io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
this.agentLogRecordBuilder = agentLogRecordBuilder;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
import application.io.opentelemetry.api.logs.LogRecordBuilder;
import application.io.opentelemetry.api.logs.Logger;

class ApplicationLogger implements Logger {
public class ApplicationLogger implements Logger {

private final io.opentelemetry.api.logs.Logger agentLogger;

ApplicationLogger(io.opentelemetry.api.logs.Logger agentLogger) {
protected ApplicationLogger(io.opentelemetry.api.logs.Logger agentLogger) {
this.agentLogger = agentLogger;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@

final class ApplicationLoggerBuilder implements LoggerBuilder {

private final ApplicationLoggerFactory loggerFactory;
private final io.opentelemetry.api.logs.LoggerBuilder agentBuilder;

ApplicationLoggerBuilder(io.opentelemetry.api.logs.LoggerBuilder agentBuilder) {
ApplicationLoggerBuilder(
ApplicationLoggerFactory loggerFactory,
io.opentelemetry.api.logs.LoggerBuilder agentBuilder) {
this.loggerFactory = loggerFactory;
this.agentBuilder = agentBuilder;
}

Expand All @@ -33,6 +37,6 @@ public LoggerBuilder setInstrumentationVersion(String version) {

@Override
public Logger build() {
return new ApplicationLogger(agentBuilder.build());
return loggerFactory.newLogger(agentBuilder.build());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs;

public interface ApplicationLoggerFactory {

ApplicationLogger newLogger(io.opentelemetry.api.logs.Logger agentLogger);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs;

import io.opentelemetry.api.logs.Logger;

public class ApplicationLoggerFactory127 implements ApplicationLoggerFactory {

@Override
public ApplicationLogger newLogger(Logger agentLogger) {
return new ApplicationLogger(agentLogger);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,19 @@
@SuppressWarnings("UnnecessarilyFullyQualified")
public class ApplicationLoggerProvider implements LoggerProvider {

private final ApplicationLoggerFactory loggerFactory;
private final io.opentelemetry.api.logs.LoggerProvider agentLoggerProvider;

public ApplicationLoggerProvider(io.opentelemetry.api.logs.LoggerProvider agentLoggerProvider) {
public ApplicationLoggerProvider(
ApplicationLoggerFactory loggerFactory,
io.opentelemetry.api.logs.LoggerProvider agentLoggerProvider) {
this.loggerFactory = loggerFactory;
this.agentLoggerProvider = agentLoggerProvider;
}

@Override
public LoggerBuilder loggerBuilder(String instrumentationName) {
return new ApplicationLoggerBuilder(agentLoggerProvider.loggerBuilder(instrumentationName));
return new ApplicationLoggerBuilder(
loggerFactory, agentLoggerProvider.loggerBuilder(instrumentationName));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
plugins {
id("otel.javaagent-instrumentation")
}

dependencies {
compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "v1_42"))
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"))
}

configurations.configureEach {
if (name.endsWith("testRuntimeClasspath", true) || name.endsWith("testCompileClasspath", true)) {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-api:1.42.0")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42;

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;

@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.42");
}

@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}

@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42;

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_42.logs.ApplicationLoggerFactory142;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;

public class OpenTelemetryInstrumentation implements TypeInstrumentation {

@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return named("application.io.opentelemetry.api.GlobalOpenTelemetry");
}

@Override
public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod(
none(), OpenTelemetryInstrumentation.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 ApplicationLoggerFactory142 is recognized
// as helper class and injected into class loader
ApplicationLoggerFactory142.class.getName();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.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());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs;

import application.io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger;

class ApplicationLogger142 extends ApplicationLogger {

private final io.opentelemetry.api.logs.Logger agentLogger;

ApplicationLogger142(io.opentelemetry.api.logs.Logger agentLogger) {
super(agentLogger);
this.agentLogger = agentLogger;
}

@Override
public LogRecordBuilder logRecordBuilder() {
return new ApplicationLogRecordBuilder142(agentLogger.logRecordBuilder());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.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;

public class ApplicationLoggerFactory142 implements ApplicationLoggerFactory {

@Override
public ApplicationLogger newLogger(Logger agentLogger) {
return new ApplicationLogger142(agentLogger);
}
}
Loading
Loading