Skip to content

Commit b6edfb7

Browse files
committed
Make batchMetrics static
1 parent e8d041d commit b6edfb7

5 files changed

Lines changed: 39 additions & 65 deletions

File tree

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/MetricExportBatcher.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package io.opentelemetry.sdk.metrics.export;
77

8-
import io.opentelemetry.sdk.metrics.data.Data;
98
import io.opentelemetry.sdk.metrics.data.DoublePointData;
109
import io.opentelemetry.sdk.metrics.data.ExponentialHistogramData;
1110
import io.opentelemetry.sdk.metrics.data.ExponentialHistogramPointData;
@@ -35,23 +34,13 @@
3534
* at any time.
3635
*/
3736
class MetricExportBatcher {
38-
private final int maxExportBatchSize;
3937

40-
/**
41-
* Creates a new {@link MetricExportBatcher} with the given maximum export batch size.
42-
*
43-
* @param maxExportBatchSize The maximum number of {@link Data#getPoints()} in each export.
44-
*/
45-
MetricExportBatcher(int maxExportBatchSize) {
38+
private MetricExportBatcher() {}
39+
40+
private static void validateMaxExportBatchSize(int maxExportBatchSize) {
4641
if (maxExportBatchSize <= 0) {
4742
throw new IllegalArgumentException("maxExportBatchSize must be positive");
4843
}
49-
this.maxExportBatchSize = maxExportBatchSize;
50-
}
51-
52-
@Override
53-
public String toString() {
54-
return "MetricExportBatcher{maxExportBatchSize=" + maxExportBatchSize + "}";
5544
}
5645

5746
/**
@@ -61,7 +50,9 @@ public String toString() {
6150
* points they contain.
6251
* @return A collection of batches of metric data.
6352
*/
64-
Collection<Collection<MetricData>> batchMetrics(Collection<MetricData> metrics) {
53+
static Collection<Collection<MetricData>> batchMetrics(
54+
Collection<MetricData> metrics, int maxExportBatchSize) {
55+
validateMaxExportBatchSize(maxExportBatchSize);
6556
if (metrics.isEmpty()) {
6657
return Collections.emptyList();
6758
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public final class PeriodicMetricReader implements MetricReader {
5252
private volatile CollectionRegistration collectionRegistration = CollectionRegistration.noop();
5353

5454
@Nullable private volatile ScheduledFuture<?> scheduledFuture;
55-
@Nullable private final MetricExportBatcher metricsBatcher;
55+
private final int maxExportBatchSize;
5656

5757
/**
5858
* Returns a new {@link PeriodicMetricReader} which exports to the {@code exporter} once every
@@ -71,11 +71,11 @@ public static PeriodicMetricReaderBuilder builder(MetricExporter exporter) {
7171
MetricExporter exporter,
7272
long intervalNanos,
7373
ScheduledExecutorService scheduler,
74-
@Nullable MetricExportBatcher metricsBatcher) {
74+
int maxExportBatchSize) {
7575
this.exporter = exporter;
7676
this.intervalNanos = intervalNanos;
7777
this.scheduler = scheduler;
78-
this.metricsBatcher = metricsBatcher;
78+
this.maxExportBatchSize = maxExportBatchSize;
7979
this.scheduled = new Scheduled();
8080
}
8181

@@ -169,8 +169,8 @@ public String toString() {
169169
+ exporter
170170
+ ", intervalNanos="
171171
+ intervalNanos
172-
+ ", metricsBatcher="
173-
+ metricsBatcher
172+
+ ", maxExportBatchSize="
173+
+ maxExportBatchSize
174174
+ '}';
175175
}
176176

@@ -196,10 +196,11 @@ private final class Scheduled implements Runnable {
196196
private Scheduled() {}
197197

198198
private CompletableResultCode exportMetrics(Collection<MetricData> metricData) {
199-
if (metricsBatcher == null) {
199+
if (maxExportBatchSize == 0) {
200200
return exporter.export(metricData);
201201
}
202-
Collection<Collection<MetricData>> batches = metricsBatcher.batchMetrics(metricData);
202+
Collection<Collection<MetricData>> batches =
203+
MetricExportBatcher.batchMetrics(metricData, maxExportBatchSize);
203204
CompletableResultCode sequentialResult = new CompletableResultCode();
204205
AtomicBoolean anyFailed = new AtomicBoolean(false);
205206
Iterator<Collection<MetricData>> batchIterator = batches.iterator();

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class PeriodicMetricReaderBuilder {
3030

3131
@Nullable private ScheduledExecutorService executor;
3232

33-
@Nullable private MetricExportBatcher metricsBatcher;
33+
private int maxExportBatchSize;
3434

3535
PeriodicMetricReaderBuilder(MetricExporter metricExporter) {
3636
this.metricExporter = metricExporter;
@@ -71,7 +71,7 @@ public PeriodicMetricReaderBuilder setExecutor(ScheduledExecutorService executor
7171
*/
7272
PeriodicMetricReaderBuilder setMaxExportBatchSize(int maxExportBatchSize) {
7373
checkArgument(maxExportBatchSize > 0, "maxExportBatchSize must be positive");
74-
this.metricsBatcher = new MetricExportBatcher(maxExportBatchSize);
74+
this.maxExportBatchSize = maxExportBatchSize;
7575
return this;
7676
}
7777

@@ -82,6 +82,6 @@ public PeriodicMetricReader build() {
8282
executor =
8383
Executors.newScheduledThreadPool(1, new DaemonThreadFactory("PeriodicMetricReader"));
8484
}
85-
return new PeriodicMetricReader(metricExporter, intervalNanos, executor, metricsBatcher);
85+
return new PeriodicMetricReader(metricExporter, intervalNanos, executor, maxExportBatchSize);
8686
}
8787
}

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/export/MetricExportBatcherTest.java

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,22 @@
4242
class MetricExportBatcherTest {
4343

4444
@Test
45-
void constructor_InvalidMaxExportBatchSize() {
46-
assertThatThrownBy(() -> new MetricExportBatcher(0))
45+
void batchMetrics_InvalidMaxExportBatchSize() {
46+
assertThatThrownBy(() -> MetricExportBatcher.batchMetrics(Collections.emptyList(), 0))
4747
.isInstanceOf(IllegalArgumentException.class)
4848
.hasMessage("maxExportBatchSize must be positive");
49-
assertThatThrownBy(() -> new MetricExportBatcher(-1))
49+
assertThatThrownBy(() -> MetricExportBatcher.batchMetrics(Collections.emptyList(), -1))
5050
.isInstanceOf(IllegalArgumentException.class)
5151
.hasMessage("maxExportBatchSize must be positive");
5252
}
5353

54-
@Test
55-
void toString_Valid() {
56-
MetricExportBatcher batcher = new MetricExportBatcher(10);
57-
assertThat(batcher.toString()).isEqualTo("MetricExportBatcher{maxExportBatchSize=10}");
58-
}
59-
6054
@Test
6155
void batchMetrics_EmptyMetrics() {
62-
MetricExportBatcher batcher = new MetricExportBatcher(10);
63-
assertThat(batcher.batchMetrics(Collections.emptyList())).isEmpty();
56+
assertThat(MetricExportBatcher.batchMetrics(Collections.emptyList(), 10)).isEmpty();
6457
}
6558

6659
@Test
6760
void batchMetrics_MetricFitsIntact() {
68-
MetricExportBatcher batcher = new MetricExportBatcher(10);
6961
LongPointData p1 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 1L);
7062
MetricData metric =
7163
ImmutableMetricData.createLongGauge(
@@ -77,14 +69,13 @@ void batchMetrics_MetricFitsIntact() {
7769
ImmutableGaugeData.create(Collections.singletonList(p1)));
7870

7971
Collection<Collection<MetricData>> batches =
80-
batcher.batchMetrics(Collections.singletonList(metric));
72+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 10);
8173
assertThat(batches).hasSize(1);
8274
assertThat(batches.iterator().next()).containsExactly(metric);
8375
}
8476

8577
@Test
8678
void batchMetrics_SplitsDoubleGauge_LastBatchPartiallyFilled() {
87-
MetricExportBatcher batcher = new MetricExportBatcher(2);
8879
DoublePointData p1 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 1.0);
8980
DoublePointData p2 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 2.0);
9081
DoublePointData p3 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 3.0);
@@ -101,7 +92,7 @@ void batchMetrics_SplitsDoubleGauge_LastBatchPartiallyFilled() {
10192
ImmutableGaugeData.create(Arrays.asList(p1, p2, p3, p4, p5)));
10293

10394
Collection<Collection<MetricData>> batches =
104-
batcher.batchMetrics(Collections.singletonList(metric));
95+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 2);
10596
List<Collection<MetricData>> batchesList = new ArrayList<>(batches);
10697

10798
assertThat(batchesList.size()).isEqualTo(3);
@@ -138,7 +129,6 @@ void batchMetrics_SplitsDoubleGauge_LastBatchPartiallyFilled() {
138129

139130
@Test
140131
void batchMetrics_SplitsLongGauge_SingleBatchPartiallyFilled() {
141-
MetricExportBatcher batcher = new MetricExportBatcher(4);
142132
LongPointData p1 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 1L);
143133
LongPointData p2 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 2L);
144134
LongPointData p3 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 3L);
@@ -153,7 +143,7 @@ void batchMetrics_SplitsLongGauge_SingleBatchPartiallyFilled() {
153143
ImmutableGaugeData.create(Arrays.asList(p1, p2, p3)));
154144

155145
Collection<Collection<MetricData>> batches =
156-
batcher.batchMetrics(Collections.singletonList(metric));
146+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 4);
157147

