Развернуть observability-стек: Collector, Tempo, cAdvisor, node-exporter
Профиль observability: otel-collector (приём OTLP) -> tempo (трейсы), cadvisor/node-exporter (ресурсы) в Prometheus, дашборды Deal-Traces и Deal-Resources, datasource Tempo и связь логов с трейсами, алерты по ресурсам; OTel-env у всех процессов.
This commit is contained in:
@@ -108,6 +108,9 @@ services:
|
|||||||
Storage__Minio__SecretKey: deal_minio_secret
|
Storage__Minio__SecretKey: deal_minio_secret
|
||||||
Storage__Minio__Bucket: deal-files
|
Storage__Minio__Bucket: deal-files
|
||||||
Storage__Minio__Secure: "false"
|
Storage__Minio__Secure: "false"
|
||||||
|
# Трейсинг OTel → коллектор профиля observability (без коллектора трейсы не экспортируются).
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: core
|
||||||
ports:
|
ports:
|
||||||
- "5080:5080"
|
- "5080:5080"
|
||||||
- "5082:5082" # gRPC-ингресс telegram-service (сервисы ходят на http://core:5082 внутри сети)
|
- "5082:5082" # gRPC-ингресс telegram-service (сервисы ходят на http://core:5082 внутри сети)
|
||||||
@@ -146,6 +149,8 @@ services:
|
|||||||
DEAL_TELEGRAM_SESSION_KEY: ${DEAL_TELEGRAM_SESSION_KEY:-ZmVkY2JhOTg3NjU0MzIxMGZlZGNiYTk4NzY1NDMyMTA=}
|
DEAL_TELEGRAM_SESSION_KEY: ${DEAL_TELEGRAM_SESSION_KEY:-ZmVkY2JhOTg3NjU0MzIxMGZlZGNiYTk4NzY1NDMyMTA=}
|
||||||
DEAL_TELEGRAM_SESSION_DIR: /data/sessions
|
DEAL_TELEGRAM_SESSION_DIR: /data/sessions
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: telegram-service
|
||||||
SERVICES__CORE__INGRESS: ${DEAL_CORE_INGRESS:-http://core:5082}
|
SERVICES__CORE__INGRESS: ${DEAL_CORE_INGRESS:-http://core:5082}
|
||||||
ports:
|
ports:
|
||||||
- "5101:5101"
|
- "5101:5101"
|
||||||
@@ -176,6 +181,8 @@ services:
|
|||||||
GRPC_PORT: "5102"
|
GRPC_PORT: "5102"
|
||||||
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:-deal_dev_service_token}
|
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:-deal_dev_service_token}
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: ai-service
|
||||||
ports:
|
ports:
|
||||||
- "5102:5102"
|
- "5102:5102"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -203,6 +210,8 @@ services:
|
|||||||
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:-deal_dev_service_token}
|
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:-deal_dev_service_token}
|
||||||
DEAL_ML_DATA_DIR: /data/ml # файлы моделей data/ml/<tenantId>.sqlite на volume deal_ml_data (Ruling 4/12)
|
DEAL_ML_DATA_DIR: /data/ml # файлы моделей data/ml/<tenantId>.sqlite на volume deal_ml_data (Ruling 4/12)
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: ml-service
|
||||||
ports:
|
ports:
|
||||||
- "5103:5103"
|
- "5103:5103"
|
||||||
volumes:
|
volumes:
|
||||||
@@ -233,6 +242,8 @@ services:
|
|||||||
DEAL_STORAGE_BUCKET: deal-attachments
|
DEAL_STORAGE_BUCKET: deal-attachments
|
||||||
DEAL_STORAGE_SECURE: "false"
|
DEAL_STORAGE_SECURE: "false"
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: storage-service
|
||||||
ports:
|
ports:
|
||||||
- "5104:5104"
|
- "5104:5104"
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -261,6 +272,66 @@ services:
|
|||||||
- ./observability/prometheus-rules.yml:/etc/prometheus/prometheus-rules.yml:ro
|
- ./observability/prometheus-rules.yml:/etc/prometheus/prometheus-rules.yml:ro
|
||||||
- deal_prometheus_data:/prometheus
|
- deal_prometheus_data:/prometheus
|
||||||
|
|
||||||
|
# OpenTelemetry Collector — приём трейсов Deal-процессов (OTLP) → Tempo (профиль observability).
|
||||||
|
otel-collector:
|
||||||
|
image: otel/opentelemetry-collector-contrib:0.160.0
|
||||||
|
container_name: deal-otel-collector
|
||||||
|
profiles: ["observability"]
|
||||||
|
command: ["--config=/etc/otelcol-contrib/config.yaml"]
|
||||||
|
ports:
|
||||||
|
- "4317:4317"
|
||||||
|
- "4318:4318"
|
||||||
|
volumes:
|
||||||
|
- ./observability/otel-collector.yml:/etc/otelcol-contrib/config.yaml:ro
|
||||||
|
depends_on:
|
||||||
|
tempo:
|
||||||
|
condition: service_started
|
||||||
|
|
||||||
|
# Tempo — хранилище трейсов (OTLP от коллектора), UI/API — :3200 (профиль observability).
|
||||||
|
tempo:
|
||||||
|
image: grafana/tempo:2.8.1
|
||||||
|
container_name: deal-tempo
|
||||||
|
profiles: ["observability"]
|
||||||
|
command: ["-config.file=/etc/tempo.yml"]
|
||||||
|
ports:
|
||||||
|
- "3200:3200"
|
||||||
|
volumes:
|
||||||
|
- ./observability/tempo.yml:/etc/tempo.yml:ro
|
||||||
|
- deal_tempo_data:/var/tempo
|
||||||
|
|
||||||
|
# cAdvisor — ресурсы контейнеров (CPU/RAM/сеть/диск); scrape — job cadvisor.
|
||||||
|
cadvisor:
|
||||||
|
image: gcr.io/cadvisor/cadvisor:v0.52.1
|
||||||
|
container_name: deal-cadvisor
|
||||||
|
profiles: ["observability"]
|
||||||
|
privileged: true
|
||||||
|
devices:
|
||||||
|
- /dev/kmsg:/dev/kmsg
|
||||||
|
volumes:
|
||||||
|
- /:/rootfs:ro
|
||||||
|
- /var/run:/var/run:ro
|
||||||
|
- /sys:/sys:ro
|
||||||
|
- /var/lib/docker/:/var/lib/docker:ro
|
||||||
|
- /dev/disk/:/dev/disk:ro
|
||||||
|
|
||||||
|
# node-exporter — ресурсы хоста (CPU/RAM/диск/сеть); scrape — job node-exporter.
|
||||||
|
node-exporter:
|
||||||
|
image: prom/node-exporter:v1.9.1
|
||||||
|
container_name: deal-node-exporter
|
||||||
|
profiles: ["observability"]
|
||||||
|
command:
|
||||||
|
- --path.procfs=/host/proc
|
||||||
|
- --path.sysfs=/host/sys
|
||||||
|
- --path.rootfs=/host/root
|
||||||
|
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
|
||||||
|
ports:
|
||||||
|
- "9100:9100"
|
||||||
|
volumes:
|
||||||
|
- /proc:/host/proc:ro
|
||||||
|
- /sys:/host/sys:ro
|
||||||
|
- /:/host/root:ro,rslave
|
||||||
|
pid: host
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
deal_pgdata:
|
deal_pgdata:
|
||||||
deal_minio_data:
|
deal_minio_data:
|
||||||
@@ -268,3 +339,4 @@ volumes:
|
|||||||
deal_ml_data:
|
deal_ml_data:
|
||||||
deal_api_data:
|
deal_api_data:
|
||||||
deal_prometheus_data:
|
deal_prometheus_data:
|
||||||
|
deal_tempo_data:
|
||||||
|
|||||||
+71
-4
@@ -8,10 +8,10 @@
|
|||||||
# core (:5080 HTTP + :5082 gRPC-ингресс), telegram-service (:5101), ai-service (:5102),
|
# core (:5080 HTTP + :5082 gRPC-ингресс), telegram-service (:5101), ai-service (:5102),
|
||||||
# ml-service (:5103) — процессы «Дейла»; mTLS-транспорт — по env Ruling 6 (см. ниже);
|
# ml-service (:5103) — процессы «Дейла»; mTLS-транспорт — по env Ruling 6 (см. ниже);
|
||||||
# caddy — edge: TLS-терминация, статика фронта, reverse_proxy /api → core.
|
# caddy — edge: TLS-терминация, статика фронта, reverse_proxy /api → core.
|
||||||
# loki/promtail/grafana/prometheus — observability (Ruling 7; метрики — этап 12, пакет A): ПРОФИЛЬ
|
# observability (ПРОФИЛЬ `observability`) — современный стек: otel-collector (приём трейсов OTLP),
|
||||||
# `observability` — поднимается только: docker compose --profile observability up -d
|
# tempo (хранилище трейсов), loki/promtail (логи), prometheus (метрики),
|
||||||
# (или ... up -d --profile observability). Prometheus scrape'ит /metrics
|
# cadvisor/node-exporter (потребление ресурсов контейнеров/хоста), grafana (UI).
|
||||||
# (порт 9464) всех 4 процессов; Grafana — логи (Loki) и метрики (Prometheus).
|
# Подъём: docker compose --profile observability up -d.
|
||||||
#
|
#
|
||||||
# Секреты — ТОЛЬКО из env: шаблон deploy/.env.prod.example → скопируйте в deploy/.env.prod,
|
# Секреты — ТОЛЬКО из env: шаблон deploy/.env.prod.example → скопируйте в deploy/.env.prod,
|
||||||
# заполните значения и запускайте с --env-file:
|
# заполните значения и запускайте с --env-file:
|
||||||
@@ -132,6 +132,9 @@ services:
|
|||||||
Storage__Minio__SecretKey: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD не задан}
|
Storage__Minio__SecretKey: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD не задан}
|
||||||
Storage__Minio__Bucket: deal-files
|
Storage__Minio__Bucket: deal-files
|
||||||
Storage__Minio__Secure: "false"
|
Storage__Minio__Secure: "false"
|
||||||
|
# Трейсинг OTel → коллектор профиля observability; без коллектора трейсы не экспортируются.
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: core
|
||||||
# mTLS внутреннего gRPC (Ruling 6; пути — /etc/deal/certs, см. volume ниже).
|
# mTLS внутреннего gRPC (Ruling 6; пути — /etc/deal/certs, см. volume ниже).
|
||||||
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
||||||
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
||||||
@@ -172,6 +175,8 @@ services:
|
|||||||
DEAL_TELEGRAM_SESSION_KEY: ${DEAL_TELEGRAM_SESSION_KEY:?DEAL_TELEGRAM_SESSION_KEY не задан (ключ AES-GCM сессий)}
|
DEAL_TELEGRAM_SESSION_KEY: ${DEAL_TELEGRAM_SESSION_KEY:?DEAL_TELEGRAM_SESSION_KEY не задан (ключ AES-GCM сессий)}
|
||||||
DEAL_TELEGRAM_SESSION_DIR: /data/sessions
|
DEAL_TELEGRAM_SESSION_DIR: /data/sessions
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: telegram-service
|
||||||
SERVICES__CORE__INGRESS: ${DEAL_CORE_INGRESS:-http://core:5082}
|
SERVICES__CORE__INGRESS: ${DEAL_CORE_INGRESS:-http://core:5082}
|
||||||
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
||||||
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
||||||
@@ -201,6 +206,8 @@ services:
|
|||||||
GRPC_PORT: "5102"
|
GRPC_PORT: "5102"
|
||||||
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:?DEAL_SERVICE_TOKEN не задан}
|
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:?DEAL_SERVICE_TOKEN не задан}
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: ai-service
|
||||||
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
||||||
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
||||||
DEAL_MTLS_SERVER_CERT_PFX: /etc/deal/certs/ai-service-server.pfx
|
DEAL_MTLS_SERVER_CERT_PFX: /etc/deal/certs/ai-service-server.pfx
|
||||||
@@ -229,6 +236,8 @@ services:
|
|||||||
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:?DEAL_SERVICE_TOKEN не задан}
|
DEAL_SERVICE_TOKEN: ${DEAL_SERVICE_TOKEN:?DEAL_SERVICE_TOKEN не задан}
|
||||||
DEAL_ML_DATA_DIR: /data/ml
|
DEAL_ML_DATA_DIR: /data/ml
|
||||||
DEAL_LOGS_DIR: /tmp/logs
|
DEAL_LOGS_DIR: /tmp/logs
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT: ${DEAL_OTEL_ENDPOINT:-http://otel-collector:4317}
|
||||||
|
OTEL_SERVICE_NAME: ml-service
|
||||||
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
DEAL_MTLS_ENABLED: ${DEAL_MTLS_ENABLED:-0}
|
||||||
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
DEAL_MTLS_CA_PEM: /etc/deal/certs/ca.pem
|
||||||
DEAL_MTLS_SERVER_CERT_PFX: /etc/deal/certs/ml-service-server.pfx
|
DEAL_MTLS_SERVER_CERT_PFX: /etc/deal/certs/ml-service-server.pfx
|
||||||
@@ -334,6 +343,63 @@ services:
|
|||||||
condition: service_started
|
condition: service_started
|
||||||
prometheus:
|
prometheus:
|
||||||
condition: service_started
|
condition: service_started
|
||||||
|
tempo:
|
||||||
|
condition: service_started
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# ── Трейсы и ресурсы (observability-стек) ─────────────────────────────────
|
||||||
|
# OpenTelemetry Collector — приёмник трейсов Deal-процессов (OTLP gRPC :4317 / HTTP :4318),
|
||||||
|
# батчит и перекладывает в Tempo. Наружу порты не публикуются (внутри compose-сети).
|
||||||
|
otel-collector:
|
||||||
|
image: otel/opentelemetry-collector-contrib:0.160.0
|
||||||
|
profiles: ["observability"]
|
||||||
|
command: ["--config=/etc/otelcol-contrib/config.yaml"]
|
||||||
|
volumes:
|
||||||
|
- ./observability/otel-collector.yml:/etc/otelcol-contrib/config.yaml:ro
|
||||||
|
depends_on:
|
||||||
|
tempo:
|
||||||
|
condition: service_started
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Tempo — хранилище трейсов (OTLP от коллектора). Retention блоков — 7 суток (см. tempo.yml).
|
||||||
|
tempo:
|
||||||
|
image: grafana/tempo:2.8.1
|
||||||
|
profiles: ["observability"]
|
||||||
|
command: ["-config.file=/etc/tempo.yml"]
|
||||||
|
volumes:
|
||||||
|
- ./observability/tempo.yml:/etc/tempo.yml:ro
|
||||||
|
- deal_tempo_data:/var/tempo
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# cAdvisor — ресурсы контейнеров (CPU/RAM/сеть/диск); scrape — job cadvisor в prometheus.yml.
|
||||||
|
cadvisor:
|
||||||
|
image: gcr.io/cadvisor/cadvisor:v0.52.1
|
||||||
|
profiles: ["observability"]
|
||||||
|
privileged: true
|
||||||
|
devices:
|
||||||
|
- /dev/kmsg:/dev/kmsg
|
||||||
|
volumes:
|
||||||
|
- /:/rootfs:ro
|
||||||
|
- /var/run:/var/run:ro
|
||||||
|
- /sys:/sys:ro
|
||||||
|
- /var/lib/docker/:/var/lib/docker:ro
|
||||||
|
- /dev/disk/:/dev/disk:ro
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# node-exporter — ресурсы хоста (CPU/RAM/диск/сеть); scrape — job node-exporter в prometheus.yml.
|
||||||
|
node-exporter:
|
||||||
|
image: prom/node-exporter:v1.9.1
|
||||||
|
profiles: ["observability"]
|
||||||
|
command:
|
||||||
|
- --path.procfs=/host/proc
|
||||||
|
- --path.sysfs=/host/sys
|
||||||
|
- --path.rootfs=/host/root
|
||||||
|
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
|
||||||
|
volumes:
|
||||||
|
- /proc:/host/proc:ro
|
||||||
|
- /sys:/host/sys:ro
|
||||||
|
- /:/host/root:ro,rslave
|
||||||
|
pid: host
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
@@ -343,6 +409,7 @@ volumes:
|
|||||||
deal_ml_data:
|
deal_ml_data:
|
||||||
deal_api_data:
|
deal_api_data:
|
||||||
deal_caddy_data:
|
deal_caddy_data:
|
||||||
|
deal_tempo_data:
|
||||||
deal_caddy_config:
|
deal_caddy_config:
|
||||||
deal_loki_data:
|
deal_loki_data:
|
||||||
deal_promtail_data:
|
deal_promtail_data:
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Observability-стек «Дейла»
|
||||||
|
|
||||||
|
Современный (vendor-neutral) стек мониторинга. Поднимается **профилем `observability`** (в prod —
|
||||||
|
`deploy/compose.prod.yml`, в dev — `deploy/compose.dev.yml`); наружу порты не публикуются (prod —
|
||||||
|
доступ оператору по SSH-туннелю).
|
||||||
|
|
||||||
|
## Состав и поток данных
|
||||||
|
|
||||||
|
| Слой | Сервис | Конфиг | Поток |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Трейсы (приём) | `otel-collector` | `otel-collector.yml` | OTLP от сервисов (`:4317`) → Tempo |
|
||||||
|
| Трейсы (хранение) | `tempo` | `tempo.yml` | OTLP от коллектора, retention 7 сут. |
|
||||||
|
| Логи | `loki` + `promtail` | `loki.yml`, `promtail.yml` | docker-логи → Loki |
|
||||||
|
| Метрики | `prometheus` | `prometheus.yml`, `prometheus-rules.yml` | scrape `/metrics` процессов и `cadvisor`/`node-exporter` |
|
||||||
|
| Ресурсы контейнеров | `cadvisor` | — | Prometheus |
|
||||||
|
| Ресурсы хоста | `node-exporter` | — | Prometheus |
|
||||||
|
| Визуализация | `grafana` | `grafana/provisioning/**` | Loki + Prometheus + Tempo |
|
||||||
|
|
||||||
|
## Подъём
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# prod (нужен deploy/.env.prod с DEAL_GRAFANA_ADMIN_PASSWORD)
|
||||||
|
docker compose --env-file deploy/.env.prod -f deploy/compose.prod.yml --profile observability up -d
|
||||||
|
|
||||||
|
# dev
|
||||||
|
docker compose -f deploy/compose.dev.yml --profile observability up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка: Prometheus `/targets` (job `deal` — 4 процесса UP, `cadvisor`, `node-exporter`, `tempo`) →
|
||||||
|
Grafana → папка «Дейл» → `Deal-Metrics-Overview` / `Deal-Logs` / `Deal-Traces` / `Deal-Resources`.
|
||||||
|
|
||||||
|
## Подключение сервисов (код)
|
||||||
|
|
||||||
|
Общая настройка — `Deal.Grpc.Hosting` (сервисы) и `Deal.Api/Observability` (ядро):
|
||||||
|
|
||||||
|
- **метрики**: `DealMetricsHosting` — OTel → Prometheus, отдельный HTTP/1.1-эндпоинт `/metrics:9464`
|
||||||
|
(env `METRICS_PORT`);
|
||||||
|
- **трейсы**: `DealTracingHosting` — OTel → OTLP, включается env `OTEL_EXPORTER_OTLP_ENDPOINT`
|
||||||
|
(адрес коллектора; без него трейсинг выключен), имя сервиса — `OTEL_SERVICE_NAME`;
|
||||||
|
- **логи**: Serilog JSON обогащается `TraceId`/`SpanId` (`TraceContextEnricher`) для связи с трейсами.
|
||||||
|
|
||||||
|
## Дашборды и алерты
|
||||||
|
|
||||||
|
Дашборды — как код: `grafana/dashboards/*.json` (правки только в репозитории, UI не сохраняет).
|
||||||
|
Алерты — `prometheus-rules.yml` (доступность, ошибки/5xx, очереди, ресурсы хоста и контейнеров).
|
||||||
|
|
||||||
|
## Обновление версий образов
|
||||||
|
|
||||||
|
Версии зафиксированы в compose-файлах. При обновлении — свежие стабильные теги:
|
||||||
|
`otel/opentelemetry-collector-contrib`, `grafana/tempo`, `prom/node-exporter`,
|
||||||
|
`gcr.io/cadvisor/cadvisor`, `grafana/loki`, `grafana/promtail`, `prom/prometheus`, `grafana/grafana`.
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"editable": true,
|
||||||
|
"graphTooltip": 0,
|
||||||
|
"id": null,
|
||||||
|
"links": [],
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Потребление CPU контейнерами Deal (cAdvisor). Значение — ядра, занятые контейнером за 5 минут.",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"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": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "sum by (name) (rate(container_cpu_usage_seconds_total{name=~\".*deal.*|.*core.*|.*service.*\"}[5m]))",
|
||||||
|
"legendFormat": "{{name}}",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "CPU контейнеров (cAdvisor)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Рабочий набор памяти контейнеров Deal (cAdvisor). Лимиты заданы mem_limit в compose.prod.yml.",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineWidth": 1,
|
||||||
|
"showPoints": "never"
|
||||||
|
},
|
||||||
|
"unit": "bytes"
|
||||||
|
},
|
||||||
|
"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": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "sum by (name) (container_memory_working_set_bytes{name=~\".*deal.*|.*core.*|.*service.*\"})",
|
||||||
|
"legendFormat": "{{name}}",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Память контейнеров (cAdvisor)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Загрузка CPU хоста (node-exporter), 0–100%.",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineWidth": 1,
|
||||||
|
"showPoints": "never"
|
||||||
|
},
|
||||||
|
"max": 100,
|
||||||
|
"min": 0,
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"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": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
|
||||||
|
"legendFormat": "CPU хоста",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "CPU хоста (node-exporter)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Занятая память хоста (node-exporter), проценты от общего объёма.",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineWidth": 1,
|
||||||
|
"showPoints": "never"
|
||||||
|
},
|
||||||
|
"max": 100,
|
||||||
|
"min": 0,
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"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": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100",
|
||||||
|
"legendFormat": "Память хоста",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Память хоста (node-exporter)",
|
||||||
|
"type": "timeseries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"description": "Свободное место на разделах хоста (node-exporter), проценты.",
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"custom": {
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 15,
|
||||||
|
"lineWidth": 1,
|
||||||
|
"showPoints": "never"
|
||||||
|
},
|
||||||
|
"max": 100,
|
||||||
|
"min": 0,
|
||||||
|
"unit": "percent"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 8,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 16
|
||||||
|
},
|
||||||
|
"id": 5,
|
||||||
|
"options": {
|
||||||
|
"legend": {
|
||||||
|
"calcs": [],
|
||||||
|
"displayMode": "list",
|
||||||
|
"placement": "bottom",
|
||||||
|
"showLegend": true
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"mode": "multi",
|
||||||
|
"sort": "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "prometheus"
|
||||||
|
},
|
||||||
|
"expr": "min by (mountpoint) (node_filesystem_avail_bytes{fstype!~\"tmpfs|overlay\"} / node_filesystem_size_bytes{fstype!~\"tmpfs|overlay\"}) * 100",
|
||||||
|
"legendFormat": "{{mountpoint}}",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Свободное место на диске (node-exporter)",
|
||||||
|
"type": "timeseries"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"refresh": "30s",
|
||||||
|
"schemaVersion": 39,
|
||||||
|
"tags": [
|
||||||
|
"deal",
|
||||||
|
"resources"
|
||||||
|
],
|
||||||
|
"templating": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-6h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timezone": "browser",
|
||||||
|
"title": "Deal — Ресурсы",
|
||||||
|
"uid": "deal-resources",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"editable": true,
|
||||||
|
"graphTooltip": 0,
|
||||||
|
"id": null,
|
||||||
|
"links": [],
|
||||||
|
"panels": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "tempo",
|
||||||
|
"uid": "tempo"
|
||||||
|
},
|
||||||
|
"description": "Поиск трейсов Deal (Tempo, TraceQL). Источник — OTLP от сервисов через otel-collector. Клик по трейсу — спаны по сервисам; из спана можно перейти к логам (Loki) по traceId.",
|
||||||
|
"gridPos": {
|
||||||
|
"h": 22,
|
||||||
|
"w": 24,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
"id": 1,
|
||||||
|
"options": {},
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "tempo",
|
||||||
|
"uid": "tempo"
|
||||||
|
},
|
||||||
|
"query": "{}",
|
||||||
|
"queryType": "traceql",
|
||||||
|
"refId": "A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Трейсы (Tempo)",
|
||||||
|
"type": "traces"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"refresh": "30s",
|
||||||
|
"schemaVersion": 39,
|
||||||
|
"tags": [
|
||||||
|
"deal",
|
||||||
|
"traces"
|
||||||
|
],
|
||||||
|
"templating": {
|
||||||
|
"list": []
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"from": "now-1h",
|
||||||
|
"to": "now"
|
||||||
|
},
|
||||||
|
"timezone": "browser",
|
||||||
|
"title": "Deal — Трейсы",
|
||||||
|
"uid": "deal-traces",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
@@ -13,6 +13,12 @@ datasources:
|
|||||||
isDefault: true
|
isDefault: true
|
||||||
jsonData:
|
jsonData:
|
||||||
maxLines: 1000
|
maxLines: 1000
|
||||||
|
# Клик по TraceId в логе открывает трейс в Tempo (обогащение логов TraceContextEnricher).
|
||||||
|
derivedFields:
|
||||||
|
- name: TraceID
|
||||||
|
matcherRegex: '"TraceId":"([0-9a-f]+)"'
|
||||||
|
datasourceUid: tempo
|
||||||
|
url: "$${__value.raw}"
|
||||||
|
|
||||||
- name: Prometheus
|
- name: Prometheus
|
||||||
# UID фиксирован: на него ссылаются панели дашборда Deal-Metrics-Overview (datasource uid: prometheus).
|
# UID фиксирован: на него ссылаются панели дашборда Deal-Metrics-Overview (datasource uid: prometheus).
|
||||||
@@ -26,3 +32,24 @@ datasources:
|
|||||||
# Prometheus хранит OTel-гистограммы в нативных bucket'ах — используем нативные histogram_quantile.
|
# Prometheus хранит OTel-гистограммы в нативных bucket'ах — используем нативные histogram_quantile.
|
||||||
httpMethod: POST
|
httpMethod: POST
|
||||||
timeInterval: 15s
|
timeInterval: 15s
|
||||||
|
|
||||||
|
- name: Tempo
|
||||||
|
# UID фиксирован: на него ссылаются панели Deal-Traces и derivedFields логов (datasource uid: tempo).
|
||||||
|
uid: tempo
|
||||||
|
type: tempo
|
||||||
|
access: proxy
|
||||||
|
url: http://tempo:3200
|
||||||
|
isDefault: false
|
||||||
|
jsonData:
|
||||||
|
# Из спана трейса — к логам того же сервиса и traceId (обратная корреляция Loki ↔ Tempo).
|
||||||
|
tracesToLogsV2:
|
||||||
|
datasourceUid: loki
|
||||||
|
filterByTraceID: true
|
||||||
|
filterBySpanID: false
|
||||||
|
spanStartTimeShift: -1m
|
||||||
|
spanEndTimeShift: 1m
|
||||||
|
# Карта сервисов и граф узлов — из метрик Prometheus.
|
||||||
|
serviceMap:
|
||||||
|
datasourceUid: prometheus
|
||||||
|
nodeGraph:
|
||||||
|
enabled: true
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# OpenTelemetry Collector — приёмник трейсов Deal-процессов (профиль observability).
|
||||||
|
#
|
||||||
|
# Процессы шлют OTLP (gRPC :4317 / HTTP :4318) на этот сервис; коллектор батчит и перекладывает
|
||||||
|
# трейсы в Tempo (OTLP). Запускается только профилем observability (deploy/compose.prod.yml);
|
||||||
|
# наружу порты не публикуются (внутри compose-сети).
|
||||||
|
#
|
||||||
|
# Конфиг монтируется в /etc/otelcol-contrib/config.yaml. Health-эндпоинт :13133 — для healthcheck.
|
||||||
|
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
|
||||||
|
processors:
|
||||||
|
# Батчинг снижает число сетевых вызовов к Tempo (стандартный приём OTel).
|
||||||
|
batch: {}
|
||||||
|
|
||||||
|
exporters:
|
||||||
|
otlp/tempo:
|
||||||
|
endpoint: tempo:4317
|
||||||
|
tls:
|
||||||
|
insecure: true
|
||||||
|
|
||||||
|
extensions:
|
||||||
|
health_check:
|
||||||
|
endpoint: 0.0.0.0:13133
|
||||||
|
|
||||||
|
service:
|
||||||
|
extensions: [health_check]
|
||||||
|
telemetry:
|
||||||
|
logs:
|
||||||
|
level: warn
|
||||||
|
pipelines:
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp/tempo]
|
||||||
@@ -79,3 +79,56 @@ groups:
|
|||||||
annotations:
|
annotations:
|
||||||
summary: "Растёт очередь обучения ML (outbox)"
|
summary: "Растёт очередь обучения ML (outbox)"
|
||||||
description: "Суммарная глубина MlOutbox держится выше 100 более 15 минут ({{ $value }})."
|
description: "Суммарная глубина MlOutbox держится выше 100 более 15 минут ({{ $value }})."
|
||||||
|
|
||||||
|
- name: deal-resources
|
||||||
|
rules:
|
||||||
|
# Хост: загрузка CPU/память/диск. Источник — node-exporter. Пороги «мягкие» — оператор уточняет.
|
||||||
|
- alert: DealHostHighCpu
|
||||||
|
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
|
||||||
|
for: 10m
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Высокая загрузка CPU хоста"
|
||||||
|
description: "Средняя загрузка CPU хоста выше 90% за 5 минут более 10 минут."
|
||||||
|
|
||||||
|
- alert: DealHostHighMemory
|
||||||
|
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
|
||||||
|
for: 10m
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Высокое потребление памяти хостом"
|
||||||
|
description: "Свободной памяти меньше 10% более 10 минут."
|
||||||
|
|
||||||
|
- alert: DealHostDiskLow
|
||||||
|
expr: |
|
||||||
|
min by (mountpoint) (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) < 0.15
|
||||||
|
for: 15m
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Мало места на диске ({{ $labels.mountpoint }})"
|
||||||
|
description: "Свободно менее 15% на разделе {{ $labels.mountpoint }} более 15 минут."
|
||||||
|
|
||||||
|
# Контейнеры Deal: CPU и память против лимита (mem_limit/cpus в compose). Источник — cAdvisor.
|
||||||
|
- alert: DealContainerHighCpu
|
||||||
|
expr: |
|
||||||
|
sum by (name) (rate(container_cpu_usage_seconds_total{name=~".*deal.*|.*core.*|.*service.*"}[5m])) > 1.5
|
||||||
|
for: 10m
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Высокий CPU контейнера {{ $labels.name }}"
|
||||||
|
description: "Контейнер {{ $labels.name }} держит > 1.5 CPU за 5 минут более 10 минут."
|
||||||
|
|
||||||
|
- alert: DealContainerHighMemory
|
||||||
|
expr: |
|
||||||
|
(container_memory_working_set_bytes{name=~".*deal.*|.*core.*|.*service.*"}
|
||||||
|
/ clamp_min(container_spec_memory_limit_bytes{name=~".*deal.*|.*core.*|.*service.*"}, 1)) > 0.9
|
||||||
|
for: 10m
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Контейнер {{ $labels.name }} близок к лимиту памяти"
|
||||||
|
description: "Контейнер {{ $labels.name }} использует более 90% лимита памяти более 10 минут."
|
||||||
|
|||||||
@@ -46,3 +46,18 @@ scrape_configs:
|
|||||||
- targets: ["ml-service:9464"]
|
- targets: ["ml-service:9464"]
|
||||||
labels:
|
labels:
|
||||||
service: ml-service
|
service: ml-service
|
||||||
|
|
||||||
|
# Ресурсы контейнеров (cAdvisor) и хоста (node-exporter) — этап «observability-стек».
|
||||||
|
# cAdvisor отдаёт метрики контейнеров (CPU/RAM/сеть/диск), node-exporter — хоста.
|
||||||
|
- job_name: cadvisor
|
||||||
|
static_configs:
|
||||||
|
- targets: ["cadvisor:8080"]
|
||||||
|
|
||||||
|
- job_name: node-exporter
|
||||||
|
static_configs:
|
||||||
|
- targets: ["node-exporter:9100"]
|
||||||
|
|
||||||
|
# Темпо (хранилище трейсов) — само-мониторинг: метрики приёма/отдачи трейсов.
|
||||||
|
- job_name: tempo
|
||||||
|
static_configs:
|
||||||
|
- targets: ["tempo:3200"]
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# Grafana Tempo — хранилище трейсов Deal (профиль observability).
|
||||||
|
#
|
||||||
|
# Принимает OTLP-трейсы от OpenTelemetry Collector (grpc :4317), хранит локально (volume
|
||||||
|
# deal_tempo_data), отдаёт запросы Grafana на :3200 (внутри compose-сети). Block retention — 7 суток
|
||||||
|
# (трейсы объёмны; логи/метрики живут дольше).
|
||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 3200
|
||||||
|
log_level: warn
|
||||||
|
|
||||||
|
distributor:
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
|
||||||
|
storage:
|
||||||
|
trace:
|
||||||
|
backend: local
|
||||||
|
local:
|
||||||
|
path: /var/tempo/traces
|
||||||
|
wal:
|
||||||
|
path: /var/tempo/wal
|
||||||
|
|
||||||
|
compactor:
|
||||||
|
compaction:
|
||||||
|
block_retention: 168h
|
||||||
Reference in New Issue
Block a user