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

io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule Maven / Gradle / Ivy

/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package io.opentelemetry.sdk.testing.junit4;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.data.LogRecordData;
import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import java.util.ArrayList;
import java.util.List;
import org.junit.rules.ExternalResource;

/**
 * A JUnit4 rule which sets up the {@link OpenTelemetrySdk} for testing, resetting state between
 * tests. This rule cannot be used with {@link org.junit.ClassRule}.
 *
 * 
{@code
 * // public class CoolTest {
 * //   @Rule public OpenTelemetryRule otelTesting = OpenTelemetryRule.create();
 * //
 * //   private Tracer tracer;
 * //   private Meter meter;
 * //
 * //   @Before
 * //   public void setUp() {
 * //     tracer = otelTesting.getOpenTelemetry().getTracer("test");
 * //     meter = otelTesting.getOpenTelemetry().getMeter("test");
 * //   }
 * //
 * //   @Test
 * //   public void test() {
 * //     tracer.spanBuilder("name").startSpan().end();
 * //     assertThat(otelTesting.getSpans()).containsExactly(expected);
 * //
 * //     LongCounter counter = meter.counterBuilder("counter-name").build();
 * //     counter.add(1);
 * //     assertThat(otelTesting.getMetrics()).satisfiesExactlyInAnyOrder(metricData -> {});
 * //   }
 * // }
 * }
*/ public final class OpenTelemetryRule extends ExternalResource { /** * Returns a {@link OpenTelemetryRule} with a default SDK initialized with an in-memory span * exporter and W3C trace context propagation. */ public static OpenTelemetryRule create() { InMemorySpanExporter spanExporter = InMemorySpanExporter.create(); SdkTracerProvider tracerProvider = SdkTracerProvider.builder() .addSpanProcessor(SimpleSpanProcessor.create(spanExporter)) .build(); InMemoryMetricReader metricReader = InMemoryMetricReader.create(); SdkMeterProvider meterProvider = SdkMeterProvider.builder().registerMetricReader(metricReader).build(); InMemoryLogRecordExporter logRecordExporter = InMemoryLogRecordExporter.create(); SdkLoggerProvider loggerProvider = SdkLoggerProvider.builder() .addLogRecordProcessor(SimpleLogRecordProcessor.create(logRecordExporter)) .build(); OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder() .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) .setTracerProvider(tracerProvider) .setMeterProvider(meterProvider) .setLoggerProvider(loggerProvider) .build(); return new OpenTelemetryRule(openTelemetry, spanExporter, metricReader, logRecordExporter); } private final OpenTelemetrySdk openTelemetry; private final InMemorySpanExporter spanExporter; private final InMemoryMetricReader metricReader; private final InMemoryLogRecordExporter logRecordExporter; private OpenTelemetryRule( OpenTelemetrySdk openTelemetry, InMemorySpanExporter spanExporter, InMemoryMetricReader metricReader, InMemoryLogRecordExporter logRecordExporter) { this.openTelemetry = openTelemetry; this.spanExporter = spanExporter; this.metricReader = metricReader; this.logRecordExporter = logRecordExporter; } /** Returns the {@link OpenTelemetrySdk} created by this extension. */ public OpenTelemetry getOpenTelemetry() { return openTelemetry; } /** Returns all the exported {@link SpanData} so far. */ public List getSpans() { return spanExporter.getFinishedSpanItems(); } /** * Returns the current {@link MetricData} in {@link AggregationTemporality#CUMULATIVE} format. * * @since 1.15.0 */ public List getMetrics() { return new ArrayList<>(metricReader.collectAllMetrics()); } /** * Returns all the exported {@link LogRecordData} so far. * * @since 1.32.0 */ public List getLogRecords() { return new ArrayList<>(logRecordExporter.getFinishedLogRecordItems()); } /** * Clears the collected exported {@link SpanData}. Consider making your test smaller instead of * manually clearing state using this method. */ public void clearSpans() { spanExporter.reset(); } /** * Clears all registered metric instruments, such that {@link #getMetrics()} is empty. * * @since 1.15.0 */ public void clearMetrics() { SdkMeterProviderUtil.resetForTest(openTelemetry.getSdkMeterProvider()); } /** * Clears the collected exported {@link LogRecordData}. Consider making your test smaller instead * of manually clearing state using this method. * * @since 1.32.0 */ public void clearLogRecords() { logRecordExporter.reset(); } @Override protected void before() { GlobalOpenTelemetry.resetForTest(); GlobalOpenTelemetry.set(openTelemetry); clearSpans(); clearMetrics(); clearLogRecords(); } @Override protected void after() { GlobalOpenTelemetry.resetForTest(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy