@@ -16,6 +16,16 @@ const ErrorBytesSize = 1024
1616// Default format for telemetry driver errors
1717const TelemetryDriverError = "Telemetry error in driver: "
1818
19+ // ErrorProcessID ...
20+ type ErrorProcessID struct {
21+ err error
22+ }
23+
24+ // Error returns the wrapped process id error
25+ func (ep ErrorProcessID ) Error () string {
26+ return fmt .Sprintf ("ProcessID error. Err: %w" , ep .err )
27+ }
28+
1929// Driver provides everything the application needs for telemetry
2030// Unfortunately go currently does nur support generics inside interface methods
2131type Driver interface {
@@ -27,6 +37,7 @@ type Transaction interface {
2737 Logger
2838 Tracer
2939 Allocator
40+ Processor
3041 Start (string )
3142 AddTransactionAttribute (string , any ) error
3243 SegmentStart (string , string ) error
@@ -53,6 +64,13 @@ type Allocator interface {
5364 Erase ()
5465}
5566
67+ // Processor ...
68+ type Processor interface {
69+ CreateProcessID () (string , error )
70+ SetProcessID (string ) error
71+ ProcessID () (string , error )
72+ }
73+
5674// ErrorWrapper wrapps up multiple driver errors
5775type ErrorWrapper struct {
5876 errors []error
@@ -117,28 +135,63 @@ func Start(name string) (TransactionContainer, error) {
117135 transactionContainer .transactions [driverName ] = t
118136 }
119137
120- var trace string
138+ processID , err := transactionContainer .CreateProcessID ()
139+ if err != nil {
140+ return transactionContainer , ErrorProcessID {
141+ err : err ,
142+ }
143+ }
144+
145+ err = transactionContainer .SetProcessID (processID )
146+ if err != nil {
147+ return transactionContainer , ErrorProcessID {
148+ err : err ,
149+ }
150+ }
151+
152+ for _ , transaction := range transactionContainer .transactions {
153+ transaction .Start (name )
154+ }
121155
122- val , ok := transactionContainer .transactions [traceDriver ]
156+ return transactionContainer , nil
157+ }
158+
159+ // CreateProcessID creates the process id for all drivers depending on the trace driver
160+ func (tc * TransactionContainer ) CreateProcessID () (string , error ) {
161+ var processID string
162+ val , ok := tc .transactions [traceDriver ]
123163 if ! ok {
124- return transactionContainer , fmt .Errorf ("provided telemetry trace driver is not registered. Trace driver name: %s" , traceDriver )
164+ return processID , fmt .Errorf ("provided telemetry trace driver is not registered. Trace driver name: %s" , traceDriver )
125165 }
126166
127- trace , err := val .CreateTrace ()
167+ processID , err := val .CreateProcessID ()
128168 if err != nil {
129- return transactionContainer , fmt .Errorf ("%s%s Function: CreateTrace | Error: %w" , TelemetryDriverError , traceDriver , err )
169+ return processID , fmt .Errorf ("%s%s Function: CreateProcessID | Error: %w" , TelemetryDriverError , traceDriver , err )
130170 }
131171
132- err = transactionContainer .SetTrace (trace )
172+ return processID , nil
173+ }
174+
175+ // StartTracing creates and sets the trace for all drivers depending on the trace driver
176+ func (tc * TransactionContainer ) StartTracing () (string , error ) {
177+ var trace string
178+
179+ val , ok := tc .transactions [traceDriver ]
180+ if ! ok {
181+ return trace , fmt .Errorf ("provided telemetry trace driver is not registered. Trace driver name: %s" , traceDriver )
182+ }
183+
184+ trace , err := val .CreateTrace ()
133185 if err != nil {
134- return transactionContainer , err
186+ return trace , fmt . Errorf ( "%s%s Function: CreateTrace | Error: %w" , TelemetryDriverError , traceDriver , err )
135187 }
136188
137- for _ , transaction := range transactionContainer .transactions {
138- transaction .Start (name )
189+ err = tc .SetTrace (trace )
190+ if err != nil {
191+ return trace , err
139192 }
140193
141- return transactionContainer , nil
194+ return trace , nil
142195}
143196
144197// AddTransactionAttribute adds attributes to the registered driver transactions
@@ -185,6 +238,20 @@ func (tc *TransactionContainer) SegmentEnd(segmentID string) {
185238 }
186239}
187240
241+ // SetProcessID sets the trace for all transactions
242+ func (tc * TransactionContainer ) SetProcessID (processID string ) error {
243+ var ew ErrorWrapper
244+
245+ for driverName , transaction := range tc .transactions {
246+ err := transaction .SetProcessID (processID )
247+ if err != nil {
248+ ew .Add (fmt .Errorf ("%s%s Function: SetProcessID | Error: %w" , TelemetryDriverError , driverName , err ))
249+ }
250+ }
251+
252+ return ew .Error ()
253+ }
254+
188255// SetTrace sets the trace for all transactions
189256func (tc * TransactionContainer ) SetTrace (trace string ) error {
190257 var ew ErrorWrapper
0 commit comments