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 }