diff --git a/collectors/domain_stats.go b/collectors/domain_stats.go index 40bd254..25eb53e 100644 --- a/collectors/domain_stats.go +++ b/collectors/domain_stats.go @@ -27,7 +27,7 @@ import ( type DomainStatsCollector struct { prometheus.Collector - LibvirtURI string + Connection *libvirt.Connect Nova bool @@ -86,9 +86,9 @@ type NovaMetadata struct { } // nolint:funlen -func NewDomainStatsCollector(nova bool, libvirtURI string) (*DomainStatsCollector, error) { +func NewDomainStatsCollector(nova bool, connection *libvirt.Connect) (*DomainStatsCollector, error) { return &DomainStatsCollector{ - LibvirtURI: libvirtURI, + Connection: connection, Nova: nova, DomainSeconds: prometheus.NewDesc( @@ -308,26 +308,32 @@ func (c *DomainStatsCollector) describeBlock(ch chan<- *prometheus.Desc) { } func (c *DomainStatsCollector) Collect(ch chan<- prometheus.Metric) { - conn, err := libvirt.NewConnect(c.LibvirtURI) + alive, err := c.Connection.IsAlive() if err != nil { log.Errorln(err) return } - defer func() { - alive, err := conn.IsAlive() + + if !alive { + uri, err := c.Connection.GetURI() + if err != nil { + // NOTE(mnaser): If we get to this point, we don't have + // a URI and we can't reconnect, die + log.Fatalln(err) + return + } + + c.Connection.Close() + + conn, err := libvirt.NewConnect(uri) if err != nil { log.Errorln(err) return } - if alive { - _, err := conn.Close() - if err != nil { - log.Errorln(err) - } - } - }() + c.Connection = conn + } - stats, err := conn.GetAllDomainStats( + stats, err := c.Connection.GetAllDomainStats( []*libvirt.Domain{}, libvirt.DOMAIN_STATS_STATE|libvirt.DOMAIN_STATS_CPU_TOTAL|libvirt.DOMAIN_STATS_BALLOON| libvirt.DOMAIN_STATS_VCPU|libvirt.DOMAIN_STATS_INTERFACE|libvirt.DOMAIN_STATS_BLOCK, diff --git a/collectors/version.go b/collectors/version.go index 3186b71..a76f45a 100644 --- a/collectors/version.go +++ b/collectors/version.go @@ -25,14 +25,14 @@ import ( type VersionCollector struct { prometheus.Collector - LibvirtURI string + Connection *libvirt.Connect Version *prometheus.Desc } -func NewVersionCollector(libvirtURI string) (*VersionCollector, error) { +func NewVersionCollector(connection *libvirt.Connect) (*VersionCollector, error) { return &VersionCollector{ - LibvirtURI: libvirtURI, + Connection: connection, Version: prometheus.NewDesc( "libvirtd_info", @@ -47,38 +47,44 @@ func (c *VersionCollector) Describe(ch chan<- *prometheus.Desc) { } func (c *VersionCollector) Collect(ch chan<- prometheus.Metric) { - conn, err := libvirt.NewConnect(c.LibvirtURI) + alive, err := c.Connection.IsAlive() if err != nil { log.Errorln(err) return } - defer func() { - alive, err := conn.IsAlive() + + if !alive { + uri, err := c.Connection.GetURI() + if err != nil { + // NOTE(mnaser): If we get to this point, we don't have + // a URI and we can't reconnect, die + log.Fatalln(err) + return + } + + c.Connection.Close() + + conn, err := libvirt.NewConnect(uri) if err != nil { log.Errorln(err) return } - if alive { - _, err := conn.Close() - if err != nil { - log.Errorln(err) - } - } - }() + c.Connection = conn + } - hypervisorType, err := conn.GetType() + hypervisorType, err := c.Connection.GetType() if err != nil { log.Errorln(err) return } - hypervisorVersion, err := conn.GetVersion() + hypervisorVersion, err := c.Connection.GetVersion() if err != nil { log.Errorln(err) return } - libvirtVersion, err := conn.GetLibVersion() + libvirtVersion, err := c.Connection.GetLibVersion() if err != nil { log.Errorln(err) return diff --git a/libvirtd_exporter.go b/libvirtd_exporter.go index bc39f47..94f808a 100644 --- a/libvirtd_exporter.go +++ b/libvirtd_exporter.go @@ -17,6 +17,7 @@ package main import ( "net/http" + "github.com/libvirt/libvirt-go" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/log" @@ -50,12 +51,18 @@ func main() { kingpin.HelpFlag.Short('h') kingpin.Parse() - versionCollector, err := collectors.NewVersionCollector(*libvirtURI) + conn, err := libvirt.NewConnect(*libvirtURI) + if err != nil { + log.Fatalln(err) + return + } + + versionCollector, err := collectors.NewVersionCollector(conn) if err != nil { log.Fatalln(err) } - domainStats, err := collectors.NewDomainStatsCollector(*libvirtNova, *libvirtURI) + domainStats, err := collectors.NewDomainStatsCollector(*libvirtNova, conn) if err != nil { log.Fatalln(err) }