// Flush the spans for a request in zipkin format func Flush(t gotocol.TraceContextType, trace []*spannotype) { var zip zipkinspan var ctx string n := -1 sort.Sort(ByCtx(trace)) for _, a := range trace { //fmt.Println(*a) if ctx != a.Ctx { // new span if ctx != "" { // not the first WriteZip(zip) file.WriteString(",") zip.Annotations = nil } n++ zip.Traceid = fmt.Sprintf("%016d", t) // pad id's to 16 characters to keep zipkin happy zip.Name = a.Imp s := strings.SplitAfter(a.Ctx, "s") // tXpYsZ -> [tXpYs, Z] p := strings.TrimSuffix(strings.SplitAfter(s[0], "p")[1], "s") // tXpYs -> [tXp, Ys] -> Ys -> Y zip.Id = "000000000000000"[0:(16-len(s[1]))] + s[1] // pad id's to 16 characters to keep zipkin happy if p != "0" { zip.ParentId = "000000000000000"[0:(16-len(p))] + p // pad id's to 16 characters to keep zipkin happy } ctx = a.Ctx } var ann zipkinannotation ann.Endpoint.Servicename = a.Host ann.Endpoint.Ipv4 = dhcp.Lookup(a.Host) ann.Endpoint.Port = 8080 ann.Timestamp = a.Timestamp / 1000 // convert from UnixNano to Microseconds ann.Value = a.Value zip.Annotations = append(zip.Annotations, ann) } WriteZip(zip) }
// WriteNode writes the node to a file given a space separated name and service type func WriteNode(nameService string, t time.Time) { if Enabled == false { return } var node NodeV0r4 fmt.Sscanf(nameService, "%s%s", &node.Node, &node.Package) // space delimited node.Tstamp = t.Format(time.RFC3339Nano) // node id should be unique and service indicates service type node.Metadata = fmt.Sprintf("IP/%v", dhcp.Lookup(node.Node)) nodeJSON, _ := json.Marshal(node) Write(fmt.Sprintf("%v %v", commaNewline(), string(nodeJSON))) }