# Observability (ClickStack / HyperDX) — ohmu **Loodud 2026-09-25.** ClickStack = HyperDX UI + (väline) ClickHouse + kaasas olev OTel-kollektor. Kogu grupp on **always-on** (ei ole enam `experimental`). ## Ligipääs - UI: **http://100.87.1.24:8124/clickstack/search** (läbi `clickstack-proxy`) - UI otse: http://100.87.1.24:18080 - Kasutaja: `admin@odamus.com` / `Dev_clickhouse_2026!` - ClickHouse (väline, `clickhouse` konteiner): HTTP 8125, native 9004 (Tailscale-only) ## Arhitektuur (andmevoog) ``` node-exporter ─┐ cadvisor ──────┼─► otel-collector (scrape 60s) ─► clickstack:4317 (kaasas kollektor) ─► ClickHouse (default.otel_*) llama.cpp ─────┘ (main_ai_network) (opampsupervisor) ``` - `otel-collector` (contrib) skrape'ib node-exporter, cadvisor ja **llama.cpp** (`host.docker.internal:8070/metrics`). - Kaasas olev kollektor (clickstack konteineris) võtab configu API-lt (opamp, port 4320) ja kirjutab ClickHouse'i `otel_*` tabelitesse. - **Kriitiline:** `clickstack-entry.sh` peab käivitama `/otel-entrypoint.sh /usr/local/bin/opampsupervisor` — muidu OTLP andmed ei püsi. ## ClickHouse tabelid (default) `otel_logs`, `otel_traces`, `otel_metrics_gauge|sum|histogram|exponential_histogram|summary` + rollupid. Skeem luuakse automaatselt schema-seed'iga (goose). ## Konfiguratsioon | Fail | Sisu | |---|---| | `dev/docker-compose.yml` | `clickstack`, `clickstack-proxy`, `node-exporter`, `cadvisor`, `otel-collector` (always-on) | | `dev/config/otel-collector/config.yaml` | prometheus receiver (node/cadvisor/llamacpp) + regexp-filter + OTLP eksport | | `dev/clickstack-entry.sh` | mongod + **OTel-kollektor** + HyperDX app | | `dev/.env` | `HYPERDX_INGEST_KEY` (gitignore'itud) — kollektori OTLP auth | ### ClickStack env (olulised) - `CLICKHOUSE_ENDPOINT=tcp://clickhouse:9000?dial_timeout=10s` - `CLICKHOUSE_USER=default`, `CLICKHOUSE_PASSWORD=dev_clickhouse_2026` - `HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE=default` - `DEFAULT_CONNECTIONS=[{"name":"Local ClickHouse","host":"http://default:dev_clickhouse_2026@clickhouse:8123"}]` ## Teadaolev lõks: „X-ClickHouse HTTP headers and Authorization simultaneously" HyperDX esiosa saadab CH-proxy'le `Authorization` (Bearer) ja proxy lisab `X-ClickHouse-User/Key`. ClickHouse keeldub mõlemast korraga (Code 516). **Lahendus:** hoia ühenduse `username`/`password` **tühjad** ja pane tunnused **host-URL-i** (`http://default:parool@clickhouse:8123`) — siis läheb ainult `Authorization: Basic`. (Diagnoos: `curl -H 'X-ClickHouse-User: default' -H 'X-ClickHouse-Key: ...' -H 'Authorization: Bearer x' 'http://100.87.1.24:8125/?query=SELECT%201'`.) ## Metrikad (praegu) - **Host:** RAM (available/total), swap, load, CPU, failisüsteem, võrk (node-exporter). - **Konteinerid:** CPU, mälu (working set/usage), võrk (cadvisor). - **Mudel:** llama.cpp — prompt/ predicted tokens, requests_processing, kv_cache (`--metrics`). ## Dashboardid (retseptid) HyperDX UI-s: **Dashboards → New dashboard → Add tile**. Kasuta allolevaid metrikaid (Metrics source) või "SQL" diagrammi. Ajatelje jaoks sobib `TimeUnix`. | Paneel | Mõõdik / SQL | |---|---| | RAM vaba | `node_memory_MemAvailable_bytes` (gauge) | | Swap vaba | `node_memory_SwapFree_bytes` (gauge) | | Load | `node_load1` (gauge) | | Konteineri mälu | `container_memory_working_set_bytes` (group: `Attributes['name']`) | | Konteineri CPU | `container_cpu_usage_seconds_total` (rate) | | **Llama tokeneid/s** | `rate(llamacpp:tokens_predicted_total)` või pika aja trend | | **Llama päringud** | `llamacpp:requests_processing` (gauge), `llamacpp:tokens_predicted_total` (sum) | | **Llama KV-cache** | `llamacpp:kv_cache_usage_ratio` (gauge) | | **Teenus üleval** | `ohmu_service_up` (group: `Attributes['service']`) | | **Restardid** | `ohmu_container_restarts` (group: `Attributes['name']`) | Näidis-SQL (ClickHouse): ```sql -- Teenuste seis viimase 10 min jooksul SELECT toStartOfMinute(TimeUnix) AS t, Attributes['service'] AS service, avg(Value) AS up FROM default.otel_metrics_gauge WHERE MetricName = 'ohmu_service_up' AND TimeUnix > now() - INTERVAL 10 MINUTE GROUP BY t, service ORDER BY t; ``` ## Teadaolevad UI-nõksud ### Heatmap: „Value expression is required for heatmap charts" Chart Explorer → Heatmap nõuab, et seeria **Value expression** oleks täidetud (HyperDX valideerib `series[0].valueExpression`). See on UI-konfiguratsioon, mitte andmeviga. - **Metrics** source: vali metrika (nt `node_load1`) ja sisesta **Value** väljale `Value` (või `avg(Value)`), lisa filtrisse `MetricName`. - **Logs** source: Value väljale `count()`; "Group by" nt `ServiceName` või `SeverityText`. - Kui metrika valimine ei täida Value välja automaatselt, trüki see käsitsi. ### Metrics source peab sisaldama `metricTables.exponentialHistogram` Vaikimisi bootstrap võib selle puudumisel metrikate valija katki teha. Kontroll: ```bash docker exec clickstack mongo --quiet hyperdx --eval \ 'printjson(db.sources.findOne({kind:"metric"}).metricTables)' # vajadusel: db.sources.updateOne({kind:"metric"},{$set:{"metricTables.exponentialHistogram":"otel_metrics_exponential_histogram"}}) ``` ## Näidis-dashboardid Loodud 2026-09-25 skriptiga **`~/scripts/create_hyperdx_dashboards.py`**: - **„Ohmu — süsteem (host)"** — RAM vaba, swap vaba, load1, konteinerite mälu (host metrikad) - **„Ohmu — mudelid (llama.cpp)"** — genereeritud/prompt-tokenid, aktiivsed päringud, KV-cache - **„Ohmu — teenused ja konteinerid"** — `ohmu_service_up`, `ohmu_container_restarts` Kordamine: `python3 ~/scripts/create_hyperdx_dashboards.py` (`--delete-tests` koristab testid). **API ligipääs:** HyperDX väline API v2 on **`http://:8000/api/v2`** (hostilt konteineri IP kaudu; `clickstack-proxy` ribab `/api` prefiksi, seega `:18080` kaudu ei tööta). Access key: `docker exec clickstack mongo --quiet hyperdx --eval 'print(db.users.findOne({email:"admin@odamus.com"}).accessKey)'`. **Tile-vorming (API):** ```json {"name":"paneel","x":0,"y":0,"w":6,"h":6,"config":{ "displayType":"line","sourceId":"", "select":[{"valueExpression":"Value","aggFn":"avg","where":"MetricName:\"node_load1\""}], "groupBy":"name"}} ``` ## Alertid (Telegram) Rakendatud: **HyperDX webhook → `alert-relay` → Telegram**. - **`alert-relay`** konteiner (`dev/config/alert-relay/alert_relay.py`, `python:3.12-slim`, port 9099): võtab vastu HyperDX „generic" webhook POST-id ja saadab Telegrami. Token `dev/.env`-st (`TELEGRAM_BOT_TOKEN`), chat `5036685258`. - **Webhook:** `Telegram (ohmu)` → `http://alert-relay:9099/` (id `6ab760240c9282a5b0fde124`). - **Alert:** „Teenus maas (ohmu_service_up)" → dashboardi paneel „Teenused üleval", `thresholdType=below`, `threshold=1`, `interval=5m`, kanal webhook (id `6ab7603c0c9282a5b0fde12d`). **Oluline API-piirang:** väline API v2 (`POST /api/v2/alerts`) toetab ainult `source: "tile"` või `"saved_search"` — **`inline` alert on ainult sisemise API jaoks**. Paneeli-alert viitab: `{source:"tile", tileId, dashboardId}`; kanal: `{"type":"webhook","webhookId":"..."}`. **Testimine:** ```bash # relay otse (hostilt pole 9099 avaldatud; kasuta konteinerit võrgus): docker run --rm --network main_ai_network curlimages/curl:latest -s \ -X POST http://alert-relay:9099/ -d '{"name":"test","state":"ALERT"}' ``` Tüüpilised täiendavad alertid (sama muster: tile + webhook + below/above): - `node_memory_MemAvailable_bytes` < X (RAM otsas) - `ohmu_container_restarts` > 0 (restart-loop) - `llamacpp:kv_cache_usage_ratio` > 0.9 ## Seotud - Vahejuhtumite audit: `../LOEMIND_seisevad_konteinerid.md` - Serveri mudelid: `~/servers/LOEMIND/llama-server.md`