158148
assertThat(batches).hasSize(1);
159149
Collection<MetricData> firstBatch = batches.iterator().next();
@@ -169,7 +159,6 @@ void batchMetrics_SplitsLongGauge_SingleBatchPartiallyFilled() {
169159

170160
@Test
171161
void batchMetrics_SplitsDoubleSum_SingleBatchCompletelyFilled() {
172-
MetricExportBatcher batcher = new MetricExportBatcher(2);
173162
DoublePointData p1 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 1.0);
174163
DoublePointData p2 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 2.0);
175164

@@ -184,7 +173,7 @@ void batchMetrics_SplitsDoubleSum_SingleBatchCompletelyFilled() {
184173
/* isMonotonic= */ true, AggregationTemporality.CUMULATIVE, Arrays.asList(p1, p2)));
185174

186175
Collection<Collection<MetricData>> batches =
187-
batcher.batchMetrics(Collections.singletonList(metric));
176+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 2);
188177

189178
Collection<MetricData> firstBatch = batches.iterator().next();
190179
assertThat(firstBatch).hasSize(1); // There is only 1 MetricData
@@ -202,7 +191,6 @@ void batchMetrics_SplitsDoubleSum_SingleBatchCompletelyFilled() {
202191

203192
@Test
204193
void batchMetrics_SplitsLongSum_MultipleBatchesCompletelyFilled_MultipleMetrics() {
205-
MetricExportBatcher batcher = new MetricExportBatcher(1);
206194
Attributes attrs1 = Attributes.builder().put("key1", "val1").build();
207195
Attributes attrs2 = Attributes.builder().put("key2", "val2").build();
208196
LongPointData p1 = ImmutableLongPointData.create(1, 2, attrs1, 1L);
@@ -229,7 +217,7 @@ void batchMetrics_SplitsLongSum_MultipleBatchesCompletelyFilled_MultipleMetrics(
229217
/* isMonotonic= */ false, AggregationTemporality.DELTA, Arrays.asList(p1, p2)));
230218

231219
Collection<Collection<MetricData>> batches =
232-
batcher.batchMetrics(Arrays.asList(metric1, metric2));
220+
MetricExportBatcher.batchMetrics(Arrays.asList(metric1, metric2), 1);
233221

234222
assertThat(batches).hasSize(4);
235223
Collection<MetricData> firstBatch = batches.iterator().next();
@@ -289,7 +277,6 @@ void batchMetrics_SplitsLongSum_MultipleBatchesCompletelyFilled_MultipleMetrics(
289277

290278
@Test
291279
void batchMetrics_SplitsHistogram_MultipleBatchesCompletelyFilled_SingleMetric() {
292-
MetricExportBatcher batcher = new MetricExportBatcher(1);
293280
ImmutableHistogramPointData p1 =
294281
ImmutableHistogramPointData.create(
295282
1,
@@ -326,7 +313,7 @@ void batchMetrics_SplitsHistogram_MultipleBatchesCompletelyFilled_SingleMetric()
326313
AggregationTemporality.CUMULATIVE, Arrays.asList(p1, p2)));
327314

328315
Collection<Collection<MetricData>> batches =
329-
batcher.batchMetrics(Collections.singletonList(metric));
316+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 1);
330317

331318
assertThat(batches).hasSize(2);
332319
Collection<MetricData> firstBatch = batches.iterator().next();
@@ -354,7 +341,6 @@ void batchMetrics_SplitsHistogram_MultipleBatchesCompletelyFilled_SingleMetric()
354341

355342
@Test
356343
void batchMetrics_MultipleMetricsExactCapacityMatch() {
357-
MetricExportBatcher batcher = new MetricExportBatcher(4);
358344
Attributes attrs1 = Attributes.builder().put("k", "v1").build();
359345
Attributes attrs2 = Attributes.builder().put("k", "v2").build();
360346
Attributes attrs3 = Attributes.builder().put("k", "v3").build();
@@ -381,7 +367,8 @@ void batchMetrics_MultipleMetricsExactCapacityMatch() {
381367
"1",
382368
ImmutableGaugeData.create(Arrays.asList(p3, p4)));
383369

384-
Collection<Collection<MetricData>> batches = batcher.batchMetrics(Arrays.asList(m1, m2));
370+
Collection<Collection<MetricData>> batches =
371+
MetricExportBatcher.batchMetrics(Arrays.asList(m1, m2), 4);
385372
assertThat(batches).hasSize(1);
386373
Collection<MetricData> firstBatch = batches.iterator().next();
387374
assertThat(firstBatch).containsExactly(m1, m2);
@@ -397,7 +384,6 @@ void batchMetrics_MultipleMetricsExactCapacityMatch() {
397384

398385
@Test
399386
void batchMetrics_SplitsLongGauge_MultipleMetrics_ExceedsCapacity() {
400-
MetricExportBatcher batcher = new MetricExportBatcher(4);
401387
LongPointData p1 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 1L);
402388
LongPointData p2 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 2L);
403389
LongPointData p3 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 3L);
@@ -422,7 +408,8 @@ void batchMetrics_SplitsLongGauge_MultipleMetrics_ExceedsCapacity() {
422408
"1",
423409
ImmutableGaugeData.create(Arrays.asList(p4, p5, p6)));
424410

425-
Collection<Collection<MetricData>> batches = batcher.batchMetrics(Arrays.asList(m1, m2));
411+
Collection<Collection<MetricData>> batches =
412+
MetricExportBatcher.batchMetrics(Arrays.asList(m1, m2), 4);
426413

427414
assertThat(batches).hasSize(2);
428415

@@ -455,7 +442,6 @@ void batchMetrics_SplitsLongGauge_MultipleMetrics_PerfectFillThenSplit() {
455442
// m2 has 3 points, which forces it to split from the start of a fully-exhausted
456443
// previous pass.
457444
// This test case fails if there is an empty batch
458-
MetricExportBatcher batcher = new MetricExportBatcher(2);
459445
LongPointData p1 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 1L);
460446
LongPointData p2 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 2L);
461447
LongPointData p3 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 3L);
@@ -479,7 +465,8 @@ void batchMetrics_SplitsLongGauge_MultipleMetrics_PerfectFillThenSplit() {
479465
"1",
480466
ImmutableGaugeData.create(Arrays.asList(p3, p4, p5)));
481467

