Pass Go context down to Renderers

This is useful for cancellation or tracing.
This commit is contained in:
Bryan Boreham
2018-10-11 08:37:21 +00:00
parent b87464f53a
commit b84622cb0d
28 changed files with 136 additions and 100 deletions

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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

View File

@@ -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)
}
}