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/common/Value.java b/api/all/src/main/java/io/opentelemetry/api/common/Value.java index a29be801e27..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,6 +84,14 @@ static Value> of(Map> value) { return KeyValueList.createFromMap(value); } + static ValueMapBuilder mapBuilder() { + return new ValueMapBuilderImpl(); + } + + static ValueListBuilder listBuilder() { + return new ValueListBuilderImpl(); + } + /** 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/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..1ae5c9fb3a3 --- /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/ValueMapBuilder.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilder.java new file mode 100644 index 00000000000..c3558073555 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilder.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.common; + +public interface ValueMapBuilder { + + default ValueMapBuilder put(String key, String value) { + put(key, Value.of(value)); + return this; + } + + default ValueMapBuilder put(String key, long value) { + put(key, Value.of(value)); + return this; + } + + default ValueMapBuilder put(String key, double value) { + put(key, Value.of(value)); + return this; + } + + default ValueMapBuilder put(String key, boolean value) { + put(key, Value.of(value)); + return this; + } + + ValueMapBuilder put(String key, Value value); + + Value build(); +} diff --git a/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.java b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.java new file mode 100644 index 00000000000..ceda8cb1d3a --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/common/ValueMapBuilderImpl.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 ValueMapBuilderImpl implements ValueMapBuilder { + + private final List keyValues = new ArrayList<>(); + + @Override + public ValueMapBuilder 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])); + } +} 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..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 @@ -27,6 +27,11 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOG_RECORD_BUILDER; } + @Override + public LogRecordBuilder eventBuilder(String eventName) { + return NOOP_LOG_RECORD_BUILDER; + } + private static final class NoopLogRecordBuilder implements LogRecordBuilder { private NoopLogRecordBuilder() {} 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..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 @@ -33,4 +33,17 @@ 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. + */ + 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 3e8dce08e74..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 @@ -30,6 +30,11 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOG_RECORD_BUILDER; } + @Override + public LogRecordBuilder eventBuilder(String eventName) { + return NOOP_LOG_RECORD_BUILDER; + } + private static final class NoopLogRecordBuilder implements ExtendedLogRecordBuilder { private NoopLogRecordBuilder() {} 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 72fb9f0b356..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 @@ -38,6 +38,14 @@ public LogRecordBuilder logRecordBuilder() { return NOOP_LOGGER.logRecordBuilder(); } + @Override + public LogRecordBuilder eventBuilder(String eventName) { + if (loggerEnabled) { + return new SdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo, eventName); + } + return NOOP_LOGGER.eventBuilder(eventName); + } + // VisibleForTesting InstrumentationScopeInfo getInstrumentationScopeInfo() { return instrumentationScopeInfo; 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); } }