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