From 5a9711dc90928b0a5c1865cf4b968255c9a5462b Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Fri, 18 Feb 2022 22:29:34 +1000 Subject: [PATCH 1/3] Run CI on pushes to master branch Required to keep container image (with "latest" tag) up to date. Will also ensure the master branch is healthy after PR merges. Signed-off-by: Ben Reedy --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a675e10..d7178a6e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,11 @@ name: windows_exporter CI/CD -# Trigger on pull requests and releases +# Trigger on pull requests, releases and pushes to master branch. # Deployments will only occur for releases (see `if` clauses in the build job). on: + push: + branches: + - master pull_request: branches: - master @@ -170,7 +173,7 @@ jobs: promu checksum output\ - name: Login to GitHub container registry - if: startsWith(github.ref, 'refs/tags/') + if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v1 with: registry: ghcr.io From 6941ee7ab25452c2eeb058d5fc4db95af50587f7 Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Sat, 26 Feb 2022 18:40:05 +1000 Subject: [PATCH 2/3] Run promtool windows_exporter on non-default port Prevents conflicts when promtool & test jobs are run concurrently in CI. Signed-off-by: Ben Reedy --- tools/end-to-end-test.ps1 | 6 +++--- tools/promtool.ps1 | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/end-to-end-test.ps1 b/tools/end-to-end-test.ps1 index 54b390d8..1d370749 100644 --- a/tools/end-to-end-test.ps1 +++ b/tools/end-to-end-test.ps1 @@ -24,19 +24,19 @@ $skip_re = "^(go_|windows_exporter_build_info|windows_exporter_collector_duratio # Use default collectors, port and address: http://localhost:9182/metrics $exporter_proc = Start-Process ` -PassThru ` - -FilePath .\windows_exporter.exe ` + -FilePath ..\windows_exporter.exe ` -ArgumentList "--log.level=debug --collector.textfile.directory=$($textfile_dir)" ` -WindowStyle Hidden ` -RedirectStandardOutput "$($temp_dir)/windows_exporter.log" ` -RedirectStandardError "$($temp_dir)/windows_exporter_error.log" # Give exporter some time to start -Start-Sleep 3 +Start-Sleep 15 $response = Invoke-WebRequest -UseBasicParsing -URI http://127.0.0.1:9182/metrics # Response output must be split and saved as UTF-8. $response.content -split "[`r`n]"| Select-String -NotMatch $skip_re | Set-Content -Encoding utf8 "$($temp_dir)/e2e-output.txt" -Stop-Process $exporter_proc +Stop-Process -Id $exporter_proc.Id $output_diff = Compare-Object (Get-Content 'e2e-output.txt') (Get-Content "$($temp_dir)/e2e-output.txt") # Fail if differences in output are detected diff --git a/tools/promtool.ps1 b/tools/promtool.ps1 index 8fdbdf81..16fe32c6 100644 --- a/tools/promtool.ps1 +++ b/tools/promtool.ps1 @@ -88,23 +88,24 @@ Push-Location $working_dir $temp_dir = Join-Path $env:TEMP $(New-Guid) | ForEach-Object { mkdir $_ } # Start process in background, awaiting HTTP requests. -# Use default collectors, port and address: http://localhost:9182/metrics +# Listen on 9183/TCP, preventing conflicts with 9182/TCP used by end-to-end-test.ps1 +# Not an issue when run individually, but will cause failures when run concurrently in CI. $exporter_proc = Start-Process ` -PassThru ` - -FilePath .\windows_exporter.exe ` - -ArgumentList "--log.level=debug" ` + -FilePath ..\windows_exporter.exe ` + -ArgumentList '--telemetry.addr="127.0.0.1:9183" --log.level=debug' ` -WindowStyle Hidden ` -RedirectStandardOutput "$($temp_dir)/windows_exporter.log" ` -RedirectStandardError "$($temp_dir)/windows_exporter_error.log" # Give exporter some time to start -Start-Sleep 3 +Start-Sleep 15 # Omit metrics from client_golang library; we're not responsible for these $skip_re = "^[#]?\s*(HELP|TYPE)?\s*go_" # Need to remove carriage returns, as promtool expects LF line endings -$output = ((Invoke-WebRequest -UseBasicParsing -URI http://127.0.0.1:9182/metrics).Content) -Split "`r?`n" | Select-String -NotMatch $skip_re | Join-String -Separator "`n" +$output = ((Invoke-WebRequest -UseBasicParsing -URI http://127.0.0.1:9183/metrics).Content) -Split "`r?`n" | Select-String -NotMatch $skip_re | Join-String -Separator "`n" # Join the split lines back to a single String (with LF line endings!) $output = $output -Join "`n" Stop-Process -Id $exporter_proc.Id From 79ecaf6a99beaca560868b5e79d965ab5ea63817 Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Sun, 27 Feb 2022 07:34:50 +1000 Subject: [PATCH 3/3] Check for listening exporter before querying CI runs have exposed timing issues where promtool/e2e scripts query the exporter, before exporter has begun listening. Signed-off-by: Ben Reedy --- tools/end-to-end-test.ps1 | 12 ++++++++++-- tools/promtool.ps1 | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/tools/end-to-end-test.ps1 b/tools/end-to-end-test.ps1 index 1d370749..3af46a82 100644 --- a/tools/end-to-end-test.ps1 +++ b/tools/end-to-end-test.ps1 @@ -30,8 +30,16 @@ $exporter_proc = Start-Process ` -RedirectStandardOutput "$($temp_dir)/windows_exporter.log" ` -RedirectStandardError "$($temp_dir)/windows_exporter_error.log" -# Give exporter some time to start -Start-Sleep 15 +# Exporter can take some time to start +for ($i=1; $i -le 5; $i++) { + Start-Sleep 10 + + $netstat_output = netstat -anp tcp | Select-String 'listening' + if ($netstat_output -like '*:9182*') { + break + } + Write-Host "Waiting for exporter to start" +} $response = Invoke-WebRequest -UseBasicParsing -URI http://127.0.0.1:9182/metrics # Response output must be split and saved as UTF-8. diff --git a/tools/promtool.ps1 b/tools/promtool.ps1 index 16fe32c6..46d3941a 100644 --- a/tools/promtool.ps1 +++ b/tools/promtool.ps1 @@ -98,8 +98,16 @@ $exporter_proc = Start-Process ` -RedirectStandardOutput "$($temp_dir)/windows_exporter.log" ` -RedirectStandardError "$($temp_dir)/windows_exporter_error.log" -# Give exporter some time to start -Start-Sleep 15 +# Exporter can take some time to start +for ($i=1; $i -le 5; $i++) { + Start-Sleep 10 + + $netstat_output = netstat -anp tcp | Select-String 'listening' + if ($netstat_output -like '*:9183*') { + break + } + Write-Host "Waiting for exporter to start" +} # Omit metrics from client_golang library; we're not responsible for these $skip_re = "^[#]?\s*(HELP|TYPE)?\s*go_"