From 5cda7ff0affc695d78b4701484f25c3e1b174c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Sat, 7 Sep 2024 20:26:22 +0200 Subject: [PATCH] container: do not fail hard, if single containers can't be scraped (#1561) Signed-off-by: astigmata --- .github/workflows/lint.yml | 14 +- .github/workflows/push.yml | 96 ++++++++ .github/workflows/release.yml | 25 +-- .github/workflows/spelling.yml | 2 +- Makefile | 18 +- pkg/collector/container/container.go | 219 +++++++++++-------- pkg/collector/textfile/textfile_test_test.go | 6 +- 7 files changed, 251 insertions(+), 129 deletions(-) create mode 100644 .github/workflows/push.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4cd52d1eb..627e2b12a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,7 +23,7 @@ on: - master env: - PROMU_VER: '0.14.0' + VERSION_PROMU: '0.14.0' PROMTOOL_VER: '2.43.0' jobs: @@ -40,9 +40,9 @@ jobs: - name: Install e2e deps run: | - Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:PROMU_VER)/promu-$($Env:PROMU_VER).windows-amd64.zip -OutFile promu-$($Env:PROMU_VER).windows-amd64.zip - Expand-Archive -Path promu-$($Env:PROMU_VER).windows-amd64.zip -DestinationPath . - Copy-Item -Path promu-$($Env:PROMU_VER).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" + Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:VERSION_PROMU)/promu-$($Env:VERSION_PROMU).windows-amd64.zip -OutFile promu-$($Env:VERSION_PROMU).windows-amd64.zip + Expand-Archive -Path promu-$($Env:VERSION_PROMU).windows-amd64.zip -DestinationPath . + Copy-Item -Path promu-$($Env:VERSION_PROMU).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" # GOPATH\bin dir must be appended to PATH else the `promu` command won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append @@ -64,9 +64,9 @@ jobs: Expand-Archive -Path prometheus-$($Env:PROMTOOL_VER).windows-amd64.zip -DestinationPath . Copy-Item -Path prometheus-$($Env:PROMTOOL_VER).windows-amd64\promtool.exe -Destination "$(go env GOPATH)\bin" - Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:PROMU_VER)/promu-$($Env:PROMU_VER).windows-amd64.zip -OutFile promu-$($Env:PROMU_VER).windows-amd64.zip - Expand-Archive -Path promu-$($Env:PROMU_VER).windows-amd64.zip -DestinationPath . - Copy-Item -Path promu-$($Env:PROMU_VER).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" + Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:VERSION_PROMU)/promu-$($Env:VERSION_PROMU).windows-amd64.zip -OutFile promu-$($Env:VERSION_PROMU).windows-amd64.zip + Expand-Archive -Path promu-$($Env:VERSION_PROMU).windows-amd64.zip -DestinationPath . + Copy-Item -Path promu-$($Env:VERSION_PROMU).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" # GOPATH\bin dir must be appended to PATH else the `promu` command won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 000000000..ce026d0d5 --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,96 @@ +name: Push Check +on: + pull_request: + branches: + - master +permissions: + contents: write + packages: write + +env: + VERSION_PROMU: '0.14.0' + VERSION_CONTAINERD: '1.7.21' + VERSION_BUILDKIT: '0.15.2' + VERSION_BUILDX: '0.16.2' + +jobs: + stale: + if: github.repository_owner == 'jkroepke' + runs-on: windows-2022 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + + # https://github.com/pl4nty/Windows-Containers/blob/Main/helpful_tools/Install-BuildKit-GitHubActions/workflow.yaml + - name: Setup containerd + run: | + curl.exe -L https://github.com/containerd/containerd/releases/download/v${{ env.VERSION_CONTAINERD }}/containerd-${{ env.VERSION_CONTAINERD }}-windows-amd64.tar.gz -o containerd.tar.gz + tar.exe xvf containerd.tar.gz + .\bin\containerd.exe --register-service + Start-Service containerd + - name: Setup BuildKit + run: | + curl.exe -L https://github.com/moby/buildkit/releases/download/v${{ env.VERSION_BUILDKIT }}/buildkit-v${{ env.VERSION_BUILDKIT }}.windows-amd64.tar.gz -o buildkit.tar.gz + tar.exe xvf buildkit.tar.gz + + .\bin\buildkitd.exe --register-service + Start-Service buildkitd + - name: Setup Docker Buildx + run: | + curl.exe -L https://github.com/docker/buildx/releases/download/v${{ env.VERSION_BUILDX }}/buildx-v${{ env.VERSION_BUILDX }}.windows-amd64.exe -o $env:ProgramData\Docker\cli-plugins\docker-buildx.exe + - uses: docker/setup-buildx-action@v3 + with: + driver: remote + endpoint: npipe:////./pipe/buildkitd + + - name: Install WiX + run: dotnet tool install --global wix + + - name: Install WiX extensions + run: | + wix extension add -g WixToolset.Util.wixext + wix extension add -g WixToolset.Firewall.wixext + + - name: Install Build deps + run: | + Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:VERSION_PROMU)/promu-$($Env:VERSION_PROMU).windows-amd64.zip -OutFile promu-$($Env:VERSION_PROMU).windows-amd64.zip + Expand-Archive -Path promu-$($Env:VERSION_PROMU).windows-amd64.zip -DestinationPath . + Copy-Item -Path promu-$($Env:VERSION_PROMU).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" + + # GOPATH\bin dir must be added to PATH else the `promu` commands won't be found + echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Build + run: | + $ErrorActionPreference = "Stop" + + $Version = git describe --tags --always + $Version = $Version -replace 'v', '' + # '+' symbols are invalid characters in image tags + $Version = $Version -replace '\+', '_' + $Version | Set-Content VERSION -PassThru + + make build-all + + # GH requires all files to have different names, so add version/arch to differentiate + foreach($Arch in "amd64", "arm64") { + Move-Item output\$Arch\windows_exporter.exe output\windows_exporter-$Version-$Arch.exe + } + + Get-ChildItem -Path output + + - name: Login to GitHub container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Push Latest image + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ startsWith(github.ref, 'refs/tags/') && 'latest' || github.ref_name }} + run: | + make push-all diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7accd905..9a42d8602 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,17 +16,16 @@ permissions: packages: write env: - PROMU_VER: '0.14.0' + VERSION_PROMU: '0.14.0' + VERSION_CONTAINERD: '1.7.21' + VERSION_BUILDKIT: '0.15.2' + VERSION_BUILDX: '0.16.2' jobs: build: runs-on: windows-2022 steps: - uses: actions/checkout@v4 - with: - # fetch-depth required for gitversion in `Build` step - fetch-depth: 0 - - uses: actions/setup-go@v5 with: go-version-file: 'go.mod' @@ -34,28 +33,24 @@ jobs: # https://github.com/pl4nty/Windows-Containers/blob/Main/helpful_tools/Install-BuildKit-GitHubActions/workflow.yaml - name: Setup containerd run: | - $version = "1.7.20" - curl.exe -L https://github.com/containerd/containerd/releases/download/v$version/containerd-$version-windows-amd64.tar.gz -o containerd.tar.gz + curl.exe -L https://github.com/containerd/containerd/releases/download/v${{ env.VERSION_CONTAINERD }}/containerd-${{ env.VERSION_CONTAINERD }}-windows-amd64.tar.gz -o containerd.tar.gz tar.exe xvf containerd.tar.gz .\bin\containerd.exe --register-service Start-Service containerd - name: Setup BuildKit run: | - $version = "v0.15.0" - curl.exe -L https://github.com/moby/buildkit/releases/download/$version/buildkit-$version.windows-amd64.tar.gz -o buildkit.tar.gz + curl.exe -L https://github.com/moby/buildkit/releases/download/v${{ env.VERSION_BUILDKIT }}/buildkit-v${{ env.VERSION_BUILDKIT }}.windows-amd64.tar.gz -o buildkit.tar.gz tar.exe xvf buildkit.tar.gz .\bin\buildkitd.exe --register-service Start-Service buildkitd - name: Setup Docker Buildx run: | - $version = "v0.16.1" - curl.exe -L https://github.com/docker/buildx/releases/download/$version/buildx-$version.windows-amd64.exe -o $env:ProgramData\Docker\cli-plugins\docker-buildx.exe + curl.exe -L https://github.com/docker/buildx/releases/download/v${{ env.VERSION_BUILDX }}/buildx-v${{ env.VERSION_BUILDX }}.windows-amd64.exe -o $env:ProgramData\Docker\cli-plugins\docker-buildx.exe - uses: docker/setup-buildx-action@v3 with: driver: remote endpoint: npipe:////./pipe/buildkitd - - name: Install WiX run: dotnet tool install --global wix @@ -67,9 +62,9 @@ jobs: - name: Install Build deps run: | - Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:PROMU_VER)/promu-$($Env:PROMU_VER).windows-amd64.zip -OutFile promu-$($Env:PROMU_VER).windows-amd64.zip - Expand-Archive -Path promu-$($Env:PROMU_VER).windows-amd64.zip -DestinationPath . - Copy-Item -Path promu-$($Env:PROMU_VER).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" + Invoke-WebRequest -Uri https://github.com/prometheus/promu/releases/download/v$($Env:VERSION_PROMU)/promu-$($Env:VERSION_PROMU).windows-amd64.zip -OutFile promu-$($Env:VERSION_PROMU).windows-amd64.zip + Expand-Archive -Path promu-$($Env:VERSION_PROMU).windows-amd64.zip -DestinationPath . + Copy-Item -Path promu-$($Env:VERSION_PROMU).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" # GOPATH\bin dir must be added to PATH else the `promu` commands won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml index a86b70a77..2f0e10868 100644 --- a/.github/workflows/spelling.yml +++ b/.github/workflows/spelling.yml @@ -10,7 +10,7 @@ on: - master env: - PROMU_VER: 'v0.14.0' + VERSION_PROMU: 'v0.14.0' jobs: codespell: diff --git a/Makefile b/Makefile index 1a33a5858..7c9722f13 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ DOCKER_REPO ?= prometheuscommunity DOCKER_IMAGE_NAME ?= windows-exporter # ALL_DOCKER_REPOS is the list of repositories to push the image to. ghcr.io requires that org name be the same as the image repo name. -ALL_DOCKER_REPOS ?= docker.io/$(DOCKER_REPO) ghcr.io/prometheus-community # quay.io/$(DOCKER_REPO) +ALL_DOCKER_REPOS ?= ghcr.io/jkroepke # quay.io/$(DOCKER_REPO) # Image Variables for host process Container # Windows image build is heavily influenced by https://github.com/kubernetes/kubernetes/blob/master/cluster/images/etcd/Makefile @@ -56,10 +56,10 @@ package: crossbuild powershell -NonInteractive -ExecutionPolicy Bypass -File .\installer\build.ps1 -PathToExecutable .\output\amd64\windows_exporter.exe -Version $(shell git describe --tags --abbrev=0) build-image: crossbuild - $(DOCKER) build --build-arg=BASE=$(BASE_IMAGE):$(OS) -f Dockerfile -t local/$(DOCKER_IMAGE_NAME):$(VERSION)-$(OS) . + $(DOCKER) build --build-arg=BASE=$(BASE_IMAGE):$(OS) -f Dockerfile -t local/$(DOCKER_IMAGE_NAME):pr1561-$(OS) . build-hostprocess: - $(DOCKER) buildx build --build-arg=BASE=mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0 -f Dockerfile -t local/$(DOCKER_IMAGE_NAME):$(VERSION)-hostprocess . + $(DOCKER) buildx build --build-arg=BASE=mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0 -f Dockerfile -t local/$(DOCKER_IMAGE_NAME):pr1561-hostprocess . sub-build-%: $(MAKE) OS=$* build-image @@ -70,20 +70,20 @@ push: set -x; \ for docker_repo in ${DOCKER_REPO}; do \ for osversion in ${ALL_OS}; do \ - $(DOCKER) tag local/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion} $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ - $(DOCKER) push $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ - $(DOCKER) manifest create --amend $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION) $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ + $(DOCKER) tag local/$(DOCKER_IMAGE_NAME):pr1561-$${osversion} $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561-$${osversion}; \ + $(DOCKER) push $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561-$${osversion}; \ + $(DOCKER) manifest create --amend $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561 $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561-$${osversion}; \ full_version=`$(DOCKER) manifest inspect $(BASE_IMAGE):$${osversion} | grep "os.version" | head -n 1 | awk -F\" '{print $$4}'` || true; \ - $(DOCKER) manifest annotate --os windows --arch amd64 --os-version $${full_version} $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION) $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ + $(DOCKER) manifest annotate --os windows --arch amd64 --os-version $${full_version} $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561 $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561-$${osversion}; \ done; \ - $(DOCKER) manifest push --purge $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION); \ + $(DOCKER) manifest push --purge $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561 ; \ done # We can't load the image into the local docker store, so we have to build and push it in one go push-hostprocess: set -x; \ for docker_repo in ${DOCKER_REPO}; do \ - $(DOCKER) buildx build --push --build-arg=BASE=mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0 -f Dockerfile -t $${docker_repo}/$(DOCKER_IMAGE_NAME):$(VERSION)-hostprocess .; \ + $(DOCKER) buildx build --push --build-arg=BASE=mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0 -f Dockerfile -t $${docker_repo}/$(DOCKER_IMAGE_NAME):pr1561-hostprocess .; \ done .PHONY: push-all diff --git a/pkg/collector/container/container.go b/pkg/collector/container/container.go index e547f3e49..3d8e64995 100644 --- a/pkg/collector/container/container.go +++ b/pkg/collector/container/container.go @@ -3,6 +3,8 @@ package container import ( + "errors" + "fmt" "strings" "github.com/Microsoft/hcsshim" @@ -194,6 +196,7 @@ func (c *Collector) Build(_ log.Logger, _ *wmi.Client) error { []string{"container_id"}, nil, ) + return nil } @@ -205,15 +208,8 @@ func (c *Collector) Collect(_ *types.ScrapeContext, logger log.Logger, ch chan<- _ = level.Error(logger).Log("msg", "failed collecting collector metrics", "err", err) return err } - return nil -} -// containerClose closes the container resource. -func (c *Collector) containerClose(logger log.Logger, container hcsshim.Container) { - err := container.Close() - if err != nil { - _ = level.Error(logger).Log("err", err) - } + return nil } func (c *Collector) collect(logger log.Logger, ch chan<- prometheus.Metric) error { @@ -231,102 +227,138 @@ func (c *Collector) collect(logger log.Logger, ch chan<- prometheus.Metric) erro prometheus.GaugeValue, float64(count), ) + if count == 0 { return nil } containerPrefixes := make(map[string]string) + collectErrors := make([]error, 0, len(containers)) for _, containerDetails := range containers { - // https://stackoverflow.com/questions/45617758/proper-way-to-release-resources-with-defer-in-a-loop - func() { - container, err := hcsshim.OpenContainer(containerDetails.ID) - if container != nil { - defer c.containerClose(logger, container) - } - if err != nil { - _ = level.Error(logger).Log("msg", "err in opening container", "containerId", containerDetails.ID, "err", err) - return + containerIdWithPrefix := getContainerIdWithPrefix(containerDetails) + + if err = c.collectContainer(logger, ch, containerDetails, containerIdWithPrefix); err != nil { + if hcsshim.IsNotExist(err) { + _ = level.Debug(logger).Log("msg", "err in fetching container statistics", "containerId", containerDetails.ID, "err", err) + } else { + _ = level.Error(logger).Log("msg", "err in fetching container statistics", "containerId", containerDetails.ID, "err", err) + collectErrors = append(collectErrors, err) } - cstats, err := container.Statistics() - if err != nil { - _ = level.Error(logger).Log("msg", "err in fetching container Statistics", "containerId", containerDetails.ID, "err", err) - return - } + continue + } - containerIdWithPrefix := getContainerIdWithPrefix(containerDetails) - containerPrefixes[containerDetails.ID] = containerIdWithPrefix + containerPrefixes[containerDetails.ID] = containerIdWithPrefix + } - ch <- prometheus.MustNewConstMetric( - c.containerAvailable, - prometheus.CounterValue, - 1, - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.usageCommitBytes, - prometheus.GaugeValue, - float64(cstats.Memory.UsageCommitBytes), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.usageCommitPeakBytes, - prometheus.GaugeValue, - float64(cstats.Memory.UsageCommitPeakBytes), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.usagePrivateWorkingSetBytes, - prometheus.GaugeValue, - float64(cstats.Memory.UsagePrivateWorkingSetBytes), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.runtimeTotal, - prometheus.CounterValue, - float64(cstats.Processor.TotalRuntime100ns)*perflib.TicksToSecondScaleFactor, - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.runtimeUser, - prometheus.CounterValue, - float64(cstats.Processor.RuntimeUser100ns)*perflib.TicksToSecondScaleFactor, - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.runtimeKernel, - prometheus.CounterValue, - float64(cstats.Processor.RuntimeKernel100ns)*perflib.TicksToSecondScaleFactor, - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.readCountNormalized, - prometheus.CounterValue, - float64(cstats.Storage.ReadCountNormalized), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.readSizeBytes, - prometheus.CounterValue, - float64(cstats.Storage.ReadSizeBytes), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.writeCountNormalized, - prometheus.CounterValue, - float64(cstats.Storage.WriteCountNormalized), - containerIdWithPrefix, - ) - ch <- prometheus.MustNewConstMetric( - c.writeSizeBytes, - prometheus.CounterValue, - float64(cstats.Storage.WriteSizeBytes), - containerIdWithPrefix, - ) - }() + if err = c.collectNetworkMetrics(logger, ch, containerPrefixes); err != nil { + return fmt.Errorf("error in fetching container network statistics: %w", err) } + if len(collectErrors) > 0 { + return fmt.Errorf("errors while fetching container statistics: %w", errors.Join(collectErrors...)) + } + + return nil +} + +func (c *Collector) collectContainer(logger log.Logger, ch chan<- prometheus.Metric, containerDetails hcsshim.ContainerProperties, containerIdWithPrefix string) error { + container, err := hcsshim.OpenContainer(containerDetails.ID) + if err != nil { + return fmt.Errorf("error in opening container: %w", err) + } + + defer func() { + if container == nil { + return + } + + if err := container.Close(); err != nil { + _ = level.Error(logger).Log("err", fmt.Errorf("error in closing container: %w", err)) + } + }() + + containerStats, err := container.Statistics() + if err != nil { + return fmt.Errorf("error in fetching container statistics: %w", err) + } + + ch <- prometheus.MustNewConstMetric( + c.containerAvailable, + prometheus.CounterValue, + 1, + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.usageCommitBytes, + prometheus.GaugeValue, + float64(containerStats.Memory.UsageCommitBytes), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.usageCommitPeakBytes, + prometheus.GaugeValue, + float64(containerStats.Memory.UsageCommitPeakBytes), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.usagePrivateWorkingSetBytes, + prometheus.GaugeValue, + float64(containerStats.Memory.UsagePrivateWorkingSetBytes), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.runtimeTotal, + prometheus.CounterValue, + float64(containerStats.Processor.TotalRuntime100ns)*perflib.TicksToSecondScaleFactor, + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.runtimeUser, + prometheus.CounterValue, + float64(containerStats.Processor.RuntimeUser100ns)*perflib.TicksToSecondScaleFactor, + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.runtimeKernel, + prometheus.CounterValue, + float64(containerStats.Processor.RuntimeKernel100ns)*perflib.TicksToSecondScaleFactor, + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.readCountNormalized, + prometheus.CounterValue, + float64(containerStats.Storage.ReadCountNormalized), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.readSizeBytes, + prometheus.CounterValue, + float64(containerStats.Storage.ReadSizeBytes), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.writeCountNormalized, + prometheus.CounterValue, + float64(containerStats.Storage.WriteCountNormalized), + containerIdWithPrefix, + ) + ch <- prometheus.MustNewConstMetric( + c.writeSizeBytes, + prometheus.CounterValue, + float64(containerStats.Storage.WriteSizeBytes), + containerIdWithPrefix, + ) + + return nil +} + +// collectNetworkMetrics collects network metrics for containers. +// With HNSv2, the network stats must be collected from hcsshim.HNSListEndpointRequest. +// Network statistics from the container.Statistics() are providing data only, if HNSv1 is used. +// Ref: https://github.com/prometheus-community/windows_exporter/pull/1218 +func (c *Collector) collectNetworkMetrics(logger log.Logger, ch chan<- prometheus.Metric, containerPrefixes map[string]string) error { hnsEndpoints, err := hcsshim.HNSListEndpointRequest() if err != nil { _ = level.Warn(logger).Log("msg", "Failed to collect network stats for containers") @@ -347,13 +379,14 @@ func (c *Collector) collect(logger log.Logger, ch chan<- prometheus.Metric) erro for _, containerId := range endpoint.SharedContainers { containerIdWithPrefix, ok := containerPrefixes[containerId] - endpointId := strings.ToUpper(endpoint.Id) if !ok { - _ = level.Warn(logger).Log("msg", "Failed to collect network stats for container "+containerId) + _ = level.Debug(logger).Log("msg", "Failed to collect network stats for container "+containerId) continue } + endpointId := strings.ToUpper(endpoint.Id) + ch <- prometheus.MustNewConstMetric( c.bytesReceived, prometheus.CounterValue, diff --git a/pkg/collector/textfile/textfile_test_test.go b/pkg/collector/textfile/textfile_test_test.go index 246aa56d3..b5de5c3a2 100644 --- a/pkg/collector/textfile/textfile_test_test.go +++ b/pkg/collector/textfile/textfile_test_test.go @@ -16,9 +16,8 @@ import ( var baseDir = "../../../tools/textfile-test" +//nolint:paralleltest func TestMultipleDirectories(t *testing.T) { - t.Parallel() - logger := log.NewLogfmtLogger(os.Stdout) testDir := baseDir + "/multiple-dirs" testDirs := fmt.Sprintf("%[1]s/dir1,%[1]s/dir2,%[1]s/dir3", testDir) @@ -60,9 +59,8 @@ func TestMultipleDirectories(t *testing.T) { } } +//nolint:paralleltest func TestDuplicateFileName(t *testing.T) { - t.Parallel() - logger := log.NewLogfmtLogger(os.Stdout) testDir := baseDir + "/duplicate-filename" textFileCollector := textfile.New(&textfile.Config{