ObservaStack

rules/recording/slo.yml

# orders-api availability objective is 99.9% (error budget 0.001) over 30 days.
# Latency SLI is the share of requests faster than 300ms; objective is 99% (budget 0.01).
groups:
  - name: slo.availability
    rules:
      - record: slo:sli_error:ratio_rate5m
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[5m]))
          /
          sum by (service, slo) (rate(http_requests_total[5m]))
      - record: slo:sli_error:ratio_rate30m
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[30m]))
          /
          sum by (service, slo) (rate(http_requests_total[30m]))
      - record: slo:sli_error:ratio_rate1h
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[1h]))
          /
          sum by (service, slo) (rate(http_requests_total[1h]))
      - record: slo:sli_error:ratio_rate2h
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[2h]))
          /
          sum by (service, slo) (rate(http_requests_total[2h]))
      - record: slo:sli_error:ratio_rate6h
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[6h]))
          /
          sum by (service, slo) (rate(http_requests_total[6h]))
      - record: slo:sli_error:ratio_rate1d
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[1d]))
          /
          sum by (service, slo) (rate(http_requests_total[1d]))
      - record: slo:sli_error:ratio_rate3d
        expr: |
          sum by (service, slo) (rate(http_requests_total{code=~"5.."}[3d]))
          /
          sum by (service, slo) (rate(http_requests_total[3d]))
      - record: slo:error_budget_remaining:ratio
        expr: |
          1 - (
            (
              sum by (service, slo) (rate(http_requests_total{code=~"5.."}[30d]))
              /
              sum by (service, slo) (rate(http_requests_total[30d]))
            )
            / 0.001
          )
  - name: slo.latency
    rules:
      - record: slo:sli_latency_error:ratio_rate5m
        expr: |
          1 - (
            sum by (service, slo) (rate(http_request_duration_seconds_bucket{le="0.3"}[5m]))
            /
            sum by (service, slo) (rate(http_request_duration_seconds_count[5m]))
          )
      - record: slo:sli_latency_error:ratio_rate30m
        expr: |
          1 - (
            sum by (service, slo) (rate(http_request_duration_seconds_bucket{le="0.3"}[30m]))
            /
            sum by (service, slo) (rate(http_request_duration_seconds_count[30m]))
          )
      - record: slo:sli_latency_error:ratio_rate1h
        expr: |
          1 - (
            sum by (service, slo) (rate(http_request_duration_seconds_bucket{le="0.3"}[1h]))
            /
            sum by (service, slo) (rate(http_request_duration_seconds_count[1h]))
          )
      - record: slo:sli_latency_error:ratio_rate6h
        expr: |
          1 - (
            sum by (service, slo) (rate(http_request_duration_seconds_bucket{le="0.3"}[6h]))
            /
            sum by (service, slo) (rate(http_request_duration_seconds_count[6h]))
          )