From c7e6d4db06a2d5da567313f06bafc4c369766d16 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Mon, 9 Sep 2024 17:20:13 -0700 Subject: [PATCH] Switch to slog --- .github/workflows/ci.yml | 6 ------ .golangci.yml | 9 +++++---- .goreleaser.yml | 4 ---- Makefile | 2 +- collector/helper_test.go | 1 - collector/nginx.go | 9 ++++----- collector/nginx_plus.go | 23 +++++++++++------------ exporter.go | 39 +++++++++++++++++++-------------------- exporter_test.go | 2 -- go.mod | 4 +--- go.sum | 8 ++------ 11 files changed, 43 insertions(+), 64 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d622a3d2..23086bdf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,11 +62,6 @@ jobs: with: go-version: stable - - name: Determine GOPATH - id: go - run: | - echo "go_path=$(go env GOPATH)" >> $GITHUB_OUTPUT - - name: Setup QEMU uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 with: @@ -183,7 +178,6 @@ jobs: args: ${{ github.ref_type == 'tag' && 'release' || 'build --snapshot' }} ${{ github.event_name == 'pull_request' && '--single-target' || '' }} --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GOPATH: ${{ steps.go.outputs.go_path }} NGINX_GITHUB_TOKEN: ${{ secrets.NGINX_PAT }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_COMMUNITY }} SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} diff --git a/.golangci.yml b/.golangci.yml index 68cbf519..bbdd7b97 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -27,24 +27,24 @@ linters-settings: - name: unused-parameter - name: var-declaration - name: var-naming - errcheck: - exclude-functions: - - (github.com/go-kit/log.Logger).Log govet: enable-all: true + sloglint: + static-msg: true + key-naming-case: snake linters: enable: - asasalint - asciicheck - bidichk - contextcheck + - copyloopvar - dupword - durationcheck - errcheck - errchkjson - errname - errorlint - - exportloopref - fatcontext - forcetypeassert - gocheckcompilerdirectives @@ -74,6 +74,7 @@ linters: - promlinter - reassign - revive + - sloglint - staticcheck - stylecheck - tagalign diff --git a/.goreleaser.yml b/.goreleaser.yml index 23a0cd3c..b4295c2e 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -30,10 +30,6 @@ builds: goarch: arm flags: - -trimpath - gcflags: - - all=-trimpath={{.Env.GOPATH}} - asmflags: - - all=-trimpath={{.Env.GOPATH}} ldflags: - "-s -w -X github.com/prometheus/common/version.Version={{.Version}} -X github.com/prometheus/common/version.BuildDate={{.Date}} -X github.com/prometheus/common/version.Branch={{.Branch}} -X github.com/prometheus/common/version.BuildUser=goreleaser" diff --git a/Makefile b/Makefile index 2c8e614c..d2f4071e 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ nginx-prometheus-exporter: ## Build nginx-prometheus-exporter binary .PHONY: build-goreleaser build-goreleaser: ## Build all binaries using GoReleaser @goreleaser -v || (code=$$?; printf "\033[0;31mError\033[0m: there was a problem with GoReleaser. Follow the docs to install it https://goreleaser.com/install\n"; exit $$code) - GOPATH=$(shell go env GOPATH) goreleaser build --clean --snapshot + goreleaser build --clean --snapshot .PHONY: lint lint: ## Run linter diff --git a/collector/helper_test.go b/collector/helper_test.go index 26780952..331fc934 100644 --- a/collector/helper_test.go +++ b/collector/helper_test.go @@ -34,7 +34,6 @@ func TestMergeLabels(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() if got := MergeLabels(tt.mapA, tt.mapB); !reflect.DeepEqual(got, tt.want) { diff --git a/collector/nginx.go b/collector/nginx.go index 1b1b0d16..aada8b61 100644 --- a/collector/nginx.go +++ b/collector/nginx.go @@ -1,10 +1,9 @@ package collector import ( + "log/slog" "sync" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/nginxinc/nginx-prometheus-exporter/client" "github.com/prometheus/client_golang/prometheus" ) @@ -12,14 +11,14 @@ import ( // NginxCollector collects NGINX metrics. It implements prometheus.Collector interface. type NginxCollector struct { upMetric prometheus.Gauge - logger log.Logger + logger *slog.Logger nginxClient *client.NginxClient metrics map[string]*prometheus.Desc mutex sync.Mutex } // NewNginxCollector creates an NginxCollector. -func NewNginxCollector(nginxClient *client.NginxClient, namespace string, constLabels map[string]string, logger log.Logger) *NginxCollector { +func NewNginxCollector(nginxClient *client.NginxClient, namespace string, constLabels map[string]string, logger *slog.Logger) *NginxCollector { return &NginxCollector{ nginxClient: nginxClient, logger: logger, @@ -55,7 +54,7 @@ func (c *NginxCollector) Collect(ch chan<- prometheus.Metric) { if err != nil { c.upMetric.Set(nginxDown) ch <- c.upMetric - level.Error(c.logger).Log("msg", "Error getting stats", "error", err.Error()) + c.logger.Error("error getting stats", "error", err.Error()) return } diff --git a/collector/nginx_plus.go b/collector/nginx_plus.go index d44d86e9..d6baab09 100644 --- a/collector/nginx_plus.go +++ b/collector/nginx_plus.go @@ -2,11 +2,10 @@ package collector import ( "fmt" + "log/slog" "strconv" "sync" - "github.com/go-kit/log" - "github.com/go-kit/log/level" plusclient "github.com/nginxinc/nginx-plus-go-client/client" "github.com/prometheus/client_golang/prometheus" ) @@ -32,7 +31,7 @@ type LabelUpdater interface { // NginxPlusCollector collects NGINX Plus metrics. It implements prometheus.Collector interface. type NginxPlusCollector struct { upMetric prometheus.Gauge - logger log.Logger + logger *slog.Logger cacheZoneMetrics map[string]*prometheus.Desc workerMetrics map[string]*prometheus.Desc nginxClient *plusclient.NginxClient @@ -256,7 +255,7 @@ func NewVariableLabelNames(upstreamServerVariableLabelNames []string, serverZone } // NewNginxPlusCollector creates an NginxPlusCollector. -func NewNginxPlusCollector(nginxClient *plusclient.NginxClient, namespace string, variableLabelNames VariableLabelNames, constLabels map[string]string, logger log.Logger) *NginxPlusCollector { +func NewNginxPlusCollector(nginxClient *plusclient.NginxClient, namespace string, variableLabelNames VariableLabelNames, constLabels map[string]string, logger *slog.Logger) *NginxPlusCollector { upstreamServerVariableLabelNames := variableLabelNames.UpstreamServerVariableLabelNames streamUpstreamServerVariableLabelNames := variableLabelNames.StreamUpstreamServerVariableLabelNames @@ -627,7 +626,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { if err != nil { c.upMetric.Set(nginxDown) ch <- c.upMetric - level.Warn(c.logger).Log("msg", "Error getting stats", "error", err.Error()) + c.logger.Warn("error getting stats", "error", err.Error()) return } @@ -658,7 +657,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { varLabelValues := c.getServerZoneLabelValues(name) if c.variableLabelNames.ServerZoneVariableLabelNames != nil && len(varLabelValues) != len(c.variableLabelNames.ServerZoneVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for http zone, empty labels will be used instead", "zone", name, "expected", len(c.variableLabelNames.ServerZoneVariableLabelNames), "got", len(varLabelValues)) + c.logger.Warn("wrong number of labels for http zone, empty labels will be used instead", "zone", name, "expected", len(c.variableLabelNames.ServerZoneVariableLabelNames), "got", len(varLabelValues)) for range c.variableLabelNames.ServerZoneVariableLabelNames { labelValues = append(labelValues, "") } @@ -779,7 +778,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { varLabelValues := c.getStreamServerZoneLabelValues(name) if c.variableLabelNames.StreamServerZoneVariableLabelNames != nil && len(varLabelValues) != len(c.variableLabelNames.StreamServerZoneVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for stream server zone, empty labels will be used instead", "zone", name, "expected", len(c.variableLabelNames.StreamServerZoneVariableLabelNames), "got", len(varLabelValues)) + c.logger.Warn("wrong number of labels for stream server zone, empty labels will be used instead", "zone", name, "expected", len(c.variableLabelNames.StreamServerZoneVariableLabelNames), "got", len(varLabelValues)) for range c.variableLabelNames.StreamServerZoneVariableLabelNames { labelValues = append(labelValues, "") } @@ -816,7 +815,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { varLabelValues := c.getUpstreamServerLabelValues(name) if c.variableLabelNames.UpstreamServerVariableLabelNames != nil && len(varLabelValues) != len(c.variableLabelNames.UpstreamServerVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for upstream, empty labels will be used instead", "upstream", name, "expected", len(c.variableLabelNames.UpstreamServerVariableLabelNames), "got", len(varLabelValues)) + c.logger.Warn("wrong number of labels for upstream, empty labels will be used instead", "upstream", name, "expected", len(c.variableLabelNames.UpstreamServerVariableLabelNames), "got", len(varLabelValues)) for range c.variableLabelNames.UpstreamServerVariableLabelNames { labelValues = append(labelValues, "") } @@ -827,7 +826,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { upstreamServer := fmt.Sprintf("%v/%v", name, peer.Server) varPeerLabelValues := c.getUpstreamServerPeerLabelValues(upstreamServer) if c.variableLabelNames.UpstreamServerPeerVariableLabelNames != nil && len(varPeerLabelValues) != len(c.variableLabelNames.UpstreamServerPeerVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for upstream peer, empty labels will be used instead", "upstream", name, "peer", peer.Server, "expected", len(c.variableLabelNames.UpstreamServerPeerVariableLabelNames), "got", len(varPeerLabelValues)) + c.logger.Warn("wrong number of labels for upstream peer, empty labels will be used instead", "upstream", name, "peer", peer.Server, "expected", len(c.variableLabelNames.UpstreamServerPeerVariableLabelNames), "got", len(varPeerLabelValues)) for range c.variableLabelNames.UpstreamServerPeerVariableLabelNames { labelValues = append(labelValues, "") } @@ -973,7 +972,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { varLabelValues := c.getStreamUpstreamServerLabelValues(name) if c.variableLabelNames.StreamUpstreamServerVariableLabelNames != nil && len(varLabelValues) != len(c.variableLabelNames.StreamUpstreamServerVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for stream server, empty labels will be used instead", "server", name, "labels", c.variableLabelNames.StreamUpstreamServerVariableLabelNames, "values", varLabelValues) + c.logger.Warn("wrong number of labels for stream server, empty labels will be used instead", "server", name, "labels", c.variableLabelNames.StreamUpstreamServerVariableLabelNames, "values", varLabelValues) for range c.variableLabelNames.StreamUpstreamServerVariableLabelNames { labelValues = append(labelValues, "") } @@ -984,7 +983,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { upstreamServer := fmt.Sprintf("%v/%v", name, peer.Server) varPeerLabelValues := c.getStreamUpstreamServerPeerLabelValues(upstreamServer) if c.variableLabelNames.StreamUpstreamServerPeerVariableLabelNames != nil && len(varPeerLabelValues) != len(c.variableLabelNames.StreamUpstreamServerPeerVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for stream upstream peer, empty labels will be used instead", "server", upstreamServer, "labels", c.variableLabelNames.StreamUpstreamServerPeerVariableLabelNames, "values", varPeerLabelValues) + c.logger.Warn("wrong number of labels for stream upstream peer, empty labels will be used instead", "server", upstreamServer, "labels", c.variableLabelNames.StreamUpstreamServerPeerVariableLabelNames, "values", varPeerLabelValues) for range c.variableLabelNames.StreamUpstreamServerPeerVariableLabelNames { labelValues = append(labelValues, "") } @@ -1204,7 +1203,7 @@ func (c *NginxPlusCollector) Collect(ch chan<- prometheus.Metric) { varLabelValues := c.getCacheZoneLabelValues(name) if c.variableLabelNames.CacheZoneVariableLabelNames != nil && len(varLabelValues) != len(c.variableLabelNames.CacheZoneVariableLabelNames) { - level.Warn(c.logger).Log("msg", "wrong number of labels for cache zone, empty labels will be used instead", "zone", name, "labels", c.variableLabelNames.CacheZoneVariableLabelNames, "values", varLabelValues) + c.logger.Warn("wrong number of labels for cache zone, empty labels will be used instead", "zone", name, "labels", c.variableLabelNames.CacheZoneVariableLabelNames, "values", varLabelValues) for range c.variableLabelNames.CacheZoneVariableLabelNames { labelValues = append(labelValues, "") } diff --git a/exporter.go b/exporter.go index b776bc59..88950983 100644 --- a/exporter.go +++ b/exporter.go @@ -6,6 +6,7 @@ import ( "crypto/x509" "errors" "fmt" + "log/slog" "maps" "net" "net/http" @@ -20,13 +21,11 @@ import ( "github.com/nginxinc/nginx-prometheus-exporter/collector" "github.com/alecthomas/kingpin/v2" - "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors/version" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/promlog" - "github.com/prometheus/common/promlog/flag" + "github.com/prometheus/common/promslog" + "github.com/prometheus/common/promslog/flag" common_version "github.com/prometheus/common/version" "github.com/prometheus/exporter-toolkit/web" @@ -110,24 +109,24 @@ func main() { } } - promlogConfig := &promlog.Config{} + config := &promslog.Config{} - flag.AddFlags(kingpin.CommandLine, promlogConfig) + flag.AddFlags(kingpin.CommandLine, config) kingpin.Version(common_version.Print(exporterName)) kingpin.HelpFlag.Short('h') addMissingEnvironmentFlags(kingpin.CommandLine) kingpin.Parse() - logger := promlog.New(promlogConfig) + logger := promslog.New(config) - level.Info(logger).Log("msg", "Starting nginx-prometheus-exporter", "version", common_version.Info()) - level.Info(logger).Log("msg", "Build context", "build_context", common_version.BuildContext()) + logger.Info("nginx-prometheus-exporter", "version", common_version.Info()) + logger.Info("build context", "build_context", common_version.BuildContext()) prometheus.MustRegister(version.NewCollector(exporterName)) if len(*scrapeURIs) == 0 { - level.Error(logger).Log("msg", "No scrape addresses provided") + logger.Error("no scrape addresses provided") os.Exit(1) } @@ -136,13 +135,13 @@ func main() { if *sslCaCert != "" { caCert, err := os.ReadFile(*sslCaCert) if err != nil { - level.Error(logger).Log("msg", "Loading CA cert failed", "err", err.Error()) + logger.Error("loading CA cert failed", "err", err.Error()) os.Exit(1) } sslCaCertPool := x509.NewCertPool() ok := sslCaCertPool.AppendCertsFromPEM(caCert) if !ok { - level.Error(logger).Log("msg", "Parsing CA cert file failed.") + logger.Error("parsing CA cert file failed.") os.Exit(1) } sslConfig.RootCAs = sslCaCertPool @@ -151,7 +150,7 @@ func main() { if *sslClientCert != "" && *sslClientKey != "" { clientCert, err := tls.LoadX509KeyPair(*sslClientCert, *sslClientKey) if err != nil { - level.Error(logger).Log("msg", "Loading client certificate failed", "error", err.Error()) + logger.Error("loading client certificate failed", "error", err.Error()) os.Exit(1) } sslConfig.Certificates = []tls.Certificate{clientCert} @@ -190,7 +189,7 @@ func main() { } landingPage, err := web.NewLandingPage(landingConfig) if err != nil { - level.Error(logger).Log("err", err) + logger.Error("failed to create landing page", "error", err.Error()) os.Exit(1) } http.Handle("/", landingPage) @@ -206,28 +205,28 @@ func main() { go func() { if err := web.ListenAndServe(srv, webConfig, logger); err != nil { if errors.Is(err, http.ErrServerClosed) { - level.Info(logger).Log("msg", "HTTP server closed") + logger.Info("HTTP server closed", "error", err.Error()) os.Exit(0) } - level.Error(logger).Log("err", err) + logger.Error("HTTP server failed", "error", err.Error()) os.Exit(1) } }() <-ctx.Done() - level.Info(logger).Log("msg", "Shutting down") + logger.Info("shutting down") srvCtx, srvCancel := context.WithTimeout(context.Background(), 5*time.Second) defer srvCancel() _ = srv.Shutdown(srvCtx) } -func registerCollector(logger log.Logger, transport *http.Transport, +func registerCollector(logger *slog.Logger, transport *http.Transport, addr string, labels map[string]string, ) { if strings.HasPrefix(addr, "unix:") { socketPath, requestPath, err := parseUnixSocketAddress(addr) if err != nil { - level.Error(logger).Log("msg", "Parsing unix domain socket scrape address failed", "uri", addr, "error", err.Error()) + logger.Error("parsing unix domain socket scrape address failed", "uri", addr, "error", err.Error()) os.Exit(1) } @@ -250,7 +249,7 @@ func registerCollector(logger log.Logger, transport *http.Transport, if *nginxPlus { plusClient, err := plusclient.NewNginxClient(addr, plusclient.WithHTTPClient(httpClient)) if err != nil { - level.Error(logger).Log("msg", "Could not create Nginx Plus Client", "error", err.Error()) + logger.Error("could not create Nginx Plus Client", "error", err.Error()) os.Exit(1) } variableLabelNames := collector.NewVariableLabelNames(nil, nil, nil, nil, nil, nil, nil) diff --git a/exporter_test.go b/exporter_test.go index b71bc7fa..7b248ebe 100644 --- a/exporter_test.go +++ b/exporter_test.go @@ -38,7 +38,6 @@ func TestParsePositiveDuration(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := parsePositiveDuration(tt.testInput) @@ -93,7 +92,6 @@ func TestParseUnixSocketAddress(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() socketPath, requestPath, err := parseUnixSocketAddress(tt.testInput) diff --git a/go.mod b/go.mod index 255139fd..3b271f49 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,10 @@ go 1.22.6 require ( github.com/alecthomas/kingpin/v2 v2.4.0 - github.com/go-kit/log v0.2.1 github.com/nginxinc/nginx-plus-go-client v1.3.0 github.com/prometheus/client_golang v1.20.3 github.com/prometheus/common v0.59.1 - github.com/prometheus/exporter-toolkit v0.12.0 + github.com/prometheus/exporter-toolkit v0.13.0 ) require ( @@ -16,7 +15,6 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/mdlayher/socket v0.4.1 // indirect diff --git a/go.sum b/go.sum index 26dbc2a9..ee488c54 100644 --- a/go.sum +++ b/go.sum @@ -11,10 +11,6 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -46,8 +42,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= -github.com/prometheus/exporter-toolkit v0.12.0 h1:DkE5RcEZR3lQA2QD5JLVQIf41dFKNsVMXFhgqcif7fo= -github.com/prometheus/exporter-toolkit v0.12.0/go.mod h1:fQH0KtTn0yrrS0S82kqppRjDDiwMfIQUwT+RBRRhwUc= +github.com/prometheus/exporter-toolkit v0.13.0 h1:lmA0Q+8IaXgmFRKw09RldZmZdnvu9wwcDLIXGmTPw1c= +github.com/prometheus/exporter-toolkit v0.13.0/go.mod h1:2uop99EZl80KdXhv/MxVI2181fMcwlsumFOqBecGkG0= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=