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  }