mercedes-byocar-exporter/internal/exporters/prometheus/metrics.go
Knut Ahlers b51d41f15e
Add support for electric vehicles
Signed-off-by: Knut Ahlers <knut@ahlers.me>
2022-12-04 00:27:08 +01:00

182 lines
6.2 KiB
Go

package prometheus
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
const (
labelVehicleID = "vehicle_id"
labelDoor = "door"
labelLight = "light"
labelWindow = "window"
metricsNamespace = "mercedes_byocar"
subsystemElectricStatus = `electric_status`
subsystemFuelStatus = "fuel_status"
subsystemLockStatus = "lock_status"
subsystemPayAsYouDrive = "pay_as_you_drive"
subsystemVehicleStatus = "vehicle_status"
)
var (
electricSOC *prometheus.GaugeVec
electricRange *prometheus.GaugeVec
fuelRangeLiquidVec *prometheus.GaugeVec
fuelTanklevelPercent *prometheus.GaugeVec
lockDeckLidUnlocked *prometheus.GaugeVec
lockVehicleStatus *prometheus.GaugeVec
lockGasLidUnlocked *prometheus.GaugeVec
lockHeading *prometheus.GaugeVec
paydOdometer *prometheus.GaugeVec
vehicleDeckLidOpen *prometheus.GaugeVec
vehicleDoorOpen *prometheus.GaugeVec
vehicleInteriorLight *prometheus.GaugeVec
vehicleLightSwitch *prometheus.GaugeVec
vehicleReadingLampOn *prometheus.GaugeVec
vehicleRoofTopStatus *prometheus.GaugeVec
vehicleSunRoofStatus *prometheus.GaugeVec
vehicleWindowStatus *prometheus.GaugeVec
)
func init() {
initElectricStatus()
initFuelStatus()
initLockStatus()
initPAYD()
initVehicleStatus()
}
func initElectricStatus() {
electricRange = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemElectricStatus,
Name: "electric_range",
Help: "Electric range - 0..2046 km",
}, []string{labelVehicleID})
electricSOC = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemElectricStatus,
Name: "state_of_charge",
Help: "Displayed state of charge for the HV battery - 0..100 %",
}, []string{labelVehicleID})
}
func initFuelStatus() {
fuelRangeLiquidVec = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemFuelStatus,
Name: "range_liquid",
Help: "Liquid fuel tank range - 0..2046 km",
}, []string{labelVehicleID})
fuelTanklevelPercent = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemFuelStatus,
Name: "tanklevel_percent",
Help: "Liquid fuel tank level - 0..100 %",
}, []string{labelVehicleID})
}
func initLockStatus() {
lockDeckLidUnlocked = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemLockStatus,
Name: "deck_lid_unlocked",
Help: "Lock status of the deck lid - 1 = unlocked",
}, []string{labelVehicleID})
lockVehicleStatus = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemLockStatus,
Name: "vehicle_status",
Help: "Vehicle lock status - 0 = unlocked, 1 = internal locked, 2 = external locked, 3 = selective unlocked",
}, []string{labelVehicleID})
lockGasLidUnlocked = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemLockStatus,
Name: "gas_lid_unlocked",
Help: "Status of gas tank door lock - 1 = unlocked",
}, []string{labelVehicleID})
lockHeading = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemLockStatus,
Name: "heading",
Help: "Vehicle heading position - 0..359.9 degrees",
}, []string{labelVehicleID})
}
func initPAYD() {
paydOdometer = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemPayAsYouDrive,
Name: "odometer",
Help: "Odometer - 0..999999 km",
}, []string{labelVehicleID})
}
func initVehicleStatus() {
vehicleDeckLidOpen = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "deck_lid_open",
Help: "Deck lid latch status opened/closed state - 1 = open",
}, []string{labelVehicleID})
vehicleDoorOpen = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "door_open",
Help: "Status of respective door - 1 = open",
}, []string{labelVehicleID, labelDoor})
vehicleInteriorLight = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "interior_light_on",
Help: "Status of respective interior light - 1 = on",
}, []string{labelVehicleID, labelLight})
vehicleLightSwitch = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "light_switch_position",
Help: "Rotary light switch position - 0 = auto, 1 = headlights, 2 = sidelight left, 3 = sidelight right, 4 = parking light",
}, []string{labelVehicleID})
vehicleReadingLampOn = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "reading_lamp_on",
Help: "Status of respective reading lamp - 1 = on",
}, []string{labelVehicleID, labelLight})
vehicleRoofTopStatus = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "roof_top_status",
Help: "Status of the convertible top - 0 = unlocked, 1 = open and locked, 2 = closed and locked",
}, []string{labelVehicleID})
vehicleSunRoofStatus = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "sun_roof_status",
Help: "Status of the sunroof - 0 = Tilt/slide sunroof is closed, 1 = Tilt/slide sunroof is complete open, 2 = Lifting roof is open, 3 = Tilt/slide sunroof is running, 4 = Tilt/slide sunroof in anti-booming position, 5 = Sliding roof in intermediate position, 6 = Lifting roof in intermediate position",
}, []string{labelVehicleID})
vehicleWindowStatus = promauto.NewGaugeVec(prometheus.GaugeOpts{
Namespace: metricsNamespace,
Subsystem: subsystemVehicleStatus,
Name: "window_status",
Help: "Status of respective window - 0 = window in intermediate position, 1 = window completely opened, 2 = window completely closed, 3 = window airing position, 4 = window intermediate airing position, 5 = window currently running",
}, []string{labelVehicleID, labelWindow})
}