Split out logs API (#4764)

This commit is contained in:
jack-berg 2022-09-22 13:23:52 -05:00 committed by GitHub
parent ce533c8ff9
commit f7317c6e8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 299 additions and 114 deletions

View File

@ -221,11 +221,12 @@ dependency as follows, replacing `{{artifact-id}}` with the value from the "Arti
### API
| Component | Description | Artifact ID | Version |
|-----------------------------------|----------------------------------------------------------------|-------------------------|-------------------------------------------------------------|
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.18.0<!--/VERSION_STABLE--> |
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.18.0<!--/VERSION_STABLE--> |
| [Semantic Conventions](./semconv) | Generated code for OpenTelemetry semantic conventions | `opentelemetry-semconv` | <!--VERSION_UNSTABLE-->1.18.0-alpha<!--/VERSION_UNSTABLE--> |
| Component | Description | Artifact ID | Version |
|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------|----------------------------------------------------------------------------------|
| [API](./api/all) | OpenTelemetry API, including metrics, traces, baggage, context | `opentelemetry-api` | <!--VERSION_STABLE-->1.18.0<!--/VERSION_STABLE--> |
| [Logs API](./api/logs) | OpenTelemetry Log API for emitting events and bridging log frameworks (NOT a replacement for application logging frameworks like SLF4J, JUL, etc.) | `opentelemetry-api-logs` | <!--VERSION_UNSTABLE-->TODO: add version after published<!--/VERSION_UNSTABLE--> |
| [Context API](./context) | OpenTelemetry context API | `opentelemetry-context` | <!--VERSION_STABLE-->1.18.0<!--/VERSION_STABLE--> |
| [Semantic Conventions](./semconv) | Generated code for OpenTelemetry semantic conventions | `opentelemetry-semconv` | <!--VERSION_UNSTABLE-->1.18.0-alpha<!--/VERSION_UNSTABLE--> |
### API Extensions

13
api/logs/build.gradle.kts Normal file
View File

@ -0,0 +1,13 @@
plugins {
id("otel.java-conventions")
id("otel.publish-conventions")
id("otel.animalsniffer-conventions")
}
description = "OpenTelemetry Logs API"
otelJava.moduleName.set("io.opentelemetry.api.logs")
dependencies {
api(project(":api:all"))
}

View File

@ -0,0 +1 @@
otel.release=alpha

View File

@ -3,53 +3,31 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs;
package io.opentelemetry.api.logs;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.logs.data.Severity;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
class NoopLoggerBuilder implements LoggerBuilder {
class DefaultLogger implements Logger {
private static final NoopLoggerBuilder INSTANCE = new NoopLoggerBuilder();
private static final NoopLogger NOOP_LOGGER = new NoopLogger();
private static final Logger INSTANCE = new DefaultLogger();
private NoopLoggerBuilder() {}
private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder();
static LoggerBuilder getInstance() {
private DefaultLogger() {}
static Logger getInstance() {
return INSTANCE;
}
@Override
public LoggerBuilder setSchemaUrl(String schemaUrl) {
return this;
public LogRecordBuilder logRecordBuilder() {
return NOOP_LOG_RECORD_BUILDER;
}
@Override
public LoggerBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
return this;
}
@Override
public Logger build() {
return NOOP_LOGGER;
}
private static class NoopLogger implements Logger {
private static final NoopLogRecordBuilder NOOP_LOG_BUILDER = new NoopLogRecordBuilder();
private NoopLogger() {}
@Override
public LogRecordBuilder logRecordBuilder() {
return NOOP_LOG_BUILDER;
}
}
private static class NoopLogRecordBuilder implements LogRecordBuilder {
private static final class NoopLogRecordBuilder implements LogRecordBuilder {
private NoopLogRecordBuilder() {}

View File

@ -0,0 +1,43 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.logs;
class DefaultLoggerProvider implements LoggerProvider {
private static final LoggerProvider INSTANCE = new DefaultLoggerProvider();
private static final LoggerBuilder NOOP_BUILDER = new NoopLoggerBuilder();
private DefaultLoggerProvider() {}
static LoggerProvider getInstance() {
return INSTANCE;
}
@Override
public LoggerBuilder loggerBuilder(String instrumentationScopeName) {
return NOOP_BUILDER;
}
private static class NoopLoggerBuilder implements LoggerBuilder {
private NoopLoggerBuilder() {}
@Override
public LoggerBuilder setSchemaUrl(String schemaUrl) {
return this;
}
@Override
public LoggerBuilder setInstrumentationVersion(String instrumentationVersion) {
return this;
}
@Override
public Logger build() {
return DefaultLogger.getInstance();
}
}
}

View File

@ -0,0 +1,34 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.logs;
import io.opentelemetry.api.GlobalOpenTelemetry;
/**
* This class provides a temporary global accessor for {@link LoggerProvider} until the log API is
* marked stable. It will eventually be merged into {@link GlobalOpenTelemetry}.
*/
public final class GlobalLoggerProvider {
private static volatile LoggerProvider globalLoggerProvider = DefaultLoggerProvider.getInstance();
private GlobalLoggerProvider() {}
/** Returns the globally registered {@link LoggerProvider}. */
public static LoggerProvider get() {
return globalLoggerProvider;
}
/**
* Sets the global {@link LoggerProvider}. Future calls to {@link #get()} will return the provided
* {@link LoggerProvider} instance. This should be called once as early as possible in your
* application initialization logic.
*/
public static void set(LoggerProvider loggerProvider) {
globalLoggerProvider =
loggerProvider == null ? DefaultLoggerProvider.getInstance() : loggerProvider;
}
}

View File

@ -3,20 +3,19 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs;
package io.opentelemetry.api.logs;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.logs.data.Severity;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
/**
* Used to construct and emit logs from a {@link Logger}.
* Used to construct and emit log records from a {@link Logger}.
*
* <p>Obtain a {@link Logger#logRecordBuilder()}, add properties using the setters, and emit the log
* to downstream {@link LogProcessor}(s) by calling {@link #emit()}.
* record by calling {@link #emit()}.
*/
public interface LogRecordBuilder {
@ -55,6 +54,6 @@ public interface LogRecordBuilder {
/** Sets an attribute. */
<T> LogRecordBuilder setAttribute(AttributeKey<T> key, T value);
/** Emit the log to downstream {@link LogProcessor}(s). */
/** Emit the log record. */
void emit();
}

View File

@ -3,15 +3,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs;
package io.opentelemetry.api.logs;
import javax.annotation.concurrent.ThreadSafe;
/**
* A {@link Logger} is the entry point into a log pipeline.
*
* <p>Obtain a {@link #logRecordBuilder()}, add properties using the setters, and emit it to
* downstream {@link LogProcessor}(s) via {@link LogRecordBuilder#emit()}.
* <p>Obtain a {@link #logRecordBuilder()}, add properties using the setters, and emit it via {@link
* LogRecordBuilder#emit()}.
*/
@ThreadSafe
public interface Logger {
@ -19,8 +19,12 @@ public interface Logger {
/**
* Return a {@link LogRecordBuilder} to emit a log record.
*
* <p>Build the log record using the {@link LogRecordBuilder} setters, and emit it to downstream
* {@link LogProcessor}(s) via {@link LogRecordBuilder#emit()}.
* <p><b>IMPORTANT:</b> this should be used to write appenders to bridge logs from logging
* frameworks (e.g. SLF4J, Log4j, JUL, Logback, etc). It is <b>NOT</b> a replacement for an
* application logging framework, and should not be used by application developers.
*
* <p>Build the log record using the {@link LogRecordBuilder} setters, and emit via {@link
* LogRecordBuilder#emit()}.
*/
LogRecordBuilder logRecordBuilder();
}

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs;
package io.opentelemetry.api.logs;
/** Builder class for creating {@link Logger} instances. */
public interface LoggerBuilder {

View File

@ -0,0 +1,54 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.logs;
import javax.annotation.concurrent.ThreadSafe;
/**
* A registry for creating scoped {@link Logger}s. The name <i>Provider</i> is for consistency with
* other languages and it is <b>NOT</b> loaded using reflection.
*
* <p>The OpenTelemetry logging API exists to satisfy two use cases:
*
* <ol>
* <li>Enable the creation of log appenders, which bridge logs from other log frameworks (e.g.
* SLF4J, Log4j, JUL, Logback, etc) into OpenTelemetry via {@link Logger#logRecordBuilder()}.
* It is <b>NOT</b> a replacement log framework.
* <li>Enable emitting structured <a
* href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/semantic_conventions/events.md">events</a>.
* TODO: add link when event API is added.
* </ol>
*
* @see Logger
*/
@ThreadSafe
public interface LoggerProvider {
/**
* Gets or creates a named Logger instance.
*
* @param instrumentationScopeName A name uniquely identifying the instrumentation scope, such as
* the instrumentation library, package, or fully qualified class name. Must not be null.
* @return a Logger instance.
*/
default Logger get(String instrumentationScopeName) {
return loggerBuilder(instrumentationScopeName).build();
}
/**
* Creates a LoggerBuilder for a named Logger instance.
*
* @param instrumentationScopeName A name uniquely identifying the instrumentation scope, such as
* the instrumentation library, package, or fully qualified class name. Must not be null.
* @return a LoggerBuilder instance.
*/
LoggerBuilder loggerBuilder(String instrumentationScopeName);
/** Returns a no-op {@link LoggerProvider} which provides Loggers which do not record or emit. */
static LoggerProvider noop() {
return DefaultLoggerProvider.getInstance();
}
}

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs.data;
package io.opentelemetry.api.logs;
public enum Severity {
UNDEFINED_SEVERITY_NUMBER(0),

View File

@ -0,0 +1,31 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.logs;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import org.junit.jupiter.api.Test;
class DefaultLoggerProviderTest {
@Test
void noopLoggerProvider_doesNotThrow() {
LoggerProvider provider = LoggerProvider.noop();
assertThat(provider).isSameAs(DefaultLoggerProvider.getInstance());
assertThatCode(() -> provider.get("scope-name")).doesNotThrowAnyException();
assertThatCode(
() ->
provider
.loggerBuilder("scope-name")
.setInstrumentationVersion("1.0")
.setSchemaUrl("http://schema.com")
.build())
.doesNotThrowAnyException();
;
}
}

View File

@ -0,0 +1,38 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.api.logs;
import static org.assertj.core.api.Assertions.assertThatCode;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.context.Context;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
class DefaultLoggerTest {
private static final Logger logger = DefaultLogger.getInstance();
@Test
void buildAndEmit() {
assertThatCode(
() ->
logger
.logRecordBuilder()
.setEpoch(100, TimeUnit.SECONDS)
.setEpoch(Instant.now())
.setContext(Context.root())
.setSeverity(Severity.DEBUG)
.setSeverityText("debug")
.setBody("body")
.setAttribute(AttributeKey.stringKey("key1"), "value1")
.setAllAttributes(Attributes.builder().put("key2", "value2").build())
.emit())
.doesNotThrowAnyException();
}
}

View File

@ -12,13 +12,13 @@ import static org.assertj.core.api.Assertions.assertThat;
import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;

View File

@ -11,13 +11,13 @@ import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.time.LocalDateTime;

View File

@ -5,6 +5,7 @@
package io.opentelemetry.exporter.internal.otlp.logs;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
@ -17,7 +18,6 @@ import io.opentelemetry.exporter.internal.otlp.KeyValueMarshaler;
import io.opentelemetry.exporter.internal.otlp.StringAnyValueMarshaler;
import io.opentelemetry.proto.logs.v1.internal.LogRecord;
import io.opentelemetry.proto.logs.v1.internal.SeverityNumber;
import io.opentelemetry.sdk.logs.data.Severity;
import java.io.IOException;
import javax.annotation.Nullable;

View File

@ -14,6 +14,7 @@ import com.google.protobuf.util.JsonFormat;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.internal.OtelEncodingUtils;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
@ -27,7 +28,6 @@ import io.opentelemetry.proto.logs.v1.LogRecord;
import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.proto.logs.v1.ScopeLogs;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.ByteArrayOutputStream;

View File

@ -22,6 +22,7 @@ import com.linecorp.armeria.testing.junit5.server.mock.MockWebServerExtension;
import com.linecorp.armeria.testing.junit5.server.mock.RecordedRequest;
import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.exporter.internal.okhttp.OkHttpExporter;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
import io.opentelemetry.exporter.internal.retry.RetryPolicy;
@ -33,7 +34,6 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.ByteArrayOutputStream;

View File

@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporter;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
@ -19,7 +20,6 @@ import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.Closeable;

View File

@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThatCode;
import io.grpc.inprocess.InProcessChannelBuilder;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.exporter.internal.grpc.UpstreamGrpcExporter;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
@ -21,7 +22,6 @@ import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.Closeable;

View File

@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import io.grpc.inprocess.InProcessChannelBuilder;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.exporter.internal.grpc.UpstreamGrpcExporter;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
@ -18,7 +19,6 @@ import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.Closeable;

View File

@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import io.grpc.inprocess.InProcessChannelBuilder;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.exporter.internal.grpc.UpstreamGrpcExporter;
import io.opentelemetry.exporter.internal.marshal.Marshaler;
import io.opentelemetry.exporter.internal.otlp.logs.ResourceLogsMarshaler;
@ -18,7 +19,6 @@ import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
import io.opentelemetry.proto.logs.v1.ResourceLogs;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.io.Closeable;

View File

@ -18,6 +18,8 @@ import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.trace.Span;
@ -53,9 +55,7 @@ import io.opentelemetry.proto.metrics.v1.Sum;
import io.opentelemetry.proto.trace.v1.ResourceSpans;
import io.opentelemetry.proto.trace.v1.ScopeSpans;
import io.opentelemetry.proto.trace.v1.Span.Link;
import io.opentelemetry.sdk.logs.Logger;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.logs.export.LogExporter;
import io.opentelemetry.sdk.logs.export.SimpleLogProcessor;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;

View File

@ -8,6 +8,7 @@ package io.opentelemetry.sdk.autoconfigure;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.logs.GlobalLoggerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.OpenTelemetrySdk;
@ -388,6 +389,7 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
if (setResultAsGlobal) {
GlobalOpenTelemetry.set(openTelemetrySdk);
GlobalLoggerProvider.set(openTelemetrySdk.getSdkLoggerProvider());
logger.log(
Level.FINE, "Global OpenTelemetry set to {0} by autoconfiguration", openTelemetrySdk);
}

View File

@ -16,6 +16,7 @@ import static org.mockito.Mockito.when;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.logs.GlobalLoggerProvider;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceId;
@ -287,9 +288,10 @@ class AutoConfiguredOpenTelemetrySdkTest {
void builder_setResultAsGlobalFalse() {
GlobalOpenTelemetry.set(OpenTelemetry.noop());
OpenTelemetry openTelemetry = builder.setResultAsGlobal(false).build().getOpenTelemetrySdk();
OpenTelemetrySdk openTelemetry = builder.setResultAsGlobal(false).build().getOpenTelemetrySdk();
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isNotSameAs(openTelemetry);
assertThat(GlobalLoggerProvider.get()).isNotSameAs(openTelemetry.getSdkLoggerProvider());
}
@Test
@ -297,6 +299,7 @@ class AutoConfiguredOpenTelemetrySdkTest {
OpenTelemetrySdk openTelemetry = builder.setResultAsGlobal(true).build().getOpenTelemetrySdk();
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isSameAs(openTelemetry);
assertThat(GlobalLoggerProvider.get()).isSameAs(openTelemetry.getSdkLoggerProvider());
}
private static Supplier<Map<String, String>> disableExportPropertySupplier() {

View File

@ -18,6 +18,8 @@ import io.grpc.stub.StreamObserver;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.extension.aws.AwsXrayPropagator;
@ -39,8 +41,6 @@ import io.opentelemetry.proto.logs.v1.LogRecord;
import io.opentelemetry.proto.metrics.v1.Metric;
import io.opentelemetry.proto.metrics.v1.ResourceMetrics;
import io.opentelemetry.proto.metrics.v1.ScopeMetrics;
import io.opentelemetry.sdk.logs.Logger;
import io.opentelemetry.sdk.logs.data.Severity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -155,7 +155,7 @@ class FullConfigTest {
System.setProperty("otel.exporter.otlp.endpoint", endpoint);
System.setProperty("otel.exporter.otlp.timeout", "10000");
// Initialize here so we get SdkLoggerProvider and shutdown when done
// Initialize here so we can shutdown when done
autoConfiguredOpenTelemetrySdk = AutoConfiguredOpenTelemetrySdk.initialize();
}

View File

@ -5,11 +5,11 @@
package io.opentelemetry.sdk.autoconfigure;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.logs.export.LogExporter;
import java.util.Collection;
import java.util.stream.Collectors;

View File

@ -10,10 +10,10 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.asser
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import java.util.Map;
import java.util.function.Consumer;

View File

@ -7,11 +7,11 @@ package io.opentelemetry.sdk.testing.logs;
import com.google.auto.value.AutoValue;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.Body;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import java.time.Instant;
import java.util.concurrent.TimeUnit;

View File

@ -12,12 +12,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.util.Arrays;

View File

@ -9,6 +9,7 @@ description = "OpenTelemetry Log SDK"
otelJava.moduleName.set("io.opentelemetry.sdk.logs")
dependencies {
api(project(":api:logs"))
api(project(":sdk:common"))
testImplementation(project(":sdk:logs-testing"))

View File

@ -5,6 +5,8 @@
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import java.io.Closeable;
import java.util.ArrayList;

View File

@ -7,11 +7,11 @@ package io.opentelemetry.sdk.logs;
import com.google.auto.value.AutoValue;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.Body;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

View File

@ -6,13 +6,14 @@
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.internal.AttributesMap;
import io.opentelemetry.sdk.logs.data.Body;
import io.opentelemetry.sdk.logs.data.Severity;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;

View File

@ -5,6 +5,8 @@
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
/** SDK implementation of {@link Logger}. */

View File

@ -5,6 +5,7 @@
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.logs.LoggerBuilder;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.common.InstrumentationScopeInfoBuilder;
import io.opentelemetry.sdk.internal.ComponentRegistry;

View File

@ -5,6 +5,9 @@
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.LoggerBuilder;
import io.opentelemetry.api.logs.LoggerProvider;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.internal.ComponentRegistry;
@ -15,8 +18,8 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.logging.Level;
/** SDK registry for creating {@link Logger}s. */
public final class SdkLoggerProvider implements Closeable {
/** SDK implementation for {@link LoggerProvider}. */
public final class SdkLoggerProvider implements LoggerProvider, Closeable {
static final String DEFAULT_LOGGER_NAME = "unknown";
private static final java.util.logging.Logger LOGGER =
@ -55,6 +58,7 @@ public final class SdkLoggerProvider implements Closeable {
* the instrumentation library, package, or fully qualified class name. Must not be null.
* @return a logger instance
*/
@Override
public Logger get(String instrumentationScopeName) {
return loggerBuilder(instrumentationScopeName).build();
}
@ -65,9 +69,10 @@ public final class SdkLoggerProvider implements Closeable {
* @param instrumentationScopeName the name of the instrumentation scope
* @return a logger builder instance
*/
@Override
public LoggerBuilder loggerBuilder(String instrumentationScopeName) {
if (isNoopLogProcessor) {
return NoopLoggerBuilder.getInstance();
return LoggerProvider.noop().loggerBuilder(instrumentationScopeName);
}
if (instrumentationScopeName == null || instrumentationScopeName.isEmpty()) {
LOGGER.fine("Logger requested without instrumentation scope name.");

View File

@ -7,6 +7,8 @@ package io.opentelemetry.sdk.logs;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.resources.Resource;

View File

@ -8,12 +8,12 @@ package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.internal.GuardedBy;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.internal.AttributesMap;
import io.opentelemetry.sdk.logs.data.Body;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;

View File

@ -6,6 +6,7 @@
package io.opentelemetry.sdk.logs.data;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.LogLimits;

View File

@ -1,34 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.logs;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.logs.data.Severity;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
class NoopLoggerBuilderTest {
@Test
void buildAndEmit() {
NoopLoggerBuilder.getInstance()
.setSchemaUrl("http://endpoint")
.setInstrumentationVersion("1.0.0")
.build()
.logRecordBuilder()
.setAttribute(AttributeKey.stringKey("key"), "value")
.setEpoch(Instant.now())
.setEpoch(100, TimeUnit.SECONDS)
.setSeverity(Severity.DEBUG)
.setSeverityText("debug")
.setContext(Context.root())
.setBody("body")
.emit();
;
}
}

View File

@ -11,6 +11,7 @@ import static org.mockito.Mockito.when;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
@ -19,7 +20,6 @@ import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.Body;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import java.time.Instant;
import java.util.concurrent.TimeUnit;

View File

@ -14,6 +14,8 @@ import static org.mockito.Mockito.when;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.logs.LoggerProvider;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.TraceFlags;
@ -24,7 +26,6 @@ import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.resources.Resource;
import java.util.ArrayList;
import java.util.List;
@ -208,7 +209,7 @@ class SdkLoggerProviderTest {
@Test
void loggerBuilder_NoProcessor_UsesNoop() {
assertThat(SdkLoggerProvider.builder().build().loggerBuilder("test"))
.isInstanceOf(NoopLoggerBuilder.class);
.isSameAs(LoggerProvider.noop().loggerBuilder("test"));
}
@Test

View File

@ -21,6 +21,7 @@ import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.api.internal.StringUtils;
import io.opentelemetry.api.logs.LogRecordBuilder;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;

View File

@ -5,10 +5,10 @@
package io.opentelemetry.sdk.logs.export;
import static io.opentelemetry.sdk.logs.data.Severity.DEBUG;
import static io.opentelemetry.api.logs.Severity.DEBUG;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.sdk.logs.Logger;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.testing.assertj.LogAssertions;

View File

@ -10,10 +10,10 @@ import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.data.LogData;
import io.opentelemetry.sdk.logs.data.Severity;
import io.opentelemetry.sdk.testing.logs.TestLogData;
import java.util.Arrays;
import java.util.Collections;

View File

@ -22,6 +22,7 @@ dependencyResolutionManagement {
rootProject.name = "opentelemetry-java"
include(":all")
include(":api:all")
include(":api:logs")
include(":semconv")
include(":bom")
include(":bom-alpha")