pkg/metrics/stats_reporter.go (62 lines of code) (raw):

package metrics import ( "context" "runtime" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/metric/global" ) var ( providerAttr = attribute.String("provider", "azure") osTypeAttr = attribute.String("os_type", runtime.GOOS) // set service.name attribute explicitly to the provider name as the default service name is "unknown_service:<binary name>" serviceNameAttr = attribute.String("service.name", "csi-secrets-store-provider-azure") objectTypeKey = "object_type" objectNameKey = "object_name" errorKey = "error" grpcMethodKey = "grpc_method" grpcCodeKey = "grpc_code" grpcMessageKey = "grpc_message" keyvaultRequest metric.Float64ValueRecorder grpcRequest metric.Float64ValueRecorder ) type reporter struct { meter metric.Meter } // StatsReporter is the interface for reporting metrics type StatsReporter interface { ReportKeyvaultRequest(ctx context.Context, duration float64, objectType, objectName, err string) ReportGRPCRequest(ctx context.Context, duration float64, method, code, message string) } // NewStatsReporter creates a new StatsReporter func NewStatsReporter() StatsReporter { meter := global.Meter("csi-secrets-store-provider-azure") keyvaultRequest = metric.Must(meter).NewFloat64ValueRecorder("keyvault_request", metric.WithDescription("Distribution of how long it took to get from keyvault")) grpcRequest = metric.Must(meter).NewFloat64ValueRecorder("grpc_request", metric.WithDescription("Distribution of how long it took for the gRPC requests")) return &reporter{meter: meter} } // ReportKeyvaultRequest reports the duration of the keyvault request // objectType and objectName are used to identify the object being accessed // err is used to identify the error if any func (r *reporter) ReportKeyvaultRequest(ctx context.Context, duration float64, objectType, objectName, err string) { attributes := []attribute.KeyValue{ serviceNameAttr, providerAttr, osTypeAttr, attribute.String(objectTypeKey, objectType), attribute.String(objectNameKey, objectName), attribute.String(errorKey, err), } r.meter.RecordBatch(ctx, attributes, keyvaultRequest.Measurement(duration), ) } // ReportGRPCRequest reports the duration of the gRPC request // method and code are used to identify the gRPC request func (r *reporter) ReportGRPCRequest(ctx context.Context, duration float64, method, code, message string) { attributes := []attribute.KeyValue{ serviceNameAttr, providerAttr, osTypeAttr, attribute.String(grpcMethodKey, method), attribute.String(grpcCodeKey, code), attribute.String(grpcMessageKey, message), } r.meter.RecordBatch(ctx, attributes, grpcRequest.Measurement(duration), ) }