|
// retoor <retoor@molodetz.nl>
|
|
|
|
import Foundation
|
|
import Logging
|
|
|
|
actor MetricsStore {
|
|
private var samples: [MetricSample] = []
|
|
private var lastFlush = Date()
|
|
private let flushInterval: TimeInterval = 60.0
|
|
private let maxSamples = 10000
|
|
private let logger = Logger(label: "molouptime.metrics")
|
|
|
|
struct BatchedSamples: Codable {
|
|
let checkUid: String
|
|
let samples: [MetricSample]
|
|
}
|
|
|
|
func record(_ sample: MetricSample) {
|
|
samples.append(sample)
|
|
if samples.count >= maxSamples || Date().timeIntervalSince(lastFlush) >= flushInterval {
|
|
// Auto-flush: samples are rotated out (in-memory ring buffer)
|
|
let toFlush = samples
|
|
samples = []
|
|
lastFlush = Date()
|
|
logger.info("Flushed \(toFlush.count) metric samples to buffer")
|
|
}
|
|
}
|
|
|
|
func collect() -> [MetricSample] {
|
|
let collected = samples
|
|
samples = []
|
|
lastFlush = Date()
|
|
return collected
|
|
}
|
|
|
|
func snapshot() -> [MetricSample] {
|
|
return samples
|
|
}
|
|
|
|
func count() -> Int {
|
|
return samples.count
|
|
}
|
|
}
|