aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2018-02-12 16:34:48 +0000
committerDaniel Martí <mvdan@mvdan.cc>2018-02-15 16:25:43 +0000
commite7cbbbe9bb878b6ca4ce04fde645df1c8f1845bd (patch)
treef84255198234eb4870c48228cdb4828de1f4f8c5 /src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go
parentafb9fc1de922a4ead9d2d787613255a7ba3490f7 (diff)
downloadgo-e7cbbbe9bb878b6ca4ce04fde645df1c8f1845bd.tar.xz
cmd/vendor/github.com/google/pprof: refresh from upstream
Updating to commit 0e0e5b7254e076a62326ab7305ba49e8515f0c91 from github.com/google/pprof Recent modifications to the vendored pprof, such as skipping TestWebInterface to avoid starting a web browser, have all been fixed upstream. Change-Id: I72e11108c438e1573bf2f9216e76d157378e8d45 Reviewed-on: https://go-review.googlesource.com/93375 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go')
-rw-r--r--src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go
new file mode 100644
index 0000000000..10588d6262
--- /dev/null
+++ b/src/cmd/vendor/github.com/google/pprof/internal/driver/flamegraph.go
@@ -0,0 +1,99 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package driver
+
+import (
+ "encoding/json"
+ "html/template"
+ "net/http"
+ "strings"
+
+ "github.com/google/pprof/internal/graph"
+ "github.com/google/pprof/internal/measurement"
+ "github.com/google/pprof/internal/report"
+)
+
+type treeNode struct {
+ Name string `json:"n"`
+ Cum int64 `json:"v"`
+ CumFormat string `json:"l"`
+ Percent string `json:"p"`
+ Children []*treeNode `json:"c"`
+}
+
+// flamegraph generates a web page containing a flamegraph.
+func (ui *webInterface) flamegraph(w http.ResponseWriter, req *http.Request) {
+ // Force the call tree so that the graph is a tree.
+ // Also do not trim the tree so that the flame graph contains all functions.
+ rpt, errList := ui.makeReport(w, req, []string{"svg"}, "call_tree", "true", "trim", "false")
+ if rpt == nil {
+ return // error already reported
+ }
+
+ // Generate dot graph.
+ g, config := report.GetDOT(rpt)
+ var nodes []*treeNode
+ nroots := 0
+ rootValue := int64(0)
+ nodeArr := []string{}
+ nodeMap := map[*graph.Node]*treeNode{}
+ // Make all nodes and the map, collect the roots.
+ for _, n := range g.Nodes {
+ v := n.CumValue()
+ node := &treeNode{
+ Name: n.Info.PrintableName(),
+ Cum: v,
+ CumFormat: config.FormatValue(v),
+ Percent: strings.TrimSpace(measurement.Percentage(v, config.Total)),
+ }
+ nodes = append(nodes, node)
+ if len(n.In) == 0 {
+ nodes[nroots], nodes[len(nodes)-1] = nodes[len(nodes)-1], nodes[nroots]
+ nroots++
+ rootValue += v
+ }
+ nodeMap[n] = node
+ // Get all node names into an array.
+ nodeArr = append(nodeArr, n.Info.Name)
+ }
+ // Populate the child links.
+ for _, n := range g.Nodes {
+ node := nodeMap[n]
+ for child := range n.Out {
+ node.Children = append(node.Children, nodeMap[child])
+ }
+ }
+
+ rootNode := &treeNode{
+ Name: "root",
+ Cum: rootValue,
+ CumFormat: config.FormatValue(rootValue),
+ Percent: strings.TrimSpace(measurement.Percentage(rootValue, config.Total)),
+ Children: nodes[0:nroots],
+ }
+
+ // JSON marshalling flame graph
+ b, err := json.Marshal(rootNode)
+ if err != nil {
+ http.Error(w, "error serializing flame graph", http.StatusInternalServerError)
+ ui.options.UI.PrintErr(err)
+ return
+ }
+
+ ui.render(w, "/flamegraph", "flamegraph", rpt, errList, config.Labels, webArgs{
+ FlameGraph: template.JS(b),
+ Nodes: nodeArr,
+ })
+}