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

io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter Maven / Gradle / Ivy

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

package io.opentelemetry.sdk.testing.exporter;

import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.metrics.InstrumentType;
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * A {@link MetricExporter} implementation that can be used to test OpenTelemetry integration.
 *
 * 

Can be created using {@code InMemoryMetricExporter.create()} * *

Example usage: * *


 * public class InMemoryMetricExporterExample {
 *
 *   // creating InMemoryMetricExporter
 *   private final InMemoryMetricExporter exporter = InMemoryMetricExporter.create();
 *   private final MeterSdkProvider meterSdkProvider = OpenTelemetrySdk.getMeterProvider();
 *   private final Meter meter = meterSdkProvider.get("InMemoryMetricExporterExample");
 *   private IntervalMetricReader intervalMetricReader;
 *
 *   void setup() {
 *     intervalMetricReader =
 *         IntervalMetricReader.builder()
 *             .setMetricExporter(exporter)
 *             .setMetricProducers(Collections.singletonList(meterSdkProvider.getMetricProducer()))
 *             .setExportIntervalMillis(1000)
 *             .build();
 *   }
 *
 *   LongCounter generateLongCounterMeter(String name) {
 *     return meter.longCounterBuilder(name).setDescription("Sample LongCounter").build();
 *   }
 *
 *   public static void main(String[] args) throws InterruptedException {
 *     InMemoryMetricExporterExample example = new InMemoryMetricExporterExample();
 *     example.setup();
 *     example.generateLongCounterMeter("counter-1");
 *   }
 * }
 * 
* * @since 1.14.0 */ public final class InMemoryMetricExporter implements MetricExporter { private final Queue finishedMetricItems = new ConcurrentLinkedQueue<>(); private final AggregationTemporality aggregationTemporality; private boolean isStopped = false; private InMemoryMetricExporter(AggregationTemporality aggregationTemporality) { this.aggregationTemporality = aggregationTemporality; } /** * Returns a new {@link InMemoryMetricExporter} with a aggregation temporality of {@link * AggregationTemporality#CUMULATIVE}. */ public static InMemoryMetricExporter create() { return create(AggregationTemporality.CUMULATIVE); } /** Returns a new {@link InMemoryMetricExporter} with the given {@code aggregationTemporality}. */ public static InMemoryMetricExporter create(AggregationTemporality aggregationTemporality) { return new InMemoryMetricExporter(aggregationTemporality); } /** * Returns a {@code List} of the finished {@code Metric}s, represented by {@code MetricData}. * * @return a {@code List} of the finished {@code Metric}s. */ public List getFinishedMetricItems() { return Collections.unmodifiableList(new ArrayList<>(finishedMetricItems)); } /** * Clears the internal {@code List} of finished {@code Metric}s. * *

Does not reset the state of this exporter if already shutdown. */ public void reset() { finishedMetricItems.clear(); } @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { return aggregationTemporality; } /** * Exports the collection of {@code Metric}s into the inmemory queue. * *

If this is called after {@code shutdown}, this will return {@code ResultCode.FAILURE}. */ @Override public CompletableResultCode export(Collection metrics) { if (isStopped) { return CompletableResultCode.ofFailure(); } finishedMetricItems.addAll(metrics); return CompletableResultCode.ofSuccess(); } /** * The InMemory exporter does not batch metrics, so this method will immediately return with * success. * * @return always Success */ @Override public CompletableResultCode flush() { return CompletableResultCode.ofSuccess(); } /** * Clears the internal {@code List} of finished {@code Metric}s. * *

Any subsequent call to export() function on this MetricExporter, will return {@code * CompletableResultCode.ofFailure()} */ @Override public CompletableResultCode shutdown() { isStopped = true; finishedMetricItems.clear(); return CompletableResultCode.ofSuccess(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy