feat(observe): 现成 OpenObserve 仪表盘(QPS/P95/分位/错误率) + 导入说明
dashboard-api-metrics.json: v8 schema 4 面板,已在 v0.91.1 实例 test-import 验证可用。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,21 @@ SELECT route,
|
|||||||
FROM app_requests GROUP BY route ORDER BY err_pct DESC
|
FROM app_requests GROUP BY route ORDER BY err_pct DESC
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 一键导入现成仪表盘(QPS / P95 / 分位 / 错误率)
|
||||||
|
|
||||||
|
备好了 [dashboard-api-metrics.json](dashboard-api-metrics.json),4 个面板:各接口每分钟请求数(QPS 源)、
|
||||||
|
P95 耗时折线、P50/P95/P99 分位表、5xx 错误率表。
|
||||||
|
|
||||||
|
- **UI 导入**:Dashboards → 右上 **Import** → 选该 JSON 文件 → Import(每次导入新建,不覆盖)。
|
||||||
|
- **或 API 导入**:
|
||||||
|
```bash
|
||||||
|
curl -u admin@shaguabijia.local:Complexpass#123 -H 'Content-Type: application/json' \
|
||||||
|
-X POST 'http://localhost:5080/api/default/dashboards?folder=default' \
|
||||||
|
--data-binary @deploy/openobserve/dashboard-api-metrics.json
|
||||||
|
```
|
||||||
|
|
||||||
|
导入后进仪表盘,右上角时间调到「最近 15 分钟 / 1 小时」、开自动刷新即可。低流量下 QPS 面板看「每分钟请求数」比「每秒」直观。
|
||||||
|
|
||||||
## 停止 / 清数据
|
## 停止 / 清数据
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -0,0 +1,301 @@
|
|||||||
|
{
|
||||||
|
"version": 8,
|
||||||
|
"title": "接口监控 (QPS / 耗时 / 错误率)",
|
||||||
|
"description": "app-server 接口 QPS、P50/P95/P99 耗时、5xx 错误率。数据流 app_requests。",
|
||||||
|
"role": "",
|
||||||
|
"tabs": [
|
||||||
|
{
|
||||||
|
"tabId": "default",
|
||||||
|
"name": "Default",
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"id": "panel_qps",
|
||||||
|
"type": "line",
|
||||||
|
"title": "各接口 每分钟请求数 (QPS 源)",
|
||||||
|
"description": "",
|
||||||
|
"config": {
|
||||||
|
"show_legends": true,
|
||||||
|
"legends_position": null,
|
||||||
|
"decimals": 2.0,
|
||||||
|
"axis_border_show": false,
|
||||||
|
"base_map": null,
|
||||||
|
"map_view": null
|
||||||
|
},
|
||||||
|
"queryType": "sql",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"query": "SELECT histogram(_timestamp, '1 minute') as ts, route, count(*) as reqs FROM app_requests GROUP BY ts, route ORDER BY ts",
|
||||||
|
"vrlFunctionQuery": "",
|
||||||
|
"customQuery": true,
|
||||||
|
"fields": {
|
||||||
|
"stream": "app_requests",
|
||||||
|
"stream_type": "logs",
|
||||||
|
"x": [
|
||||||
|
{
|
||||||
|
"label": "ts",
|
||||||
|
"alias": "ts",
|
||||||
|
"column": "ts",
|
||||||
|
"color": null,
|
||||||
|
"sortBy": "ASC"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
{
|
||||||
|
"label": "reqs",
|
||||||
|
"alias": "reqs",
|
||||||
|
"column": "reqs",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"z": [],
|
||||||
|
"breakdown": [
|
||||||
|
{
|
||||||
|
"label": "route",
|
||||||
|
"alias": "route",
|
||||||
|
"column": "route",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"filterType": "group",
|
||||||
|
"logicalOperator": "AND",
|
||||||
|
"conditions": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"promql_legend": "",
|
||||||
|
"layer_type": "scatter",
|
||||||
|
"weight_fixed": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"layout": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 24,
|
||||||
|
"h": 9,
|
||||||
|
"i": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "panel_p95",
|
||||||
|
"type": "line",
|
||||||
|
"title": "各接口 P95 耗时 (ms)",
|
||||||
|
"description": "",
|
||||||
|
"config": {
|
||||||
|
"show_legends": true,
|
||||||
|
"legends_position": null,
|
||||||
|
"decimals": 2.0,
|
||||||
|
"axis_border_show": false,
|
||||||
|
"base_map": null,
|
||||||
|
"map_view": null
|
||||||
|
},
|
||||||
|
"queryType": "sql",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"query": "SELECT histogram(_timestamp, '1 minute') as ts, route, approx_percentile_cont(duration_ms, 0.95) as p95_ms FROM app_requests GROUP BY ts, route ORDER BY ts",
|
||||||
|
"vrlFunctionQuery": "",
|
||||||
|
"customQuery": true,
|
||||||
|
"fields": {
|
||||||
|
"stream": "app_requests",
|
||||||
|
"stream_type": "logs",
|
||||||
|
"x": [
|
||||||
|
{
|
||||||
|
"label": "ts",
|
||||||
|
"alias": "ts",
|
||||||
|
"column": "ts",
|
||||||
|
"color": null,
|
||||||
|
"sortBy": "ASC"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
{
|
||||||
|
"label": "p95_ms",
|
||||||
|
"alias": "p95_ms",
|
||||||
|
"column": "p95_ms",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"z": [],
|
||||||
|
"breakdown": [
|
||||||
|
{
|
||||||
|
"label": "route",
|
||||||
|
"alias": "route",
|
||||||
|
"column": "route",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"filterType": "group",
|
||||||
|
"logicalOperator": "AND",
|
||||||
|
"conditions": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"promql_legend": "",
|
||||||
|
"layer_type": "scatter",
|
||||||
|
"weight_fixed": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"layout": {
|
||||||
|
"x": 24,
|
||||||
|
"y": 0,
|
||||||
|
"w": 24,
|
||||||
|
"h": 9,
|
||||||
|
"i": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "panel_pctl",
|
||||||
|
"type": "table",
|
||||||
|
"title": "各接口 耗时分位 P50/P95/P99 (ms)",
|
||||||
|
"description": "",
|
||||||
|
"config": {
|
||||||
|
"show_legends": true,
|
||||||
|
"legends_position": null,
|
||||||
|
"decimals": 2.0,
|
||||||
|
"axis_border_show": false,
|
||||||
|
"base_map": null,
|
||||||
|
"map_view": null
|
||||||
|
},
|
||||||
|
"queryType": "sql",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"query": "SELECT route, approx_percentile_cont(duration_ms,0.5) as p50, approx_percentile_cont(duration_ms,0.95) as p95, approx_percentile_cont(duration_ms,0.99) as p99, count(*) as cnt FROM app_requests GROUP BY route ORDER BY p95 DESC",
|
||||||
|
"vrlFunctionQuery": "",
|
||||||
|
"customQuery": true,
|
||||||
|
"fields": {
|
||||||
|
"stream": "app_requests",
|
||||||
|
"stream_type": "logs",
|
||||||
|
"x": [
|
||||||
|
{
|
||||||
|
"label": "route",
|
||||||
|
"alias": "route",
|
||||||
|
"column": "route",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
{
|
||||||
|
"label": "p50",
|
||||||
|
"alias": "p50",
|
||||||
|
"column": "p50",
|
||||||
|
"color": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "p95",
|
||||||
|
"alias": "p95",
|
||||||
|
"column": "p95",
|
||||||
|
"color": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "p99",
|
||||||
|
"alias": "p99",
|
||||||
|
"column": "p99",
|
||||||
|
"color": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "cnt",
|
||||||
|
"alias": "cnt",
|
||||||
|
"column": "cnt",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"z": [],
|
||||||
|
"breakdown": [],
|
||||||
|
"filter": {
|
||||||
|
"filterType": "group",
|
||||||
|
"logicalOperator": "AND",
|
||||||
|
"conditions": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"promql_legend": "",
|
||||||
|
"layer_type": "scatter",
|
||||||
|
"weight_fixed": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"layout": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 9,
|
||||||
|
"w": 24,
|
||||||
|
"h": 9,
|
||||||
|
"i": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "panel_err",
|
||||||
|
"type": "table",
|
||||||
|
"title": "各接口 错误率 (5xx %)",
|
||||||
|
"description": "",
|
||||||
|
"config": {
|
||||||
|
"show_legends": true,
|
||||||
|
"legends_position": null,
|
||||||
|
"decimals": 2.0,
|
||||||
|
"axis_border_show": false,
|
||||||
|
"base_map": null,
|
||||||
|
"map_view": null
|
||||||
|
},
|
||||||
|
"queryType": "sql",
|
||||||
|
"queries": [
|
||||||
|
{
|
||||||
|
"query": "SELECT route, count(*) FILTER (WHERE status >= 500) * 100.0 / count(*) as err_pct, count(*) as cnt FROM app_requests GROUP BY route ORDER BY err_pct DESC",
|
||||||
|
"vrlFunctionQuery": "",
|
||||||
|
"customQuery": true,
|
||||||
|
"fields": {
|
||||||
|
"stream": "app_requests",
|
||||||
|
"stream_type": "logs",
|
||||||
|
"x": [
|
||||||
|
{
|
||||||
|
"label": "route",
|
||||||
|
"alias": "route",
|
||||||
|
"column": "route",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
{
|
||||||
|
"label": "err_pct",
|
||||||
|
"alias": "err_pct",
|
||||||
|
"column": "err_pct",
|
||||||
|
"color": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "cnt",
|
||||||
|
"alias": "cnt",
|
||||||
|
"column": "cnt",
|
||||||
|
"color": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"z": [],
|
||||||
|
"breakdown": [],
|
||||||
|
"filter": {
|
||||||
|
"filterType": "group",
|
||||||
|
"logicalOperator": "AND",
|
||||||
|
"conditions": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"promql_legend": "",
|
||||||
|
"layer_type": "scatter",
|
||||||
|
"weight_fixed": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"layout": {
|
||||||
|
"x": 24,
|
||||||
|
"y": 9,
|
||||||
|
"w": 24,
|
||||||
|
"h": 9,
|
||||||
|
"i": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"variables": {
|
||||||
|
"list": []
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user