package oc import ( "github.com/sirupsen/logrus" "go.opencensus.io/trace" ) var _ = (trace.Exporter)(&LogrusExporter{}) // LogrusExporter is an OpenCensus `trace.Exporter` that exports // `trace.SpanData` to logrus output. type LogrusExporter struct { } // ExportSpan exports `s` based on the the following rules: // // 1. All output will contain `s.Attributes`, `s.TraceID`, `s.SpanID`, // `s.ParentSpanID` for correlation // // 2. Any calls to .Annotate will not be supported. // // 3. The span itself will be written at `logrus.InfoLevel` unless // `s.Status.Code != 0` in which case it will be written at `logrus.ErrorLevel` // providing `s.Status.Message` as the error value. func (le *LogrusExporter) ExportSpan(s *trace.SpanData) { // Combine all span annotations with traceID, spanID, parentSpanID baseEntry := logrus.WithFields(logrus.Fields(s.Attributes)) baseEntry.Data["traceID"] = s.TraceID.String() baseEntry.Data["spanID"] = s.SpanID.String() baseEntry.Data["parentSpanID"] = s.ParentSpanID.String() baseEntry.Data["startTime"] = s.StartTime baseEntry.Data["endTime"] = s.EndTime baseEntry.Data["duration"] = s.EndTime.Sub(s.StartTime).String() baseEntry.Data["name"] = s.Name baseEntry.Time = s.StartTime level := logrus.InfoLevel if s.Status.Code != 0 { level = logrus.ErrorLevel baseEntry.Data[logrus.ErrorKey] = s.Status.Message } baseEntry.Log(level, "Span") }