Skip to content

Commit

Permalink
os_release.go: Added support end parsing support. (#2982)
Browse files Browse the repository at this point in the history
* os_release.go: Added support end parsing support.

Fixes: #2977

Signed-off-by: Jonathan Davies <[email protected]>

* os_release_test.go: Added TestParseOSSupportEnd.

Signed-off-by: Jonathan Davies <[email protected]>

---------

Signed-off-by: Jonathan Davies <[email protected]>
  • Loading branch information
jpds authored Apr 3, 2024
1 parent 3accd4c commit b6227af
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
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

0 comments on commit b6227af

Please sign in to comment.