|
30 | 30 | import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; |
31 | 31 | import com.google.cloud.bigtable.data.v2.internal.csm.attributes.EnvInfo; |
32 | 32 | import com.google.cloud.bigtable.data.v2.internal.csm.exporter.BigtableCloudMonitoringExporter; |
| 33 | +import com.google.cloud.bigtable.data.v2.internal.csm.exporter.BigtableFilteringExporter; |
33 | 34 | import com.google.cloud.bigtable.data.v2.internal.csm.exporter.BigtablePeriodicReader; |
34 | 35 | import com.google.cloud.bigtable.data.v2.internal.csm.opencensus.MetricsTracerFactory; |
35 | 36 | import com.google.cloud.bigtable.data.v2.internal.csm.opencensus.RpcMeasureConstants; |
|
52 | 53 | import com.google.cloud.bigtable.data.v2.internal.session.SessionPoolInfo; |
53 | 54 | import com.google.cloud.bigtable.data.v2.internal.session.VRpcDescriptor; |
54 | 55 | import com.google.cloud.bigtable.data.v2.stub.metrics.NoopMetricsProvider; |
| 56 | +import com.google.cloud.opentelemetry.metric.GoogleCloudMetricExporter; |
| 57 | +import com.google.cloud.opentelemetry.metric.MetricConfiguration; |
55 | 58 | import com.google.common.base.Preconditions; |
56 | 59 | import com.google.common.base.Splitter; |
57 | 60 | import com.google.common.base.Suppliers; |
|
68 | 71 | import io.opentelemetry.sdk.OpenTelemetrySdk; |
69 | 72 | import io.opentelemetry.sdk.metrics.SdkMeterProvider; |
70 | 73 | import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; |
| 74 | +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; |
71 | 75 | import java.io.Closeable; |
72 | 76 | import java.io.IOException; |
| 77 | +import java.time.Duration; |
73 | 78 | import java.util.ArrayList; |
74 | 79 | import java.util.List; |
| 80 | +import java.util.Optional; |
75 | 81 | import java.util.concurrent.ScheduledExecutorService; |
76 | 82 | import java.util.concurrent.ScheduledFuture; |
77 | 83 | import java.util.concurrent.TimeUnit; |
78 | 84 | import javax.annotation.Nullable; |
79 | 85 | import javax.annotation.concurrent.GuardedBy; |
80 | 86 |
|
81 | 87 | public class MetricsImpl implements Metrics, Closeable { |
| 88 | + |
| 89 | + public static final String CUSTOM_METRIC = "bigtable.internal.enable-custom-metric"; |
| 90 | + |
| 91 | + private static final boolean enableCustomMetric = |
| 92 | + Optional.ofNullable(System.getProperty(CUSTOM_METRIC)) |
| 93 | + .map(Boolean::parseBoolean) |
| 94 | + .orElse(false); |
| 95 | + |
82 | 96 | private final ApiTracerFactory userTracerFactory; |
83 | 97 | private final @Nullable OpenTelemetrySdk internalOtel; |
84 | 98 | private final @Nullable MetricRegistry.RecorderRegistry internalRecorder; |
@@ -196,7 +210,8 @@ public VRpcTracer newTableTracer( |
196 | 210 | } |
197 | 211 | ImmutableList.Builder<VRpcTracer> builder = ImmutableList.builder(); |
198 | 212 | builder.add( |
199 | | - new VRpcTracerImpl(internalRecorder, poolInfo, descriptor.getMethodInfo(), deadline)); |
| 213 | + new VRpcTracerImpl( |
| 214 | + internalRecorder, poolInfo, descriptor.getMethodInfo(), deadline, enableCustomMetric)); |
200 | 215 | if (userRecorder != null) { |
201 | 216 | builder.add(new VRpcTracerImpl(userRecorder, poolInfo, descriptor.getMethodInfo(), deadline)); |
202 | 217 | } |
@@ -300,8 +315,28 @@ public static OpenTelemetrySdk createBuiltinOtel( |
300 | 315 | metricsEndpoint, |
301 | 316 | universeDomain); |
302 | 317 |
|
303 | | - meterProvider.registerMetricReader(new BigtablePeriodicReader(exporter, executor)); |
304 | | - |
| 318 | + meterProvider.registerMetricReader( |
| 319 | + new BigtablePeriodicReader( |
| 320 | + new BigtableFilteringExporter( |
| 321 | + exporter, |
| 322 | + input -> input.getName().startsWith("bigtable.googleapis.com/internal/client")), |
| 323 | + executor)); |
| 324 | + |
| 325 | + if (enableCustomMetric) { |
| 326 | + // Monitored resource and project id are detected at export time |
| 327 | + MetricConfiguration metricConfig = |
| 328 | + MetricConfiguration.builder() |
| 329 | + .setCredentials(credentials) |
| 330 | + .setInstrumentationLibraryLabelsEnabled(false) |
| 331 | + .build(); |
| 332 | + meterProvider.registerMetricReader( |
| 333 | + PeriodicMetricReader.builder( |
| 334 | + new BigtableFilteringExporter( |
| 335 | + GoogleCloudMetricExporter.createWithConfiguration(metricConfig), |
| 336 | + input -> input.getName().startsWith("bigtable.custom"))) |
| 337 | + .setInterval(Duration.ofMinutes(1)) |
| 338 | + .build()); |
| 339 | + } |
305 | 340 | return OpenTelemetrySdk.builder().setMeterProvider(meterProvider.build()).build(); |
306 | 341 | } |
307 | 342 |
|
|
0 commit comments