Dave Henderson
3 years ago
committed by
GitHub
4 changed files with 74 additions and 25 deletions
@ -0,0 +1,39 @@ |
|||
package metrics |
|||
|
|||
import ( |
|||
"net/http" |
|||
"strconv" |
|||
) |
|||
|
|||
func SanitizeCode(s int) string { |
|||
switch s { |
|||
case 0, 200: |
|||
return "200" |
|||
default: |
|||
return strconv.Itoa(s) |
|||
} |
|||
} |
|||
|
|||
// Only support the list of "regular" HTTP methods, see
|
|||
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
|||
var methodMap = map[string]string{ |
|||
"GET": http.MethodGet, "get": http.MethodGet, |
|||
"HEAD": http.MethodHead, "head": http.MethodHead, |
|||
"PUT": http.MethodPut, "put": http.MethodPut, |
|||
"POST": http.MethodPost, "post": http.MethodPost, |
|||
"DELETE": http.MethodDelete, "delete": http.MethodDelete, |
|||
"CONNECT": http.MethodConnect, "connect": http.MethodConnect, |
|||
"OPTIONS": http.MethodOptions, "options": http.MethodOptions, |
|||
"TRACE": http.MethodTrace, "trace": http.MethodTrace, |
|||
"PATCH": http.MethodPatch, "patch": http.MethodPatch, |
|||
} |
|||
|
|||
// SanitizeMethod sanitizes the method for use as a metric label. This helps
|
|||
// prevent high cardinality on the method label. The name is always upper case.
|
|||
func SanitizeMethod(m string) string { |
|||
if m, ok := methodMap[m]; ok { |
|||
return m |
|||
} |
|||
|
|||
return "OTHER" |
|||
} |
@ -0,0 +1,28 @@ |
|||
package metrics |
|||
|
|||
import ( |
|||
"strings" |
|||
"testing" |
|||
) |
|||
|
|||
func TestSanitizeMethod(t *testing.T) { |
|||
tests := []struct { |
|||
method string |
|||
expected string |
|||
}{ |
|||
{method: "get", expected: "GET"}, |
|||
{method: "POST", expected: "POST"}, |
|||
{method: "OPTIONS", expected: "OPTIONS"}, |
|||
{method: "connect", expected: "CONNECT"}, |
|||
{method: "trace", expected: "TRACE"}, |
|||
{method: "UNKNOWN", expected: "OTHER"}, |
|||
{method: strings.Repeat("ohno", 9999), expected: "OTHER"}, |
|||
} |
|||
|
|||
for _, d := range tests { |
|||
actual := SanitizeMethod(d.method) |
|||
if actual != d.expected { |
|||
t.Errorf("Not same: expected %#v, but got %#v", d.expected, actual) |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue