diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporter.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporter.cs index ba50bcc1beee..8bbbafabdb35 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporter.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporter.cs @@ -46,7 +46,7 @@ public override ExportResult Export(in Batch batch) } catch (Exception ex) { - AzureMonitorTraceExporterEventSource.Log.FailedExport(ex); + AzureMonitorTraceExporterEventSource.Log.Write($"FailedToExport{EventLevelSuffix.Error}", ex.LogAsyncException()); return ExportResult.Failure; } } diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporterEventSource.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporterEventSource.cs index ad9158886810..3393a3f74a6f 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporterEventSource.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporterEventSource.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Collections.Generic; using System.Diagnostics.Tracing; namespace OpenTelemetry.Exporter.AzureMonitor @@ -11,41 +12,64 @@ internal sealed class AzureMonitorTraceExporterEventSource : EventSource { private const string EventSourceName = "OpenTelemetry-TraceExporter-AzureMonitor"; public static AzureMonitorTraceExporterEventSource Log = new AzureMonitorTraceExporterEventSource(); - - [NonEvent] - public void FailedExport(Exception ex) + public readonly IReadOnlyDictionary EventLevelMap = new Dictionary { - if (this.IsEnabled(EventLevel.Error, EventKeywords.All)) - { - this.FailedExport(ex.ToInvariantString()); - } - } + [EventLevelSuffix.Critical] = EventLevel.Critical, + [EventLevelSuffix.Error] = EventLevel.Error, + [EventLevelSuffix.Warning] = EventLevel.Warning, + [EventLevelSuffix.Informational] = EventLevel.Informational, + [EventLevelSuffix.Verbose] = EventLevel.Verbose + }; [NonEvent] - public void SdkVersionCreateFailed(Exception ex) + public void Write(string name, object value) { - if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) - { - this.WarnSdkVersionCreateException(ex.ToInvariantString()); - } - } + var lastIndex = name.LastIndexOf('.'); + var eventLevel = EventLevelMap[name.Substring(lastIndex)]; - [NonEvent] - public void ConnectionStringError(Exception ex) - { - if (this.IsEnabled(EventLevel.Error, EventKeywords.All)) + if (this.IsEnabled(eventLevel, EventKeywords.All)) { - this.ConnectionStringError(ex.ToInvariantString()); + var message = $"{name.Trim(lastIndex)} - {GetMessage(value)}"; + + switch (eventLevel) + { + case EventLevel.Critical: + WriteCritical(message); + break; + case EventLevel.Error: + WriteError(message); + break; + case EventLevel.Informational: + WriteInformational(message); + break; + case EventLevel.Verbose: + WriteVerbose(message); + break; + case EventLevel.Warning: + WriteWarning(message); + break; + } } } - [Event(1, Message = "Failed to export activities: '{0}'", Level = EventLevel.Error)] - public void FailedExport(string exception) => this.WriteEvent(1, exception); + [Event(1, Message = "{0}", Level = EventLevel.Critical)] + public void WriteCritical(string message) => this.WriteEvent(1, message); + + [Event(2, Message = "{0}", Level = EventLevel.Error)] + public void WriteError(string message) => this.WriteEvent(2, message); - [Event(2, Message = "Error creating SdkVersion : '{0}'", Level = EventLevel.Warning)] - public void WarnSdkVersionCreateException(string message) => this.WriteEvent(2, message); + [Event(3, Message = "{0}", Level = EventLevel.Warning)] + public void WriteWarning(string message) => this.WriteEvent(3, message); - [Event(3, Message = "Connection String Error: '{0}'", Level = EventLevel.Error)] - public void ConnectionStringError(string message) => this.WriteEvent(3, message); + [Event(4, Message = "{0}", Level = EventLevel.Informational)] + public void WriteInformational(string message) => this.WriteEvent(4, message); + + [Event(5, Message = "{0}", Level = EventLevel.Verbose)] + public void WriteVerbose(string message) => this.WriteEvent(5, message); + + private static string GetMessage(object value) + { + return value is Exception exception ? exception.ToInvariantString() : value.ToString(); + } } } diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTransmitter.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTransmitter.cs index 6487ae71d2b6..89eacf56812f 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTransmitter.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTransmitter.cs @@ -55,8 +55,8 @@ public async ValueTask TrackAsync(IEnumerable telemetryItems { // TODO: Network issue. Send Telemetry Items To Storage } - // TODO: Log the exception to new event source. If we get a common logger we could just log exception to it. - AzureMonitorTraceExporterEventSource.Log.FailedExport(ex); + + AzureMonitorTraceExporterEventSource.Log.Write($"FailedToSend{EventLevelSuffix.Error}", ex.LogAsyncException()); } return itemsAccepted; diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ConnectionString/ConnectionStringParser.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ConnectionString/ConnectionStringParser.cs index 3142652d43f7..5f5b6ae26e4f 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ConnectionString/ConnectionStringParser.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ConnectionString/ConnectionStringParser.cs @@ -37,7 +37,7 @@ public static void GetValues(string connectionString, out string instrumentation } catch (Exception ex) { - AzureMonitorTraceExporterEventSource.Log.ConnectionStringError(ex); + AzureMonitorTraceExporterEventSource.Log.Write($"ConnectionStringError{EventLevelSuffix.Error}", ex); throw new InvalidOperationException("Connection String Error: " + ex.Message, ex); } } diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/EventLevelSuffix.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/EventLevelSuffix.cs new file mode 100644 index 000000000000..abf1a1e9a2db --- /dev/null +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/EventLevelSuffix.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace OpenTelemetry.Exporter.AzureMonitor +{ + internal class EventLevelSuffix + { + public const string Critical = ".Critical"; + public const string Error = ".Error"; + public const string Warning = ".Warning"; + public const string Informational = ".Informational"; + public const string Verbose = ".Verbose"; + } +} diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ExceptionExtensions.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ExceptionExtensions.cs index 3737ba92f13c..987749951de3 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ExceptionExtensions.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/ExceptionExtensions.cs @@ -23,5 +23,10 @@ internal static string ToInvariantString(this Exception exception) Thread.CurrentThread.CurrentUICulture = originalUICulture; } } + + internal static Exception LogAsyncException(this Exception exception) + { + return exception is AggregateException aggregateException ? aggregateException.InnerException : exception; + } } } diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/SdkVersionUtils.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/SdkVersionUtils.cs index 597b9a9bcb9d..a35c3946c1ea 100644 --- a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/SdkVersionUtils.cs +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/SdkVersionUtils.cs @@ -24,7 +24,7 @@ private static string GetSdkVersion() } catch (Exception ex) { - AzureMonitorTraceExporterEventSource.Log.SdkVersionCreateFailed(ex); + AzureMonitorTraceExporterEventSource.Log.Write($"SdkVersionCreateFailed{EventLevelSuffix.Warning}", ex); return null; } } diff --git a/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/StringExtensions.cs b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/StringExtensions.cs new file mode 100644 index 000000000000..358daafd0f83 --- /dev/null +++ b/sdk/monitor/OpenTelemetry.Exporter.AzureMonitor/src/StringExtensions.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; + +namespace OpenTelemetry.Exporter.AzureMonitor +{ + internal static class StringExtensions + { + public static string Trim(this string message, int lastIndex) + { + return message.Substring(0, lastIndex); + } + } +}