Browse Source

wgengine/magicsock: add home DERP region usermetric (#18062)

Expose the node's home DERP region ID as a Prometheus gauge via the
usermetrics endpoint.

Fixes #18061

Signed-off-by: Raj Singh <[email protected]>
Raj Singh 1 month ago
parent
commit
aadc4f2ef4
2 changed files with 19 additions and 0 deletions
  1. 12 0
      wgengine/magicsock/derp.go
  2. 7 0
      wgengine/magicsock/magicsock.go

+ 12 - 0
wgengine/magicsock/derp.go

@@ -216,17 +216,28 @@ func (c *Conn) derpRegionCodeLocked(regionID int) string {
 	return ""
 	return ""
 }
 }
 
 
+// setHomeDERPGaugeLocked updates the home DERP gauge metric.
+//
+// c.mu must be held.
+func (c *Conn) setHomeDERPGaugeLocked(derpNum int) {
+	if c.homeDERPGauge != nil {
+		c.homeDERPGauge.Set(float64(derpNum))
+	}
+}
+
 // c.mu must NOT be held.
 // c.mu must NOT be held.
 func (c *Conn) setNearestDERP(derpNum int) (wantDERP bool) {
 func (c *Conn) setNearestDERP(derpNum int) (wantDERP bool) {
 	c.mu.Lock()
 	c.mu.Lock()
 	defer c.mu.Unlock()
 	defer c.mu.Unlock()
 	if !c.wantDerpLocked() {
 	if !c.wantDerpLocked() {
 		c.myDerp = 0
 		c.myDerp = 0
+		c.setHomeDERPGaugeLocked(0)
 		c.health.SetMagicSockDERPHome(0, c.homeless)
 		c.health.SetMagicSockDERPHome(0, c.homeless)
 		return false
 		return false
 	}
 	}
 	if c.homeless {
 	if c.homeless {
 		c.myDerp = 0
 		c.myDerp = 0
+		c.setHomeDERPGaugeLocked(0)
 		c.health.SetMagicSockDERPHome(0, c.homeless)
 		c.health.SetMagicSockDERPHome(0, c.homeless)
 		return false
 		return false
 	}
 	}
@@ -238,6 +249,7 @@ func (c *Conn) setNearestDERP(derpNum int) (wantDERP bool) {
 		metricDERPHomeChange.Add(1)
 		metricDERPHomeChange.Add(1)
 	}
 	}
 	c.myDerp = derpNum
 	c.myDerp = derpNum
+	c.setHomeDERPGaugeLocked(derpNum)
 	c.health.SetMagicSockDERPHome(derpNum, c.homeless)
 	c.health.SetMagicSockDERPHome(derpNum, c.homeless)
 
 
 	if c.privateKey.IsZero() {
 	if c.privateKey.IsZero() {

+ 7 - 0
wgengine/magicsock/magicsock.go

@@ -406,6 +406,10 @@ type Conn struct {
 
 
 	// metrics contains the metrics for the magicsock instance.
 	// metrics contains the metrics for the magicsock instance.
 	metrics *metrics
 	metrics *metrics
+
+	// homeDERPGauge is the usermetric gauge for the home DERP region ID.
+	// This can be nil when [Options.Metrics] are not enabled.
+	homeDERPGauge *usermetric.Gauge
 }
 }
 
 
 // SetDebugLoggingEnabled controls whether spammy debug logging is enabled.
 // SetDebugLoggingEnabled controls whether spammy debug logging is enabled.
@@ -744,6 +748,9 @@ func NewConn(opts Options) (*Conn, error) {
 	}
 	}
 
 
 	c.metrics = registerMetrics(opts.Metrics)
 	c.metrics = registerMetrics(opts.Metrics)
+	if opts.Metrics != nil {
+		c.homeDERPGauge = opts.Metrics.NewGauge("tailscaled_home_derp_region_id", "DERP region ID of this node's home relay server")
+	}
 
 
 	if d4, err := c.listenRawDisco("ip4"); err == nil {
 	if d4, err := c.listenRawDisco("ip4"); err == nil {
 		c.logf("[v1] using BPF disco receiver for IPv4")
 		c.logf("[v1] using BPF disco receiver for IPv4")