mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
Squash of: - use detailed.Summaries to render topology nodes - ban merging nodes of different topologies (they should be mapped) - need to prune parents when mapping node types - render container images by id if they have no name - remove separate render ids and prune parents in NewDerived* - don't render metrics/metadata for groups of nodes - fixing up tests - removing pending unit tests (for mapping.go, for now) - updating experimental dir for RenderableNode removal
44 lines
916 B
Go
44 lines
916 B
Go
package render
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
|
|
"github.com/bluele/gcache"
|
|
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
var renderCache = gcache.New(100).LRU().Build()
|
|
|
|
type memoise struct {
|
|
Renderer
|
|
id string
|
|
}
|
|
|
|
// Memoise wraps the renderer in a loving embrace of caching
|
|
func Memoise(r Renderer) Renderer {
|
|
return &memoise{
|
|
Renderer: r,
|
|
id: fmt.Sprintf("%x", rand.Int63()),
|
|
}
|
|
}
|
|
|
|
// Render produces a set of Nodes given a Report.
|
|
// Ideally, it just retrieves it from the cache, otherwise it calls through to
|
|
// `r` and stores the result.
|
|
func (m *memoise) Render(rpt report.Report) report.Nodes {
|
|
key := fmt.Sprintf("%s-%s", rpt.ID, m.id)
|
|
if result, err := renderCache.Get(key); err == nil {
|
|
return result.(report.Nodes)
|
|
}
|
|
output := m.Renderer.Render(rpt)
|
|
renderCache.Set(key, output)
|
|
return output
|
|
}
|
|
|
|
// ResetCache blows away the rendered node cache.
|
|
func ResetCache() {
|
|
renderCache.Purge()
|
|
}
|