Skip to content

Commit cbecf1f

Browse files
authored
Move and deprecate InMemoryMetricExporter (open-telemetry#3987)
1 parent 3940dd2 commit cbecf1f

9 files changed

Lines changed: 164 additions & 3 deletions

File tree

opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetryMetricExporterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import io.opencensus.tags.Tagger;
2424
import io.opencensus.tags.Tags;
2525
import io.opentelemetry.sdk.metrics.data.MetricData;
26-
import io.opentelemetry.sdk.metrics.testing.InMemoryMetricExporter;
26+
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter;
2727
import java.util.Comparator;
2828
import java.util.HashSet;
2929
import java.util.Set;

perf-harness/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies {
99
implementation(project(":api:all"))
1010
implementation(project(":sdk:all"))
1111
implementation(project(":sdk:testing"))
12+
implementation(project(":sdk:metrics-testing"))
1213
implementation(project(":exporters:otlp:trace"))
1314
implementation(project(":exporters:logging"))
1415
implementation(project(":semconv"))

perf-harness/src/test/java/io/opentelemetry/perf/OtlpPipelineStressTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import io.opentelemetry.sdk.metrics.data.MetricData;
2323
import io.opentelemetry.sdk.metrics.data.PointData;
2424
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
25-
import io.opentelemetry.sdk.metrics.testing.InMemoryMetricExporter;
2625
import io.opentelemetry.sdk.resources.Resource;
26+
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter;
2727
import io.opentelemetry.sdk.trace.SdkTracerProvider;
2828
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
2929
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
@ParametersAreNonnullByDefault
7+
package io.opentelemetry.sdk.testing.assertj.metrics;
8+
9+
import javax.annotation.ParametersAreNonnullByDefault;
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.testing.exporter;
7+
8+
import io.opentelemetry.sdk.common.CompletableResultCode;
9+
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
10+
import io.opentelemetry.sdk.metrics.data.MetricData;
11+
import io.opentelemetry.sdk.metrics.export.MetricExporter;
12+
import java.util.ArrayList;
13+
import java.util.Collection;
14+
import java.util.Collections;
15+
import java.util.List;
16+
import java.util.Queue;
17+
import java.util.concurrent.ConcurrentLinkedQueue;
18+
19+
/**
20+
* A {@link MetricExporter} implementation that can be used to test OpenTelemetry integration.
21+
*
22+
* <p>Can be created using {@code InMemoryMetricExporter.create()}
23+
*
24+
* <p>Example usage:
25+
*
26+
* <pre><code>
27+
* public class InMemoryMetricExporterExample {
28+
*
29+
* // creating InMemoryMetricExporter
30+
* private final InMemoryMetricExporter exporter = InMemoryMetricExporter.create();
31+
* private final MeterSdkProvider meterSdkProvider = OpenTelemetrySdk.getMeterProvider();
32+
* private final Meter meter = meterSdkProvider.get("InMemoryMetricExporterExample");
33+
* private IntervalMetricReader intervalMetricReader;
34+
*
35+
* void setup() {
36+
* intervalMetricReader =
37+
* IntervalMetricReader.builder()
38+
* .setMetricExporter(exporter)
39+
* .setMetricProducers(Collections.singletonList(meterSdkProvider.getMetricProducer()))
40+
* .setExportIntervalMillis(1000)
41+
* .build();
42+
* }
43+
*
44+
* LongCounter generateLongCounterMeter(String name) {
45+
* return meter.longCounterBuilder(name).setDescription("Sample LongCounter").build();
46+
* }
47+
*
48+
* public static void main(String[] args) throws InterruptedException {
49+
* InMemoryMetricExporterExample example = new InMemoryMetricExporterExample();
50+
* example.setup();
51+
* example.generateLongCounterMeter("counter-1");
52+
* }
53+
* }
54+
* </code></pre>
55+
*/
56+
public final class InMemoryMetricExporter implements MetricExporter {
57+
private final Queue<MetricData> finishedMetricItems = new ConcurrentLinkedQueue<>();
58+
private final AggregationTemporality preferredTemporality;
59+
private boolean isStopped = false;
60+
61+
private InMemoryMetricExporter(AggregationTemporality preferredTemporality) {
62+
this.preferredTemporality = preferredTemporality;
63+
}
64+
65+
/**
66+
* Returns a new {@link InMemoryMetricExporter} with a preferred temporality of {@link
67+
* AggregationTemporality#CUMULATIVE}.
68+
*/
69+
public static InMemoryMetricExporter create() {
70+
return create(AggregationTemporality.CUMULATIVE);
71+
}
72+
73+
/** Returns a new {@link InMemoryMetricExporter} with the given {@code preferredTemporality}. */
74+
public static InMemoryMetricExporter create(AggregationTemporality preferredTemporality) {
75+
return new InMemoryMetricExporter(preferredTemporality);
76+
}
77+
78+
/**
79+
* Returns a {@code List} of the finished {@code Metric}s, represented by {@code MetricData}.
80+
*
81+
* @return a {@code List} of the finished {@code Metric}s.
82+
*/
83+
public List<MetricData> getFinishedMetricItems() {
84+
return Collections.unmodifiableList(new ArrayList<>(finishedMetricItems));
85+
}
86+
87+
/**
88+
* Clears the internal {@code List} of finished {@code Metric}s.
89+
*
90+
* <p>Does not reset the state of this exporter if already shutdown.
91+
*/
92+
public void reset() {
93+
finishedMetricItems.clear();
94+
}
95+
96+
@Override
97+
public AggregationTemporality getPreferredTemporality() {
98+
return preferredTemporality;
99+
}
100+
101+
/**
102+
* Exports the collection of {@code Metric}s into the inmemory queue.
103+
*
104+
* <p>If this is called after {@code shutdown}, this will return {@code ResultCode.FAILURE}.
105+
*/
106+
@Override
107+
public CompletableResultCode export(Collection<MetricData> metrics) {
108+
if (isStopped) {
109+
return CompletableResultCode.ofFailure();
110+
}
111+
finishedMetricItems.addAll(metrics);
112+
return CompletableResultCode.ofSuccess();
113+
}
114+
115+
/**
116+
* The InMemory exporter does not batch metrics, so this method will immediately return with
117+
* success.
118+
*
119+
* @return always Success
120+
*/
121+
@Override
122+
public CompletableResultCode flush() {
123+
return CompletableResultCode.ofSuccess();
124+
}
125+
126+
/**
127+
* Clears the internal {@code List} of finished {@code Metric}s.
128+
*
129+
* <p>Any subsequent call to export() function on this MetricExporter, will return {@code
130+
* CompletableResultCode.ofFailure()}
131+
*/
132+
@Override
133+
public CompletableResultCode shutdown() {
134+
isStopped = true;
135+
finishedMetricItems.clear();
136+
return CompletableResultCode.ofSuccess();
137+
}
138+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
@ParametersAreNonnullByDefault
7+
package io.opentelemetry.sdk.testing.exporter;
8+
9+
import javax.annotation.ParametersAreNonnullByDefault;

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/testing/InMemoryMetricExporterTest.java renamed to sdk/metrics-testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.sdk.metrics.testing;
6+
package io.opentelemetry.sdk.testing.exporter;
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/testing/InMemoryMetricExporter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@
5252
* }
5353
* }
5454
* </code></pre>
55+
*
56+
* @deprecated Moved to {@code io.opentelemetry:opentelemetry-sdk-metrics-testing} module.
5557
*/
58+
@Deprecated
5659
public final class InMemoryMetricExporter implements MetricExporter {
5760
private final Queue<MetricData> finishedMetricItems = new ConcurrentLinkedQueue<>();
5861
private final AggregationTemporality preferredTemporality;

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/testing/InMemoryMetricReaderDeltaTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
99

1010
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
11+
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter;
1112
import org.junit.jupiter.api.BeforeEach;
1213
import org.junit.jupiter.api.Test;
1314

0 commit comments

Comments
 (0)