/* * SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. */ package org.opensearch.telemetry.tracing; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.context.Context; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.Closeable; import java.io.IOException; /** * OTel based Telemetry provider */ public class OTelTracingTelemetry implements TracingTelemetry { private static final Logger logger = LogManager.getLogger(OTelTracingTelemetry.class); private final OpenTelemetry openTelemetry; private final io.opentelemetry.api.trace.Tracer otelTracer; /** * Creates OTel based Telemetry * @param openTelemetry OpenTelemetry instance */ public OTelTracingTelemetry(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; this.otelTracer = openTelemetry.getTracer("os-tracer"); } @Override public void close() { try { ((Closeable) openTelemetry).close(); } catch (IOException e) { logger.warn("Error while closing Opentelemetry", e); } } @Override public Span createSpan(String spanName, Span parentSpan) { return createOtelSpan(spanName, parentSpan); } @Override public TracingContextPropagator getContextPropagator() { return new OTelTracingContextPropagator(openTelemetry); } private Span createOtelSpan(String spanName, Span parentSpan) { io.opentelemetry.api.trace.Span otelSpan = otelSpan(spanName, parentSpan); return new OTelSpan(spanName, otelSpan, parentSpan); } io.opentelemetry.api.trace.Span otelSpan(String spanName, Span parentOTelSpan) { return parentOTelSpan == null || !(parentOTelSpan instanceof OTelSpan) ? otelTracer.spanBuilder(spanName).startSpan() : otelTracer.spanBuilder(spanName).setParent(Context.current().with(((OTelSpan) parentOTelSpan).getDelegateSpan())).startSpan(); } }