Skip to content

Commit 7b97ef7

Browse files
author
Timothy Mothra
authored
extra logging for PartialSuccess (Azure#37915)
1 parent 8420a50 commit 7b97ef7

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/Diagnostics/AzureMonitorExporterEventSource.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Diagnostics.Tracing;
66
using System.Runtime.CompilerServices;
77
using Azure.Monitor.OpenTelemetry.Exporter.Internals.ConnectionString;
8+
using Azure.Monitor.OpenTelemetry.Exporter.Models;
89

910
namespace Azure.Monitor.OpenTelemetry.Exporter.Internals.Diagnostics
1011
{
@@ -355,5 +356,32 @@ public void FailedToDeserializeIngestionResponse(Exception ex)
355356

356357
[Event(36, Message = "Version string exceeds expected length. This is only for internal telemetry and can safely be ignored. Type Name: {0}. Version: {1}", Level = EventLevel.Verbose)]
357358
public void VersionStringUnexpectedLength(string typeName, string value) => WriteEvent(36, typeName, value);
359+
360+
[Event(37, Message = "Failed to delete telemetry from storage. This may result in duplicate telemetry if the file is processed again. Not user actionable.", Level = EventLevel.Warning)]
361+
public void DeletedFailed() => WriteEvent(37);
362+
363+
[NonEvent]
364+
public void PartialContentResponseInvalid(int totalTelemetryItems, TelemetryErrorDetails error)
365+
{
366+
if (IsEnabled(EventLevel.Warning))
367+
{
368+
PartialContentResponseInvalid(totalTelemetryItems, error.Index?.ToString() ?? "N/A", error.StatusCode?.ToString() ?? "N/A", error.Message);
369+
}
370+
}
371+
372+
[Event(38, Message = "Received a partial success from ingestion that does not match telemetry that was sent. Total telemetry items sent: {0}. Error Index: {1}. Error StatusCode: {2}. Error Message: {3}", Level = EventLevel.Warning)]
373+
public void PartialContentResponseInvalid(int totalTelemetryItems, string errorIndex, string errorStatusCode, string errorMessage) => WriteEvent(38, totalTelemetryItems, errorIndex, errorStatusCode, errorMessage);
374+
375+
[NonEvent]
376+
public void PartialContentResponseUnhandled(TelemetryErrorDetails error)
377+
{
378+
if (IsEnabled(EventLevel.Warning))
379+
{
380+
PartialContentResponseUnhandled(error.StatusCode?.ToString() ?? "N/A", error.Message);
381+
}
382+
}
383+
384+
[Event(39, Message = "Received a partial success from ingestion. This status code is not handled and telemetry will be lost. Error StatusCode: {0}. Error Message: {1}", Level = EventLevel.Warning)]
385+
public void PartialContentResponseUnhandled(string errorStatusCode, string errorMessage) => WriteEvent(39, errorStatusCode, errorMessage);
358386
}
359387
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/HttpPipelineHelper.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ internal static bool TryGetRequestContent(RequestContent? content, [NotNullWhen(
113113
return true;
114114
}
115115

116+
/// <summary>
117+
/// Parse a PartialSuccess response from ingestion.
118+
/// </summary>
119+
/// <param name="trackResponse"><see cref="TrackResponse"/> is the parsed response from ingestion.</param>
120+
/// <param name="content"><see cref="RequestContent"/> that was sent to ingestion.</param>
121+
/// <returns>Telemetry that will be tried.</returns>
116122
internal static byte[]? GetPartialContentForRetry(TrackResponse trackResponse, RequestContent? content)
117123
{
118124
if (content == null)
@@ -123,14 +129,16 @@ internal static bool TryGetRequestContent(RequestContent? content, [NotNullWhen(
123129
string? partialContent = null;
124130
if (TryGetRequestContent(content, out var requestContent))
125131
{
126-
var fullContent = Encoding.UTF8.GetString(requestContent).Split('\n');
132+
var telemetryItems = Encoding.UTF8.GetString(requestContent).Split('\n');
127133
foreach (var error in trackResponse.Errors)
128134
{
129135
if (error != null && error.Index != null)
130136
{
131-
if (error.Index >= fullContent.Length || error.Index < 0)
137+
int errorIndex = (int)error.Index;
138+
139+
if (errorIndex >= telemetryItems.Length || errorIndex < 0)
132140
{
133-
// TODO: log
141+
AzureMonitorExporterEventSource.Log.PartialContentResponseInvalid(telemetryItems.Length, error);
134142
continue;
135143
}
136144

@@ -142,13 +150,17 @@ internal static bool TryGetRequestContent(RequestContent? content, [NotNullWhen(
142150
{
143151
if (string.IsNullOrEmpty(partialContent))
144152
{
145-
partialContent = fullContent[(int)error.Index];
153+
partialContent = telemetryItems[errorIndex];
146154
}
147155
else
148156
{
149-
partialContent += '\n' + fullContent[(int)error.Index];
157+
partialContent += '\n' + telemetryItems[errorIndex];
150158
}
151159
}
160+
else
161+
{
162+
AzureMonitorExporterEventSource.Log.PartialContentResponseUnhandled(error);
163+
}
152164
}
153165
}
154166
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/TransmitFromStorageHandler.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,11 @@ internal void TransmitFromStorage(object? sender, ElapsedEventArgs? e)
6161

6262
// In case if the delete fails, there is a possibility
6363
// that the current batch will be transmitted more than once resulting in duplicates.
64-
// TODO: TryDelete returns a boolean, should we log when this occurs?
65-
blob.TryDelete();
64+
var deleteSucceeded = blob.TryDelete();
65+
if (!deleteSucceeded)
66+
{
67+
AzureMonitorExporterEventSource.Log.DeletedFailed();
68+
}
6669
}
6770
else
6871
{

0 commit comments

Comments
 (0)