LOEMIND_observability.md 25 KB

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)

Hostipordid (olulised)

Port Teenus Märkus
18080 HyperDX/ClickStack UI kanooniline
8124 clickstack-proxy (nginx) /clickstack/→302→18080; /api/,/__ENV.js→app; /→ClickHouse (DBeaver)
8125 ClickHouse HTTP host 8125 → konteiner 8123 (Tailscale)
9004 ClickHouse native TCP host 9004 → konteiner 9000
4317 / 4318 OTLP gRPC / HTTP otel-collector (127.0.0.1 + 100.87.1.24)
4319 otel-ratelimit (nginx) otel.odamus.com ingest → collector:4318
8123 Home Assistant ⚠️ hostil = HA Core (python3 -m homeassistant --config /config), MITTE ClickHouse

⚠️ ClickHouse native (9004) teade „You must use port 8123 for HTTP" on meie hostil eksitav: port 8123 on Home Assistant (hostiprotsess, 0.0.0.0:8123). Meie ClickHouse HTTP = 8125. Konteiner ei avalda hostil 8123 — seega tegelikku konflikti pole, ainult portide-konventsiooni kattuvus.

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-<TS>/ (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)

⚠️ Custom collector-config ei tohi base/remote-komponente üle kirjutada. Ametlik clickstack-otel-collector (supervisor/OpAMP) defineerib baasis juba prometheus (self-metrics), otlp/hyperdx, clickhouse, memory_limiter, batch jm. Kui CUSTOM_OTELCOL_CONFIG_FILE defineerib sama nimega komponendi (nt prometheus), jääb custom versioon rakendamata (vaikselt) → host-metrikad ei liigu (kinnitatud 2026-10-03: node_*/container_*/llamacpp:* külmusid). Reegel: anna custom-komponentidele unikaalne nimi, nt prometheus/ohmu, filelog/ohmu, ja viita pipeline'is sellele. Baasi memory_limiter/batch/clickhouse jäävad kasutatavaks. Diagnoos: docker exec otel-collector sh -c 'wget -qO- localhost:8888/metrics' | grep receiver= (peab olema receiver="prometheus/ohmu").

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:

