bucketSamples function
Averages samples into buckets equal time slots between from and
to. A slot without a sample is null, so a gap stays a gap.
Implementation
List<double?> bucketSamples(
final List<MetricSample> samples, {
required final DateTime from,
required final DateTime to,
required final int buckets,
}) {
final int span = to.difference(from).inMicroseconds;
if (buckets <= 0 || span <= 0) {
return const [];
}
final List<double> sums = List<double>.filled(buckets, 0);
final List<int> counts = List<int>.filled(buckets, 0);
for (final MetricSample sample in samples) {
final int offset = sample.timestamp.difference(from).inMicroseconds;
if (offset < 0 || offset > span) {
continue;
}
final int index = math.min(buckets - 1, offset * buckets ~/ span);
sums[index] += sample.value;
counts[index]++;
}
return [
for (int i = 0; i < buckets; i++)
counts[i] == 0 ? null : sums[i] / counts[i],
];
}