2017-08-03 00:58:26 +00:00
|
|
|
package zipkin
|
|
|
|
|
|
|
|
import (
|
2017-11-20 22:19:32 +00:00
|
|
|
"strings"
|
|
|
|
|
2017-08-03 00:58:26 +00:00
|
|
|
"github.com/influxdata/telegraf"
|
2017-08-22 00:24:54 +00:00
|
|
|
"github.com/influxdata/telegraf/plugins/inputs/zipkin/trace"
|
2017-08-03 00:58:26 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// LineProtocolConverter implements the Recorder interface; it is a
|
|
|
|
// type meant to encapsulate the storage of zipkin tracing data in
|
|
|
|
// telegraf as line protocol.
|
|
|
|
type LineProtocolConverter struct {
|
|
|
|
acc telegraf.Accumulator
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewLineProtocolConverter returns an instance of LineProtocolConverter that
|
|
|
|
// will add to the given telegraf.Accumulator
|
|
|
|
func NewLineProtocolConverter(acc telegraf.Accumulator) *LineProtocolConverter {
|
|
|
|
return &LineProtocolConverter{
|
|
|
|
acc: acc,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Record is LineProtocolConverter's implementation of the Record method of
|
|
|
|
// the Recorder interface; it takes a trace as input, and adds it to an internal
|
|
|
|
// telegraf.Accumulator.
|
2017-08-22 00:24:54 +00:00
|
|
|
func (l *LineProtocolConverter) Record(t trace.Trace) error {
|
2017-08-03 00:58:26 +00:00
|
|
|
for _, s := range t {
|
|
|
|
fields := map[string]interface{}{
|
|
|
|
"duration_ns": s.Duration.Nanoseconds(),
|
|
|
|
}
|
2017-11-20 22:19:32 +00:00
|
|
|
|
2017-08-03 00:58:26 +00:00
|
|
|
tags := map[string]string{
|
|
|
|
"id": s.ID,
|
|
|
|
"parent_id": s.ParentID,
|
|
|
|
"trace_id": s.TraceID,
|
2017-11-20 22:19:32 +00:00
|
|
|
"name": formatName(s.Name),
|
|
|
|
"service_name": formatName(s.ServiceName),
|
2017-08-03 00:58:26 +00:00
|
|
|
}
|
|
|
|
l.acc.AddFields("zipkin", fields, tags, s.Timestamp)
|
|
|
|
|
|
|
|
for _, a := range s.Annotations {
|
|
|
|
tags := map[string]string{
|
|
|
|
"id": s.ID,
|
|
|
|
"parent_id": s.ParentID,
|
|
|
|
"trace_id": s.TraceID,
|
2017-11-20 22:19:32 +00:00
|
|
|
"name": formatName(s.Name),
|
|
|
|
"service_name": formatName(a.ServiceName),
|
2017-08-03 00:58:26 +00:00
|
|
|
"annotation": a.Value,
|
|
|
|
"endpoint_host": a.Host,
|
|
|
|
}
|
|
|
|
l.acc.AddFields("zipkin", fields, tags, s.Timestamp)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, b := range s.BinaryAnnotations {
|
|
|
|
tags := map[string]string{
|
|
|
|
"id": s.ID,
|
|
|
|
"parent_id": s.ParentID,
|
|
|
|
"trace_id": s.TraceID,
|
2017-11-20 22:19:32 +00:00
|
|
|
"name": formatName(s.Name),
|
|
|
|
"service_name": formatName(b.ServiceName),
|
2017-08-03 00:58:26 +00:00
|
|
|
"annotation": b.Value,
|
|
|
|
"endpoint_host": b.Host,
|
|
|
|
"annotation_key": b.Key,
|
|
|
|
}
|
|
|
|
l.acc.AddFields("zipkin", fields, tags, s.Timestamp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LineProtocolConverter) Error(err error) {
|
|
|
|
l.acc.AddError(err)
|
|
|
|
}
|
2017-11-20 22:19:32 +00:00
|
|
|
|
|
|
|
// formatName formats name and service name
|
|
|
|
// Zipkin forces span and service names to be lowercase:
|
|
|
|
// https://github.com/openzipkin/zipkin/pull/805
|
|
|
|
func formatName(name string) string {
|
|
|
|
return strings.ToLower(name)
|
|
|
|
}
|