482-
Collection<Collection<MetricData>> batches = batcher.batchMetrics(Arrays.asList(m1, m2));
468+
Collection<Collection<MetricData>> batches =
469+
MetricExportBatcher.batchMetrics(Arrays.asList(m1, m2), 2);
483470

484471
assertThat(batches).hasSize(3);
485472

@@ -507,7 +494,6 @@ void batchMetrics_SplitsLongGauge_MultipleMetrics_PerfectFillThenSplit() {
507494

508495
@Test
509496
void batchMetrics_SplitsExponentialHistogram_MultipleBatchesCompletelyFilled_SingleMetric() {
510-
MetricExportBatcher batcher = new MetricExportBatcher(1);
511497
ExponentialHistogramBuckets buckets =
512498
ImmutableExponentialHistogramBuckets.create(
513499
/* scale= */ 20, /* offset= */ 0, /* bucketCounts= */ Collections.singletonList(1L));
@@ -553,7 +539,7 @@ void batchMetrics_SplitsExponentialHistogram_MultipleBatchesCompletelyFilled_Sin
553539
AggregationTemporality.CUMULATIVE, Arrays.asList(p1, p2)));
554540

555541
Collection<Collection<MetricData>> batches =
556-
batcher.batchMetrics(Collections.singletonList(metric));
542+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 1);
557543

