فهرست منبع

cmd/stupgrades: Basic process metrics

Jakob Borg 1 سال پیش
والد
کامیت
2bb5b2244b
1فایلهای تغییر یافته به همراه29 افزوده شده و 7 حذف شده
  1. 29 7
      cmd/stupgrades/main.go

+ 29 - 7
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 {