Loodud 2026-09-25. ClickStack = HyperDX UI + (väline) ClickHouse + kaasas olev
OTel-kollektor. Kogu grupp on always-on (ei ole enam experimental).
clickstack-proxy)admin@odamus.com / Dev_clickhouse_2026!clickhouse konteiner): HTTP 8125, native 9004 (Tailscale-only)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).otel_* tabelitesse.clickstack-entry.sh peab käivitama /otel-entrypoint.sh /usr/local/bin/opampsupervisor — muidu OTLP andmed ei püsi.otel_logs, otel_traces, otel_metrics_gauge|sum|histogram|exponential_histogram|summary + rollupid.
Skeem luuakse automaatselt schema-seed'iga (goose).
| 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 |
CLICKHOUSE_ENDPOINT=tcp://clickhouse:9000?dial_timeout=10sCLICKHOUSE_USER=default, CLICKHOUSE_PASSWORD=dev_clickhouse_2026HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE=defaultDEFAULT_CONNECTIONS=[{"name":"Local ClickHouse","host":"http://default:dev_clickhouse_2026@clickhouse:8123"}]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'.)
--metrics).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):
-- 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;
Chart Explorer → Heatmap nõuab, et seeria Value expression oleks täidetud
(HyperDX valideerib series[0].valueExpression). See on UI-konfiguratsioon, mitte andmeviga.
node_load1) ja sisesta Value väljale Value
(või avg(Value)), lisa filtrisse MetricName.count(); "Group by" nt ServiceName või SeverityText.metricTables.exponentialHistogramVaikimisi bootstrap võib selle puudumisel metrikate valija katki teha. Kontroll:
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"}})
Loodud 2026-09-25 skriptiga ~/scripts/create_hyperdx_dashboards.py:
ohmu_service_up, ohmu_container_restartsKordamine: python3 ~/scripts/create_hyperdx_dashboards.py (--delete-tests koristab testid).
API ligipääs: HyperDX väline API v2 on http://<clickstack-ip>: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):
{"name":"paneel","x":0,"y":0,"w":6,"h":6,"config":{
"displayType":"line","sourceId":"<Metrics source id>",
"select":[{"valueExpression":"Value","aggFn":"avg","where":"MetricName:\"node_load1\""}],
"groupBy":"name"}}
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.Telegram (ohmu) → http://alert-relay:9099/ (id 6ab760240c9282a5b0fde124).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:
# 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../LOEMIND_seisevad_konteinerid.md~/servers/LOEMIND/llama-server.md