From f6cb49dfe969b6b03a6f0b9086152358ffd02276 Mon Sep 17 00:00:00 2001 From: Matt McCarthy Date: Mon, 6 Jul 2026 09:47:37 -0500 Subject: [PATCH] fix: Change trackDuration argument from float to double (AIC-2727) --- .../src/Interfaces/ILdAiConfigTracker.cs | 2 +- pkgs/sdk/server-ai/src/LdAiConfigTracker.cs | 10 ++++----- .../server-ai/test/LdAiConfigTrackerTest.cs | 22 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pkgs/sdk/server-ai/src/Interfaces/ILdAiConfigTracker.cs b/pkgs/sdk/server-ai/src/Interfaces/ILdAiConfigTracker.cs index 5109e01b..8860fbd6 100644 --- a/pkgs/sdk/server-ai/src/Interfaces/ILdAiConfigTracker.cs +++ b/pkgs/sdk/server-ai/src/Interfaces/ILdAiConfigTracker.cs @@ -37,7 +37,7 @@ public interface ILdAiConfigTracker /// /// Records at most once per Tracker; further calls are ignored. /// the duration in milliseconds - public void TrackDuration(float durationMs); + public void TrackDuration(double durationMs); /// /// Wraps a callable operation, measures its wall-clock duration, and records the result via diff --git a/pkgs/sdk/server-ai/src/LdAiConfigTracker.cs b/pkgs/sdk/server-ai/src/LdAiConfigTracker.cs index 3b34a9b4..23f704b7 100644 --- a/pkgs/sdk/server-ai/src/LdAiConfigTracker.cs +++ b/pkgs/sdk/server-ai/src/LdAiConfigTracker.cs @@ -160,7 +160,7 @@ public MetricSummary Summary } /// - public void TrackDuration(float durationMs) + public void TrackDuration(double durationMs) { if (Interlocked.CompareExchange(ref _durationMs, new StrongBox(durationMs), null) != null) @@ -183,7 +183,7 @@ public async Task TrackDurationOf(Func> operation) finally { sw.Stop(); - TrackDuration((float)sw.Elapsed.TotalMilliseconds); + TrackDuration(sw.Elapsed.TotalMilliseconds); } } @@ -273,7 +273,7 @@ public async Task TrackMetricsOf(Func metricsExtractor, Func catch (Exception) { sw.Stop(); - TrackDuration((float)sw.Elapsed.TotalMilliseconds); + TrackDuration(sw.Elapsed.TotalMilliseconds); TrackError(); throw; } @@ -291,12 +291,12 @@ public async Task TrackMetricsOf(Func metricsExtractor, Func } catch (Exception) { - TrackDuration((float)operationElapsedMs); + TrackDuration(operationElapsedMs); throw; } // Honor an explicit duration override from the caller; fall back to the measured value. - TrackDuration((float)(metrics.DurationMs ?? operationElapsedMs)); + TrackDuration(metrics.DurationMs ?? operationElapsedMs); if (metrics.Success) { diff --git a/pkgs/sdk/server-ai/test/LdAiConfigTrackerTest.cs b/pkgs/sdk/server-ai/test/LdAiConfigTrackerTest.cs index 10897c7e..55975537 100644 --- a/pkgs/sdk/server-ai/test/LdAiConfigTrackerTest.cs +++ b/pkgs/sdk/server-ai/test/LdAiConfigTrackerTest.cs @@ -113,7 +113,7 @@ public void TrackDataIncludesRunId() var tracker = config.CreateTracker(); - tracker.TrackDuration(1.0f); + tracker.TrackDuration(1.0); mockClient.Verify(x => x.Track("$ld:ai:duration:total", context, It.Is(d => d.Get("runId").Type == LdValueType.String && @@ -130,7 +130,7 @@ public void CanTrackDuration() var config = BuildConfig(mockClient.Object, flagKey, context); var tracker = config.CreateTracker(); - tracker.TrackDuration(1.0f); + tracker.TrackDuration(1.0); mockClient.Verify(x => x.Track("$ld:ai:duration:total", context, It.Is(d => MatchesTrackData(d, flagKey, config)), 1.0f), Times.Once); } @@ -368,8 +368,8 @@ public void DuplicateTrackDurationIsIgnored() var tracker = config.CreateTracker(); - tracker.TrackDuration(1.0f); - tracker.TrackDuration(2.0f); + tracker.TrackDuration(1.0); + tracker.TrackDuration(2.0); mockClient.Verify(x => x.Track("$ld:ai:duration:total", context, It.IsAny(), It.IsAny()), Times.Once); @@ -583,8 +583,8 @@ public void ConfigCreateTrackerReturnsNewTrackerWithFreshRunId() var tracker1 = config.CreateTracker(); var tracker2 = config.CreateTracker(); - tracker1.TrackDuration(10.0f); - tracker2.TrackDuration(20.0f); + tracker1.TrackDuration(10.0); + tracker2.TrackDuration(20.0); string runId1 = null; string runId2 = null; @@ -615,11 +615,11 @@ public void ConfigCreateTrackerReturnsTrackerWithIndependentTrackingState() // Track duration on the first tracker (exhausts at-most-once) var tracker1 = config.CreateTracker(); - tracker1.TrackDuration(1.0f); + tracker1.TrackDuration(1.0); // A second tracker has fresh tracking state var tracker2 = config.CreateTracker(); - tracker2.TrackDuration(2.0f); + tracker2.TrackDuration(2.0); // Both calls should have gone through mockClient.Verify(x => x.Track("$ld:ai:duration:total", context, @@ -868,7 +868,7 @@ public void SummaryReflectsTrackedMetrics() Assert.Null(summary.TimeToFirstTokenMs); // Track some metrics - tracker.TrackDuration(100.5f); + tracker.TrackDuration(100.5); tracker.TrackTimeToFirstToken(10.2f); tracker.TrackFeedback(Feedback.Positive); tracker.TrackSuccess(); @@ -978,8 +978,8 @@ public void TrackDurationIsAtMostOnceUnderConcurrency() var tracker = config.CreateTracker(); var barrier = new Barrier(2); - var t1 = Task.Run(() => { barrier.SignalAndWait(); tracker.TrackDuration(123.0f); }); - var t2 = Task.Run(() => { barrier.SignalAndWait(); tracker.TrackDuration(123.0f); }); + var t1 = Task.Run(() => { barrier.SignalAndWait(); tracker.TrackDuration(123.0); }); + var t2 = Task.Run(() => { barrier.SignalAndWait(); tracker.TrackDuration(123.0); }); Task.WaitAll(t1, t2); var calls = mockClient.Invocations.Count(inv =>