25 using namespace folly;
26 using std::chrono::seconds;
38 const seconds kDurations[] = {
54 const seconds kDurations[] = {
61 typedef std::mt19937 RandomInt32;
94 for (
int i = 0;
i < 98;
i++) {
98 h.
update(mkTimePoint(1500000000));
126 hist.
addValue(mkTimePoint(0), maxVal);
127 for (
int i = 0;
i < 98;
i++) {
131 hist.
update(mkTimePoint(0));
134 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 135 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
136 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 137 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
138 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 139 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
140 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 141 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
146 for (
size_t level = 0; level < hist.
getNumLevels(); ++level) {
151 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 152 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
153 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 154 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
155 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 156 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
157 "-2147483648:12:4,10:8:13,20:8:24,30:6:34,40:13:46,50:8:54,60:7:64," 158 "70:7:74,80:8:84,90:10:94,100:3:103,110:10:115",
163 for (
size_t level = 0; level < hist.
getNumLevels(); ++level) {
179 for (
int i = 0;
i < 100;
i++) {
194 for (
int pct = 0; pct <= 100; pct++) {
218 for (
int i = 0;
i < 100;
i++) {
223 hist.
update(mkTimePoint(3599));
224 for (
int pct = 1; pct <= 100; pct++) {
225 int expected = (pct - 1) / 10 * 10;
259 EXPECT_EQ(49.5, hist.
avg<
double>(IntMTMHTS::TEN_MINUTE));
273 EXPECT_EQ(49500, hist.
sum(mkTimePoint(10), mkTimePoint(20)));
274 EXPECT_EQ(4950, hist.
rate(mkTimePoint(10), mkTimePoint(20)));
275 EXPECT_EQ(49.5, hist.
avg<
double>(mkTimePoint(10), mkTimePoint(20)));
278 EXPECT_EQ(9900, hist.
sum(mkTimePoint(3550), mkTimePoint(3552)));
279 EXPECT_EQ(4950, hist.
rate(mkTimePoint(3550), mkTimePoint(3552)));
280 EXPECT_EQ(49.5, hist.
avg<
double>(mkTimePoint(3550), mkTimePoint(3552)));
283 EXPECT_EQ(0, hist.
sum(mkTimePoint(4550), mkTimePoint(4552)));
284 EXPECT_EQ(0, hist.
rate(mkTimePoint(4550), mkTimePoint(4552)));
285 EXPECT_EQ(0, hist.
avg<
double>(mkTimePoint(4550), mkTimePoint(4552)));
299 for (
int i = 0;
i < 100;
i++) {
304 hist.
update(mkTimePoint(3599));
305 for (
int pct = 1; pct <= 100; pct++) {
306 int expected = (pct - 1) / 10 * 10;
336 for (
int i = 0;
i < 50;
i++) {
341 hist.
update(mkTimePoint(3599));
342 for (
int pct = 1; pct <= 100; pct++) {
343 int expected = (pct - 1) / 10 * 10;
372 for (
int i = 0;
i < 100; ++
i) {
373 hist.
addValue(mkTimePoint(3599), 200 +
i);
375 hist.
update(mkTimePoint(3599));
389 mhts.
update(mkTimePoint(0));
392 for (curTime = 0; curTime < 7200; curTime++) {
393 mhts.
addValue(mkTimePoint(curTime), 1);
395 for (curTime = 7200; curTime < 7200 + 3540; curTime++) {
396 mhts.
addValue(mkTimePoint(curTime), 10);
398 for (curTime = 7200 + 3540; curTime < 7200 + 3600; curTime++) {
399 mhts.
addValue(mkTimePoint(curTime), 100);
402 mhts.
update(mkTimePoint(7200 + 3600 - 1));
404 struct TimeInterval {
405 TimeInterval(
int s,
int e) :
start(mkTimePoint(s)),
end(mkTimePoint(e)) {}
410 TimeInterval intervals[12] = {
411 {curTime - 60, curTime},
412 {curTime - 3600, curTime},
413 {curTime - 7200, curTime},
414 {curTime - 3600, curTime - 60},
415 {curTime - 7200, curTime - 60},
416 {curTime - 7200, curTime - 3600},
417 {curTime - 50, curTime - 20},
418 {curTime - 3020, curTime - 20},
419 {curTime - 7200, curTime - 20},
420 {curTime - 3000, curTime - 1000},
421 {curTime - 7200, curTime - 1000},
422 {curTime - 7200, curTime - 3600},
425 int expectedSums[12] = {
440 int expectedCounts[12] = {
460 int expectedValues[12][3] = {
463 {belowMinBucket, belowMinBucket, 8},
465 {belowMinBucket, belowMinBucket, 8},
466 {belowMinBucket, belowMinBucket, 8},
469 {belowMinBucket, belowMinBucket, 8},
471 {belowMinBucket, belowMinBucket, 8},
472 {belowMinBucket, belowMinBucket, 8}
475 for (
int i = 0;
i < 12;
i++) {
476 const auto& itv = intervals[
i];
477 int s = mhts.
sum(itv.start, itv.end);
480 int c = mhts.
count(itv.start, itv.end);
485 for (
int i = 1;
i <= 100;
i++) {
490 i, mkTimePoint(curTime - 60), mkTimePoint(curTime)));
494 i, mkTimePoint(curTime - 3540), mkTimePoint(curTime - 60)));
509 for (
int i = 0;
i < 12;
i++) {
510 const auto& itv = intervals[
i];
521 for (
int i = 0;
i < 12;
i++) {
522 const auto& itv = intervals[
i];
525 size_t tolerance = 0;
526 if (itv.start <= mkTimePoint(curTime - 7200)) {
528 }
else if (itv.start <= mkTimePoint(curTime - 3000)) {
531 size_t actualCount = (itv.end - itv.start).
count();
532 size_t estimatedCount = mhts.
count(itv.start, itv.end);
534 EXPECT_LE(actualCount - tolerance, estimatedCount);
539 int values[] = {-1, 0, 500, 1000, 1500};
540 for (
int ii = 0; ii < 5; ++ii) {
541 int value = values[ii];
549 const int kNumIters = 1000;
550 for (
int jj = 0; jj < kNumIters; ++jj) {
561 const int kNewValue = 750;
562 for (
int kk = 0; kk < 2 * kNumIters; ++kk) {
563 h.
addValue(mkTimePoint(1), kNewValue);
567 if (value >= 0 && value <= 1000) {
570 if (kNewValue > value) {
#define EXPECT_LE(val1, val2)
TEST(TimeseriesHistogram, Percentile)
Integral2 random(Integral1 low, Integral2 up)
uint64_t count(size_t level) const
size_t getNumBuckets() const
#define EXPECT_EQ(val1, val2)
std::string getString(size_t level) const
std::chrono::steady_clock::time_point now()
ReturnType rate(size_t level) const
void update(TimePoint now)
—— Concurrent Priority Queue Implementation ——
ReturnType avg(size_t level) const
#define EXPECT_GE(val1, val2)
ValueType getBucketSize() const
uint64_t count(size_t level) const
auto end(TestAdlIterable &instance)
ValueType getPercentileEstimate(double pct, size_t level) const
static const char *const value
ValueType getPercentileBucketMin(double pct, size_t level) const
#define EXPECT_NEAR(val1, val2, abs_error)
void addValue(TimePoint now, const ValueType &value)
size_t getNumLevels() const
ValueType sum(size_t level) const
const ContainerType & getBucket(size_t bucketIdx) const
std::vector< int > values(1'000)
std::chrono::time_point< LegacyStatsClock, TT > time_point