net/portmapper: fix invalid UPnP metric name

Fixes #9551

Signed-off-by: Andrew Dunham <andrew@du.nham.ca>
Change-Id: I06f3a15a668be621675be6cbc7e5bdcc006e8570
pull/9556/head
Andrew Dunham 1 year ago
parent 3e298e9380
commit d31460f793

@ -1040,7 +1040,16 @@ func getUPnPErrorsMetric(code int) *clientmetric.Metric {
return mm return mm
} }
mm = clientmetric.NewCounter(fmt.Sprintf("portmap_upnp_errors_with_code_%d", code)) // Metric names cannot contain a hyphen, so we handle negative numbers
// by prefixing the name with a "minus_".
var codeStr string
if code < 0 {
codeStr = fmt.Sprintf("portmap_upnp_errors_with_code_minus_%d", -code)
} else {
codeStr = fmt.Sprintf("portmap_upnp_errors_with_code_%d", code)
}
mm = clientmetric.NewCounter(codeStr)
mak.Set(&metricUPnPErrorsByCode, code, mm) mak.Set(&metricUPnPErrorsByCode, code, mm)
return mm return mm
} }

@ -124,3 +124,14 @@ func TestPCPIntegration(t *testing.T) {
t.Errorf("got nil mapping after successful createOrGetMapping") t.Errorf("got nil mapping after successful createOrGetMapping")
} }
} }
// Test to ensure that metric names generated by this function do not contain
// invalid characters.
//
// See https://github.com/tailscale/tailscale/issues/9551
func TestGetUPnPErrorsMetric(t *testing.T) {
// This will panic if the metric name is invalid.
getUPnPErrorsMetric(100)
getUPnPErrorsMetric(0)
getUPnPErrorsMetric(-100)
}

Loading…
Cancel
Save