Merge branch 'master' into add-drm-chip

pull/3145/head
Yurii Kondrakov 3 weeks ago committed by GitHub
commit 78918dfcfa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      .github/workflows/bsd.yml
  2. 17
      collector/fixtures/e2e-64k-page-output.txt
  3. 17
      collector/fixtures/e2e-output.txt
  4. 26
      collector/fixtures/sys.ttar
  5. 123
      collector/nvme_linux.go
  6. 10
      go.mod
  7. 20
      go.sum

@ -222,7 +222,7 @@ jobs:
- name: Checkout the repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: test-e2e
uses: vmactions/solaris-vm@37d40b6627e80434541454b42841caa4cc77d0cf # v1.2.7
uses: vmactions/solaris-vm@69d382b4a775b25ea5955e6c1730e9d05047ca0d # v1.3.1
with:
copyback: false
envs: 'GO_VERSION_SOLARIS'

@ -2825,7 +2825,22 @@ node_nfsd_server_rpcs_total 18628
node_nfsd_server_threads 8
# HELP node_nvme_info Non-numeric data from /sys/class/nvme/<device>, value is always 1.
# TYPE node_nvme_info gauge
node_nvme_info{device="nvme0",firmware_revision="1B2QEXP7",model="Samsung SSD 970 PRO 512GB",serial="S680HF8N190894I",state="live"} 1
node_nvme_info{cntlid="1997",device="nvme0",firmware_revision="1B2QEXP7",model="Samsung SSD 970 PRO 512GB",serial="S680HF8N190894I",state="live"} 1
# HELP node_nvme_namespace_capacity_bytes Capacity of the NVMe namespace in bytes. Computed as namespace_size * namespace_logical_block_size
# TYPE node_nvme_namespace_capacity_bytes gauge
node_nvme_namespace_capacity_bytes{device="nvme0",nsid="0"} 1.6e+13
# HELP node_nvme_namespace_info Information about NVMe namespaces. Value is always 1
# TYPE node_nvme_namespace_info gauge
node_nvme_namespace_info{ana_state="optimized",device="nvme0",nsid="0"} 1
# HELP node_nvme_namespace_logical_block_size_bytes Logical block size of the NVMe namespace in bytes. Usually 4Kb. Available in /sys/class/nvme/<device>/<namespace>/queue/logical_block_size
# TYPE node_nvme_namespace_logical_block_size_bytes gauge
node_nvme_namespace_logical_block_size_bytes{device="nvme0",nsid="0"} 4096
# HELP node_nvme_namespace_size_bytes Size of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/size
# TYPE node_nvme_namespace_size_bytes gauge
node_nvme_namespace_size_bytes{device="nvme0",nsid="0"} 1.6e+13
# HELP node_nvme_namespace_used_bytes Used space of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/nuse
# TYPE node_nvme_namespace_used_bytes gauge
node_nvme_namespace_used_bytes{device="nvme0",nsid="0"} 2e+12
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
# TYPE node_os_info gauge
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1

@ -2857,7 +2857,22 @@ node_nfsd_server_rpcs_total 18628
node_nfsd_server_threads 8
# HELP node_nvme_info Non-numeric data from /sys/class/nvme/<device>, value is always 1.
# TYPE node_nvme_info gauge
node_nvme_info{device="nvme0",firmware_revision="1B2QEXP7",model="Samsung SSD 970 PRO 512GB",serial="S680HF8N190894I",state="live"} 1
node_nvme_info{cntlid="1997",device="nvme0",firmware_revision="1B2QEXP7",model="Samsung SSD 970 PRO 512GB",serial="S680HF8N190894I",state="live"} 1
# HELP node_nvme_namespace_capacity_bytes Capacity of the NVMe namespace in bytes. Computed as namespace_size * namespace_logical_block_size
# TYPE node_nvme_namespace_capacity_bytes gauge
node_nvme_namespace_capacity_bytes{device="nvme0",nsid="0"} 1.6e+13
# HELP node_nvme_namespace_info Information about NVMe namespaces. Value is always 1
# TYPE node_nvme_namespace_info gauge
node_nvme_namespace_info{ana_state="optimized",device="nvme0",nsid="0"} 1
# HELP node_nvme_namespace_logical_block_size_bytes Logical block size of the NVMe namespace in bytes. Usually 4Kb. Available in /sys/class/nvme/<device>/<namespace>/queue/logical_block_size
# TYPE node_nvme_namespace_logical_block_size_bytes gauge
node_nvme_namespace_logical_block_size_bytes{device="nvme0",nsid="0"} 4096
# HELP node_nvme_namespace_size_bytes Size of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/size
# TYPE node_nvme_namespace_size_bytes gauge
node_nvme_namespace_size_bytes{device="nvme0",nsid="0"} 1.6e+13
# HELP node_nvme_namespace_used_bytes Used space of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/nuse
# TYPE node_nvme_namespace_used_bytes gauge
node_nvme_namespace_used_bytes{device="nvme0",nsid="0"} 2e+12
# HELP node_os_info A metric with a constant '1' value labeled by build_id, id, id_like, image_id, image_version, name, pretty_name, variant, variant_id, version, version_codename, version_id.
# TYPE node_os_info gauge
node_os_info{build_id="",id="ubuntu",id_like="debian",image_id="",image_version="",name="Ubuntu",pretty_name="Ubuntu 20.04.2 LTS",variant="",variant_id="",version="20.04.2 LTS (Focal Fossa)",version_codename="focal",version_id="20.04"} 1

