pgraph: graphviz: Update Graphviz lib to quote names properly

This also moves the library to after the graph starts so that the kind
fields will be visible.
This commit is contained in:
James Shubin
2017-03-05 23:00:46 -05:00
parent 8d94be8924
commit a0686b7d2b
3 changed files with 23 additions and 15 deletions

View File

@@ -241,7 +241,7 @@ func CLI(program, version string, flags Flags) error {
}, },
cli.StringFlag{ cli.StringFlag{
Name: "graphviz-filter, gf", Name: "graphviz-filter, gf",
Value: "dot", // directed graph default Value: "",
Usage: "graphviz filter to use", Usage: "graphviz filter to use",
}, },
cli.IntFlag{ cli.IntFlag{

View File

@@ -483,15 +483,6 @@ func (obj *Main) Run() error {
// TODO: do we want to do a transitive reduction? // TODO: do we want to do a transitive reduction?
// FIXME: run a type checker that verifies all the send->recv relationships // FIXME: run a type checker that verifies all the send->recv relationships
log.Printf("Graph: %v", G) // show graph
if obj.GraphvizFilter != "" {
if err := G.ExecGraphviz(obj.GraphvizFilter, obj.Graphviz); err != nil {
log.Printf("Graphviz: %v", err)
} else {
log.Printf("Graphviz: Successfully generated graph!")
}
}
// Call this here because at this point the graph does not // Call this here because at this point the graph does not
// know anything about the prometheus instance. // know anything about the prometheus instance.
if err := prom.UpdatePgraphStartTime(); err != nil { if err := prom.UpdatePgraphStartTime(); err != nil {
@@ -504,6 +495,19 @@ func (obj *Main) Run() error {
// even got going, thus causing nil pointer errors // even got going, thus causing nil pointer errors
G.Start(first) // sync G.Start(first) // sync
converger.Start() // after G.Start() converger.Start() // after G.Start()
log.Printf("Graph: %v", G) // show graph
if obj.Graphviz != "" {
filter := obj.GraphvizFilter
if filter == "" {
filter = "dot" // directed graph default
}
if err := G.ExecGraphviz(filter, obj.Graphviz, hostname); err != nil {
log.Printf("Graphviz: %v", err)
} else {
log.Printf("Graphviz: Successfully generated graph!")
}
}
first = false first = false
} }
}() }()

View File

@@ -15,7 +15,7 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
package pgraph package pgraph // TODO: this should be a subpackage
import ( import (
"fmt" "fmt"
@@ -46,14 +46,14 @@ func (g *Graph) Graphviz() (out string) {
//out += "\tnode [shape=box];\n" //out += "\tnode [shape=box];\n"
str := "" str := ""
for i := range g.Adjacency { // reverse paths for i := range g.Adjacency { // reverse paths
out += fmt.Sprintf("\t%s [label=\"%s[%s]\"];\n", i.GetName(), i.Kind(), i.GetName()) out += fmt.Sprintf("\t\"%s\" [label=\"%s[%s]\"];\n", i.GetName(), i.Kind(), i.GetName())
for j := range g.Adjacency[i] { for j := range g.Adjacency[i] {
k := g.Adjacency[i][j] k := g.Adjacency[i][j]
// use str for clearer output ordering // use str for clearer output ordering
if k.Notify { if k.Notify {
str += fmt.Sprintf("\t%s -> %s [label=%s,style=bold];\n", i.GetName(), j.GetName(), k.Name) str += fmt.Sprintf("\t\"%s\" -> \"%s\" [label=\"%s\",style=bold];\n", i.GetName(), j.GetName(), k.Name)
} else { } else {
str += fmt.Sprintf("\t%s -> %s [label=%s];\n", i.GetName(), j.GetName(), k.Name) str += fmt.Sprintf("\t\"%s\" -> \"%s\" [label=\"%s\"];\n", i.GetName(), j.GetName(), k.Name)
} }
} }
} }
@@ -64,7 +64,7 @@ func (g *Graph) Graphviz() (out string) {
// ExecGraphviz writes out the graphviz data and runs the correct graphviz // ExecGraphviz writes out the graphviz data and runs the correct graphviz
// filter command. // filter command.
func (g *Graph) ExecGraphviz(program, filename string) error { func (g *Graph) ExecGraphviz(program, filename, hostname string) error {
switch program { switch program {
case "dot", "neato", "twopi", "circo", "fdp": case "dot", "neato", "twopi", "circo", "fdp":
@@ -76,6 +76,10 @@ func (g *Graph) ExecGraphviz(program, filename string) error {
return fmt.Errorf("no filename given") return fmt.Errorf("no filename given")
} }
if hostname != "" {
filename = fmt.Sprintf("%s@%s", filename, hostname)
}
// run as a normal user if possible when run with sudo // run as a normal user if possible when run with sudo
uid, err1 := strconv.Atoi(os.Getenv("SUDO_UID")) uid, err1 := strconv.Atoi(os.Getenv("SUDO_UID"))
gid, err2 := strconv.Atoi(os.Getenv("SUDO_GID")) gid, err2 := strconv.Atoi(os.Getenv("SUDO_GID"))