package zipkin import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/inputs/zipkin/trace" ) // 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. func (l *LineProtocolConverter) Record(t trace.Trace) error { for _, s := range t { fields := map[string]interface{}{ "duration_ns": s.Duration.Nanoseconds(), } tags := map[string]string{ "id": s.ID, "parent_id": s.ParentID, "trace_id": s.TraceID, "name": s.Name, "service_name": s.ServiceName, } 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, "name": s.Name, "service_name": a.ServiceName, "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, "name": s.Name, "service_name": b.ServiceName, "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) }