From ec5f94ff57bc6e0e08275650823f0aa29ba15cc2 Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai Date: Fri, 3 Jun 2022 14:21:06 -0700 Subject: [PATCH] [Exporter.Geneva] Add support for ILogger scopes (#390) * Add support for ILogger scopes --- .../CHANGELOG.md | 3 ++ .../GenevaLogExporter.cs | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md b/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md index b8b6312636..f4cbd6abbd 100644 --- a/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +* Add support for exporting `ILogger` scopes. +[390](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/390) + ## 1.3.0-beta.1 [2022-May-27] * Enable PassThru TableNameMappings using the logger category name. diff --git a/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs b/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs index 175421f70c..a22c7eb013 100644 --- a/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs +++ b/src/OpenTelemetry.Exporter.Geneva/GenevaLogExporter.cs @@ -418,6 +418,44 @@ internal int SerializeLogRecord(LogRecord logRecord) cntFields += 1; } + ushort scopeDepth = 0; + int indexArrayLength = 0; + logRecord.ForEachScope(ProcessScope, (object)null); + void ProcessScope(LogRecordScope scope, object state) + { + if (++scopeDepth == 1) + { + cursor = MessagePackSerializer.SerializeAsciiString(buffer, cursor, "scopes"); + cursor = MessagePackSerializer.WriteArrayHeader(buffer, cursor, ushort.MaxValue); + indexArrayLength = cursor - 2; + } + + cursor = MessagePackSerializer.WriteMapHeader(buffer, cursor, ushort.MaxValue); + int indexMapSizeScope = cursor - 2; + ushort keysCount = 0; + + foreach (KeyValuePair scopeItem in scope) + { + string key = "scope"; + if (!string.IsNullOrEmpty(scopeItem.Key)) + { + key = scopeItem.Key; + } + + cursor = MessagePackSerializer.SerializeUnicodeString(buffer, cursor, key); + cursor = MessagePackSerializer.Serialize(buffer, cursor, scopeItem.Value); + keysCount++; + } + + MessagePackSerializer.WriteUInt16(buffer, indexMapSizeScope, keysCount); + } + + if (scopeDepth > 0) + { + MessagePackSerializer.WriteUInt16(buffer, indexArrayLength, scopeDepth); + cntFields += 1; + } + if (hasEnvProperties) { // Iteration #2 - Get all "other" fields and collapse them into single field