@ -2229,6 +2229,32 @@ Lines: 1
live
Mode: 444
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/class/nvme/nvme0/nvme0c0n0
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/nvme/nvme0/nvme0c0n0/ana_state
Lines: 1
optimized
Mode: 444
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/nvme/nvme0/nvme0c0n0/size
Lines: 1
3906250000
Mode: 444
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/nvme/nvme0/nvme0c0n0/nuse
Lines: 1
488281250
Mode: 444
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/class/nvme/nvme0/nvme0c0n0/queue
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/nvme/nvme0/nvme0c0n0/queue/logical_block_size
Lines: 1
4096
Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/class/power_supply
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

@ -26,8 +26,14 @@ import (
)
type nvmeCollector struct {
fs sysfs.FS
logger *slog.Logger
fs sysfs.FS
logger *slog.Logger
namespaceInfo *prometheus.Desc
namespaceCapacityBytes *prometheus.Desc
namespaceSizeBytes *prometheus.Desc
namespaceUsedBytes *prometheus.Desc
namespaceLogicalBlockSizeBytes *prometheus.Desc
info *prometheus.Desc
}
func init() {
@ -41,9 +47,51 @@ func NewNVMeCollector(logger *slog.Logger) (Collector, error) {
return nil, fmt.Errorf("failed to open sysfs: %w", err)
}
info := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "info"),
"Non-numeric data from /sys/class/nvme/<device>, value is always 1.",
[]string{"device", "firmware_revision", "model", "serial", "state", "cntlid"},
nil,
)
namespaceInfo := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "namespace_info"),
"Information about NVMe namespaces. Value is always 1",
[]string{"device", "nsid", "ana_state"}, nil,
)
namespaceCapacityBytes := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "namespace_capacity_bytes"),
"Capacity of the NVMe namespace in bytes. Computed as namespace_size * namespace_logical_block_size",
[]string{"device", "nsid"}, nil,
)
namespaceSizeBytes := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "namespace_size_bytes"),
"Size of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/size",
[]string{"device", "nsid"}, nil,
)
namespaceUsedBytes := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "namespace_used_bytes"),
"Used space of the NVMe namespace in bytes. Available in /sys/class/nvme/<device>/<namespace>/nuse",
[]string{"device", "nsid"}, nil,
)
namespaceLogicalBlockSizeBytes := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "namespace_logical_block_size_bytes"),
"Logical block size of the NVMe namespace in bytes. Usually 4Kb. Available in /sys/class/nvme/<device>/<namespace>/queue/logical_block_size",
[]string{"device", "nsid"}, nil,
)
return &nvmeCollector{
fs: fs,
logger: logger,
fs: fs,
logger: logger,
namespaceInfo: namespaceInfo,
namespaceCapacityBytes: namespaceCapacityBytes,
namespaceSizeBytes: namespaceSizeBytes,
namespaceUsedBytes: namespaceUsedBytes,
namespaceLogicalBlockSizeBytes: namespaceLogicalBlockSizeBytes,
info: info,
}, nil
}
@ -58,14 +106,67 @@ func (c *nvmeCollector) Update(ch chan<- prometheus.Metric) error {
}
for _, device := range devices {
infoDesc := prometheus.NewDesc(
prometheus.BuildFQName(namespace, "nvme", "info"),
"Non-numeric data from /sys/class/nvme/<device>, value is always 1.",
[]string{"device", "firmware_revision", "model", "serial", "state"},
nil,
// Export device-level metrics
ch <- prometheus.MustNewConstMetric(
c.info,
prometheus.GaugeValue,
1.0,
device.Name,
device.FirmwareRevision,
device.Model,
device.Serial,
device.State,
device.ControllerID,
)
infoValue := 1.0
ch <- prometheus.MustNewConstMetric(infoDesc, prometheus.GaugeValue, infoValue, device.Name, device.FirmwareRevision, device.Model, device.Serial, device.State)
// Export namespace-level metrics
for _, namespace := range device.Namespaces {
// Namespace info metric
ch <- prometheus.MustNewConstMetric(
c.namespaceInfo,
prometheus.GaugeValue,
1.0,
device.Name,
namespace.ID,
namespace.ANAState,
)
// Namespace capacity in bytes
ch <- prometheus.MustNewConstMetric(
c.namespaceCapacityBytes,
prometheus.GaugeValue,
float64(namespace.CapacityBytes),
device.Name,
namespace.ID,
)
// Namespace size in bytes
ch <- prometheus.MustNewConstMetric(
c.namespaceSizeBytes,
prometheus.GaugeValue,
float64(namespace.SizeBytes),
device.Name,
namespace.ID,
)
// Namespace used space in bytes
ch <- prometheus.MustNewConstMetric(
c.namespaceUsedBytes,
prometheus.GaugeValue,
float64(namespace.UsedBytes),
device.Name,
namespace.ID,
)
// Namespace logical block size in bytes
ch <- prometheus.MustNewConstMetric(
c.namespaceLogicalBlockSizeBytes,
prometheus.GaugeValue,
float64(namespace.LogicalBlockSize),
device.Name,
namespace.ID,
)
}
}
return nil

@ -16,7 +16,7 @@ require (
github.com/lufia/iostat v1.2.1
github.com/mattn/go-xmlrpc v0.0.3
github.com/mdlayher/ethtool v0.5.1
github.com/mdlayher/netlink v1.8.0
github.com/mdlayher/netlink v1.9.0
github.com/mdlayher/wifi v0.7.2
github.com/opencontainers/selinux v1.13.1
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55
@ -25,7 +25,7 @@ require (
github.com/prometheus/client_model v0.6.2
github.com/prometheus/common v0.67.5
github.com/prometheus/exporter-toolkit v0.15.1
github.com/prometheus/procfs v0.20.0
github.com/prometheus/procfs v0.20.1
github.com/safchain/ethtool v0.7.0
golang.org/x/sys v0.41.0
howett.net/plist v1.0.1
@ -53,11 +53,11 @@ require (
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
golang.org/x/crypto v0.46.0 // indirect
golang.org/x/net v0.48.0 // indirect
golang.org/x/crypto v0.48.0 // indirect
golang.org/x/net v0.50.0 // indirect
golang.org/x/oauth2 v0.34.0 // indirect
golang.org/x/sync v0.19.0 // indirect
golang.org/x/text v0.32.0 // indirect
golang.org/x/text v0.34.0 // indirect
golang.org/x/time v0.14.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
)

@ -60,8 +60,8 @@ github.com/mdlayher/ethtool v0.5.1 h1:U4GThY6WgNJUJsMrUzBmoOTdQHFWxFPTHTeNnn3GCv
github.com/mdlayher/ethtool v0.5.1/go.mod h1:Pz39PaAy96Ea1SrCvEO/pPEAeULvRJjO6zspuEMhJy4=
github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw=
github.com/mdlayher/genetlink v1.3.2/go.mod h1:tcC3pkCrPUGIKKsCsp0B3AdaaKuHtaxoJRz3cc+528o=
github.com/mdlayher/netlink v1.8.0 h1:e7XNIYJKD7hUct3Px04RuIGJbBxy1/c4nX7D5YyvvlM=
github.com/mdlayher/netlink v1.8.0/go.mod h1:UhgKXUlDQhzb09DrCl2GuRNEglHmhYoWAHid9HK3594=
github.com/mdlayher/netlink v1.9.0 h1:G8+GLq2x3v4D4MVIqDdNUhTUC7TKiCy/6MDkmItfKco=
github.com/mdlayher/netlink v1.9.0/go.mod h1:YBnl5BXsCoRuwBjKKlZ+aYmEoq0r12FDA/3JC+94KDg=
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
@ -88,8 +88,8 @@ github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTU
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
github.com/prometheus/exporter-toolkit v0.15.1 h1:XrGGr/qWl8Gd+pqJqTkNLww9eG8vR/CoRk0FubOKfLE=
github.com/prometheus/exporter-toolkit v0.15.1/go.mod h1:P/NR9qFRGbCFgpklyhix9F6v6fFr/VQB/CVsrMDGKo4=
github.com/prometheus/procfs v0.20.0 h1:AA7aCvjxwAquZAlonN7888f2u4IN8WVeFgBi4k82M4Q=
github.com/prometheus/procfs v0.20.0/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/safchain/ethtool v0.7.0 h1:rlJzfDetsVvT61uz8x1YIcFn12akMfuPulHtZjtb7Is=
@ -117,10 +117,10 @@ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
@ -129,8 +129,8 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=

Loading…
Cancel
Save