diff --git a/main.go b/main.go index b3b66b8..ddbdd45 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,7 @@ const ( systemNode = "node" systemNamespace = "ns" systemLatency = "latency" + systemSet = "set" ) var ( @@ -92,6 +93,7 @@ func newAsCollector(nodeAddr string) *asCollector { newStatsCollector(), newNSCollector(), newLatencyCollector(), + newSetCollector(), }, } } diff --git a/metric.go b/metric.go index 598f4f2..9fcdac6 100644 --- a/metric.go +++ b/metric.go @@ -46,10 +46,12 @@ func infoCollect( func parseInfo(s string) map[string]string { r := map[string]string{} - for _, v := range strings.Split(s, ";") { - kv := strings.SplitN(v, "=", 2) - if len(kv) > 1 { - r[kv[0]] = kv[1] + for _, l := range strings.Split(s, ";") { + for _, v := range strings.Split(l, ":") { + kv := strings.SplitN(v, "=", 2) + if len(kv) > 1 { + r[kv[0]] = kv[1] + } } } return r diff --git a/metric_test.go b/metric_test.go index aaab7e5..a97f2c3 100644 --- a/metric_test.go +++ b/metric_test.go @@ -22,6 +22,13 @@ func TestParseInfo(t *testing.T) { "version=my=version": { "version": "my=version", }, + "ns=vk:set=user:objects=2501:memory_data_bytes=0:deleting=false": { + "ns": "vk", + "set": "user", + "objects": "2501", + "memory_data_bytes": "0", + "deleting": "false", + }, } { if have, want := parseInfo(k), v; !reflect.DeepEqual(have, want) { t.Errorf("have %+v, want %+v", have, want) diff --git a/sets.go b/sets.go new file mode 100644 index 0000000..c76525a --- /dev/null +++ b/sets.go @@ -0,0 +1,56 @@ +package main + +import ( + "log" + "strings" + + as "github.com/aerospike/aerospike-client-go" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + // SetMetrics lists the keys we report from aero's sets + // command. + // See `asinfo -l -v sets` for the full list. + SetMetrics = []metric{ + gauge("objects", "objects"), + gauge("memory_data_bytes", "memory data bytes"), + counter("stop-writes-count", "stop writes count"), + } +) + +type setCollector cmetrics + +func newSetCollector() setCollector { + set := map[string]cmetric{} + for _, m := range SetMetrics { + set[m.aeroName] = cmetric{ + typ: m.typ, + desc: prometheus.NewDesc( + promkey(systemSet, m.aeroName), + m.desc, + []string{"namespace", "set"}, + nil, + ), + } + } + return set +} + +func (setc setCollector) describe(ch chan<- *prometheus.Desc) { + for _, s := range setc { + ch <- s.desc + } +} + +func (setc setCollector) collect(conn *as.Connection, ch chan<- prometheus.Metric) { + info, err := as.RequestInfo(conn, "sets") + if err != nil { + log.Print(err) + return + } + for _, setInfo := range strings.Split(info["sets"], ";") { + setStats := parseInfo(setInfo) + infoCollect(ch, cmetrics(setc), setInfo, setStats["ns"], setStats["set"]) + } +}