[management,signal,proxy] add pyroscope profiling (#7536)

This commit is contained in:
Pascal Fischer
2026-09-23 18:01:35 +02:00
committed by GitHub
parent 40dffc69ae
commit 7009add7a9
16 changed files with 614 additions and 30 deletions
@@ -0,0 +1,49 @@
package metrics_test
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"github.com/netbirdio/netbird/proxy/internal/metrics"
)
func TestRegisterClientObserver(t *testing.T) {
reader := sdkmetric.NewManualReader()
provider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader))
m, err := metrics.New(context.Background(), provider.Meter("test"))
require.NoError(t, err)
clients := 2
require.NoError(t, m.RegisterClientObserver(func() int { return clients }))
var rm metricdata.ResourceMetrics
require.NoError(t, reader.Collect(context.Background(), &rm))
assert.Equal(t, int64(2), gaugeValue(t, rm, "proxy.clients.count"), "gauge must report the current client count")
clients = 1
require.NoError(t, reader.Collect(context.Background(), &rm))
assert.Equal(t, int64(1), gaugeValue(t, rm, "proxy.clients.count"), "gauge must follow the client count on the next collection")
}
func gaugeValue(t *testing.T, rm metricdata.ResourceMetrics, name string) int64 {
t.Helper()
for _, sm := range rm.ScopeMetrics {
for _, mtr := range sm.Metrics {
if mtr.Name != name {
continue
}
gauge, ok := mtr.Data.(metricdata.Gauge[int64])
require.True(t, ok, "%s must be an int64 gauge", name)
require.Len(t, gauge.DataPoints, 1, "%s must have a single data point", name)
return gauge.DataPoints[0].Value
}
}
t.Fatalf("gauge %s not found", name)
return 0
}
+15
View File
@@ -196,6 +196,21 @@ func (m *Metrics) RecordAddPeerDuration(d time.Duration, err error) {
))
}
// RegisterClientObserver reports the number of embedded clients as a gauge.
// clientCount runs on every collection cycle, so it must stay cheap.
func (m *Metrics) RegisterClientObserver(clientCount func() int) error {
_, err := m.meter.Int64ObservableGauge(
"proxy.clients.count",
metric.WithUnit("1"),
metric.WithDescription("Current number of embedded NetBird clients running on the netbird proxy"),
metric.WithInt64Callback(func(_ context.Context, o metric.Int64Observer) error {
o.Observe(int64(clientCount()))
return nil
}),
)
return err
}
func (m *Metrics) initL4Metrics(meter metric.Meter) error {
var err error