@@ -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
3638const namespace = "systemd"
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
4750var 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+
254345func (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+
597743func (c * Collector ) newDbus () (* dbus.Conn , error ) {
598744 if * systemdPrivate {
599745 return dbus .NewSystemdConnectionContext (c .ctx )
0 commit comments