Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions collector/os_release.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ type osRelease struct {
BuildID string
ImageID string
ImageVersion string
SupportEnd string
}

type osReleaseCollector struct {
Expand All @@ -65,6 +66,8 @@ type osReleaseCollector struct {
osReleaseFilenames []string // all os-release file names to check
version float64
versionDesc *prometheus.Desc
supportEnd time.Time
supportEndDesc *prometheus.Desc
}

type Plist struct {
Expand Down Expand Up @@ -97,6 +100,11 @@ func NewOSCollector(logger log.Logger) (Collector, error) {
"Metric containing the major.minor part of the OS version.",
[]string{"id", "id_like", "name"}, nil,
),
supportEndDesc: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "os", "support_end_timestamp_seconds"),
"Metric containing the end-of-life date timestamp of the OS.",
nil, nil,
),
}, nil
}

Expand All @@ -115,6 +123,7 @@ func parseOSRelease(r io.Reader) (*osRelease, error) {
BuildID: env["BUILD_ID"],
ImageID: env["IMAGE_ID"],
ImageVersion: env["IMAGE_VERSION"],
SupportEnd: env["SUPPORT_END"],
}, err
}

Expand Down Expand Up @@ -169,6 +178,15 @@ func (c *osReleaseCollector) UpdateStruct(path string) error {
} else {
c.version = 0
}

if c.os.SupportEnd != "" {
c.supportEnd, err = time.Parse("2006-01-02", c.os.SupportEnd)

if err != nil {
return err
}
}

return nil
}

Expand All @@ -195,6 +213,11 @@ func (c *osReleaseCollector) Update(ch chan<- prometheus.Metric) error {
ch <- prometheus.MustNewConstMetric(c.versionDesc, prometheus.GaugeValue, c.version,
c.os.ID, c.os.IDLike, c.os.Name)
}

if c.os.SupportEnd != "" {
ch <- prometheus.MustNewConstMetric(c.supportEndDesc, prometheus.GaugeValue, float64(c.supportEnd.Unix()))
}

return nil
}

Expand Down
42 changes: 42 additions & 0 deletions collector/os_release_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,28 @@ SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
`

const nixosTapir string = `BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
BUILD_ID="23.11.20240328.219951b"
DOCUMENTATION_URL="https://nixos.org/learn.html"
HOME_URL="https://nixos.org/"
ID=nixos
LOGO="nix-snowflake"
NAME=NixOS
PRETTY_NAME="NixOS 23.11 (Tapir)"
SUPPORT_END="2024-06-30"
SUPPORT_URL="https://nixos.org/community.html"
VERSION="23.11 (Tapir)"
VERSION_CODENAME=tapir
VERSION_ID="23.11"
`

func TestParseOSRelease(t *testing.T) {
want := &osRelease{
Name: "Ubuntu",
ID: "ubuntu",
IDLike: "debian",
PrettyName: "Ubuntu 20.04.2 LTS",
SupportEnd: "",
Version: "20.04.2 LTS (Focal Fossa)",
VersionID: "20.04",
VersionCodename: "focal",
Expand Down Expand Up @@ -75,6 +91,32 @@ func TestParseOSRelease(t *testing.T) {
}
}

func TestParseOSSupportEnd(t *testing.T) {
want := &osRelease{
BuildID: "23.11.20240328.219951b",
Name: "NixOS",
ID: "nixos",
IDLike: "",
ImageID: "",
ImageVersion: "",
PrettyName: "NixOS 23.11 (Tapir)",
SupportEnd: "2024-06-30",
Variant: "",
VariantID: "",
Version: "23.11 (Tapir)",
VersionID: "23.11",
VersionCodename: "tapir",
}

got, err := parseOSRelease(strings.NewReader(nixosTapir))
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(want, got) {
t.Fatalf("should have %+v osRelease: got %+v", want, got)
}
}

func TestUpdateStruct(t *testing.T) {
wantedOS := &osRelease{
Name: "Ubuntu",
Expand Down