558544
assertThat(batches).hasSize(2);
559545
Collection<MetricData> firstBatch = batches.iterator().next();
@@ -582,7 +568,6 @@ void batchMetrics_SplitsExponentialHistogram_MultipleBatchesCompletelyFilled_Sin
582568

583569
@Test
584570
void batchMetrics_SplitsSummary_MultipleBatchesCompletelyFilled_SingleMetric() {
585-
MetricExportBatcher batcher = new MetricExportBatcher(1);
586571
SummaryPointData p1 =
587572
ImmutableSummaryPointData.create(
588573
/* startEpochNanos= */ 1,
@@ -612,7 +597,7 @@ void batchMetrics_SplitsSummary_MultipleBatchesCompletelyFilled_SingleMetric() {
612597
ImmutableSummaryData.create(Arrays.asList(p1, p2)));
613598

614599
Collection<Collection<MetricData>> batches =
615-
batcher.batchMetrics(Collections.singletonList(metric));
600+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 1);
616601

617602
assertThat(batches).hasSize(2);
618603
Collection<MetricData> firstBatch = batches.iterator().next();
@@ -637,7 +622,6 @@ void batchMetrics_SplitsSummary_MultipleBatchesCompletelyFilled_SingleMetric() {
637622

638623
@Test
639624
void batchMetrics_SplitsLongGauge_MultipleBatches() {
640-
MetricExportBatcher batcher = new MetricExportBatcher(2);
641625
LongPointData p1 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 1L);
642626
LongPointData p2 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 2L);
643627
LongPointData p3 = ImmutableLongPointData.create(1, 2, Attributes.empty(), 3L);
@@ -654,7 +638,7 @@ void batchMetrics_SplitsLongGauge_MultipleBatches() {
654638
ImmutableGaugeData.create(Arrays.asList(p1, p2, p3, p4, p5)));
655639

656640
Collection<Collection<MetricData>> batches =
657-
batcher.batchMetrics(Collections.singletonList(metric));
641+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 2);
658642
List<Collection<MetricData>> batchesList = new ArrayList<>(batches);
659643

