From 08295e511619aeec7f908c1e059d2f6c22cc9969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Papp?= Date: Wed, 28 Jan 2026 17:35:10 +0100 Subject: [PATCH] Delete otel lib from client --- client/internal/metrics/otel.go | 250 -------------------------------- go.mod | 2 +- 2 files changed, 1 insertion(+), 251 deletions(-) delete mode 100644 client/internal/metrics/otel.go diff --git a/client/internal/metrics/otel.go b/client/internal/metrics/otel.go deleted file mode 100644 index 43bb12232..000000000 --- a/client/internal/metrics/otel.go +++ /dev/null @@ -1,250 +0,0 @@ -package metrics - -import ( - "context" - "fmt" - "io" - - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - sdkmetric "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/sdk/metric/metricdata" -) - -// otelMetrics is the OpenTelemetry implementation of ClientMetrics -type otelMetrics struct { - reader *sdkmetric.ManualReader - meterProvider *sdkmetric.MeterProvider - meter metric.Meter - - // Static attributes applied to all metrics - deploymentType DeploymentType - - // Connection stage duration histograms - stageCreationToSemaphore metric.Float64Histogram - stageSemaphoreToSignaling metric.Float64Histogram - stageSignalingToConnection metric.Float64Histogram - stageConnectionToHandshake metric.Float64Histogram - stageTotalCreationToHandshake metric.Float64Histogram -} - -func newOtelMetrics(deploymentType DeploymentType) metricsImplementation { - reader := sdkmetric.NewManualReader() - meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader)) - - otel.SetMeterProvider(meterProvider) - - meter := meterProvider.Meter("netbird.client") - - stageCreationToSemaphore, err := meter.Float64Histogram( - "netbird.peer.connection.stage.creation_to_semaphore", - metric.WithDescription("Duration from connection creation to semaphore acquisition"), - metric.WithUnit("s"), - ) - if err != nil { - return &noopMetrics{} - } - - stageSemaphoreToSignaling, err := meter.Float64Histogram( - "netbird.peer.connection.stage.semaphore_to_signaling", - metric.WithDescription("Duration from semaphore acquisition to signaling start"), - metric.WithUnit("s"), - ) - if err != nil { - return &noopMetrics{} - } - - stageSignalingToConnection, err := meter.Float64Histogram( - "netbird.peer.connection.stage.signaling_to_connection", - metric.WithDescription("Duration from signaling start to connection ready"), - metric.WithUnit("s"), - ) - if err != nil { - return &noopMetrics{} - } - - stageConnectionToHandshake, err := meter.Float64Histogram( - "netbird.peer.connection.stage.connection_to_handshake", - metric.WithDescription("Duration from connection ready to WireGuard handshake success"), - metric.WithUnit("s"), - ) - if err != nil { - return &noopMetrics{} - } - - stageTotalCreationToHandshake, err := meter.Float64Histogram( - "netbird.peer.connection.total.creation_to_handshake", - metric.WithDescription("Total duration from connection creation to WireGuard handshake success"), - metric.WithUnit("s"), - ) - if err != nil { - return &noopMetrics{} - } - - return &otelMetrics{ - reader: reader, - meterProvider: meterProvider, - meter: meter, - deploymentType: deploymentType, - stageCreationToSemaphore: stageCreationToSemaphore, - stageSemaphoreToSignaling: stageSemaphoreToSignaling, - stageSignalingToConnection: stageSignalingToConnection, - stageConnectionToHandshake: stageConnectionToHandshake, - stageTotalCreationToHandshake: stageTotalCreationToHandshake, - } -} - -// RecordConnectionStages records the duration of each connection stage from timestamps -func (m *otelMetrics) RecordConnectionStages( - ctx context.Context, - connectionType ConnectionType, - isReconnection bool, - timestamps ConnectionStageTimestamps, -) { - // Calculate stage durations - var creationToSemaphore, semaphoreToSignaling, signalingToConnection, connectionToHandshake, totalDuration float64 - - if !timestamps.Created.IsZero() && !timestamps.SemaphoreAcquired.IsZero() { - creationToSemaphore = timestamps.SemaphoreAcquired.Sub(timestamps.Created).Seconds() - } - - if !timestamps.SemaphoreAcquired.IsZero() && !timestamps.Signaling.IsZero() { - semaphoreToSignaling = timestamps.Signaling.Sub(timestamps.SemaphoreAcquired).Seconds() - } - - if !timestamps.Signaling.IsZero() && !timestamps.ConnectionReady.IsZero() { - signalingToConnection = timestamps.ConnectionReady.Sub(timestamps.Signaling).Seconds() - } - - if !timestamps.ConnectionReady.IsZero() && !timestamps.WgHandshakeSuccess.IsZero() { - connectionToHandshake = timestamps.WgHandshakeSuccess.Sub(timestamps.ConnectionReady).Seconds() - } - - if !timestamps.Created.IsZero() && !timestamps.WgHandshakeSuccess.IsZero() { - totalDuration = timestamps.WgHandshakeSuccess.Sub(timestamps.Created).Seconds() - } - - // Determine attempt type - attemptType := "initial" - if isReconnection { - attemptType = "reconnection" - } - - // Combine deployment type, connection type, and attempt type attributes - attrs := metric.WithAttributes( - attribute.String("deployment_type", m.deploymentType.String()), - attribute.String("connection_type", connectionType.String()), - attribute.String("attempt_type", attemptType), - ) - - m.stageCreationToSemaphore.Record(ctx, creationToSemaphore, attrs) - m.stageSemaphoreToSignaling.Record(ctx, semaphoreToSignaling, attrs) - m.stageSignalingToConnection.Record(ctx, signalingToConnection, attrs) - m.stageConnectionToHandshake.Record(ctx, connectionToHandshake, attrs) - m.stageTotalCreationToHandshake.Record(ctx, totalDuration, attrs) -} - -// Export writes metrics in Prometheus text format -func (m *otelMetrics) Export(w io.Writer) error { - if m.reader == nil { - return fmt.Errorf("metrics reader not initialized") - } - - // Collect current metrics - var rm metricdata.ResourceMetrics - if err := m.reader.Collect(context.Background(), &rm); err != nil { - return fmt.Errorf("failed to collect metrics: %w", err) - } - - // Iterate through scope metrics and write in Prometheus format - for _, sm := range rm.ScopeMetrics { - for _, m := range sm.Metrics { - // Write HELP line - if _, err := fmt.Fprintf(w, "# HELP %s %s\n", m.Name, m.Description); err != nil { - return err - } - - // Write TYPE line - if _, err := fmt.Fprintf(w, "# TYPE %s histogram\n", m.Name); err != nil { - return err - } - - // Handle histogram data - if hist, ok := m.Data.(metricdata.Histogram[float64]); ok { - for _, dp := range hist.DataPoints { - // Build label string from attributes - labelStr := "" - if len(dp.Attributes.ToSlice()) > 0 { - labels := "" - for _, attr := range dp.Attributes.ToSlice() { - if labels != "" { - labels += "," - } - labels += fmt.Sprintf("%s=\"%s\"", attr.Key, attr.Value.AsString()) - } - labelStr = labels - } - - // Write bucket counts - cumulativeCount := uint64(0) - for i, bound := range dp.Bounds { - cumulativeCount += dp.BucketCounts[i] - bucketLabel := labelStr - if bucketLabel != "" { - bucketLabel += "," - } - bucketLabel += fmt.Sprintf("le=\"%g\"", bound) - if _, err := fmt.Fprintf(w, "%s_bucket{%s} %d\n", - m.Name, bucketLabel, cumulativeCount); err != nil { - return err - } - } - - // Write +Inf bucket (last bucket count) - if len(dp.BucketCounts) > len(dp.Bounds) { - cumulativeCount += dp.BucketCounts[len(dp.BucketCounts)-1] - } - bucketLabel := labelStr - if bucketLabel != "" { - bucketLabel += "," - } - bucketLabel += "le=\"+Inf\"" - if _, err := fmt.Fprintf(w, "%s_bucket{%s} %d\n", - m.Name, bucketLabel, cumulativeCount); err != nil { - return err - } - - // Write sum - if labelStr != "" { - if _, err := fmt.Fprintf(w, "%s_sum{%s} %g\n", m.Name, labelStr, dp.Sum); err != nil { - return err - } - } else { - if _, err := fmt.Fprintf(w, "%s_sum %g\n", m.Name, dp.Sum); err != nil { - return err - } - } - - // Write count - if labelStr != "" { - if _, err := fmt.Fprintf(w, "%s_count{%s} %d\n", m.Name, labelStr, dp.Count); err != nil { - return err - } - } else { - if _, err := fmt.Fprintf(w, "%s_count %d\n", m.Name, dp.Count); err != nil { - return err - } - } - } - } - - // Empty line between metrics - if _, err := fmt.Fprintf(w, "\n"); err != nil { - return err - } - } - } - - return nil -} diff --git a/go.mod b/go.mod index dc922b2f8..0b8d40470 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( fyne.io/fyne/v2 v2.7.0 fyne.io/systray v1.12.1-0.20260116214250-81f8e1a496f9 github.com/TheJumpCloud/jcapi-go v3.0.0+incompatible + github.com/VictoriaMetrics/metrics v1.40.2 github.com/awnumar/memguard v0.23.0 github.com/aws/aws-sdk-go-v2 v1.36.3 github.com/aws/aws-sdk-go-v2/config v1.29.14 @@ -141,7 +142,6 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.12.3 // indirect - github.com/VictoriaMetrics/metrics v1.40.2 // indirect github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/awnumar/memcall v0.4.0 // indirect