11package telemetry
22
33import (
4+ "fmt"
45 "io"
56 "log"
67 "strings"
@@ -18,12 +19,21 @@ type Driver interface {
1819// Transaction ...
1920type Transaction interface {
2021 Logger
22+ Tracer
2123 AddAttribute (string , any )
2224 SegmentStart (string )
2325 SegmentEnd ()
26+ DriverName () string
2427 Done ()
2528}
2629
30+ // Tracer ...
31+ type Tracer interface {
32+ CreateTrace () string
33+ SetTrace (string )
34+ Trace () string
35+ }
36+
2737// Logger ...
2838type Logger interface {
2939 Info (io.ReadCloser )
@@ -36,6 +46,9 @@ var registeredDriver map[string]Driver
3646// loadedDriver is a list of drivers to use for the application
3747var loadedDriver []string
3848
49+ // traceDriver is the driver used for the trace
50+ var traceDriver string
51+
3952// RegisterDriver adds the possibilty to add a driver to the driver map
4053func RegisterDriver (name string , driver Driver ) {
4154 if registeredDriver == nil {
@@ -60,24 +73,40 @@ func SetDriver(name ...string) {
6073 loadedDriver = name
6174}
6275
76+ // SetTraceDriver ...
77+ func SetTraceDriver (name string ) {
78+ traceDriver = name
79+ }
80+
6381// TransactionContainer ...
6482type TransactionContainer struct {
65- transactions [ ]Transaction
83+ transactions map [ string ]Transaction
6684}
6785
68- // StartAPM ...
69- func StartAPM (name string ) TransactionContainer {
86+ // StartTelemetry ...
87+ func StartTelemetry (name string ) ( TransactionContainer , error ) {
7088 transactionContainer := TransactionContainer {
71- transactions : make ([ ]Transaction , len (loadedDriver )),
89+ transactions : make (map [ string ]Transaction , len (loadedDriver )),
7290 }
7391
7492 for _ , driverName := range loadedDriver {
7593 driver := getDriver (driverName )
7694 t := driver .Start (name )
77- transactionContainer .transactions = append ( transactionContainer . transactions , t )
95+ transactionContainer .transactions [ driverName ] = t
7896 }
7997
80- return transactionContainer
98+ var trace string
99+
100+ val , ok := transactionContainer .transactions [traceDriver ]
101+ if ! ok {
102+ return transactionContainer , fmt .Errorf ("provided telemetry trace driver is not registered. Trace driver name: %s" , name )
103+ }
104+
105+ trace = val .CreateTrace ()
106+
107+ transactionContainer .SetTrace (trace )
108+
109+ return transactionContainer , nil
81110}
82111
83112// AddAttribute adds attributes to the registered driver transactions
@@ -101,6 +130,23 @@ func (tc *TransactionContainer) SegmentEnd() {
101130 }
102131}
103132
133+ // SetTrace sets the trace for all transactions
134+ func (tc * TransactionContainer ) SetTrace (trace string ) {
135+ for _ , transaction := range tc .transactions {
136+ transaction .SetTrace (trace )
137+ }
138+ }
139+
140+ // Trace gets the trace of the transaction used for trace
141+ func (tc * TransactionContainer ) Trace () (string , error ) {
142+ val , ok := tc .transactions [traceDriver ]
143+ if ! ok {
144+ return "" , fmt .Errorf ("provided telemetry trace driver is not registered. Trace driver name: %s" , traceDriver )
145+ }
146+
147+ return val .Trace (), nil
148+ }
149+
104150// Done ends the transactions for the registered driver
105151func (tc * TransactionContainer ) Done () {
106152 for _ , transaction := range tc .transactions {
0 commit comments