Rule Types and Examples¶
Supported rule types are defined in internal/rules/types.go and evaluated in internal/evaluator/.
Examples below are intentionally simple and domain-neutral.
1) gauge_threshold¶
Think: speed limit monitor - for this example assume speed limit is 50 km/h.
- Below 51 km/h is GREEN
- 51-55 km/h is YELLOW
- Over 55 km/h is RED
rule_type = "gauge_threshold"
metric_name = "car_speed_kmh"
display_name = "car_speed_kmh"
description = "Current car speed"
[thresholds]
low = 51
high = 56
higher_is_worse = true
[messages]
green = "{value:.0f} km/h (within limit)"
yellow = "{value:.0f} km/h (slightly above limit)"
red = "{value:.0f} km/h (too fast)"
Example metric input:
car_speed_kmh 54
Notes:
- With higher_is_worse = true: < low => GREEN, < high => YELLOW, else RED.
- With higher_is_worse = false, logic is inverted.
2) percentage¶
Think: exam score = correct answers / total answers.
rule_type = "percentage"
display_name = "exam_score"
description = "Percent of correct answers"
[percentage_config]
numerator = "answers_correct"
denominator = "answers_total"
[thresholds]
low = 70.0
high = 90.0
higher_is_worse = false
[messages]
green = "Score {value:.1f}% (great)"
yellow = "Score {value:.1f}% (okay)"
red = "Score {value:.1f}% (needs work)"
zero_activity = "No answers yet"
Example metric input:
answers_correct 42
answers_total 50
Notes:
- Engine computes (numerator / denominator) * 100.
- If denominator is zero, it uses zero_activity (or a default fallback).
3) queue_operations¶
Think: people entering vs leaving a store queue.
rule_type = "queue_operations"
metric_name = "store_queue_operations_total"
display_name = "store_queue_balance"
description = "Queue growth over time"
[queue_config]
operation_label = "Operation"
add_value = "Enter"
remove_value = "Leave"
[thresholds]
low = 5
high = 20
[messages]
green = "Queue stable: Enter={add:.0f}, Leave={remove:.0f}, Diff={diff:.0f}"
yellow = "Queue growing: Diff={diff:.0f}"
red = "Queue overloaded: Diff={diff:.0f}"
Example metric input:
store_queue_operations_total{Operation="Enter"} 120
store_queue_operations_total{Operation="Leave"} 115
Notes:
- Engine computes diff = Add - Remove.
- Thresholds are checked against diff.
4) histogram¶
Think: delivery time distribution.
rule_type = "histogram"
metric_name = "delivery_time_seconds"
display_name = "delivery_time_seconds"
description = "How long deliveries take"
[histogram_config]
unit = "seconds"
[thresholds]
p95_good = 30
p95_warn = 60
[messages]
green = "Delivery time healthy (p95={p95:.0f}s, p99={p99:.0f}s)"
yellow = "Delivery time elevated (p95={p95:.0f}s)"
red = "Delivery time too high (p95={p95:.0f}s)"
Example metric input:
delivery_time_seconds_bucket{le="10"} 20
delivery_time_seconds_bucket{le="30"} 80
delivery_time_seconds_bucket{le="60"} 98
delivery_time_seconds_bucket{le="+Inf"} 100
Notes:
- Reads buckets from <metric_name>_bucket.
- Computes p50/p75/p95/p99 and evaluates based on p95.
- There is also a global automatic histogram +Inf overflow check - this is a separate rule built into the code.
5) cache_hit_rate¶
Think: library lookup cache efficiency.
rule_type = "cache_hit_rate"
display_name = "library_cache_hit_rate"
description = "Cache efficiency for book lookups"
[cache_config]
hits_metric = "cache_hits_total"
misses_metric = "cache_misses_total"
[thresholds]
low = 50.0
high = 80.0
higher_is_worse = false
[messages]
green = "{value:.1f}% hit rate (excellent)"
yellow = "{value:.1f}% hit rate (acceptable)"
red = "{value:.1f}% hit rate (poor)"
zero_activity = "No cache activity yet"
Example metric input:
cache_hits_total 90
cache_misses_total 10
Notes:
- Hit rate is (hits / (hits + misses)) * 100.
- If both hits and misses are zero, zero_activity is used.
6) composite¶
Think: coffee shop health check using multiple metrics together.
rule_type = "composite"
display_name = "coffee_shop_health"
description = "Combined check of key shop metrics"
[composite_config]
[[composite_config.metrics]]
name = "orders"
source = "orders_total"
[[composite_config.metrics]]
name = "baristas"
source = "baristas_on_shift"
[[composite_config.metrics]]
name = "machines"
source = "working_machines"
[[composite_config.checks]]
check_type = "not_zero"
metrics = ["baristas", "machines"]
status = "red"
message = "No baristas or no machines available"
[[composite_config.checks]]
check_type = "ratio"
numerator = "orders"
denominator = "baristas"
min_ratio = 2.0
status = "yellow"
message = "Low orders per barista ratio"
[messages]
green = "Coffee shop looks healthy"
Example metric input:
orders_total 40
baristas_on_shift 8
working_machines 3
Notes:
- Checks run in order; first matching check decides the status/message.
- Supported check_type: not_zero, ratio.