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 =>