# Observability (ClickStack / HyperDX) — ohmu **Loodud 2026-09-25; migreeritud C-full arhitektuurile 2026-10-03.** ClickStack = HyperDX UI (app-only) + eraldi MongoDB (rakenduse olek) + ametlik ClickStack OTel-kollektor + (väline) ClickHouse. Kogu grupp on **always-on**. ## Ligipääs - UI (kanooniline): **http://100.87.1.24:18080** - `8124/clickstack` → **302 → 18080** (ühtlustatud; ClickHouse'i bundle'itud local-mode UI-d ei kasutata) - Kasutaja: `admin@odamus.com` / `Dev_clickhouse_2026!` - ClickHouse (väline, `clickhouse` konteiner): HTTP 8125, native 9004 (Tailscale-only) ## Arhitektuur (andmevoog) — C-full (2026-10-03) ``` node-exporter ─┐ cadvisor ──────┼─► otel-collector (clickstack-otel-collector:2) ─┐ llama.cpp ─────┘ prometheus (custom.config) │ konteinerilogid ─► filelog (custom.config) ──────────────────────┼─► ClickHouse (default.otel_*) app/SDK OTLP ────► OTLP receiver (base, OpAMP kaudu app'ist) ────┘ ▲ base config: app OpAMP (:4320) app (HyperDX, app-only) ── MONGO_URI ──► clickstack-db (mongo:5.0.32) ``` - `clickstack` = **app-only** (`docker.hyperdx.io/hyperdx/hyperdx:2.37.0`) — UI+API, OpAMP server (4320), `MONGO_URI`. - `clickstack-db` = **mongo:5.0.32** — rakenduse olek (sources/dashboards/alerts/users), migreeritud all-in-one'ist (mongodump/restore). - `otel-collector` = **ametlik** `docker.clickhouse.com/clickhouse/clickstack-otel-collector:2` — base config tuleb app'ist (OpAMP), skeem/rollupid; `CUSTOM_OTELCOL_CONFIG_FILE` lisab hosti-meetrikad + konteinerilogid. - ClickHouse on **väline** (eraldi konteiner). - ⚠️ UI-chunkide patchid (heatmap/CTE/valideerimine) on seotud app-versiooniga **2.37.0** — hoia app pin'itud. - ℹ️ Varem oli `hyperdx-all-in-one` (dubleeris ClickHouse+Mongo). Migratsiooni backup: `/data/backups/clickstack-migration-/` (compose/config + mongodump). ## ClickHouse tabelid (default) `otel_logs`, `otel_traces`, `otel_metrics_*` + rollupid, `hyperdx_sessions` (session replays). Skeem luuakse ametliku kollektori schema-seed'iga. ## Konfiguratsioon | Fail | Sisu | |---|---| | `dev/docker-compose.yml` | `clickstack` (app), `clickstack-db` (mongo), `otel-collector`, `clickstack-proxy`, `node-exporter`, `cadvisor`, `otel-ratelimit`, `alert-relay` | | `dev/config/otel-collector/custom.config.yaml` | prometheus (node/cadvisor/llamacpp) + filelog (konteinerilogid) + filtrid; pipeline'id → base `clickhouse` | | `dev/config/clickstack-proxy/nginx.conf` | 8124 proxy (`/clickstack/`→302, `/api/`→app, `/`→ClickHouse) | | `dev/config/otel-ratelimit/nginx.conf` | rate-limit `otel.odamus.com` → `otel-collector:4318` | | `dev/config/alert-relay/alert_relay.py` | HyperDX webhook → Telegram | | `dev/.env` | `HYPERDX_INGEST_KEY`, `TELEGRAM_BOT_TOKEN` jm (gitignore'itud) | ### ClickStack env (olulised) - App: `MONGO_URI=mongodb://clickstack-db:27017/hyperdx`, `HYPERDX_API_KEY=...`, `OPAMP_PORT=4320`, `OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318`, `NEXT_PUBLIC_OTEL_EXPORTER_OTLP_ENDPOINT=http://100.87.1.24:4318` (brauser / session replay). - Collector: `CLICKHOUSE_ENDPOINT=tcp://clickhouse:9000?dial_timeout=10s`, `CLICKHOUSE_USER/PASSWORD`, `HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE=default`, `OPAMP_SERVER_URL=http://clickstack:4320`, `CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml`. - `DEFAULT_CONNECTIONS=[{"name":"Local ClickHouse","host":"http://clickhouse:8123","username":"default","password":"dev_clickhouse_2026"}]` ## ClickHouse ühendus (HyperDX Connections) — ÕIGE seadistus Ühendusel peavad olema **eraldi väljad** `username`/`password` ja `host` **ilma userinfo'ta** (`http://clickhouse:8123`). Siis lisab CH-proxy `X-ClickHouse-User`/`Key` päised. > ❗ **Local mode peab olema VÄLJAS:** `NEXT_PUBLIC_IS_LOCAL_MODE=false`. > Koos välise (mitte-image'sisese) ClickHouse'iga põhjustab `true` selle, et brauser > kasutab lokaalset ühendust (sessionStorage/`__ENV.js`) ja saadab ise `Authorization`/ > `user=` → proxy lisab omakorda `X-ClickHouse-*` → **Code 516** või `UNKNOWN_USER`. > Väärtus injekteeritakse **runtime'is** `public/__ENV.js` kaudu → piisab > `docker compose up -d --force-recreate clickstack` (kontroll: `cat .../public/__ENV.js`). > ❗ Varasem soovitus hoida `username`/`password` tühjad ja panna tunnused > host-URL-i (`http://default:parool@clickhouse:8123`) **ei tööta**: `http-proxy-middleware` > ei edasta host-URL-i parooli → CH saab kasutaja `default` tühja parooliga → > „Authentication failed: password is incorrect". (Kinnitatud `tcpdump -i any 'tcp port 8123'`-ga.) Mongo otsene parandus: ```javascript db.connections.updateOne({_id: ObjectId("")}, {$set:{host:"http://clickhouse:8123", username:"default", password:"dev_clickhouse_2026"}}); ``` > Pärast otsest mongo-muudatust **taaskäivita `clickstack`** (muidu jääb vahemällu): > `docker restart clickstack`. **Code 516 hoiatus:** kui ühendusel on `username` JA päring sisaldab `user=` query-param, tuleb `Code: 516 ... X-ClickHouse HTTP headers and authentication via parameters simultaneously`. Seetõttu ei tohi ühendust anda browseri CH-kliendile koos username'iga; HyperDX metadataklient (`W({queryTimeout})`) ehitab kliendi **ilma** username'ita → OK. ## Logide kogumine (filelog) `otel-collector` loeb Dockeri konteineriloge: - `receivers.filelog`: `include: /var/lib/docker/containers/*/*-json.log`, `container` parser, `start_at: end` - `service.pipelines.logs`: `[filelog] → [memory_limiter, batch] → [otlp]` - Compose: `otel-collector` vajab **mounti** `/var/lib/docker/containers:/var/lib/docker/containers:ro` **ja `user: "0:0"`** (mitte-root kasutaja → „open .: permission denied"). - Kontroll: `SELECT count(), max(Timestamp) FROM default.otel_logs`. ## 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 ### Metrika-paneeli `select` skeem (HyperDX 2.37) Metrika-diagramm ja alert nõuavad, et `select[]` elemendil oleks: `{metricName, metricType, aggFn, isDelta, filters: [], valueExpression: "Value"}`, kus `metricType` ∈ `gauge|sum|histogram|summary|exponential histogram`. Vana `aggCondition`-ainult kuju annab **`no query support for metric type=undefined`**. `valueExpression` on vajalik, sest alerti config lisab `variables` → macro-töötlus loeb `select[].valueExpression` (puudumisel `TypeError: Cannot read properties of undefined (reading 'length')`). `metricType` määra ClickHouse'i tabeli järgi (`otel_metrics_gauge|sum|histogram|...`): nt `llamacpp:tokens_predicted_total` → `sum`, `node_load1`/`ohmu_service_up` → `gauge`. **`groupBy` peab olema `Attributes['