From 2bb5b2244ba38c279d1bac6afaea463f67fce2b0 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 3 Jun 2024 07:17:32 +0200 Subject: [PATCH] cmd/stupgrades: Basic process metrics --- cmd/stupgrades/main.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/cmd/stupgrades/main.go b/cmd/stupgrades/main.go index 7f0b3beff..e3b118fa6 100644 --- a/cmd/stupgrades/main.go +++ b/cmd/stupgrades/main.go @@ -19,16 +19,18 @@ import ( "time" "github.com/alecthomas/kong" + "github.com/prometheus/client_golang/prometheus/promhttp" _ "github.com/syncthing/syncthing/lib/automaxprocs" "github.com/syncthing/syncthing/lib/httpcache" "github.com/syncthing/syncthing/lib/upgrade" ) type cli struct { - Listen string `default:":8080" help:"Listen address"` - URL string `short:"u" default:"https://api.github.com/repos/syncthing/syncthing/releases?per_page=25" help:"GitHub releases url"` - Forward []string `short:"f" help:"Forwarded pages, format: /path->https://example/com/url"` - CacheTime time.Duration `default:"15m" help:"Cache time"` + Listen string `default:":8080" help:"Listen address"` + MetricsListen string `default:":8081" help:"Listen address for metrics"` + URL string `short:"u" default:"https://api.github.com/repos/syncthing/syncthing/releases?per_page=25" help:"GitHub releases url"` + Forward []string `short:"f" help:"Forwarded pages, format: /path->https://example/com/url"` + CacheTime time.Duration `default:"15m" help:"Cache time"` } func main() { @@ -41,17 +43,37 @@ func main() { } func server(params *cli) error { - http.Handle("/meta.json", httpcache.SinglePath(&githubReleases{url: params.URL}, params.CacheTime)) + if params.MetricsListen != "" { + mux := http.NewServeMux() + mux.Handle("/metrics", promhttp.Handler()) + go func() { + log.Println("Listening for metrics on", params.MetricsListen) + if err := http.ListenAndServe(params.MetricsListen, mux); err != nil { + log.Fatalf("Failed to start metrics server: %v", err) + } + }() + } + + mux := http.NewServeMux() + mux.Handle("/meta.json", httpcache.SinglePath(&githubReleases{url: params.URL}, params.CacheTime)) for _, fwd := range params.Forward { path, url, ok := strings.Cut(fwd, "->") if !ok { return fmt.Errorf("invalid forward: %q", fwd) } - http.Handle(path, httpcache.SinglePath(&proxy{url: url}, params.CacheTime)) + log.Println("Forwarding", path, "to", url) + mux.Handle(path, httpcache.SinglePath(&proxy{url: url}, params.CacheTime)) } - return http.ListenAndServe(params.Listen, nil) + srv := &http.Server{ + Addr: params.Listen, + Handler: mux, + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + srv.SetKeepAlivesEnabled(false) + return srv.ListenAndServe() } type githubReleases struct {