diff --git a/main.go b/main.go index 0d66446250537ae2e98a10fb0a47cec520df1586..2cc2e1b8f917efcdaf2e541567d188697d8b3dee 100644 --- a/main.go +++ b/main.go @@ -51,12 +51,12 @@ type ApiError struct { Message string `json:"message"` } -type ResultObject struct { +type VolumeStatus struct { State []string `json:"state"` Errors []string `json:"errors"` } -type ResultSensor struct { +type Sensor struct { Name string `json:"name"` Value string `json:"value"` State string `json:"state"` @@ -65,6 +65,10 @@ type ResultSensor struct { Type string `json:"type"` } +type LicenseInfo struct { + DaysLeft string `json:"license_days_left"` +} + type Exporter struct { URI string mutex sync.Mutex @@ -72,13 +76,14 @@ type Exporter struct { apiReachable float64 - up *prometheus.Desc - scrapeFailures prometheus.Counter - volumeOnline *prometheus.Desc - jbodStatus *prometheus.Desc - jbodTemp *prometheus.Desc - jbodVoltage *prometheus.Desc - jbodSlotStatus *prometheus.Desc + up *prometheus.Desc + scrapeFailures prometheus.Counter + volumeOnline *prometheus.Desc + jbodStatus *prometheus.Desc + jbodTemp *prometheus.Desc + jbodVoltage *prometheus.Desc + jbodSlotStatus *prometheus.Desc + licenseDaysLeft *prometheus.Desc } func NewExporter(uri string) *Exporter { @@ -124,6 +129,12 @@ func NewExporter(uri string) *Exporter { []string{"jbod", "slot", "state"}, nil, ), + licenseDaysLeft: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "license", "days_left"), + "License days left.", + nil, + nil, + ), client: &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: *insecure}, @@ -187,6 +198,12 @@ func (e *Exporter) collect(ch chan<- prometheus.Metric) error { } } + // License + err = e.getLicenseInfo(ch) + if err != nil { + err = fmt.Errorf("getLicenseInfo(): %v", err) + } + return err } @@ -206,12 +223,12 @@ func (e *Exporter) getVolumeStatus(ch chan<- prometheus.Metric, volume string) e apiResponse, err := e.queryApi(ch, "volume", "get_status", []string{volume}); if err != nil { return err } apiResult, err := json.Marshal(apiResponse.Result); if err != nil { return err } - var result = new(ResultObject) - err = json.Unmarshal(apiResult, &result); if err != nil { return err } + var volumeStatus = new(VolumeStatus) + err = json.Unmarshal(apiResult, &volumeStatus); if err != nil { return err } var volumeOnline float64 = 0 - if len(result.State) > 0 { - if result.State[0] == "ONLINE" { volumeOnline = 1 } + if len(volumeStatus.State) > 0 { + if volumeStatus.State[0] == "ONLINE" { volumeOnline = 1 } } ch <- prometheus.MustNewConstMetric(e.volumeOnline, prometheus.GaugeValue, volumeOnline, volume) @@ -235,7 +252,7 @@ func (e *Exporter) getJBODSensors(ch chan<- prometheus.Metric, jbod string) erro apiResponse, err := e.queryApi(ch, "jbod", "get_sensors", []string{jbod}); if err != nil { return err } apiResult, err := json.Marshal(apiResponse.Result); if err != nil { return err } - var sensors []ResultSensor + var sensors []Sensor err = json.Unmarshal([]byte(apiResult), &sensors) for _, sensor := range sensors { @@ -265,6 +282,20 @@ func (e *Exporter) getJBODSensors(ch chan<- prometheus.Metric, jbod string) erro return err } +func (e *Exporter) getLicenseInfo(ch chan<- prometheus.Metric) error { + + apiResponse, err := e.queryApi(ch, "appliance", "get_license_info", []string{}); if err != nil { return err } + apiResult, err := json.Marshal(apiResponse.Result); if err != nil { return err } + + var licenseInfo LicenseInfo + err = json.Unmarshal([]byte(apiResult), &licenseInfo) + + daysLeft, _ := strconv.ParseFloat(licenseInfo.DaysLeft, 64) + ch <- prometheus.MustNewConstMetric(e.licenseDaysLeft, prometheus.GaugeValue, daysLeft) + + return err +} + func (e *Exporter) queryApi(ch chan<- prometheus.Metric, object string, method string, params []string) (*ApiResponse, error) { reqObject := &ApiRequest{