All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.opentelemetry.sdk.trace.export.SimpleSpanProcessor Maven / Gradle / Ivy

There is a newer version: 1.48.0
Show newest version
/*
 * 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