diff --git a/collector/systemd_linux.go b/collector/systemd_linux.go index ee2ded8d..a21cc3cb 100644 --- a/collector/systemd_linux.go +++ b/collector/systemd_linux.go @@ -74,6 +74,7 @@ type systemdCollector struct { socketCurrentConnectionsDesc *prometheus.Desc socketRefusedConnectionsDesc *prometheus.Desc systemdVersionDesc *prometheus.Desc + virtualizationDesc *prometheus.Desc // Use regexps for more flexibility than device_filter.go allows systemdUnitIncludePattern *regexp.Regexp systemdUnitExcludePattern *regexp.Regexp @@ -132,6 +133,9 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) { systemdVersionDesc := prometheus.NewDesc( prometheus.BuildFQName(namespace, subsystem, "version"), "Detected systemd version", []string{"version"}, nil) + virtualizationDesc := prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "virtualization_info"), + "Detected virtualization technology", []string{"virtualization_type"}, nil) if *oldSystemdUnitExclude != "" { if !systemdUnitExcludeSet { @@ -167,6 +171,7 @@ func NewSystemdCollector(logger *slog.Logger) (Collector, error) { socketCurrentConnectionsDesc: socketCurrentConnectionsDesc, socketRefusedConnectionsDesc: socketRefusedConnectionsDesc, systemdVersionDesc: systemdVersionDesc, + virtualizationDesc: virtualizationDesc, systemdUnitIncludePattern: systemdUnitIncludePattern, systemdUnitExcludePattern: systemdUnitExcludePattern, logger: logger, @@ -194,6 +199,14 @@ func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error { systemdVersionFull, ) + systemdVirtualization := c.getSystemdVirtualization(conn) + ch <- prometheus.MustNewConstMetric( + c.virtualizationDesc, + prometheus.GaugeValue, + 1.0, + systemdVirtualization, + ) + allUnits, err := c.getAllUnits(conn) if err != nil { return fmt.Errorf("couldn't get units: %w", err) @@ -505,3 +518,19 @@ func (c *systemdCollector) getSystemdVersion(conn *dbus.Conn) (float64, string) } return v, version } + +func (c *systemdCollector) getSystemdVirtualization(conn *dbus.Conn) string { + virt, err := conn.GetManagerProperty("Virtualization") + if err != nil { + c.logger.Debug("Could not get Virtualization property", "err", err) + return "unknown" + } + + virtStr := strings.Trim(virt, `"`) + if virtStr == "" { + // If no virtualization type is returned, assume it's bare metal. + return "none" + } + + return virtStr +}