84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| package zipkin
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| 
 | |
| 	"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":         formatName(s.Name),
 | |
| 			"service_name": formatName(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":          formatName(s.Name),
 | |
| 				"service_name":  formatName(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":           formatName(s.Name),
 | |
| 				"service_name":   formatName(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)
 | |
| }
 | |
| 
 | |
| // 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)
 | |
| }
 |