Skip to content
This repository was archived by the owner on May 8, 2026. It is now read-only.

Commit 64850b0

Browse files
chore: re-add prepareForShutdown to the exporter
Change-Id: I033f40dd88b17804a5dfd2fecd84e6c9365193eb
1 parent c2ed0f1 commit 64850b0

2 files changed

Lines changed: 98 additions & 7 deletions

File tree

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricsImpl.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo;
2626
import com.google.cloud.bigtable.data.v2.internal.csm.attributes.EnvInfo;
2727
import com.google.cloud.bigtable.data.v2.internal.csm.exporter.BigtableCloudMonitoringExporter;
28+
import com.google.cloud.bigtable.data.v2.internal.csm.exporter.BigtablePeriodicReader;
2829
import com.google.cloud.bigtable.data.v2.internal.csm.opencensus.MetricsTracerFactory;
2930
import com.google.cloud.bigtable.data.v2.internal.csm.opencensus.RpcMeasureConstants;
3031
import com.google.cloud.bigtable.data.v2.internal.csm.tracers.BuiltinMetricsTracerFactory;
@@ -43,9 +44,6 @@
4344
import io.opentelemetry.sdk.OpenTelemetrySdk;
4445
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
4546
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
46-
import io.opentelemetry.sdk.metrics.export.MetricExporter;
47-
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
48-
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReaderBuilder;
4947
import java.io.Closeable;
5048
import java.io.IOException;
5149
import java.util.ArrayList;
@@ -194,17 +192,16 @@ public static OpenTelemetrySdk createBuiltinOtel(
194192

195193
SdkMeterProviderBuilder meterProvider = SdkMeterProvider.builder();
196194

197-
MetricExporter publicExporter =
195+
BigtableCloudMonitoringExporter exporter =
198196
BigtableCloudMonitoringExporter.create(
199197
metricRegistry,
200198
EnvInfo::detect,
201199
clientInfo,
202200
credentials,
203201
metricsEndpoint,
204202
universeDomain);
205-
PeriodicMetricReaderBuilder readerBuilder =
206-
PeriodicMetricReader.builder(publicExporter).setExecutor(executor);
207-
meterProvider.registerMetricReader(readerBuilder.build());
203+
204+
meterProvider.registerMetricReader(new BigtablePeriodicReader(exporter, executor));
208205

209206
return OpenTelemetrySdk.builder().setMeterProvider(meterProvider.build()).build();
210207
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.google.cloud.bigtable.data.v2.internal.csm.exporter;
2+
3+
import io.opentelemetry.sdk.common.CompletableResultCode;
4+
import io.opentelemetry.sdk.common.export.MemoryMode;
5+
import io.opentelemetry.sdk.metrics.Aggregation;
6+
import io.opentelemetry.sdk.metrics.InstrumentType;
7+
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
8+
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
9+
import io.opentelemetry.sdk.metrics.export.CollectionRegistration;
10+
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
11+
import io.opentelemetry.sdk.metrics.export.MetricReader;
12+
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
13+
import java.io.IOException;
14+
import java.util.concurrent.ScheduledExecutorService;
15+
16+
/**
17+
* Wrapper around a {@link PeriodicMetricReader} that will notify the exporter when it's shutting
18+
* down. This is necessary to filter out noisy error logs on shutdown.
19+
*/
20+
public class BigtablePeriodicReader implements MetricReader {
21+
private final MetricReader delegate;
22+
private final BigtableCloudMonitoringExporter exporter;
23+
24+
public BigtablePeriodicReader(
25+
BigtableCloudMonitoringExporter exporter, ScheduledExecutorService executor) {
26+
delegate = PeriodicMetricReader.builder(exporter).setExecutor(executor).build();
27+
this.exporter = exporter;
28+
}
29+
30+
@Override
31+
public void register(CollectionRegistration registration) {
32+
delegate.register(registration);
33+
}
34+
35+
@Override
36+
public Aggregation getDefaultAggregation(InstrumentType instrumentType) {
37+
return delegate.getDefaultAggregation(instrumentType);
38+
}
39+
40+
@Override
41+
public MemoryMode getMemoryMode() {
42+
return delegate.getMemoryMode();
43+
}
44+
45+
@Override
46+
public CompletableResultCode forceFlush() {
47+
return delegate.forceFlush();
48+
}
49+
50+
@Override
51+
public CompletableResultCode shutdown() {
52+
return delegate.shutdown();
53+
}
54+
55+
@Override
56+
public void close() throws IOException {
57+
exporter.prepareForShutdown();
58+
delegate.close();
59+
}
60+
61+
public static AggregationTemporalitySelector alwaysCumulative() {
62+
return AggregationTemporalitySelector.alwaysCumulative();
63+
}
64+
65+
public static AggregationTemporalitySelector deltaPreferred() {
66+
return AggregationTemporalitySelector.deltaPreferred();
67+
}
68+
69+
public static AggregationTemporalitySelector lowMemory() {
70+
return AggregationTemporalitySelector.lowMemory();
71+
}
72+
73+
@Override
74+
public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) {
75+
return delegate.getAggregationTemporality(instrumentType);
76+
}
77+
78+
public static String asString(AggregationTemporalitySelector selector) {
79+
return AggregationTemporalitySelector.asString(selector);
80+
}
81+
82+
public static DefaultAggregationSelector getDefault() {
83+
return DefaultAggregationSelector.getDefault();
84+
}
85+
86+
@Override
87+
public DefaultAggregationSelector with(InstrumentType instrumentType, Aggregation aggregation) {
88+
return delegate.with(instrumentType, aggregation);
89+
}
90+
91+
public static String asString(DefaultAggregationSelector selector) {
92+
return DefaultAggregationSelector.asString(selector);
93+
}
94+
}

0 commit comments

Comments
 (0)