MCPcopy
hub / github.com/netdata/netdata / initMetrics

Function initMetrics

packaging/tools/agent-events/server.go:94–192  ·  view source on GitHub ↗

--- Core Logic Functions --- initMetrics initializes OpenTelemetry metrics and expvar metrics for backward compatibility

()

Source from the content-addressed store, hash-verified

92
93// initMetrics initializes OpenTelemetry metrics and expvar metrics for backward compatibility
94func 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)))

Callers 2

mainFunction · 0.85
setupTestFunction · 0.85

Calls 8

LockMethod · 0.80
UnlockMethod · 0.80
NewMethod · 0.65
ErrorfMethod · 0.65
AddMethod · 0.65
SetMethod · 0.65
ErrorMethod · 0.45
StringMethod · 0.45

Tested by 1

setupTestFunction · 0.68

Used in the wild real call sites across dependent graphs

searching dependent graphs…