Monitoraggio¶
Health check¶
Gli endpoint di salute rispondono senza autenticazione su entrambe le porte (9000 e 9001), GET o
HEAD, con 200 quando va tutto bene e 503 altrimenti:
| Endpoint | Significato | Uso |
|---|---|---|
/nexo/health/live |
il processo è vivo | liveness probe, restart automatici |
/nexo/health/ready |
il nodo può servire traffico (storage inizializzato, bootstrap completo, quorum) | readiness probe, health check del load balancer |
/nexo/health/cluster |
stato dell'intero deployment | dashboard, script di manutenzione |
$ curl -s http://localhost:9000/nexo/health/cluster
{"ok":true,"status":"ok","checks":{"storage":"ok"},"nodes":4,"nodesOnline":4,"drives":16,"drivesOnline":16,"writeQuorum":true,"maintenance":true}
writeQuorum: ogni erasure set accetta scritture.maintenance: si può spegnere un altro nodo senza perdere il quorum (da controllare prima di un riavvio).- Un nodo che si sta fermando risponde
503anche a/ready, così il load balancer lo toglie dal giro prima che chiuda le connessioni.
nexo healthcheck (usato dal HEALTHCHECK delle immagini) sonda il nodo locale senza curl:
nexo healthcheck --ready esce con 0 quando il nodo è pronto; con NEXO_CERTS_DIR (o --certs-dir) usa
HTTPS fidandosi dei certificati della directory.
nexoctl admin info local riassume versione, modalità, pool, set (con il loro stato e quorum), nodi
(online, uptime, sfasamento dell'orologio, healing) e dischi (uso e stato); nexoctl admin usage local
mostra l'uso per bucket.
Metriche Prometheus¶
Le metriche sono sulla porta S3, in tre endpoint:
| Endpoint | Contenuto | Scrape |
|---|---|---|
/nexo/metrics/v1/node |
le famiglie del nodo che risponde (label server) |
ogni nodo |
/nexo/metrics/v1/cluster |
le famiglie di ogni nodo (raccolte via RPC) più le famiglie nexo_cluster_* |
un solo target (o il load balancer) |
/nexo/metrics/v1/bucket |
metriche per bucket sommate su tutti i nodi e uso dei bucket | un target, ogni 60 s |
Autenticazione¶
Con NEXO_PROMETHEUS_AUTH_TYPE=jwt (default) le rotte richiedono Authorization: Bearer <JWT> (senza
token: 403). Il token è firmato con la secret key di un'identità che ha admin:Prometheus (root,
consoleAdmin o la policy diagnostics): conviene un utente dedicato.
nexoctl admin user add local prometheus 'una-password-lunga-e-casuale' --policy diagnostics
nexoctl alias set metrics http://nexo.lan:9000 prometheus 'una-password-lunga-e-casuale'
nexoctl admin prometheus generate metrics > scrape-cluster.yml # job nexo-cluster
nexoctl admin prometheus generate --expiry 365d metrics node # job nexo-node
nexoctl admin prometheus generate metrics bucket # job nexo-bucket
Output (da incollare in scrape_configs di prometheus.yml):
# Nexo cluster metrics of nexoctl alias "metrics" (access key prometheus), token valid until 2027-10-15T11:50:08Z
scrape_configs:
- job_name: "nexo-cluster"
metrics_path: "/nexo/metrics/v1/cluster"
scheme: http
authorization:
type: Bearer
credentials: "eyJhbGciOiJIUzUxMiIs…"
static_configs:
- targets: ["nexo.lan:9000"]
Il token scade con --expiry (default 365d) o quando cambia la secret key dell'utente; trattalo come la
chiave stessa. Con NEXO_PROMETHEUS_AUTH_TYPE=public gli endpoint sono pubblici e
nexoctl admin prometheus generate --public produce la configurazione senza token: usalo solo se la porta
9000 non è raggiungibile da reti non fidate.
Famiglie principali¶
| Area | Metriche |
|---|---|
| API S3 | nexo_s3_requests_total{api,status}, nexo_s3_requests_4xx_errors_total{api}, nexo_s3_requests_5xx_errors_total{api}, nexo_s3_request_duration_seconds{api}, nexo_s3_requests_inflight, nexo_s3_traffic_received_bytes_total, nexo_s3_traffic_sent_bytes_total |
| Limiti di richieste | nexo_ratelimit_throttled_total{api,kind} (api s3, admin, web; kind ip, user, bucket, distribution, concurrency) |
| Bucket | nexo_bucket_requests_total{bucket,api,status_class}, nexo_bucket_traffic_received_bytes_total{bucket}, nexo_bucket_traffic_sent_bytes_total{bucket}, nexo_bucket_usage_total_bytes, nexo_bucket_objects, nexo_bucket_versions, nexo_bucket_delete_markers |
| Dischi | nexo_drive_online, nexo_drive_healing, nexo_drive_total_bytes, nexo_drive_used_bytes, nexo_drive_free_bytes, nexo_drive_free_inodes, nexo_drive_operations_total{drive,op}, nexo_drive_operation_seconds_total{drive,op}, nexo_drive_errors_total{drive,type} |
| Cluster | nexo_cluster_nodes_online, nexo_cluster_nodes_offline, nexo_cluster_drives_{online,offline,healing,total}, nexo_cluster_sets_{healthy,degraded,read_only,unavailable}{pool}, nexo_cluster_read_quorum{pool}, nexo_cluster_write_quorum{pool}, nexo_cluster_buckets, nexo_cluster_objects, nexo_cluster_usage_bytes |
| Healing e scanner | nexo_mrf_queue_pending, nexo_mrf_queue_healed_total, nexo_heal_jobs{state}, nexo_heal_drive_*{drive}, nexo_scanner_cycles_total, nexo_ilm_actions_total{action} |
| Notifiche | nexo_events_pending{target}, nexo_events_target_online{target}, nexo_events_sent_total{target}, nexo_events_failed_total{target} |
| Rete, lock, KMS | nexo_rpc_requests_total{peer,method}, nexo_rpc_errors_total{peer,method}, nexo_rpc_peer_online{peer}, nexo_lock_acquire_timeouts_total{type}, nexo_kms_online, nexo_kms_errors_total{op,reason} |
| TLS | nexo_tls_server_certificate_expiry_seconds{certificate}, nexo_tls_server_certificate_reloads_total{result} |
| Processo | nexo_node_uptime_seconds, nexo_node_info{version,commit}, go_*, process_* |
La cardinalità è limitata: nessuna chiave d'oggetto nelle label, al massimo 1000 bucket per nodo (oltre:
_other). L'elenco completo è in docs/07 §7.4.
Grafana e Prometheus pronti¶
deploy/docker/observability
contiene la configurazione di Prometheus (prometheus.single.yml, prometheus.cluster.yml), le regole di
alert (alerts.yml) e la dashboard Grafana Nexo / Overview con datasource preconfigurato. Con Compose:
cd deploy/docker
# singolo nodo
docker compose -f compose.single.yml -f compose.observability.yml up -d
# cluster
PROMETHEUS_CONFIG=prometheus.cluster.yml \
docker compose -f compose.cluster.yml -f compose.observability.yml up -d
Prometheus è su http://localhost:9090, Grafana su http://localhost:3000 (admin/admin, da cambiare
con GRAFANA_ADMIN_*). I file Prometheus si aspettano NEXO_PROMETHEUS_AUTH_TYPE=public in nexo.env,
oppure decommenta il blocco authorization e monta il token. Su Kubernetes il chart crea un
ServiceMonitor (serviceMonitor.enabled, token in serviceMonitor.bearerTokenSecret).
Per importare la dashboard in un Grafana esistente usa
observability/grafana/dashboards/nexo-overview.json.
Alert¶
alerts.yml (validato in CI contro le metriche reali) definisce:
| Alert | Quando |
|---|---|
NexoNodeDown |
uno scrape del nodo fallisce da 1 minuto |
NexoClusterNodesOffline |
il cluster vede nodi offline |
NexoDriveOffline |
un disco è offline da 2 minuti |
NexoErasureSetDegraded |
un set ha dischi mancanti da 5 minuti |
NexoQuorumAtRisk |
un set ha perso il quorum di scrittura o è vicino a perderlo |
NexoKMSOffline |
il KMS non risponde (SSE-S3/SSE-KMS non funzionano) |
NexoCapacityHigh |
capacità utile del cluster oltre l'85% |
NexoDriveAlmostFull, NexoDriveInodesLow |
un disco quasi pieno o senza inode |
NexoHigh5xxRate |
troppe risposte 5xx |
NexoSlowRequests |
latenza p99 alta per 15 minuti |
NexoInternodeErrors, NexoLockTimeouts |
errori nelle chiamate tra nodi, timeout dei lock |
NexoHealingStalled, NexoDriveHealingStalled |
coda di healing o ripopolamento di un disco fermi |
NexoEventQueueBacklog, NexoEventTargetDown |
notifiche in coda o target non raggiungibile |
Ogni regola ha severity tra le label e summary/description tra le annotazioni; per la diagnosi vedi
Risoluzione dei problemi.
Grafici della console¶
La pagina Monitoraggio → Metriche della console mostra richieste, errori, latenze (p50, p95, p99), banda, dischi, healing, scanner, chiamate tra nodi, CPU e memoria, per il cluster o per nodo, con intervallo e aggiornamento automatico. I dati vengono da un buffer in memoria di ogni nodo (un punto ogni 10 s per 24 h), disponibile anche senza Prometheus:
$ nexoctl admin metrics list local
NAME UNIT AGG DESCRIPTION
s3_requests req/s sum S3 requests per second
s3_errors_5xx req/s sum S3 requests answered with a 5xx status per second
s3_latency_p99 seconds max 99th percentile of the latency of the S3 requests
…
$ nexoctl admin metrics query --range 6h --step 5m local s3_latency_p99
Servono admin:Prometheus o admin:ServerInfo. Il buffer si azzera al riavvio del nodo: per lo storico
usa Prometheus.
Diagnostica¶
nexoctl admin speedtest local drive|object|net: misura i dischi, l'object layer (bucket temporaneonexo-speedtest-*) e la rete tra i nodi (solo cluster). Carica il server: fuori dagli orari di punta.nexoctl admin profile --type cpu --seconds 30 --output cpu.pb.gz local: profilo pprof del nodo che risponde (cpu,heap,goroutine,mutex,block), da aprire congo tool pprof. Nessun endpoint/debug/pprofè esposto; un profilo rivela dettagli interni, trattalo come dato riservato.
Entrambi richiedono permessi dedicati (admin:Speedtest, admin:Profiling), concessi a root e alla
policy diagnostics.