From 0aba323779e184b1df676e3be374949a6713f8d7 Mon Sep 17 00:00:00 2001 From: Rahix Date: Sun, 6 Oct 2024 10:50:05 +0200 Subject: [PATCH] succd: Export all process values as prometheus metrics For more detailed monitoring, let's export all process values that are exposed to the web API as prometheus metrics. --- succbone/succd/http.go | 48 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/succbone/succd/http.go b/succbone/succd/http.go index 4365428..f1503e7 100644 --- a/succbone/succd/http.go +++ b/succbone/succd/http.go @@ -163,16 +163,60 @@ func (s *webServer) viewStream(w http.ResponseWriter, r *http.Request) { } } +func boolToFloat(b bool) float32 { + if b { + return 1.0 + } else { + return 0.0 + } +} + // httpMetrics serves minimalistic Prometheus-compatible metrics. func (s *webServer) viewMetrics(w http.ResponseWriter, r *http.Request) { // TODO(q3k): also serve Go stuff using the actual Prometheus metrics client // library. // TODO(q3k): serve the rest of the data model state := s.d.snapshot() - mbar := state.piraniMbar100.mbar + + // sem_pressure_mbar is meant to represent the fused pressure value + // from all data sources once we have more vacuum sensors in the + // system. sem_pirani_mbar is just the reading from the pirani gauge. fmt.Fprintf(w, "# HELP sem_pressure_mbar Pressure in the SEM chamber, in millibar\n") fmt.Fprintf(w, "# TYPE sem_pressure_mbar gauge\n") - fmt.Fprintf(w, "sem_pressure_mbar %f\n", mbar) + fmt.Fprintf(w, "sem_pressure_mbar %f\n", state.piraniMbar100.mbar) + + fmt.Fprintf(w, "# HELP sem_pirani_mbar Pressure reading by the Pirani gauge, in millibar\n") + fmt.Fprintf(w, "# TYPE sem_pirani_mbar gauge\n") + fmt.Fprintf(w, "sem_pirani_mbar %f\n", state.piraniMbar100.mbar) + + fmt.Fprintf(w, "# HELP sem_pirani_volts Voltage output from the Pirani gauge, in volts\n") + fmt.Fprintf(w, "# TYPE sem_pirani_volts gauge\n") + fmt.Fprintf(w, "sem_pirani_volts %f\n", state.piraniVolts100.avg) + + fmt.Fprintf(w, "# HELP sem_pirani_failsafe_active Whether pirani gauge failsafe mode is active (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_pirani_failsafe_active gauge\n") + fmt.Fprintf(w, "sem_pirani_failsafe_active %f\n", boolToFloat(state.safety.failsafe)) + + fmt.Fprintf(w, "# HELP sem_dp_lockout_active Whether diffusion pump lockout is active (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_dp_lockout_active gauge\n") + fmt.Fprintf(w, "sem_dp_lockout_active %f\n", boolToFloat(state.safety.highPressure)) + + fmt.Fprintf(w, "# HELP sem_pump_diffusion_running Whether the diffusion pump is running (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_pump_diffusion_running gauge\n") + fmt.Fprintf(w, "sem_pump_diffusion_running %f\n", boolToFloat(state.dpOn)) + + fmt.Fprintf(w, "# HELP sem_pump_roughing_running Whether the roughing pump is running (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_pump_roughing_running gauge\n") + fmt.Fprintf(w, "sem_pump_roughing_running %f\n", boolToFloat(state.rpOn)) + + rough, high := state.vacuumStatus() + fmt.Fprintf(w, "# HELP sem_vacuum_rough_reached Whether a rough vacuum has been reached (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_vacuum_rough_reached gauge\n") + fmt.Fprintf(w, "sem_vacuum_rough_reached %f\n", boolToFloat(rough)) + + fmt.Fprintf(w, "# HELP sem_vacuum_high_reached Whether a high vacuum has been reached (boolean)\n") + fmt.Fprintf(w, "# TYPE sem_vacuum_high_reached gauge\n") + fmt.Fprintf(w, "sem_vacuum_high_reached %f\n", boolToFloat(high)) } func (s *webServer) viewRoughingPumpEnable(w http.ResponseWriter, r *http.Request) {