@@ -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
@@ -62,6 +62,8 @@ type options struct {
62
62
promptCacheRefreshInterval time.Duration
63
63
promptTrace bool
64
64
exporter trace.Exporter
65
+ traceFinishEventProcessor func (ctx context.Context , info * FinishEventInfo )
66
+ traceTagTruncateConf * TagTruncateConf
65
67
}
66
68
67
69
func (o * options ) MD5 () string {
@@ -133,10 +135,19 @@ func NewClient(opts ...Option) (Client, error) {
133
135
Timeout : options .timeout ,
134
136
UploadTimeout : options .uploadTimeout ,
135
137
})
138
+ traceFinishEventProcessor := trace .DefaultFinishEventProcessor
139
+ if options .traceFinishEventProcessor != nil {
140
+ traceFinishEventProcessor = func (ctx context.Context , info * consts.FinishEventInfo ) {
141
+ trace .DefaultFinishEventProcessor (ctx , info )
142
+ options .traceFinishEventProcessor (ctx , (* FinishEventInfo )(info ))
143
+ }
144
+ }
136
145
c .traceProvider = trace .NewTraceProvider (httpClient , trace.Options {
137
- WorkspaceID : options .workspaceID ,
138
- UltraLargeReport : options .ultraLargeReport ,
139
- Exporter : options .exporter ,
146
+ WorkspaceID : options .workspaceID ,
147
+ UltraLargeReport : options .ultraLargeReport ,
148
+ Exporter : options .exporter ,
149
+ TraceFinishEventProcessor : traceFinishEventProcessor ,
150
+ TraceTagTruncateConf : (* trace .TagTruncateConf )(options .traceTagTruncateConf ),
140
151
})
141
152
c .promptProvider = prompt .NewPromptProvider (httpClient , c .traceProvider , prompt.Options {
142
153
WorkspaceID : options .workspaceID ,
@@ -247,6 +258,18 @@ func WithExporter(e trace.Exporter) Option {
247
258
}
248
259
}
249
260
261
+ func WithTraceFinishEventProcessor (f func (ctx context.Context , info * FinishEventInfo )) Option {
262
+ return func (p * options ) {
263
+ p .traceFinishEventProcessor = f
264
+ }
265
+ }
266
+
267
+ func WithTraceTagTruncateConf (conf * TagTruncateConf ) Option {
268
+ return func (p * options ) {
269
+ p .traceTagTruncateConf = conf
270
+ }
271
+ }
272
+
250
273
// GetWorkspaceID return space id
251
274
func GetWorkspaceID () string {
252
275
return getDefaultClient ().GetWorkspaceID ()
@@ -350,13 +373,27 @@ func buildAuth(opts options) (httpclient.Auth, error) {
350
373
return nil , ErrAuthInfoRequired
351
374
}
352
375
376
+ func SetDefaultClient (client Client ) {
377
+ defaultClientLock .Lock ()
378
+ defer defaultClientLock .Unlock ()
379
+ defaultClient = client
380
+ }
381
+
353
382
func getDefaultClient () Client {
383
+ if defaultClient != nil {
384
+ return defaultClient
385
+ }
354
386
once .Do (func () {
355
387
var err error
356
- defaultClient , err = NewClient ()
388
+ client , err : = NewClient ()
357
389
if err != nil {
390
+ defaultClientLock .Lock ()
358
391
defaultClient = & NoopClient {newClientError : err }
392
+ defaultClientLock .Unlock ()
359
393
} else {
394
+ defaultClientLock .Lock ()
395
+ defaultClient = client
396
+ defaultClientLock .Unlock ()
360
397
sigChan := make (chan os.Signal , 1 )
361
398
signal .Notify (sigChan , syscall .SIGINT , syscall .SIGTERM )
362
399
go func () {
@@ -366,7 +403,9 @@ func getDefaultClient() Client {
366
403
367
404
logger .CtxInfof (ctx , "Received signal: %v, starting graceful shutdown..." , sig )
368
405
defaultClient .Close (ctx )
406
+ defaultClientLock .Lock ()
369
407
defaultClient = & NoopClient {newClientError : consts .ErrClientClosed }
408
+ defaultClientLock .Unlock ()
370
409
logger .CtxInfof (ctx , "Graceful shutdown finished." )
371
410
os .Exit (0 )
372
411
}()
@@ -376,9 +415,10 @@ func getDefaultClient() Client {
376
415
}
377
416
378
417
var (
379
- defaultClient Client
380
- once sync.Once
381
- clientCache sync.Map // client cache to avoid creating multiple clients with the same options
418
+ defaultClient Client
419
+ defaultClientLock sync.RWMutex
420
+ once sync.Once
421
+ clientCache sync.Map // client cache to avoid creating multiple clients with the same options
382
422
)
383
423
384
424
type loopClient struct {
@@ -426,7 +466,7 @@ func (c *loopClient) PromptFormat(ctx context.Context, loopPrompt *entity.Prompt
426
466
427
467
func (c * loopClient ) StartSpan (ctx context.Context , name , spanType string , opts ... StartSpanOption ) (context.Context , Span ) {
428
468
if c .closed {
429
- return ctx , defaultNoopSpan
469
+ return ctx , DefaultNoopSpan
430
470
}
431
471
config := trace.StartSpanOptions {}
432
472
for _ , opt := range opts {
@@ -438,25 +478,25 @@ func (c *loopClient) StartSpan(ctx context.Context, name, spanType string, opts
438
478
ctx , span , err := c .traceProvider .StartSpan (ctx , name , spanType , config )
439
479
if err != nil {
440
480
logger .CtxWarnf (ctx , "start span failed, return noop span. %v" , err )
441
- return ctx , defaultNoopSpan
481
+ return ctx , DefaultNoopSpan
442
482
}
443
483
return ctx , span
444
484
}
445
485
446
486
func (c * loopClient ) GetSpanFromContext (ctx context.Context ) Span {
447
487
if c .closed {
448
- return defaultNoopSpan
488
+ return DefaultNoopSpan
449
489
}
450
490
span := c .traceProvider .GetSpanFromContext (ctx )
451
491
if span == nil {
452
- return defaultNoopSpan
492
+ return DefaultNoopSpan
453
493
}
454
494
return span
455
495
}
456
496
457
497
func (c * loopClient ) GetSpanFromHeader (ctx context.Context , header map [string ]string ) SpanContext {
458
498
if c .closed {
459
- return defaultNoopSpan
499
+ return DefaultNoopSpan
460
500
}
461
501
return c .traceProvider .GetSpanFromHeader (ctx , header )
462
502
}
0 commit comments