From b6ea470afd9a4913413364b86f04abc7e73f1839 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 2 Oct 2024 15:00:41 -0700 Subject: [PATCH 1/6] Prototype: User facing logs API (including emit event) --- .../io/opentelemetry/api/OpenTelemetry.java | 14 ++ .../opentelemetry/api/logs/DefaultLogger.java | 43 +++++ .../opentelemetry/api/logs/EventBuilder.java | 152 ++++++++++++++++++ .../io/opentelemetry/api/logs/Logger.java | 11 ++ .../incubator/logs/ExtendedDefaultLogger.java | 44 +++++ .../sdk/logs/SdkEventBuilder.java | 86 ++++++++++ .../io/opentelemetry/sdk/logs/SdkLogger.java | 16 ++ 7 files changed, 366 insertions(+) create mode 100644 api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java create mode 100644 sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java diff --git a/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java index 673c6e429eb..6c7e3a94bf8 100644 --- a/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/OpenTelemetry.java @@ -5,6 +5,8 @@ package io.opentelemetry.api; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.LoggerBuilder; import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterBuilder; @@ -114,6 +116,18 @@ default MeterBuilder meterBuilder(String instrumentationScopeName) { return getMeterProvider().meterBuilder(instrumentationScopeName); } + default LoggerProvider getLoggerProvider() { + return LoggerProvider.noop(); + } + + default Logger getLogger(String instrumentationScopeName) { + return getLoggerProvider().get(instrumentationScopeName); + } + + default LoggerBuilder getLoggerBuilder(String instrumentationScopeName) { + return getLoggerProvider().loggerBuilder(instrumentationScopeName); + } + /** * Returns the {@link LoggerProvider} for bridging logs into OpenTelemetry. * diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index 56284b43cb2..7e518060fb5 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.logs; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; import io.opentelemetry.context.Context; import java.time.Instant; @@ -15,6 +16,7 @@ class DefaultLogger implements Logger { private static final Logger INSTANCE = new DefaultLogger(); private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder(); + private static final EventBuilder NOOP_EVENT_BUILDER = new NoopEventBuilder(); private DefaultLogger() {} @@ -27,6 +29,11 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOG_RECORD_BUILDER; } + @Override + public EventBuilder eventBuilder(String eventName) { + return NOOP_EVENT_BUILDER; + } + private static final class NoopLogRecordBuilder implements LogRecordBuilder { private NoopLogRecordBuilder() {} @@ -84,4 +91,40 @@ public LogRecordBuilder setAttribute(AttributeKey key, T value) { @Override public void emit() {} } + + private static class NoopEventBuilder implements EventBuilder { + + @Override + public EventBuilder put(String key, Value value) { + return this; + } + + @Override + public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { + return this; + } + + @Override + public EventBuilder setTimestamp(Instant instant) { + return this; + } + + @Override + public EventBuilder setContext(Context context) { + return this; + } + + @Override + public EventBuilder setSeverity(Severity severity) { + return this; + } + + @Override + public EventBuilder setAttributes(Attributes attributes) { + return this; + } + + @Override + public void emit() {} + } } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java b/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java new file mode 100644 index 00000000000..dd42df9aa98 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java @@ -0,0 +1,152 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.logs; + +import static java.util.stream.Collectors.toList; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.Value; +import io.opentelemetry.context.Context; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** The EventBuilder is used to {@link #emit()} events. */ +public interface EventBuilder { + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, String value) { + return put(key, Value.of(value)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, long value) { + return put(key, Value.of(value)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, double value) { + return put(key, Value.of(value)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, boolean value) { + return put(key, Value.of(value)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, String... value) { + List> values = new ArrayList<>(value.length); + for (String val : value) { + values.add(Value.of(val)); + } + return put(key, Value.of(values)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, long... value) { + List> values = new ArrayList<>(value.length); + for (long val : value) { + values.add(Value.of(val)); + } + return put(key, Value.of(values)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, double... value) { + List> values = new ArrayList<>(value.length); + for (double val : value) { + values.add(Value.of(val)); + } + return put(key, Value.of(values)); + } + + /** Put the given {@code key} and {@code value} in the payload. */ + default EventBuilder put(String key, boolean... value) { + List> values = new ArrayList<>(value.length); + for (boolean val : value) { + values.add(Value.of(val)); + } + return put(key, Value.of(values)); + } + + /** + * Put the given key and value in the payload. + * + *

NOTE: The key value pair is NOT added to the event attributes. Setting event attributes is + * less common than adding entries to the event payload. Use {@link #setAttributes(Attributes)} if + * intending the data to be set in attributes instead of the payload. + */ + @SuppressWarnings("unchecked") + default EventBuilder put(AttributeKey key, T value) { + switch (key.getType()) { + case STRING: + return put(key.getKey(), (String) value); + case BOOLEAN: + return put(key.getKey(), (boolean) value); + case LONG: + return put(key.getKey(), (long) value); + case DOUBLE: + return put(key.getKey(), (double) value); + case STRING_ARRAY: + return put( + key.getKey(), + Value.of(((List) value).stream().map(Value::of).collect(toList()))); + case BOOLEAN_ARRAY: + return put( + key.getKey(), + Value.of(((List) value).stream().map(Value::of).collect(toList()))); + case LONG_ARRAY: + return put( + key.getKey(), Value.of(((List) value).stream().map(Value::of).collect(toList()))); + case DOUBLE_ARRAY: + return put( + key.getKey(), + Value.of(((List) value).stream().map(Value::of).collect(toList()))); + } + return this; + } + + /** Put the given {@code key} and {@code value} in the payload. */ + EventBuilder put(String key, Value value); + + /** + * Set the epoch {@code timestamp}, using the timestamp and unit. + * + *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to + * the current time when {@link #emit()} is called. + */ + EventBuilder setTimestamp(long timestamp, TimeUnit unit); + + /** + * Set the epoch {@code timestamp}, using the instant. + * + *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to + * the current time when {@link #emit()} is called. + */ + EventBuilder setTimestamp(Instant instant); + + /** Set the context. */ + EventBuilder setContext(Context context); + + /** Set the severity. */ + EventBuilder setSeverity(Severity severity); + + /** + * Set the attributes. + * + *

Event {@link Attributes} provide additional details about the Event which are not part of + * the well-defined {@link Value} payload. Setting event attributes is less common than adding + * entries to the event payload. Most users will want to call one of the {@code #put(String, ?)} + * methods instead. + */ + EventBuilder setAttributes(Attributes attributes); + + /** Emit an event. */ + void emit(); +} diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java index 50b8035bb5d..14ac25ab480 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java @@ -33,4 +33,15 @@ public interface Logger { * LogRecordBuilder#emit()}. */ LogRecordBuilder logRecordBuilder(); + + /** + * Return a {@link LogRecordBuilder} to emit an event. + * + * @param eventName the event name, which identifies the class or type of event. Event with the + * same name are structurally similar to one another. Event names are subject to the same + * naming rules as attribute names. Notably, they are namespaced to avoid collisions. See event.name semantic + * conventions for more details. + */ + EventBuilder eventBuilder(String eventName); } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java index 3e8dce08e74..d7923425bc7 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java @@ -6,7 +6,9 @@ package io.opentelemetry.api.incubator.logs; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.logs.EventBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.Severity; @@ -18,6 +20,7 @@ class ExtendedDefaultLogger implements ExtendedLogger { private static final Logger INSTANCE = new ExtendedDefaultLogger(); private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder(); + private static final EventBuilder NOOP_EVENT_BUILDER = new NoopEventBuilder(); private ExtendedDefaultLogger() {} @@ -30,6 +33,11 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOG_RECORD_BUILDER; } + @Override + public EventBuilder eventBuilder(String eventName) { + return NOOP_EVENT_BUILDER; + } + private static final class NoopLogRecordBuilder implements ExtendedLogRecordBuilder { private NoopLogRecordBuilder() {} @@ -87,4 +95,40 @@ public LogRecordBuilder setAttribute(AttributeKey key, T value) { @Override public void emit() {} } + + private static class NoopEventBuilder implements EventBuilder { + + @Override + public EventBuilder put(String key, Value value) { + return this; + } + + @Override + public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { + return this; + } + + @Override + public EventBuilder setTimestamp(Instant instant) { + return this; + } + + @Override + public EventBuilder setContext(Context context) { + return this; + } + + @Override + public EventBuilder setSeverity(Severity severity) { + return this; + } + + @Override + public EventBuilder setAttributes(Attributes attributes) { + return this; + } + + @Override + public void emit() {} + } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java new file mode 100644 index 00000000000..cdceb261a56 --- /dev/null +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java @@ -0,0 +1,86 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.logs.EventBuilder; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.common.Clock; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +class SdkEventBuilder implements EventBuilder { + + private static final AttributeKey EVENT_NAME = AttributeKey.stringKey("event.name"); + + private final Map> payload = new HashMap<>(); + private final Clock clock; + private final LogRecordBuilder logRecordBuilder; + private final String eventName; + private boolean hasTimestamp = false; + + SdkEventBuilder(Clock clock, LogRecordBuilder logRecordBuilder, String eventName) { + this.clock = clock; + this.logRecordBuilder = logRecordBuilder; + this.eventName = eventName; + } + + @Override + public EventBuilder put(String key, Value value) { + payload.put(key, value); + return this; + } + + @Override + public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { + this.logRecordBuilder.setTimestamp(timestamp, unit); + this.hasTimestamp = true; + return this; + } + + @Override + public EventBuilder setTimestamp(Instant instant) { + this.logRecordBuilder.setTimestamp(instant); + this.hasTimestamp = true; + return this; + } + + @Override + public EventBuilder setContext(Context context) { + logRecordBuilder.setContext(context); + return this; + } + + @Override + public EventBuilder setSeverity(Severity severity) { + logRecordBuilder.setSeverity(severity); + return this; + } + + @Override + public EventBuilder setAttributes(Attributes attributes) { + logRecordBuilder.setAllAttributes(attributes); + return this; + } + + @Override + public void emit() { + if (!payload.isEmpty()) { + logRecordBuilder.setBody(Value.of(payload)); + } + if (!hasTimestamp) { + logRecordBuilder.setTimestamp(clock.now(), TimeUnit.NANOSECONDS); + } + logRecordBuilder.setAttribute(EVENT_NAME, eventName); + logRecordBuilder.emit(); + } +} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java index 72fb9f0b356..9d8c3f92db1 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java @@ -6,15 +6,20 @@ package io.opentelemetry.sdk.logs; import io.opentelemetry.api.incubator.logs.ExtendedLogger; +import io.opentelemetry.api.logs.EventBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.LoggerProvider; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.internal.LoggerConfig; /** SDK implementation of {@link Logger}. */ final class SdkLogger implements ExtendedLogger { + private static final Severity DEFAULT_EVENT_SEVERITY = Severity.INFO; + private static final Logger NOOP_LOGGER = LoggerProvider.noop().get("noop"); private final LoggerSharedState loggerSharedState; @@ -38,6 +43,17 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOGGER.logRecordBuilder(); } + @Override + public EventBuilder eventBuilder(String eventName) { + if (loggerEnabled) { + return new SdkEventBuilder( + loggerSharedState.getClock(), + logRecordBuilder().setSeverity(DEFAULT_EVENT_SEVERITY).setContext(Context.current()), + eventName); + } + return NOOP_LOGGER.eventBuilder(eventName); + } + // VisibleForTesting InstrumentationScopeInfo getInstrumentationScopeInfo() { return instrumentationScopeInfo; From ee5a5b7dc4f17d7494eb61e79b9872c1d64f50b3 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 2 Oct 2024 18:48:33 -0700 Subject: [PATCH 2/6] no-op default --- api/all/src/main/java/io/opentelemetry/api/logs/Logger.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java index 14ac25ab480..f5b63ed839b 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java @@ -43,5 +43,7 @@ public interface Logger { * href="https://opentelemetry.io/docs/specs/semconv/general/events/">event.name semantic * conventions for more details. */ - EventBuilder eventBuilder(String eventName); + default EventBuilder eventBuilder(String eventName) { + return DefaultLogger.getInstance().eventBuilder(eventName); + } } From 6556acff5fc9ff98280c52f8451a485d982f5866 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 27 Oct 2024 19:48:47 -0700 Subject: [PATCH 3/6] Change EventBuilder put to setBody --- .../opentelemetry/api/logs/DefaultLogger.java | 2 +- .../opentelemetry/api/logs/EventBuilder.java | 101 +----------------- .../incubator/logs/ExtendedDefaultLogger.java | 2 +- .../sdk/logs/SdkEventBuilder.java | 10 +- 4 files changed, 5 insertions(+), 110 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index 7e518060fb5..aae36638ec5 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -95,7 +95,7 @@ public void emit() {} private static class NoopEventBuilder implements EventBuilder { @Override - public EventBuilder put(String key, Value value) { + public EventBuilder setBody(Value body) { return this; } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java b/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java index dd42df9aa98..82e565efb0a 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java @@ -5,115 +5,16 @@ package io.opentelemetry.api.logs; -import static java.util.stream.Collectors.toList; - -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; import io.opentelemetry.context.Context; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.TimeUnit; /** The EventBuilder is used to {@link #emit()} events. */ public interface EventBuilder { - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, String value) { - return put(key, Value.of(value)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, long value) { - return put(key, Value.of(value)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, double value) { - return put(key, Value.of(value)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, boolean value) { - return put(key, Value.of(value)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, String... value) { - List> values = new ArrayList<>(value.length); - for (String val : value) { - values.add(Value.of(val)); - } - return put(key, Value.of(values)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, long... value) { - List> values = new ArrayList<>(value.length); - for (long val : value) { - values.add(Value.of(val)); - } - return put(key, Value.of(values)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, double... value) { - List> values = new ArrayList<>(value.length); - for (double val : value) { - values.add(Value.of(val)); - } - return put(key, Value.of(values)); - } - - /** Put the given {@code key} and {@code value} in the payload. */ - default EventBuilder put(String key, boolean... value) { - List> values = new ArrayList<>(value.length); - for (boolean val : value) { - values.add(Value.of(val)); - } - return put(key, Value.of(values)); - } - - /** - * Put the given key and value in the payload. - * - *

NOTE: The key value pair is NOT added to the event attributes. Setting event attributes is - * less common than adding entries to the event payload. Use {@link #setAttributes(Attributes)} if - * intending the data to be set in attributes instead of the payload. - */ - @SuppressWarnings("unchecked") - default EventBuilder put(AttributeKey key, T value) { - switch (key.getType()) { - case STRING: - return put(key.getKey(), (String) value); - case BOOLEAN: - return put(key.getKey(), (boolean) value); - case LONG: - return put(key.getKey(), (long) value); - case DOUBLE: - return put(key.getKey(), (double) value); - case STRING_ARRAY: - return put( - key.getKey(), - Value.of(((List) value).stream().map(Value::of).collect(toList()))); - case BOOLEAN_ARRAY: - return put( - key.getKey(), - Value.of(((List) value).stream().map(Value::of).collect(toList()))); - case LONG_ARRAY: - return put( - key.getKey(), Value.of(((List) value).stream().map(Value::of).collect(toList()))); - case DOUBLE_ARRAY: - return put( - key.getKey(), - Value.of(((List) value).stream().map(Value::of).collect(toList()))); - } - return this; - } - - /** Put the given {@code key} and {@code value} in the payload. */ - EventBuilder put(String key, Value value); + EventBuilder setBody(Value body); /** * Set the epoch {@code timestamp}, using the timestamp and unit. diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java index d7923425bc7..32237d19949 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java @@ -99,7 +99,7 @@ public void emit() {} private static class NoopEventBuilder implements EventBuilder { @Override - public EventBuilder put(String key, Value value) { + public EventBuilder setBody(Value body) { return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java index cdceb261a56..dfa62610ccd 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java @@ -14,15 +14,12 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.Clock; import java.time.Instant; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.TimeUnit; class SdkEventBuilder implements EventBuilder { private static final AttributeKey EVENT_NAME = AttributeKey.stringKey("event.name"); - private final Map> payload = new HashMap<>(); private final Clock clock; private final LogRecordBuilder logRecordBuilder; private final String eventName; @@ -35,8 +32,8 @@ class SdkEventBuilder implements EventBuilder { } @Override - public EventBuilder put(String key, Value value) { - payload.put(key, value); + public EventBuilder setBody(Value body) { + this.logRecordBuilder.setBody(body); return this; } @@ -74,9 +71,6 @@ public EventBuilder setAttributes(Attributes attributes) { @Override public void emit() { - if (!payload.isEmpty()) { - logRecordBuilder.setBody(Value.of(payload)); - } if (!hasTimestamp) { logRecordBuilder.setTimestamp(clock.now(), TimeUnit.NANOSECONDS); } From 59862e42577d84d110f449347b06fd57b5f32f3a Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 4 Dec 2024 13:33:58 -0800 Subject: [PATCH 4/6] Add convenience value builder --- .../io/opentelemetry/api/common/Value.java | 5 +++ .../api/common/ValueBuilder.java | 33 +++++++++++++++++++ .../api/common/ValueBuilderImpl.java | 25 ++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java create mode 100644 api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java diff --git a/api/all/src/main/java/io/opentelemetry/api/common/Value.java b/api/all/src/main/java/io/opentelemetry/api/common/Value.java index a29be801e27..01b8f994389 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/Value.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/Value.java @@ -84,6 +84,11 @@ static Value> of(Map> value) { return KeyValueList.createFromMap(value); } + /** Returns a new {@link ValueBuilder} instance for creating an arbitrary {@link Value}. */ + static ValueBuilder builder() { + return new ValueBuilderImpl(); + } + /** Returns the type of this {@link Value}. Useful for building switch statements. */ ValueType getType(); diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java new file mode 100644 index 00000000000..5da6ed477e3 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +public interface ValueBuilder { + + default ValueBuilder put(String key, String value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, long value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, double value) { + put(key, Value.of(value)); + return this; + } + + default ValueBuilder put(String key, boolean value) { + put(key, Value.of(value)); + return this; + } + + ValueBuilder put(String key, Value value); + + Value build(); +} diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java new file mode 100644 index 00000000000..0d2e784736b --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +import java.util.ArrayList; +import java.util.List; + +class ValueBuilderImpl implements ValueBuilder { + + private final List keyValues = new ArrayList<>(); + + @Override + public ValueBuilder put(String key, Value value) { + keyValues.add(KeyValue.of(key, value)); + return this; + } + + @Override + public Value build() { + return Value.of(keyValues.toArray(new KeyValue[0])); + } +} From 43066d0f68e553311ab29988049c23f4da48b7a2 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 4 Dec 2024 13:49:39 -0800 Subject: [PATCH 5/6] Rename ValueBuilder to ValueMapBuilder and add ValueListBuilder --- .../io/opentelemetry/api/common/Value.java | 9 ++++--- .../api/common/ValueListBuilder.java | 13 ++++++++++ .../api/common/ValueListBuilderImpl.java | 25 +++++++++++++++++++ ...ValueBuilder.java => ValueMapBuilder.java} | 12 ++++----- ...lderImpl.java => ValueMapBuilderImpl.java} | 4 +-- 5 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilder.java create mode 100644 api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java rename api/all/src/main/java/io/opentelemetry/api/common/{ValueBuilder.java => ValueMapBuilder.java} (53%) rename api/all/src/main/java/io/opentelemetry/api/common/{ValueBuilderImpl.java => ValueMapBuilderImpl.java} (78%) diff --git a/api/all/src/main/java/io/opentelemetry/api/common/Value.java b/api/all/src/main/java/io/opentelemetry/api/common/Value.java index 01b8f994389..d80904f0825 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/Value.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/Value.java @@ -84,9 +84,12 @@ static Value> of(Map> value) { return KeyValueList.createFromMap(value); } - /** Returns a new {@link ValueBuilder} instance for creating an arbitrary {@link Value}. */ - static ValueBuilder builder() { - return new ValueBuilderImpl(); + static ValueMapBuilder mapBuilder() { + return new ValueMapBuilderImpl(); + } + + static ValueListBuilder listBuilder() { + return new ValueListBuilderImpl(); } /** Returns the type of this {@link Value}. Useful for building switch statements. */ diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilder.java new file mode 100644 index 00000000000..c9b11fe705d --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilder.java @@ -0,0 +1,13 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +public interface ValueListBuilder { + + ValueListBuilder add(Value value); + + Value build(); +} diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java new file mode 100644 index 00000000000..fd8d2e6b6a2 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +import java.util.ArrayList; +import java.util.List; + +class ValueListBuilderImpl implements ValueListBuilder { + + private final List> values = new ArrayList<>(); + + @Override + public ValueListBuilder add(Value value) { + values.add(value); + return this; + } + + @Override + public Value build() { + return Value.of(values.toArray(new Value[0])); + } +} diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilder.java similarity index 53% rename from api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java rename to api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilder.java index 5da6ed477e3..c3558073555 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilder.java @@ -5,29 +5,29 @@ package io.opentelemetry.api.common; -public interface ValueBuilder { +public interface ValueMapBuilder { - default ValueBuilder put(String key, String value) { + default ValueMapBuilder put(String key, String value) { put(key, Value.of(value)); return this; } - default ValueBuilder put(String key, long value) { + default ValueMapBuilder put(String key, long value) { put(key, Value.of(value)); return this; } - default ValueBuilder put(String key, double value) { + default ValueMapBuilder put(String key, double value) { put(key, Value.of(value)); return this; } - default ValueBuilder put(String key, boolean value) { + default ValueMapBuilder put(String key, boolean value) { put(key, Value.of(value)); return this; } - ValueBuilder put(String key, Value value); + ValueMapBuilder put(String key, Value value); Value build(); } diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.java similarity index 78% rename from api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java rename to api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.java index 0d2e784736b..ceda8cb1d3a 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/ValueBuilderImpl.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.java @@ -8,12 +8,12 @@ import java.util.ArrayList; import java.util.List; -class ValueBuilderImpl implements ValueBuilder { +class ValueMapBuilderImpl implements ValueMapBuilder { private final List keyValues = new ArrayList<>(); @Override - public ValueBuilder put(String key, Value value) { + public ValueMapBuilder put(String key, Value value) { keyValues.add(KeyValue.of(key, value)); return this; } From 7e5809ae551cd07391c349a060b71669781f7700 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 4 Dec 2024 21:31:56 -0800 Subject: [PATCH 6/6] simplify --- .../api/common/ValueListBuilderImpl.java | 2 +- .../opentelemetry/api/logs/DefaultLogger.java | 42 +--------- .../opentelemetry/api/logs/EventBuilder.java | 53 ------------ .../io/opentelemetry/api/logs/Logger.java | 2 +- .../incubator/logs/ExtendedDefaultLogger.java | 43 +--------- .../sdk/logs/SdkEventBuilder.java | 80 ------------------- .../sdk/logs/SdkLogRecordBuilder.java | 12 ++- .../sdk/logs/SdkLogRecordData.java | 4 +- .../io/opentelemetry/sdk/logs/SdkLogger.java | 12 +-- .../sdk/logs/SdkReadWriteLogRecord.java | 14 +++- .../sdk/logs/data/LogRecordData.java | 3 + .../sdk/logs/ReadWriteLogRecordTest.java | 3 +- .../sdk/testing/logs/TestLogRecordData.java | 2 + 13 files changed, 39 insertions(+), 233 deletions(-) delete mode 100644 api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java delete mode 100644 sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java index fd8d2e6b6a2..1ae5c9fb3a3 100644 --- a/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueListBuilderImpl.java @@ -20,6 +20,6 @@ public ValueListBuilder add(Value value) { @Override public Value build() { - return Value.of(values.toArray(new Value[0])); + return Value.of(values.toArray(new Value[0])); } } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java index aae36638ec5..3628eec7133 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/DefaultLogger.java @@ -6,7 +6,6 @@ package io.opentelemetry.api.logs; import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; import io.opentelemetry.context.Context; import java.time.Instant; @@ -16,7 +15,6 @@ class DefaultLogger implements Logger { private static final Logger INSTANCE = new DefaultLogger(); private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder(); - private static final EventBuilder NOOP_EVENT_BUILDER = new NoopEventBuilder(); private DefaultLogger() {} @@ -30,8 +28,8 @@ public LogRecordBuilder logRecordBuilder() { } @Override - public EventBuilder eventBuilder(String eventName) { - return NOOP_EVENT_BUILDER; + public LogRecordBuilder eventBuilder(String eventName) { + return NOOP_LOG_RECORD_BUILDER; } private static final class NoopLogRecordBuilder implements LogRecordBuilder { @@ -91,40 +89,4 @@ public LogRecordBuilder setAttribute(AttributeKey key, T value) { @Override public void emit() {} } - - private static class NoopEventBuilder implements EventBuilder { - - @Override - public EventBuilder setBody(Value body) { - return this; - } - - @Override - public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { - return this; - } - - @Override - public EventBuilder setTimestamp(Instant instant) { - return this; - } - - @Override - public EventBuilder setContext(Context context) { - return this; - } - - @Override - public EventBuilder setSeverity(Severity severity) { - return this; - } - - @Override - public EventBuilder setAttributes(Attributes attributes) { - return this; - } - - @Override - public void emit() {} - } } diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java b/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java deleted file mode 100644 index 82e565efb0a..00000000000 --- a/api/all/src/main/java/io/opentelemetry/api/logs/EventBuilder.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.api.logs; - -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.Value; -import io.opentelemetry.context.Context; -import java.time.Instant; -import java.util.concurrent.TimeUnit; - -/** The EventBuilder is used to {@link #emit()} events. */ -public interface EventBuilder { - - EventBuilder setBody(Value body); - - /** - * Set the epoch {@code timestamp}, using the timestamp and unit. - * - *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to - * the current time when {@link #emit()} is called. - */ - EventBuilder setTimestamp(long timestamp, TimeUnit unit); - - /** - * Set the epoch {@code timestamp}, using the instant. - * - *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to - * the current time when {@link #emit()} is called. - */ - EventBuilder setTimestamp(Instant instant); - - /** Set the context. */ - EventBuilder setContext(Context context); - - /** Set the severity. */ - EventBuilder setSeverity(Severity severity); - - /** - * Set the attributes. - * - *

Event {@link Attributes} provide additional details about the Event which are not part of - * the well-defined {@link Value} payload. Setting event attributes is less common than adding - * entries to the event payload. Most users will want to call one of the {@code #put(String, ?)} - * methods instead. - */ - EventBuilder setAttributes(Attributes attributes); - - /** Emit an event. */ - void emit(); -} diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java index f5b63ed839b..8ee3e5940fb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/Logger.java @@ -43,7 +43,7 @@ public interface Logger { * href="https://opentelemetry.io/docs/specs/semconv/general/events/">event.name semantic * conventions for more details. */ - default EventBuilder eventBuilder(String eventName) { + default LogRecordBuilder eventBuilder(String eventName) { return DefaultLogger.getInstance().eventBuilder(eventName); } } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java index 32237d19949..580643b8399 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java @@ -6,9 +6,7 @@ package io.opentelemetry.api.incubator.logs; import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Value; -import io.opentelemetry.api.logs.EventBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.Severity; @@ -20,7 +18,6 @@ class ExtendedDefaultLogger implements ExtendedLogger { private static final Logger INSTANCE = new ExtendedDefaultLogger(); private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder(); - private static final EventBuilder NOOP_EVENT_BUILDER = new NoopEventBuilder(); private ExtendedDefaultLogger() {} @@ -34,8 +31,8 @@ public LogRecordBuilder logRecordBuilder() { } @Override - public EventBuilder eventBuilder(String eventName) { - return NOOP_EVENT_BUILDER; + public LogRecordBuilder eventBuilder(String eventName) { + return NOOP_LOG_RECORD_BUILDER; } private static final class NoopLogRecordBuilder implements ExtendedLogRecordBuilder { @@ -95,40 +92,4 @@ public LogRecordBuilder setAttribute(AttributeKey key, T value) { @Override public void emit() {} } - - private static class NoopEventBuilder implements EventBuilder { - - @Override - public EventBuilder setBody(Value body) { - return this; - } - - @Override - public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { - return this; - } - - @Override - public EventBuilder setTimestamp(Instant instant) { - return this; - } - - @Override - public EventBuilder setContext(Context context) { - return this; - } - - @Override - public EventBuilder setSeverity(Severity severity) { - return this; - } - - @Override - public EventBuilder setAttributes(Attributes attributes) { - return this; - } - - @Override - public void emit() {} - } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java deleted file mode 100644 index dfa62610ccd..00000000000 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkEventBuilder.java +++ /dev/null @@ -1,80 +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.api.common.Attributes; -import io.opentelemetry.api.common.Value; -import io.opentelemetry.api.logs.EventBuilder; -import io.opentelemetry.api.logs.LogRecordBuilder; -import io.opentelemetry.api.logs.Severity; -import io.opentelemetry.context.Context; -import io.opentelemetry.sdk.common.Clock; -import java.time.Instant; -import java.util.concurrent.TimeUnit; - -class SdkEventBuilder implements EventBuilder { - - private static final AttributeKey EVENT_NAME = AttributeKey.stringKey("event.name"); - - private final Clock clock; - private final LogRecordBuilder logRecordBuilder; - private final String eventName; - private boolean hasTimestamp = false; - - SdkEventBuilder(Clock clock, LogRecordBuilder logRecordBuilder, String eventName) { - this.clock = clock; - this.logRecordBuilder = logRecordBuilder; - this.eventName = eventName; - } - - @Override - public EventBuilder setBody(Value body) { - this.logRecordBuilder.setBody(body); - return this; - } - - @Override - public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { - this.logRecordBuilder.setTimestamp(timestamp, unit); - this.hasTimestamp = true; - return this; - } - - @Override - public EventBuilder setTimestamp(Instant instant) { - this.logRecordBuilder.setTimestamp(instant); - this.hasTimestamp = true; - return this; - } - - @Override - public EventBuilder setContext(Context context) { - logRecordBuilder.setContext(context); - return this; - } - - @Override - public EventBuilder setSeverity(Severity severity) { - logRecordBuilder.setSeverity(severity); - return this; - } - - @Override - public EventBuilder setAttributes(Attributes attributes) { - logRecordBuilder.setAllAttributes(attributes); - return this; - } - - @Override - public void emit() { - if (!hasTimestamp) { - logRecordBuilder.setTimestamp(clock.now(), TimeUnit.NANOSECONDS); - } - logRecordBuilder.setAttribute(EVENT_NAME, eventName); - logRecordBuilder.emit(); - } -} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index ce77d076730..05fe1bbd9f4 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -32,12 +32,21 @@ final class SdkLogRecordBuilder implements ExtendedLogRecordBuilder { @Nullable private String severityText; @Nullable private Value body; @Nullable private AttributesMap attributes; + @Nullable private final String eventName; SdkLogRecordBuilder( LoggerSharedState loggerSharedState, InstrumentationScopeInfo instrumentationScopeInfo) { + this(loggerSharedState, instrumentationScopeInfo, null); + } + + SdkLogRecordBuilder( + LoggerSharedState loggerSharedState, + InstrumentationScopeInfo instrumentationScopeInfo, + @Nullable String eventName) { this.loggerSharedState = loggerSharedState; this.logLimits = loggerSharedState.getLogLimits(); this.instrumentationScopeInfo = instrumentationScopeInfo; + this.eventName = eventName; } @Override @@ -133,6 +142,7 @@ public void emit() { severity, severityText, body, - attributes)); + attributes, + eventName)); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java index 1927a0ec572..4a39d4b1805 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java @@ -33,7 +33,8 @@ static SdkLogRecordData create( @Nullable String severityText, @Nullable Value body, Attributes attributes, - int totalAttributeCount) { + int totalAttributeCount, + @Nullable String eventName) { return new AutoValue_SdkLogRecordData( resource, instrumentationScopeInfo, @@ -44,6 +45,7 @@ static SdkLogRecordData create( severityText, attributes, totalAttributeCount, + eventName, body); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java index 9d8c3f92db1..4b47d4ff75e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogger.java @@ -6,20 +6,15 @@ package io.opentelemetry.sdk.logs; import io.opentelemetry.api.incubator.logs.ExtendedLogger; -import io.opentelemetry.api.logs.EventBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.LoggerProvider; -import io.opentelemetry.api.logs.Severity; -import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.internal.LoggerConfig; /** SDK implementation of {@link Logger}. */ final class SdkLogger implements ExtendedLogger { - private static final Severity DEFAULT_EVENT_SEVERITY = Severity.INFO; - private static final Logger NOOP_LOGGER = LoggerProvider.noop().get("noop"); private final LoggerSharedState loggerSharedState; @@ -44,12 +39,9 @@ public LogRecordBuilder logRecordBuilder() { } @Override - public EventBuilder eventBuilder(String eventName) { + public LogRecordBuilder eventBuilder(String eventName) { if (loggerEnabled) { - return new SdkEventBuilder( - loggerSharedState.getClock(), - logRecordBuilder().setSeverity(DEFAULT_EVENT_SEVERITY).setContext(Context.current()), - eventName); + return new SdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo, eventName); } return NOOP_LOGGER.eventBuilder(eventName); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java index 881f1d124ee..a8d19a3f15e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java @@ -30,6 +30,7 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { private final Severity severity; @Nullable private final String severityText; @Nullable private final Value body; + @Nullable private final String eventName; private final Object lock = new Object(); @GuardedBy("lock") @@ -46,7 +47,8 @@ private SdkReadWriteLogRecord( Severity severity, @Nullable String severityText, @Nullable Value body, - @Nullable AttributesMap attributes) { + @Nullable AttributesMap attributes, + @Nullable String eventName) { this.logLimits = logLimits; this.resource = resource; this.instrumentationScopeInfo = instrumentationScopeInfo; @@ -57,6 +59,7 @@ private SdkReadWriteLogRecord( this.severityText = severityText; this.body = body; this.attributes = attributes; + this.eventName = eventName; } /** Create the log record with the given configuration. */ @@ -70,7 +73,8 @@ static SdkReadWriteLogRecord create( Severity severity, @Nullable String severityText, @Nullable Value body, - @Nullable AttributesMap attributes) { + @Nullable AttributesMap attributes, + @Nullable String eventName) { return new SdkReadWriteLogRecord( logLimits, resource, @@ -81,7 +85,8 @@ static SdkReadWriteLogRecord create( severity, severityText, body, - attributes); + attributes, + eventName); } @Override @@ -122,7 +127,8 @@ public LogRecordData toLogRecordData() { severityText, body, getImmutableAttributes(), - attributes == null ? 0 : attributes.getTotalAddedValues()); + attributes == null ? 0 : attributes.getTotalAddedValues(), + eventName); } } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java index f21b175f52f..6cef77f48e7 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java @@ -82,4 +82,7 @@ default Value getBodyValue() { * LogLimits#getMaxNumberOfAttributes()}. */ int getTotalAttributeCount(); + + @Nullable + String getEventName(); } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java index e671372c515..f3fc9600f1e 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java @@ -68,6 +68,7 @@ SdkReadWriteLogRecord buildLogRecord() { Severity.DEBUG, "buggin", body, - initialAttributes); + initialAttributes, + null); } } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java index ec2e37294f4..e12add9050c 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java @@ -173,5 +173,7 @@ public Builder setBody(io.opentelemetry.sdk.logs.data.Body body) { /** Set the total attribute count. */ public abstract Builder setTotalAttributeCount(int totalAttributeCount); + + public abstract Builder setEventName(String eventName); } }