Prometheus#

vCLU eksponuje endpoint /metrics w formacie Prometheus text exposition. Pozwala to na zbieranie metryk przez Prometheus, Grafana Agent lub dowolny system monitoringu kompatybilny z Prometheus.

Endpoint#

GET http://<vclu-ip>:9081/metrics

Endpoint jest domyslnie publiczny (nie wymaga uwierzytelnienia) - dzieki temu Prometheus moze scrapowac metryki bez konfiguracji Basic Auth.

Odpowiedz w formacie text/plain; version=0.0.4:

# HELP vclu_uptime_seconds Time since vCLU started in seconds
# TYPE vclu_uptime_seconds gauge
vclu_uptime_seconds 86400.00

# HELP vclu_memory_mb Current memory usage in megabytes
# TYPE vclu_memory_mb gauge
vclu_memory_mb 12.34

# HELP vclu_lua_executions_total Total Lua script executions
# TYPE vclu_lua_executions_total counter
vclu_lua_executions_total 5678
...

Metryki#

System#

MetrykaTypOpis
vclu_uptime_secondsgaugeCzas dzialania vCLU w sekundach
vclu_memory_bytesgaugeZuzycie pamieci w bajtach
vclu_memory_mbgaugeZuzycie pamieci w megabajtach
vclu_goroutinesgaugeLiczba goroutines Go
vclu_gc_runs_totalcounterLaczna liczba cykli GC

Lua runtime#

MetrykaTypOpis
vclu_lua_executions_totalcounterLaczna liczba wykonan skryptow Lua
vclu_lua_errors_totalcounterLaczna liczba bledow Lua
vclu_lua_timers_activegaugeAktywne timery
vclu_lua_timers_fired_totalcounterLaczna liczba odpalonych timerow

Protokol CLU#

MetrykaTypOpis
vclu_commands_received_totalcounterOdebrane komendy CLU
vclu_commands_executed_totalcounterWykonane komendy CLU
vclu_commands_errors_totalcounterBledy komend CLU
vclu_commands_rategaugeKomendy na minute

Pluginy#

MetrykaTypOpis
vclu_plugins_activegaugeLiczba aktywnych pluginow
vclu_plugin_http_requests_totalcounterRequesty HTTP pluginow
vclu_plugin_http_errors_totalcounterBledy HTTP pluginow

MQTT#

MetrykaTypOpis
vclu_mqtt_connectedgaugeStatus polaczenia (1=polaczony, 0=rozlaczony)
vclu_mqtt_published_totalcounterOpublikowane wiadomosci
vclu_mqtt_received_totalcounterOdebrane wiadomosci
vclu_mqtt_reconnects_totalcounterLaczna liczba reconnectow

HTTP Server#

MetrykaTypOpis
vclu_http_requests_totalcounterWszystkie requesty HTTP
vclu_http_requests_api_totalcounterRequesty API
vclu_http_requests_web_totalcounterRequesty stron WWW
vclu_http_errors_4xx_totalcounterBledy 4xx
vclu_http_errors_5xx_totalcounterBledy 5xx
vclu_http_requests_rategaugeRequesty na minute

HomeKit#

MetrykaTypOpis
vclu_homekit_accessoriesgaugeLiczba akcesorii HomeKit
vclu_homekit_pairedgaugeStatus parowania (1=sparowany)
vclu_homekit_requests_totalcounterWszystkie requesty HomeKit
vclu_homekit_get_totalcounterRequesty GET HomeKit
vclu_homekit_set_totalcounterRequesty SET HomeKit
vclu_homekit_events_totalcounterWyslane eventy HomeKit

Konfiguracja#

Konfiguracja endpointu w .vclu.json:

{
  "metrics": {
    "enabled": true,
    "auth": false,
    "username": "",
    "password": ""
  }
}
PoleTypDomyslnieOpis
enabledbooltrueWlacz/wylacz endpoint /metrics
authboolfalseWymagaj Basic Auth
usernamestring""Nazwa uzytkownika (gdy auth: true)
passwordstring""Haslo (gdy auth: true)

Konfiguracja Prometheus#

prometheus.yml#

scrape_configs:
  - job_name: 'vclu'
    scrape_interval: 30s
    static_configs:
      - targets: ['192.168.1.100:9081']
        labels:
          instance: 'vclu-salon'

Z autoryzacja:

scrape_configs:
  - job_name: 'vclu'
    scrape_interval: 30s
    basic_auth:
      username: 'prometheus'
      password: 'secret'
    static_configs:
      - targets: ['192.168.1.100:9081']

Wiele instancji vCLU#

scrape_configs:
  - job_name: 'vclu'
    scrape_interval: 30s
    static_configs:
      - targets:
          - '192.168.1.100:9081'
          - '192.168.1.101:9081'
          - '192.168.1.102:9081'
        labels:
          env: 'production'

Grafana#

Przykladowe zapytania PromQL#

# Zuzycie pamieci (MB)
vclu_memory_mb

# Bledy Lua w ostatniej godzinie
increase(vclu_lua_errors_total[1h])

# Srednia liczba komend na minute (5 min)
avg_over_time(vclu_commands_rate[5m])

# HTTP error rate (%)
rate(vclu_http_errors_4xx_total[5m]) + rate(vclu_http_errors_5xx_total[5m])
/ rate(vclu_http_requests_total[5m]) * 100

# Czy MQTT jest polaczony
vclu_mqtt_connected == 1

# Tempo wiadomosci MQTT (msg/min)
rate(vclu_mqtt_published_total[5m]) * 60

# Uptime w dniach
vclu_uptime_seconds / 86400

Alerty#

# alert.rules.yml
groups:
  - name: vclu
    rules:
      - alert: VCLUDown
        expr: up{job="vclu"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "vCLU {{ $labels.instance }} jest niedostepny"

      - alert: VCLUHighMemory
        expr: vclu_memory_mb > 100
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "vCLU {{ $labels.instance }} zuzywa >100MB pamieci"

      - alert: VCLUMQTTDisconnected
        expr: vclu_mqtt_connected == 0
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "vCLU {{ $labels.instance }} stracil polaczenie MQTT"

      - alert: VCLULuaErrors
        expr: increase(vclu_lua_errors_total[5m]) > 10
        labels:
          severity: warning
        annotations:
          summary: "vCLU {{ $labels.instance }} - >10 bledow Lua w 5 minut"

API JSON (alternatywa)#

Oprocz formatu Prometheus, vCLU udostepnia te same metryki w formacie JSON:

EndpointOpis
GET /api/statsBiezacy snapshot metryk
GET /api/stats/timeseriesDane historyczne (24h, probki co 1 min)
GET /api/stats/timeseries?since=<ms>Dane przyrostowe od podanego timestampu

Endpoint /api/stats wymaga uwierzytelnienia (sesja cookie).

Time series#

vCLU przechowuje dane historyczne w pamieci:

ParametrWartosc
Interwal probkowania1 minuta
Retencja24 godziny (1440 probek)
Format przechowywaniaRing buffer

Sledzone serie czasowe:

SeriaJednostkaOpis
memory_usedMBZuzycie pamieci
goroutinescountGoroutines Go
gc_pausemsPauzy GC
lua_exec_timemsSredni czas wykonania Lua
timers_activecountAktywne timery
cmd_ratereq/minKomendy CLU na minute
plugins_activecountAktywne pluginy
http_ratereq/minRequesty HTTP na minute
homekit_accessoriescountAkcesoria HomeKit
homekit_pairedcountSparowane urzadzenia

Strona /stats w interfejsie webowym vCLU wizualizuje te dane na wykresach.