Skip to content

Commit 751febd

Browse files
authored
feat(spanner): Switch to using builtin open telemetry for EEF (#14193)
Switching to built in open telemetry since the eef metrics are internal metrics
1 parent a70f04f commit 751febd

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

spanner/client.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,10 @@ func newClientWithConfig(ctx context.Context, database string, config ClientConf
564564
fbOpts.EnableFallback = true
565565
fbOpts.ErrorRateThreshold = 1
566566
fbOpts.MinFailedCalls = 1
567-
fbOpts.MeterProvider = config.OpenTelemetryMeterProvider
567+
568+
if metricsTracerFactory != nil && metricsTracerFactory.meterProvider != nil {
569+
fbOpts.MeterProvider = metricsTracerFactory.meterProvider
570+
}
568571

569572
gcpFallback, err := grpcgcp.NewGCPFallback(ctx, primaryConn, fallbackConn, fbOpts)
570573
if err != nil {

spanner/metrics.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import (
4949
const (
5050
builtInMetricsMeterName = "gax-go"
5151
grpcMetricMeterName = "grpc-go"
52+
grpcGcpMetricMeterName = "grpc-gcp-go"
5253

5354
nativeMetricsPrefix = "spanner.googleapis.com/internal/client/"
5455

@@ -73,6 +74,10 @@ const (
7374
metricLabelKeyGRPCLBLocality = "grpc.lb.locality"
7475
metricLabelKeyGRPCLBBackendService = "grpc.lb.backend_service"
7576
metricLabelKeyGRPCDisconnectError = "grpc.disconnect_error"
77+
metricLabelKeyFromChannelName = "from_channel_name"
78+
metricLabelKeyToChannelName = "to_channel_name"
79+
metricLabelKeyChannelName = "channel_name"
80+
metricLabelKeyStatusCode = "status_code"
7681

7782
// Metric names
7883
metricNameOperationLatencies = "operation_latencies"
@@ -83,6 +88,8 @@ const (
8388
metricNameGFELatencies = "gfe_latencies"
8489
metricNameGFEConnectivityErrorCount = "gfe_connectivity_error_count"
8590
metricNameAFEConnectivityErrorCount = "afe_connectivity_error_count"
91+
metricNameEEFFallbackCount = "eef.fallback_count"
92+
metricNameEEFCallStatus = "eef.call_status"
8693

8794
// Metric units
8895
metricUnitMS = "ms"
@@ -273,6 +280,8 @@ type builtinMetricsTracerFactory struct {
273280
afeErrorCount metric.Int64Counter // Counter for the number of requests that failed to reach the Spanner API Frontend.
274281
operationCount metric.Int64Counter // Counter for the number of operations.
275282
attemptCount metric.Int64Counter // Counter for the number of attempts.
283+
284+
meterProvider metric.MeterProvider
276285
}
277286

278287
func newBuiltinMetricsTracerFactory(ctx context.Context, dbpath, compression string, isAFEBuiltInMetricEnabled, isEnableGRPCBuiltInMetrics bool, metricsProvider metric.MeterProvider, opts ...option.ClientOption) (*builtinMetricsTracerFactory, error) {
@@ -311,6 +320,7 @@ func newBuiltinMetricsTracerFactory(ctx context.Context, dbpath, compression str
311320
return tracerFactory, err
312321
}
313322
meterProvider = sdkmetric.NewMeterProvider(mpOptions...)
323+
tracerFactory.meterProvider = meterProvider
314324

315325
if isEnableGRPCBuiltInMetrics {
316326
mo := opentelemetry.MetricsOptions{
@@ -373,6 +383,36 @@ func builtInMeterProviderOptions(project, compression string, clientAttributes [
373383
},
374384
))
375385
}
386+
skippedEEFMetrics := []string{
387+
"eef.probe_result",
388+
"eef.error_ratio",
389+
"eef.current_channel",
390+
"eef.channel_downtime",
391+
}
392+
for _, m := range skippedEEFMetrics {
393+
views = append(views, sdkmetric.NewView(
394+
sdkmetric.Instrument{Name: m},
395+
sdkmetric.Stream{Aggregation: sdkmetric.AggregationDrop{}},
396+
))
397+
}
398+
eefMetricsToEnable := []string{
399+
metricNameEEFFallbackCount,
400+
metricNameEEFCallStatus,
401+
}
402+
for _, m := range eefMetricsToEnable {
403+
views = append(views, sdkmetric.NewView(
404+
sdkmetric.Instrument{Name: m},
405+
sdkmetric.Stream{
406+
Aggregation: sdkmetric.AggregationSum{},
407+
AttributeFilter: func(kv attribute.KeyValue) bool {
408+
if _, ok := allowedEEFMetricLabels[string(kv.Key)]; ok {
409+
return true
410+
}
411+
return false
412+
},
413+
},
414+
))
415+
}
376416
return []sdkmetric.Option{sdkmetric.WithReader(
377417
sdkmetric.NewPeriodicReader(
378418
defaultExporter,

spanner/metrics_monitoring_exporter.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,15 @@ var (
7979
metricLabelKeyStatus: true,
8080
}
8181

82+
allowedEEFMetricLabels = map[string]bool{
83+
metricLabelKeyClientUID: true,
84+
metricLabelKeyClientName: true,
85+
metricLabelKeyFromChannelName: true,
86+
metricLabelKeyToChannelName: true,
87+
metricLabelKeyChannelName: true,
88+
metricLabelKeyStatusCode: true,
89+
}
90+
8291
errShutdown = fmt.Errorf("exporter is shutdown")
8392
)
8493

@@ -215,6 +224,7 @@ func (me *monitoringExporter) recordToMetricAndMonitoredResourcePbs(metrics otel
215224
Labels: map[string]string{},
216225
}
217226
labels := make(map[string]string)
227+
isEEFMetric := strings.HasPrefix(metrics.Name, "eef.")
218228
addAttributes := func(attr *attribute.Set) {
219229
iter := attr.Iter()
220230
for iter.Next() {
@@ -228,12 +238,18 @@ func (me *monitoringExporter) recordToMetricAndMonitoredResourcePbs(metrics otel
228238
if _, ok := allowedMetricLabels[string(kv.Key)]; ok {
229239
labels[labelKey] = kv.Value.Emit()
230240
}
241+
if _, ok := allowedEEFMetricLabels[string(kv.Key)]; ok && isEEFMetric {
242+
labels[labelKey] = kv.Value.Emit()
243+
}
231244
}
232245
}
233246
for _, label := range me.clientAttributes {
234247
if _, isResLabel := monitoredResLabelsSet[string(label.Key)]; isResLabel {
235248
mr.Labels[string(label.Key)] = label.Value.Emit()
236249
} else {
250+
if ok := allowedEEFMetricLabels[string(label.Key)]; isEEFMetric && !ok {
251+
continue
252+
}
237253
labels[string(label.Key)] = label.Value.Emit()
238254
}
239255
}
@@ -255,7 +271,7 @@ func (me *monitoringExporter) recordsToTimeSeriesPbs(rm *otelmetricdata.Resource
255271
errs []error
256272
)
257273
for _, scope := range rm.ScopeMetrics {
258-
if !(scope.Scope.Name == builtInMetricsMeterName || scope.Scope.Name == grpcMetricMeterName) {
274+
if !(scope.Scope.Name == builtInMetricsMeterName || scope.Scope.Name == grpcMetricMeterName || scope.Scope.Name == grpcGcpMetricMeterName) {
259275
continue
260276
}
261277
for _, metrics := range scope.Metrics {

0 commit comments

Comments
 (0)