diff --git a/csharp/arrow-adbc b/csharp/arrow-adbc index e9e5c5c..778f780 160000 --- a/csharp/arrow-adbc +++ b/csharp/arrow-adbc @@ -1 +1 @@ -Subproject commit e9e5c5c5d0ef248fc8cdfdd041e062a9d1df0e6f +Subproject commit 778f7801dbaaeb57e5498f396eb649656b2908bc diff --git a/csharp/src/Hive2/HiveServer2Statement.cs b/csharp/src/Hive2/HiveServer2Statement.cs index 2e5e2ca..ef2eda6 100644 --- a/csharp/src/Hive2/HiveServer2Statement.cs +++ b/csharp/src/Hive2/HiveServer2Statement.cs @@ -327,6 +327,9 @@ public override void SetOption(string key, string value) this.EscapePatternWildcards = escapePatternWildcards; } break; + case AdbcOptions.Telemetry.TraceParent: + SetTraceParent(string.IsNullOrWhiteSpace(value) ? null : value); + break; default: throw AdbcException.NotImplemented($"Option '{key}' is not implemented."); } diff --git a/csharp/test/Common/StatementTests.cs b/csharp/test/Common/StatementTests.cs index 767f401..c52ca3d 100644 --- a/csharp/test/Common/StatementTests.cs +++ b/csharp/test/Common/StatementTests.cs @@ -28,6 +28,7 @@ using Apache.Arrow.Adbc; using Apache.Arrow.Adbc.Tests; using Apache.Arrow.Adbc.Tests.Xunit; +using Apache.Arrow.Adbc.Tracing; using Apache.Arrow.Types; using Xunit; using Xunit.Abstractions; @@ -340,6 +341,48 @@ public async Task CanGetColumns() Assert.Equal(TestConfiguration.Metadata.ExpectedColumnCount, actualBatchLength); } + [SkippableFact] + public void CanSetOptionTraceParent() + { + const string traceId0 = "11111111111111111111111111111111"; + const string spanId0 = "2222222222222222"; + const string statementTraceParent = $"00-{traceId0}-{spanId0}-01"; + const string traceId1 = "33333333333333333333333333333333"; + const string spanId1 = "4444444444444444"; + const string connectionTraceParent = $"00-{traceId1}-{spanId1}-01"; + + var testConfiguration = TestConfiguration.Clone() as TConfig; + using AdbcConnection connection = NewConnection(testConfiguration); + using var statement = connection.CreateStatement(); + + IActivityTracer tracingConnection = (IActivityTracer)connection; + IActivityTracer tracingStatement = (IActivityTracer)statement; + + // Initial state with TraceParent not set + Assert.Null(tracingConnection.TraceParent); + Assert.Null(tracingStatement.TraceParent); + + // Set TraceParent on the statement only + statement.SetOption(AdbcOptions.Telemetry.TraceParent, statementTraceParent); + Assert.Equal(statementTraceParent, tracingStatement.TraceParent); + Assert.Null(tracingConnection.TraceParent); + + // Set TraceParent on the connection, in addition to the statement + connection.SetOption(AdbcOptions.Telemetry.TraceParent, connectionTraceParent); + Assert.Equal(statementTraceParent, tracingStatement.TraceParent); + Assert.Equal(connectionTraceParent, tracingConnection.TraceParent); + + // Clear TraceParent on the statement, connection value should remain + statement.SetOption(AdbcOptions.Telemetry.TraceParent, string.Empty); + Assert.Equal(connectionTraceParent, tracingStatement.TraceParent); + Assert.Equal(connectionTraceParent, tracingConnection.TraceParent); + + // Clear TraceParent on the connection, statement value should remain cleared + connection.SetOption(AdbcOptions.Telemetry.TraceParent, string.Empty); + Assert.Null(tracingConnection.TraceParent); + Assert.Null(tracingStatement.TraceParent); + } + /// /// Validates if the driver can execute GetPrimaryKeys metadata command. ///