660644
assertThat(batchesList).hasSize(3);
@@ -690,7 +674,6 @@ void batchMetrics_SplitsLongGauge_MultipleBatches() {
690674

691675
@Test
692676
void batchMetrics_SplitsDoubleSum_MultipleBatches() {
693-
MetricExportBatcher batcher = new MetricExportBatcher(1);
694677
DoublePointData p1 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 1.0);
695678
DoublePointData p2 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 2.0);
696679
DoublePointData p3 = ImmutableDoublePointData.create(1, 2, Attributes.empty(), 3.0);
@@ -708,7 +691,7 @@ void batchMetrics_SplitsDoubleSum_MultipleBatches() {
708691
Arrays.asList(p1, p2, p3)));
709692

710693
Collection<Collection<MetricData>> batches =
711-
batcher.batchMetrics(Collections.singletonList(metric));
694+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 1);
712695
List<Collection<MetricData>> batchesList = new ArrayList<>(batches);
713696

714697
assertThat(batchesList).hasSize(3);
@@ -753,7 +736,6 @@ void batchMetrics_SplitsDoubleSum_MultipleBatches() {
753736

754737
@Test
755738
void batchMetrics_EmptyPointsInMetricData() {
756-
MetricExportBatcher batcher = new MetricExportBatcher(2);
757739
MetricData metric =
758740
ImmutableMetricData.createLongGauge(
759741
Resource.empty(),
@@ -764,7 +746,7 @@ void batchMetrics_EmptyPointsInMetricData() {
764746
ImmutableGaugeData.create(Collections.emptyList()));
765747

766748
Collection<Collection<MetricData>> batches =
767-
batcher.batchMetrics(Collections.singletonList(metric));
749+
MetricExportBatcher.batchMetrics(Collections.singletonList(metric), 2);
768750
assertThat(batches).hasSize(1);
769751
assertThat(batches.iterator().next()).containsExactly(metric);
770752
}

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ void stringRepresentation() {
642642
"PeriodicMetricReader{"
643643
+ "exporter=MockMetricExporter{}, "
644644
+ "intervalNanos=1000000000, "
645-
+ "metricsBatcher=MetricExportBatcher{maxExportBatchSize=200}"
645+
+ "maxExportBatchSize=200"
646646
+ "}");
647647
}
648648

0 commit comments

Comments
 (0)