From b892cb20dfbc6bcb8ca7b3963c8a6446161431ef Mon Sep 17 00:00:00 2001 From: t3mi Date: Wed, 25 Oct 2023 14:57:39 +0300 Subject: [PATCH] feat: add build_info metric (#121) Signed-off-by: t3mi --- .github/workflows/release.yml | 2 ++ Dockerfile | 5 ++++- pkg/metrics/metrics.go | 17 +++++++++++++++++ pkg/version/version.go | 29 +++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 pkg/version/version.go diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 58db6903..8000fe85 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,3 +43,5 @@ jobs: platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.meta.outputs.version }} diff --git a/Dockerfile b/Dockerfile index 2a07abd0..5d2d1001 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,11 @@ FROM golang:1.20 AS builder +ARG VERSION +ENV PKG github.com/resmoio/kubernetes-event-exporter/pkg + ADD . /app WORKDIR /app -RUN CGO_ENABLED=0 GOOS=linux GO11MODULE=on go build -a -o /main . +RUN CGO_ENABLED=0 GOOS=linux GO11MODULE=on go build -ldflags="-s -w -X ${PKG}/version.Version=${VERSION}" -a -o /main . FROM gcr.io/distroless/static:nonroot COPY --from=builder --chown=nonroot:nonroot /main /kubernetes-event-exporter diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 546cd1d9..84cf4ad4 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -10,6 +10,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/exporter-toolkit/web" + "github.com/resmoio/kubernetes-event-exporter/pkg/version" "github.com/rs/zerolog/log" ) @@ -18,6 +19,7 @@ type Store struct { EventsDiscarded prometheus.Counter WatchErrors prometheus.Counter SendErrors prometheus.Counter + BuildInfo prometheus.GaugeFunc } // promLogger implements promhttp.Logger @@ -87,6 +89,20 @@ func Init(addr string, tlsConf string) { func NewMetricsStore(name_prefix string) *Store { return &Store{ + BuildInfo: promauto.NewGaugeFunc( + prometheus.GaugeOpts{ + Name: name_prefix + "build_info", + Help: "A metric with a constant '1' value labeled by version, revision, branch, and goversion from which Kubernetes Event Exporter was built.", + ConstLabels: prometheus.Labels{ + "version": version.Version, + "revision": version.Revision(), + "goversion": version.GoVersion, + "goos": version.GoOS, + "goarch": version.GoArch, + }, + }, + func() float64 { return 1 }, + ), EventsProcessed: promauto.NewCounter(prometheus.CounterOpts{ Name: name_prefix + "events_sent", Help: "The total number of events processed", @@ -111,5 +127,6 @@ func DestroyMetricsStore(store *Store) { prometheus.Unregister(store.EventsDiscarded) prometheus.Unregister(store.WatchErrors) prometheus.Unregister(store.SendErrors) + prometheus.Unregister(store.BuildInfo) store = nil } diff --git a/pkg/version/version.go b/pkg/version/version.go new file mode 100644 index 00000000..300ed82d --- /dev/null +++ b/pkg/version/version.go @@ -0,0 +1,29 @@ +package version + +import ( + "runtime" + "runtime/debug" +) + +// Build information. Populated at build-time. +var ( + Version = "unknown" + GoVersion = runtime.Version() + GoOS = runtime.GOOS + GoArch = runtime.GOARCH +) + +func Revision() string { + bi, ok := debug.ReadBuildInfo() + + if ok { + for _, kv := range bi.Settings { + switch kv.Key { + case "vcs.revision": + return kv.Value + } + } + } + + return "unknown" +}