/// <summary> /// Common helper for all End Callbacks. /// </summary> /// <param name="exceptionObj">The exception object if any.</param> /// <param name="thisObj">This object.</param> /// <param name="sendTelemetryItem">True if telemetry item should be sent, otherwise it only stops the telemetry item.</param> private void OnEndInternal(object exceptionObj, object thisObj, bool sendTelemetryItem = true) { if (thisObj == null) { DependencyCollectorEventSource.Log.NotExpectedCallback(0, "OnEndSql", "thisObj == null"); return; } DependencyCollectorEventSource.Log.EndCallbackCalled(thisObj.GetHashCode().ToString(CultureInfo.InvariantCulture)); DependencyTelemetry telemetry = null; Tuple <DependencyTelemetry, bool> telemetryTuple = null; bool isCustomGenerated = false; telemetryTuple = this.TelemetryTable.Get(thisObj); if (telemetryTuple != null) { telemetry = telemetryTuple.Item1; isCustomGenerated = telemetryTuple.Item2; } if (telemetry == null) { DependencyCollectorEventSource.Log.EndCallbackWithNoBegin(thisObj.GetHashCode().ToString(CultureInfo.InvariantCulture)); return; } if (!isCustomGenerated) { this.TelemetryTable.Remove(thisObj); if (sendTelemetryItem) { var exception = exceptionObj as Exception; if (exception != null) { telemetry.Success = false; telemetry.Properties.Add("ErrorMessage", exception.Message); var sqlEx = exception as SqlException; telemetry.ResultCode = sqlEx != null?sqlEx.Number.ToString(CultureInfo.InvariantCulture) : "0"; } else { telemetry.Success = true; } DependencyCollectorEventSource.Log.AutoTrackingDependencyItem(telemetry.Name); ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry); } else { DependencyCollectorEventSource.Log.EndOperationNoTracking(telemetry.Name); ClientServerDependencyTracker.EndOperation(telemetry); } } }