Skip to content

Commit 9a916fe

Browse files
Azure Monitor Exporter - In debug mode write EventSource and Telemetry information to output window (Azure#16900)
* Log to output window * debug directive correction. * Rename eventsource * Remove #if directive * PR feedback - rename * PR feedback
1 parent 18699f5 commit 9a916fe

File tree

10 files changed

+91
-8
lines changed

10 files changed

+91
-8
lines changed

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## 1.0.0-beta.2 (Unreleased)
44

55
* [Set Remote Dependency Telemetry semantics](https://github.com/Azure/azure-sdk-for-net/issues/17026)
6+
* [Supports sending EventSource and Telemetry output to the debug trace](https://github.com/Azure/azure-sdk-for-net/issues/16893)
67

78
## 1.0.0-beta.1 (2020-11-06)
89

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/ApplicationInsightsRestClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ internal HttpMessage CreateTrackRequest(IEnumerable<TelemetryItem> body)
6565
content.WriteNewLine();
6666
}
6767
request.Content = RequestContent.Create(content.ToBytes());
68+
TelemetryDebugWriter.WriteTelemetry(content);
6869
return message;
6970
}
7071

@@ -82,6 +83,7 @@ internal HttpMessage CreateTrackRequest(ReadOnlyMemory<byte> body)
8283
request.Headers.Add("Accept", "application/json");
8384
using var content = new NDJsonWriter();
8485
request.Content = RequestContent.Create(body);
86+
TelemetryDebugWriter.WriteTelemetry(content);
8587
return message;
8688
}
8789
}

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporterEventSource.cs renamed to sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorExporterEventSource.cs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics.Tracing;
7+
using Azure.Core.Shared;
78

89
namespace Microsoft.OpenTelemetry.Exporter.AzureMonitor
910
{
1011
[EventSource(Name = EventSourceName)]
11-
internal sealed class AzureMonitorTraceExporterEventSource : EventSource
12+
internal sealed class AzureMonitorExporterEventSource : EventSource
1213
{
13-
private const string EventSourceName = "OpenTelemetry-TraceExporter-AzureMonitor";
14-
public static AzureMonitorTraceExporterEventSource Log = new AzureMonitorTraceExporterEventSource();
14+
private const string EventSourceName = "Microsoft-OpenTelemetry-Exporter-AzureMonitor";
15+
public static AzureMonitorExporterEventSource Log = new AzureMonitorExporterEventSource();
16+
public static AzureMonitorExporterEventListener Listener = new AzureMonitorExporterEventListener();
17+
1518
public readonly IReadOnlyDictionary<string, EventLevel> EventLevelMap = new Dictionary<string, EventLevel>
1619
{
1720
[EventLevelSuffix.Critical] = EventLevel.Critical,
@@ -71,5 +74,38 @@ private static string GetMessage(object value)
7174
{
7275
return value is Exception exception ? exception.ToInvariantString() : value.ToString();
7376
}
77+
78+
public class AzureMonitorExporterEventListener : EventListener
79+
{
80+
private readonly List<EventSource> eventSources = new List<EventSource>();
81+
82+
public override void Dispose()
83+
{
84+
foreach (EventSource eventSource in this.eventSources)
85+
{
86+
this.DisableEvents(eventSource);
87+
}
88+
89+
base.Dispose();
90+
GC.SuppressFinalize(this);
91+
}
92+
93+
protected override void OnEventSourceCreated(EventSource eventSource)
94+
{
95+
if (eventSource?.Name == EventSourceName)
96+
{
97+
this.eventSources.Add(eventSource);
98+
this.EnableEvents(eventSource, EventLevel.Verbose, (EventKeywords)(-1));
99+
}
100+
101+
base.OnEventSourceCreated(eventSource);
102+
}
103+
104+
protected override void OnEventWritten(EventWrittenEventArgs eventData)
105+
{
106+
string message = EventSourceEventFormatting.Format(eventData);
107+
TelemetryDebugWriter.WriteMessage($"{eventData.EventSource.Name} - EventId: [{eventData.EventId}], EventName: [{eventData.EventName}], Message: [{message}]");
108+
}
109+
}
74110
}
75111
}

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTraceExporter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public override ExportResult Export(in Batch<Activity> batch)
4747
}
4848
catch (Exception ex)
4949
{
50-
AzureMonitorTraceExporterEventSource.Log.Write($"FailedToExport{EventLevelSuffix.Error}", ex.LogAsyncException());
50+
AzureMonitorExporterEventSource.Log.Write($"FailedToExport{EventLevelSuffix.Error}", ex.LogAsyncException());
5151
return ExportResult.Failure;
5252
}
5353
}

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/AzureMonitorTransmitter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async ValueTask<int> TrackAsync(IEnumerable<TelemetryItem> telemetryItems
5757
// TODO: Network issue. Send Telemetry Items To Storage
5858
}
5959

