private void HandleErrorCommand(object payloadData, PropertyFetcherSet propertyFetcherSet) { try { if (propertyFetcherSet.ErrorCorrelationId.Fetch(payloadData) is Guid operationId) { if (!_spans.TryRemove(operationId, out var span)) { return; } if (propertyFetcherSet.Exception.Fetch(payloadData) is Exception exception) { span.CaptureException(exception); } if (propertyFetcherSet.ErrorCommand.Fetch(payloadData) is IDbCommand dbCommand) { DbSpanCommon.EndSpan(span, dbCommand); } else { _logger.Warning()?.Log("Cannot extract database command from {PayloadData}", payloadData); span.End(); } } } catch (Exception ex) { // ignore _logger.Error()?.LogException(ex, "Exception was thrown while handling 'command failed event'"); } }
private void HandleStopCommand(object payloadData, PropertyFetcherSet propertyFetcherSet) { try { if (propertyFetcherSet.StopCorrelationId.Fetch(payloadData) is Guid operationId && propertyFetcherSet.StopCommand.Fetch(payloadData) is IDbCommand dbCommand) { if (!_spans.TryRemove(operationId, out var span)) { return; } TimeSpan?duration = null; if (propertyFetcherSet.Statistics.Fetch(payloadData) is IDictionary <object, object> statistics && statistics.ContainsKey("ExecutionTime") && statistics["ExecutionTime"] is long durationInMs) { duration = TimeSpan.FromMilliseconds(durationInMs); } DbSpanCommon.EndSpan(span, dbCommand, duration); } } catch (Exception ex) { // ignore _logger.Error()?.LogException(ex, "Exception was thrown while handling 'command succeeded event'"); } }
private void DoStartSpan <TResult>(IDbCommand command, DbCommandInterceptionContext <TResult> interceptCtx, string dbgOriginalCaller) { if (Agent.Instance.Tracer.CurrentTransaction == null) { _logger.Debug()?.Log("There's' no current transaction - skipping starting span for DB-operation-started event"); return; } LogEvent("DB operation started - starting a new span...", command, interceptCtx, dbgOriginalCaller); var span = DbSpanCommon.StartSpan(Agent.Instance, command); interceptCtx.SetUserState(_userStateKey, span); }
public Tracer( IApmLogger logger, Service service, IPayloadSender payloadSender, IConfigSnapshotProvider configProvider, ICurrentExecutionSegmentsContainer currentExecutionSegmentsContainer ) { _logger = logger?.Scoped(nameof(Tracer)); _service = service; _sender = payloadSender.ThrowIfArgumentNull(nameof(payloadSender)); _configProvider = configProvider.ThrowIfArgumentNull(nameof(configProvider)); CurrentExecutionSegmentsContainer = currentExecutionSegmentsContainer.ThrowIfArgumentNull(nameof(currentExecutionSegmentsContainer)); DbSpanCommon = new DbSpanCommon(logger); }
private void DoEndSpan <TResult>(IDbCommand command, DbCommandInterceptionContext <TResult> interceptCtx, string dbgOriginalCaller) { var span = (Span)interceptCtx.FindUserState(_userStateKey); if (span == null) { _logger.Debug() ?.Log("Span is not found in DbCommandInterceptionContext's UserState" + " - skipping ending the corresponding span for DB-operation-ended event"); return; } LogEvent("DB operation ended - ending the corresponding span...", command, interceptCtx, dbgOriginalCaller); DbSpanCommon.EndSpan(span, command); }
private void HandleStartCommand(object payloadData, PropertyFetcherSet propertyFetcherSet) { try { if (propertyFetcherSet.StartCorrelationId.Fetch(payloadData) is Guid operationId && propertyFetcherSet.StartCommand.Fetch(payloadData) is IDbCommand dbCommand) { var span = DbSpanCommon.StartSpan(_apmAgent, dbCommand); _spans.TryAdd(operationId, span); } } catch (Exception ex) { //ignore _logger.Error()?.LogException(ex, "Exception was thrown while handling 'command started event'"); } }
public Tracer( IApmLogger logger, Service service, IPayloadSender payloadSender, IConfigurationSnapshotProvider configurationProvider, ICurrentExecutionSegmentsContainer currentExecutionSegmentsContainer, IApmServerInfo apmServerInfo, BreakdownMetricsProvider breakdownMetricsProvider ) { _logger = logger?.Scoped(nameof(Tracer)); _service = service; _sender = payloadSender.ThrowIfArgumentNull(nameof(payloadSender)); _configurationProvider = configurationProvider.ThrowIfArgumentNull(nameof(configurationProvider)); CurrentExecutionSegmentsContainer = currentExecutionSegmentsContainer.ThrowIfArgumentNull(nameof(currentExecutionSegmentsContainer)); DbSpanCommon = new DbSpanCommon(logger); _apmServerInfo = apmServerInfo; _breakdownMetricsProvider = breakdownMetricsProvider; }
internal static ISpan CreateSpan(ApmAgent agent, IDbCommand command) { if (agent.Tracer.CurrentTransaction is null) { return(null); } // if the current execution segment is // 1. already for this instrumentation or instrumentation is AdoNet (System.Data.Common.DbCommand) and the type is "db" // and // 2. for the same command text // skip creating another db span for it, to prevent instrumenting delegated methods. if (agent.GetCurrentExecutionSegment() is Span span && (span.InstrumentationFlag.HasFlag(_instrumentationFlag) || span.Type == ApiConstants.TypeDb && (_instrumentationFlag == InstrumentationFlag.AdoNet || span.InstrumentationFlag == InstrumentationFlag.AdoNet)) && span.Name == DbSpanCommon.GetDbSpanName(command)) { return(null); } return(agent.TracerInternal.DbSpanCommon.StartSpan(agent, command, _instrumentationFlag)); }