func()

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
}