Functional Weave
Code in Python

monitor.burn-rate-alert@2.0.0

vectors.json

18,947 bytes · view raw

[
  {"name": "all quiet: no errors in any window, nothing fires", "args": [9990, [{"windowSeconds": 300, "totalEvents": 1000, "badEvents": 0}, {"windowSeconds": 1800, "totalEvents": 5000, "badEvents": 0}, {"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 0}, {"windowSeconds": 21600, "totalEvents": 60000, "badEvents": 0}, {"windowSeconds": 259200, "totalEvents": 720000, "badEvents": 0}], null, null], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 0, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 0, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 0, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}]}},
  {"name": "fast burn: 15x over the last hour and 20x in the last 5 minutes pages; the ticket rule fires too, the page wins", "args": [9990, [{"windowSeconds": 300, "totalEvents": 1000, "badEvents": 20}, {"windowSeconds": 1800, "totalEvents": 5000, "badEvents": 100}, {"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 150}, {"windowSeconds": 21600, "totalEvents": 60000, "badEvents": 300}, {"windowSeconds": 259200, "totalEvents": 720000, "badEvents": 800}], null, null], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 15000, "shortBurnMilli": 20000, "enoughEvents": true, "firing": true}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 5000, "shortBurnMilli": 20000, "enoughEvents": true, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 1111, "shortBurnMilli": 5000, "enoughEvents": true, "firing": true}]}},
  {"name": "the outage is over: the hour still burns 15x but the last 5 minutes are clean, so nothing pages", "args": [9990, [{"windowSeconds": 300, "totalEvents": 1000, "badEvents": 0}, {"windowSeconds": 1800, "totalEvents": 5000, "badEvents": 0}, {"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 150}, {"windowSeconds": 21600, "totalEvents": 60000, "badEvents": 30}, {"windowSeconds": 259200, "totalEvents": 720000, "badEvents": 100}], null, null], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 15000, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 500, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 139, "shortBurnMilli": 500, "enoughEvents": true, "firing": false}]}},
  {"name": "slow burn: 1.2x over three days and 1.5x over six hours raises a ticket, not a page", "args": [9990, [{"windowSeconds": 300, "totalEvents": 1000, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 5000, "badEvents": 8}, {"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 20}, {"windowSeconds": 21600, "totalEvents": 60000, "badEvents": 90}, {"windowSeconds": 259200, "totalEvents": 720000, "badEvents": 864}], null, null], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 2000, "shortBurnMilli": 2000, "enoughEvents": true, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 1500, "shortBurnMilli": 1600, "enoughEvents": true, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 1200, "shortBurnMilli": 1500, "enoughEvents": true, "firing": true}]}},
  {"name": "7x for six hours fires the second page rule; windows may come in any order", "args": [9990, [{"windowSeconds": 259200, "totalEvents": 720000, "badEvents": 1440}, {"windowSeconds": 21600, "totalEvents": 60000, "badEvents": 420}, {"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 70}, {"windowSeconds": 1800, "totalEvents": 5000, "badEvents": 35}, {"windowSeconds": 300, "totalEvents": 1000, "badEvents": 7}], null, null], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 7000, "shortBurnMilli": 7000, "enoughEvents": true, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 7000, "shortBurnMilli": 7000, "enoughEvents": true, "firing": true}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 2000, "shortBurnMilli": 7000, "enoughEvents": true, "firing": true}]}},
  {"name": "exactly at the threshold fires: 1.44% errors is 14.4x at 99.9%", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 144}, {"windowSeconds": 300, "totalEvents": 1000, "badEvents": 15}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 14400, "shortBurnMilli": 15000, "enoughEvents": true, "firing": true}]}},
  {"name": "14.3995x rounds to 14400 for display but is below 14.4x, so it does not fire", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 2000000, "badEvents": 28799}, {"windowSeconds": 300, "totalEvents": 1000, "badEvents": 20}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 14400, "shortBurnMilli": 20000, "enoughEvents": true, "firing": false}]}},
  {"name": "no traffic burns nothing and fires nothing", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 0, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 0, "badEvents": 0}], [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 1000}], null], "expect": {"firing": false, "severity": null, "rules": [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 1000, "longBurnMilli": 0, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}]}},
  {"name": "when several rules fire, the first in rule order gives the severity", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 200}, {"windowSeconds": 300, "totalEvents": 1000, "badEvents": 20}], [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 1000}, {"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 1000, "longBurnMilli": 20000, "shortBurnMilli": 20000, "enoughEvents": true, "firing": true}, {"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 20000, "shortBurnMilli": 20000, "enoughEvents": true, "firing": true}]}},
  {"name": "a 99% SLO allows ten times the errors: 2% errors is only 2x", "args": [9900, [{"windowSeconds": 3600, "totalEvents": 10000, "badEvents": 200}, {"windowSeconds": 300, "totalEvents": 1000, "badEvents": 20}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 2000, "shortBurnMilli": 2000, "enoughEvents": true, "firing": false}]}},
  {"name": "a single-window rule: short equal to long", "args": [9990, [{"windowSeconds": 86400, "totalEvents": 100000, "badEvents": 150}], [{"severity": "ticket", "longWindowSeconds": 86400, "shortWindowSeconds": 86400, "burnRateMilli": 1000}], null], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "ticket", "longWindowSeconds": 86400, "shortWindowSeconds": 86400, "thresholdMilli": 1000, "longBurnMilli": 1500, "shortBurnMilli": 1500, "enoughEvents": true, "firing": true}]}},
  {"name": "a new target, 2 bad checks of its first 11 at 99.5%: a 36x burn, but 11 events is under a minimum of 20, so nothing fires", "args": [9950, [{"windowSeconds": 300, "totalEvents": 10, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 3600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 21600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 259200, "totalEvents": 11, "badEvents": 2}], null, 20], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 36364, "shortBurnMilli": 40000, "enoughEvents": false, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": false, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": false, "firing": false}]}},
  {"name": "the same 11 checks with no minimum page, as 1.0.0 did", "args": [9950, [{"windowSeconds": 300, "totalEvents": 10, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 3600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 21600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 259200, "totalEvents": 11, "badEvents": 2}], null, null], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 36364, "shortBurnMilli": 40000, "enoughEvents": true, "firing": true}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": true, "firing": true}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": true, "firing": true}]}},
  {"name": "exactly minEvents in the long window is enough; the 5-minute window's 10 is not checked against it", "args": [9950, [{"windowSeconds": 300, "totalEvents": 10, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 3600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 21600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 259200, "totalEvents": 11, "badEvents": 2}], null, 11], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 36364, "shortBurnMilli": 40000, "enoughEvents": true, "firing": true}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": true, "firing": true}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": true, "firing": true}]}},
  {"name": "one event short of the minimum in every long window: nothing fires", "args": [9950, [{"windowSeconds": 300, "totalEvents": 10, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 3600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 21600, "totalEvents": 11, "badEvents": 2}, {"windowSeconds": 259200, "totalEvents": 11, "badEvents": 2}], null, 12], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 36364, "shortBurnMilli": 40000, "enoughEvents": false, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": false, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 36364, "shortBurnMilli": 36364, "enoughEvents": false, "firing": false}]}},
  {"name": "the guard is per rule: the 1-hour rule has 90 events of 100 and stays quiet, the 6-hour rule has 500 and pages", "args": [9990, [{"windowSeconds": 300, "totalEvents": 10, "badEvents": 2}, {"windowSeconds": 1800, "totalEvents": 50, "badEvents": 4}, {"windowSeconds": 3600, "totalEvents": 90, "badEvents": 5}, {"windowSeconds": 21600, "totalEvents": 500, "badEvents": 6}, {"windowSeconds": 259200, "totalEvents": 5000, "badEvents": 8}], null, 100], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 55556, "shortBurnMilli": 200000, "enoughEvents": false, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 12000, "shortBurnMilli": 80000, "enoughEvents": true, "firing": true}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 1600, "shortBurnMilli": 12000, "enoughEvents": true, "firing": true}]}},
  {"name": "a minimum of 0 is no minimum, and an empty window still never fires", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 0, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 3600, "burnRateMilli": 14400}], 0], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 3600, "thresholdMilli": 14400, "longBurnMilli": 0, "shortBurnMilli": 0, "enoughEvents": true, "firing": false}]}},
  {"name": "the workbook rules with no counts at all name the first missing window", "args": [9990, [], null, null], "expectError": "no counts for a 3600-second window"},
  {"name": "a rule's short window missing from the counts is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "no counts for a 300-second window"},
  {"name": "two counts for one window length is an error", "args": [9990, [{"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 50, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "duplicate counts for a 300-second window"},
  {"name": "a 100% target is an error", "args": [10000, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "targetBasisPoints must be a whole number from 1 to 9999 (10000 leaves no error budget), received 10000"},
  {"name": "a zero-length window is an error", "args": [9990, [{"windowSeconds": 0, "totalEvents": 100, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "windowSeconds must be at least 1, received 0"},
  {"name": "bad counts are checked even in a window no rule uses", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 60, "totalEvents": 4, "badEvents": 5}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "badEvents must not exceed totalEvents: 5 > 4"},
  {"name": "an empty rule list is an error; null means the workbook rules", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}], [], null], "expectError": "rules must not be empty; pass null for the SRE workbook rules"},
  {"name": "a short window longer than the long window is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 300, "shortWindowSeconds": 3600, "burnRateMilli": 14400}], null], "expectError": "shortWindowSeconds must not exceed longWindowSeconds: 3600 > 300"},
  {"name": "a zero threshold is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}], [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 0}], null], "expectError": "burnRateMilli must be at least 1, received 0"},
  {"name": "an empty severity is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 100, "badEvents": 0}, {"windowSeconds": 300, "totalEvents": 100, "badEvents": 0}], [{"severity": "", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "burnRateMilli": 14400}], null], "expectError": "severity must not be empty"},
  {"name": "a negative minimum is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 10, "badEvents": 0}], null, -1], "expectError": "minEvents must be null or a whole number of at least 0, received -1"},
  {"name": "a fractional minimum is an error", "args": [9990, [{"windowSeconds": 3600, "totalEvents": 10, "badEvents": 0}], null, 2.5], "expectError": "minEvents must be null or a whole number of at least 0, received 2.5"},
  {"name": "the target is checked before the minimum", "args": [0, [{"windowSeconds": 3600, "totalEvents": 10, "badEvents": 0}], null, -1], "expectError": "targetBasisPoints must be a whole number from 1 to 9999 (10000 leaves no error budget), received 0"}
]