mirror of
				https://github.com/prometheus/node_exporter.git
				synced 2025-08-20 18:33:52 -07:00 
			
		
		
		
	Update procfs+ (#36)
* update dependencies * fix mountstats * Fix the rest of mountstats * update golangci-lint version * appease linter
This commit is contained in:
		
							parent
							
								
									6300fab821
								
							
						
					
					
						commit
						612bdf9540
					
				
							
								
								
									
										4
									
								
								.github/workflows/golangci-lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/golangci-lint.yml
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -25,7 +25,7 @@ jobs:
 | 
			
		|||
      - name: Install Go
 | 
			
		||||
        uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: 1.23.x
 | 
			
		||||
          go-version: 1.24.x
 | 
			
		||||
      - name: Install snmp_exporter/generator dependencies
 | 
			
		||||
        run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
 | 
			
		||||
        if: github.repository == 'prometheus/snmp_exporter'
 | 
			
		||||
| 
						 | 
				
			
			@ -33,4 +33,4 @@ jobs:
 | 
			
		|||
        uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          args: --verbose
 | 
			
		||||
          version: v1.62.0
 | 
			
		||||
          version: v1.64.2
 | 
			
		||||
| 
						 | 
				
			
			@ -7,10 +7,7 @@ linters:
 | 
			
		|||
    # positives when build tags disable certain files[2]
 | 
			
		||||
    # 1: https://github.com/golangci/golangci-lint/issues/1841
 | 
			
		||||
    # 2: https://github.com/prometheus/node_exporter/issues/1545
 | 
			
		||||
    - deadcode
 | 
			
		||||
    - unused
 | 
			
		||||
    - structcheck
 | 
			
		||||
    - varcheck
 | 
			
		||||
 | 
			
		||||
issues:
 | 
			
		||||
  exclude-rules:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ PROMU_URL     := https://github.com/prometheus/promu/releases/download/v$(PROMU_
 | 
			
		|||
SKIP_GOLANGCI_LINT :=
 | 
			
		||||
GOLANGCI_LINT :=
 | 
			
		||||
GOLANGCI_LINT_OPTS ?=
 | 
			
		||||
GOLANGCI_LINT_VERSION ?= v1.54.2
 | 
			
		||||
GOLANGCI_LINT_VERSION ?= v1.64.2
 | 
			
		||||
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
 | 
			
		||||
# windows isn't included here because of the path separator being different.
 | 
			
		||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -432,7 +432,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if stats == nil || len(stats) < 1 {
 | 
			
		||||
		if len(stats) < 1 {
 | 
			
		||||
			// No stats returned; device does not support ethtool stats.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ import (
 | 
			
		|||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/prometheus/client_golang/prometheus"
 | 
			
		||||
	"github.com/prometheus/node_exporter/collector/utils"
 | 
			
		||||
	"github.com/prometheus/procfs/sysfs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -125,23 +126,24 @@ func (c *fibrechannelCollector) Update(ch chan<- prometheus.Metric) error {
 | 
			
		|||
		infoValue := 1.0
 | 
			
		||||
 | 
			
		||||
		// First push the Host values
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(infoDesc, prometheus.GaugeValue, infoValue, host.Name, host.Speed, host.PortState, host.PortType, host.PortID, host.PortName, host.FabricName, host.SymbolicName, host.SupportedClasses, host.SupportedSpeeds, host.DevLossTMO)
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(infoDesc, prometheus.GaugeValue, infoValue,
 | 
			
		||||
			utils.SafeDereference(host.Name, host.Speed, host.PortState, host.PortType, host.PortID, host.PortName, host.FabricName, host.SymbolicName, host.SupportedClasses, host.SupportedSpeeds, host.DevLossTMO)...)
 | 
			
		||||
 | 
			
		||||
		// Then the counters
 | 
			
		||||
		c.pushCounter(ch, "dumped_frames_total", host.Counters.DumpedFrames, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "error_frames_total", host.Counters.ErrorFrames, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "invalid_crc_total", host.Counters.InvalidCRCCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "rx_frames_total", host.Counters.RXFrames, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "rx_words_total", host.Counters.RXWords, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "tx_frames_total", host.Counters.TXFrames, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "tx_words_total", host.Counters.TXWords, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "seconds_since_last_reset_total", host.Counters.SecondsSinceLastReset, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "invalid_tx_words_total", host.Counters.InvalidTXWordCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "link_failure_total", host.Counters.LinkFailureCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "loss_of_sync_total", host.Counters.LossOfSyncCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "loss_of_signal_total", host.Counters.LossOfSignalCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "nos_total", host.Counters.NosCount, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "fcp_packet_aborts_total", host.Counters.FCPPacketAborts, host.Name)
 | 
			
		||||
		c.pushCounter(ch, "dumped_frames_total", *host.Counters.DumpedFrames, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "error_frames_total", *host.Counters.ErrorFrames, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "invalid_crc_total", *host.Counters.InvalidCRCCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "rx_frames_total", *host.Counters.RXFrames, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "rx_words_total", *host.Counters.RXWords, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "tx_frames_total", *host.Counters.TXFrames, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "tx_words_total", *host.Counters.TXWords, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "seconds_since_last_reset_total", *host.Counters.SecondsSinceLastReset, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "invalid_tx_words_total", *host.Counters.InvalidTXWordCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "link_failure_total", *host.Counters.LinkFailureCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "loss_of_sync_total", *host.Counters.LossOfSyncCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "loss_of_signal_total", *host.Counters.LossOfSignalCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "nos_total", *host.Counters.NosCount, *host.Name)
 | 
			
		||||
		c.pushCounter(ch, "fcp_packet_aborts_total", *host.Counters.FCPPacketAborts, *host.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -536,8 +536,8 @@ func (c *mountStatsCollector) Update(ch chan<- prometheus.Metric) error {
 | 
			
		|||
			miStats := mountsInfo[idx]
 | 
			
		||||
			mountAddress = miStats.SuperOptions["addr"]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		deviceIdentifier := nfsDeviceIdentifier{m.Device, stats.Transport.Protocol, mountAddress}
 | 
			
		||||
		for _, transport := range stats.Transport {
 | 
			
		||||
			deviceIdentifier := nfsDeviceIdentifier{m.Device, transport.Protocol, mountAddress}
 | 
			
		||||
			i := deviceList[deviceIdentifier]
 | 
			
		||||
			if i {
 | 
			
		||||
				c.logger.Debug("Skipping duplicate device entry", "device", deviceIdentifier)
 | 
			
		||||
| 
						 | 
				
			
			@ -545,7 +545,8 @@ func (c *mountStatsCollector) Update(ch chan<- prometheus.Metric) error {
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			deviceList[deviceIdentifier] = true
 | 
			
		||||
		c.updateNFSStats(ch, stats, m.Device, stats.Transport.Protocol, mountAddress)
 | 
			
		||||
			c.updateNFSStats(ch, stats, m.Device, transport.Protocol, mountAddress)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
| 
						 | 
				
			
			@ -616,76 +617,77 @@ func (c *mountStatsCollector) updateNFSStats(ch chan<- prometheus.Metric, s *pro
 | 
			
		|||
		labelValues...,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	for _, transport := range s.Transport {
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportBindTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.Bind),
 | 
			
		||||
			float64(transport.Bind),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportConnectTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.Connect),
 | 
			
		||||
			float64(transport.Connect),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportIdleTimeSeconds,
 | 
			
		||||
			prometheus.GaugeValue,
 | 
			
		||||
		float64(s.Transport.IdleTimeSeconds%float64Mantissa),
 | 
			
		||||
			float64(transport.IdleTimeSeconds%float64Mantissa),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportSendsTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.Sends),
 | 
			
		||||
			float64(transport.Sends),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportReceivesTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.Receives),
 | 
			
		||||
			float64(transport.Receives),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportBadTransactionIDsTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.BadTransactionIDs),
 | 
			
		||||
			float64(transport.BadTransactionIDs),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportBacklogQueueTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.CumulativeBacklog),
 | 
			
		||||
			float64(transport.CumulativeBacklog),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportMaximumRPCSlots,
 | 
			
		||||
			prometheus.GaugeValue,
 | 
			
		||||
		float64(s.Transport.MaximumRPCSlotsUsed),
 | 
			
		||||
			float64(transport.MaximumRPCSlotsUsed),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportSendingQueueTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.CumulativeSendingQueue),
 | 
			
		||||
			float64(transport.CumulativeSendingQueue),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		ch <- prometheus.MustNewConstMetric(
 | 
			
		||||
			c.NFSTransportPendingQueueTotal,
 | 
			
		||||
			prometheus.CounterValue,
 | 
			
		||||
		float64(s.Transport.CumulativePendingQueue),
 | 
			
		||||
			float64(transport.CumulativePendingQueue),
 | 
			
		||||
			labelValues...,
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	for _, op := range s.Operations {
 | 
			
		||||
		opLabelValues := []string{export, protocol, mountAddress, op.Operation}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										47
									
								
								collector/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								collector/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
// Copyright 2024 The Prometheus Authors
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SafeDereference[T any](s ...*T) []T {
 | 
			
		||||
	var resolved []T
 | 
			
		||||
	for _, v := range s {
 | 
			
		||||
		if v != nil {
 | 
			
		||||
			resolved = append(resolved, *v)
 | 
			
		||||
		} else {
 | 
			
		||||
			var zeroValue T
 | 
			
		||||
			resolved = append(resolved, zeroValue)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return resolved
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SafeBytesToString takes a slice of bytes and sanitizes it for Prometheus label
 | 
			
		||||
// values.
 | 
			
		||||
// * Terminate the string at the first null byte.
 | 
			
		||||
// * Convert any invalid UTF-8 to "<22>".
 | 
			
		||||
func SafeBytesToString(b []byte) string {
 | 
			
		||||
	var s string
 | 
			
		||||
	zeroIndex := bytes.IndexByte(b, 0)
 | 
			
		||||
	if zeroIndex == -1 {
 | 
			
		||||
		s = string(b)
 | 
			
		||||
	} else {
 | 
			
		||||
		s = string(b[:zeroIndex])
 | 
			
		||||
	}
 | 
			
		||||
	return strings.ToValidUTF8(s, "<22>")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								collector/utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								collector/utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
// Copyright 2025 The Prometheus Authors
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file ewcept in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSafeBytesToString(t *testing.T) {
 | 
			
		||||
	foo := []byte("foo\x00")
 | 
			
		||||
	if want, got := SafeBytesToString(foo), "foo"; want != got {
 | 
			
		||||
		t.Errorf("Expected: %s, Got: %s", want, got)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	foo = []byte{115, 97, 110, 101, 253, 190, 214}
 | 
			
		||||
	if want, got := SafeBytesToString(foo), "sane<6E>"; want != got {
 | 
			
		||||
		t.Errorf("Expected: %s, Got: %s", want, got)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								go.mod
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
module github.com/prometheus/node_exporter
 | 
			
		||||
 | 
			
		||||
go 1.22
 | 
			
		||||
go 1.23.0
 | 
			
		||||
 | 
			
		||||
toolchain go1.23.5
 | 
			
		||||
toolchain go1.24.1
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/alecthomas/kingpin/v2 v2.4.0
 | 
			
		||||
| 
						 | 
				
			
			@ -23,14 +23,14 @@ require (
 | 
			
		|||
	github.com/mdlayher/wifi v0.1.0
 | 
			
		||||
	github.com/opencontainers/selinux v1.11.0
 | 
			
		||||
	github.com/prometheus-community/go-runit v0.1.0
 | 
			
		||||
	github.com/prometheus/client_golang v1.20.5
 | 
			
		||||
	github.com/prometheus/client_golang v1.22.0
 | 
			
		||||
	github.com/prometheus/client_model v0.6.1
 | 
			
		||||
	github.com/prometheus/common v0.62.0
 | 
			
		||||
	github.com/prometheus/exporter-toolkit v0.14.0
 | 
			
		||||
	github.com/prometheus/procfs v0.15.1
 | 
			
		||||
	github.com/prometheus/procfs v0.16.1
 | 
			
		||||
	github.com/safchain/ethtool v0.3.0
 | 
			
		||||
	golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
 | 
			
		||||
	golang.org/x/sys v0.29.0
 | 
			
		||||
	golang.org/x/sys v0.32.0
 | 
			
		||||
	howett.net/plist v1.0.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,9 +39,8 @@ require (
 | 
			
		|||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
			
		||||
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 | 
			
		||||
	github.com/dennwc/ioctl v1.0.0 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.7.0 // indirect
 | 
			
		||||
	github.com/jpillora/backoff v1.0.0 // indirect
 | 
			
		||||
	github.com/klauspost/compress v1.17.9 // indirect
 | 
			
		||||
	github.com/kylelemons/godebug v1.1.0 // indirect
 | 
			
		||||
	github.com/mdlayher/genetlink v1.3.2 // indirect
 | 
			
		||||
	github.com/mdlayher/socket v0.4.1 // indirect
 | 
			
		||||
| 
						 | 
				
			
			@ -55,10 +54,8 @@ require (
 | 
			
		|||
	golang.org/x/crypto v0.32.0 // indirect
 | 
			
		||||
	golang.org/x/net v0.33.0 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.24.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.10.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.13.0 // indirect
 | 
			
		||||
	golang.org/x/text v0.21.0 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.36.1 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.36.5 // indirect
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace github.com/prometheus/procfs => github.com/prometheus/procfs v0.12.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								go.sum
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -24,8 +24,8 @@ github.com/ema/qdisc v1.0.0/go.mod h1:FhIc0fLYi7f+lK5maMsesDqwYojIOh3VfRs8EVd5YJ
 | 
			
		|||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.1.0/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=
 | 
			
		||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 | 
			
		||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 | 
			
		||||
github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY=
 | 
			
		||||
github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc=
 | 
			
		||||
github.com/hodgesds/perf-utils v0.7.0 h1:7KlHGMuig4FRH5fNw68PV6xLmgTe7jKs9hgAcEAbioU=
 | 
			
		||||
| 
						 | 
				
			
			@ -39,8 +39,8 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
 | 
			
		|||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.3.5 h1:hVlNQNRlLDGZz31gBPicsG7Q53rnlsz1l1Ix/9XlpVA=
 | 
			
		||||
github.com/jsimonetti/rtnetlink v1.3.5/go.mod h1:0LFedyiTkebnd43tE4YAkWGIq9jQphow4CcwxaT2Y00=
 | 
			
		||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
 | 
			
		||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 | 
			
		||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
 | 
			
		||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
			
		||||
| 
						 | 
				
			
			@ -73,16 +73,16 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 | 
			
		|||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus-community/go-runit v0.1.0 h1:uTWEj/Fn2RoLdfg/etSqwzgYNOYPrARx1BHUN052tGA=
 | 
			
		||||
github.com/prometheus-community/go-runit v0.1.0/go.mod h1:AvJ9Jo3gAFu2lbM4+qfjdpq30FfiLDJZKbQ015u08IQ=
 | 
			
		||||
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
 | 
			
		||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 | 
			
		||||
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
 | 
			
		||||
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
 | 
			
		||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
 | 
			
		||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 | 
			
		||||
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
 | 
			
		||||
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
 | 
			
		||||
github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg=
 | 
			
		||||
github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA=
 | 
			
		||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
 | 
			
		||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
 | 
			
		||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
 | 
			
		||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 | 
			
		||||
github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0=
 | 
			
		||||
| 
						 | 
				
			
			@ -128,8 +128,8 @@ golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbht
 | 
			
		|||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
 | 
			
		||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
 | 
			
		||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
| 
						 | 
				
			
			@ -141,8 +141,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		|||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
 | 
			
		||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
 | 
			
		||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 | 
			
		||||
| 
						 | 
				
			
			@ -161,8 +161,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 | 
			
		|||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 | 
			
		||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
 | 
			
		||||
google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 | 
			
		||||
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
 | 
			
		||||
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue