feat(api): create api proxy/ratelimiting/metrics
This commit is contained in:
63
services/web-proxy/util.go
Normal file
63
services/web-proxy/util.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
var metric = prometheus.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Name: "pk_http_requests",
|
||||
Buckets: []float64{.1, .25, 1, 2.5, 5, 20},
|
||||
},
|
||||
[]string{"domain", "method", "status", "route"},
|
||||
)
|
||||
|
||||
func proxyTo(host string) *httputil.ReverseProxy {
|
||||
rp := httputil.NewSingleHostReverseProxy(&url.URL{
|
||||
Scheme: "http",
|
||||
Host: host,
|
||||
RawQuery: "",
|
||||
})
|
||||
rp.ModifyResponse = logTimeElapsed
|
||||
return rp
|
||||
}
|
||||
|
||||
var systemsRegex = regexp.MustCompile("systems/[^/]+")
|
||||
var membersRegex = regexp.MustCompile("members/[^/]+")
|
||||
var groupsRegex = regexp.MustCompile("groups/[^/]+")
|
||||
var switchesRegex = regexp.MustCompile("switches/[^/]+")
|
||||
var guildsRegex = regexp.MustCompile("guilds/[^/]+")
|
||||
var messagesRegex = regexp.MustCompile("messages/[^/]+")
|
||||
|
||||
func cleanPath(host, path string) string {
|
||||
if host != "api.pluralkit.me" {
|
||||
return ""
|
||||
}
|
||||
|
||||
if !(strings.HasPrefix(host, "/v2") || strings.HasPrefix(host, "/private")) {
|
||||
return ""
|
||||
}
|
||||
|
||||
path = systemsRegex.ReplaceAllString(path, "{systemRef}")
|
||||
path = membersRegex.ReplaceAllString(path, "{memberRef}")
|
||||
path = groupsRegex.ReplaceAllString(path, "{groupRef}")
|
||||
path = switchesRegex.ReplaceAllString(path, "{switchRef}")
|
||||
path = guildsRegex.ReplaceAllString(path, "{guild_id}")
|
||||
path = messagesRegex.ReplaceAllString(path, "{message_id}")
|
||||
|
||||
return path
|
||||
}
|
||||
|
||||
func requireEnv(key string) string {
|
||||
if val, ok := os.LookupEnv(key); !ok {
|
||||
panic("missing `" + key + "` in environment")
|
||||
} else {
|
||||
return val
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user