mirror of
https://github.com/weaveworks/scope.git
synced 2026-05-05 16:59:36 +00:00
Decoration is in fact quite a simple process that is applied on entry to rendering: we take a base renderer, transform it with a decorator, and then render a report with it. The new render.Decorate() function does exactly that. There is one exception. When rendering an individual node, e.g. for showing its details panel in the UI, we must not lose the node during decoration. That requires some special logic, which previously resided in the PreciousNodeRenderer, and now lives in handleNode.
75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package app
|
|
|
|
import (
|
|
"flag"
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
"time"
|
|
|
|
"golang.org/x/net/context"
|
|
|
|
"github.com/weaveworks/scope/render"
|
|
"github.com/weaveworks/scope/report"
|
|
"github.com/weaveworks/scope/test/fixture"
|
|
)
|
|
|
|
var (
|
|
benchReportFile = flag.String("bench-report-file", "", "json report file to use for benchmarking (relative to this package)")
|
|
)
|
|
|
|
func loadReport() (report.Report, error) {
|
|
if *benchReportFile == "" {
|
|
return fixture.Report, nil
|
|
}
|
|
|
|
c, err := NewFileCollector(*benchReportFile, 0)
|
|
if err != nil {
|
|
return fixture.Report, err
|
|
}
|
|
|
|
return c.Report(context.Background(), time.Now())
|
|
}
|
|
|
|
func BenchmarkTopologyList(b *testing.B) {
|
|
benchmarkRender(b, func(report report.Report) {
|
|
request := &http.Request{
|
|
Form: url.Values{},
|
|
}
|
|
topologyRegistry.renderTopologies(report, request)
|
|
})
|
|
}
|
|
|
|
func benchmarkRender(b *testing.B, f func(report.Report)) {
|
|
report, err := loadReport()
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
b.StopTimer()
|
|
render.ResetCache()
|
|
b.StartTimer()
|
|
f(report)
|
|
}
|
|
}
|
|
|
|
func BenchmarkTopologyHosts(b *testing.B) {
|
|
benchmarkOneTopology(b, "hosts")
|
|
}
|
|
|
|
func BenchmarkTopologyContainers(b *testing.B) {
|
|
benchmarkOneTopology(b, "containers")
|
|
}
|
|
|
|
func benchmarkOneTopology(b *testing.B, topologyID string) {
|
|
benchmarkRender(b, func(report report.Report) {
|
|
renderer, decorator, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
render.Decorate(report, renderer, decorator)
|
|
})
|
|
}
|