소스 검색

observability: OTel trace-instrumentatsioon (nutikodu-web, weather/zigbee-collector) + collector otlp receiver/traces pipeline -> Service Map

Ardo 4 주 전
부모
커밋
da322f1117
6개의 변경된 파일과 59개의 추가작업 그리고 14개의 파일을 삭제
  1. 14 8
      dev/LOEMIND_observability.md
  2. 12 0
      dev/config/otel-collector/config.yaml
  3. 21 0
      dev/docker-compose.yml
  4. 4 2
      dev/nutikodu-web/Dockerfile
  5. 4 2
      dev/weather-collector/Dockerfile
  6. 4 2
      dev/zigbee-collector/Dockerfile

+ 14 - 8
dev/LOEMIND_observability.md

@@ -159,14 +159,20 @@ Sama kehtib heatmap'i „Low/High" legendile. See on **upstream viga**, mitte an
 > Image'i uuendusel: võrdle uut chunk-nime ja kohanda patch + mount.
 > Kontroll: `curl .../chunks/pages/clickhouse-*.js | grep 'r||!a'`.
 
-### Service Map: „Source can't be used here" (log source)
-Service Map on **trace-põhine** ja nõuab **Traces** source'it. Kui URL-is on
-`?source=<logSsourceId>`, näitab UI hoiatust „... is a log source, which this page can't show".
-- Ava `http://100.87.1.24:18080/service-map?source=6a95600db1eca667454bec7e` (Traces) või vali
-  päises **Traces**.
-- ⚠️ `otel_traces` on **tühi (0 rida)** — ükski teenus ei saada trace'isid, seega kaart on tühi.
-  Andmete saamiseks tuleb rakendused OTel-tracing'uga instrumenteerida (+ trace-pipeline collectoris).
-  Praegu ei ole Service Map'is sisu — see **ei ole** regressioon logide/dashboardide osas.
+### 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:

+ 12 - 0
dev/config/otel-collector/config.yaml

@@ -27,6 +27,14 @@ receivers:
         id: container-parser
         format: docker
 
+  # Rakenduste trace'id (OTel auto-instrumentation) -> HyperDX Service Map.
+  otlp:
+    protocols:
+      grpc:
+        endpoint: 0.0.0.0:4317
+      http:
+        endpoint: 0.0.0.0:4318
+
 processors:
   memory_limiter:
     check_interval: 5s
@@ -64,3 +72,7 @@ service:
       receivers: [filelog]
       processors: [memory_limiter, batch]
       exporters: [otlp]
+    traces:
+      receivers: [otlp]
+      processors: [memory_limiter, batch]
+      exporters: [otlp]

+ 21 - 0
dev/docker-compose.yml

@@ -45,6 +45,13 @@ services:
       - CH_TABLE=${CH_TABLE:-temperatuur}
       - CH_DOOR_TABLE=${CH_DOOR_TABLE:-ukseandur}
       - CH_FAULT_TABLE=${CH_FAULT_TABLE:-vead}
+      - OTEL_SERVICE_NAME=zigbee-collector
+      - OTEL_TRACES_EXPORTER=otlp
+      - OTEL_METRICS_EXPORTER=none
+      - OTEL_LOGS_EXPORTER=none
+      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
+      - OTEL_EXPORTER_OTLP_PROTOCOL=grpc
+      - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu
     depends_on:
       - clickhouse
     networks:
@@ -65,6 +72,13 @@ services:
       - CH_USER=${CH_USER:-zigbee}
       - CH_WEATHER_TABLE=${CH_WEATHER_TABLE:-valisilm}
       - BACKFILL_FROM=${BACKFILL_FROM:-2026-09-17}
+      - OTEL_SERVICE_NAME=weather-collector
+      - OTEL_TRACES_EXPORTER=otlp
+      - OTEL_METRICS_EXPORTER=none
+      - OTEL_LOGS_EXPORTER=none
+      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
+      - OTEL_EXPORTER_OTLP_PROTOCOL=grpc
+      - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu
     depends_on:
       - clickhouse
     networks:
@@ -85,6 +99,13 @@ services:
       - CH_DB=${CH_DB:-uus67}
       - CH_USER=${CH_USER:-zigbee}
       - WEB_ACCESS_TOKEN=${WEB_ACCESS_TOKEN:-}
+      - OTEL_SERVICE_NAME=nutikodu-web
+      - OTEL_TRACES_EXPORTER=otlp
+      - OTEL_METRICS_EXPORTER=none
+      - OTEL_LOGS_EXPORTER=none
+      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
+      - OTEL_EXPORTER_OTLP_PROTOCOL=grpc
+      - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu
     ports:
       - "100.87.1.24:8095:8095"
     depends_on:

+ 4 - 2
dev/nutikodu-web/Dockerfile

@@ -3,11 +3,13 @@ FROM python:3.12-slim
 WORKDIR /app
 
 COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
+RUN pip install --no-cache-dir -r requirements.txt \
+ && pip install --no-cache-dir opentelemetry-distro opentelemetry-exporter-otlp-proto-grpc \
+ && opentelemetry-bootstrap -a install
 
 COPY app.py .
 COPY static ./static
 
 EXPOSE 8095
 
-CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8095"]
+CMD ["opentelemetry-instrument", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8095"]

+ 4 - 2
dev/weather-collector/Dockerfile

@@ -3,8 +3,10 @@ FROM python:3.12-slim
 WORKDIR /app
 
 COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
+RUN pip install --no-cache-dir -r requirements.txt \
+ && pip install --no-cache-dir opentelemetry-distro opentelemetry-exporter-otlp-proto-grpc \
+ && opentelemetry-bootstrap -a install
 
 COPY collector.py .
 
-CMD ["python", "-u", "collector.py"]
+CMD ["opentelemetry-instrument", "python", "-u", "collector.py"]

+ 4 - 2
dev/zigbee-collector/Dockerfile

@@ -3,8 +3,10 @@ FROM python:3.12-slim
 WORKDIR /app
 
 COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
+RUN pip install --no-cache-dir -r requirements.txt \
+ && pip install --no-cache-dir opentelemetry-distro opentelemetry-exporter-otlp-proto-grpc \
+ && opentelemetry-bootstrap -a install
 
 COPY collector.py .
 
-CMD ["python", "-u", "collector.py"]
+CMD ["opentelemetry-instrument", "python", "-u", "collector.py"]