summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2025-09-24 14:02:09 -0700
committerBrad Fitzpatrick <bradfitz@tailscale.com>2025-09-24 14:02:09 -0700
commit59e5b81832846c1af76db50cfd82465d8558553f (patch)
tree85966a5340167f2a6463816b8d9b69d7f32c32d3
parent34242df51b413351a1caec2213d7e9ca41dd75ed (diff)
downloadtailscale-bradfitz/rm_usermetrics_66KB.tar.xz
tailscale-bradfitz/rm_usermetrics_66KB.zip
Change-Id: I5ff861f12cc1a0b00e2cd2289d6f51fd936b0e0a Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
-rw-r--r--health/health.go3
-rw-r--r--net/tstun/wrap.go5
-rw-r--r--util/usermetric/metrics.go33
-rw-r--r--util/usermetric/usermetric.go96
4 files changed, 27 insertions, 110 deletions
diff --git a/health/health.go b/health/health.go
index 3d1c46a3d..f465f569d 100644
--- a/health/health.go
+++ b/health/health.go
@@ -20,7 +20,6 @@ import (
"time"
"tailscale.com/envknob"
- "tailscale.com/metrics"
"tailscale.com/tailcfg"
"tailscale.com/tstime"
"tailscale.com/types/opt"
@@ -133,7 +132,7 @@ type Tracker struct {
lastLoginErr error
localLogConfigErr error
tlsConnectionErrors map[string]error // map[ServerName]error
- metricHealthMessage *metrics.MultiLabelMap[metricHealthMessageLabel]
+ metricHealthMessage *usermetric.MultiLabelMap[metricHealthMessageLabel]
}
// NewTracker contructs a new [Tracker] and attaches the given eventbus.
diff --git a/net/tstun/wrap.go b/net/tstun/wrap.go
index 4c88c7eef..72c7ee37a 100644
--- a/net/tstun/wrap.go
+++ b/net/tstun/wrap.go
@@ -25,7 +25,6 @@ import (
"gvisor.dev/gvisor/pkg/tcpip/stack"
"tailscale.com/disco"
"tailscale.com/feature/buildfeatures"
- tsmetrics "tailscale.com/metrics"
"tailscale.com/net/connstats"
"tailscale.com/net/packet"
"tailscale.com/net/packet/checksum"
@@ -214,8 +213,8 @@ type Wrapper struct {
}
type metrics struct {
- inboundDroppedPacketsTotal *tsmetrics.MultiLabelMap[usermetric.DropLabels]
- outboundDroppedPacketsTotal *tsmetrics.MultiLabelMap[usermetric.DropLabels]
+ inboundDroppedPacketsTotal *usermetric.MultiLabelMap[usermetric.DropLabels]
+ outboundDroppedPacketsTotal *usermetric.MultiLabelMap[usermetric.DropLabels]
}
func registerMetrics(reg *usermetric.Registry) *metrics {
diff --git a/util/usermetric/metrics.go b/util/usermetric/metrics.go
index 044b4d65f..bb1493c56 100644
--- a/util/usermetric/metrics.go
+++ b/util/usermetric/metrics.go
@@ -9,16 +9,11 @@ package usermetric
import (
"sync"
-
- "tailscale.com/metrics"
)
// Metrics contains user-facing metrics that are used by multiple packages.
type Metrics struct {
initOnce sync.Once
-
- droppedPacketsInbound *metrics.MultiLabelMap[DropLabels]
- droppedPacketsOutbound *metrics.MultiLabelMap[DropLabels]
}
// DropReason is the reason why a packet was dropped.
@@ -53,33 +48,13 @@ type DropLabels struct {
Reason DropReason
}
-// initOnce initializes the common metrics.
-func (r *Registry) initOnce() {
- r.m.initOnce.Do(func() {
- r.m.droppedPacketsInbound = NewMultiLabelMapWithRegistry[DropLabels](
- r,
- "tailscaled_inbound_dropped_packets_total",
- "counter",
- "Counts the number of dropped packets received by the node from other peers",
- )
- r.m.droppedPacketsOutbound = NewMultiLabelMapWithRegistry[DropLabels](
- r,
- "tailscaled_outbound_dropped_packets_total",
- "counter",
- "Counts the number of packets dropped while being sent to other peers",
- )
- })
-}
-
// DroppedPacketsOutbound returns the outbound dropped packet metric, creating it
// if necessary.
-func (r *Registry) DroppedPacketsOutbound() *metrics.MultiLabelMap[DropLabels] {
- r.initOnce()
- return r.m.droppedPacketsOutbound
+func (r *Registry) DroppedPacketsOutbound() *MultiLabelMap[DropLabels] {
+ return &MultiLabelMap[DropLabels]{}
}
// DroppedPacketsInbound returns the inbound dropped packet metric.
-func (r *Registry) DroppedPacketsInbound() *metrics.MultiLabelMap[DropLabels] {
- r.initOnce()
- return r.m.droppedPacketsInbound
+func (r *Registry) DroppedPacketsInbound() *MultiLabelMap[DropLabels] {
+ return &MultiLabelMap[DropLabels]{}
}
diff --git a/util/usermetric/usermetric.go b/util/usermetric/usermetric.go
index 74e9447a6..d6dcf5087 100644
--- a/util/usermetric/usermetric.go
+++ b/util/usermetric/usermetric.go
@@ -6,24 +6,19 @@
package usermetric
import (
- "expvar"
- "fmt"
"io"
"net/http"
- "strings"
-
- "tailscale.com/metrics"
- "tailscale.com/tsweb/varz"
- "tailscale.com/util/set"
)
// Registry tracks user-facing metrics of various Tailscale subsystems.
-type Registry struct {
- vars expvar.Map
+type Registry struct{}
- // m contains common metrics owned by the registry.
- m Metrics
-}
+type noop struct{}
+
+type MultiLabelMap[T comparable] struct{}
+
+func (*MultiLabelMap[T]) Add(T, int64) {}
+func (*MultiLabelMap[T]) Set(T, any) {}
// NewMultiLabelMapWithRegistry creates and register a new
// MultiLabelMap[T] variable with the given name and returns it.
@@ -32,88 +27,37 @@ type Registry struct {
// Note that usermetric are not protected against duplicate
// metrics name. It is the caller's responsibility to ensure that
// the name is unique.
-func NewMultiLabelMapWithRegistry[T comparable](m *Registry, name string, promType, helpText string) *metrics.MultiLabelMap[T] {
- ml := &metrics.MultiLabelMap[T]{
- Type: promType,
- Help: helpText,
- }
- var zero T
- _ = metrics.LabelString(zero) // panic early if T is invalid
- m.vars.Set(name, ml)
- return ml
+func NewMultiLabelMapWithRegistry[T comparable](m *Registry, name string, promType, helpText string) *MultiLabelMap[T] {
+ return &MultiLabelMap[T]{}
}
// Gauge is a gauge metric with no labels.
-type Gauge struct {
- m *expvar.Float
- help string
-}
+type Gauge struct{}
+
+var noopGauge = &Gauge{}
// NewGauge creates and register a new gauge metric with the given name and help text.
-func (r *Registry) NewGauge(name, help string) *Gauge {
- g := &Gauge{&expvar.Float{}, help}
- r.vars.Set(name, g)
- return g
-}
+func (r *Registry) NewGauge(name, help string) *Gauge { return noopGauge }
-// Set sets the gauge to the given value.
-func (g *Gauge) Set(v float64) {
- if g == nil {
- return
- }
- g.m.Set(v)
-}
+func (g *Gauge) Add(v float64) {}
+func (g *Gauge) Set(v float64) {}
-// String returns the string of the underlying expvar.Float.
-// This satisfies the expvar.Var interface.
-func (g *Gauge) String() string {
- if g == nil {
- return ""
- }
- return g.m.String()
-}
+// Set sets the gauge to the given value.
+func (noop) Set(v float64) {}
// WritePrometheus writes the gauge metric in Prometheus format to the given writer.
// This satisfies the varz.PrometheusWriter interface.
func (g *Gauge) WritePrometheus(w io.Writer, name string) {
- io.WriteString(w, "# TYPE ")
- io.WriteString(w, name)
- io.WriteString(w, " gauge\n")
- if g.help != "" {
- io.WriteString(w, "# HELP ")
- io.WriteString(w, name)
- io.WriteString(w, " ")
- io.WriteString(w, g.help)
- io.WriteString(w, "\n")
- }
-
- io.WriteString(w, name)
- fmt.Fprintf(w, " %v\n", g.m.Value())
+ panic("")
}
// Handler returns a varz.Handler that serves the userfacing expvar contained
// in this package.
func (r *Registry) Handler(w http.ResponseWriter, req *http.Request) {
- varz.ExpvarDoHandler(r.vars.Do)(w, req)
-}
-
-// String returns the string representation of all the metrics and their
-// values in the registry. It is useful for debugging.
-func (r *Registry) String() string {
- var sb strings.Builder
- r.vars.Do(func(kv expvar.KeyValue) {
- fmt.Fprintf(&sb, "%s: %v\n", kv.Key, kv.Value)
- })
-
- return sb.String()
+ http.NotFound(w, req)
}
// Metrics returns the name of all the metrics in the registry.
func (r *Registry) MetricNames() []string {
- ret := make(set.Set[string])
- r.vars.Do(func(kv expvar.KeyValue) {
- ret.Add(kv.Key)
- })
-
- return ret.Slice()
+ return nil
}