Upgrade to otel java 1.19.0 (#6757)
Working PR to capture all the changes required to update to otel java 1.19.0. The new log API force allows `:instrumentation-appender-api-internal` and `:instrumentation-appender-sdk-internal`, but necessitates a decent amount of refactoring as a result. The PR points at the `1.19.0-SNAPSHOT`, which I'll update upon publication. Co-authored-by: Mateusz Rzeszutek <mrzeszutek@splunk.com> Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com> Co-authored-by: Lauri Tulmin <ltulmin@splunk.com>
This commit is contained in:
parent
c5cd8d67a3
commit
aeac361816
|
@ -8,7 +8,6 @@ dependencies {
|
||||||
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")
|
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api")
|
||||||
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv")
|
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv")
|
||||||
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")
|
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")
|
||||||
add("muzzleBootstrap", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal")
|
|
||||||
add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
|
add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
|
||||||
add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
|
add("muzzleTooling", "io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
|
||||||
|
|
||||||
|
|
|
@ -383,7 +383,6 @@ configurations.configureEach {
|
||||||
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv")).using(project(":instrumentation-api-semconv"))
|
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv")).using(project(":instrumentation-api-semconv"))
|
||||||
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations")).using(project(":instrumentation-annotations"))
|
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations")).using(project(":instrumentation-annotations"))
|
||||||
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")).using(project(":instrumentation-annotations-support"))
|
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations-support")).using(project(":instrumentation-annotations-support"))
|
||||||
substitute(module("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal")).using(project(":instrumentation-appender-api-internal"))
|
|
||||||
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap")).using(project(":javaagent-bootstrap"))
|
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap")).using(project(":javaagent-bootstrap"))
|
||||||
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")).using(project(":javaagent-extension-api"))
|
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")).using(project(":javaagent-extension-api"))
|
||||||
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")).using(project(":javaagent-tooling"))
|
substitute(module("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")).using(project(":javaagent-tooling"))
|
||||||
|
|
|
@ -12,7 +12,7 @@ val dependencyVersions = hashMapOf<String, String>()
|
||||||
rootProject.extra["versions"] = dependencyVersions
|
rootProject.extra["versions"] = dependencyVersions
|
||||||
|
|
||||||
// this line is managed by .github/scripts/update-sdk-version.sh
|
// this line is managed by .github/scripts/update-sdk-version.sh
|
||||||
val otelVersion = "1.18.0"
|
val otelVersion = "1.19.0"
|
||||||
|
|
||||||
rootProject.extra["otelVersion"] = otelVersion
|
rootProject.extra["otelVersion"] = otelVersion
|
||||||
|
|
||||||
|
|
|
@ -38,9 +38,6 @@ The bootstrap class loader contains several modules:
|
||||||
* **The `instrumentation-annotations-support` module**:
|
* **The `instrumentation-annotations-support` module**:
|
||||||
it contains classes that provide support for annotation-based auto-instrumentation, e.g.
|
it contains classes that provide support for annotation-based auto-instrumentation, e.g.
|
||||||
the `@WithSpan` annotation. This module is internal and its APIs are considered unstable.
|
the `@WithSpan` annotation. This module is internal and its APIs are considered unstable.
|
||||||
* **The `instrumentation-appender-api-internal` module**:
|
|
||||||
it contains classes that constitute the "appender API", used by logging instrumentations. This
|
|
||||||
module is internal and its APIs are considered unstable.
|
|
||||||
* **The `io.opentelemetry.javaagent.bootstrap` package from the `javaagent-extension-api` module**:
|
* **The `io.opentelemetry.javaagent.bootstrap` package from the `javaagent-extension-api` module**:
|
||||||
this package contains several instrumentation utilities that are only usable when an application
|
this package contains several instrumentation utilities that are only usable when an application
|
||||||
is instrumented with the javaagent; for example, the `Java8BytecodeBridge` that should be used
|
is instrumented with the javaagent; for example, the `Java8BytecodeBridge` that should be used
|
||||||
|
|
|
@ -74,6 +74,7 @@ tasks {
|
||||||
dependencies {
|
dependencies {
|
||||||
exclude("org.slf4j:slf4j-api")
|
exclude("org.slf4j:slf4j-api")
|
||||||
exclude("io.opentelemetry:opentelemetry-api")
|
exclude("io.opentelemetry:opentelemetry-api")
|
||||||
|
exclude("io.opentelemetry:opentelemetry-api-logs")
|
||||||
exclude("io.opentelemetry:opentelemetry-context")
|
exclude("io.opentelemetry:opentelemetry-context")
|
||||||
exclude("io.opentelemetry:opentelemetry-semconv")
|
exclude("io.opentelemetry:opentelemetry-semconv")
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,7 @@ tasks {
|
||||||
dependencies {
|
dependencies {
|
||||||
exclude("org.slf4j:slf4j-api")
|
exclude("org.slf4j:slf4j-api")
|
||||||
exclude("io.opentelemetry:opentelemetry-api")
|
exclude("io.opentelemetry:opentelemetry-api")
|
||||||
|
exclude("io.opentelemetry:opentelemetry-api-logs")
|
||||||
exclude("io.opentelemetry:opentelemetry-context")
|
exclude("io.opentelemetry:opentelemetry-context")
|
||||||
exclude("io.opentelemetry:opentelemetry-semconv")
|
exclude("io.opentelemetry:opentelemetry-semconv")
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ final class MetricsView {
|
||||||
// the list of rpc server metrics attributes is from
|
// the list of rpc server metrics attributes is from
|
||||||
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/rpc.md#attributes
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/rpc.md#attributes
|
||||||
Set<AttributeKey> view = new HashSet<>(alwaysInclude);
|
Set<AttributeKey> view = new HashSet<>(alwaysInclude);
|
||||||
view.add(SemanticAttributes.NET_HOST_IP);
|
view.add(SemanticAttributes.NET_SOCK_HOST_ADDR);
|
||||||
view.add(SemanticAttributes.NET_TRANSPORT);
|
view.add(SemanticAttributes.NET_TRANSPORT);
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,14 +41,14 @@ class RpcServerMetricsTest {
|
||||||
Attributes responseAttributes1 =
|
Attributes responseAttributes1 =
|
||||||
Attributes.builder()
|
Attributes.builder()
|
||||||
.put(SemanticAttributes.NET_HOST_NAME, "example.com")
|
.put(SemanticAttributes.NET_HOST_NAME, "example.com")
|
||||||
.put(SemanticAttributes.NET_HOST_IP, "127.0.0.1")
|
.put(SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1")
|
||||||
.put(SemanticAttributes.NET_HOST_PORT, 8080)
|
.put(SemanticAttributes.NET_HOST_PORT, 8080)
|
||||||
.put(SemanticAttributes.NET_TRANSPORT, "ip_tcp")
|
.put(SemanticAttributes.NET_TRANSPORT, "ip_tcp")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Attributes responseAttributes2 =
|
Attributes responseAttributes2 =
|
||||||
Attributes.builder()
|
Attributes.builder()
|
||||||
.put(SemanticAttributes.NET_HOST_IP, "127.0.0.1")
|
.put(SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1")
|
||||||
.put(SemanticAttributes.NET_HOST_PORT, 8080)
|
.put(SemanticAttributes.NET_HOST_PORT, 8080)
|
||||||
.put(SemanticAttributes.NET_TRANSPORT, "ip_tcp")
|
.put(SemanticAttributes.NET_TRANSPORT, "ip_tcp")
|
||||||
.build();
|
.build();
|
||||||
|
@ -120,7 +120,8 @@ class RpcServerMetricsTest {
|
||||||
SemanticAttributes.RPC_SERVICE,
|
SemanticAttributes.RPC_SERVICE,
|
||||||
"myservice.EchoService"),
|
"myservice.EchoService"),
|
||||||
equalTo(SemanticAttributes.RPC_METHOD, "exampleMethod"),
|
equalTo(SemanticAttributes.RPC_METHOD, "exampleMethod"),
|
||||||
equalTo(SemanticAttributes.NET_HOST_IP, "127.0.0.1"),
|
equalTo(
|
||||||
|
SemanticAttributes.NET_SOCK_HOST_ADDR, "127.0.0.1"),
|
||||||
equalTo(SemanticAttributes.NET_TRANSPORT, "ip_tcp")))));
|
equalTo(SemanticAttributes.NET_TRANSPORT, "ip_tcp")))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
plugins {
|
|
||||||
id("otel.java-conventions")
|
|
||||||
id("otel.animalsniffer-conventions")
|
|
||||||
id("otel.jacoco-conventions")
|
|
||||||
id("otel.japicmp-conventions")
|
|
||||||
id("otel.publish-conventions")
|
|
||||||
}
|
|
||||||
|
|
||||||
group = "io.opentelemetry.instrumentation"
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api("io.opentelemetry:opentelemetry-api")
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import javax.annotation.concurrent.ThreadSafe;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@link LogEmitter} is the entry point into a log pipeline.
|
|
||||||
*
|
|
||||||
* <p>Obtain a log builder via {@link #logBuilder()}, add properties using the setters, and emit it
|
|
||||||
* via {@link LogRecordBuilder#emit()}.
|
|
||||||
*
|
|
||||||
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
|
|
||||||
* at any time.
|
|
||||||
*/
|
|
||||||
@ThreadSafe
|
|
||||||
public interface LogEmitter {
|
|
||||||
|
|
||||||
/** Return a new {@link LogRecordBuilder} to emit a log. */
|
|
||||||
LogRecordBuilder logBuilder();
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builder class for creating {@link LogEmitter} instances.
|
|
||||||
*
|
|
||||||
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
|
|
||||||
* at any time.
|
|
||||||
*/
|
|
||||||
public interface LogEmitterBuilder {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Assign an OpenTelemetry schema URL to the resulting {@link LogEmitter}.
|
|
||||||
*
|
|
||||||
* @param schemaUrl the URL of the OpenTelemetry schema being used by this instrumentation library
|
|
||||||
* @return this
|
|
||||||
*/
|
|
||||||
LogEmitterBuilder setSchemaUrl(String schemaUrl);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Assign a version to the instrumentation library that is using the resulting {@link LogEmitter}.
|
|
||||||
*
|
|
||||||
* @param instrumentationVersion the version of the instrumentation library
|
|
||||||
* @return this
|
|
||||||
*/
|
|
||||||
LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets or creates a {@link LogEmitter} instance.
|
|
||||||
*
|
|
||||||
* @return a log emitter instance configured with the provided options
|
|
||||||
*/
|
|
||||||
LogEmitter build();
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
|
|
||||||
* any time.
|
|
||||||
*/
|
|
||||||
public interface LogEmitterProvider {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link LogEmitterBuilder} instance.
|
|
||||||
*
|
|
||||||
* @param instrumentationName the name of the instrumentation library
|
|
||||||
* @return a log emitter builder instance
|
|
||||||
*/
|
|
||||||
LogEmitterBuilder logEmitterBuilder(String instrumentationName);
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
|
|
||||||
* any time.
|
|
||||||
*/
|
|
||||||
public final class LogEmitterProviderHolder {
|
|
||||||
|
|
||||||
private final AtomicReference<LogEmitterProvider> instance =
|
|
||||||
new AtomicReference<>(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
|
|
||||||
@Nullable private volatile Throwable setInstanceCaller;
|
|
||||||
|
|
||||||
/** Returns the registered {@link LogEmitterProvider}. */
|
|
||||||
public LogEmitterProvider get() {
|
|
||||||
return instance.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link LogEmitterProvider} that should be the instance. Future calls to {@link #get()}
|
|
||||||
* will return the provided {@link LogEmitterProvider} instance. This should be called once as
|
|
||||||
* early as possible in your application initialization logic, often in a {@code static} block in
|
|
||||||
* your main class. It should only be called once - an attempt to call it a second time will
|
|
||||||
* result in an error. If trying to set the instance {@link LogEmitterProvider} multiple times in
|
|
||||||
* tests, use {@link LogEmitterProviderHolder#resetForTest()} between them.
|
|
||||||
*/
|
|
||||||
public void set(LogEmitterProvider logEmitterProvider) {
|
|
||||||
boolean changed = instance.compareAndSet(NoopLogEmitterProvider.INSTANCE, logEmitterProvider);
|
|
||||||
if (!changed && (logEmitterProvider != NoopLogEmitterProvider.INSTANCE)) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"LogEmitterProviderHolder.set has already been called. LogEmitterProviderHolder.set "
|
|
||||||
+ "must be called only once before any calls to LogEmitterProviderHolder.get. "
|
|
||||||
+ "Previous invocation set to cause of this exception.",
|
|
||||||
setInstanceCaller);
|
|
||||||
}
|
|
||||||
setInstanceCaller = new Throwable();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsets the {@link LogEmitterProvider}. This is only meant to be used from tests which need to
|
|
||||||
* reconfigure {@link LogEmitterProvider}.
|
|
||||||
*/
|
|
||||||
public void resetForTest() {
|
|
||||||
instance.set(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import io.opentelemetry.api.common.Attributes;
|
|
||||||
import io.opentelemetry.context.Context;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to construct and emit logs from a {@link LogEmitter}.
|
|
||||||
*
|
|
||||||
* <p>Obtain a {@link LogRecordBuilder} via {@link LogEmitter#logBuilder()}, add properties using
|
|
||||||
* the setters, and emit the log by calling {@link #emit()}.
|
|
||||||
*
|
|
||||||
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
|
|
||||||
* at any time.
|
|
||||||
*/
|
|
||||||
public interface LogRecordBuilder {
|
|
||||||
|
|
||||||
/** Set the epoch timestamp using the timestamp and unit. */
|
|
||||||
LogRecordBuilder setEpoch(long timestamp, TimeUnit unit);
|
|
||||||
|
|
||||||
/** Set the epoch timestamp using the instant. */
|
|
||||||
LogRecordBuilder setEpoch(Instant instant);
|
|
||||||
|
|
||||||
/** Set the context. */
|
|
||||||
LogRecordBuilder setContext(Context context);
|
|
||||||
|
|
||||||
/** Set the severity. */
|
|
||||||
LogRecordBuilder setSeverity(Severity severity);
|
|
||||||
|
|
||||||
/** Set the severity text. */
|
|
||||||
LogRecordBuilder setSeverityText(String severityText);
|
|
||||||
|
|
||||||
/** Set the body string. */
|
|
||||||
LogRecordBuilder setBody(String body);
|
|
||||||
|
|
||||||
/** Set the attributes. */
|
|
||||||
LogRecordBuilder setAllAttributes(Attributes attributes);
|
|
||||||
|
|
||||||
/** Emit the log. */
|
|
||||||
void emit();
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
final class NoopLogEmitter implements LogEmitter {
|
|
||||||
|
|
||||||
static final LogEmitter INSTANCE = new NoopLogEmitter();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogRecordBuilder logBuilder() {
|
|
||||||
return NoopLogRecordBuilder.INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
|
||||||
|
|
||||||
final class NoopLogEmitterBuilder implements LogEmitterBuilder {
|
|
||||||
|
|
||||||
static final LogEmitterBuilder INSTANCE = new NoopLogEmitterBuilder();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogEmitterBuilder setSchemaUrl(String schemaUrl) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogEmitter build() {
|
|
||||||
return NoopLogEmitter.INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
final class NoopLogEmitterProvider implements LogEmitterProvider {
|
|
||||||
|
|
||||||
static final NoopLogEmitterProvider INSTANCE = new NoopLogEmitterProvider();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogEmitterBuilder logEmitterBuilder(String instrumentationName) {
|
|
||||||
return NoopLogEmitterBuilder.INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
|
||||||
import io.opentelemetry.api.common.Attributes;
|
|
||||||
import io.opentelemetry.context.Context;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
final class NoopLogRecordBuilder implements LogRecordBuilder {
|
|
||||||
|
|
||||||
static final LogRecordBuilder INSTANCE = new NoopLogRecordBuilder();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setEpoch(long timestamp, TimeUnit unit) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setEpoch(Instant instant) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setContext(Context context) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setSeverity(Severity severity) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setSeverityText(String severityText) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setBody(String body) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setAllAttributes(Attributes attributes) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void emit() {}
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
|
|
||||||
* any time.
|
|
||||||
*/
|
|
||||||
public enum Severity {
|
|
||||||
UNDEFINED_SEVERITY_NUMBER(0),
|
|
||||||
TRACE(1),
|
|
||||||
TRACE2(2),
|
|
||||||
TRACE3(3),
|
|
||||||
TRACE4(4),
|
|
||||||
DEBUG(5),
|
|
||||||
DEBUG2(6),
|
|
||||||
DEBUG3(7),
|
|
||||||
DEBUG4(8),
|
|
||||||
INFO(9),
|
|
||||||
INFO2(10),
|
|
||||||
INFO3(11),
|
|
||||||
INFO4(12),
|
|
||||||
WARN(13),
|
|
||||||
WARN2(14),
|
|
||||||
WARN3(15),
|
|
||||||
WARN4(16),
|
|
||||||
ERROR(17),
|
|
||||||
ERROR2(18),
|
|
||||||
ERROR3(19),
|
|
||||||
ERROR4(20),
|
|
||||||
FATAL(21),
|
|
||||||
FATAL2(22),
|
|
||||||
FATAL3(23),
|
|
||||||
FATAL4(24);
|
|
||||||
|
|
||||||
private final int severityNumber;
|
|
||||||
|
|
||||||
Severity(int severityNumber) {
|
|
||||||
this.severityNumber = severityNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSeverityNumber() {
|
|
||||||
return severityNumber;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.appender.internal;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
class LogEmitterProviderHolderTest {
|
|
||||||
|
|
||||||
private static final LogEmitterProviderHolder holder = new LogEmitterProviderHolder();
|
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
static void beforeClass() {
|
|
||||||
holder.resetForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterEach
|
|
||||||
void after() {
|
|
||||||
holder.resetForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGlobalBeforeSet() {
|
|
||||||
assertThat(holder.get()).isSameAs(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void setThenSet() {
|
|
||||||
setLogEmitterProvider();
|
|
||||||
assertThatThrownBy(() -> holder.set(mock(LogEmitterProvider.class)))
|
|
||||||
.isInstanceOf(IllegalStateException.class)
|
|
||||||
.hasMessageContaining("LogEmitterProviderHolder.set has already been called")
|
|
||||||
.hasStackTraceContaining("setLogEmitterProvider");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void getThenSet() {
|
|
||||||
LogEmitterProvider existingProvider = holder.get();
|
|
||||||
assertSame(existingProvider, NoopLogEmitterProvider.INSTANCE);
|
|
||||||
LogEmitterProvider newProvider = mock(LogEmitterProvider.class);
|
|
||||||
holder.set(newProvider);
|
|
||||||
assertSame(newProvider, holder.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void okToSetNoopMultipleTimes() {
|
|
||||||
holder.set(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
holder.set(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
holder.set(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
holder.set(NoopLogEmitterProvider.INSTANCE);
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setLogEmitterProvider() {
|
|
||||||
holder.set(mock(LogEmitterProvider.class));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
plugins {
|
|
||||||
id("otel.java-conventions")
|
|
||||||
id("otel.animalsniffer-conventions")
|
|
||||||
id("otel.jacoco-conventions")
|
|
||||||
id("otel.japicmp-conventions")
|
|
||||||
id("otel.publish-conventions")
|
|
||||||
}
|
|
||||||
|
|
||||||
group = "io.opentelemetry.instrumentation"
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api(project(":instrumentation-appender-api-internal"))
|
|
||||||
|
|
||||||
api("io.opentelemetry:opentelemetry-sdk-logs")
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.sdk.appender.internal;
|
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
|
|
||||||
final class DelegatingLogEmitter implements LogEmitter {
|
|
||||||
|
|
||||||
private final io.opentelemetry.sdk.logs.LogEmitter delegate;
|
|
||||||
|
|
||||||
DelegatingLogEmitter(io.opentelemetry.sdk.logs.LogEmitter delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogRecordBuilder logBuilder() {
|
|
||||||
return new DelegatingLogRecordBuilder(delegate.logRecordBuilder());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.sdk.appender.internal;
|
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitter;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder;
|
|
||||||
|
|
||||||
final class DelegatingLogEmitterBuilder implements LogEmitterBuilder {
|
|
||||||
|
|
||||||
private final io.opentelemetry.sdk.logs.LogEmitterBuilder delegate;
|
|
||||||
|
|
||||||
DelegatingLogEmitterBuilder(io.opentelemetry.sdk.logs.LogEmitterBuilder delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogEmitterBuilder setSchemaUrl(String schemaUrl) {
|
|
||||||
delegate.setSchemaUrl(schemaUrl);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogEmitterBuilder setInstrumentationVersion(String instrumentationVersion) {
|
|
||||||
delegate.setInstrumentationVersion(instrumentationVersion);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogEmitter build() {
|
|
||||||
return new DelegatingLogEmitter(delegate.build());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.sdk.appender.internal;
|
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
|
|
||||||
* any time.
|
|
||||||
*/
|
|
||||||
public final class DelegatingLogEmitterProvider implements LogEmitterProvider {
|
|
||||||
|
|
||||||
private final SdkLogEmitterProvider delegate;
|
|
||||||
|
|
||||||
public static DelegatingLogEmitterProvider from(SdkLogEmitterProvider delegate) {
|
|
||||||
return new DelegatingLogEmitterProvider(delegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DelegatingLogEmitterProvider(SdkLogEmitterProvider delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LogEmitterBuilder logEmitterBuilder(String instrumentationName) {
|
|
||||||
return new DelegatingLogEmitterBuilder(delegate.logEmitterBuilder(instrumentationName));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.sdk.appender.internal;
|
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
|
||||||
import io.opentelemetry.api.common.Attributes;
|
|
||||||
import io.opentelemetry.context.Context;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
final class DelegatingLogRecordBuilder implements LogRecordBuilder {
|
|
||||||
|
|
||||||
private final io.opentelemetry.sdk.logs.LogRecordBuilder delegate;
|
|
||||||
|
|
||||||
DelegatingLogRecordBuilder(io.opentelemetry.sdk.logs.LogRecordBuilder delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setEpoch(long timestamp, TimeUnit unit) {
|
|
||||||
delegate.setEpoch(timestamp, unit);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setEpoch(Instant instant) {
|
|
||||||
delegate.setEpoch(instant);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setContext(Context context) {
|
|
||||||
delegate.setContext(context);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setSeverity(Severity severity) {
|
|
||||||
delegate.setSeverity(io.opentelemetry.sdk.logs.data.Severity.valueOf(severity.name()));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setSeverityText(String severityText) {
|
|
||||||
delegate.setSeverityText(severityText);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setBody(String body) {
|
|
||||||
delegate.setBody(body);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public LogRecordBuilder setAllAttributes(Attributes attributes) {
|
|
||||||
delegate.setAllAttributes(attributes);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void emit() {
|
|
||||||
delegate.emit();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ plugins {
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly(project(":instrumentation:java-util-logging:shaded-stub-for-instrumenting"))
|
compileOnly(project(":instrumentation:java-util-logging:shaded-stub-for-instrumenting"))
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
// ensure no cross interference
|
// ensure no cross interference
|
||||||
|
|
|
@ -8,10 +8,10 @@ package io.opentelemetry.javaagent.instrumentation.jul;
|
||||||
import application.java.util.logging.Logger;
|
import application.java.util.logging.Logger;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -41,7 +41,7 @@ public final class JavaUtilLoggingHelper {
|
||||||
instrumentationName = "ROOT";
|
instrumentationName = "ROOT";
|
||||||
}
|
}
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder();
|
GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
mapLogRecord(builder, logRecord);
|
mapLogRecord(builder, logRecord);
|
||||||
builder.emit();
|
builder.emit();
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ public final class JavaUtilLoggingHelper {
|
||||||
Throwable throwable = logRecord.getThrown();
|
Throwable throwable = logRecord.getThrown();
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
// TODO (trask) extract method for recording exception into
|
// TODO (trask) extract method for recording exception into
|
||||||
// instrumentation-appender-api-internal
|
// io.opentelemetry:opentelemetry-api-logs
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
|
|
|
@ -13,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import application.java.util.logging.Logger;
|
import application.java.util.logging.Logger;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
@ -50,7 +50,7 @@ class JavaUtilLoggingInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
||||||
// need to track call depth across all loggers in order to avoid double capture when one
|
// need to track call depth across all loggers in order to avoid double capture when one
|
||||||
// logging framework delegates to another
|
// logging framework delegates to another
|
||||||
callDepth = CallDepth.forClass(LogEmitterProvider.class);
|
callDepth = CallDepth.forClass(LoggerProvider.class);
|
||||||
if (callDepth.getAndIncrement() == 0) {
|
if (callDepth.getAndIncrement() == 0) {
|
||||||
JavaUtilLoggingHelper.capture(logger, logRecord);
|
JavaUtilLoggingHelper.capture(logger, logRecord);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
||||||
import io.opentelemetry.sdk.logs.data.Severity
|
import io.opentelemetry.api.logs.Severity
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
||||||
import spock.lang.Unroll
|
import spock.lang.Unroll
|
||||||
|
|
||||||
|
@ -50,9 +50,9 @@ class JavaUtilLoggingTest extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
if (testArgs == "params") {
|
if (testArgs == "params") {
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
||||||
} else {
|
} else {
|
||||||
|
@ -81,7 +81,7 @@ class JavaUtilLoggingTest extends AgentInstrumentationSpecification {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
||||||
logs.size() == 0
|
logRecords.size() == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
where:
|
where:
|
||||||
|
|
|
@ -14,7 +14,7 @@ muzzle {
|
||||||
dependencies {
|
dependencies {
|
||||||
library("org.jboss.logmanager:jboss-logmanager:1.1.0.GA")
|
library("org.jboss.logmanager:jboss-logmanager:1.1.0.GA")
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
// ensure no cross interference
|
// ensure no cross interference
|
||||||
|
|
|
@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
@ -47,7 +47,7 @@ public class JbossLogmanagerInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
||||||
// need to track call depth across all loggers in order to avoid double capture when one
|
// need to track call depth across all loggers in order to avoid double capture when one
|
||||||
// logging framework delegates to another
|
// logging framework delegates to another
|
||||||
callDepth = CallDepth.forClass(LogEmitterProvider.class);
|
callDepth = CallDepth.forClass(LoggerProvider.class);
|
||||||
if (callDepth.getAndIncrement() == 0) {
|
if (callDepth.getAndIncrement() == 0) {
|
||||||
LoggingEventMapper.INSTANCE.capture(logger, record);
|
LoggingEventMapper.INSTANCE.capture(logger, record);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,11 @@ import static java.util.Collections.emptyList;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -58,7 +58,7 @@ public final class LoggingEventMapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder();
|
GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
|
|
||||||
String message = record.getFormattedMessage();
|
String message = record.getFormattedMessage();
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
|
@ -76,7 +76,7 @@ public final class LoggingEventMapper {
|
||||||
Throwable throwable = record.getThrown();
|
Throwable throwable = record.getThrown();
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
// TODO (trask) extract method for recording exception into
|
// TODO (trask) extract method for recording exception into
|
||||||
// instrumentation-appender-api-internal
|
// io.opentelemetry:opentelemetry-api-logs
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey
|
import io.opentelemetry.api.common.AttributeKey
|
||||||
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
||||||
import io.opentelemetry.sdk.logs.data.Severity
|
import io.opentelemetry.api.logs.Severity
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
||||||
import org.jboss.logmanager.MDC
|
import org.jboss.logmanager.MDC
|
||||||
import org.jboss.logmanager.Level
|
import org.jboss.logmanager.Level
|
||||||
|
@ -50,9 +50,9 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(severity)
|
assertThat(log.getSeverity()).isEqualTo(severity)
|
||||||
|
@ -77,7 +77,7 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
||||||
assertThat(logs.size() == 0).isTrue()
|
assertThat(logRecords.size() == 0).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
where:
|
where:
|
||||||
|
@ -113,9 +113,9 @@ class JbossLogmanagerTest extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
|
|
@ -9,8 +9,9 @@ import io.opentelemetry.context.Context
|
||||||
import io.opentelemetry.extension.kotlin.asContextElement
|
import io.opentelemetry.extension.kotlin.asContextElement
|
||||||
import io.opentelemetry.instrumentation.reactor.ContextPropagationOperator
|
import io.opentelemetry.instrumentation.reactor.ContextPropagationOperator
|
||||||
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension
|
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension
|
||||||
|
import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName
|
||||||
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat
|
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat
|
||||||
import io.opentelemetry.sdk.trace.data.SpanData
|
import io.opentelemetry.sdk.testing.assertj.TraceAssert
|
||||||
import kotlinx.coroutines.CompletableDeferred
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
import kotlinx.coroutines.CoroutineDispatcher
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
@ -48,7 +49,6 @@ import org.junit.jupiter.params.provider.Arguments
|
||||||
import org.junit.jupiter.params.provider.Arguments.arguments
|
import org.junit.jupiter.params.provider.Arguments.arguments
|
||||||
import org.junit.jupiter.params.provider.ArgumentsProvider
|
import org.junit.jupiter.params.provider.ArgumentsProvider
|
||||||
import org.junit.jupiter.params.provider.ArgumentsSource
|
import org.junit.jupiter.params.provider.ArgumentsSource
|
||||||
import java.time.Duration
|
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
@ -69,7 +69,8 @@ class KotlinCoroutinesInstrumentationTest {
|
||||||
singleThread.shutdown()
|
singleThread.shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
@RegisterExtension val testing = AgentInstrumentationExtension.create()
|
@RegisterExtension
|
||||||
|
val testing = AgentInstrumentationExtension.create()
|
||||||
|
|
||||||
val tracer = testing.openTelemetry.getTracer("test")
|
val tracer = testing.openTelemetry.getTracer("test")
|
||||||
|
|
||||||
|
@ -325,42 +326,40 @@ class KotlinCoroutinesInstrumentationTest {
|
||||||
// should have the same iteration number (attribute "iter").
|
// should have the same iteration number (attribute "iter").
|
||||||
// The traces are in some random order, so let's keep track and make sure we see
|
// The traces are in some random order, so let's keep track and make sure we see
|
||||||
// each iteration # exactly once
|
// each iteration # exactly once
|
||||||
val assertions = mutableListOf<Consumer<List<SpanData>>>()
|
val assertions = mutableListOf<Consumer<TraceAssert>>()
|
||||||
for (i in 0 until numIters) {
|
for (i in 0 until numIters) {
|
||||||
assertions.add { trace ->
|
assertions.add { trace ->
|
||||||
assertThat(trace).satisfiesExactly(
|
trace.hasSpansSatisfyingExactly(
|
||||||
Consumer {
|
{
|
||||||
assertThat(it)
|
it.hasName("a")
|
||||||
.hasName("a")
|
|
||||||
.hasNoParent()
|
.hasNoParent()
|
||||||
},
|
},
|
||||||
Consumer {
|
{
|
||||||
assertThat(it)
|
it.hasName("a2")
|
||||||
.hasName("a2")
|
.hasParent(trace.getSpan(0))
|
||||||
.hasParent(trace.get(0))
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
for (i in 0 until numIters) {
|
||||||
assertions.add { trace ->
|
assertions.add { trace ->
|
||||||
assertThat(trace).satisfiesExactly(
|
trace.hasSpansSatisfyingExactly(
|
||||||
Consumer {
|
{
|
||||||
assertThat(it)
|
it.hasName("b")
|
||||||
.hasName("b")
|
|
||||||
.hasNoParent()
|
.hasNoParent()
|
||||||
},
|
},
|
||||||
Consumer {
|
{
|
||||||
assertThat(it)
|
it.hasName("b2")
|
||||||
.hasName("b2")
|
.hasParent(trace.getSpan(0))
|
||||||
.hasParent(trace.get(0))
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await().atMost(Duration.ofSeconds(30)).untilAsserted {
|
testing.waitAndAssertSortedTraces(
|
||||||
val traces = testing.waitForTraces(assertions.size)
|
orderByRootSpanName("a", "b"),
|
||||||
assertThat(traces).satisfiesExactlyInAnyOrder(*assertions.toTypedArray())
|
*assertions.toTypedArray()
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
|
|
|
@ -16,7 +16,7 @@ dependencies {
|
||||||
// 1.2 introduces MDC and there's no version earlier than 1.2.4 available
|
// 1.2 introduces MDC and there's no version earlier than 1.2.4 available
|
||||||
library("log4j:log4j:1.2.4")
|
library("log4j:log4j:1.2.4")
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
testImplementation("org.awaitility:awaitility")
|
testImplementation("org.awaitility:awaitility")
|
||||||
|
|
|
@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
@ -54,7 +54,7 @@ class Log4jAppenderInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
||||||
// need to track call depth across all loggers to avoid double capture when one logging
|
// need to track call depth across all loggers to avoid double capture when one logging
|
||||||
// framework delegates to another
|
// framework delegates to another
|
||||||
callDepth = CallDepth.forClass(LogEmitterProvider.class);
|
callDepth = CallDepth.forClass(LoggerProvider.class);
|
||||||
if (callDepth.getAndIncrement() == 0) {
|
if (callDepth.getAndIncrement() == 0) {
|
||||||
LogEventMapper.INSTANCE.capture(logger, level, message, t);
|
LogEventMapper.INSTANCE.capture(logger, level, message, t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,11 @@ import static java.util.Collections.emptyList;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -64,7 +64,7 @@ public final class LogEventMapper {
|
||||||
instrumentationName = "ROOT";
|
instrumentationName = "ROOT";
|
||||||
}
|
}
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder();
|
GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
|
|
||||||
// message
|
// message
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
|
@ -82,7 +82,7 @@ public final class LogEventMapper {
|
||||||
// throwable
|
// throwable
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
// TODO (trask) extract method for recording exception into
|
// TODO (trask) extract method for recording exception into
|
||||||
// instrumentation-appender-api-internal
|
// io.opentelemetry:opentelemetry-api-logs
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey
|
import io.opentelemetry.api.common.AttributeKey
|
||||||
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
||||||
import io.opentelemetry.sdk.logs.data.Severity
|
import io.opentelemetry.api.logs.Severity
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
||||||
import org.apache.log4j.Logger
|
import org.apache.log4j.Logger
|
||||||
import org.apache.log4j.MDC
|
import org.apache.log4j.MDC
|
||||||
|
@ -55,9 +55,9 @@ class Log4j1Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(severity)
|
assertThat(log.getSeverity()).isEqualTo(severity)
|
||||||
|
@ -82,7 +82,7 @@ class Log4j1Test extends AgentInstrumentationSpecification {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
||||||
logs.size() == 0
|
logRecords.size() == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
where:
|
where:
|
||||||
|
@ -118,9 +118,9 @@ class Log4j1Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
assertThat(log.getBody().asString()).isEqualTo("xyz")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
|
|
@ -14,7 +14,7 @@ muzzle {
|
||||||
dependencies {
|
dependencies {
|
||||||
library("org.apache.logging.log4j:log4j-core:2.17.0")
|
library("org.apache.logging.log4j:log4j-core:2.17.0")
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
implementation(project(":instrumentation:log4j:log4j-appender-2.17:library"))
|
implementation(project(":instrumentation:log4j:log4j-appender-2.17:library"))
|
||||||
|
|
|
@ -14,7 +14,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
@ -67,7 +67,7 @@ class Log4jAppenderInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
||||||
// need to track call depth across all loggers in order to avoid double capture when one
|
// need to track call depth across all loggers in order to avoid double capture when one
|
||||||
// logging framework delegates to another
|
// logging framework delegates to another
|
||||||
callDepth = CallDepth.forClass(LogEmitterProvider.class);
|
callDepth = CallDepth.forClass(LoggerProvider.class);
|
||||||
if (callDepth.getAndIncrement() == 0) {
|
if (callDepth.getAndIncrement() == 0) {
|
||||||
Log4jHelper.capture(logger, level, marker, message, t);
|
Log4jHelper.capture(logger, level, marker, message, t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,10 @@ package io.opentelemetry.javaagent.instrumentation.log4j.appender.v2_17;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
|
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
|
||||||
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
|
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -59,7 +59,7 @@ public final class Log4jHelper {
|
||||||
instrumentationName = "ROOT";
|
instrumentationName = "ROOT";
|
||||||
}
|
}
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
AgentLogEmitterProvider.get().logEmitterBuilder(instrumentationName).build().logBuilder();
|
GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
Map<String, String> contextData = ThreadContext.getImmutableContext();
|
Map<String, String> contextData = ThreadContext.getImmutableContext();
|
||||||
mapper.mapLogEvent(builder, message, level, marker, throwable, contextData);
|
mapper.mapLogEvent(builder, message, level, marker, throwable, contextData);
|
||||||
builder.emit();
|
builder.emit();
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
|
||||||
import io.opentelemetry.sdk.logs.data.Severity
|
import io.opentelemetry.api.logs.Severity
|
||||||
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions
|
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
|
@ -50,9 +50,9 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(severity)
|
assertThat(log.getSeverity()).isEqualTo(severity)
|
||||||
|
@ -77,7 +77,7 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
Thread.sleep(500) // sleep a bit just to make sure no log is captured
|
||||||
logs.size() == 0
|
logRecords.size() == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
where:
|
where:
|
||||||
|
@ -112,9 +112,9 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
assertThat(log.getBody().asString()).isEqualTo("xyz: 123")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
@ -138,9 +138,9 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEmpty()
|
assertThat(log.getBody().asString()).isEmpty()
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
@ -164,9 +164,9 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("val2")
|
assertThat(log.getBody().asString()).isEqualTo("val2")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
@ -189,9 +189,9 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
})
|
})
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
assertThat(log.getBody().asString()).isEqualTo("a message")
|
assertThat(log.getBody().asString()).isEqualTo("a message")
|
||||||
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
assertThat(log.getInstrumentationScopeInfo().getName()).isEqualTo("abc")
|
||||||
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
assertThat(log.getSeverity()).isEqualTo(Severity.INFO)
|
||||||
|
@ -215,8 +215,8 @@ class Log4j2Test extends AgentInstrumentationSpecification {
|
||||||
await()
|
await()
|
||||||
.untilAsserted(
|
.untilAsserted(
|
||||||
() -> {
|
() -> {
|
||||||
assertThat(logs).hasSize(1)
|
assertThat(logRecords).hasSize(1)
|
||||||
def log = logs.get(0)
|
def log = logRecords.get(0)
|
||||||
OpenTelemetryAssertions.assertThat(log.getAttributes()).containsEntry("log4j.marker", markerName)
|
OpenTelemetryAssertions.assertThat(log.getAttributes()).containsEntry("log4j.marker", markerName)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,19 +51,17 @@ The following demonstrates how you might configure the appender in your `log4j.x
|
||||||
</Configuration>
|
</Configuration>
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, associate the `OpenTelemetryAppender` configured via `log4j2.xml` with
|
Next, configure `GlobalLoggerProvider` with an `SdkLoggerProvider` in your application.
|
||||||
an `SdkLogEmitterProvider` in your application:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
SdkLogEmitterProvider logEmitterProvider =
|
SdkLoggerProvider sdkLoggerProvider =
|
||||||
SdkLogEmitterProvider.builder()
|
SdkLoggerProvider.builder()
|
||||||
.setResource(Resource.create(...))
|
.setResource(Resource.create(...))
|
||||||
.addLogProcessor(...)
|
.addLogProcessor(...)
|
||||||
.build();
|
.build();
|
||||||
OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
|
GlobalLoggerProvider.set(sdkLoggerProvider);
|
||||||
```
|
```
|
||||||
|
|
||||||
In this example Log4j2 log events will be sent to both the console appender and
|
In this example Log4j2 log events will be sent to both the console appender and
|
||||||
the `OpenTelemetryAppender`, which will drop the logs until
|
the `OpenTelemetryAppender`, which will drop the logs until `GlobalLoggerProvider.set(..)` is
|
||||||
`OpenTelemetryAppender.setSdkLogEmitterProvider(..)` is called. Once initialized, logs will be
|
called. Once initialized, logs will be emitted to a `Logger` obtained from the `SdkLoggerProvider`.
|
||||||
emitted to a `LogEmitter` obtained from the `SdkLogEmitterProvider`.
|
|
||||||
|
|
|
@ -3,12 +3,10 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":instrumentation-appender-api-internal"))
|
implementation("io.opentelemetry:opentelemetry-api-logs")
|
||||||
implementation(project(":instrumentation-appender-sdk-internal"))
|
|
||||||
|
|
||||||
library("org.apache.logging.log4j:log4j-core:2.17.0")
|
library("org.apache.logging.log4j:log4j-core:2.17.0")
|
||||||
|
|
||||||
testImplementation(project(":instrumentation-appender-sdk-internal"))
|
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
|
testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
|
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,10 @@ package io.opentelemetry.instrumentation.log4j.appender.v2_17;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder;
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
|
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
|
||||||
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
|
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
|
||||||
import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
|
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,9 +41,6 @@ public class OpenTelemetryAppender extends AbstractAppender {
|
||||||
|
|
||||||
static final String PLUGIN_NAME = "OpenTelemetry";
|
static final String PLUGIN_NAME = "OpenTelemetry";
|
||||||
|
|
||||||
private static final LogEmitterProviderHolder logEmitterProviderHolder =
|
|
||||||
new LogEmitterProviderHolder();
|
|
||||||
|
|
||||||
private final LogEventMapper<ReadOnlyStringMap> mapper;
|
private final LogEventMapper<ReadOnlyStringMap> mapper;
|
||||||
|
|
||||||
@PluginBuilderFactory
|
@PluginBuilderFactory
|
||||||
|
@ -147,7 +141,7 @@ public class OpenTelemetryAppender extends AbstractAppender {
|
||||||
instrumentationName = "ROOT";
|
instrumentationName = "ROOT";
|
||||||
}
|
}
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
logEmitterProviderHolder.get().logEmitterBuilder(instrumentationName).build().logBuilder();
|
GlobalLoggerProvider.get().loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
ReadOnlyStringMap contextData = event.getContextData();
|
ReadOnlyStringMap contextData = event.getContextData();
|
||||||
mapper.mapLogEvent(
|
mapper.mapLogEvent(
|
||||||
builder,
|
builder,
|
||||||
|
@ -167,25 +161,6 @@ public class OpenTelemetryAppender extends AbstractAppender {
|
||||||
builder.emit();
|
builder.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This should be called once as early as possible in your application initialization logic, often
|
|
||||||
* in a {@code static} block in your main class. It should only be called once - an attempt to
|
|
||||||
* call it a second time will result in an error. If trying to set the {@link
|
|
||||||
* SdkLogEmitterProvider} multiple times in tests, use {@link
|
|
||||||
* OpenTelemetryAppender#resetSdkLogEmitterProviderForTest()} between them.
|
|
||||||
*/
|
|
||||||
public static void setSdkLogEmitterProvider(SdkLogEmitterProvider sdkLogEmitterProvider) {
|
|
||||||
logEmitterProviderHolder.set(DelegatingLogEmitterProvider.from(sdkLogEmitterProvider));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsets the global {@link LogEmitterProvider}. This is only meant to be used from tests which
|
|
||||||
* need to reconfigure {@link LogEmitterProvider}.
|
|
||||||
*/
|
|
||||||
public static void resetSdkLogEmitterProviderForTest() {
|
|
||||||
logEmitterProviderHolder.resetForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
private enum ContextDataAccessorImpl implements ContextDataAccessor<ReadOnlyStringMap> {
|
private enum ContextDataAccessorImpl implements ContextDataAccessor<ReadOnlyStringMap> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,9 @@ package io.opentelemetry.instrumentation.log4j.appender.v2_17.internal;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -183,7 +183,7 @@ public final class LogEventMapper<T> {
|
||||||
|
|
||||||
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
|
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
|
||||||
// TODO (trask) extract method for recording exception into
|
// TODO (trask) extract method for recording exception into
|
||||||
// instrumentation-appender-api-internal
|
// io.opentelemetry:opentelemetry-api-logs
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
|
|
|
@ -9,15 +9,16 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.SpanContext;
|
import io.opentelemetry.api.trace.SpanContext;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.logs.data.Severity;
|
import io.opentelemetry.sdk.logs.export.InMemoryLogRecordExporter;
|
||||||
import io.opentelemetry.sdk.logs.export.InMemoryLogExporter;
|
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
|
||||||
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
|
|
||||||
import io.opentelemetry.sdk.resources.Resource;
|
import io.opentelemetry.sdk.resources.Resource;
|
||||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
|
@ -39,29 +40,29 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger("TestLogger");
|
private static final Logger logger = LogManager.getLogger("TestLogger");
|
||||||
|
|
||||||
private static InMemoryLogExporter logExporter;
|
private static InMemoryLogRecordExporter logRecordExporter;
|
||||||
private static Resource resource;
|
private static Resource resource;
|
||||||
private static InstrumentationScopeInfo instrumentationScopeInfo;
|
private static InstrumentationScopeInfo instrumentationScopeInfo;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
static void setupAll() {
|
static void setupAll() {
|
||||||
logExporter = InMemoryLogExporter.create();
|
logRecordExporter = InMemoryLogRecordExporter.create();
|
||||||
resource = Resource.getDefault();
|
resource = Resource.getDefault();
|
||||||
instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger");
|
instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger");
|
||||||
|
|
||||||
SdkLogEmitterProvider logEmitterProvider =
|
SdkLoggerProvider loggerProvider =
|
||||||
SdkLogEmitterProvider.builder()
|
SdkLoggerProvider.builder()
|
||||||
.setResource(resource)
|
.setResource(resource)
|
||||||
.addLogProcessor(SimpleLogProcessor.create(logExporter))
|
.addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
OpenTelemetryAppender.resetSdkLogEmitterProviderForTest();
|
GlobalLoggerProvider.resetForTest();
|
||||||
OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
|
GlobalLoggerProvider.set(loggerProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setup() {
|
void setup() {
|
||||||
logExporter.reset();
|
logRecordExporter.reset();
|
||||||
ThreadContext.clearAll();
|
ThreadContext.clearAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +70,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
void logNoSpan() {
|
void logNoSpan() {
|
||||||
logger.info("log message 1");
|
logger.info("log message 1");
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
@ -86,7 +87,7 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
|
|
||||||
Span span2 = runWithSpan("span2", () -> logger.info("log message 3"));
|
Span span2 = runWithSpan("span2", () -> logger.info("log message 3"));
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(3);
|
assertThat(logDataList).hasSize(3);
|
||||||
assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext());
|
assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext());
|
||||||
assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid());
|
assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid());
|
||||||
|
@ -108,9 +109,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
Instant start = Instant.now();
|
Instant start = Instant.now();
|
||||||
logger.info("log message 1", new IllegalStateException("Error!"));
|
logger.info("log message 1", new IllegalStateException("Error!"));
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
@ -138,9 +139,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
ThreadContext.clearMap();
|
ThreadContext.clearMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
@ -158,9 +159,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
message.put("key2", "val2");
|
message.put("key2", "val2");
|
||||||
logger.info(message);
|
logger.info(message);
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEmpty();
|
assertThat(logData.getBody().asString()).isEmpty();
|
||||||
|
@ -176,9 +177,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
message.put("message", "val2");
|
message.put("message", "val2");
|
||||||
logger.info(message);
|
logger.info(message);
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("val2");
|
assertThat(logData.getBody().asString()).isEqualTo("val2");
|
||||||
|
@ -193,8 +194,8 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
|
|
||||||
logger.info(marker, "Message");
|
logger.info(marker, "Message");
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getAttributes().get(AttributeKey.stringKey("log4j.marker")))
|
assertThat(logData.getAttributes().get(AttributeKey.stringKey("log4j.marker")))
|
||||||
.isEqualTo(markerName);
|
.isEqualTo(markerName);
|
||||||
}
|
}
|
||||||
|
@ -206,9 +207,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
message.put("key2", "val2");
|
message.put("key2", "val2");
|
||||||
logger.info(message);
|
logger.info(message);
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("a message");
|
assertThat(logData.getBody().asString()).isEqualTo("a message");
|
||||||
|
|
|
@ -17,7 +17,7 @@ import static org.mockito.Mockito.verify;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
|
|
|
@ -42,7 +42,7 @@ dependencies {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
implementation(project(":instrumentation:logback:logback-appender-1.0:library"))
|
implementation(project(":instrumentation:logback:logback-appender-1.0:library"))
|
||||||
|
|
|
@ -13,8 +13,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
@ -49,9 +49,9 @@ class LogbackInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
@Advice.Local("otelCallDepth") CallDepth callDepth) {
|
||||||
// need to track call depth across all loggers in order to avoid double capture when one
|
// need to track call depth across all loggers in order to avoid double capture when one
|
||||||
// logging framework delegates to another
|
// logging framework delegates to another
|
||||||
callDepth = CallDepth.forClass(LogEmitterProvider.class);
|
callDepth = CallDepth.forClass(LoggerProvider.class);
|
||||||
if (callDepth.getAndIncrement() == 0) {
|
if (callDepth.getAndIncrement() == 0) {
|
||||||
mapper().emit(AgentLogEmitterProvider.get(), event);
|
mapper().emit(GlobalLoggerProvider.get(), event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.asser
|
||||||
import static org.awaitility.Awaitility.await;
|
import static org.awaitility.Awaitility.await;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification;
|
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.logs.data.Severity;
|
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
@ -134,9 +134,9 @@ class LogbackTest extends AgentInstrumentationSpecification {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expectedSeverity != null) {
|
if (expectedSeverity != null) {
|
||||||
await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1));
|
await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1));
|
||||||
|
|
||||||
LogData log = testing.logs().get(0);
|
LogRecordData log = testing.logRecords().get(0);
|
||||||
assertThat(log)
|
assertThat(log)
|
||||||
.hasBody("xyz: 123")
|
.hasBody("xyz: 123")
|
||||||
// TODO (trask) why is version "" instead of null?
|
// TODO (trask) why is version "" instead of null?
|
||||||
|
@ -182,7 +182,7 @@ class LogbackTest extends AgentInstrumentationSpecification {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Thread.sleep(500); // sleep a bit just to make sure no log is captured
|
Thread.sleep(500); // sleep a bit just to make sure no log is captured
|
||||||
assertThat(testing.logs()).isEmpty();
|
assertThat(testing.logRecords()).isEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,9 +196,9 @@ class LogbackTest extends AgentInstrumentationSpecification {
|
||||||
MDC.clear();
|
MDC.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1));
|
await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1));
|
||||||
|
|
||||||
LogData log = getLogs().get(0);
|
LogRecordData log = getLogRecords().get(0);
|
||||||
assertThat(log)
|
assertThat(log)
|
||||||
.hasBody("xyz: 123")
|
.hasBody("xyz: 123")
|
||||||
// TODO (trask) why is version "" instead of null?
|
// TODO (trask) why is version "" instead of null?
|
||||||
|
@ -229,9 +229,9 @@ class LogbackTest extends AgentInstrumentationSpecification {
|
||||||
|
|
||||||
abcLogger.info(marker, "Message");
|
abcLogger.info(marker, "Message");
|
||||||
|
|
||||||
await().untilAsserted(() -> assertThat(testing.logs().size()).isEqualTo(1));
|
await().untilAsserted(() -> assertThat(testing.logRecords().size()).isEqualTo(1));
|
||||||
|
|
||||||
LogData log = getLogs().get(0);
|
LogRecordData log = getLogRecords().get(0);
|
||||||
|
|
||||||
assertThat(log)
|
assertThat(log)
|
||||||
.hasAttributesSatisfying(
|
.hasAttributesSatisfying(
|
||||||
|
|
|
@ -54,19 +54,17 @@ The following demonstrates how you might configure the appender in your `logback
|
||||||
</configuration>
|
</configuration>
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, associate the `OpenTelemetryAppender` configured via `logback.xml` with
|
Next, configure `GlobalLoggerProvider` with an `SdkLoggerProvider` in your application.
|
||||||
an `SdkLogEmitterProvider` in your application:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
SdkLogEmitterProvider logEmitterProvider =
|
SdkLoggerProvider sdkLoggerProvider =
|
||||||
SdkLogEmitterProvider.builder()
|
SdkLoggerProvider.builder()
|
||||||
.setResource(Resource.create(...))
|
.setResource(Resource.create(...))
|
||||||
.addLogProcessor(...)
|
.addLogProcessor(...)
|
||||||
.build();
|
.build();
|
||||||
OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
|
GlobalLoggerProvider.set(sdkLoggerProvider);
|
||||||
```
|
```
|
||||||
|
|
||||||
In this example Logback log events will be sent to both the console appender and
|
In this example Logback log events will be sent to both the console appender and
|
||||||
the `OpenTelemetryAppender`, which will drop the logs until
|
the `OpenTelemetryAppender`, which will drop the logs until `GlobalLoggerProvider.set(..)` is
|
||||||
`OpenTelemetryAppender.setSdkLogEmitterProvider(..)` is called. Once initialized, logs will be
|
called. Once initialized, logs will be emitted to a `Logger` obtained from the `SdkLoggerProvider`.
|
||||||
emitted to a `LogEmitter` obtained from the `SdkLogEmitterProvider`.
|
|
||||||
|
|
|
@ -3,8 +3,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":instrumentation-appender-api-internal"))
|
implementation("io.opentelemetry:opentelemetry-api-logs")
|
||||||
implementation(project(":instrumentation-appender-sdk-internal"))
|
|
||||||
|
|
||||||
// pin the version strictly to avoid overriding by dependencyManagement versions
|
// pin the version strictly to avoid overriding by dependencyManagement versions
|
||||||
compileOnly("ch.qos.logback:logback-classic") {
|
compileOnly("ch.qos.logback:logback-classic") {
|
||||||
|
|
|
@ -9,11 +9,8 @@ import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||||
import ch.qos.logback.core.UnsynchronizedAppenderBase;
|
import ch.qos.logback.core.UnsynchronizedAppenderBase;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder;
|
|
||||||
import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
|
import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
|
||||||
import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
|
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -21,9 +18,6 @@ import org.slf4j.MDC;
|
||||||
|
|
||||||
public class OpenTelemetryAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
|
public class OpenTelemetryAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
|
||||||
|
|
||||||
private static final LogEmitterProviderHolder logEmitterProviderHolder =
|
|
||||||
new LogEmitterProviderHolder();
|
|
||||||
|
|
||||||
private volatile boolean captureExperimentalAttributes = false;
|
private volatile boolean captureExperimentalAttributes = false;
|
||||||
private volatile boolean captureCodeAttributes = false;
|
private volatile boolean captureCodeAttributes = false;
|
||||||
private volatile boolean captureMarkerAttribute = false;
|
private volatile boolean captureMarkerAttribute = false;
|
||||||
|
@ -46,18 +40,7 @@ public class OpenTelemetryAppender extends UnsynchronizedAppenderBase<ILoggingEv
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void append(ILoggingEvent event) {
|
protected void append(ILoggingEvent event) {
|
||||||
mapper.emit(logEmitterProviderHolder.get(), event);
|
mapper.emit(GlobalLoggerProvider.get(), event);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This should be called once as early as possible in your application initialization logic, often
|
|
||||||
* in a {@code static} block in your main class. It should only be called once - an attempt to
|
|
||||||
* call it a second time will result in an error. If trying to set the {@link
|
|
||||||
* SdkLogEmitterProvider} multiple times in tests, use {@link
|
|
||||||
* OpenTelemetryAppender#resetSdkLogEmitterProviderForTest()} between them.
|
|
||||||
*/
|
|
||||||
public static void setSdkLogEmitterProvider(SdkLogEmitterProvider sdkLogEmitterProvider) {
|
|
||||||
logEmitterProviderHolder.set(DelegatingLogEmitterProvider.from(sdkLogEmitterProvider));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,14 +82,6 @@ public class OpenTelemetryAppender extends UnsynchronizedAppenderBase<ILoggingEv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsets the global {@link LogEmitterProvider}. This is only meant to be used from tests which
|
|
||||||
* need to reconfigure {@link LogEmitterProvider}.
|
|
||||||
*/
|
|
||||||
public static void resetSdkLogEmitterProviderForTest() {
|
|
||||||
logEmitterProviderHolder.resetForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
// copied from SDK's DefaultConfigProperties
|
// copied from SDK's DefaultConfigProperties
|
||||||
private static List<String> filterBlanksAndNulls(String[] values) {
|
private static List<String> filterBlanksAndNulls(String[] values) {
|
||||||
return Arrays.stream(values)
|
return Arrays.stream(values)
|
||||||
|
|
|
@ -11,10 +11,10 @@ import ch.qos.logback.classic.spi.ThrowableProxy;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import io.opentelemetry.api.logs.LoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogRecordBuilder;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.Severity;
|
|
||||||
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -53,13 +53,13 @@ public final class LoggingEventMapper {
|
||||||
captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*");
|
captureMdcAttributes.size() == 1 && captureMdcAttributes.get(0).equals("*");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void emit(LogEmitterProvider logEmitterProvider, ILoggingEvent event) {
|
public void emit(LoggerProvider loggerProvider, ILoggingEvent event) {
|
||||||
String instrumentationName = event.getLoggerName();
|
String instrumentationName = event.getLoggerName();
|
||||||
if (instrumentationName == null || instrumentationName.isEmpty()) {
|
if (instrumentationName == null || instrumentationName.isEmpty()) {
|
||||||
instrumentationName = "ROOT";
|
instrumentationName = "ROOT";
|
||||||
}
|
}
|
||||||
LogRecordBuilder builder =
|
LogRecordBuilder builder =
|
||||||
logEmitterProvider.logEmitterBuilder(instrumentationName).build().logBuilder();
|
loggerProvider.loggerBuilder(instrumentationName).build().logRecordBuilder();
|
||||||
mapLoggingEvent(builder, event);
|
mapLoggingEvent(builder, event);
|
||||||
builder.emit();
|
builder.emit();
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ public final class LoggingEventMapper {
|
||||||
|
|
||||||
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
|
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
|
||||||
// TODO (trask) extract method for recording exception into
|
// TODO (trask) extract method for recording exception into
|
||||||
// instrumentation-appender-api-internal
|
// io.opentelemetry:opentelemetry-api-logs
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
attributes.put(SemanticAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
|
||||||
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
attributes.put(SemanticAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
|
|
|
@ -8,15 +8,16 @@ package io.opentelemetry.instrumentation.logback.appender.v1_0;
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.SpanContext;
|
import io.opentelemetry.api.trace.SpanContext;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.logs.data.Severity;
|
import io.opentelemetry.sdk.logs.export.InMemoryLogRecordExporter;
|
||||||
import io.opentelemetry.sdk.logs.export.InMemoryLogExporter;
|
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
|
||||||
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
|
|
||||||
import io.opentelemetry.sdk.resources.Resource;
|
import io.opentelemetry.sdk.resources.Resource;
|
||||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
|
@ -37,38 +38,38 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger("TestLogger");
|
private static final Logger logger = LoggerFactory.getLogger("TestLogger");
|
||||||
|
|
||||||
private static InMemoryLogExporter logExporter;
|
private static InMemoryLogRecordExporter logRecordExporter;
|
||||||
private static Resource resource;
|
private static Resource resource;
|
||||||
private static InstrumentationScopeInfo instrumentationScopeInfo;
|
private static InstrumentationScopeInfo instrumentationScopeInfo;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
static void setupAll() {
|
static void setupAll() {
|
||||||
logExporter = InMemoryLogExporter.create();
|
logRecordExporter = InMemoryLogRecordExporter.create();
|
||||||
resource = Resource.getDefault();
|
resource = Resource.getDefault();
|
||||||
instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger");
|
instrumentationScopeInfo = InstrumentationScopeInfo.create("TestLogger");
|
||||||
|
|
||||||
SdkLogEmitterProvider logEmitterProvider =
|
SdkLoggerProvider loggerProvider =
|
||||||
SdkLogEmitterProvider.builder()
|
SdkLoggerProvider.builder()
|
||||||
.setResource(resource)
|
.setResource(resource)
|
||||||
.addLogProcessor(SimpleLogProcessor.create(logExporter))
|
.addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
OpenTelemetryAppender.resetSdkLogEmitterProviderForTest();
|
GlobalLoggerProvider.resetForTest();
|
||||||
OpenTelemetryAppender.setSdkLogEmitterProvider(logEmitterProvider);
|
GlobalLoggerProvider.set(loggerProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setup() {
|
void setup() {
|
||||||
logExporter.reset();
|
logRecordExporter.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void logNoSpan() {
|
void logNoSpan() {
|
||||||
logger.info("log message 1");
|
logger.info("log message 1");
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
@ -83,7 +84,7 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
|
|
||||||
Span span2 = runWithSpan("span2", () -> logger.info("log message 3"));
|
Span span2 = runWithSpan("span2", () -> logger.info("log message 3"));
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(3);
|
assertThat(logDataList).hasSize(3);
|
||||||
assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext());
|
assertThat(logDataList.get(0).getSpanContext()).isEqualTo(span1.getSpanContext());
|
||||||
assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid());
|
assertThat(logDataList.get(1).getSpanContext()).isEqualTo(SpanContext.getInvalid());
|
||||||
|
@ -107,9 +108,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
Marker marker = MarkerFactory.getMarker(markerName);
|
Marker marker = MarkerFactory.getMarker(markerName);
|
||||||
logger.info(marker, "log message 1", new IllegalStateException("Error!"));
|
logger.info(marker, "log message 1", new IllegalStateException("Error!"));
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
@ -155,9 +156,9 @@ class OpenTelemetryAppenderConfigTest {
|
||||||
MDC.clear();
|
MDC.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<LogData> logDataList = logExporter.getFinishedLogItems();
|
List<LogRecordData> logDataList = logRecordExporter.getFinishedLogItems();
|
||||||
assertThat(logDataList).hasSize(1);
|
assertThat(logDataList).hasSize(1);
|
||||||
LogData logData = logDataList.get(0);
|
LogRecordData logData = logDataList.get(0);
|
||||||
assertThat(logData.getResource()).isEqualTo(resource);
|
assertThat(logData.getResource()).isEqualTo(resource);
|
||||||
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
assertThat(logData.getInstrumentationScopeInfo()).isEqualTo(instrumentationScopeInfo);
|
||||||
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
assertThat(logData.getBody().asString()).isEqualTo("log message 1");
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
plugins {
|
||||||
|
id("otel.javaagent-instrumentation")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// this instrumentation needs to be able to reference both the OpenTelemetry API
|
||||||
|
// that is shaded in the bootstrap class loader (for sending telemetry to the agent),
|
||||||
|
// and the OpenTelemetry API that the user brings (in order to capture that telemetry)
|
||||||
|
//
|
||||||
|
// since (all) instrumentation already uses OpenTelemetry API for sending telemetry to the agent,
|
||||||
|
// this instrumentation uses a "temporarily shaded" OpenTelemetry API to represent the
|
||||||
|
// OpenTelemetry API that the user brings
|
||||||
|
//
|
||||||
|
// then later, after the OpenTelemetry API in the bootstrap class loader is shaded,
|
||||||
|
// the "temporarily shaded" OpenTelemetry API is unshaded, so that it will apply to the
|
||||||
|
// OpenTelemetry API that the user brings
|
||||||
|
//
|
||||||
|
// so in the code "application.io.opentelemetry.*" refers to the (unshaded) OpenTelemetry API that
|
||||||
|
// the application brings (as those references will be translated during the build to remove the
|
||||||
|
// "application." prefix)
|
||||||
|
//
|
||||||
|
// and in the code "io.opentelemetry.*" refers to the (shaded) OpenTelemetry API that is used by
|
||||||
|
// the agent (as those references will later be shaded)
|
||||||
|
compileOnly("io.opentelemetry:opentelemetry-api-logs")
|
||||||
|
compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "shadow"))
|
||||||
|
implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent"))
|
||||||
|
|
||||||
|
testImplementation("io.opentelemetry:opentelemetry-sdk-logs")
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs;
|
||||||
|
|
||||||
|
import com.google.auto.service.AutoService;
|
||||||
|
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
|
||||||
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@AutoService(InstrumentationModule.class)
|
||||||
|
public class OpenTelemetryApiLogsInstrumentationModule extends InstrumentationModule {
|
||||||
|
public OpenTelemetryApiLogsInstrumentationModule() {
|
||||||
|
super("opentelemetry-api-logs");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return Collections.singletonList(new OpenTelemetryLogsInstrumentation());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs;
|
||||||
|
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge.ApplicationLoggerProvider;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
|
// Our convention for accessing agent package
|
||||||
|
@SuppressWarnings("UnnecessarilyFullyQualified")
|
||||||
|
public class OpenTelemetryLogsInstrumentation implements TypeInstrumentation {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return named("application.io.opentelemetry.api.logs.GlobalLoggerProvider");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void transform(TypeTransformer transformer) {
|
||||||
|
transformer.applyAdviceToMethod(
|
||||||
|
isMethod().and(isStatic()).and(named("get")).and(takesArguments(0)),
|
||||||
|
OpenTelemetryLogsInstrumentation.class.getName() + "$GetGlobalLogsAdvice");
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public static class GetGlobalLogsAdvice {
|
||||||
|
|
||||||
|
@Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class)
|
||||||
|
public static Object onEnter() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
||||||
|
public static void methodExit(
|
||||||
|
@Advice.Return(readOnly = false)
|
||||||
|
application.io.opentelemetry.api.logs.LoggerProvider loggerProvider) {
|
||||||
|
loggerProvider = ApplicationLoggerProvider.INSTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge;
|
||||||
|
|
||||||
|
import application.io.opentelemetry.api.common.AttributeKey;
|
||||||
|
import application.io.opentelemetry.api.logs.EventBuilder;
|
||||||
|
import application.io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import application.io.opentelemetry.api.logs.Severity;
|
||||||
|
import application.io.opentelemetry.context.Context;
|
||||||
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage;
|
||||||
|
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.Bridging;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
class ApplicationLogRecordBuilder implements EventBuilder {
|
||||||
|
|
||||||
|
private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder;
|
||||||
|
|
||||||
|
ApplicationLogRecordBuilder(io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) {
|
||||||
|
this.agentLogRecordBuilder = agentLogRecordBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setEpoch(long l, TimeUnit timeUnit) {
|
||||||
|
agentLogRecordBuilder.setEpoch(l, timeUnit);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setEpoch(Instant instant) {
|
||||||
|
agentLogRecordBuilder.setEpoch(instant);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setContext(Context context) {
|
||||||
|
agentLogRecordBuilder.setContext(AgentContextStorage.getAgentContext(context));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setSeverity(Severity severity) {
|
||||||
|
agentLogRecordBuilder.setSeverity(LogBridging.toAgent(severity));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setSeverityText(String s) {
|
||||||
|
agentLogRecordBuilder.setSeverityText(s);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LogRecordBuilder setBody(String s) {
|
||||||
|
agentLogRecordBuilder.setBody(s);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public <T> LogRecordBuilder setAttribute(AttributeKey<T> attributeKey, T t) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
io.opentelemetry.api.common.AttributeKey<T> agentKey = Bridging.toAgent(attributeKey);
|
||||||
|
if (agentKey != null) {
|
||||||
|
agentLogRecordBuilder.setAttribute(agentKey, t);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void emit() {
|
||||||
|
agentLogRecordBuilder.emit();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge;
|
||||||
|
|
||||||
|
import application.io.opentelemetry.api.logs.EventBuilder;
|
||||||
|
import application.io.opentelemetry.api.logs.LogRecordBuilder;
|
||||||
|
import application.io.opentelemetry.api.logs.Logger;
|
||||||
|
|
||||||
|
class ApplicationLogger implements Logger {
|
||||||
|
|
||||||
|
private final io.opentelemetry.api.logs.Logger agentLogger;
|
||||||
|
|
||||||
|
ApplicationLogger(io.opentelemetry.api.logs.Logger agentLogger) {
|
||||||
|
this.agentLogger = agentLogger;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventBuilder eventBuilder(String eventName) {
|
||||||
|
return new ApplicationLogRecordBuilder(agentLogger.eventBuilder(eventName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LogRecordBuilder logRecordBuilder() {
|
||||||
|
return new ApplicationLogRecordBuilder(agentLogger.logRecordBuilder());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge;
|
||||||
|
|
||||||
|
import application.io.opentelemetry.api.logs.Logger;
|
||||||
|
import application.io.opentelemetry.api.logs.LoggerBuilder;
|
||||||
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
|
||||||
|
final class ApplicationLoggerBuilder implements LoggerBuilder {
|
||||||
|
|
||||||
|
private final io.opentelemetry.api.logs.LoggerBuilder agentBuilder;
|
||||||
|
|
||||||
|
ApplicationLoggerBuilder(io.opentelemetry.api.logs.LoggerBuilder agentBuilder) {
|
||||||
|
this.agentBuilder = agentBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LoggerBuilder setEventDomain(String eventDomain) {
|
||||||
|
agentBuilder.setEventDomain(eventDomain);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LoggerBuilder setSchemaUrl(String schemaUrl) {
|
||||||
|
agentBuilder.setSchemaUrl(schemaUrl);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public LoggerBuilder setInstrumentationVersion(String version) {
|
||||||
|
agentBuilder.setInstrumentationVersion(version);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Logger build() {
|
||||||
|
return new ApplicationLogger(agentBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge;
|
||||||
|
|
||||||
|
import application.io.opentelemetry.api.logs.LoggerBuilder;
|
||||||
|
import application.io.opentelemetry.api.logs.LoggerProvider;
|
||||||
|
|
||||||
|
// Our convention for accessing agent packages.
|
||||||
|
@SuppressWarnings("UnnecessarilyFullyQualified")
|
||||||
|
public class ApplicationLoggerProvider implements LoggerProvider {
|
||||||
|
|
||||||
|
public static final LoggerProvider INSTANCE = new ApplicationLoggerProvider();
|
||||||
|
|
||||||
|
private final io.opentelemetry.api.logs.LoggerProvider agentLoggerProvider;
|
||||||
|
|
||||||
|
public ApplicationLoggerProvider() {
|
||||||
|
this.agentLoggerProvider = io.opentelemetry.api.logs.GlobalLoggerProvider.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LoggerBuilder loggerBuilder(String instrumentationName) {
|
||||||
|
return new ApplicationLoggerBuilder(agentLoggerProvider.loggerBuilder(instrumentationName));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs.bridge;
|
||||||
|
|
||||||
|
import application.io.opentelemetry.api.logs.Severity;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class translates between the (unshaded) OpenTelemetry API that the application brings and
|
||||||
|
* the (shaded) OpenTelemetry API that is used by the agent.
|
||||||
|
*
|
||||||
|
* <p>"application.io.opentelemetry.*" refers to the (unshaded) OpenTelemetry API that the
|
||||||
|
* application brings (as those references will be translated during the build to remove the
|
||||||
|
* "application." prefix).
|
||||||
|
*
|
||||||
|
* <p>"io.opentelemetry.*" refers to the (shaded) OpenTelemetry API that is used by the agent (as
|
||||||
|
* those references will later be shaded).
|
||||||
|
*
|
||||||
|
* <p>Also see comments in this module's gradle file.
|
||||||
|
*/
|
||||||
|
// Our convention for accessing agent package
|
||||||
|
@SuppressWarnings("UnnecessarilyFullyQualified")
|
||||||
|
public class LogBridging {
|
||||||
|
|
||||||
|
private static final EnumMap<Severity, io.opentelemetry.api.logs.Severity> severityMap;
|
||||||
|
|
||||||
|
static {
|
||||||
|
severityMap = new EnumMap<>(Severity.class);
|
||||||
|
for (Severity severity : Severity.values()) {
|
||||||
|
try {
|
||||||
|
severityMap.put(severity, io.opentelemetry.api.logs.Severity.valueOf(severity.name()));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// No mapping exists for this severity, ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static io.opentelemetry.api.logs.Severity toAgent(Severity applicationSeverity) {
|
||||||
|
return severityMap.getOrDefault(
|
||||||
|
applicationSeverity, io.opentelemetry.api.logs.Severity.UNDEFINED_SEVERITY_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogBridging() {}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.logs;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.awaitility.Awaitility.await;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
|
import io.opentelemetry.api.common.Attributes;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
|
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.trace.IdGenerator;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
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;
|
||||||
|
|
||||||
|
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 =
|
||||||
|
GlobalLoggerProvider.get()
|
||||||
|
.loggerBuilder(instrumentationName)
|
||||||
|
.setInstrumentationVersion("1.2.3")
|
||||||
|
.setSchemaUrl("http://schema.org")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void logRecordBuilder() {
|
||||||
|
SpanContext spanContext =
|
||||||
|
SpanContext.create(
|
||||||
|
IdGenerator.random().generateTraceId(),
|
||||||
|
IdGenerator.random().generateSpanId(),
|
||||||
|
TraceFlags.getDefault(),
|
||||||
|
TraceState.getDefault());
|
||||||
|
|
||||||
|
logger
|
||||||
|
.logRecordBuilder()
|
||||||
|
.setEpoch(1, TimeUnit.SECONDS)
|
||||||
|
.setEpoch(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(logRecordData.getInstrumentationScopeInfo().getVersion())
|
||||||
|
.isEqualTo("1.2.3");
|
||||||
|
assertThat(logRecordData.getEpochNanos()).isGreaterThan(0);
|
||||||
|
assertThat(logRecordData.getSpanContext()).isEqualTo(spanContext);
|
||||||
|
assertThat(logRecordData.getSeverity()).isEqualTo(Severity.DEBUG);
|
||||||
|
assertThat(logRecordData.getSeverityText()).isEqualTo("debug");
|
||||||
|
assertThat(logRecordData.getBody().asString()).isEqualTo("body");
|
||||||
|
assertThat(logRecordData.getAttributes())
|
||||||
|
.isEqualTo(Attributes.builder().put("key", "value").build());
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
|
@ -32,13 +32,16 @@ dependencies {
|
||||||
compileOnly("io.opentelemetry:opentelemetry-extension-annotations")
|
compileOnly("io.opentelemetry:opentelemetry-extension-annotations")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
compileOnly("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-extension-aws")
|
compileOnly("io.opentelemetry:opentelemetry-extension-aws")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-resources")
|
|
||||||
compileOnly("io.opentelemetry:opentelemetry-exporter-logging")
|
compileOnly("io.opentelemetry:opentelemetry-exporter-logging")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-exporter-jaeger")
|
compileOnly("io.opentelemetry:opentelemetry-exporter-jaeger")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-exporter-otlp")
|
compileOnly("io.opentelemetry:opentelemetry-exporter-otlp")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-exporter-zipkin")
|
compileOnly("io.opentelemetry:opentelemetry-exporter-zipkin")
|
||||||
compileOnly(project(":instrumentation-annotations"))
|
compileOnly(project(":instrumentation-annotations"))
|
||||||
|
|
||||||
|
compileOnly(project(":instrumentation:resources:library"))
|
||||||
|
annotationProcessor("com.google.auto.service:auto-service")
|
||||||
|
compileOnly("com.google.auto.service:auto-service-annotations")
|
||||||
|
|
||||||
testImplementation("org.springframework.kafka:spring-kafka:2.9.0")
|
testImplementation("org.springframework.kafka:spring-kafka:2.9.0")
|
||||||
testImplementation("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion")
|
testImplementation("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion")
|
||||||
testImplementation("org.springframework.boot:spring-boot-starter-aop:$springBootVersion")
|
testImplementation("org.springframework.boot:spring-boot-starter-aop:$springBootVersion")
|
||||||
|
@ -52,7 +55,7 @@ dependencies {
|
||||||
testImplementation(project(":testing-common"))
|
testImplementation(project(":testing-common"))
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk")
|
testImplementation("io.opentelemetry:opentelemetry-sdk")
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
|
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-resources")
|
testImplementation(project(":instrumentation:resources:library"))
|
||||||
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
|
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
|
||||||
testImplementation("io.opentelemetry:opentelemetry-extension-annotations")
|
testImplementation("io.opentelemetry:opentelemetry-extension-annotations")
|
||||||
testImplementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
testImplementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
||||||
|
|
|
@ -5,18 +5,18 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
|
package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
|
||||||
|
|
||||||
|
import io.opentelemetry.instrumentation.resources.ContainerResource;
|
||||||
|
import io.opentelemetry.instrumentation.resources.ContainerResourceProvider;
|
||||||
|
import io.opentelemetry.instrumentation.resources.HostResource;
|
||||||
|
import io.opentelemetry.instrumentation.resources.HostResourceProvider;
|
||||||
|
import io.opentelemetry.instrumentation.resources.OsResource;
|
||||||
|
import io.opentelemetry.instrumentation.resources.OsResourceProvider;
|
||||||
|
import io.opentelemetry.instrumentation.resources.ProcessResource;
|
||||||
|
import io.opentelemetry.instrumentation.resources.ProcessResourceProvider;
|
||||||
|
import io.opentelemetry.instrumentation.resources.ProcessRuntimeResource;
|
||||||
|
import io.opentelemetry.instrumentation.resources.ProcessRuntimeResourceProvider;
|
||||||
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
|
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
|
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
|
||||||
import io.opentelemetry.sdk.extension.resources.ContainerResource;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.ContainerResourceProvider;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.HostResource;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.HostResourceProvider;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.OsResource;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.OsResourceProvider;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.ProcessResource;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.ProcessResourceProvider;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.ProcessRuntimeResource;
|
|
||||||
import io.opentelemetry.sdk.extension.resources.ProcessRuntimeResourceProvider;
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
|
|
@ -7,7 +7,6 @@ group = "io.opentelemetry.javaagent"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":instrumentation-api"))
|
implementation(project(":instrumentation-api"))
|
||||||
implementation(project(":instrumentation-appender-api-internal"))
|
|
||||||
|
|
||||||
testImplementation(project(":testing-common"))
|
testImplementation(project(":testing-common"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.bootstrap;
|
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProviderHolder;
|
|
||||||
|
|
||||||
public final class AgentLogEmitterProvider {
|
|
||||||
|
|
||||||
private static final LogEmitterProviderHolder delegate = new LogEmitterProviderHolder();
|
|
||||||
|
|
||||||
/** Returns the registered global {@link LogEmitterProvider}. */
|
|
||||||
public static LogEmitterProvider get() {
|
|
||||||
return delegate.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the {@link LogEmitterProvider} that should be used by the agent. Future calls to {@link
|
|
||||||
* #get()} will return the provided {@link LogEmitterProvider} instance. It should only be called
|
|
||||||
* once - an attempt to call it a second time will result in an error. If trying to set the
|
|
||||||
* instance {@link LogEmitterProvider} multiple times in tests, use {@link
|
|
||||||
* LogEmitterProviderHolder#resetForTest()} between them.
|
|
||||||
*/
|
|
||||||
public static void set(LogEmitterProvider logEmitterProvider) {
|
|
||||||
delegate.set(logEmitterProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsets the {@link LogEmitterProvider}. This is only meant to be used from tests which need to
|
|
||||||
* reconfigure {@link LogEmitterProvider}.
|
|
||||||
*/
|
|
||||||
public static void resetForTest() {
|
|
||||||
delegate.resetForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
private AgentLogEmitterProvider() {}
|
|
||||||
}
|
|
|
@ -14,11 +14,11 @@ dependencies {
|
||||||
implementation(project(":javaagent-tooling:javaagent-tooling-java9"))
|
implementation(project(":javaagent-tooling:javaagent-tooling-java9"))
|
||||||
implementation(project(":instrumentation-api"))
|
implementation(project(":instrumentation-api"))
|
||||||
implementation(project(":instrumentation-annotations-support"))
|
implementation(project(":instrumentation-annotations-support"))
|
||||||
implementation(project(":instrumentation-appender-api-internal"))
|
implementation(project(":instrumentation:resources:library"))
|
||||||
implementation(project(":instrumentation-appender-sdk-internal"))
|
|
||||||
implementation(project(":muzzle"))
|
implementation(project(":muzzle"))
|
||||||
|
|
||||||
implementation("io.opentelemetry:opentelemetry-api")
|
implementation("io.opentelemetry:opentelemetry-api")
|
||||||
|
implementation("io.opentelemetry:opentelemetry-api-logs")
|
||||||
implementation("io.opentelemetry:opentelemetry-sdk")
|
implementation("io.opentelemetry:opentelemetry-sdk")
|
||||||
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
|
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
|
||||||
implementation("io.opentelemetry:opentelemetry-sdk-metrics")
|
implementation("io.opentelemetry:opentelemetry-sdk-metrics")
|
||||||
|
@ -26,7 +26,6 @@ dependencies {
|
||||||
implementation("io.opentelemetry:opentelemetry-extension-kotlin")
|
implementation("io.opentelemetry:opentelemetry-extension-kotlin")
|
||||||
implementation("io.opentelemetry:opentelemetry-extension-aws")
|
implementation("io.opentelemetry:opentelemetry-extension-aws")
|
||||||
implementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
implementation("io.opentelemetry:opentelemetry-extension-trace-propagators")
|
||||||
implementation("io.opentelemetry:opentelemetry-sdk-extension-resources")
|
|
||||||
// the incubator's ViewConfigCustomizer is used to support loading yaml-based metric views
|
// the incubator's ViewConfigCustomizer is used to support loading yaml-based metric views
|
||||||
implementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
|
implementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
|
||||||
|
|
||||||
|
|
|
@ -5,16 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.tooling;
|
package io.opentelemetry.javaagent.tooling;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.appender.internal.LogEmitterProvider;
|
|
||||||
import io.opentelemetry.instrumentation.sdk.appender.internal.DelegatingLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentInitializer;
|
import io.opentelemetry.javaagent.bootstrap.AgentInitializer;
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider;
|
|
||||||
import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess;
|
import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess;
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||||
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
|
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
|
||||||
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder;
|
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder;
|
||||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||||
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
public final class OpenTelemetryInstaller {
|
public final class OpenTelemetryInstaller {
|
||||||
|
@ -42,16 +38,11 @@ public final class OpenTelemetryInstaller {
|
||||||
(timeout, unit) -> {
|
(timeout, unit) -> {
|
||||||
CompletableResultCode traceResult = sdk.getSdkTracerProvider().forceFlush();
|
CompletableResultCode traceResult = sdk.getSdkTracerProvider().forceFlush();
|
||||||
CompletableResultCode metricsResult = sdk.getSdkMeterProvider().forceFlush();
|
CompletableResultCode metricsResult = sdk.getSdkMeterProvider().forceFlush();
|
||||||
CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult))
|
CompletableResultCode logsResult = sdk.getSdkLoggerProvider().forceFlush();
|
||||||
|
CompletableResultCode.ofAll(Arrays.asList(traceResult, metricsResult, logsResult))
|
||||||
.join(timeout, unit);
|
.join(timeout, unit);
|
||||||
});
|
});
|
||||||
|
|
||||||
SdkLogEmitterProvider sdkLogEmitterProvider =
|
|
||||||
autoConfiguredSdk.getOpenTelemetrySdk().getSdkLogEmitterProvider();
|
|
||||||
LogEmitterProvider logEmitterProvider =
|
|
||||||
DelegatingLogEmitterProvider.from(sdkLogEmitterProvider);
|
|
||||||
AgentLogEmitterProvider.set(logEmitterProvider);
|
|
||||||
|
|
||||||
return autoConfiguredSdk;
|
return autoConfiguredSdk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,19 @@ package io.opentelemetry.javaagent.tooling
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry
|
import io.opentelemetry.api.GlobalOpenTelemetry
|
||||||
import io.opentelemetry.api.OpenTelemetry
|
import io.opentelemetry.api.OpenTelemetry
|
||||||
import io.opentelemetry.javaagent.bootstrap.AgentLogEmitterProvider
|
import io.opentelemetry.api.logs.GlobalLoggerProvider
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
class OpenTelemetryInstallerTest extends Specification {
|
class OpenTelemetryInstallerTest extends Specification {
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
GlobalOpenTelemetry.resetForTest()
|
GlobalOpenTelemetry.resetForTest()
|
||||||
AgentLogEmitterProvider.resetForTest()
|
GlobalLoggerProvider.resetForTest()
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup() {
|
void cleanup() {
|
||||||
GlobalOpenTelemetry.resetForTest()
|
GlobalOpenTelemetry.resetForTest()
|
||||||
AgentLogEmitterProvider.resetForTest()
|
GlobalLoggerProvider.resetForTest()
|
||||||
}
|
}
|
||||||
|
|
||||||
def "should initialize GlobalOpenTelemetry"() {
|
def "should initialize GlobalOpenTelemetry"() {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import static java.util.Collections.singletonMap;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
|
import io.opentelemetry.api.logs.GlobalLoggerProvider;
|
||||||
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
|
import io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller;
|
||||||
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
|
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
|
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
|
||||||
|
@ -31,6 +32,7 @@ class ConfigurationFileLoaderTest {
|
||||||
@AfterAll
|
@AfterAll
|
||||||
static void cleanUp() {
|
static void cleanUp() {
|
||||||
GlobalOpenTelemetry.resetForTest();
|
GlobalOpenTelemetry.resetForTest();
|
||||||
|
GlobalLoggerProvider.resetForTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
// regression for https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/6696
|
// regression for https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/6696
|
||||||
|
|
|
@ -34,6 +34,7 @@ val javaagentLibs by configurations.creating {
|
||||||
listOf(baseJavaagentLibs, javaagentLibs).forEach {
|
listOf(baseJavaagentLibs, javaagentLibs).forEach {
|
||||||
it.run {
|
it.run {
|
||||||
exclude("io.opentelemetry", "opentelemetry-api")
|
exclude("io.opentelemetry", "opentelemetry-api")
|
||||||
|
exclude("io.opentelemetry", "opentelemetry-api-logs")
|
||||||
exclude("io.opentelemetry", "opentelemetry-semconv")
|
exclude("io.opentelemetry", "opentelemetry-semconv")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,9 +45,10 @@ val licenseReportDependencies by configurations.creating {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
bootstrapLibs(project(":instrumentation-api"))
|
bootstrapLibs(project(":instrumentation-api"))
|
||||||
|
// opentelemetry-api is an api dependency of :instrumentation-api, but opentelemetry-api-logs is not
|
||||||
|
bootstrapLibs("io.opentelemetry:opentelemetry-api-logs")
|
||||||
bootstrapLibs(project(":instrumentation-api-semconv"))
|
bootstrapLibs(project(":instrumentation-api-semconv"))
|
||||||
bootstrapLibs(project(":instrumentation-annotations-support"))
|
bootstrapLibs(project(":instrumentation-annotations-support"))
|
||||||
bootstrapLibs(project(":instrumentation-appender-api-internal"))
|
|
||||||
bootstrapLibs(project(":javaagent-bootstrap"))
|
bootstrapLibs(project(":javaagent-bootstrap"))
|
||||||
|
|
||||||
// extension-api contains both bootstrap packages and agent packages
|
// extension-api contains both bootstrap packages and agent packages
|
||||||
|
@ -296,7 +298,6 @@ fun ShadowJar.excludeBootstrapClasses() {
|
||||||
exclude(project(":instrumentation-api"))
|
exclude(project(":instrumentation-api"))
|
||||||
exclude(project(":instrumentation-api-semconv"))
|
exclude(project(":instrumentation-api-semconv"))
|
||||||
exclude(project(":instrumentation-annotations-support"))
|
exclude(project(":instrumentation-annotations-support"))
|
||||||
exclude(project(":instrumentation-appender-api-internal"))
|
|
||||||
exclude(project(":javaagent-bootstrap"))
|
exclude(project(":javaagent-bootstrap"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#javaagent
|
#javaagent
|
||||||
##Dependency License Report
|
##Dependency License Report
|
||||||
_2022-10-11 10:41:57 PDT_
|
_2022-10-11 13:01:17 PDT_
|
||||||
## Apache License, Version 2.0
|
## Apache License, Version 2.0
|
||||||
|
|
||||||
**1** **Group:** `com.blogspot.mydailyjava` **Name:** `weak-lock-free` **Version:** `0.18`
|
**1** **Group:** `com.blogspot.mydailyjava` **Name:** `weak-lock-free` **Version:** `0.18`
|
||||||
|
@ -37,103 +37,103 @@ _2022-10-11 10:41:57 PDT_
|
||||||
> - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/)
|
> - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/)
|
||||||
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**7** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.18.0`
|
**7** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**8** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.18.0`
|
**8** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-logs` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**9** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.18.0`
|
**9** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.19.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)
|
||||||
|
|
||||||
|
**10** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**10** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-jaeger` **Version:** `1.18.0`
|
**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-jaeger` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.18.0`
|
**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.18.0`
|
**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **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-exporter-otlp` **Version:** `1.18.0`
|
**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **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-exporter-otlp-common` **Version:** `1.18.0`
|
**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **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-otlp-logs` **Version:** `1.18.0-alpha`
|
**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-logs` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.18.0-alpha`
|
**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.18.0`
|
**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-aws` **Version:** `1.18.0`
|
**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-aws` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.18.0`
|
**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.18.0`
|
**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.18.0`
|
**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.18.0`
|
**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.18.0-alpha`
|
**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.18.0`
|
**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.18.0-alpha`
|
**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.18.0`
|
**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-resources` **Version:** `1.18.0`
|
**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.19.0-alpha`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.18.0-alpha`
|
**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.18.0`
|
**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.19.0`
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.18.0`
|
**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-semconv` **Version:** `1.19.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)
|
|
||||||
|
|
||||||
**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-semconv` **Version:** `1.18.0-alpha`
|
|
||||||
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
|
> - **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)
|
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ val v1_10 by configurations.creating {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
latestDeps("io.opentelemetry:opentelemetry-api")
|
latestDeps("io.opentelemetry:opentelemetry-api")
|
||||||
|
latestDeps("io.opentelemetry:opentelemetry-api-logs")
|
||||||
|
|
||||||
listOf("opentelemetry-api", "opentelemetry-context").forEach {
|
listOf("opentelemetry-api", "opentelemetry-context").forEach {
|
||||||
v1_10Deps("io.opentelemetry:$it") {
|
v1_10Deps("io.opentelemetry:$it") {
|
||||||
|
|
|
@ -111,8 +111,6 @@ include(":bom")
|
||||||
include(":bom-alpha")
|
include(":bom-alpha")
|
||||||
include(":instrumentation-api")
|
include(":instrumentation-api")
|
||||||
include(":instrumentation-api-semconv")
|
include(":instrumentation-api-semconv")
|
||||||
include(":instrumentation-appender-api-internal")
|
|
||||||
include(":instrumentation-appender-sdk-internal")
|
|
||||||
include(":instrumentation-annotations")
|
include(":instrumentation-annotations")
|
||||||
include(":instrumentation-annotations-support")
|
include(":instrumentation-annotations-support")
|
||||||
include(":instrumentation-annotations-support-testing")
|
include(":instrumentation-annotations-support-testing")
|
||||||
|
@ -363,6 +361,7 @@ include(":instrumentation:okhttp:okhttp-3.0:testing")
|
||||||
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")
|
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")
|
||||||
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent")
|
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent")
|
||||||
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.10:javaagent")
|
include(":instrumentation:opentelemetry-api:opentelemetry-api-1.10:javaagent")
|
||||||
|
include(":instrumentation:opentelemetry-api:opentelemetry-api-logs-1.19:javaagent")
|
||||||
include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent")
|
include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent")
|
||||||
include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")
|
include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")
|
||||||
include(":instrumentation:opentelemetry-instrumentation-api:javaagent")
|
include(":instrumentation:opentelemetry-instrumentation-api:javaagent")
|
||||||
|
|
|
@ -15,7 +15,7 @@ import io.opentelemetry.instrumentation.testing.InstrumentationTestRunner
|
||||||
import io.opentelemetry.instrumentation.testing.util.ContextStorageCloser
|
import io.opentelemetry.instrumentation.testing.util.ContextStorageCloser
|
||||||
import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil
|
import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil
|
||||||
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
|
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
|
||||||
import io.opentelemetry.sdk.logs.data.LogData
|
import io.opentelemetry.sdk.logs.data.LogRecordData
|
||||||
import io.opentelemetry.sdk.metrics.data.MetricData
|
import io.opentelemetry.sdk.metrics.data.MetricData
|
||||||
import io.opentelemetry.sdk.trace.data.SpanData
|
import io.opentelemetry.sdk.trace.data.SpanData
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
|
@ -72,8 +72,8 @@ abstract class InstrumentationSpecification extends Specification {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return a list of all captured logs. */
|
/** Return a list of all captured logs. */
|
||||||
List<LogData> getLogs() {
|
List<LogRecordData> getLogRecords() {
|
||||||
testRunner().getExportedLogs()
|
testRunner().getExportedLogRecords()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.test.utils.LoggerUtils;
|
import io.opentelemetry.instrumentation.test.utils.LoggerUtils;
|
||||||
import io.opentelemetry.javaagent.testing.common.AgentTestingExporterAccess;
|
import io.opentelemetry.javaagent.testing.common.AgentTestingExporterAccess;
|
||||||
import io.opentelemetry.javaagent.testing.common.TestAgentListenerAccess;
|
import io.opentelemetry.javaagent.testing.common.TestAgentListenerAccess;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.metrics.data.MetricData;
|
import io.opentelemetry.sdk.metrics.data.MetricData;
|
||||||
import io.opentelemetry.sdk.trace.data.SpanData;
|
import io.opentelemetry.sdk.trace.data.SpanData;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -84,8 +84,8 @@ public final class AgentTestRunner extends InstrumentationTestRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<LogData> getExportedLogs() {
|
public List<LogRecordData> getExportedLogRecords() {
|
||||||
return AgentTestingExporterAccess.getExportedLogs();
|
return AgentTestingExporterAccess.getExportedLogRecords();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -11,7 +11,7 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil;
|
import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil;
|
||||||
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable;
|
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable;
|
||||||
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
|
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.metrics.data.MetricData;
|
import io.opentelemetry.sdk.metrics.data.MetricData;
|
||||||
import io.opentelemetry.sdk.testing.assertj.TraceAssert;
|
import io.opentelemetry.sdk.testing.assertj.TraceAssert;
|
||||||
import io.opentelemetry.sdk.testing.assertj.TracesAssert;
|
import io.opentelemetry.sdk.testing.assertj.TracesAssert;
|
||||||
|
@ -53,7 +53,7 @@ public abstract class InstrumentationTestRunner {
|
||||||
|
|
||||||
public abstract List<MetricData> getExportedMetrics();
|
public abstract List<MetricData> getExportedMetrics();
|
||||||
|
|
||||||
public abstract List<LogData> getExportedLogs();
|
public abstract List<LogRecordData> getExportedLogRecords();
|
||||||
|
|
||||||
public abstract boolean forceFlushCalled();
|
public abstract boolean forceFlushCalled();
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ import io.opentelemetry.context.propagation.ContextPropagators;
|
||||||
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
|
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||||
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
||||||
import io.opentelemetry.sdk.metrics.data.MetricData;
|
import io.opentelemetry.sdk.metrics.data.MetricData;
|
||||||
|
@ -122,7 +122,7 @@ public final class LibraryTestRunner extends InstrumentationTestRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<LogData> getExportedLogs() {
|
public List<LogRecordData> getExportedLogRecords() {
|
||||||
// no logs support yet
|
// no logs support yet
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ import io.opentelemetry.instrumentation.testing.util.ContextStorageCloser;
|
||||||
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable;
|
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable;
|
||||||
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
|
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.metrics.data.MetricData;
|
import io.opentelemetry.sdk.metrics.data.MetricData;
|
||||||
import io.opentelemetry.sdk.testing.assertj.TraceAssert;
|
import io.opentelemetry.sdk.testing.assertj.TraceAssert;
|
||||||
import io.opentelemetry.sdk.trace.data.SpanData;
|
import io.opentelemetry.sdk.trace.data.SpanData;
|
||||||
|
@ -76,8 +76,8 @@ public abstract class InstrumentationExtension
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return a list of all captured logs. */
|
/** Return a list of all captured logs. */
|
||||||
public List<LogData> logs() {
|
public List<LogRecordData> logRecords() {
|
||||||
return testRunner.getExportedLogs();
|
return testRunner.getExportedLogRecords();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -14,6 +14,7 @@ import static java.util.stream.Collectors.toList;
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
import io.opentelemetry.api.logs.Severity;
|
||||||
import io.opentelemetry.api.trace.SpanContext;
|
import io.opentelemetry.api.trace.SpanContext;
|
||||||
import io.opentelemetry.api.trace.SpanKind;
|
import io.opentelemetry.api.trace.SpanKind;
|
||||||
import io.opentelemetry.api.trace.StatusCode;
|
import io.opentelemetry.api.trace.StatusCode;
|
||||||
|
@ -44,8 +45,7 @@ import io.opentelemetry.proto.trace.v1.ScopeSpans;
|
||||||
import io.opentelemetry.proto.trace.v1.Span;
|
import io.opentelemetry.proto.trace.v1.Span;
|
||||||
import io.opentelemetry.proto.trace.v1.Status;
|
import io.opentelemetry.proto.trace.v1.Status;
|
||||||
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.logs.data.Severity;
|
|
||||||
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
||||||
import io.opentelemetry.sdk.metrics.data.DoublePointData;
|
import io.opentelemetry.sdk.metrics.data.DoublePointData;
|
||||||
import io.opentelemetry.sdk.metrics.data.HistogramPointData;
|
import io.opentelemetry.sdk.metrics.data.HistogramPointData;
|
||||||
|
@ -63,7 +63,7 @@ import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData;
|
||||||
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryData;
|
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryData;
|
||||||
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryPointData;
|
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSummaryPointData;
|
||||||
import io.opentelemetry.sdk.metrics.internal.data.ImmutableValueAtQuantile;
|
import io.opentelemetry.sdk.metrics.internal.data.ImmutableValueAtQuantile;
|
||||||
import io.opentelemetry.sdk.testing.logs.TestLogData;
|
import io.opentelemetry.sdk.testing.logs.TestLogRecordData;
|
||||||
import io.opentelemetry.sdk.testing.trace.TestSpanData;
|
import io.opentelemetry.sdk.testing.trace.TestSpanData;
|
||||||
import io.opentelemetry.sdk.trace.data.EventData;
|
import io.opentelemetry.sdk.trace.data.EventData;
|
||||||
import io.opentelemetry.sdk.trace.data.LinkData;
|
import io.opentelemetry.sdk.trace.data.LinkData;
|
||||||
|
@ -276,7 +276,7 @@ public final class AgentTestingExporterAccess {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static List<LogData> getExportedLogs() {
|
public static List<LogRecordData> getExportedLogRecords() {
|
||||||
List<byte[]> exportRequests;
|
List<byte[]> exportRequests;
|
||||||
try {
|
try {
|
||||||
exportRequests = (List<byte[]>) getLogExportRequests.invokeExact();
|
exportRequests = (List<byte[]>) getLogExportRequests.invokeExact();
|
||||||
|
@ -296,7 +296,7 @@ public final class AgentTestingExporterAccess {
|
||||||
})
|
})
|
||||||
.flatMap(request -> request.getResourceLogsList().stream())
|
.flatMap(request -> request.getResourceLogsList().stream())
|
||||||
.collect(toList());
|
.collect(toList());
|
||||||
List<LogData> logs = new ArrayList<>();
|
List<LogRecordData> logs = new ArrayList<>();
|
||||||
for (ResourceLogs resourceLogs : allResourceLogs) {
|
for (ResourceLogs resourceLogs : allResourceLogs) {
|
||||||
Resource resource = resourceLogs.getResource();
|
Resource resource = resourceLogs.getResource();
|
||||||
for (ScopeLogs ilLogs : resourceLogs.getScopeLogsList()) {
|
for (ScopeLogs ilLogs : resourceLogs.getScopeLogsList()) {
|
||||||
|
@ -391,11 +391,11 @@ public final class AgentTestingExporterAccess {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static LogData createLogData(
|
private static LogRecordData createLogData(
|
||||||
LogRecord logRecord,
|
LogRecord logRecord,
|
||||||
io.opentelemetry.sdk.resources.Resource resource,
|
io.opentelemetry.sdk.resources.Resource resource,
|
||||||
InstrumentationScopeInfo instrumentationScopeInfo) {
|
InstrumentationScopeInfo instrumentationScopeInfo) {
|
||||||
return TestLogData.builder()
|
return TestLogRecordData.builder()
|
||||||
.setResource(resource)
|
.setResource(resource)
|
||||||
.setInstrumentationScopeInfo(instrumentationScopeInfo)
|
.setInstrumentationScopeInfo(instrumentationScopeInfo)
|
||||||
.setEpoch(logRecord.getTimeUnixNano(), TimeUnit.NANOSECONDS)
|
.setEpoch(logRecord.getTimeUnixNano(), TimeUnit.NANOSECONDS)
|
||||||
|
|
|
@ -16,9 +16,6 @@ dependencies {
|
||||||
compileOnly(project(":javaagent-bootstrap"))
|
compileOnly(project(":javaagent-bootstrap"))
|
||||||
compileOnly(project(":javaagent-tooling"))
|
compileOnly(project(":javaagent-tooling"))
|
||||||
|
|
||||||
compileOnly(project(":instrumentation-appender-api-internal"))
|
|
||||||
compileOnly(project(":instrumentation-appender-sdk-internal"))
|
|
||||||
|
|
||||||
implementation("io.opentelemetry:opentelemetry-exporter-otlp-common")
|
implementation("io.opentelemetry:opentelemetry-exporter-otlp-common")
|
||||||
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
|
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.testing.exporter;
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
|
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
|
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
|
||||||
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
|
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
|
||||||
import io.opentelemetry.sdk.metrics.export.MetricReader;
|
import io.opentelemetry.sdk.metrics.export.MetricReader;
|
||||||
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
|
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
|
||||||
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
|
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
|
||||||
|
@ -40,9 +40,9 @@ public class AgentTestingCustomizer implements AutoConfigurationCustomizerProvid
|
||||||
autoConfigurationCustomizer.addMeterProviderCustomizer(
|
autoConfigurationCustomizer.addMeterProviderCustomizer(
|
||||||
(meterProvider, config) -> meterProvider.registerMetricReader(metricReader));
|
(meterProvider, config) -> meterProvider.registerMetricReader(metricReader));
|
||||||
|
|
||||||
autoConfigurationCustomizer.addLogEmitterProviderCustomizer(
|
autoConfigurationCustomizer.addLoggerProviderCustomizer(
|
||||||
(logProvider, config) ->
|
(logProvider, config) ->
|
||||||
logProvider.addLogProcessor(
|
logProvider.addLogRecordProcessor(
|
||||||
SimpleLogProcessor.create(AgentTestingExporterFactory.logExporter)));
|
SimpleLogRecordProcessor.create(AgentTestingExporterFactory.logExporter)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public final class AgentTestingExporterFactory {
|
||||||
|
|
||||||
static final OtlpInMemorySpanExporter spanExporter = new OtlpInMemorySpanExporter();
|
static final OtlpInMemorySpanExporter spanExporter = new OtlpInMemorySpanExporter();
|
||||||
static final OtlpInMemoryMetricExporter metricExporter = new OtlpInMemoryMetricExporter();
|
static final OtlpInMemoryMetricExporter metricExporter = new OtlpInMemoryMetricExporter();
|
||||||
static final OtlpInMemoryLogExporter logExporter = new OtlpInMemoryLogExporter();
|
static final OtlpInMemoryLogRecordExporter logExporter = new OtlpInMemoryLogRecordExporter();
|
||||||
|
|
||||||
public static List<byte[]> getSpanExportRequests() {
|
public static List<byte[]> getSpanExportRequests() {
|
||||||
return spanExporter.getCollectedExportRequests();
|
return spanExporter.getCollectedExportRequests();
|
||||||
|
|
|
@ -9,8 +9,8 @@ import static java.util.logging.Level.INFO;
|
||||||
|
|
||||||
import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler;
|
import io.opentelemetry.exporter.internal.otlp.logs.LogsRequestMarshaler;
|
||||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||||
import io.opentelemetry.sdk.logs.data.LogData;
|
import io.opentelemetry.sdk.logs.data.LogRecordData;
|
||||||
import io.opentelemetry.sdk.logs.export.LogExporter;
|
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
|
@ -21,9 +21,10 @@ import java.util.Queue;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
class OtlpInMemoryLogExporter implements LogExporter {
|
class OtlpInMemoryLogRecordExporter implements LogRecordExporter {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(OtlpInMemoryLogExporter.class.getName());
|
private static final Logger logger =
|
||||||
|
Logger.getLogger(OtlpInMemoryLogRecordExporter.class.getName());
|
||||||
|
|
||||||
private final Queue<byte[]> collectedRequests = new ConcurrentLinkedQueue<>();
|
private final Queue<byte[]> collectedRequests = new ConcurrentLinkedQueue<>();
|
||||||
|
|
||||||
|
@ -36,13 +37,13 @@ class OtlpInMemoryLogExporter implements LogExporter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableResultCode export(Collection<LogData> logs) {
|
public CompletableResultCode export(Collection<LogRecordData> logRecords) {
|
||||||
for (LogData log : logs) {
|
for (LogRecordData logRecord : logRecords) {
|
||||||
logger.log(INFO, "Exporting log {0}", log);
|
logger.log(INFO, "Exporting log {0}", logRecord);
|
||||||
}
|
}
|
||||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
try {
|
try {
|
||||||
LogsRequestMarshaler.create(logs).writeBinaryTo(bos);
|
LogsRequestMarshaler.create(logRecords).writeBinaryTo(bos);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new UncheckedIOException(e);
|
throw new UncheckedIOException(e);
|
||||||
}
|
}
|
Loading…
Reference in New Issue