package connectsrv import ( "context" "time" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/metric/noop" ) // meterName scopes the gateway edge's OpenTelemetry instruments. const meterName = "scrabble/gateway/edge" // serverMetrics holds the edge's operational instruments. It defaults to no-ops; // NewServer installs the real meter when one is supplied in Deps. type serverMetrics struct { edge metric.Float64Histogram } // newServerMetrics builds the instruments on meter (nil selects a no-op meter), // falling back to a no-op histogram on the (rare) construction error. func newServerMetrics(meter metric.Meter) *serverMetrics { if meter == nil { meter = noop.NewMeterProvider().Meter(meterName) } h, err := meter.Float64Histogram("edge_request_duration", metric.WithUnit("s"), metric.WithDescription("Seconds to serve one Connect Execute call, by message type and result.")) if err != nil { h, _ = noop.NewMeterProvider().Meter(meterName).Float64Histogram("edge_request_duration") } return &serverMetrics{edge: h} } // recordEdge records the duration of one Execute call labelled by message type and // outcome (ok, domain, unauthenticated, rate_limited, unknown_type or internal). func (m *serverMetrics) recordEdge(ctx context.Context, msgType, result string, start time.Time) { m.edge.Record(ctx, time.Since(start).Seconds(), metric.WithAttributes( attribute.String("message_type", msgType), attribute.String("result", result), )) }