@@ -3,81 +3,111 @@ package exporter
33import (
44 "log"
55 "strconv"
6+
7+ "github.com/prometheus/client_golang/prometheus"
68)
79
810type DroneStationCollector struct {
9- FRMAddress string
11+ endpoint string
12+ metricsDropper * MetricsDropper
13+ }
14+
15+ type DroneFuelInventory struct {
16+ Name string `json:"Name"`
17+ Amount float64 `json:"Amount"`
18+ }
19+
20+ type DroneActiveFuel struct {
21+ Name string `json:"FuelName"`
22+ Rate float64 `json:"EstimatedFuelCostRate"`
1023}
1124
1225type DroneStationDetails struct {
13- Id string `json:"ID"`
14- HomeStation string `json:"Name"`
15- PairedStation string `json:"PairedStation"`
16- DroneStatus string `json:"DroneStatus"`
17- AvgIncRate float64 `json:"AvgIncRate"`
18- AvgIncStack float64 `json:"AvgIncStack"`
19- AvgOutRate float64 `json:"AvgOutRate"`
20- AvgOutStack float64 `json"AvgOutStack"`
21- AvgRndTrip string `json:"AvgRndTrip"`
22- AvgTotalIncRate float64 `json:"AvgTotalIncRate"`
23- AvgTotalIncStack float64 `json:"AvgTotalIncStack"`
24- AvgTotalOutRate float64 `json:"AvgTotalOutRate"`
25- AvgTotalOutStack float64 `json:"AvgTotalOutStack"`
26- AvgTripIncAmt float64 `json:"AvgTripIncAmt"`
27- EstRndTrip string `json:"EstRndTrip "`
28- EstTotalTransRate float64 `json:"EstTotalTransRate "`
29- EstTransRate float64 `json:"EstTransRate "`
30- EstLatestTotalIncStack float64 `json:"EstLatestTotalIncStack "`
31- EstLatestTotalOutStack float64 `json:"EstLatestTotalOutStack "`
32- LatestIncStack float64 `json:"LatestIncStack "`
33- LatestOutStack float64 `json:"LatestOutStack "`
34- LatestRndTrip string `json:"LatestRndTrip "`
35- LatestTripIncAmt float64 `json:"LatestTripIncAmt "`
36- LatestTripOutAmt float64 `json:"LatestTripOutAmt "`
37- MedianRndTrip string `json:"MedianRndTrip "`
38- MedianTripIncAmt float64 `json:"MedianTripIncAmt "`
39- MedianTripOutAmt float64 `json:"MedianTripOutAmt "`
40- EstBatteryRate float64 `json:"EstBatteryRate "`
41- PowerInfo PowerInfo `json:"PowerInfo "`
26+ Id string `json:"ID"`
27+ HomeStation string `json:"Name"`
28+ PairedStation string `json:"PairedStation"`
29+ DroneStatus string `json:"DroneStatus"`
30+ AvgIncRate float64 `json:"AvgIncRate"`
31+ AvgIncStack float64 `json:"AvgIncStack"`
32+ AvgOutRate float64 `json:"AvgOutRate"`
33+ AvgOutStack float64 `json"AvgOutStack"`
34+ AvgRndTrip string `json:"AvgRndTrip"`
35+ AvgTotalIncRate float64 `json:"AvgTotalIncRate"`
36+ AvgTotalIncStack float64 `json:"AvgTotalIncStack"`
37+ AvgTotalOutRate float64 `json:"AvgTotalOutRate"`
38+ AvgTotalOutStack float64 `json:"AvgTotalOutStack"`
39+ AvgTripIncAmt float64 `json:"AvgTripIncAmt"`
40+ EstTotalTransRate float64 `json:"EstTotalTransRate "`
41+ EstTransRate float64 `json:"EstTransRate "`
42+ EstLatestTotalIncStack float64 `json:"EstLatestTotalIncStack "`
43+ EstLatestTotalOutStack float64 `json:"EstLatestTotalOutStack "`
44+ LatestIncStack float64 `json:"LatestIncStack "`
45+ LatestOutStack float64 `json:"LatestOutStack "`
46+ LatestRndTrip float64 `json:"LatestRndTrip "`
47+ LatestTripIncAmt float64 `json:"LatestTripIncAmt "`
48+ LatestTripOutAmt float64 `json:"LatestTripOutAmt "`
49+ MedianRndTrip string `json:"MedianRndTrip "`
50+ MedianTripIncAmt float64 `json:"MedianTripIncAmt "`
51+ MedianTripOutAmt float64 `json:"MedianTripOutAmt "`
52+ PowerInfo PowerInfo `json:"PowerInfo "`
53+ Fuel [] DroneFuelInventory `json:"FuelInventory "`
54+ ActiveFuel DroneActiveFuel `json:"ActiveFuel "`
4255}
4356
44- func NewDroneStationCollector (frmAddress string ) * DroneStationCollector {
57+ func NewDroneStationCollector (endpoint string ) * DroneStationCollector {
4558 return & DroneStationCollector {
46- FRMAddress : frmAddress ,
59+ endpoint : endpoint ,
60+ metricsDropper : NewMetricsDropper (
61+ DronePortFuelRate ,
62+ DronePortFuelAmount ,
63+ DronePortRndTrip ,
64+ ),
4765 }
4866}
4967
50- func (c * DroneStationCollector ) Collect () {
68+ func (c * DroneStationCollector ) Collect (frmAddress string , sessionName string ) {
5169 details := []DroneStationDetails {}
52- err := retrieveData (c . FRMAddress , & details )
70+ err := retrieveData (frmAddress + c . endpoint , & details )
5371 if err != nil {
72+ c .metricsDropper .DropStaleMetricLabels ()
5473 log .Printf ("error reading drone station statistics from FRM: %s\n " , err )
5574 return
5675 }
5776
5877 powerInfo := map [float64 ]float64 {}
78+ maxPowerInfo := map [float64 ]float64 {}
5979 for _ , d := range details {
80+ c .metricsDropper .CacheFreshMetricLabel (prometheus.Labels {"url" : frmAddress , "session_name" : sessionName , "id" : d .Id })
6081 id := d .Id
6182 home := d .HomeStation
6283 paired := d .PairedStation
6384
64- DronePortBatteryRate .WithLabelValues (id , home , paired ).Set (d .EstBatteryRate )
65-
66- roundTrip := parseTimeSeconds (d .LatestRndTrip )
67- if roundTrip != nil {
68- DronePortRndTrip .WithLabelValues (id , home , paired ).Set (* roundTrip )
85+ if len (d .Fuel ) > 0 {
86+ DronePortFuelAmount .WithLabelValues (id , home , d .Fuel [0 ].Name , frmAddress , sessionName ).Set (d .Fuel [0 ].Amount )
87+ DronePortFuelRate .WithLabelValues (id , home , d .Fuel [0 ].Name , frmAddress , sessionName ).Set (d .ActiveFuel .Rate )
88+ DronePortRndTrip .WithLabelValues (id , home , paired , frmAddress , sessionName ).Set (d .LatestRndTrip )
6989 }
7090
71- val , ok := powerInfo [d .PowerInfo .CircuitId ]
91+ val , ok := powerInfo [d .PowerInfo .CircuitGroupId ]
7292 if ok {
73- powerInfo [d .PowerInfo .CircuitId ] = val + d .PowerInfo .PowerConsumed
93+ powerInfo [d .PowerInfo .CircuitGroupId ] = val + d .PowerInfo .PowerConsumed
7494 } else {
75- powerInfo [d .PowerInfo .CircuitId ] = d .PowerInfo .PowerConsumed
95+ powerInfo [d .PowerInfo .CircuitGroupId ] = d .PowerInfo .PowerConsumed
96+ }
97+ val , ok = maxPowerInfo [d .PowerInfo .CircuitGroupId ]
98+ if ok {
99+ maxPowerInfo [d .PowerInfo .CircuitGroupId ] = val + d .PowerInfo .MaxPowerConsumed
100+ } else {
101+ maxPowerInfo [d .PowerInfo .CircuitGroupId ] = d .PowerInfo .MaxPowerConsumed
76102 }
77103 }
78104
79105 for circuitId , powerConsumed := range powerInfo {
80106 cid := strconv .FormatFloat (circuitId , 'f' , - 1 , 64 )
81- DronePortPower .WithLabelValues (cid ).Set (powerConsumed )
107+ DronePortPower .WithLabelValues (cid , frmAddress , sessionName ).Set (powerConsumed )
82108 }
109+
110+ c .metricsDropper .DropStaleMetricLabels ()
83111}
112+
113+ func (c * DroneStationCollector ) DropCache () {}
0 commit comments