From 33acfa1e59b94ab1ce5d735d5fa0581403b1a53c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 23 Apr 2021 10:51:24 +0000 Subject: [PATCH] Log part-merged nodes dropped to tracing So we have more idea what happened, in case of issue. --- app/api_topologies.go | 4 ++-- app/api_topology.go | 2 +- app/benchmark_internal_test.go | 2 +- app/collector_test.go | 2 +- report/report.go | 16 ++++++++++++++-- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/api_topologies.go b/app/api_topologies.go index 2f53cc0b2..c1e1d100d 100644 --- a/app/api_topologies.go +++ b/app/api_topologies.go @@ -479,7 +479,7 @@ func (r *Registry) makeTopologyList(rep Reporter) CtxHandlerFunc { respondWith(ctx, w, http.StatusInternalServerError, err) return } - report.UnsafeRemovePartMergedNodes() + report.UnsafeRemovePartMergedNodes(ctx) respondWith(ctx, w, http.StatusOK, r.renderTopologies(ctx, report, req)) } } @@ -580,7 +580,7 @@ func (r *Registry) captureRenderer(rep Reporter, f rendererHandler) CtxHandlerFu respondWith(ctx, w, http.StatusInternalServerError, err) return } - rpt.UnsafeRemovePartMergedNodes() + rpt.UnsafeRemovePartMergedNodes(ctx) req.ParseForm() renderer, filter, err := r.RendererForTopology(topologyID, req.Form, rpt) if err != nil { diff --git a/app/api_topology.go b/app/api_topology.go index 490acca40..255976216 100644 --- a/app/api_topology.go +++ b/app/api_topology.go @@ -182,7 +182,7 @@ func (wc *websocketState) update(ctx context.Context) error { if err != nil { return errors.Wrap(err, "Error generating report") } - re.UnsafeRemovePartMergedNodes() + re.UnsafeRemovePartMergedNodes(ctx) renderer, filter, err := topologyRegistry.RendererForTopology(wc.topologyID, wc.values, re) if err != nil { return errors.Wrap(err, "Error generating report") diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index b0eae7048..da87079d5 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -87,7 +87,7 @@ func getReport(b *testing.B) report.Report { func benchmarkRender(b *testing.B, f func(report.Report)) { r := getReport(b) - r.UnsafeRemovePartMergedNodes() + r.UnsafeRemovePartMergedNodes(context.Background()) b.ResetTimer() for i := 0; i < b.N; i++ { b.StopTimer() diff --git a/app/collector_test.go b/app/collector_test.go index a31e774c4..f33d4c21e 100644 --- a/app/collector_test.go +++ b/app/collector_test.go @@ -52,7 +52,7 @@ func TestCollector(t *testing.T) { merged := report.MakeReport() merged.UnsafeMerge(r1) merged.UnsafeMerge(r2) - merged.UnsafeRemovePartMergedNodes() + merged.UnsafeRemovePartMergedNodes(context.Background()) have, err = c.Report(ctx, mtime.Now()) if err != nil { t.Error(err) diff --git a/report/report.go b/report/report.go index 18042163e..611f84e98 100644 --- a/report/report.go +++ b/report/report.go @@ -1,11 +1,14 @@ package report import ( + "context" "fmt" "math/rand" "strings" "time" + opentracing "github.com/opentracing/opentracing-go" + "github.com/weaveworks/scope/common/xfer" ) @@ -367,14 +370,23 @@ func (r *Report) UnsafeUnMerge(other Report) { // E.g. if a node is removed from source between two full reports, then we // might only have a delta of its last state. Remove that from the set. // The original is modified. -func (r *Report) UnsafeRemovePartMergedNodes() { - r.WalkTopologies(func(t *Topology) { +func (r *Report) UnsafeRemovePartMergedNodes(ctx context.Context) { + dropped := map[string]int{} + r.WalkNamedTopologies(func(name string, t *Topology) { for k, v := range t.Nodes { if v.isPartMerged() { delete(t.Nodes, k) + dropped[name]++ } } }) + if span := opentracing.SpanFromContext(ctx); span != nil && len(dropped) > 0 { + msg := "" + for name, count := range dropped { + msg += fmt.Sprintf("%s: %d, ", name, count) + } + span.LogKV("dropped-part-merged", msg) + } } // WalkTopologies iterates through the Topologies of the report,