1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
-- depends on luci-lib-nixio
local nix = require "nixio"
local function scrape()
-- node exporter description - Filesystem size in bytes
local metric_size_bytes = metric("node_filesystem_size_bytes", "gauge")
-- node exporter description - Filesystem free space in bytes
local metric_free_bytes = metric("node_filesystem_free_bytes", "gauge")
-- node exporter description - Filesystem space available to non-root users in bytes
local metric_avail_bytes = metric("node_filesystem_avail_bytes", "gauge")
-- node exporter description - Filesystem total file nodes
local metric_files = metric("node_filesystem_files", "gauge")
-- node exporter description - Filesystem total free file nodes
local metric_files_free = metric("node_filesystem_files_free", "gauge")
-- node exporter description - Filesystem read-only status
local metric_readonly = metric("node_filesystem_readonly", "gauge")
for e in io.lines("/proc/self/mounts") do
local fields = space_split(e)
local device = fields[1]
local mount_point = fields[2]
local fs_type = fields[3]
-- Filter list from node exporter:
-- https://github.com/prometheus/node_exporter/blob/b9d0932179a0c5b3a8863f3d6cdafe8584cedc8e/collector/filesystem_linux.go#L36-L37
if mount_point:find("/dev/?", 1) ~= 1
and mount_point:find("/proc/?", 1) ~= 1
and mount_point:find("/run/credentials/?", 1) ~= 1
and mount_point:find("/sys/?", 1) ~= 1
and mount_point:find("/var/lib/docker/?", 1) ~= 1
and mount_point:find("/var/lib/containers/storage/?", 1) ~= 1
and fs_type ~= "autofs"
and fs_type ~= "binfmt_misc"
and fs_type ~= "bpf"
and fs_type ~= "cgroup"
and fs_type ~= "cgroup2"
and fs_type ~= "configfs"
and fs_type ~= "debugfs"
and fs_type ~= "devpts"
and fs_type ~= "devtmpfs"
and fs_type ~= "fusectl"
and fs_type ~= "hugetlbfs"
and fs_type ~= "iso9660"
and fs_type ~= "mqueue"
and fs_type ~= "nsfs"
and fs_type ~= "overlay"
and fs_type ~= "proc"
and fs_type ~= "procfs"
and fs_type ~= "pstore"
and fs_type ~= "rpc_pipefs"
and fs_type ~= "securityfs"
and fs_type ~= "selinuxfs"
and fs_type ~= "squashfs"
and fs_type ~= "sysfs"
and fs_type ~= "tracefs" then
-- note that this excludes / as it's an overlay filesystem
local stat = nix.fs.statvfs(mount_point)
-- https://github.com/torvalds/linux/blob/e5fa841af679cb830da6c609c740a37bdc0b8b35/include/linux/statfs.h#L31
local ST_RDONLY = 0x001
local labels = {
device = device,
fstype = fs_type,
mountpoint = mount_point,
}
local ro = 0
if (nix.bit.band(stat.flag, ST_RDONLY)) == 1 then
ro = 1
end
metric_size_bytes(labels, stat.blocks * stat.bsize)
metric_free_bytes(labels, stat.bfree * stat.bsize)
metric_avail_bytes(labels, stat.bavail * stat.bsize)
metric_files(labels, stat.files)
metric_files_free(labels, stat.ffree)
metric_readonly(labels, ro)
end
end
end
return { scrape = scrape }
|