| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package dcensus |
| |
| import ( |
| "bytes" |
| "context" |
| "fmt" |
| "io" |
| "sync" |
| |
| "go.opencensus.io/trace" |
| "golang.org/x/pkgsite/internal/log" |
| ) |
| |
| type debugTraceExporter struct { |
| exp trace.Exporter |
| mu sync.Mutex |
| err error |
| } |
| |
| func (d *debugTraceExporter) onError(err error) { |
| log.Debugf(context.Background(), "trace exporter: onError called with %v", err) |
| d.err = err |
| } |
| |
| // ExportSpan implements the trace.Exporter interface. |
| func (d *debugTraceExporter) ExportSpan(s *trace.SpanData) { |
| ctx := context.Background() |
| d.mu.Lock() |
| d.exp.ExportSpan(s) |
| err := d.err |
| d.err = nil |
| d.mu.Unlock() |
| if err != nil { |
| log.Warningf(ctx, "trace exporter: %v", err) |
| log.Debugf(ctx, "trace exporter SpanData:\n%s", dumpSpanData(s)) |
| } |
| } |
| |
| func dumpSpanData(s *trace.SpanData) string { |
| var buf bytes.Buffer |
| fmt.Fprintf(&buf, "Name: %q\n", s.Name) |
| dumpAttributes(&buf, s.Attributes) |
| for _, a := range s.Annotations { |
| fmt.Fprintf(&buf, " annotation: %q\n", a.Message) |
| dumpAttributes(&buf, a.Attributes) |
| } |
| fmt.Fprintf(&buf, "Status.Message: %q\n", s.Status.Message) |
| fmt.Fprintln(&buf, "link attrs:") |
| for _, l := range s.Links { |
| dumpAttributes(&buf, l.Attributes) |
| } |
| return buf.String() |
| } |
| |
| func dumpAttributes(w io.Writer, m map[string]any) { |
| for k, v := range m { |
| fmt.Fprintf(w, " %q: %#v\n", k, v) |
| } |
| } |