--- Core Logic Functions --- initMetrics initializes OpenTelemetry metrics and expvar metrics for backward compatibility
()
| 92 | |
| 93 | // initMetrics initializes OpenTelemetry metrics and expvar metrics for backward compatibility |
| 94 | func initMetrics() (*prometheus.Exporter, error) { |
| 95 | // Set up the OpenTelemetry Prometheus exporter |
| 96 | exporter, err := prometheus.New() |
| 97 | if err != nil { |
| 98 | // Return error instead of exiting directly |
| 99 | return nil, fmt.Errorf("failed to create Prometheus exporter: %w", err) |
| 100 | } |
| 101 | |
| 102 | // Create a new meter provider with the Prometheus exporter as a Reader |
| 103 | meterProvider = sdkmetric.NewMeterProvider( |
| 104 | sdkmetric.WithReader(exporter), |
| 105 | ) |
| 106 | otel.SetMeterProvider(meterProvider) |
| 107 | |
| 108 | // Create a new meter |
| 109 | meter = meterProvider.Meter("agent-events") |
| 110 | |
| 111 | // --- Create Metric Instruments --- |
| 112 | // Helper to create counters with status labels for consolidated metrics |
| 113 | createLabeledCounter := func(name, desc string) (metric.Int64Counter, error) { |
| 114 | counter, err := meter.Int64Counter( |
| 115 | name, |
| 116 | metric.WithDescription(desc), |
| 117 | metric.WithUnit("1"), |
| 118 | ) |
| 119 | if err != nil { |
| 120 | slog.Error("failed to create labeled counter", "name", name, "error", err) |
| 121 | } |
| 122 | return counter, err |
| 123 | } |
| 124 | createGauge := func(name, desc string) (metric.Int64ObservableGauge, error) { |
| 125 | gauge, err := meter.Int64ObservableGauge(name, metric.WithDescription(desc)) |
| 126 | if err != nil { |
| 127 | slog.Error("failed to create gauge", "name", name, "error", err) |
| 128 | } |
| 129 | return gauge, err |
| 130 | } |
| 131 | createHistogram := func(name, desc string, buckets []float64) (metric.Float64Histogram, error) { |
| 132 | hist, err := meter.Float64Histogram(name, |
| 133 | metric.WithDescription(desc), |
| 134 | metric.WithExplicitBucketBoundaries(buckets...), |
| 135 | ) |
| 136 | if err != nil { |
| 137 | slog.Error("failed to create histogram", "name", name, "error", err) |
| 138 | } |
| 139 | return hist, err |
| 140 | } |
| 141 | |
| 142 | // Create unified counters with status label |
| 143 | requestsCounter, _ = createLabeledCounter("agent_events_requests", "Number of requests by status") |
| 144 | bytesReceived, _ = createLabeledCounter("agent_events_received_bytes", "Number of bytes received in request bodies by status") |
| 145 | |
| 146 | // Pre-initialize counters with all status labels set to zero |
| 147 | ctx := context.Background() |
| 148 | statusLabels := []string{"success", "duplicate", "invalid_json", "method_not_allowed", "body_too_large", "failed_to_read", "cant_marshal_output"} |
| 149 | for _, status := range statusLabels { |
| 150 | requestsCounter.Add(ctx, 0, metric.WithAttributes(attribute.String("status", status))) |
| 151 | bytesReceived.Add(ctx, 0, metric.WithAttributes(attribute.String("status", status))) |