Skip to content

Commit 4fdb7cd

Browse files
committed
implement systemd-resolved metrics collector
- collect systemd-resolved metrics through dbus - add new option to enable collector - fix #37 Signed-off-by: egmc <[email protected]>
1 parent 63d00c7 commit 4fdb7cd

File tree

2 files changed

+147
-1
lines changed

2 files changed

+147
-1
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/alecthomas/kingpin/v2 v2.3.2
77
github.com/coreos/go-systemd/v22 v22.5.0
88
github.com/go-kit/log v0.2.1
9+
github.com/godbus/dbus/v5 v5.0.4
910
github.com/pkg/errors v0.9.1
1011
github.com/prometheus/client_golang v1.17.0
1112
github.com/prometheus/common v0.45.0
@@ -17,7 +18,6 @@ require (
1718
github.com/beorn7/perks v1.0.1 // indirect
1819
github.com/cespare/xxhash/v2 v2.2.0 // indirect
1920
github.com/go-logfmt/logfmt v0.5.1 // indirect
20-
github.com/godbus/dbus/v5 v5.0.4 // indirect
2121
github.com/golang/protobuf v1.5.3 // indirect
2222
github.com/jpillora/backoff v1.0.0 // indirect
2323
github.com/kr/text v0.2.0 // indirect

systemd/systemd.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"github.com/go-kit/log/level"
3232
"github.com/pkg/errors"
3333
"github.com/prometheus/client_golang/prometheus"
34+
35+
godbus "github.com/godbus/dbus/v5"
3436
)
3537

3638
const namespace = "systemd"
@@ -42,6 +44,7 @@ var (
4244
systemdUser = kingpin.Flag("systemd.collector.user", "Connect to the user systemd instance.").Bool()
4345
enableRestartsMetrics = kingpin.Flag("systemd.collector.enable-restart-count", "Enables service restart count metrics. This feature only works with systemd 235 and above.").Bool()
4446
enableIPAccountingMetrics = kingpin.Flag("systemd.collector.enable-ip-accounting", "Enables service ip accounting metrics. This feature only works with systemd 235 and above.").Bool()
47+
enableResolvedgMetrics = kingpin.Flag("systemd.collector.enable-resolved", "Enable systemd-resolved statistics").Bool()
4548
)
4649

4750
var unitStatesName = []string{"active", "activating", "deactivating", "inactive", "failed"}
@@ -80,6 +83,16 @@ type Collector struct {
8083

8184
unitIncludePattern *regexp.Regexp
8285
unitExcludePattern *regexp.Regexp
86+
87+
resolvedCurrentTransactions *prometheus.Desc
88+
resolvedTotalTransactions *prometheus.Desc
89+
resolvedCurrentCacheSize *prometheus.Desc
90+
resolvedTotalCacheHits *prometheus.Desc
91+
resolvedTotalCacheMisses *prometheus.Desc
92+
resolvedTotalSecure *prometheus.Desc
93+
resolvedTotalInsecure *prometheus.Desc
94+
resolvedTotalBogus *prometheus.Desc
95+
resolvedTotalIndeterminate *prometheus.Desc
8396
}
8497

8598
// NewCollector returns a new Collector exposing systemd statistics.
@@ -189,6 +202,53 @@ func NewCollector(logger log.Logger) (*Collector, error) {
189202
unitIncludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *unitInclude))
190203
unitExcludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *unitExclude))
191204

205+
// resolved metrics
206+
resolvedCurrentTransactions := prometheus.NewDesc(
207+
prometheus.BuildFQName(namespace, "", "resolved_current_transactions"),
208+
"Resolved Current Transactions",
209+
nil, nil,
210+
)
211+
resolvedTotalTransactions := prometheus.NewDesc(
212+
prometheus.BuildFQName(namespace, "", "resolved_transactions_total"),
213+
"Resolved Total Transactions",
214+
nil, nil,
215+
)
216+
resolvedCurrentCacheSize := prometheus.NewDesc(
217+
prometheus.BuildFQName(namespace, "", "resolved_current_cache_size"),
218+
"Resolved Current Cache Size",
219+
nil, nil,
220+
)
221+
resolvedTotalCacheHits := prometheus.NewDesc(
222+
prometheus.BuildFQName(namespace, "", "resolved_cache_hits_total"),
223+
"Resolved Total Cache Hits",
224+
nil, nil,
225+
)
226+
resolvedTotalCacheMisses := prometheus.NewDesc(
227+
prometheus.BuildFQName(namespace, "", "resolved_cache_misses_total"),
228+
"Resolved Total Cache Misses",
229+
nil, nil,
230+
)
231+
resolvedTotalSecure := prometheus.NewDesc(
232+
prometheus.BuildFQName(namespace, "", "resolved_dnssec_secure_total"),
233+
"Resolved Total number of DNSSEC Verdicts Secure",
234+
nil, nil,
235+
)
236+
resolvedTotalInsecure := prometheus.NewDesc(
237+
prometheus.BuildFQName(namespace, "", "resolved_dnssec_insecure_total"),
238+
"Resolved Total number of DNSSEC Verdicts Insecure",
239+
nil, nil,
240+
)
241+
resolvedTotalBogus := prometheus.NewDesc(
242+
prometheus.BuildFQName(namespace, "", "resolved_dnssec_bogus_total"),
243+
"Resolved Total number of DNSSEC Verdicts Boguss",
244+
nil, nil,
245+
)
246+
resolvedTotalIndeterminate := prometheus.NewDesc(
247+
prometheus.BuildFQName(namespace, "", "resolved_dnssec_indeterminate_total"),
248+
"Resolved Total number of DNSSEC Verdicts Indeterminat",
249+
nil, nil,
250+
)
251+
192252
// TODO: Build a custom handler to pass in the scrape http context.
193253
ctx := context.TODO()
194254
return &Collector{
@@ -215,6 +275,16 @@ func NewCollector(logger log.Logger) (*Collector, error) {
215275
ipEgressPackets: ipEgressPackets,
216276
unitIncludePattern: unitIncludePattern,
217277
unitExcludePattern: unitExcludePattern,
278+
279+
resolvedCurrentTransactions: resolvedCurrentTransactions,
280+
resolvedTotalTransactions: resolvedTotalTransactions,
281+
resolvedCurrentCacheSize: resolvedCurrentCacheSize,
282+
resolvedTotalCacheHits: resolvedTotalCacheHits,
283+
resolvedTotalCacheMisses: resolvedTotalCacheMisses,
284+
resolvedTotalSecure: resolvedTotalSecure,
285+
resolvedTotalInsecure: resolvedTotalInsecure,
286+
resolvedTotalBogus: resolvedTotalBogus,
287+
resolvedTotalIndeterminate: resolvedTotalIndeterminate,
218288
}, nil
219289
}
220290

