diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCommonExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCommonExtensions.cs index 4185969a483..f90a95401c5 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCommonExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCommonExtensions.cs @@ -75,7 +75,9 @@ private static OtlpCommon.AnyValue ToOtlpValue(object value) default: try { - return new OtlpCommon.AnyValue { StringValue = value.ToString() }; + return value != null + ? new OtlpCommon.AnyValue { StringValue = value.ToString() } + : null; } catch { @@ -105,7 +107,7 @@ private static OtlpCommon.AnyValue ToOtlpArrayValue(Array array) case double[]: foreach (var item in array) { - arrayValue.Values.Add(ToOtlpValue(item)); + arrayValue.Values.Add(ToOtlpValue(item) ?? new OtlpCommon.AnyValue { }); } return new OtlpCommon.AnyValue { ArrayValue = arrayValue }; @@ -114,7 +116,10 @@ private static OtlpCommon.AnyValue ToOtlpArrayValue(Array array) { try { - arrayValue.Values.Add(ToOtlpValue(item.ToString())); + var value = item != null + ? ToOtlpValue(item.ToString()) + : new OtlpCommon.AnyValue { }; + arrayValue.Values.Add(value); } catch { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs index dac7054690d..60652ec0957 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs @@ -163,19 +163,32 @@ public void StringTypesSupported(object value) public void StringArrayTypesSupported() { var charArray = new char[] { 'a', 'b', 'c' }; - var stringArray = new string[] { "a", "b", "c" }; + var stringArray = new string[] { "a", "b", "c", string.Empty, null }; var kvp = new KeyValuePair("key", charArray); var attribute = kvp.ToOtlpAttribute(); Assert.NotNull(attribute); Assert.Equal(OtlpCommon.AnyValue.ValueOneofCase.ArrayValue, attribute.Value.ValueCase); - Assert.Equal(stringArray, attribute.Value.ArrayValue.Values.Select(x => x.StringValue)); + Assert.Equal(charArray.Select(x => x.ToString()), attribute.Value.ArrayValue.Values.Select(x => x.StringValue)); kvp = new KeyValuePair("key", stringArray); attribute = kvp.ToOtlpAttribute(); Assert.NotNull(attribute); Assert.Equal(OtlpCommon.AnyValue.ValueOneofCase.ArrayValue, attribute.Value.ValueCase); - Assert.Equal(stringArray, attribute.Value.ArrayValue.Values.Select(x => x.StringValue)); + + for (var i = 0; i < stringArray.Length; ++i) + { + var expectedValue = stringArray[i]; + var expectedValueCase = expectedValue != null + ? OtlpCommon.AnyValue.ValueOneofCase.StringValue + : OtlpCommon.AnyValue.ValueOneofCase.None; + + Assert.Equal(expectedValueCase, attribute.Value.ArrayValue.Values[i].ValueCase); + if (expectedValueCase != OtlpCommon.AnyValue.ValueOneofCase.None) + { + Assert.Equal(expectedValue, attribute.Value.ArrayValue.Values[i].StringValue); + } + } } [Fact] @@ -194,7 +207,7 @@ public void ToStringIsCalledForAllOtherTypes() new nint[] { 1, 2, 3 }, new nuint[] { 1, 2, 3 }, new decimal[] { 1, 2, 3 }, - new object[] { 1, new object(), false }, + new object[] { 1, new object(), false, null }, }; foreach (var value in testValues) @@ -216,8 +229,16 @@ public void ToStringIsCalledForAllOtherTypes() var array = value as Array; for (var i = 0; i < attribute.Value.ArrayValue.Values.Count; ++i) { - Assert.Equal(OtlpCommon.AnyValue.ValueOneofCase.StringValue, attribute.Value.ArrayValue.Values[i].ValueCase); - Assert.Equal(array.GetValue(i).ToString(), attribute.Value.ArrayValue.Values[i].StringValue); + var expectedValue = array.GetValue(i)?.ToString(); + var expectedValueCase = expectedValue != null + ? OtlpCommon.AnyValue.ValueOneofCase.StringValue + : OtlpCommon.AnyValue.ValueOneofCase.None; + + Assert.Equal(expectedValueCase, attribute.Value.ArrayValue.Values[i].ValueCase); + if (expectedValueCase != OtlpCommon.AnyValue.ValueOneofCase.None) + { + Assert.Equal(array.GetValue(i).ToString(), attribute.Value.ArrayValue.Values[i].StringValue); + } } } }