diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs index 8cd65c9df89a6..eff6a7ce087e2 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs @@ -1058,13 +1058,6 @@ internal static Activity Create(ActivitySource source, string name, ActivityKind } } - activity.IsAllDataRequested = request == ActivitySamplingResult.AllData || request == ActivitySamplingResult.AllDataAndRecorded; - - if (request == ActivitySamplingResult.AllDataAndRecorded) - { - activity.ActivityTraceFlags |= ActivityTraceFlags.Recorded; - } - if (parentId != null) { activity._parentId = parentId; @@ -1083,6 +1076,13 @@ internal static Activity Create(ActivitySource source, string name, ActivityKind activity._traceState = parentContext.TraceState; } + activity.IsAllDataRequested = request == ActivitySamplingResult.AllData || request == ActivitySamplingResult.AllDataAndRecorded; + + if (request == ActivitySamplingResult.AllDataAndRecorded) + { + activity.ActivityTraceFlags |= ActivityTraceFlags.Recorded; + } + if (startTime != default) { activity.StartTimeUtc = startTime.UtcDateTime; diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MeterListener.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MeterListener.cs index 96c956831a9eb..0202b119ad67f 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MeterListener.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MeterListener.cs @@ -196,35 +196,35 @@ internal static void NotifyForPublishedInstrument(Instrument instrument) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void NotifyMeasurement(Instrument instrument, T measurement, ReadOnlySpan> tags, object? state) + internal void NotifyMeasurement(Instrument instrument, T measurement, ReadOnlySpan> tags, object? state) where T : struct { - if (measurement is byte byteMeasurement) + if (typeof(T) == typeof(byte)) { - _byteMeasurementCallback(instrument, byteMeasurement, tags, state); + _byteMeasurementCallback(instrument, (byte)(object)measurement, tags, state); } - else if (measurement is short shortMeasurement) + if (typeof(T) == typeof(short)) { - _shortMeasurementCallback(instrument, shortMeasurement, tags, state); + _shortMeasurementCallback(instrument, (short)(object)measurement, tags, state); } - else if (measurement is int intMeasurement) + if (typeof(T) == typeof(int)) { - _intMeasurementCallback(instrument, intMeasurement, tags, state); + _intMeasurementCallback(instrument, (int)(object)measurement, tags, state); } - else if (measurement is long longMeasurement) + if (typeof(T) == typeof(long)) { - _longMeasurementCallback(instrument, longMeasurement, tags, state); + _longMeasurementCallback(instrument, (long)(object)measurement, tags, state); } - else if (measurement is float floatMeasurement) + if (typeof(T) == typeof(float)) { - _floatMeasurementCallback(instrument, floatMeasurement, tags, state); + _floatMeasurementCallback(instrument, (float)(object)measurement, tags, state); } - else if (measurement is double doubleMeasurement) + if (typeof(T) == typeof(double)) { - _doubleMeasurementCallback(instrument, doubleMeasurement, tags, state); + _doubleMeasurementCallback(instrument, (double)(object)measurement, tags, state); } - else if (measurement is decimal decimalMeasurement) + if (typeof(T) == typeof(decimal)) { - _decimalMeasurementCallback(instrument, decimalMeasurement, tags, state); + _decimalMeasurementCallback(instrument, (decimal)(object)measurement, tags, state); } } } diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivitySourceTests.cs b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivitySourceTests.cs index 76157abc44f60..0ae2bb1cbc25b 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivitySourceTests.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivitySourceTests.cs @@ -246,6 +246,37 @@ public void TestListeningToConstructedActivityEvents() }).Dispose(); } + [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] + public void EnsureRecordingTest() + { + RemoteExecutor.Invoke(() => { + Activity.ForceDefaultIdFormat = true; + Activity.DefaultIdFormat = ActivityIdFormat.W3C; + + ActivitySource aSource = new ActivitySource("EnsureRecordingTest"); + + ActivityListener listener = new ActivityListener + { + ShouldListenTo = (activitySource) => true, + Sample = (ref ActivityCreationOptions activityOptions) => + { + // Access activityOptions.TraceId to ensure generating the non-default value. + ActivityTraceId traceId = activityOptions.TraceId; + Assert.NotEqual(default(ActivityTraceId), traceId); + return ActivitySamplingResult.AllDataAndRecorded; + } + }; + + ActivitySource.AddActivityListener(listener); + + Activity a = aSource.StartActivity("RecordedActivity"); + Assert.NotNull(a); + + Assert.True(a.Recorded); + Assert.True((a.Context.TraceFlags & ActivityTraceFlags.Recorded) != 0); + }).Dispose(); + } + [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] public void TestExpectedListenersReturnValues() { @@ -947,7 +978,7 @@ public void TestActivityCreate() Assert.Null(a3.Parent); Assert.Equal("ParentId", a3.ParentId); - ActivityContext parentContext = new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None); + ActivityContext parentContext = new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded); using (Activity a4 = aSource.CreateActivity("a4", ActivityKind.Internal, parentContext, tags, links)) { Assert.NotNull(a4);