db.connections.updateOne({_id: ObjectId("<conn-id>")},
  {$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):

-- 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['<label>'] (mitte paljas label). Näiteks groupBy: "service" annab Code: 47 Unknown expression identifier 'service' — kasuta "Attributes['service']" (või Attributes['name']). Kinnitatud 2026-10-03 (dashboardi tile'id).

Alert nõuab number/line/stacked bar paneeli

Alert ei toeta table-paneeli (Unsupported alert source: tile). Kasuta number/line/stacked bar paneeli. Pärast alerti/paneeli otsest mongo-muudatust taaskäivita clickstack (vahemälu).

Chart Explorer: Syntax error ... toString() (tühi valueExpression + count)

Sama juur kui heatmap'il allpool: min/max päring kasutab tühja valueExpression-i. Vaikimisi seeria {aggFn:"count", valueExpression:""} → toFloat64OrDefault(toString()) → Code: 62 SYNTAX_ERROR ... position 58 (>=). Lahendus: kas anna Value-le arvuline veerg (nt SeverityNumber) või vaheta kuva table-ks (min/max päringut ei tehta). Value = 1 väldib küll vea, aga annab skaala 1..1 (ei sobi graafikule). Upstream viga.

Heatmap + y-telg: tühi valueExpression → Syntax error ... toString()

HyperDX 2.37 arvutab heatmap'i/joongraafiku min/max tooresest select[0].valueExpression-ist (app-chunk 4719-*, funktsioon A): quantileIf(0.01)(toFloat64OrDefault(toString(<expr>)), <expr> >= 0 ...). Kui expr on tühi (vaikimisi count-seeria), tekib toString()) + >= 0 → Code: 62 SYNTAX_ERROR. Sama kehtib heatmap'i „Low/High" legendile. See on upstream viga, mitte andmeviga.

Kontrollitud lahendused (Logs otel_logs): | Value expression | Tulemus | |---|---| | "" (vaikimisi) | ❌ süntaksiviga | | 1 | ✅ töötab, aga skaala 1..1 (flat — ei sobi) | | SeverityNumber / TraceFlags | ✅ töötab, sisuline skaala | | count() | ❌ agregaadi pesastamine (quantileIf(count())) — keelatud |

Soovitus: heatmap (ja y-telg) vajab arvulist veergu, mitte count'i:

  • Logs source: Value = SeverityNumber (või TraceFlags), „Group by" nt ServiceName.
  • Metrics source: Value = Value (või avg(Value)), filter MetricName.
  • Puhta count-heatmap'i jaoks kasuta mõnda muud kuva (nt table) kuni upstream-paranduseni.
  • Kui metrika valimine ei täida Value välja automaatselt, trüki käsitsi.

PATCH (meil rakendatud): bind-mount'itud neli chunki: dev/patches/4719-70b065addcfc053d.js (jagatud, dashboardid), dev/patches/pages/clickhouse-46029ebbad38b40a.js (/chart leht; funktsioonid N+F), dev/patches/4751-53b929fca5a575a9.js (heatmap-valideerimine) ja dev/patches/1021-40ca2f669b13138d.js (partsOverlapFilter NaN-kaitse — sageli 500 / Code 457 „Value nan cannot be parsed as Int64" vigase dateRange'i korral sessiooni/trace atribuudivõtmete päringus). Patch teeb tühja valueExpression'i korral count-põhise min/max'i ja bucket-päringu, seega count-heatmap/graafik töötab ilma Value't täitmata. Täiendused (02.10.2026):

  • CTE count-selectid (min_max_calc/bucket_calc) said väljad valueExpression:"", aggCondition:"", aggConditionLanguage:"lucene" — muidu common-utils CTE-skeem andis „non-conforming chartConfig object in CTE".
  • 4751-…: heatmap-valideerimine lubab tühja valueExpression, kui series[0].aggFn==="count" — muidu „Value expression is required for heatmap charts". ⚠️ Chunkid on Cache-Control: immutable → vaja hard-refresh (Ctrl+Shift+R). ⚠️ Patchid on seotud chunk-hashiga (HyperDX 2.37.0, image ...all-in-one:latest). Image'i uuendusel: võrdle uut chunk-nime ja kohanda patch + mount. Kontroll: curl .../chunks/pages/clickhouse-*.js | grep 'r||!a'.

filelog: „failed to detect a valid log path"

container operatori add_metadata_from_filepath (vaikimisi true) ootab Kubernetes'i tee-mustrit (logpathPattern); Docker-teed (/var/lib/docker/containers/<id>/<id>-json.log) ei sobi → iga logirea kohta viga (cadvisor jt). Parandus otel-collector config'us: add_metadata_from_filepath: false (pole k8s). Kontroll: docker logs otel-collector --since 3m | grep -c "failed to detect a valid log path" → 0.

Service Map: trace-instrumentatsioon (TEHTUD 2026-09-27)

Service Map on trace-põhine. Kui URL-is on ?source=<logSourceId>, näitab UI hoiatust „... is a log source, which this page can't show" — vali päises Traces või ava http://100.87.1.24:18080/service-map?source=6a95600db1eca667454bec7e.

Instrumenteeritud (OTel auto-instrumentation, opentelemetry-distro + OTLP gRPC):

  • nutikodu-web (FastAPI/uvicorn) — Server + Client spanid (ClickHouse HTTP)
  • weather-collector, zigbee-collector — Client spanid (Open-Meteo, ClickHouse, MQTT)

Andmevoog: app OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 → otel-collector (otlp receiver → traces pipeline) → clickstack:4317 → default.otel_traces. Dockerfile'ides: pip install opentelemetry-distro opentelemetry-exporter-otlp-proto-grpc && opentelemetry-bootstrap -a install, CMD ["opentelemetry-instrument", ...]. Kontroll: SELECT ServiceName, SpanKind, count() FROM default.otel_traces GROUP BY 1,2.

Metrics source peab sisaldama metricTables.exponentialHistogram

Vaikimisi 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"}})

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://<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"}}

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. ⚠️ HyperDX generic webhook saadab {"text": "..."} (Slack-laadne) — relay saadab selle otse, ilma parse_mode-ita (Markdown [ ] * _ põhjustaks Telegrami parse-vea). Varem ootas välju name/state/message → kuvas „Seis: ?" + toor-JSON (parandatud 02.10.2026).
  • 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, numConsecutiveWindows=2 (nõuab 2 järjestikust akent → väldib üksiku andmeaugu valehäiret), 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/ -H 'Content-Type: application/json' \
  -d '{"text":"🚨 test (ignoreeri)"}'

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

⚠️ Clickstack'i collector ↔ ClickHouse käivitusrace (valehäirete allikas)

Clickstack'i kaasasolev OTLP-collector (opampsupervisor) teeb käivitusel ClickHouse'i skeemi seed'i; kui ClickHouse pole sel hetkel kättesaadav (dial tcp <ip>:9000: connection refused), collector sureb → OTLP 4317/4318 on maas → kõik meetrikad/logid/trace'id seiskusid (ja ohmu_app_metrics.py logib [Errno 104] Connection reset by peer). Kuna ohmu_service_up andmeid ei tule, arvutab alert'i min() tühja akna pealt 0 → vale „Teenus maas" häire. Ravi: docker restart clickstack (seed õnnestub, collector tuleb tagasi, 4318 → 200).

✅ Parandatud (02.10.2026): docker-compose.yml-is lisatud

  • clickhouse healthcheck native TCP 9000 vastu (clickhouse-client --password "$CLICKHOUSE_PASSWORD" --query 'SELECT 1', 10s intervall, start_period 30s);
  • clickstack depends_on: clickhouse: condition: service_healthy. Nüüd ootab clickstack ClickHouse'i tervist enne käivitumist → collector'i seed ei jookse enam ClickHouse'i käivitumise ajal. Kontroll: docker compose up -d clickhouse clickstack → clickhouse Waiting → Healthy → clickstack Starting. (Käsitsi ikka: docker restart clickstack.) Kontroll: docker exec clickstack sh -c 'tail -3 /var/log/otel-collector.log' (peab olema Schema seed completed successfully + Connected to the OpAMP server); OTLP-test: curl -X POST -H 'authorization: <INGEST_KEY>' http://127.0.0.1:4318/v1/metrics → 200. (Pikaajaline: collector võiks seed'i ebaõnnestumisel retry'da, mitte surra — upstream.)

Client Sessions (session replays) — browser-integratsioon

  • Session-allikas: Sessions (_id 6a95600db1eca667454bec83, from default.hyperdx_sessions, seotud Traces-allikaga). Andmeid kogub HyperDX Browser SDK (@hyperdx/browser).
  • Ingest-key (brauser): 02a19ecf-f62e-4e17-819f-3ee1498d69f3 (= team apiKey = HYPERDX_INGEST_KEY). ⚠️ HYPERDX_API_KEY peab olema sama (ka API logger kasutab seda); varem oli vale (790900ff…) → /api/config andis vale key ja API logid said 401.
  • Ingest-endpoint: https://otel.odamus.com (edge Caddy → 100.87.1.24:4318; CORS OK: OPTIONS 204, Allow-Origin *). DNS: DO A otel.odamus.com → 188.166.84.16.
  • Snippet (rakendustes enne </body>; key on serveripoolne ingest-key, brauseris nähtav — HyperDX standard):

    <script src="https://unpkg.com/@hyperdx/browser@0.26.0/build/index.js"></script>
    <script>if(window.HyperDX){HyperDX.init({apiKey:'02a19ecf-f62e-4e17-819f-3ee1498d69f3',
    service:'<app>',url:'https://otel.odamus.com',consoleCapture:true,
    advancedNetworkCapture:true,maskAllInputs:true,maskAllText:true});}</script>
    
  • Instrumenteeritud: veebipood (app/templates/base.html), liiklusatlas (web/index.html, web/tutvustus.html), nutikodu-web (static/index.html), HyperDX UI ise (/api/config env-iga: HYPERDX_API_KEY + NEXT_PUBLIC_OTEL_EXPORTER_OTLP_ENDPOINT).

  • Dashboard: „Ohmu — sessioonid (client)" (_id 6ac014f48475db7c237f16fe) — sessioonid ajas (line) + teenuse kaupa (table), source = session-allikas.

  • Skoop (teadlikult piiratud): sessioonid on AINULT ülalnimetatud rakendustel. valvur (Orange Pi) ja suitsusaun (RPi5 varukoopia-server) on eraldi hostid oma lokaalse monitoriga (valvur_health.py / suitsusaun_health.py) — neid siia ei lisata (admin-paneelid, mitte kasutajaliidesed; kolmanda osapoole image'eid ei patch'ita). Suitsusauna välise kättesaadavuse katab ohmu_extcheck.py (Jellyfin /System/Ping).

  • Kontroll: SELECT ServiceName, count() FROM default.hyperdx_sessions GROUP BY ServiceName.

OTLP ingest rate-limit (otel.odamus.com)

Avalik ingest on rate-limiteeritud: edge Caddy → otel-ratelimit (nginx, 100.87.1.24:4319, limit_req zone=otlp 20r/s burst=60 nodelay, limit_conn 40, real IP X-Forwarded-For kaudu, set_real_ip_from 100.64.0.0/10) → clickstack:4318. (Caddy standardbuildis rate_limit plugin't pole → seetõttu nginx.) Konfiguratsioon: dev/config/otel-ratelimit/nginx.conf, teenus dev/docker-compose.yml. Kontroll: 150 kiiret POST-i → ~62×200, ~88×429.

Logimüra filter: cAdvisor btrfs hoiatus

cadvisor logib korduvalt Unable to get btrfs mountpoint IDs: stat failed on /dev/mapper/data-root — benignne (konteiner ei näe hosti LVM-seadet, cAdvisor langeb tagasi). otel-collector filter/logs processor (IsMatch(body, "Unable to get btrfs mountpoint IDs")) viskab need välja. Logs-pipeline: [filelog] → [memory_limiter, filter/logs, batch] → [otlp].

„Time Series" / rollup-404: otel_*_key_rollup_15m puudub

HyperDX 2.37 seed loob ainult kv-rollupi (otel_logs_kv_rollup_15m, otel_traces_kv_rollup_15m), mitte *_key_rollup_15m. Allikate metadataMaterializedViews.keyRollupTable osutas puuduvale tabelile → /chart (jms) päringud said 404 ja „Time Series" ei töötanud. Parandus: eemaldasin keyRollupTable log- ja trace-allikalt (mongo sources):

db.sources.updateOne({_id:ObjectId("<logSourceId>")},{$unset:{"metadataMaterializedViews.keyRollupTable":""}});
db.sources.updateOne({_id:ObjectId("<traceSourceId>")},{$unset:{"metadataMaterializedViews.keyRollupTable":""}});

App langeb siis tagasi kvRollupTable-le (olemas). Kontroll: db.sources.find({},{kind:1,metadataMaterializedViews:1}) → keyRollupTable puudub; /chart võrgupäringutes ei ole enam 404 (otel_logs_key_rollup_15m).

Ühtlustatud UI: /clickstack (8124) → HyperDX v2.37 (18080)

ClickHouse 26.8 serveerib oma kaasasolevat ClickStack UI-d (v2.28, local mode) aadressil clickhouse:8123/clickstack/ — see ei ühti meie HyperDX v2.37-ga, pärib ClickHouse'i otse (user=default, parool puudub → 401) ja kuvab „Set up session replays". Ühtlustatud: clickstack-proxy (8124) /clickstack/ → 302 → http://100.87.1.24:18080/ (kanooniline v2.37 UI, kus sessioonid töötavad). Lisatud nginx-is resolver 127.0.0.11 valid=10s + set $hdx clickstack:8080 (dünaamiline resolvimine — ei jää aegunud IP külge, kui clickstack recreate'itakse; varem põhjustas 502). ClickHouse otsepäringud (DBeaver) 8124/ kaudu töötavad edasi.

Seotud

  • Vahejuhtumite audit: ../LOEMIND_seisevad_konteinerid.md
  • Serveri mudelid: ~/servers/LOEMIND/llama-server.md