{
  "leansignal_demand_export": "1.0",
  "exported_at": "2026-07-17T00:00:00Z",
  "source_tenant": "leansignal-catalog",
  "catalog": {
    "slug": "ruby-otel-demand-extended",
    "integration": "ruby",
    "variant": "extended",
    "title": "Ruby on Rails — Extended",
    "category": "SDK",
    "dashboards": 1,
    "panels": 14,
    "alerts": 10,
    "docs_url": "https://docs.leansignal.io/integrations/ruby/"
  },
  "demand": {
    "ref": "demand",
    "name": "Ruby on Rails — Extended (OpenTelemetry)",
    "description": "Deep request visibility: p99 latency, slowest actions, throughput by format, the request-time breakdown (total vs database vs views), and 4xx client errors, plus the full alert set.",
    "dashboards": [
      {
        "ref": "dash-ruby",
        "name": "Ruby on Rails — Extended",
        "description": "Rails HTTP request metrics (rate, errors, latency) plus view and database time, from Prometheus (Yabeda) instrumentation scraped into LeanSignal (extended variant).",
        "data": {
          "display": {
            "name": "Ruby on Rails — Extended"
          },
          "panels": {
            "request_rate": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request rate",
                  "description": "Inbound request throughput per instance."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "requests/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "error_rate": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "5xx error rate",
                  "description": "Share of requests answered 5xx."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_requests_total{instance=~\"$instance\",status=~\"5..\"}[5m])) / sum by (instance) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "request_rate_by_controller": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request rate by controller#action",
                  "description": "Service-level traffic per endpoint, summed across the selected instances."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "requests/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (controller, action) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{controller}}#{{action}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "requests_by_status": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Requests by status",
                  "description": "Service-level throughput per HTTP status — errors visible as their own series."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "requests/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (status) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{status}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "throughput_by_format": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Throughput by format",
                  "description": "HTML vs JSON vs other response formats."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "requests/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (format) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{format}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "client_error_rate": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "4xx client error rate",
                  "description": "Share of requests answered 4xx — a jump usually means broken clients, bad links, or auth issues."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_requests_total{instance=~\"$instance\",status=~\"4..\"}[5m])) / sum by (instance) (rate(rails_requests_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "request_latency_p95": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request latency p95",
                  "description": "95th-percentile request latency per instance."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_request_duration_seconds_bucket{instance=~\"$instance\"}[5m])))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "request_latency_p50": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request latency p50",
                  "description": "Median latency — what the typical request experiences."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "histogram_quantile(0.50, sum by (le, instance) (rate(rails_request_duration_seconds_bucket{instance=~\"$instance\"}[5m])))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "request_latency_p99": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request latency p99",
                  "description": "Tail latency — compare with p50/p95 to separate spikes from constant slowness."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "histogram_quantile(0.99, sum by (le, instance) (rate(rails_request_duration_seconds_bucket{instance=~\"$instance\"}[5m])))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "slowest_actions_p95": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Slowest actions (p95)",
                  "description": "Top 10 endpoints by p95 latency across the selected instances."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "topk(10, histogram_quantile(0.95, sum by (le, action) (rate(rails_request_duration_seconds_bucket{instance=~\"$instance\"}[5m]))))",
                          "seriesNameFormat": "{{action}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "request_time_breakdown": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Request time breakdown (avg)",
                  "description": "Where the average request spends its time — total vs database vs view rendering."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_request_duration_seconds_sum{instance=~\"$instance\"}[5m])) / sum by (instance) (rate(rails_request_duration_seconds_count{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · total"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_db_runtime_seconds_sum{instance=~\"$instance\"}[5m])) / sum by (instance) (rate(rails_db_runtime_seconds_count{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · database"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_view_runtime_seconds_sum{instance=~\"$instance\"}[5m])) / sum by (instance) (rate(rails_view_runtime_seconds_count{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · views"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "db_runtime_p95": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Database time p95",
                  "description": "ActiveRecord time per request — slow queries or connection pressure."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_db_runtime_seconds_bucket{instance=~\"$instance\"}[5m])))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "db_time_share": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Database share of request time",
                  "description": "Fraction of total request time spent in the database — is Rails or Postgres the bottleneck?"
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (rate(rails_db_runtime_seconds_sum{instance=~\"$instance\"}[5m])) / sum by (instance) (rate(rails_request_duration_seconds_sum{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "view_runtime_p95": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "View render time p95",
                  "description": "Template rendering time per request — heavy partials and N+1 helpers show up here."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "seconds"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_view_runtime_seconds_bucket{instance=~\"$instance\"}[5m])))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            }
          },
          "layouts": [
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Requests",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_rate"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/error_rate"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_rate_by_controller"
                    }
                  },
                  {
                    "x": 12,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/requests_by_status"
                    }
                  },
                  {
                    "x": 0,
                    "y": 16,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/throughput_by_format"
                    }
                  },
                  {
                    "x": 12,
                    "y": 16,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/client_error_rate"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Latency",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_latency_p95"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_latency_p50"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_latency_p99"
                    }
                  },
                  {
                    "x": 12,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/slowest_actions_p95"
                    }
                  },
                  {
                    "x": 0,
                    "y": 16,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/request_time_breakdown"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Database",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/db_runtime_p95"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/db_time_share"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Views",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/view_runtime_p95"
                    }
                  }
                ]
              }
            }
          ],
          "variables": [
            {
              "kind": "ListVariable",
              "spec": {
                "name": "instance",
                "display": {
                  "name": "Instance"
                },
                "allowAllValue": true,
                "allowMultiple": true,
                "customAllValue": ".*",
                "defaultValue": ".*",
                "plugin": {
                  "kind": "PrometheusLabelValuesVariable",
                  "spec": {
                    "labelName": "instance"
                  }
                }
              }
            }
          ],
          "duration": "1h",
          "refreshInterval": "30s",
          "datasources": {}
        }
      }
    ],
    "alert_rules": [
      {
        "ref": "alert-high-error-rate",
        "name": "High HTTP 5xx error rate",
        "description": null,
        "query": "sum by (instance) (rate(rails_requests_total{status=~\"5..\"}[5m])) / sum by (instance) (rate(rails_requests_total[5m]))",
        "condition_op": "gt",
        "threshold": 0.05,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "{{labels.instance}} is serving {{value | percent:1}} 5xx responses.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-latency-p95",
        "name": "High request latency (p95)",
        "description": null,
        "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_request_duration_seconds_bucket[5m])))",
        "condition_op": "gt",
        "threshold": 1,
        "interval": "1m",
        "for": "5m",
        "severity": "warning",
        "message": "{{labels.instance}} p95 request latency is {{value}}s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-db-runtime-p95",
        "name": "High database time (p95)",
        "description": null,
        "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_db_runtime_seconds_bucket[5m])))",
        "condition_op": "gt",
        "threshold": 0.5,
        "interval": "1m",
        "for": "10m",
        "severity": "warning",
        "message": "{{labels.instance}} p95 database time is {{value}}s — slow queries or connection pressure.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-critical-error-rate",
        "name": "Critical HTTP 5xx error rate",
        "description": null,
        "query": "sum by (instance) (rate(rails_requests_total{status=~\"5..\"}[5m])) / sum by (instance) (rate(rails_requests_total[5m]))",
        "condition_op": "gt",
        "threshold": 0.2,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "{{labels.instance}} 5xx error rate is {{value | percent:1}} — likely outage.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-latency-p99",
        "name": "High request latency (p99)",
        "description": null,
        "query": "histogram_quantile(0.99, sum by (le, instance) (rate(rails_request_duration_seconds_bucket[5m])))",
        "condition_op": "gt",
        "threshold": 2.5,
        "interval": "1m",
        "for": "5m",
        "severity": "warning",
        "message": "{{labels.instance}} p99 request latency is {{value}}s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-no-traffic",
        "name": "No inbound traffic",
        "description": null,
        "query": "sum by (instance) (rate(rails_requests_total[5m]))",
        "condition_op": "lt",
        "threshold": 0.01,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "{{labels.instance}} is receiving no requests for 15m.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-4xx-rate",
        "name": "Elevated 4xx client error rate",
        "description": null,
        "query": "sum by (instance) (rate(rails_requests_total{status=~\"4..\"}[5m])) / sum by (instance) (rate(rails_requests_total[5m]))",
        "condition_op": "gt",
        "threshold": 0.3,
        "interval": "1m",
        "for": "10m",
        "severity": "warning",
        "message": "{{labels.instance}} 4xx ratio is {{value | percent:1}}.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-view-runtime-p95",
        "name": "High view render time (p95)",
        "description": null,
        "query": "histogram_quantile(0.95, sum by (le, instance) (rate(rails_view_runtime_seconds_bucket[5m])))",
        "condition_op": "gt",
        "threshold": 0.3,
        "interval": "1m",
        "for": "10m",
        "severity": "warning",
        "message": "{{labels.instance}} p95 view render time is {{value}}s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-high-db-runtime-p99",
        "name": "High database time (p99)",
        "description": null,
        "query": "histogram_quantile(0.99, sum by (le, instance) (rate(rails_db_runtime_seconds_bucket[5m])))",
        "condition_op": "gt",
        "threshold": 1,
        "interval": "1m",
        "for": "10m",
        "severity": "warning",
        "message": "{{labels.instance}} p99 database time is {{value}}s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-slow-action-p95",
        "name": "Slow controller action (p95)",
        "description": null,
        "query": "max by (action) (histogram_quantile(0.95, sum by (le, action) (rate(rails_request_duration_seconds_bucket[5m]))))",
        "condition_op": "gt",
        "threshold": 2,
        "interval": "1m",
        "for": "10m",
        "severity": "warning",
        "message": "Action {{labels.action}} p95 latency is {{value}}s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      }
    ]
  }
}
