From 1f27310f624a7c756c6b70023e7df64defcfb294 Mon Sep 17 00:00:00 2001 From: Roland Schilter Date: Fri, 11 Aug 2017 14:19:16 +0100 Subject: [PATCH] Introduce WebReporter to hold web-related options --- app/api_topologies.go | 10 +++++----- app/api_topology.go | 6 +----- app/collector.go | 17 +++++++++++++++++ app/router.go | 8 ++++---- prog/app.go | 2 +- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/api_topologies.go b/app/api_topologies.go index f32cf1cd0..92e4e3d11 100644 --- a/app/api_topologies.go +++ b/app/api_topologies.go @@ -548,17 +548,17 @@ func (r *Registry) RendererForTopology(topologyID string, values url.Values, rpt return topology.renderer, nil, nil } -type reporterHandler func(context.Context, Reporter, string, http.ResponseWriter, *http.Request) +type reporterHandler func(context.Context, Reporter, http.ResponseWriter, *http.Request) -func captureReporter(rep Reporter, metricsGraphURL string, f reporterHandler) CtxHandlerFunc { +func captureReporter(rep Reporter, f reporterHandler) CtxHandlerFunc { return func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - f(ctx, rep, metricsGraphURL, w, r) + f(ctx, rep, w, r) } } type rendererHandler func(context.Context, render.Renderer, render.Decorator, report.RenderContext, http.ResponseWriter, *http.Request) -func (r *Registry) captureRenderer(rep Reporter, metricsGraphURL string, f rendererHandler) CtxHandlerFunc { +func (r *Registry) captureRenderer(rep Reporter, f rendererHandler) CtxHandlerFunc { return func(ctx context.Context, w http.ResponseWriter, req *http.Request) { var ( topologyID = mux.Vars(req)["topology"] @@ -579,6 +579,6 @@ func (r *Registry) captureRenderer(rep Reporter, metricsGraphURL string, f rende respondWith(w, http.StatusInternalServerError, err) return } - f(ctx, renderer, decorator, report.RenderContext{Report: rpt, MetricsGraphURL: metricsGraphURL}, w, req) + f(ctx, renderer, decorator, RenderContextForReporter(rep, rpt), w, req) } } diff --git a/app/api_topology.go b/app/api_topology.go index 6d9710105..a30f554bd 100644 --- a/app/api_topology.go +++ b/app/api_topology.go @@ -56,7 +56,6 @@ func handleNode(ctx context.Context, renderer render.Renderer, decorator render. func handleWebsocket( ctx context.Context, rep Reporter, - metricsGraphURL string, w http.ResponseWriter, r *http.Request, ) { @@ -124,10 +123,7 @@ func handleWebsocket( log.Errorf("Error generating report: %v", err) return } - newTopo := detailed.Summaries( - report.RenderContext{Report: re, MetricsGraphURL: metricsGraphURL}, - renderer.Render(re, decorator), - ) + newTopo := detailed.Summaries(RenderContextForReporter(rep, re), renderer.Render(re, decorator)) diff := detailed.TopoDiff(previousTopo, newTopo) previousTopo = newTopo diff --git a/app/collector.go b/app/collector.go index d4b97dc6c..434edcd81 100644 --- a/app/collector.go +++ b/app/collector.go @@ -34,6 +34,23 @@ type Reporter interface { UnWait(context.Context, chan struct{}) } +// WebReporter is a reporter that creates reports whose data is eventually +// displayed on websites. It carries fields that will be forwarded to the +// report.RenderContext +type WebReporter struct { + Reporter + MetricsGraphURL string +} + +// RenderContextForReporter creates the rendering context for the given reporter. +func RenderContextForReporter(rep Reporter, r report.Report) report.RenderContext { + rc := report.RenderContext{Report: r} + if wrep, ok := rep.(WebReporter); ok { + rc.MetricsGraphURL = wrep.MetricsGraphURL + } + return rc +} + // Adder is something that can accept reports. It's a convenient interface for // parts of the app, and several experimental components. It takes the following // arguments: diff --git a/app/router.go b/app/router.go index 05999d293..414f45f99 100644 --- a/app/router.go +++ b/app/router.go @@ -91,7 +91,7 @@ func gzipHandler(h http.HandlerFunc) http.HandlerFunc { } // RegisterTopologyRoutes registers the various topology routes with a http mux. -func RegisterTopologyRoutes(router *mux.Router, r Reporter, capabilities map[string]bool, metricsGraphURL string) { +func RegisterTopologyRoutes(router *mux.Router, r Reporter, capabilities map[string]bool) { get := router.Methods("GET").Subrouter() get.HandleFunc("/api", gzipHandler(requestContextDecorator(apiHandler(r, capabilities)))) @@ -99,15 +99,15 @@ func RegisterTopologyRoutes(router *mux.Router, r Reporter, capabilities map[str gzipHandler(requestContextDecorator(topologyRegistry.makeTopologyList(r)))) get. HandleFunc("/api/topology/{topology}", - gzipHandler(requestContextDecorator(topologyRegistry.captureRenderer(r, metricsGraphURL, handleTopology)))). + gzipHandler(requestContextDecorator(topologyRegistry.captureRenderer(r, handleTopology)))). Name("api_topology_topology") get. HandleFunc("/api/topology/{topology}/ws", - requestContextDecorator(captureReporter(r, metricsGraphURL, handleWebsocket))). // NB not gzip! + requestContextDecorator(captureReporter(r, handleWebsocket))). // NB not gzip! Name("api_topology_topology_ws") get. MatcherFunc(URLMatcher("/api/topology/{topology}/{id}")).HandlerFunc( - gzipHandler(requestContextDecorator(topologyRegistry.captureRenderer(r, metricsGraphURL, handleNode)))). + gzipHandler(requestContextDecorator(topologyRegistry.captureRenderer(r, handleNode)))). Name("api_topology_topology_id") get.HandleFunc("/api/report", gzipHandler(requestContextDecorator(makeRawReportHandler(r)))) diff --git a/prog/app.go b/prog/app.go index f78054c9b..d4b9ca8aa 100644 --- a/prog/app.go +++ b/prog/app.go @@ -61,7 +61,7 @@ func router(collector app.Collector, controlRouter app.ControlRouter, pipeRouter app.RegisterReportPostHandler(collector, router) app.RegisterControlRoutes(router, controlRouter) app.RegisterPipeRoutes(router, pipeRouter) - app.RegisterTopologyRoutes(router, collector, capabilities, metricsGraphURL) + app.RegisterTopologyRoutes(router, app.WebReporter{Reporter: collector, MetricsGraphURL: metricsGraphURL}, capabilities) uiHandler := http.FileServer(GetFS(externalUI)) router.PathPrefix("/ui").Name("static").Handler(