go.dedis.ch/onet/v3@v3.2.11-0.20210930124529-e36530bca7ef/tracing/honeycomb.go (about) 1 package tracing 2 3 import ( 4 "context" 5 "errors" 6 "os" 7 "strings" 8 9 "github.com/honeycombio/beeline-go" 10 11 "github.com/honeycombio/beeline-go/trace" 12 ) 13 14 // The HoneyComb implementation is mostly a wrapper to convince go that it's 15 // fine returning structures as interfaces. 16 // A Honeycomb logger can either be initialised using 17 // - NewHoneycombLoggerDebug to output on stdout all that would be sent to 18 // honeycomb 19 // - NewHoneycombLogger if you know the api key and the dataset 20 // - NewHoneycombLoggerFromEnv if you want the user to chose them using an 21 // environment variable. 22 23 type honeycombTrace struct { 24 *trace.Trace 25 ctx context.Context 26 } 27 28 func (ht *honeycombTrace) GetRootSpan() Span { 29 return &honeycombSpan{ht.Trace.GetRootSpan()} 30 } 31 32 type honeycombSpan struct { 33 *trace.Span 34 } 35 36 func (hs *honeycombSpan) CreateChild(ctx context.Context) (context.Context, 37 Span) { 38 newCtx, sp := hs.Span.CreateChild(ctx) 39 return newCtx, &honeycombSpan{sp} 40 } 41 42 func newHoneycombTrace(ctx context.Context, str string) (context.Context, 43 Trace) { 44 hct := &honeycombTrace{} 45 hct.ctx, hct.Trace = trace.NewTrace(ctx, str) 46 return hct.ctx, hct 47 } 48 49 // NewHoneycombLoggerDebug sets up a new honeycomb logger that will output 50 // all its data traces to stdout. Perfect for debugging... 51 func NewHoneycombLoggerDebug() *TraceLogger { 52 beeline.Init(beeline.Config{ 53 WriteKey: "1234", 54 Dataset: "test", 55 STDOUT: true, 56 }) 57 return NewLogger(newHoneycombTrace) 58 } 59 60 // NewHoneycombLogger sets up a new logger that is connected to a honeycomb 61 // trace-storage. 62 // The API can be found when signing up for a free account. 63 func NewHoneycombLogger(api, dataset string) *TraceLogger { 64 beeline.Init(beeline.Config{ 65 WriteKey: api, 66 Dataset: dataset, 67 }) 68 return NewLogger(newHoneycombTrace) 69 } 70 71 // NewHoneycombLoggerFromEnv checks the HONEYCOMB_API_KEY and extracts the 72 // api and dataset from it. 73 func NewHoneycombLoggerFromEnv() (*TraceLogger, error) { 74 hcenv := os.Getenv("HONEYCOMB_API_KEY") 75 if hcenv == "" { 76 return nil, nil 77 } 78 keyData := strings.Split(hcenv, ":") 79 if len(keyData) != 2 { 80 return nil, errors.New("need 'api_key:dataset' in HONEYCOMB_API_KEY") 81 } 82 return NewHoneycombLogger(keyData[0], keyData[1]), nil 83 }