Functional Weave
Code in TypeScript

monitor.burn-rate-alert@1.0.0

vectors.json

11,788 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], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 0, "shortBurnMilli": 0, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 0, "shortBurnMilli": 0, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 0, "shortBurnMilli": 0, "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], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 15000, "shortBurnMilli": 20000, "firing": true}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 5000, "shortBurnMilli": 20000, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 1111, "shortBurnMilli": 5000, "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], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 15000, "shortBurnMilli": 0, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 500, "shortBurnMilli": 0, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 139, "shortBurnMilli": 500, "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], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 2000, "shortBurnMilli": 2000, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 1500, "shortBurnMilli": 1600, "firing": false}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 1200, "shortBurnMilli": 1500, "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], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 7000, "shortBurnMilli": 7000, "firing": false}, {"severity": "page", "longWindowSeconds": 21600, "shortWindowSeconds": 1800, "thresholdMilli": 6000, "longBurnMilli": 7000, "shortBurnMilli": 7000, "firing": true}, {"severity": "ticket", "longWindowSeconds": 259200, "shortWindowSeconds": 21600, "thresholdMilli": 1000, "longBurnMilli": 2000, "shortBurnMilli": 7000, "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}]], "expect": {"firing": true, "severity": "page", "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 14400, "shortBurnMilli": 15000, "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}]], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 14400, "shortBurnMilli": 20000, "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}]], "expect": {"firing": false, "severity": null, "rules": [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 1000, "longBurnMilli": 0, "shortBurnMilli": 0, "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}]], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "ticket", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 1000, "longBurnMilli": 20000, "shortBurnMilli": 20000, "firing": true}, {"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 20000, "shortBurnMilli": 20000, "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}]], "expect": {"firing": false, "severity": null, "rules": [{"severity": "page", "longWindowSeconds": 3600, "shortWindowSeconds": 300, "thresholdMilli": 14400, "longBurnMilli": 2000, "shortBurnMilli": 2000, "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}]], "expect": {"firing": true, "severity": "ticket", "rules": [{"severity": "ticket", "longWindowSeconds": 86400, "shortWindowSeconds": 86400, "thresholdMilli": 1000, "longBurnMilli": 1500, "shortBurnMilli": 1500, "firing": true}]}},
  {"name": "the workbook rules with no counts at all name the first missing window", "args": [9990, [], 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}]], "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}]], "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}]], "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}]], "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}]], "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}], []], "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}]], "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}]], "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}]], "expectError": "severity must not be empty"}
]