@@ -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 {
@@ -80,6 +84,10 @@ func (o *options) MD5() string {
80
84
h .Write ([]byte (fmt .Sprintf ("%d" , o .promptCacheMaxCount ) + separator ))
81
85
h .Write ([]byte (o .promptCacheRefreshInterval .String () + separator ))
82
86
h .Write ([]byte (fmt .Sprintf ("%v" , o .promptTrace ) + separator ))
87
+ h .Write ([]byte (fmt .Sprintf ("%p" , o .exporter ) + separator ))
88
+ h .Write ([]byte (fmt .Sprintf ("%p" , o .traceFinishEventProcessor ) + separator ))
89
+ h .Write ([]byte (fmt .Sprintf ("%p" , o .traceTagTruncateConf ) + separator ))
90
+ h .Write ([]byte (fmt .Sprintf ("%p" , o .traceQueueConf ) + separator ))
83
91
return hex .EncodeToString (h .Sum (nil ))
84
92
}
85
93
@@ -133,10 +141,28 @@ func NewClient(opts ...Option) (Client, error) {
133
141
Timeout : options .timeout ,
134
142
UploadTimeout : options .uploadTimeout ,
135
143
})
144
+ traceFinishEventProcessor := trace .DefaultFinishEventProcessor
145
+ if options .traceFinishEventProcessor != nil {
146
+ traceFinishEventProcessor = func (ctx context.Context , info * consts.FinishEventInfo ) {
147
+ trace .DefaultFinishEventProcessor (ctx , info )
148
+ options .traceFinishEventProcessor (ctx , (* FinishEventInfo )(info ))
149
+ }
150
+ }
151
+ var spanUploadPath string
152
+ var fileUploadPath string
153
+ if options .apiBasePath != nil {
154
+ spanUploadPath = options .apiBasePath .TraceSpanUploadPath
155
+ fileUploadPath = options .apiBasePath .TraceFileUploadPath
156
+ }
136
157
c .traceProvider = trace .NewTraceProvider (httpClient , trace.Options {
137
- WorkspaceID : options .workspaceID ,
138
- UltraLargeReport : options .ultraLargeReport ,
139
- Exporter : options .exporter ,
158
+ WorkspaceID : options .workspaceID ,
159
+ UltraLargeReport : options .ultraLargeReport ,
160
+ Exporter : options .exporter ,
161
+ FinishEventProcessor : traceFinishEventProcessor ,
162
+ TagTruncateConf : (* trace .TagTruncateConf )(options .traceTagTruncateConf ),
163
+ SpanUploadPath : spanUploadPath ,
164
+ FileUploadPath : fileUploadPath ,
165
+ QueueConf : (* trace .QueueConf )(options .traceQueueConf ),
140
166
})
141
167
c .promptProvider = prompt .NewPromptProvider (httpClient , c .traceProvider , prompt.Options {
142
168
WorkspaceID : options .workspaceID ,
@@ -185,6 +211,12 @@ func WithAPIBaseURL(apiBaseURL string) Option {
185
211
}
186
212
}
187
213
214
+ func WithAPIBasePath (apiBasePath * APIBasePath ) Option {
215
+ return func (p * options ) {
216
+ p .apiBasePath = apiBasePath
217
+ }
218
+ }
219
+
188
220
// WithWorkspaceID set workspace id.
189
221
func WithWorkspaceID (workspaceID string ) Option {
190
222
return func (p * options ) {
@@ -241,12 +273,33 @@ func WithPromptTrace(enable bool) Option {
241
273
}
242
274
}
243
275
276
+ // WithExporter set custom trace exporter.
244
277
func WithExporter (e trace.Exporter ) Option {
245
278
return func (p * options ) {
246
279
p .exporter = e
247
280
}
248
281
}
249
282
283
+ // WithTraceFinishEventProcessor set custom finish event processor, after span finish.
284
+ func WithTraceFinishEventProcessor (f func (ctx context.Context , info * FinishEventInfo )) Option {
285
+ return func (p * options ) {
286
+ p .traceFinishEventProcessor = f
287
+ }
288
+ }
289
+
290
+ // WithTraceTagTruncateConf set span tag truncate conf.
291
+ func WithTraceTagTruncateConf (conf * TagTruncateConf ) Option {
292
+ return func (p * options ) {
293
+ p .traceTagTruncateConf = conf
294
+ }
295
+ }
296
+
297
+ func WithTraceQueueConf (conf * TraceQueueConf ) Option {
298
+ return func (p * options ) {
299
+ p .traceQueueConf = conf
300
+ }
301
+ }
302
+
250
303
// GetWorkspaceID return space id
251
304
func GetWorkspaceID () string {
252
305
return getDefaultClient ().GetWorkspaceID ()
@@ -350,13 +403,27 @@ func buildAuth(opts options) (httpclient.Auth, error) {
350
403
return nil , ErrAuthInfoRequired
351
404
}
352
405
406
+ func SetDefaultClient (client Client ) {
407
+ defaultClientLock .Lock ()
408
+ defer defaultClientLock .Unlock ()
409
+ defaultClient = client
410
+ }
411
+
353
412
func getDefaultClient () Client {
413
+ if defaultClient != nil {
414
+ return defaultClient
415
+ }
354
416
once .Do (func () {
355
417
var err error
356
- defaultClient , err = NewClient ()
418
+ client , err : = NewClient ()
357
419
if err != nil {
420
+ defaultClientLock .Lock ()
358
421
defaultClient = & NoopClient {newClientError : err }
422
+ defaultClientLock .Unlock ()
359
423
} else {
424
+ defaultClientLock .Lock ()
425
+ defaultClient = client
426
+ defaultClientLock .Unlock ()
360
427
sigChan := make (chan os.Signal , 1 )
361
428
signal .Notify (sigChan , syscall .SIGINT , syscall .SIGTERM )
362
429
go func () {
@@ -366,7 +433,9 @@ func getDefaultClient() Client {
366
433
367
434
logger .CtxInfof (ctx , "Received signal: %v, starting graceful shutdown..." , sig )
368
435
defaultClient .Close (ctx )
436
+ defaultClientLock .Lock ()
369
437
defaultClient = & NoopClient {newClientError : consts .ErrClientClosed }
438
+ defaultClientLock .Unlock ()
370
439
logger .CtxInfof (ctx , "Graceful shutdown finished." )
371
440
os .Exit (0 )
372
441
}()
@@ -376,9 +445,10 @@ func getDefaultClient() Client {
376
445
}
377
446
378
447
var (
379
- defaultClient Client
380
- once sync.Once
381
- clientCache sync.Map // client cache to avoid creating multiple clients with the same options
448
+ defaultClient Client
449
+ defaultClientLock sync.RWMutex
450
+ once sync.Once
451
+ clientCache sync.Map // client cache to avoid creating multiple clients with the same options
382
452
)
383
453
384
454
type loopClient struct {
@@ -426,7 +496,7 @@ func (c *loopClient) PromptFormat(ctx context.Context, loopPrompt *entity.Prompt
426
496
427
497
func (c * loopClient ) StartSpan (ctx context.Context , name , spanType string , opts ... StartSpanOption ) (context.Context , Span ) {
428
498
if c .closed {
429
- return ctx , defaultNoopSpan
499
+ return ctx , DefaultNoopSpan
430
500
}
431
501
config := trace.StartSpanOptions {}
432
502
for _ , opt := range opts {
@@ -438,25 +508,25 @@ func (c *loopClient) StartSpan(ctx context.Context, name, spanType string, opts
438
508
ctx , span , err := c .traceProvider .StartSpan (ctx , name , spanType , config )
439
509
if err != nil {
440
510
logger .CtxWarnf (ctx , "start span failed, return noop span. %v" , err )
441
- return ctx , defaultNoopSpan
511
+ return ctx , DefaultNoopSpan
442
512
}
443
513
return ctx , span
444
514
}
445
515
446
516
func (c * loopClient ) GetSpanFromContext (ctx context.Context ) Span {
447
517
if c .closed {
448
- return defaultNoopSpan
518
+ return DefaultNoopSpan
449
519
}
450
520
span := c .traceProvider .GetSpanFromContext (ctx )
451
521
if span == nil {
452
- return defaultNoopSpan
522
+ return DefaultNoopSpan
453
523
}
454
524
return span
455
525
}
456
526
457
527
func (c * loopClient ) GetSpanFromHeader (ctx context.Context , header map [string ]string ) SpanContext {
458
528
if c .closed {
459
- return defaultNoopSpan
529
+ return DefaultNoopSpan
460
530
}
461
531
return c .traceProvider .GetSpanFromHeader (ctx , header )
462
532
}
0 commit comments