Skip to content

Commit 95c532b

Browse files
impel array_controllers
1 parent 4eaf84d commit 95c532b

File tree

3 files changed

+95
-3
lines changed

3 files changed

+95
-3
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package collectors
2+
3+
import (
4+
client "purestorage/fa-openmetrics-exporter/internal/rest-client"
5+
6+
"github.com/prometheus/client_golang/prometheus"
7+
)
8+
9+
type ControllersCollector struct {
10+
ControllersDesc *prometheus.Desc
11+
Client *client.FAClient
12+
}
13+
14+
func (c *ControllersCollector) Describe(ch chan<- *prometheus.Desc) {
15+
prometheus.DescribeByCollect(c, ch)
16+
}
17+
18+
func (c *ControllersCollector) Collect(ch chan<- prometheus.Metric) {
19+
cl := c.Client.GetControllers()
20+
if len(cl.Items) == 0 {
21+
return
22+
}
23+
for _, d := range cl.Items {
24+
ch <- prometheus.MustNewConstMetric(
25+
c.ControllersDesc,
26+
prometheus.GaugeValue,
27+
// OpenMetrics timestamps MUST be in seconds, divide as an float64 to keep precision
28+
(float64(d.ModeSince) / 1000),
29+
d.Mode, d.Model, d.Name, d.Status, d.Type, d.Version,
30+
)
31+
}
32+
}
33+
34+
func NewControllersCollector(fa *client.FAClient) *ControllersCollector {
35+
return &ControllersCollector{
36+
ControllersDesc: prometheus.NewDesc(
37+
"purefa_hw_controller_mode_since_timestamp_seconds",
38+
"FlashArray controller mode since",
39+
[]string{"mode", "model", "name", "status", "type", "version"},
40+
prometheus.Labels{},
41+
),
42+
Client: fa,
43+
}
44+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package collectors
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"net/http"
7+
"net/http/httptest"
8+
"os"
9+
"regexp"
10+
"strings"
11+
"testing"
12+
13+
client "purestorage/fa-openmetrics-exporter/internal/rest-client"
14+
)
15+
16+
func TestArrayControllersCollector(t *testing.T) {
17+
18+
rdr, _ := os.ReadFile("../../test/data/controllers.json")
19+
vers, _ := os.ReadFile("../../test/data/versions.json")
20+
var contl client.ControllersList
21+
json.Unmarshal(rdr, &contl)
22+
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
23+
url := regexp.MustCompile(`^/api/([0-9]+.[0-9]+)?/controllers$`)
24+
if r.URL.Path == "/api/api_version" {
25+
w.Header().Set("Content-Type", "application/json")
26+
w.WriteHeader(http.StatusOK)
27+
w.Write([]byte(vers))
28+
} else if url.MatchString(r.URL.Path) {
29+
w.Header().Set("x-auth-token", "faketoken")
30+
w.Header().Set("Content-Type", "application/json")
31+
w.WriteHeader(http.StatusOK)
32+
w.Write([]byte(rdr))
33+
}
34+
}))
35+
endp := strings.Split(server.URL, "/")
36+
e := endp[len(endp)-1]
37+
want := make(map[string]bool)
38+
for _, ctl := range contl.Items {
39+
want[fmt.Sprintf("label:{name:\"mode\" value:\"%s\"} label:{name:\"model\"value:\"%s\"} label:{name:\"name\" value:\"%s\"} label:{name:\"status\" value:\"%s\"} label:{name:\"type\" value:\"%s\"} label:{name:\"version\" value:\"%s\"} gauge:{value:\"%g\"}", ctl.Mode, ctl.Model, ctl.Name, ctl.Status, ctl.Type, ctl.Version, (float64(ctl.ModeSince)/1000))] = true
40+
}
41+
42+
c := client.NewRestClient(e, "fake-api-token", "latest", "test-user-agent-string", false)
43+
dc := NewControllersCollector(c)
44+
metricsCheck(t, dc, want)
45+
server.Close()
46+
}

internal/openmetrics-exporter/collector.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,29 @@ import (
55
client "purestorage/fa-openmetrics-exporter/internal/rest-client"
66

77
"github.com/prometheus/client_golang/prometheus"
8-
"github.com/prometheus/client_golang/prometheus/collectors"
8+
//"github.com/prometheus/client_golang/prometheus/collectors"
99
)
1010

1111
func Collector(ctx context.Context, metrics string, registry *prometheus.Registry, faclient *client.FAClient) bool {
1212

1313
arrayscoll := NewArraysCollector(faclient)
1414
registry.MustRegister(
15-
collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
16-
collectors.NewGoCollector(),
15+
//collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
16+
//collectors.NewGoCollector(),
1717
arrayscoll,
1818
)
1919
if metrics == "all" || metrics == "array" {
2020
alertscoll := NewAlertsCollector(faclient)
2121
arrayperfcoll := NewArraysPerformanceCollector(faclient)
2222
arrayspacecoll := NewArraySpaceCollector(faclient)
2323
hwcoll := NewHardwareCollector(faclient)
24+
controllercol := NewControllersCollector(faclient)
2425
drcoll := NewDriveCollector(faclient)
2526
nicsperfcoll := NewNetworkInterfacesPerformanceCollector(faclient)
2627
portscoll := NewPortsCollector(faclient)
2728
interfacecoll := NewNetworkInterfacesCollector(faclient)
2829
registry.MustRegister(
30+
controllercol,
2931
alertscoll,
3032
arrayperfcoll,
3133
arrayspacecoll,

0 commit comments

Comments
 (0)