mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-03 12:09:09 +02:00
[management,signal,proxy] add pyroscope profiling (#7536)
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user