@@ -243,6 +313,15 @@ func (c *Collector) Describe(desc chan<- *prometheus.Desc) {
243313
desc <- c.ipEgressBytes
244314
desc <- c.ipIngressPackets
245315
desc <- c.ipEgressPackets
316+
desc <- c.resolvedCurrentTransactions
317+
desc <- c.resolvedTotalTransactions
318+
desc <- c.resolvedCurrentCacheSize
319+
desc <- c.resolvedTotalCacheHits
320+
desc <- c.resolvedTotalCacheMisses
321+
desc <- c.resolvedTotalSecure
322+
desc <- c.resolvedTotalInsecure
323+
desc <- c.resolvedTotalBogus
324+
desc <- c.resolvedTotalIndeterminate
246325

247326
}
248327

@@ -251,6 +330,18 @@ func parseUnitType(unit dbus.UnitStatus) string {
251330
return t[len(t)-1]
252331
}
253332

333+
func parseProperty(object godbus.BusObject, path string) (ret []float64, err error) {
334+
variant, err := object.GetProperty(path)
335+
if err != nil {
336+
return nil, err
337+
}
338+
for _, v := range variant.Value().([]interface{}) {
339+
i := v.(uint64)
340+
ret = append(ret, float64(i))
341+
}
342+
return ret, err
343+
}
344+
254345
func (c *Collector) collect(ch chan<- prometheus.Metric) error {
255346
begin := time.Now()
256347
conn, err := c.newDbus()
@@ -282,6 +373,14 @@ func (c *Collector) collect(ch chan<- prometheus.Metric) error {
282373
}
283374

284375
wg.Wait()
376+
377+
if *enableResolvedgMetrics {
378+
err := c.collectResolvedMetrics(ch)
379+
if err != nil {
380+
level.Warn(c.logger).Log("msg", "couldn't get resolved metrics", "err", err)
381+
}
382+
}
383+
285384
return nil
286385
}
287386

@@ -594,6 +693,53 @@ func (c *Collector) collectTimerTriggerTime(conn *dbus.Conn, ch chan<- prometheu
594693
return nil
595694
}
596695

696+
func (c *Collector) collectResolvedMetrics(ch chan<- prometheus.Metric) error {
697+
698+
conn, err := godbus.ConnectSystemBus()
699+
if err != nil {
700+
return err
701+
}
702+
703+
defer conn.Close()
704+
705+
obj := conn.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1")
706+
707+
cacheStats, err := parseProperty(obj, "org.freedesktop.resolve1.Manager.CacheStatistics")
708+
if err != nil {
709+
return err
710+
}
711+
712+
ch <- prometheus.MustNewConstMetric(c.resolvedCurrentCacheSize, prometheus.GaugeValue,
713+
float64(cacheStats[0]))
714+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalCacheHits, prometheus.CounterValue,
715+
float64(cacheStats[1]))
716+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalCacheMisses, prometheus.CounterValue,
717+
float64(cacheStats[2]))
718+
719+
transactionStats, err := parseProperty(obj, "org.freedesktop.resolve1.Manager.TransactionStatistics")
720+
ch <- prometheus.MustNewConstMetric(c.resolvedCurrentTransactions, prometheus.GaugeValue,
721+
float64(transactionStats[0]))
722+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalTransactions, prometheus.CounterValue,
723+
float64(transactionStats[1]))
724+
if err != nil {
725+
return err
726+
}
727+
728+
dnssecStats, err := parseProperty(obj, "org.freedesktop.resolve1.Manager.DNSSECStatistics")
729+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalSecure, prometheus.CounterValue,
730+
float64(dnssecStats[0]))
731+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalInsecure, prometheus.CounterValue,
732+
float64(dnssecStats[1]))
733+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalBogus, prometheus.CounterValue,
734+
float64(dnssecStats[2]))
735+
ch <- prometheus.MustNewConstMetric(c.resolvedTotalIndeterminate, prometheus.CounterValue,
736+
float64(dnssecStats[3]))
737+
if err != nil {
738+
return err
739+
}
740+
return nil
741+
}
742+
597743
func (c *Collector) newDbus() (*dbus.Conn, error) {
598744
if *systemdPrivate {
599745
return dbus.NewSystemdConnectionContext(c.ctx)

0 commit comments

Comments
 (0)