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:
@@ -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{
|
||||||
|
|||||||
22
lib/main.go
22
lib/main.go
@@ -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
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
Reference in New Issue
Block a user