Adapt dynamic question difficulty to learner Elo
This commit is contained in:
@@ -13,6 +13,10 @@ public sealed class ServiceMetrics
|
||||
private long _httpRequests;
|
||||
private long _httpDurationMicroseconds;
|
||||
private long _answerStatisticsBackfillComplete;
|
||||
private readonly System.Collections.Concurrent.ConcurrentDictionary<string, long> _dynamicSelections = new();
|
||||
private readonly System.Collections.Concurrent.ConcurrentDictionary<string, long> _dynamicAttempts = new();
|
||||
private readonly System.Collections.Concurrent.ConcurrentDictionary<string, long> _dynamicCorrect = new();
|
||||
private long _dynamicTargetGapTotal;
|
||||
|
||||
public void AttemptCreated() => Interlocked.Increment(ref _attemptsCreated);
|
||||
public void AttemptDuplicate() => Interlocked.Increment(ref _attemptDuplicates);
|
||||
@@ -29,6 +33,16 @@ public sealed class ServiceMetrics
|
||||
Interlocked.Increment(ref _httpRequests);
|
||||
Interlocked.Add(ref _httpDurationMicroseconds, (long)(duration.TotalMilliseconds * 1000));
|
||||
}
|
||||
public void DynamicSelected(string tier, int targetGap)
|
||||
{
|
||||
_dynamicSelections.AddOrUpdate(tier, 1, (_, value) => value + 1);
|
||||
Interlocked.Add(ref _dynamicTargetGapTotal, Math.Abs(targetGap));
|
||||
}
|
||||
public void DynamicAttempt(string tier, bool correct)
|
||||
{
|
||||
_dynamicAttempts.AddOrUpdate(tier, 1, (_, value) => value + 1);
|
||||
if (correct) _dynamicCorrect.AddOrUpdate(tier, 1, (_, value) => value + 1);
|
||||
}
|
||||
|
||||
public string RenderPrometheus()
|
||||
{
|
||||
@@ -39,6 +53,16 @@ public sealed class ServiceMetrics
|
||||
AppendCounter(output, "step3_rating_failures_total", Interlocked.Read(ref _ratingFailures));
|
||||
AppendCounter(output, "step3_answer_reconciliations_total", Interlocked.Read(ref _reconciliations));
|
||||
AppendCounter(output, "step3_http_requests_total", Interlocked.Read(ref _httpRequests));
|
||||
output.AppendLine("# TYPE step3_dynamic_selections_total counter");
|
||||
output.AppendLine("# TYPE step3_dynamic_attempts_total counter");
|
||||
output.AppendLine("# TYPE step3_dynamic_correct_total counter");
|
||||
foreach (var tier in _dynamicSelections.Keys.Order())
|
||||
{
|
||||
AppendLabeledSample(output, "step3_dynamic_selections_total", tier, _dynamicSelections.GetValueOrDefault(tier));
|
||||
AppendLabeledSample(output, "step3_dynamic_attempts_total", tier, _dynamicAttempts.GetValueOrDefault(tier));
|
||||
AppendLabeledSample(output, "step3_dynamic_correct_total", tier, _dynamicCorrect.GetValueOrDefault(tier));
|
||||
}
|
||||
AppendCounter(output, "step3_dynamic_target_gap_points_total", Interlocked.Read(ref _dynamicTargetGapTotal));
|
||||
output.AppendLine("# TYPE step3_http_request_duration_seconds summary");
|
||||
output.Append("step3_http_request_duration_seconds_count ")
|
||||
.Append(Interlocked.Read(ref _httpRequests))
|
||||
@@ -62,4 +86,9 @@ public sealed class ServiceMetrics
|
||||
output.Append("# TYPE ").Append(name).AppendLine(" counter");
|
||||
output.Append(name).Append(' ').Append(value).AppendLine();
|
||||
}
|
||||
|
||||
private static void AppendLabeledSample(StringBuilder output, string name, string tier, long value)
|
||||
{
|
||||
output.Append(name).Append("{tier=\"").Append(tier.Replace("\"", "")).Append("\"} ").Append(value).AppendLine();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user