
io.opentelemetry.sdk.trace.export.SimpleSpanProcessor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of opentelemetry-sdk-trace Show documentation
Show all versions of opentelemetry-sdk-trace Show documentation
OpenTelemetry SDK For Tracing
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.trace.export;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.trace.ReadWriteSpan;
import io.opentelemetry.sdk.trace.ReadableSpan;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.data.SpanData;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* An implementation of the {@link SpanProcessor} that converts the {@link ReadableSpan} to {@link
* SpanData} and passes it directly to the configured exporter. This processor should only be used
* where the exporter(s) are able to handle multiple exports simultaneously, as there is no back
* pressure consideration here.
*
* Configuration options for {@link SimpleSpanProcessor} can be read from system properties,
* environment variables, or {@link java.util.Properties} objects.
*
*
For system properties and {@link java.util.Properties} objects, {@link SimpleSpanProcessor}
* will look for the following names:
*
*
* - {@code otel.ssp.export.sampled}: sets whether only sampled spans should be exported.
*
*
* For environment variables, {@link SimpleSpanProcessor} will look for the following names:
*
*
* - {@code OTEL_SSP_EXPORT_SAMPLED}: sets whether only sampled spans should be exported.
*
*/
public final class SimpleSpanProcessor implements SpanProcessor {
private static final Logger logger = Logger.getLogger(SimpleSpanProcessor.class.getName());
private final SpanExporter spanExporter;
private final boolean sampled;
private final AtomicBoolean isShutdown = new AtomicBoolean(false);
/**
* Returns a new {@link SimpleSpanProcessor} which exports spans to the {@link SpanExporter}
* synchronously.
*/
public static SpanProcessor create(SpanExporter exporter) {
requireNonNull(exporter, "exporter");
return new SimpleSpanProcessor(exporter, /* sampled= */ true);
}
/**
* Returns a new Builder for {@link SimpleSpanProcessor}.
*
* @param spanExporter the {@code SpanExporter} to where the Spans are pushed.
* @return a new {@link SimpleSpanProcessor}.
* @throws NullPointerException if the {@code spanExporter} is {@code null}.
* @deprecated Use {@link SimpleSpanProcessor#create(SpanExporter)}
*/
@Deprecated
public static SimpleSpanProcessorBuilder builder(SpanExporter spanExporter) {
return new SimpleSpanProcessorBuilder(spanExporter);
}
SimpleSpanProcessor(SpanExporter spanExporter, boolean sampled) {
this.spanExporter = requireNonNull(spanExporter, "spanExporter");
this.sampled = sampled;
}
@Override
public void onStart(Context parentContext, ReadWriteSpan span) {
// Do nothing.
}
@Override
public boolean isStartRequired() {
return false;
}
@Override
public void onEnd(ReadableSpan span) {
if (sampled && !span.getSpanContext().isSampled()) {
return;
}
try {
List spans = Collections.singletonList(span.toSpanData());
final CompletableResultCode result = spanExporter.export(spans);
result.whenComplete(
() -> {
if (!result.isSuccess()) {
logger.log(Level.FINE, "Exporter failed");
}
});
} catch (Exception e) {
logger.log(Level.WARNING, "Exporter threw an Exception", e);
}
}
@Override
public boolean isEndRequired() {
return true;
}
@Override
public CompletableResultCode shutdown() {
if (isShutdown.getAndSet(true)) {
return CompletableResultCode.ofSuccess();
}
return spanExporter.shutdown();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy