Observabilité

Exportez les métriques, les traces et les journaux RustFS via OTLP, intégrez-les à vos outils de supervision et configurez les alertes recommandées.

Comment RustFS expose la télémétrie

RustFS pousse les métriques, les traces et les journaux via OTLP (OpenTelemetry Protocol). Il n’expose pas de point de terminaison Prometheus /metrics natif pour la collecte (scrape) : aucune route HTTP sur le port 9000 ou 9001 ne sert le format texte Prometheus. Pour acheminer les métriques RustFS vers Prometheus, vous devez exécuter un collecteur OpenTelemetry qui reçoit l’OTLP depuis RustFS et réexpose les données au format Prometheus :

RustFS (RUSTFS_OBS_ENDPOINT) --OTLP--> OpenTelemetry Collector --> Prometheus --> Grafana
                                                              \--> Loki (logs)
                                                              \--> Tempo / Jaeger (traces)

Pointez RustFS vers le collecteur avec :

# OTLP over HTTP (the Collector's default HTTP receiver port is 4318; gRPC is 4317)
RUSTFS_OBS_ENDPOINT=http://otel-collector:4318

Variables d’environnement associées (toutes définies dans la configuration du serveur) :

VariableRôle
RUSTFS_OBS_ENDPOINTPoint de terminaison OTLP de base pour les traces, les métriques et les journaux
RUSTFS_OBS_TRACE_ENDPOINT / RUSTFS_OBS_METRIC_ENDPOINT / RUSTFS_OBS_LOG_ENDPOINTRemplacements du point de terminaison pour chaque signal
RUSTFS_OBS_METRICS_EXPORT_ENABLED / RUSTFS_OBS_TRACES_EXPORT_ENABLED / RUSTFS_OBS_LOGS_EXPORT_ENABLEDActive ou désactive chaque signal
RUSTFS_OBS_METER_INTERVALIntervalle d’export des métriques
RUSTFS_OBS_SERVICE_NAME / RUSTFS_OBS_ENVIRONMENTAttributs de ressource attachés à la télémétrie exportée
RUSTFS_OBS_LOGGER_LEVELVerbosité des journaux (par exemple info)

Déploiement de référence (profil d’observabilité Docker Compose)

Le dépôt amont rustfs/rustfs fournit une pile de référence complète dans docker-compose.yml, derrière le profil observability : otel-collector, Prometheus, Grafana, Loki (journaux), Tempo et Jaeger (traces). La configuration de son collecteur reçoit l’OTLP sur 4317 (gRPC) et 4318 (HTTP), puis réexporte les métriques pour Prometheus sur le port 8889 :

# OpenTelemetry Collector (excerpt from the upstream reference config)
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  prometheus:
    endpoint: "0.0.0.0:8889"
service:
  pipelines:
    metrics:
      receivers: [otlp]
      exporters: [prometheus]

Prometheus collecte ensuite le collecteur, et non RustFS :

# prometheus.yml (excerpt)
scrape_configs:
  - job_name: "rustfs-app-metrics"
    static_configs:
      - targets: ["otel-collector:8889"]   # RustFS application metrics
  - job_name: "otel-collector"
    static_configs:
      - targets: ["otel-collector:8888"]   # Collector self-metrics

Si Prometheus n’affiche aucune série rustfs_*, vérifiez la chaîne dans l’ordre : RUSTFS_OBS_ENDPOINT est-il défini sur chaque nœud, le collecteur est-il joignable depuis les nœuds, et Prometheus collecte-t-il le port d’export 8889 du collecteur ?

Référence des métriques

Chaque nom ci-dessous est vérifié dans le code source du serveur. La liste couvre le sous-ensemble utile à l’exploitation, exporté via OTLP ; les instruments internes et expérimentaux sont omis, et les nouvelles versions peuvent ajouter des métriques absentes de cette liste. Les jeux d’étiquettes sont ceux enregistrés au point d’émission. Le collecteur et Prometheus peuvent ajouter des étiquettes de ressource supplémentaires, telles que service_name et l’instance.

État de préparation et processus

MétriqueTypeÉtiquettesSignification
rustfs_start_totalcompteur—Démarrages du processus ; un taux en hausse indique des boucles de redémarrage
rustfs_runtime_readiness_readyjauge—1 lorsque le nœud est entièrement prêt, 0 tant qu’il est dégradé
rustfs_runtime_readiness_degraded_totalcompteurreasonÉvaluations d’état de préparation dégradé, selon la valeur de degradedReasons (par exemple storage_quorum_unavailable)

Scanner

MétriqueTypeÉtiquettesSignification
rustfs_scanner_objects_scanned_totalcompteur—Objets visités par le scanner d’arrière-plan
rustfs_scanner_directories_scanned_totalcompteur—Répertoires visités
rustfs_scanner_buckets_scanned_totalcompteurresult, bucket, diskAnalyses de compartiment (bucket) et de disque terminées, selon le résultat (success / error / partial)
rustfs_scanner_cycles_totalcompteurresultCycles du scanner terminés (success / error / partial / unknown)
rustfs_scanner_cycle_duration_secondsjauge—Durée du dernier cycle d’analyse terminé
rustfs_scanner_bucket_drive_duration_secondshistogrammebucket, diskTemps nécessaire pour analyser un compartiment sur un disque
rustfs_scanner_leader_lock_totalcompteurstateÉvénements d’acquisition du verrou de leader du scanner
rustfs_scanner_inline_heal_totalcompteur—Objets mis en file pour une réparation directement par le scanner
rustfs_scanner_cache_save_duration_secondshistogrammecacheTemps nécessaire pour persister le cache d’utilisation des données
rustfs_scanner_set_scan_concurrency_limitjauge—Limite actuelle de concurrence d’analyse par ensemble
rustfs_scanner_disk_scan_concurrency_limitjaugepool, setLimite actuelle de concurrence d’analyse par disque

Réparation des données

MétriqueTypeÉtiquettesSignification
rustfs_heal_task_runningjaugetype, setTâches de réparation en cours, par ensemble d’effacement
rustfs_heal_task_start_totalcompteurtype, setTâches de réparation démarrées
rustfs_heal_queue_delay_secondshistogrammetype, setTemps d’attente d’une tâche de réparation dans la file avant son démarrage
rustfs_heal_admission_totalcompteursource, result, reason, contextDécisions d’admission d’une réparation (acceptée ou rejetée, et pourquoi)
rustfs_heal_mainline_throttle_totalcompteursource, result, reasonRéparation d’arrière-plan limitée afin de protéger le trafic de premier plan
rustfs_heal_scheduler_skip_totalcompteurreason, setPlanification de réparation ignorée (par exemple, limite par ensemble atteinte)
rustfs_heal_page_concurrency_currentjauge—Concurrence actuelle de la réparation au niveau des pages
rustfs_heal_candidate_enqueue_totalcompteur—Candidats à la réparation mis en file par le scanner
rustfs_heal_candidate_merge_totalcompteur—Candidats fusionnés avec une entrée de file existante
rustfs_heal_candidate_drop_totalcompteur—Candidats écartés
rustfs_heal_candidate_priority_reject_totalcompteur—Candidats rejetés par la politique de priorité
rustfs_heal_read_repair_dedup_totalcompteurreasonDemandes de réparation sur le chemin de lecture dédupliquées

Chemin d’API et d’E/S

MétriqueTypeÉtiquettesSignification
rustfs_io_get_object_request_duration_secondshistogrammestatusLatence de bout en bout de GetObject
rustfs_io_get_object_stage_duration_secondshistogrammepath, stageLatence GetObject décomposée par étape interne
rustfs_io_get_object_response_size_byteshistogramme—Tailles des réponses GetObject
rustfs_io_operation_duration_secondshistogrammeoperationDurée des opérations d’E/S
rustfs_io_timeout_events_totalcompteuroperationOpérations d’E/S ayant atteint un délai d’expiration
rustfs_operation_progressjaugeoperationPourcentage d’avancement des opérations de longue durée
rustfs_operation_stalledcompteuroperationOpérations détectées comme bloquées
rustfs_operation_completionscompteuroperation, statusAchèvements d’opérations, selon le statut
rustfs_io_queue_operationscompteuroperation, priorityOpérations d’entrée et de sortie de la file d’E/S
rustfs_io_queue_sizejaugepriorityProfondeur actuelle de la file d’E/S, par priorité
rustfs_io_starvation_eventscompteurpriorityÉvénements de famine des E/S de faible priorité
rustfs_io_bandwidth_bpsjauge—Bande passante d’E/S observée (octets/s)
rustfs_io_scheduler_decisionscompteur—Décisions prises par l’ordonnanceur d’E/S
rustfs_io_scheduler_loadcompteurlevelDécisions de l’ordonnanceur, selon le niveau de charge
rustfs_io_load_changescompteurfrom, toTransitions de niveau de charge d’E/S

Contre-pression

MétriqueTypeÉtiquettesSignification
rustfs_backpressure_state_changescompteurfrom, toTransitions d’état de contre-pression
rustfs_backpressure_activationscompteur—Nombre de fois où la contre-pression s’est activée
rustfs_backpressure_deactivationscompteur—Nombre de fois où la contre-pression a été relâchée
rustfs_backpressure_rejectionscompteur—Requêtes rejetées à cause de la contre-pression
rustfs_backpressure_concurrentjauge—Requêtes concurrentes actuellement suivies par le limiteur

Capacité

MétriqueTypeÉtiquettesSignification
rustfs_capacity_current_bytesjauge—Capacité utilisée actuelle, en octets
rustfs_capacity_update_totalcompteursourceRecalculs de capacité
rustfs_capacity_update_duration_secondshistogrammesourceTemps nécessaire pour recalculer la capacité
rustfs_capacity_cache_hitscompteur—Accès réussis au cache de capacité
rustfs_capacity_cache_missescompteur—Accès manqués au cache de capacité
rustfs_capacity_cache_served_totalcompteurstateRéponses de capacité servies depuis le cache, selon l’état de fraîcheur

