From 59cae0f622a33355d320fc4701b9720197b788d2 Mon Sep 17 00:00:00 2001 From: Rishabh Bector Date: Fri, 9 Jul 2021 12:10:43 -0500 Subject: [PATCH] TUN-4698: Add cloudflared metrics endpoint to serve quick tunnel hostname --- cmd/cloudflared/proxydns/cmd.go | 2 +- cmd/cloudflared/tunnel/cmd.go | 5 +++-- cmd/cloudflared/tunnel/quick_tunnel.go | 1 + cmd/cloudflared/tunnel/subcommand_context.go | 1 + metrics/metrics.go | 8 ++++++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmd/cloudflared/proxydns/cmd.go b/cmd/cloudflared/proxydns/cmd.go index f560635d..bd6c0e25 100644 --- a/cmd/cloudflared/proxydns/cmd.go +++ b/cmd/cloudflared/proxydns/cmd.go @@ -73,7 +73,7 @@ func Run(c *cli.Context) error { log.Fatal().Err(err).Msg("Failed to open the metrics listener") } - go metrics.ServeMetrics(metricsListener, nil, nil, log) + go metrics.ServeMetrics(metricsListener, nil, nil, "", log) listener, err := tunneldns.CreateListener( c.String("address"), diff --git a/cmd/cloudflared/tunnel/cmd.go b/cmd/cloudflared/tunnel/cmd.go index 817f90f7..c98d5ae4 100644 --- a/cmd/cloudflared/tunnel/cmd.go +++ b/cmd/cloudflared/tunnel/cmd.go @@ -206,7 +206,7 @@ func runAdhocNamedTunnel(sc *subcommandContext, name, credentialsOutputPath stri // runClassicTunnel creates a "classic" non-named tunnel func runClassicTunnel(sc *subcommandContext) error { - return StartServer(sc.c, version, nil, sc.log, sc.isUIEnabled) + return StartServer(sc.c, version, nil, sc.log, sc.isUIEnabled, "") } func routeFromFlag(c *cli.Context) (route tunnelstore.Route, ok bool) { @@ -225,6 +225,7 @@ func StartServer( namedTunnel *connection.NamedTunnelConfig, log *zerolog.Logger, isUIEnabled bool, + quickTunnelHostname string, ) error { _ = raven.SetDSN(sentryDSN) var wg sync.WaitGroup @@ -341,7 +342,7 @@ func StartServer( defer wg.Done() readinessServer := metrics.NewReadyServer(log) observer.RegisterSink(readinessServer) - errC <- metrics.ServeMetrics(metricsListener, ctx.Done(), readinessServer, log) + errC <- metrics.ServeMetrics(metricsListener, ctx.Done(), readinessServer, quickTunnelHostname, log) }() if err := ingressRules.StartOrigins(&wg, log, ctx.Done(), errC); err != nil { diff --git a/cmd/cloudflared/tunnel/quick_tunnel.go b/cmd/cloudflared/tunnel/quick_tunnel.go index 08c128a3..db76d212 100644 --- a/cmd/cloudflared/tunnel/quick_tunnel.go +++ b/cmd/cloudflared/tunnel/quick_tunnel.go @@ -64,6 +64,7 @@ func RunQuickTunnel(sc *subcommandContext) error { &connection.NamedTunnelConfig{Credentials: credentials}, sc.log, sc.isUIEnabled, + data.Result.Hostname, ) } diff --git a/cmd/cloudflared/tunnel/subcommand_context.go b/cmd/cloudflared/tunnel/subcommand_context.go index d5b42590..69d16478 100644 --- a/cmd/cloudflared/tunnel/subcommand_context.go +++ b/cmd/cloudflared/tunnel/subcommand_context.go @@ -286,6 +286,7 @@ func (sc *subcommandContext) run(tunnelID uuid.UUID) error { &connection.NamedTunnelConfig{Credentials: credentials}, sc.log, sc.isUIEnabled, + "", ) } diff --git a/metrics/metrics.go b/metrics/metrics.go index ea7b2826..1f2b5156 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -22,7 +22,7 @@ const ( startupTime = time.Millisecond * 500 ) -func newMetricsHandler(readyServer *ReadyServer) *mux.Router { +func newMetricsHandler(readyServer *ReadyServer, quickTunnelHostname string) *mux.Router { router := mux.NewRouter() router.PathPrefix("/debug/").Handler(http.DefaultServeMux) @@ -33,6 +33,9 @@ func newMetricsHandler(readyServer *ReadyServer) *mux.Router { if readyServer != nil { router.Handle("/ready", readyServer) } + router.HandleFunc("/quicktunnel", func(w http.ResponseWriter, r *http.Request) { + _, _ = fmt.Fprintf(w, `{"hostname":"%s"}`, quickTunnelHostname) + }) return router } @@ -41,6 +44,7 @@ func ServeMetrics( l net.Listener, shutdownC <-chan struct{}, readyServer *ReadyServer, + quickTunnelHostname string, log *zerolog.Logger, ) (err error) { var wg sync.WaitGroup @@ -48,7 +52,7 @@ func ServeMetrics( trace.AuthRequest = func(*http.Request) (bool, bool) { return true, true } // TODO: parameterize ReadTimeout and WriteTimeout. The maximum time we can // profile CPU usage depends on WriteTimeout - h := newMetricsHandler(readyServer) + h := newMetricsHandler(readyServer, quickTunnelHostname) server := &http.Server{ ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,