diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProvider.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProvider.java index ee1539089b..9a40ed3707 100644 --- a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProvider.java +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProvider.java @@ -16,7 +16,16 @@ public final class LogSinkSdkProvider { private final LogSink logSink = new SdkLogSink(); private final List processors = new ArrayList<>(); - private LogSinkSdkProvider() {} + /** + * Returns a new {@link LogSinkSdkProviderBuilder} for this class. + * + * @return a new {@link LogSinkSdkProviderBuilder} for this class. + */ + static LogSinkSdkProviderBuilder builder() { + return new LogSinkSdkProviderBuilder(); + } + + LogSinkSdkProvider() {} public LogSink get(String instrumentationName, String instrumentationVersion) { // Currently there is no differentiation by instrumentation library @@ -61,10 +70,4 @@ public final class LogSinkSdkProvider { } } } - - public static class Builder { - public LogSinkSdkProvider build() { - return new LogSinkSdkProvider(); - } - } } diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderBuilder.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderBuilder.java new file mode 100644 index 0000000000..fc115a6acb --- /dev/null +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderBuilder.java @@ -0,0 +1,14 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logging; + +public final class LogSinkSdkProviderBuilder { + LogSinkSdkProviderBuilder() {} + + public LogSinkSdkProvider build() { + return new LogSinkSdkProvider(); + } +} diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecord.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecord.java index 344b6ef8ad..635d443311 100644 --- a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecord.java +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecord.java @@ -7,8 +7,6 @@ package io.opentelemetry.sdk.logging.data; import com.google.auto.value.AutoValue; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.AttributesBuilder; -import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; /** @@ -19,6 +17,24 @@ import javax.annotation.Nullable; @AutoValue public abstract class LogRecord { + public static LogRecordBuilder builder() { + return new LogRecordBuilder(); + } + + static LogRecord create( + long timeUnixNano, + String traceId, + String spanId, + int flags, + Severity severity, + String severityText, + String name, + AnyValue body, + Attributes attributes) { + return new AutoValue_LogRecord( + timeUnixNano, traceId, spanId, flags, severity, severityText, name, body, attributes); + } + public abstract long getTimeUnixNano(); public abstract String getTraceId(); @@ -77,94 +93,4 @@ public abstract class LogRecord { return severityNumber; } } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private long timeUnixNano; - private String traceId = ""; - private String spanId = ""; - private int flags; - private Severity severity = Severity.UNDEFINED_SEVERITY_NUMBER; - private String severityText; - private String name; - private AnyValue body = AnyValue.stringAnyValue(""); - private final AttributesBuilder attributeBuilder = Attributes.builder(); - - public Builder setUnixTimeNano(long timestamp) { - this.timeUnixNano = timestamp; - return this; - } - - public Builder setUnixTimeMillis(long timestamp) { - return setUnixTimeNano(TimeUnit.MILLISECONDS.toNanos(timestamp)); - } - - public Builder setTraceId(String traceId) { - this.traceId = traceId; - return this; - } - - public Builder setSpanId(String spanId) { - this.spanId = spanId; - return this; - } - - public Builder setFlags(int flags) { - this.flags = flags; - return this; - } - - public Builder setSeverity(Severity severity) { - this.severity = severity; - return this; - } - - public Builder setSeverityText(String severityText) { - this.severityText = severityText; - return this; - } - - public Builder setName(String name) { - this.name = name; - return this; - } - - public Builder setBody(AnyValue body) { - this.body = body; - return this; - } - - public Builder setBody(String body) { - return setBody(AnyValue.stringAnyValue(body)); - } - - public Builder setAttributes(Attributes attributes) { - this.attributeBuilder.putAll(attributes); - return this; - } - - /** - * Build a LogRecord instance. - * - * @return value object being built - */ - public LogRecord build() { - if (timeUnixNano == 0) { - timeUnixNano = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); - } - return new AutoValue_LogRecord( - timeUnixNano, - traceId, - spanId, - flags, - severity, - severityText, - name, - body, - attributeBuilder.build()); - } - } } diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecordBuilder.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecordBuilder.java new file mode 100644 index 0000000000..476d08955e --- /dev/null +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/data/LogRecordBuilder.java @@ -0,0 +1,98 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logging.data; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import java.util.concurrent.TimeUnit; + +public final class LogRecordBuilder { + private long timeUnixNano; + private String traceId = ""; + private String spanId = ""; + private int flags; + private LogRecord.Severity severity = LogRecord.Severity.UNDEFINED_SEVERITY_NUMBER; + private String severityText; + private String name; + private AnyValue body = AnyValue.stringAnyValue(""); + private final AttributesBuilder attributeBuilder = Attributes.builder(); + + LogRecordBuilder() {} + + public LogRecordBuilder setUnixTimeNano(long timestamp) { + this.timeUnixNano = timestamp; + return this; + } + + public LogRecordBuilder setUnixTimeMillis(long timestamp) { + return setUnixTimeNano(TimeUnit.MILLISECONDS.toNanos(timestamp)); + } + + public LogRecordBuilder setTraceId(String traceId) { + this.traceId = traceId; + return this; + } + + public LogRecordBuilder setSpanId(String spanId) { + this.spanId = spanId; + return this; + } + + public LogRecordBuilder setFlags(int flags) { + this.flags = flags; + return this; + } + + public LogRecordBuilder setSeverity(LogRecord.Severity severity) { + this.severity = severity; + return this; + } + + public LogRecordBuilder setSeverityText(String severityText) { + this.severityText = severityText; + return this; + } + + public LogRecordBuilder setName(String name) { + this.name = name; + return this; + } + + public LogRecordBuilder setBody(AnyValue body) { + this.body = body; + return this; + } + + public LogRecordBuilder setBody(String body) { + return setBody(AnyValue.stringAnyValue(body)); + } + + public LogRecordBuilder setAttributes(Attributes attributes) { + this.attributeBuilder.putAll(attributes); + return this; + } + + /** + * Build a LogRecord instance. + * + * @return value object being built + */ + public LogRecord build() { + if (timeUnixNano == 0) { + timeUnixNano = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); + } + return LogRecord.create( + timeUnixNano, + traceId, + spanId, + flags, + severity, + severityText, + name, + body, + attributeBuilder.build()); + } +} diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessor.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessor.java index 7b4a6cb65a..6019f66b4d 100644 --- a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessor.java +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessor.java @@ -5,7 +5,6 @@ package io.opentelemetry.sdk.logging.export; -import io.opentelemetry.api.internal.Utils; import io.opentelemetry.api.metrics.BoundLongCounter; import io.opentelemetry.api.metrics.GlobalMetricsProvider; import io.opentelemetry.api.metrics.LongCounter; @@ -16,7 +15,6 @@ import io.opentelemetry.sdk.internal.DaemonThreadFactory; import io.opentelemetry.sdk.logging.LogProcessor; import io.opentelemetry.sdk.logging.data.LogRecord; import java.util.ArrayList; -import java.util.Objects; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; @@ -29,7 +27,7 @@ public final class BatchLogProcessor implements LogProcessor { private final Worker worker; private final Thread workerThread; - private BatchLogProcessor( + BatchLogProcessor( int maxQueueSize, long scheduleDelayMillis, int maxExportBatchSize, @@ -46,8 +44,8 @@ public final class BatchLogProcessor implements LogProcessor { this.workerThread.start(); } - public static Builder builder(LogExporter logExporter) { - return new Builder(logExporter); + public static BatchLogProcessorBuilder builder(LogExporter logExporter) { + return new BatchLogProcessorBuilder(logExporter); } @Override @@ -216,114 +214,4 @@ public final class BatchLogProcessor implements LogProcessor { } } } - - public static final class Builder { - private static final long DEFAULT_SCHEDULE_DELAY_MILLIS = 200; - private static final int DEFAULT_MAX_QUEUE_SIZE = 2048; - private static final int DEFAULT_MAX_EXPORT_BATCH_SIZE = 512; - private static final long DEFAULT_EXPORT_TIMEOUT_MILLIS = 30_000; - - private final LogExporter logExporter; - private long scheduleDelayMillis = DEFAULT_SCHEDULE_DELAY_MILLIS; - private int maxQueueSize = DEFAULT_MAX_QUEUE_SIZE; - private int maxExportBatchSize = DEFAULT_MAX_EXPORT_BATCH_SIZE; - private long exporterTimeoutMillis = DEFAULT_EXPORT_TIMEOUT_MILLIS; - - private Builder(LogExporter logExporter) { - this.logExporter = Objects.requireNonNull(logExporter, "Exporter argument can not be null"); - } - - /** - * Build a BatchLogProcessor. - * - * @return configured processor - */ - public BatchLogProcessor build() { - return new BatchLogProcessor( - maxQueueSize, - scheduleDelayMillis, - maxExportBatchSize, - exporterTimeoutMillis, - logExporter); - } - - /** - * Sets the delay interval between two consecutive exports. The actual interval may be shorter - * if the batch size is getting larger than {@code maxQueuedSpans / 2}. - * - *

Default value is {@code 250}ms. - * - * @param scheduleDelayMillis the delay interval between two consecutive exports. - * @return this. - * @see BatchLogProcessor.Builder#DEFAULT_SCHEDULE_DELAY_MILLIS - */ - public BatchLogProcessor.Builder setScheduleDelayMillis(long scheduleDelayMillis) { - this.scheduleDelayMillis = scheduleDelayMillis; - return this; - } - - public long getScheduleDelayMillis() { - return scheduleDelayMillis; - } - - /** - * Sets the maximum time an exporter will be allowed to run before being cancelled. - * - *

Default value is {@code 30000}ms - * - * @param exporterTimeoutMillis the timeout for exports in milliseconds. - * @return this - * @see BatchLogProcessor.Builder#DEFAULT_EXPORT_TIMEOUT_MILLIS - */ - public Builder setExporterTimeoutMillis(int exporterTimeoutMillis) { - this.exporterTimeoutMillis = exporterTimeoutMillis; - return this; - } - - public long getExporterTimeoutMillis() { - return exporterTimeoutMillis; - } - - /** - * Sets the maximum number of Spans that are kept in the queue before start dropping. - * - *

See the BatchSampledSpansProcessor class description for a high-level design description - * of this class. - * - *

Default value is {@code 2048}. - * - * @param maxQueueSize the maximum number of Spans that are kept in the queue before start - * dropping. - * @return this. - * @see BatchLogProcessor.Builder#DEFAULT_MAX_QUEUE_SIZE - */ - public Builder setMaxQueueSize(int maxQueueSize) { - this.maxQueueSize = maxQueueSize; - return this; - } - - public int getMaxQueueSize() { - return maxQueueSize; - } - - /** - * Sets the maximum batch size for every export. This must be smaller or equal to {@code - * maxQueuedSpans}. - * - *

Default value is {@code 512}. - * - * @param maxExportBatchSize the maximum batch size for every export. - * @return this. - * @see BatchLogProcessor.Builder#DEFAULT_MAX_EXPORT_BATCH_SIZE - */ - public Builder setMaxExportBatchSize(int maxExportBatchSize) { - Utils.checkArgument(maxExportBatchSize > 0, "maxExportBatchSize must be positive."); - this.maxExportBatchSize = maxExportBatchSize; - return this; - } - - public int getMaxExportBatchSize() { - return maxExportBatchSize; - } - } } diff --git a/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessorBuilder.java b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessorBuilder.java new file mode 100644 index 0000000000..5bfaa84e7a --- /dev/null +++ b/sdk-extensions/logging/src/main/java/io/opentelemetry/sdk/logging/export/BatchLogProcessorBuilder.java @@ -0,0 +1,115 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logging.export; + +import io.opentelemetry.api.internal.Utils; +import java.util.Objects; + +public final class BatchLogProcessorBuilder { + private static final long DEFAULT_SCHEDULE_DELAY_MILLIS = 200; + private static final int DEFAULT_MAX_QUEUE_SIZE = 2048; + private static final int DEFAULT_MAX_EXPORT_BATCH_SIZE = 512; + private static final long DEFAULT_EXPORT_TIMEOUT_MILLIS = 30_000; + + private final LogExporter logExporter; + private long scheduleDelayMillis = DEFAULT_SCHEDULE_DELAY_MILLIS; + private int maxQueueSize = DEFAULT_MAX_QUEUE_SIZE; + private int maxExportBatchSize = DEFAULT_MAX_EXPORT_BATCH_SIZE; + private long exporterTimeoutMillis = DEFAULT_EXPORT_TIMEOUT_MILLIS; + + BatchLogProcessorBuilder(LogExporter logExporter) { + this.logExporter = Objects.requireNonNull(logExporter, "Exporter argument can not be null"); + } + + /** + * Build a BatchLogProcessor. + * + * @return configured processor + */ + public BatchLogProcessor build() { + return new BatchLogProcessor( + maxQueueSize, scheduleDelayMillis, maxExportBatchSize, exporterTimeoutMillis, logExporter); + } + + /** + * Sets the delay interval between two consecutive exports. The actual interval may be shorter if + * the batch size is getting larger than {@code maxQueuedSpans / 2}. + * + *

Default value is {@code 250}ms. + * + * @param scheduleDelayMillis the delay interval between two consecutive exports. + * @return this. + * @see BatchLogProcessorBuilder#DEFAULT_SCHEDULE_DELAY_MILLIS + */ + public BatchLogProcessorBuilder setScheduleDelayMillis(long scheduleDelayMillis) { + this.scheduleDelayMillis = scheduleDelayMillis; + return this; + } + + public long getScheduleDelayMillis() { + return scheduleDelayMillis; + } + + /** + * Sets the maximum time an exporter will be allowed to run before being cancelled. + * + *

Default value is {@code 30000}ms + * + * @param exporterTimeoutMillis the timeout for exports in milliseconds. + * @return this + * @see BatchLogProcessorBuilder#DEFAULT_EXPORT_TIMEOUT_MILLIS + */ + public BatchLogProcessorBuilder setExporterTimeoutMillis(int exporterTimeoutMillis) { + this.exporterTimeoutMillis = exporterTimeoutMillis; + return this; + } + + public long getExporterTimeoutMillis() { + return exporterTimeoutMillis; + } + + /** + * Sets the maximum number of Spans that are kept in the queue before start dropping. + * + *

See the BatchSampledSpansProcessor class description for a high-level design description of + * this class. + * + *

Default value is {@code 2048}. + * + * @param maxQueueSize the maximum number of Spans that are kept in the queue before start + * dropping. + * @return this. + * @see BatchLogProcessorBuilder#DEFAULT_MAX_QUEUE_SIZE + */ + public BatchLogProcessorBuilder setMaxQueueSize(int maxQueueSize) { + this.maxQueueSize = maxQueueSize; + return this; + } + + public int getMaxQueueSize() { + return maxQueueSize; + } + + /** + * Sets the maximum batch size for every export. This must be smaller or equal to {@code + * maxQueuedSpans}. + * + *

Default value is {@code 512}. + * + * @param maxExportBatchSize the maximum batch size for every export. + * @return this. + * @see BatchLogProcessorBuilder#DEFAULT_MAX_EXPORT_BATCH_SIZE + */ + public BatchLogProcessorBuilder setMaxExportBatchSize(int maxExportBatchSize) { + Utils.checkArgument(maxExportBatchSize > 0, "maxExportBatchSize must be positive."); + this.maxExportBatchSize = maxExportBatchSize; + return this; + } + + public int getMaxExportBatchSize() { + return maxExportBatchSize; + } +} diff --git a/sdk-extensions/logging/src/test/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderTest.java b/sdk-extensions/logging/src/test/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderTest.java index 94249bc5cc..1f1e6a3d09 100644 --- a/sdk-extensions/logging/src/test/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderTest.java +++ b/sdk-extensions/logging/src/test/java/io/opentelemetry/sdk/logging/LogSinkSdkProviderTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test; class LogSinkSdkProviderTest { private static LogRecord createLog(LogRecord.Severity severity, String message) { - return new LogRecord.Builder() + return LogRecord.builder() .setUnixTimeMillis(System.currentTimeMillis()) .setTraceId(TraceId.getInvalid()) .setSpanId(SpanId.getInvalid()) @@ -43,7 +43,7 @@ class LogSinkSdkProviderTest { void testLogSinkSdkProvider() { TestLogExporter exporter = new TestLogExporter(); LogProcessor processor = BatchLogProcessor.builder(exporter).build(); - LogSinkSdkProvider provider = new LogSinkSdkProvider.Builder().build(); + LogSinkSdkProvider provider = LogSinkSdkProvider.builder().build(); provider.addLogProcessor(processor); LogSink sink = provider.get("test", "0.1a"); LogRecord log = createLog(LogRecord.Severity.ERROR, "test"); @@ -64,7 +64,7 @@ class LogSinkSdkProviderTest { .setMaxExportBatchSize(5) .setMaxQueueSize(10) .build(); - LogSinkSdkProvider provider = new LogSinkSdkProvider.Builder().build(); + LogSinkSdkProvider provider = LogSinkSdkProvider.builder().build(); provider.addLogProcessor(processor); LogSink sink = provider.get("test", "0.1a"); @@ -96,7 +96,7 @@ class LogSinkSdkProviderTest { .setMaxExportBatchSize(5) .setMaxQueueSize(10) .build(); - LogSinkSdkProvider provider = new LogSinkSdkProvider.Builder().build(); + LogSinkSdkProvider provider = LogSinkSdkProvider.builder().build(); provider.addLogProcessor(processor); LogSink sink = provider.get("test", "0.1a"); @@ -115,7 +115,7 @@ class LogSinkSdkProviderTest { void testMultipleProcessors() { TestLogProcessor processorOne = new TestLogProcessor(); TestLogProcessor processorTwo = new TestLogProcessor(); - LogSinkSdkProvider provider = new LogSinkSdkProvider.Builder().build(); + LogSinkSdkProvider provider = LogSinkSdkProvider.builder().build(); provider.addLogProcessor(processorOne); provider.addLogProcessor(processorTwo); LogSink sink = provider.get("test", "0.1");