Verrouillage

MétriqueTypeÉtiquettesSignification
rustfs_lock_contentionscompteur—Événements de contention de verrou
rustfs_lock_hold_time_secshistogramme—Durée pendant laquelle les verrous ont été tenus
rustfs_lock_spin_successes / rustfs_lock_spin_failurescompteur—Résultats d’acquisition des verrous à attente active
rustfs_lock_early_releasescompteur—Verrous relâchés plus tôt par une optimisation
rustfs_object_lock_diag_acquire_duration_secondshistogramme—Latence d’acquisition du verrouillage d’objet (mode diagnostic)
rustfs_object_lock_diag_hold_duration_secondshistogramme—Durée de détention du verrouillage d’objet (mode diagnostic)
rustfs_object_lock_diag_slow_acquire_total / rustfs_object_lock_diag_slow_hold_totalcompteur—Événements lents d’acquisition ou de détention de verrou (mode diagnostic)

Nettoyage des journaux

MétriqueTypeÉtiquettesSignification
rustfs_log_cleaner_runs_totalcompteur—Exécutions du nettoyeur de journaux
rustfs_log_cleaner_deleted_files_totalcompteur—Fichiers journaux supprimés
rustfs_log_cleaner_freed_bytes_totalcompteur—Octets récupérés
rustfs_log_cleaner_rotation_total / rustfs_log_cleaner_rotation_failures_totalcompteur—Rotations de journaux et échecs de rotation
rustfs_log_cleaner_rotation_duration_secondshistogramme—Durée de la rotation
rustfs_log_cleaner_active_file_size_bytesjauge—Taille du fichier journal actif

Métriques supplémentaires

D’autres noms de métriques vérifiés existent, dont le type et les étiquettes ne sont pas documentés ici, notamment rustfs_scanner_cache_save_attempt_total, rustfs_scanner_cache_save_timeout_total, rustfs_scanner_cache_save_retry_total, rustfs_scanner_excess_object_versions_total, rustfs_scanner_excess_object_version_size_total, rustfs_scanner_excess_folders_total, rustfs_scanner_pending_heal_prune_total, rustfs_scanner_pending_heal_malformed_total, ainsi que les familles rustfs_io_scheduler_*, rustfs_io_buffer_* et rustfs_timeout_dynamic_*. Inspectez-les dans Prometheus une fois le pipeline en service.

Alertes suggérées

AlerteSignalRègle suggérée
Nœud non prêt depuis plus de 2 minjauge rustfs_runtime_readiness_ready, ou une sonde externe sur GET /health/ready qui renvoie un code autre que 200rustfs_runtime_readiness_ready == 0 pendant 2m
Boucle de redémarragerustfs_start_totalincrease(rustfs_start_total[10m]) > 3
File de réparation en croissancerustfs_heal_task_running et rustfs_heal_queue_delay_secondstâches en cours durablement non nulles et délai de file en hausse pendant 30m
Scanner bloquérustfs_scanner_cycles_totalincrease(rustfs_scanner_cycles_total[24h]) == 0
Seuil de capacité utilisée du clusterrustfs_capacity_current_bytescomparez la valeur à la capacité brute déployée (une constante que vous définissez), par exemple rustfs_capacity_current_bytes > 0.8 * <total-bytes>

L’utilisation par disque et l’état en ligne ou hors ligne des disques sont actuellement exposés par la Console et par l’API d’administration (informations serveur et stockage), et non comme métriques OTLP dédiées. Pour une alerte de seuil par disque, interrogez l’API d’administration depuis votre propre exporteur, ou surveillez le tableau de bord de la Console.

Collecte des journaux

La destination des journaux est contrôlée par RUSTFS_OBS_LOG_DIRECTORY :

  • Non définie — les journaux vont sur stdout. Dans les conteneurs, utilisez votre pilote de journalisation ; sur les hôtes systemd, stdout/stderr est capturé par journald, de sorte que journalctl -u rustfs -f fonctionne sans configuration supplémentaire.
  • Un répertoire local (par exemple /var/log/rustfs/) — RustFS y écrit des fichiers journaux en rotation. La rotation se règle avec RUSTFS_OBS_LOG_FILENAME, RUSTFS_OBS_LOG_ROTATION_SIZE_MB, RUSTFS_OBS_LOG_ROTATION_TIME et RUSTFS_OBS_LOG_KEEP_FILES.
  • Une URL (contient ://) — les journaux sont expédiés vers un point de terminaison distant.

Lorsque RUSTFS_OBS_ENDPOINT est défini et que l’export des journaux est activé, les journaux sont en outre exportés via OTLP ; la pile de référence les achemine vers Loki pour les interroger depuis Grafana.

Example: file logs plus OTLP export
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ADDRESS=":9001"
RUSTFS_CONSOLE_ENABLE=true
RUSTFS_OBS_LOGGER_LEVEL=error
RUSTFS_OBS_LOG_DIRECTORY="/var/log/rustfs/"
RUSTFS_OBS_ENDPOINT=http://otel-collector:4318

On this page