{ "annotations": { "list": [] }, "editable": true, "graphTooltip": 0, "id": null, "links": [], "panels": [ { "datasource": { "type": "loki", "uid": "loki" }, "description": "Живая лента логов deal-процессов: фильтры по сервису и уровню сверху. Разверните строку — детали Serilog-события (@mt, свойства, исключение). Query-строка/тела запросов в логи не пишутся (Ruling 13).", "gridPos": { "h": 12, "w": 24, "x": 0, "y": 0 }, "id": 1, "options": { "dedupStrategy": "none", "enableLogDetails": true, "showTime": true, "sortOrder": "Descending", "wrapLogMessage": true }, "targets": [ { "datasource": { "type": "loki", "uid": "loki" }, "editorMode": "code", "expr": "{service=~\"$service\", level=~\"$level\"}", "refId": "A" } ], "title": "Логи deal-процессов", "type": "logs" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Объём логов в разрезе уровня Serilog (поле @l, поднято в метку level пайплайном Promtail). Высокий Error/Fatal — детали в дашборде Deal-Errors.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 12 }, "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 (level) (count_over_time({service=~\"$service\", level=~\"$level\"} [1m]))", "legendFormat": "{{level}}", "refId": "A" } ], "title": "Строк логов по уровням, /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "Объём логов по сервисам (метка service из лейблов Promtail). Заметный провал до нуля — сервис молчит или лежит (см. также Deal-Health).", "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 12 }, "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=~\"$service\"} [1m]))", "legendFormat": "{{service}}", "refId": "A" } ], "title": "Строк логов по сервисам, /мин", "type": "timeseries" }, { "datasource": { "type": "loki", "uid": "loki" }, "description": "События с идентификатором тенанта (Serilog-поле TenantId) в логах фоновых сервисов: AI/ML-вызовы («Аудит: tenant …»), Telegram (backfill/realtime). Показывает, какие тенанты активны, по данным логов.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 1, "showPoints": "never" }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 20 }, "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": "topk(10, sum by (TenantId) (count_over_time({service=~\"ai-service|ml-service|telegram-service\"} | json | TenantId =~ \".+\" [5m])))", "legendFormat": "{{TenantId}}", "refId": "A" } ], "title": "Активность по тенантам (AI/ML/Telegram, top-10), /5мин", "type": "timeseries" }, { "gridPos": { "h": 8, "w": 12, "x": 12, "y": 20 }, "id": 5, "options": { "content": "**Действия пользователей логируются не сюда, а в аудит.** Создание/перемещение/удаление карточек, контейнеры, настройки, каналы, входы/выходы/инвайты пишутся append-only в `public.audit_log` (AuditService) и доступны через `GET /api/operator/audit` / экран «Аудит» оператор-консоли.\n\nВ логах (этат дашборд) по действиям доступны: access-логи HTTP/gRPC (метод/путь/код), аудит-строки фоновых сервисов (`Аудит: tenant …`) и идентификатор тенанта (`TenantId`). Поиск по ключевой фразе добавьте в ленту: `{service=~\"$service\"} |= \"фраза\"`.", "mode": "markdown" }, "title": "Где искать действия пользователей", "type": "text" } ], "refresh": "30s", "schemaVersion": 39, "tags": [ "deal" ], "templating": { "list": [ { "allValue": ".*", "current": { "selected": true, "text": [ "All" ], "value": [ "$__all" ] }, "datasource": { "type": "loki", "uid": "loki" }, "definition": "label_values(service)", "includeAll": true, "label": "Сервис", "multi": true, "name": "service", "options": [], "query": "label_values(service)", "refresh": 2, "regex": "", "sort": 1, "type": "query" }, { "allValue": ".*", "current": { "selected": true, "text": [ "All" ], "value": [ "$__all" ] }, "definition": "Information,Warning,Error,Fatal", "includeAll": true, "label": "Уровень", "multi": true, "name": "level", "options": [ { "selected": false, "text": "Information", "value": "Information" }, { "selected": false, "text": "Warning", "value": "Warning" }, { "selected": false, "text": "Error", "value": "Error" }, { "selected": false, "text": "Fatal", "value": "Fatal" } ], "query": "Information,Warning,Error,Fatal", "type": "custom" } ] }, "time": { "from": "now-1h", "to": "now" }, "timepicker": {}, "timezone": "", "title": "Deal-Logs", "uid": "deal-logs", "version": 1, "weekStart": "" }