@@ -35,7 +35,7 @@ type Client interface {
35
35
36
36
// GetWorkspaceID return workspace id
37
37
GetWorkspaceID () string
38
- // Close Close the client. Should be called before program exit.
38
+ // Close close the client. Should be called before program exit.
39
39
Close (ctx context.Context )
40
40
}
41
41
@@ -46,6 +46,7 @@ type HttpClient = httpclient.HTTPClient
46
46
47
47
type options struct {
48
48
apiBaseURL string
49
+ apiBasePath * APIBasePath
49
50
workspaceID string
50
51
httpClient HttpClient
51
52
timeout time.Duration
@@ -62,6 +63,9 @@ type options struct {
62
63
promptCacheRefreshInterval time.Duration
63
64
promptTrace bool
64
65
exporter trace.Exporter
66
+ traceFinishEventProcessor func (ctx context.Context , info * FinishEventInfo )
67
+ traceTagTruncateConf * TagTruncateConf
68
+ traceQueueConf * TraceQueueConf
65
69
}
66
70
67
71
func (o * options ) MD5 () string {
@@ -133,10 +137,28 @@ func NewClient(opts ...Option) (Client, error) {
133
137
Timeout : options .timeout ,
134
138
UploadTimeout : options .uploadTimeout ,
135
139
})
140
+ traceFinishEventProcessor := trace .DefaultFinishEventProcessor
141
+ if options .traceFinishEventProcessor != nil {
142
+ traceFinishEventProcessor = func (ctx context.Context , info * consts.FinishEventInfo ) {
143
+ trace .DefaultFinishEventProcessor (ctx , info )
144
+ options .traceFinishEventProcessor (ctx , (* FinishEventInfo )(info ))
145
+ }
146
+ }
147
+ var spanUploadPath string
148
+ var fileUploadPath string
149
+ if options .apiBasePath != nil {
150
+ spanUploadPath = options .apiBasePath .TraceSpanUploadPath
151
+ fileUploadPath = options .apiBasePath .TraceFileUploadPath
152
+ }
136
153
c .traceProvider = trace .NewTraceProvider (httpClient , trace.Options {
137
- WorkspaceID : options .workspaceID ,
138
- UltraLargeReport : options .ultraLargeReport ,
139
- Exporter : options .exporter ,
154
+ WorkspaceID : options .workspaceID ,
155
+ UltraLargeReport : options .ultraLargeReport ,
156
+ Exporter : options .exporter ,
157
+ FinishEventProcessor : traceFinishEventProcessor ,
158
+ TagTruncateConf : (* trace .TagTruncateConf )(options .traceTagTruncateConf ),
159
+ SpanUploadPath : spanUploadPath ,
160
+ FileUploadPath : fileUploadPath ,
161
+ QueueConf : (* trace .QueueConf )(options .traceQueueConf ),
140
162
})
141
163
c .promptProvider = prompt .NewPromptProvider (httpClient , c .traceProvider , prompt.Options {
142
164
WorkspaceID : options .workspaceID ,
@@ -185,6 +207,12 @@ func WithAPIBaseURL(apiBaseURL string) Option {
185
207
}
186
208
}
187
209
210
+ func WithAPIBasePath (apiBasePath * APIBasePath ) Option {
211
+ return func (p * options ) {
212
+ p .apiBasePath = apiBasePath
213
+ }
214
+ }
215
+
188
216
// WithWorkspaceID set workspace id.
189
217
func WithWorkspaceID (workspaceID string ) Option {
190
218
return func (p * options ) {
@@ -241,12 +269,33 @@ func WithPromptTrace(enable bool) Option {
241
269
}
242
270
}
243
271
272
+ // WithExporter set custom trace exporter.
244
273
func WithExporter (e trace.Exporter ) Option {
245
274
return func (p * options ) {
246
275
p .exporter = e
247
276
}
248
277
}
249
278
279
+ // WithTraceFinishEventProcessor set custom finish event processor, after span finish.
280
+ func WithTraceFinishEventProcessor (f func (ctx context.Context , info * FinishEventInfo )) Option {
281
+ return func (p * options ) {
282
+ p .traceFinishEventProcessor = f
283
+ }
284
+ }
285
+
286
+ // WithTraceTagTruncateConf set span tag truncate conf.
287
+ func WithTraceTagTruncateConf (conf * TagTruncateConf ) Option {
288
+ return func (p * options ) {
289
+ p .traceTagTruncateConf = conf
290
+ }
291
+ }
292
+
293
+ func WithTraceQueueConf (conf * TraceQueueConf ) Option {
294
+ return func (p * options ) {
295
+ p .traceQueueConf = conf
296
+ }
297
+ }
298
+
250
299
// GetWorkspaceID return space id
251
300
func GetWorkspaceID () string {
252
301
return getDefaultClient ().GetWorkspaceID ()
@@ -350,13 +399,27 @@ func buildAuth(opts options) (httpclient.Auth, error) {
350
399
return nil , ErrAuthInfoRequired
351
400
}
352
401
402
+ func SetDefaultClient (client Client ) {
403
+ defaultClientLock .Lock ()
404
+ defer defaultClientLock .Unlock ()
405
+ defaultClient = client
406
+ }
407
+
353
408
func getDefaultClient () Client {
409
+ if defaultClient != nil {
410
+ return defaultClient
411
+ }
354
412
once .Do (func () {
355
413
var err error
356
- defaultClient , err = NewClient ()
414
+ client , err : = NewClient ()
357
415
if err != nil {
416
+ defaultClientLock .Lock ()
358
417
defaultClient = & NoopClient {newClientError : err }
418
+ defaultClientLock .Unlock ()
359
419
} else {
420
+ defaultClientLock .Lock ()
421
+ defaultClient = client
422
+ defaultClientLock .Unlock ()
360
423
sigChan := make (chan os.Signal , 1 )
361
424
signal .Notify (sigChan , syscall .SIGINT , syscall .SIGTERM )
362
425
go func () {
@@ -366,7 +429,9 @@ func getDefaultClient() Client {
366
429
367
430
logger .CtxInfof (ctx , "Received signal: %v, starting graceful shutdown..." , sig )
368
431
defaultClient .Close (ctx )
432
+ defaultClientLock .Lock ()
369
433
defaultClient = & NoopClient {newClientError : consts .ErrClientClosed }
434
+ defaultClientLock .Unlock ()
370
435
logger .CtxInfof (ctx , "Graceful shutdown finished." )
371
436
os .Exit (0 )
372
437
}()
@@ -376,9 +441,10 @@ func getDefaultClient() Client {
376
441
}
377
442
378
443
var (
379
- defaultClient Client
380
- once sync.Once
381
- clientCache sync.Map // client cache to avoid creating multiple clients with the same options
444
+ defaultClient Client
445
+ defaultClientLock sync.RWMutex
446
+ once sync.Once
447
+ clientCache sync.Map // client cache to avoid creating multiple clients with the same options
382
448
)
383
449
384
450
type loopClient struct {
@@ -426,7 +492,7 @@ func (c *loopClient) PromptFormat(ctx context.Context, loopPrompt *entity.Prompt
426
492
427
493
func (c * loopClient ) StartSpan (ctx context.Context , name , spanType string , opts ... StartSpanOption ) (context.Context , Span ) {
428
494
if c .closed {
429
- return ctx , defaultNoopSpan
495
+ return ctx , DefaultNoopSpan
430
496
}
431
497
config := trace.StartSpanOptions {}
432
498
for _ , opt := range opts {
@@ -438,25 +504,25 @@ func (c *loopClient) StartSpan(ctx context.Context, name, spanType string, opts
438
504
ctx , span , err := c .traceProvider .StartSpan (ctx , name , spanType , config )
439
505
if err != nil {
440
506
logger .CtxWarnf (ctx , "start span failed, return noop span. %v" , err )
441
- return ctx , defaultNoopSpan
507
+ return ctx , DefaultNoopSpan
442
508
}
443
509
return ctx , span
444
510
}
445
511
446
512
func (c * loopClient ) GetSpanFromContext (ctx context.Context ) Span {
447
513
if c .closed {
448
- return defaultNoopSpan
514
+ return DefaultNoopSpan
449
515
}
450
516
span := c .traceProvider .GetSpanFromContext (ctx )
451
517
if span == nil {
452
- return defaultNoopSpan
518
+ return DefaultNoopSpan
453
519
}
454
520
return span
455
521
}
456
522
457
523
func (c * loopClient ) GetSpanFromHeader (ctx context.Context , header map [string ]string ) SpanContext {
458
524
if c .closed {
459
- return defaultNoopSpan
525
+ return DefaultNoopSpan
460
526
}
461
527
return c .traceProvider .GetSpanFromHeader (ctx , header )
462
528
}
0 commit comments