{ "annotations": { "list": [] }, "editable": true, "graphTooltip": 0, "id": null, "links": [], "panels": [ { "datasource": { "type": "loki", "uid": "loki" }, "description": "HTTP-ответы 5xx по путям (access-лог core, поле StatusCode). Ручка, отдающая 5xx, обычно соответствует исключению ниже (в той же панели логов).", "fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "fillOpacity": 60, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }, "id": 1, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum by (Path) (count_over_time({service=\"core\"} | json | StatusCode >= 500 [1m]))", "legendFormat": "{{Path}}", "refId": "A" } ], "title": "HTTP 5xx по путям (core), /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Строки с необработанным исключением (Serilog-поле \"@x\") по deal-процессам. Каждое такое событие пишется access-логом/аудитом и означает баг либо недоступную зависимость.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "fillOpacity": 60, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 }, "id": 2, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum by (service) (count_over_time({service=~\"core|telegram-service|ai-service|ml-service\"} |~ \"\\\"@x\\\":\\\"\" [1m]))", "legendFormat": "{{service}}", "refId": "A" } ], "title": "Исключения по сервисам, /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Строки уровня Error/Fatal (Serilog-поле @l) по deal-процессам. Дополняет панель исключений: ловит и логированные, но не брошенные ошибки.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 20, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 }, "id": 3, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum by (service) (count_over_time({service=~\"core|telegram-service|ai-service|ml-service\"} |~ \"@l\\\":\\\"(Error|Fatal)\" [1m]))", "legendFormat": "{{service}}", "refId": "A" } ], "title": "Error/Fatal по сервисам, /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "gRPC-вызовы с не-OK статусом (access-лог RpcCallLoggingInterceptor: поля RpcMethod/GrpcStatus). Cancelled/DeadlineExceeded — клиентские отмены, Unavailable/Unknown — сбои. gRPC-health не логируется.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "fillOpacity": 60, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 }, "id": 4, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum by (service) (count_over_time({service=~\"core|telegram-service|ai-service|ml-service\"} |= \"gRPC \" | json | GrpcStatus != \"OK\" [1m]))", "legendFormat": "{{service}}", "refId": "A" } ], "title": "gRPC-вызовы с ошибкой по сервисам, /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Суммарно Error/Fatal по всем deal-процессам за 5 минут; >0 — повод открыть панель логов ниже.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 1 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 5, "w": 12, "x": 0, "y": 16 }, "id": 5, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "textMode": "auto" }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum(count_over_time({service=~\"core|telegram-service|ai-service|ml-service\"} |~ \"@l\\\":\\\"(Error|Fatal)\" [5m]))", "legendFormat": "ошибок за 5м", "refId": "A" } ], "title": "Error/Fatal за 5 мин (все сервисы)", "type": "stat" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "HTTP 5xx (core) за последний час.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 1 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 5, "w": 12, "x": 12, "y": 16 }, "id": 6, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "textMode": "auto" }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "sum(count_over_time({service=\"core\"} | json | StatusCode >= 500 [1h]))", "legendFormat": "HTTP 5xx за 1ч", "refId": "A" } ], "title": "HTTP 5xx за 1 час (core)", "type": "stat" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Строки Error/Fatal и записи с исключением (\"@x\") по всем deal-процессам. Разверните строку для текста исключения и стека.", "gridPos": { "h": 10, "w": 24, "x": 0, "y": 21 }, "id": 7, "options": { "dedupStrategy": "none", "enableLogDetails": true, "showTime": true, "sortOrder": "Descending", "wrapLogMessage": true }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "{service=~\"core|telegram-service|ai-service|ml-service\"} |~ \"@l\\\":\\\"(Error|Fatal)\"", "refId": "A" }, { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "{service=~\"core|telegram-service|ai-service|ml-service\"} |~ \"\\\"@x\\\":\\\"\"", "refId": "B" } ], "title": "Лента ошибок и исключений", "type": "logs" } ], "refresh": "30s", "schemaVersion": 39, "tags": [ "deal" ], "templating": { "list": [] }, "time": { "from": "now-6h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "Deal-Errors", "uid": "deal-errors", "version": 1, "weekStart": "" }