in plugins/mongo/mongo/interceptor.go [44:104]
func (m *NewClientInterceptor) BeforeInvoke(invocation operator.Invocation) error {
opts := invocation.Args()[0].([]*options.ClientOptions)
syncMap := tools.NewSyncMap()
for _, opt := range opts {
hosts := opt.Hosts
hostLength := len(hosts)
// must contains host
if hostLength == 0 {
continue
}
configuredMonitor := opt.Monitor
// overwrite monitor, if define multiple opts, it should only keep the latest on the mongo client
opt.Monitor = &event.CommandMonitor{
Started: func(ctx context.Context, startedEvent *event.CommandStartedEvent) {
if configuredMonitor != nil {
configuredMonitor.Started(ctx, startedEvent)
}
host := hosts[0]
if hostLength > 1 {
if infoSplit := strings.Index(startedEvent.ConnectionID, "["); infoSplit > 0 && strings.HasSuffix(startedEvent.ConnectionID, "]") {
host = startedEvent.ConnectionID[0:infoSplit]
}
}
span, err := tracing.CreateExitSpan("MongoDB/"+startedEvent.CommandName, host, func(headerKey, headerValue string) error {
return nil
}, tracing.WithComponent(42),
tracing.WithLayer(tracing.SpanLayerDatabase),
tracing.WithTag(tracing.TagDBType, "MongoDB"))
if err != nil {
log.Warnf("cannot create exit span on mongo client: %v", err)
return
}
if config.CollectStatement {
span.Tag(tracing.TagDBStatement, m.gettingStatements(startedEvent))
}
syncMap.Put(fmt.Sprintf("%d", startedEvent.RequestID), span)
},
Succeeded: func(ctx context.Context, succeededEvent *event.CommandSucceededEvent) {
if configuredMonitor != nil {
configuredMonitor.Succeeded(ctx, succeededEvent)
}
if span, ok := syncMap.Remove(fmt.Sprintf("%d", succeededEvent.RequestID)); ok && span != nil {
span.(tracing.Span).End()
}
},
Failed: func(ctx context.Context, failedEvent *event.CommandFailedEvent) {
if configuredMonitor != nil {
configuredMonitor.Failed(ctx, failedEvent)
}
if span, ok := syncMap.Remove(fmt.Sprintf("%d", failedEvent.RequestID)); ok && span != nil {
span.(tracing.Span).Error(failedEvent.Failure)
span.(tracing.Span).End()
}
},
}
}
return nil
}