60-
AzureMonitorTraceExporterEventSource.Log.Write($"FailedToSend{EventLevelSuffix.Error}", ex.LogAsyncException());
60+
AzureMonitorExporterEventSource.Log.Write($"FailedToSend{EventLevelSuffix.Error}", ex.LogAsyncException());
6161
}
6262

6363
return itemsAccepted;

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/ConnectionString/ConnectionStringParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static void GetValues(string connectionString, out string instrumentation
4040
}
4141
catch (Exception ex)
4242
{
43-
AzureMonitorTraceExporterEventSource.Log.Write($"ConnectionStringError{EventLevelSuffix.Error}", ex);
43+
AzureMonitorExporterEventSource.Log.Write($"ConnectionStringError{EventLevelSuffix.Error}", ex);
4444
throw new InvalidOperationException("Connection String Error: " + ex.Message, ex);
4545
}
4646
}

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/Microsoft.OpenTelemetry.Exporter.AzureMonitor.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<Description>An OpenTelemetry .NET exporter that exports to Azure Monitor</Description>
44
<AssemblyTitle>AzureMonitor OpenTelemetry Exporter</AssemblyTitle>
@@ -23,6 +23,7 @@
2323
<Compile Include="$(AzureCoreSharedSources)HttpMessageSanitizer.cs" Link="Shared\%(RecursiveDir)\%(Filename)%(Extension)" />
2424
<Compile Include="$(AzureCoreSharedSources)TaskExtensions.cs" Link="Shared\%(RecursiveDir)\%(Filename)%(Extension)" />
2525
<Compile Include="$(AzureCoreSharedSources)OperationHelpers.cs" Link="Shared\%(RecursiveDir)\%(Filename)%(Extension)" />
26+
<Compile Include="$(AzureCoreSharedSources)EventSourceEventFormatting.cs" Link="Shared\%(RecursiveDir)\%(Filename)%(Extension)" />
2627
</ItemGroup>
2728

2829
<Import Project="$(MSBuildThisFileDirectory)..\..\..\core\Azure.Core\src\Azure.Core.props" />

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/NDJsonWriter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ public Memory<byte> ToBytes()
3333
return Stream.ToArray();
3434
}
3535

36+
public override string ToString()
37+
{
38+
Stream.Position = 0;
39+
using var streamReader = new StreamReader(Stream);
40+
return streamReader.ReadToEnd();
41+
}
42+
3643
public void Dispose()
3744
{
3845
Stream?.Dispose();

sdk/monitor/Microsoft.OpenTelemetry.Exporter.AzureMonitor/src/SdkVersionUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private static string GetSdkVersion()
2626
}
2727
catch (Exception ex)
2828
{
29-
AzureMonitorTraceExporterEventSource.Log.Write($"SdkVersionCreateFailed{EventLevelSuffix.Warning}", ex);
29+
AzureMonitorExporterEventSource.Log.Write($"SdkVersionCreateFailed{EventLevelSuffix.Warning}", ex);
3030
return null;
3131
}
3232
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System.Diagnostics;
5+
6+
namespace Microsoft.OpenTelemetry.Exporter.AzureMonitor
7+
{
8+
internal class TelemetryDebugWriter
9+
{
10+
internal static void WriteMessage(string message)
11+
{
12+
if (message == null)
13+
{
14+
return;
15+
}
16+
17+
if (Debugger.IsAttached && Debugger.IsLogging())
18+
{
19+
Debugger.Log(0, null, message);
20+
}
21+
}
22+
23+
internal static void WriteTelemetry(NDJsonWriter content)
24+
{
25+
if (content == null)
26+
{
27+
return;
28+
}
29+
30+
if (Debugger.IsAttached && Debugger.IsLogging())
31+
{
32+
Debugger.Log(0, null, content.ToString());
33+
}
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)