mirror of
https://github.com/cloudflare/cloudflared.git
synced 2026-10-12 02:12:14 +00:00
Delete the unused tunnelsForHA implementations and stale edge discovery test mocks. Remove unpopulated metrics and simplify the stream copy path by dropping its permanently disabled debug implementation.
147 lines
3.8 KiB
Go
147 lines
3.8 KiB
Go
package connection
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
const (
|
|
MetricsNamespace = "cloudflared"
|
|
TunnelSubsystem = "tunnel"
|
|
configSubsystem = "config"
|
|
)
|
|
|
|
type localConfigMetrics struct {
|
|
pushes prometheus.Counter
|
|
pushesErrors prometheus.Counter
|
|
}
|
|
|
|
type tunnelMetrics struct {
|
|
serverLocations *prometheus.GaugeVec
|
|
// locationLock is a mutex for oldServerLocations
|
|
locationLock sync.Mutex
|
|
// oldServerLocations stores the last server the tunnel was connected to
|
|
oldServerLocations map[string]string
|
|
|
|
regSuccess *prometheus.CounterVec
|
|
regFail *prometheus.CounterVec
|
|
|
|
userHostnamesCounts *prometheus.CounterVec
|
|
|
|
localConfigMetrics *localConfigMetrics
|
|
}
|
|
|
|
//nolint:promlinter // Preserve existing metric names for compatibility.
|
|
func newLocalConfigMetrics() *localConfigMetrics {
|
|
pushesMetric := prometheus.NewCounter(
|
|
prometheus.CounterOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: configSubsystem,
|
|
Name: "local_config_pushes",
|
|
Help: "Number of local configuration pushes to the edge",
|
|
},
|
|
)
|
|
|
|
pushesErrorsMetric := prometheus.NewCounter(
|
|
prometheus.CounterOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: configSubsystem,
|
|
Name: "local_config_pushes_errors",
|
|
Help: "Number of errors occurred during local configuration pushes",
|
|
},
|
|
)
|
|
|
|
prometheus.MustRegister(
|
|
pushesMetric,
|
|
pushesErrorsMetric,
|
|
)
|
|
|
|
return &localConfigMetrics{
|
|
pushes: pushesMetric,
|
|
pushesErrors: pushesErrorsMetric,
|
|
}
|
|
}
|
|
|
|
// Metrics that can be collected without asking the edge
|
|
//
|
|
//nolint:promlinter // Preserve existing metric names for compatibility.
|
|
func initTunnelMetrics() *tunnelMetrics {
|
|
serverLocations := prometheus.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: TunnelSubsystem,
|
|
Name: "server_locations",
|
|
Help: "Where each tunnel is connected to. 1 means current location, 0 means previous locations.",
|
|
},
|
|
[]string{"connection_id", "edge_location"},
|
|
)
|
|
prometheus.MustRegister(serverLocations)
|
|
|
|
registerFail := prometheus.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: TunnelSubsystem,
|
|
Name: "tunnel_register_fail",
|
|
Help: "Count of tunnel registration errors by type",
|
|
},
|
|
[]string{"error", "rpcName"},
|
|
)
|
|
prometheus.MustRegister(registerFail)
|
|
|
|
userHostnamesCounts := prometheus.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: TunnelSubsystem,
|
|
Name: "user_hostnames_counts",
|
|
Help: "Which user hostnames cloudflared is serving",
|
|
},
|
|
[]string{"userHostname"},
|
|
)
|
|
prometheus.MustRegister(userHostnamesCounts)
|
|
|
|
registerSuccess := prometheus.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Namespace: MetricsNamespace,
|
|
Subsystem: TunnelSubsystem,
|
|
Name: "tunnel_register_success",
|
|
Help: "Count of successful tunnel registrations",
|
|
},
|
|
[]string{"rpcName"},
|
|
)
|
|
prometheus.MustRegister(registerSuccess)
|
|
|
|
return &tunnelMetrics{
|
|
serverLocations: serverLocations,
|
|
oldServerLocations: make(map[string]string),
|
|
regSuccess: registerSuccess,
|
|
regFail: registerFail,
|
|
userHostnamesCounts: userHostnamesCounts,
|
|
localConfigMetrics: newLocalConfigMetrics(),
|
|
}
|
|
}
|
|
|
|
func (t *tunnelMetrics) registerServerLocation(connectionID, loc string) {
|
|
t.locationLock.Lock()
|
|
defer t.locationLock.Unlock()
|
|
if oldLoc, ok := t.oldServerLocations[connectionID]; ok && oldLoc == loc {
|
|
return
|
|
} else if ok {
|
|
t.serverLocations.WithLabelValues(connectionID, oldLoc).Dec()
|
|
}
|
|
t.serverLocations.WithLabelValues(connectionID, loc).Inc()
|
|
t.oldServerLocations[connectionID] = loc
|
|
}
|
|
|
|
var tunnelMetricsInternal struct {
|
|
sync.Once
|
|
metrics *tunnelMetrics
|
|
}
|
|
|
|
func newTunnelMetrics() *tunnelMetrics {
|
|
tunnelMetricsInternal.Do(func() {
|
|
tunnelMetricsInternal.metrics = initTunnelMetrics()
|
|
})
|
|
return tunnelMetricsInternal.metrics
|
|
}
|