mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-29 02:01:43 +00:00
Pass Go context down to Renderers
This is useful for cancellation or tracing.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -9,7 +10,6 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"context"
|
||||
"github.com/gorilla/mux"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
@@ -470,32 +470,32 @@ func (r *Registry) makeTopologyList(rep Reporter) CtxHandlerFunc {
|
||||
respondWith(w, http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
respondWith(w, http.StatusOK, r.renderTopologies(report, req))
|
||||
respondWith(w, http.StatusOK, r.renderTopologies(ctx, report, req))
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Registry) renderTopologies(rpt report.Report, req *http.Request) []APITopologyDesc {
|
||||
func (r *Registry) renderTopologies(ctx context.Context, rpt report.Report, req *http.Request) []APITopologyDesc {
|
||||
topologies := []APITopologyDesc{}
|
||||
req.ParseForm()
|
||||
r.walk(func(desc APITopologyDesc) {
|
||||
renderer, filter, _ := r.RendererForTopology(desc.id, req.Form, rpt)
|
||||
desc.Stats = computeStats(rpt, renderer, filter)
|
||||
desc.Stats = computeStats(ctx, rpt, renderer, filter)
|
||||
for i, sub := range desc.SubTopologies {
|
||||
renderer, filter, _ := r.RendererForTopology(sub.id, req.Form, rpt)
|
||||
desc.SubTopologies[i].Stats = computeStats(rpt, renderer, filter)
|
||||
desc.SubTopologies[i].Stats = computeStats(ctx, rpt, renderer, filter)
|
||||
}
|
||||
topologies = append(topologies, desc)
|
||||
})
|
||||
return updateFilters(rpt, topologies)
|
||||
}
|
||||
|
||||
func computeStats(rpt report.Report, renderer render.Renderer, transformer render.Transformer) topologyStats {
|
||||
func computeStats(ctx context.Context, rpt report.Report, renderer render.Renderer, transformer render.Transformer) topologyStats {
|
||||
var (
|
||||
nodes int
|
||||
realNodes int
|
||||
edges int
|
||||
)
|
||||
r := render.Render(rpt, renderer, transformer)
|
||||
r := render.Render(ctx, rpt, renderer, transformer)
|
||||
for _, n := range r.Nodes {
|
||||
nodes++
|
||||
if n.Topology != render.Pseudo {
|
||||
|
||||
@@ -2,6 +2,7 @@ package app_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"testing"
|
||||
@@ -118,7 +119,7 @@ func TestRendererForTopologyWithFiltering(t *testing.T) {
|
||||
input.Container.Nodes[fixture.ClientContainerNodeID] = input.Container.Nodes[fixture.ClientContainerNodeID].WithLatests(map[string]string{
|
||||
docker.LabelPrefix + "works.weave.role": "system",
|
||||
})
|
||||
have := utils.Prune(render.Render(input, renderer, filter).Nodes)
|
||||
have := utils.Prune(render.Render(context.Background(), input, renderer, filter).Nodes)
|
||||
want := utils.Prune(expected.RenderedContainers.Copy())
|
||||
delete(want, fixture.ClientContainerNodeID)
|
||||
delete(want, render.MakePseudoNodeID(render.UncontainedID, fixture.ServerHostID))
|
||||
@@ -149,7 +150,7 @@ func TestRendererForTopologyNoFiltering(t *testing.T) {
|
||||
input.Container.Nodes[fixture.ClientContainerNodeID] = input.Container.Nodes[fixture.ClientContainerNodeID].WithLatests(map[string]string{
|
||||
docker.LabelPrefix + "works.weave.role": "system",
|
||||
})
|
||||
have := utils.Prune(render.Render(input, renderer, filter).Nodes)
|
||||
have := utils.Prune(render.Render(context.Background(), input, renderer, filter).Nodes)
|
||||
want := utils.Prune(expected.RenderedContainers.Copy())
|
||||
delete(want, render.MakePseudoNodeID(render.UncontainedID, fixture.ServerHostID))
|
||||
delete(want, render.OutgoingInternetID)
|
||||
@@ -183,7 +184,8 @@ func getTestContainerLabelFilterTopologySummary(t *testing.T, exclude bool) (det
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return detailed.Summaries(detailed.RenderContext{Report: fixture.Report}, render.Render(fixture.Report, renderer, filter).Nodes), nil
|
||||
ctx := context.Background()
|
||||
return detailed.Summaries(ctx, detailed.RenderContext{Report: fixture.Report}, render.Render(ctx, fixture.Report, renderer, filter).Nodes), nil
|
||||
}
|
||||
|
||||
func TestAPITopologyAddsKubernetes(t *testing.T) {
|
||||
|
||||
@@ -42,7 +42,7 @@ type rendererHandler func(context.Context, render.Renderer, render.Transformer,
|
||||
// Full topology.
|
||||
func handleTopology(ctx context.Context, renderer render.Renderer, transformer render.Transformer, rc detailed.RenderContext, w http.ResponseWriter, r *http.Request) {
|
||||
respondWith(w, http.StatusOK, APITopology{
|
||||
Nodes: detailed.Summaries(rc, render.Render(rc.Report, renderer, transformer).Nodes),
|
||||
Nodes: detailed.Summaries(ctx, rc, render.Render(ctx, rc.Report, renderer, transformer).Nodes),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ func handleNode(ctx context.Context, renderer render.Renderer, transformer rende
|
||||
// filtering, which gives us the node (if it exists at all), and
|
||||
// then (2) applying the filter separately to that result. If the
|
||||
// node is lost in the second step, we simply put it back.
|
||||
nodes := renderer.Render(rc.Report)
|
||||
nodes := renderer.Render(ctx, rc.Report)
|
||||
node, ok := nodes.Nodes[nodeID]
|
||||
if !ok {
|
||||
http.NotFound(w, r)
|
||||
@@ -145,7 +145,7 @@ func handleWebsocket(
|
||||
log.Errorf("Error generating report: %v", err)
|
||||
return
|
||||
}
|
||||
newTopo := detailed.Summaries(RenderContextForReporter(rep, re), render.Render(re, renderer, filter).Nodes)
|
||||
newTopo := detailed.Summaries(ctx, RenderContextForReporter(rep, re), render.Render(ctx, re, renderer, filter).Nodes)
|
||||
diff := detailed.TopoDiff(previousTopo, newTopo)
|
||||
previousTopo = newTopo
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
@@ -100,7 +101,7 @@ func renderForTopology(b *testing.B, topologyID string, report report.Report) re
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
return render.Render(report, renderer, filter).Nodes
|
||||
return render.Render(context.Background(), report, renderer, filter).Nodes
|
||||
}
|
||||
|
||||
func benchmarkRenderTopology(b *testing.B, topologyID string) {
|
||||
@@ -111,7 +112,7 @@ func benchmarkRenderTopology(b *testing.B, topologyID string) {
|
||||
|
||||
func BenchmarkRenderList(b *testing.B) {
|
||||
benchmarkRender(b, func(report report.Report) {
|
||||
topologyRegistry.renderTopologies(report, &http.Request{Form: url.Values{}})
|
||||
topologyRegistry.renderTopologies(context.Background(), report, &http.Request{Form: url.Values{}})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -140,12 +141,13 @@ func BenchmarkRenderProcessNames(b *testing.B) {
|
||||
}
|
||||
|
||||
func benchmarkSummarizeTopology(b *testing.B, topologyID string) {
|
||||
ctx := context.Background()
|
||||
r := getReport(b)
|
||||
rc := detailed.RenderContext{Report: r}
|
||||
nodes := renderForTopology(b, topologyID, r)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
detailed.Summaries(rc, nodes)
|
||||
detailed.Summaries(ctx, rc, nodes)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user