diff --git a/.mergify.yml b/.mergify.yml index a0cc5c8d5ce..246aa28a57d 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -1,348 +1,331 @@ commands_restrictions: - backport: - conditions: - - or: - - sender-permission>=write - - sender=github-actions[bot] -queue_rules: - - name: default - merge_method: squash - conditions: - - check-success=buildkite/elastic-agent - - check-success=CLA -defaults: - actions: backport: - title: "[{{ destination_branch }}] (backport #{{ number }}) {{ title }}" - assignees: - - "{{ author }}" - labels: - - "backport" -pull_request_rules: - - name: automatic approval for updatecli pull requests with changes in .buildkite - conditions: - - author=github-actions[bot] - - check-success=buildkite/elastic-agent - - or: - - files~=^.buildkite/(pipeline.yml|bk.integration.pipeline.yml)$ - - head~=^updatecli_.* - actions: - review: - type: APPROVE - message: Automatically approving mergify - - name: automatic squash and merge with success checks and the files matching the regex .buildkite is modified. - conditions: - - author=github-actions[bot] - - check-success=buildkite/elastic-agent - - or: - - files~=^.buildkite/(pipeline.yml|bk.integration.pipeline.yml)$ - - head~=^updatecli_.* - - "#approved-reviews-by>=1" - actions: - queue: - name: default - - name: self-assign PRs - conditions: - - -merged - - -closed - - "#assignee=0" - actions: - assign: - add_users: - - "{{ author }}" - - name: forward-port patches to main branch - conditions: - - merged - - label=forwardport-main - actions: - backport: - branches: - - "main" - - name: ask to resolve conflict - conditions: - - -merged - - -closed - - conflict + conditions: + - or: + - sender-permission>=write + - sender=github-actions[bot] +defaults: actions: + backport: + assignees: + - '{{ author }}' + labels: + - backport + title: '[{{ destination_branch }}] (backport #{{ number }}) {{ title }}' +pull_request_rules: + - actions: + review: + message: Automatically approving mergify + type: APPROVE + conditions: + - author=github-actions[bot] + - check-success=buildkite/elastic-agent + - or: + - files~=^.buildkite/(pipeline.yml|bk.integration.pipeline.yml)$ + - head~=^updatecli_.* + name: automatic approval for updatecli pull requests with changes in .buildkite + - actions: + queue: + name: default + conditions: + - author=github-actions[bot] + - check-success=buildkite/elastic-agent + - or: + - files~=^.buildkite/(pipeline.yml|bk.integration.pipeline.yml)$ + - head~=^updatecli_.* + - '#approved-reviews-by>=1' + name: automatic squash and merge with success checks and the files matching the regex .buildkite is modified. + - actions: + assign: + add_users: + - '{{ author }}' + conditions: + - -merged + - -closed + - '#assignee=0' + name: self-assign PRs + - actions: + backport: + branches: + - main + conditions: + - merged + - label=forwardport-main + name: forward-port patches to main branch + - actions: comment: - message: | - This pull request is now in conflicts. Could you fix it? 🙏 - To fixup this pull request, you can check out it locally. See documentation: https://help.github.com/articles/checking-out-pull-requests-locally/ - ``` - git fetch upstream - git checkout -b {{head}} upstream/{{head}} - git merge upstream/{{base}} - git push upstream {{head}} - ``` - - name: close automated pull requests with bump updates if any conflict - conditions: - - -merged - - -closed - - conflict - - label=automation - actions: - close: - message: | - This pull request has been automatically closed by Mergify. - There are some other up-to-date pull requests. - - name: delete upstream branch after merging changes on .go-version or it's closed - conditions: - - or: + message: "This pull request is now in conflicts. Could you fix it? \U0001F64F\nTo fixup this pull request, you can check out it locally. See documentation: https://help.github.com/articles/checking-out-pull-requests-locally/\n```\ngit fetch upstream\ngit checkout -b {{head}} upstream/{{head}}\ngit merge upstream/{{base}}\ngit push upstream {{head}}\n```\n" + conditions: + - -merged + - -closed + - conflict + name: ask to resolve conflict + - actions: + close: + message: | + This pull request has been automatically closed by Mergify. + There are some other up-to-date pull requests. + conditions: + - -merged + - -closed + - conflict + - label=automation + name: close automated pull requests with bump updates if any conflict + - actions: + delete_head_branch: null + conditions: + - or: + - merged + - closed + - and: + - head~=^updatecli.* + - files~=^\.go-version$ + name: delete upstream branch after merging changes on .go-version or it's closed + - actions: + review: + message: Automatically approving mergify + type: APPROVE + conditions: + - author=mergify[bot] + - check-success=buildkite/elastic-agent + - files~=^\.mergify\.yml$ + - head~=^add-backport-next.* + name: automatic approval for mergify pull requests with changes in bump-rules + - actions: + queue: + name: default + conditions: + - check-success=buildkite/elastic-agent + - files~=^\.mergify\.yml$ + - head~=^add-backport-next.* + - '#approved-reviews-by>=1' + name: automatic squash and merge with success checks and the files matching the regex ^.mergify.yml is modified. + - actions: + delete_head_branch: null + conditions: + - or: + - merged + - closed + - and: + - head~=^mergify/bp/.* + name: delete upstream branch for mergify backports + - actions: + delete_head_branch: null + conditions: + - or: + - merged + - closed + - and: + - head~=^add-backport-next.* + - files~=^\.mergify\.yml$ + name: delete upstream branch with changes on ^.mergify.yml that has been merged or closed + - actions: + comment: + message: "This pull request has not been merged yet. Could you please review and merge it @{{ assignee | join(', @') }}? \U0001F64F\n" + conditions: + - -merged + - -closed + - author=mergify[bot] + - '#check-success>0' + - schedule=Mon-Mon 06:00-10:00[Europe/Paris] + - '#assignee>=1' + name: notify the backport has not been merged yet + - actions: + comment: + message: "This pull request does not have a backport label. Could you fix it @{{author}}? \U0001F64F\nTo fixup this pull request, you need to add the backport labels for the needed\nbranches, such as:\n* `backport-./d./d` is the label that automatically backports to the `8./d` branch. `/d` is the digit\n* `backport-active-all` is the label that automatically backports to all active branches.\n* `backport-active-8` is the label that automatically backports to all active minor branches for the 8 major.\n* `backport-active-9` is the label that automatically backports to all active minor branches for the 9 major.\n" + conditions: + - -label~=^backport + - base=main + - -merged + - -closed + name: notify the backport policy + - actions: + backport: + branches: + - "7.17" + conditions: - merged - - closed - - and: - - head~=^updatecli.* - - files~=^\.go-version$ - actions: - delete_head_branch: - - name: automatic approval for mergify pull requests with changes in bump-rules - conditions: - - author=mergify[bot] - - check-success=buildkite/elastic-agent - - files~=^\.mergify\.yml$ - - head~=^add-backport-next.* - actions: - review: - type: APPROVE - message: Automatically approving mergify - - name: automatic squash and merge with success checks and the files matching the regex ^.mergify.yml is modified. - conditions: - - check-success=buildkite/elastic-agent - - files~=^\.mergify\.yml$ - - head~=^add-backport-next.* - - "#approved-reviews-by>=1" - actions: - queue: - name: default - - name: delete upstream branch for mergify backports - conditions: - - or: + - label~=^(backport-v7.17.0|backport-7.17)$ + name: backport patches to 7.17 branch + - actions: + backport: + branches: + - "8.2" + conditions: - merged - - closed - - and: - - head~=^mergify/bp/.* - actions: - delete_head_branch: - - name: delete upstream branch with changes on ^.mergify.yml that has been merged or closed - conditions: - - or: + - label=backport-v8.2.0 + name: backport patches to 8.2 branch + - actions: + backport: + branches: + - "8.3" + conditions: - merged - - closed - - and: - - head~=^add-backport-next.* - - files~=^\.mergify\.yml$ - actions: - delete_head_branch: - - name: notify the backport has not been merged yet - conditions: - - -merged - - -closed - - author=mergify[bot] - - "#check-success>0" - - schedule=Mon-Mon 06:00-10:00[Europe/Paris] - - "#assignee>=1" - actions: - comment: - message: | - This pull request has not been merged yet. Could you please review and merge it @{{ assignee | join(', @') }}? 🙏 - - name: notify the backport policy - conditions: - - -label~=^backport - - base=main - - -merged - - -closed - actions: - comment: - message: | - This pull request does not have a backport label. Could you fix it @{{author}}? 🙏 - To fixup this pull request, you need to add the backport labels for the needed - branches, such as: - * `backport-./d./d` is the label that automatically backports to the `8./d` branch. `/d` is the digit - * `backport-active-all` is the label that automatically backports to all active branches. - * `backport-active-8` is the label that automatically backports to all active minor branches for the 8 major. - * `backport-active-9` is the label that automatically backports to all active minor branches for the 9 major. - - - name: backport patches to 7.17 branch - conditions: - - merged - - label~=^(backport-v7.17.0|backport-7.17)$ - actions: - backport: - branches: - - "7.17" - - name: backport patches to 8.2 branch - conditions: - - merged - - label=backport-v8.2.0 - actions: - backport: - branches: - - "8.2" - - name: backport patches to 8.3 branch - conditions: - - merged - - label=backport-v8.3.0 - actions: - backport: - branches: - - "8.3" - - name: backport patches to 8.4 branch - conditions: - - merged - - label=backport-v8.4.0 - actions: - backport: - branches: - - "8.4" - - name: backport patches to 8.5 branch - conditions: - - merged - - label=backport-v8.5.0 - actions: - backport: - branches: - - "8.5" - - name: backport patches to 8.6 branch - conditions: - - merged - - label=backport-v8.6.0 - actions: - backport: - branches: - - "8.6" - - name: backport patches to 8.7 branch - conditions: - - merged - - label=backport-v8.7.0 - actions: - backport: - branches: - - "8.7" - - name: backport patches to 8.8 branch - conditions: - - merged - - label=backport-v8.8.0 - actions: - backport: - branches: - - "8.8" - - name: backport patches to 8.9 branch - conditions: - - merged - - label=backport-v8.9.0 - actions: - backport: - branches: - - "8.9" - - name: backport patches to 8.10 branch - conditions: - - merged - - label=backport-v8.10.0 - actions: - backport: - branches: - - "8.10" - - name: backport patches to 8.11 branch - conditions: - - merged - - label=backport-v8.11.0 - actions: - backport: - branches: - - "8.11" - - name: backport patches to 8.12 branch - conditions: - - merged - - label=backport-v8.12.0 - actions: - backport: - branches: - - "8.12" - - name: backport patches to 8.13 branch - conditions: - - merged - - label=backport-v8.13.0 - actions: - backport: - branches: - - "8.13" - - name: backport patches to 8.14 branch - conditions: - - merged - - label=backport-v8.14.0 - actions: - backport: - branches: - - "8.14" - - name: backport patches to 8.15 branch - conditions: - - merged - - label~=^(backport-v8.15.0|backport-8.15)$ - actions: - backport: - branches: - - "8.15" - - name: backport patches to 8.16 branch - conditions: - - merged - - label~=^(backport-v8.16.0|backport-8.16)$ - actions: - backport: - branches: - - "8.16" - - name: backport patches to 8.17 branch - conditions: - - merged - - label=backport-8.17 - actions: - backport: - branches: - - "8.17" - - name: backport patches to 8.18 branch - conditions: - - merged - - label=backport-8.18 - actions: - backport: - branches: - - "8.18" - - name: backport patches to 8.19 branch - conditions: - - merged - - label=backport-8.19 - actions: - backport: - branches: - - "8.19" - - name: backport patches to 9.0 branch - conditions: - - merged - - label=backport-9.0 - actions: - backport: - branches: - - "9.0" - - name: backport patches to 9.1 branch - conditions: - - merged - - label=backport-9.1 - actions: - backport: - branches: - - "9.1" - - name: backport patches to 9.2 branch - conditions: - - merged - - label=backport-9.2 - actions: - backport: - branches: - - "9.2" - - name: backport patches to 9.3 branch - conditions: - - merged - - label=backport-9.3 - actions: - backport: - branches: - - "9.3" + - label=backport-v8.3.0 + name: backport patches to 8.3 branch + - actions: + backport: + branches: + - "8.4" + conditions: + - merged + - label=backport-v8.4.0 + name: backport patches to 8.4 branch + - actions: + backport: + branches: + - "8.5" + conditions: + - merged + - label=backport-v8.5.0 + name: backport patches to 8.5 branch + - actions: + backport: + branches: + - "8.6" + conditions: + - merged + - label=backport-v8.6.0 + name: backport patches to 8.6 branch + - actions: + backport: + branches: + - "8.7" + conditions: + - merged + - label=backport-v8.7.0 + name: backport patches to 8.7 branch + - actions: + backport: + branches: + - "8.8" + conditions: + - merged + - label=backport-v8.8.0 + name: backport patches to 8.8 branch + - actions: + backport: + branches: + - "8.9" + conditions: + - merged + - label=backport-v8.9.0 + name: backport patches to 8.9 branch + - actions: + backport: + branches: + - "8.10" + conditions: + - merged + - label=backport-v8.10.0 + name: backport patches to 8.10 branch + - actions: + backport: + branches: + - "8.11" + conditions: + - merged + - label=backport-v8.11.0 + name: backport patches to 8.11 branch + - actions: + backport: + branches: + - "8.12" + conditions: + - merged + - label=backport-v8.12.0 + name: backport patches to 8.12 branch + - actions: + backport: + branches: + - "8.13" + conditions: + - merged + - label=backport-v8.13.0 + name: backport patches to 8.13 branch + - actions: + backport: + branches: + - "8.14" + conditions: + - merged + - label=backport-v8.14.0 + name: backport patches to 8.14 branch + - actions: + backport: + branches: + - "8.15" + conditions: + - merged + - label~=^(backport-v8.15.0|backport-8.15)$ + name: backport patches to 8.15 branch + - actions: + backport: + branches: + - "8.16" + conditions: + - merged + - label~=^(backport-v8.16.0|backport-8.16)$ + name: backport patches to 8.16 branch + - actions: + backport: + branches: + - "8.17" + conditions: + - merged + - label=backport-8.17 + name: backport patches to 8.17 branch + - actions: + backport: + branches: + - "8.18" + conditions: + - merged + - label=backport-8.18 + name: backport patches to 8.18 branch + - actions: + backport: + branches: + - "8.19" + conditions: + - merged + - label=backport-8.19 + name: backport patches to 8.19 branch + - actions: + backport: + branches: + - "9.0" + conditions: + - merged + - label=backport-9.0 + name: backport patches to 9.0 branch + - actions: + backport: + branches: + - "9.1" + conditions: + - merged + - label=backport-9.1 + name: backport patches to 9.1 branch + - actions: + backport: + branches: + - "9.2" + conditions: + - merged + - label=backport-9.2 + name: backport patches to 9.2 branch + - actions: + backport: + branches: + - "9.3" + conditions: + - merged + - label=backport-9.3 + name: backport patches to 9.3 branch +queue_rules: + - conditions: + - check-success=buildkite/elastic-agent + - check-success=CLA + merge_method: squash + name: default diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000000..fc81c6d8c33 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,147 @@ +# Release Process + +Quick reference for running elastic-agent releases using mage automation. + +## Prerequisites + +```bash +# Install mage (if not already installed) +go install github.com/magefile/mage@latest + +# Configure environment +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="ghp_your_token_here" +``` + +## Major/Minor Release + +### Automated (Recommended) + +```bash +# Dry run first +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="ghp_..." +export DRY_RUN=true +mage release:runMajorMinor + +# Review changes, then run for real +export DRY_RUN=false +git checkout main && git pull origin main +mage release:runMajorMinor +``` + +### Manual Steps + +```bash +# 1. Start clean +git checkout main && git pull origin main + +# 2. Prepare release files +mage release:prepareMajorMinor + +# 3. Review changes +git diff + +# 4. Create release branch and commit +mage release:createBranch + +# 5. Push branch +git push origin 9.5 + +# 6. Create pull request +mage release:createPR +``` + +## Patch Release + +### Automated (Recommended) + +```bash +# Dry run first +export CURRENT_RELEASE="9.4.1" +export BASE_BRANCH="9.4" +export GITHUB_TOKEN="ghp_..." +export DRY_RUN=true +git checkout 9.4 && git pull origin 9.4 +mage release:runPatch + +# Review changes, then run for real +export DRY_RUN=false +mage release:runPatch +``` + +### Manual Steps + +```bash +# 1. Checkout release branch +export CURRENT_RELEASE="9.4.1" +export BASE_BRANCH="9.4" +git checkout 9.4 && git pull origin 9.4 + +# 2. Update files +mage release:updateVersion 9.4.1 +mage release:updateDocs 9.4.1 + +# 3. Commit and push +git add -A +git commit -m "[Release] Prepare patch release 9.4.1" +git push origin 9.4 +``` + +## Individual Commands + +```bash +# Update version only +mage release:updateVersion 9.5.0 + +# Update docs only +mage release:updateDocs 9.5.0 + +# Update mergify only +mage release:updateMergify 9.5.0 + +# See all release commands +mage -l | grep release +``` + +## Environment Variables + +| Variable | Required | Default | Description | +|----------|----------|---------|-------------| +| `CURRENT_RELEASE` | ✓ | - | Version to release (e.g., `9.5.0`) | +| `GITHUB_TOKEN` | ✓ | - | GitHub personal access token | +| `DRY_RUN` | | `false` | Preview mode (set to `true` to skip push/PR) | +| `BASE_BRANCH` | | `main` | Base branch for PRs | +| `PROJECT_OWNER` | | `elastic` | GitHub repository owner | +| `PROJECT_REPO` | | `elastic-agent` | Repository name | + +## Troubleshooting + +**"CURRENT_RELEASE environment variable not set"** +```bash +export CURRENT_RELEASE="9.5.0" +``` + +**"GITHUB_TOKEN environment variable not set"** +```bash +# Create token at: https://github.com/settings/tokens +export GITHUB_TOKEN="ghp_..." +``` + +**"failed to create branch: reference already exists"** +```bash +# Delete existing branch +git branch -D 9.5 +# Or checkout existing branch +git checkout 9.5 +``` + +## Full Documentation + +For detailed documentation, see [dev-tools/mage/release/README.md](dev-tools/mage/release/README.md) + +## Help + +- **Issues**: https://github.com/elastic/elastic-agent/issues +- **Slack**: #ingest-team +- **Migration Plan**: [specs/MIGRATION_PLAN_ELASTIC_AGENT.md](specs/MIGRATION_PLAN_ELASTIC_AGENT.md) diff --git a/dev-tools/mage/release/README.md b/dev-tools/mage/release/README.md new file mode 100644 index 00000000000..2c12b147cd9 --- /dev/null +++ b/dev-tools/mage/release/README.md @@ -0,0 +1,689 @@ +# Elastic Agent Release Automation + +This directory contains the mage-based release automation system for elastic-agent. It replaces the previous Makefile-based scripts with pure Go implementations. + +## Quick Start + +### Automated Workflow (Recommended) + +```bash +# Set required environment variables +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="ghp_your_token_here" + +# Run the complete major/minor release workflow +mage release:runMajorMinor + +# Or for patch releases (from release branch) +export CURRENT_RELEASE="9.4.1" +export BASE_BRANCH="9.4" +mage release:runPatch +``` + +### Manual Step-by-Step + +```bash +# 1. Prepare release files +mage release:prepareMajorMinor + +# 2. Create release branch and commit +mage release:createBranch + +# 3. Create pull request on GitHub +mage release:createPR +``` + +## Prerequisites + +### Required Tools + +- **Go 1.24+** - Check your version: `go version` +- **Git** - For repository operations +- **Mage** - Install with: `go install github.com/magefile/mage@latest` + +### Required Access + +- **GitHub Token** - Personal access token with `repo` scope + - Create at: https://github.com/settings/tokens + - Required permissions: `repo` (full control of private repositories) + - Set as environment variable: `export GITHUB_TOKEN="ghp_..."` + +- **Git Configuration** - Ensure git is configured: + ```bash + git config --global user.name "Your Name" + git config --global user.email "your.email@elastic.co" + ``` + +## Environment Variables + +### Required + +| Variable | Description | Example | +|----------|-------------|---------| +| `CURRENT_RELEASE` | Version to release | `9.5.0` | +| `GITHUB_TOKEN` | GitHub personal access token | `ghp_abc123...` | + +### Optional (with defaults) + +| Variable | Description | Default | +|----------|-------------|---------| +| `DRY_RUN` | Preview mode (no push/PR) | `false` | +| `BASE_BRANCH` | Base branch for PRs | `main` | +| `PROJECT_OWNER` | GitHub repository owner | `elastic` | +| `PROJECT_REPO` | GitHub repository name | `elastic-agent` | +| `GIT_AUTHOR_NAME` | Commit author name | `elastic-machine` | +| `GIT_AUTHOR_EMAIL` | Commit author email | `infra-root+elasticmachine@elastic.co` | + +## Available Commands + +### File Updates + +```bash +# Update version in version/version.go +mage release:updateVersion 9.5.0 + +# Update K8s manifests with new version +mage release:updateDocs 9.5.0 + +# Add backport rule to .mergify.yml +mage release:updateMergify 9.5.0 +``` + +### Orchestration Commands (New!) + +```bash +# Complete major/minor release workflow +mage release:runMajorMinor + +# Complete patch release workflow +mage release:runPatch +``` + +### Individual Step Commands + +```bash +# Prepare major/minor release (updates all files) +mage release:prepareMajorMinor + +# Create release branch with changes committed +mage release:createBranch + +# Create pull request on GitHub +mage release:createPR +``` + +## Dry Run Mode + +**Always test with DRY_RUN first!** + +The `DRY_RUN` environment variable allows you to preview the release workflow without making any destructive changes: + +```bash +# Test the workflow without pushing or creating PRs +export DRY_RUN=true +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="ghp_..." + +mage release:runMajorMinor +``` + +**What DRY_RUN does:** +- ✅ Updates local files (version, docs, mergify) +- ✅ Shows what commands would be executed +- ❌ Does NOT create branches on remote +- ❌ Does NOT push changes +- ❌ Does NOT create pull requests + +**After dry run:** +```bash +# Review changes +git diff + +# If satisfied, run for real +export DRY_RUN=false +mage release:runMajorMinor + +# Or discard changes +git checkout . +``` + +## Release Workflows + +### Major/Minor Release (e.g., 9.5.0) + +#### Automated Workflow (Recommended) + +**1. Dry run first (always!):** + +```bash +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="ghp_your_token_here" +export DRY_RUN=true + +# Test the workflow +mage release:runMajorMinor + +# Review the changes +git diff +``` + +**2. Run for real:** + +```bash +# Ensure you're on main +git checkout main +git pull origin main + +# Disable dry run +export DRY_RUN=false + +# Run the complete workflow +mage release:runMajorMinor +``` + +This will: +1. Check requirements (git status, etc.) +2. Update all release files (version, docs, mergify) +3. Create release branch (e.g., `9.5`) +4. Commit all changes +5. Push branch to remote +6. Create pull request on GitHub + +**Done!** The PR is created and ready for review. + +--- + +#### Manual Step-by-Step Workflow + +**1. Prepare your environment:** + +```bash +# Set the release version +export CURRENT_RELEASE="9.5.0" + +# Set your GitHub token +export GITHUB_TOKEN="ghp_your_token_here" + +# Optional: Set base branch if not 'main' +export BASE_BRANCH="main" +``` + +**2. Ensure you're on the correct branch:** + +```bash +# Start from a clean main branch +git checkout main +git pull origin main + +# Verify no uncommitted changes +git status +``` + +**3. Prepare release files:** + +```bash +mage release:prepareMajorMinor +``` + +This command will: +- Update `version/version.go` to the new version +- Update K8s manifests in `deploy/kubernetes/` +- Add backport rule to `.mergify.yml` + +**4. Review the changes:** + +```bash +git diff +``` + +Verify: +- Version is correct in `version/version.go` +- K8s manifests have correct image tags +- Mergify config has new backport rule for `9.5` + +**5. Create release branch:** + +```bash +mage release:createBranch +``` + +This will: +- Create and checkout a new branch `9.5` +- Commit all changes with message: `[Release] Prepare release 9.5.0` +- Branch is ready to be pushed + +**6. Push the branch:** + +```bash +git push origin 9.5 +``` + +**7. Create pull request:** + +```bash +mage release:createPR +``` + +This creates a PR from `9.5` → `main` with: +- Title: `[Release 9.5.0] Prepare release branch` +- Auto-generated checklist +- Release notes template + +### Patch Release (e.g., 9.4.1) + +#### Automated Workflow (Recommended) + +**1. Dry run first:** + +```bash +export CURRENT_RELEASE="9.4.1" +export BASE_BRANCH="9.4" +export GITHUB_TOKEN="ghp_your_token_here" +export DRY_RUN=true + +# Checkout the release branch +git checkout 9.4 +git pull origin 9.4 + +# Test the workflow +mage release:runPatch + +# Review changes +git diff +``` + +**2. Run for real:** + +```bash +# Disable dry run +export DRY_RUN=false + +# Run the complete workflow +mage release:runPatch +``` + +This will: +1. Check requirements +2. Verify you're on the release branch +3. Update version files +4. Commit changes +5. Push to remote + +**Done!** Changes are pushed to the release branch. + +--- + +#### Manual Workflow + +For patch releases, the manual process targets the existing release branch: + +```bash +# Set the patch version +export CURRENT_RELEASE="9.4.1" +export BASE_BRANCH="9.4" # Target the release branch +export GITHUB_TOKEN="ghp_..." + +# Checkout the release branch +git checkout 9.4 +git pull origin 9.4 + +# Prepare files +mage release:updateVersion 9.4.1 +mage release:updateDocs 9.4.1 + +# Commit and push +git add -A +git commit -m "[Release] Prepare patch release 9.4.1" +git push origin 9.4 +``` + +## Local Development & Testing + +### Test the Functions Locally + +You can test individual functions without creating actual branches: + +```bash +# Test version update +mage release:updateVersion 9.5.0-test + +# Check the change +git diff version/version.go + +# Revert +git checkout version/version.go +``` + +### Run Unit Tests + +```bash +# Run all tests +go test ./dev-tools/mage/release/... + +# Run with coverage +go test -cover ./dev-tools/mage/release/... + +# Run specific test +go test -run TestUpdateVersion ./dev-tools/mage/release/... + +# Verbose output +go test -v ./dev-tools/mage/release/... +``` + +### Test on a Fork + +Before running on the main repository, test on a fork: + +```bash +export PROJECT_OWNER="your-github-username" +export PROJECT_REPO="elastic-agent" +export CURRENT_RELEASE="9.5.0-test" +export GITHUB_TOKEN="ghp_..." + +# Run through the workflow +mage release:prepareMajorMinor +mage release:createBranch +mage release:createPR +``` + +## Troubleshooting + +### "CURRENT_RELEASE environment variable not set" + +**Solution:** Set the version you want to release: +```bash +export CURRENT_RELEASE="9.5.0" +``` + +### "GITHUB_TOKEN environment variable not set" + +**Solution:** Create and set a GitHub personal access token: +```bash +# Create token at: https://github.com/settings/tokens +export GITHUB_TOKEN="ghp_your_token_here" +``` + +### "failed to open git repo" + +**Solution:** Ensure you're in the elastic-agent repository root: +```bash +cd /path/to/elastic-agent +pwd # Should show elastic-agent directory +``` + +### "failed to create branch: reference already exists" + +**Solution:** The branch already exists. Either: +- Delete the existing branch: `git branch -D 9.5` +- Checkout the existing branch: `git checkout 9.5` +- Use a different version number + +### "failed to push: authentication required" + +**Solution:** Configure git credentials or use SSH: +```bash +# Option 1: Use SSH +git remote set-url origin git@github.com:elastic/elastic-agent.git + +# Option 2: Configure credentials +git config credential.helper store +``` + +### PR creation fails with "422 Validation Failed" + +**Possible causes:** +- Branch doesn't exist on remote (push first: `git push origin 9.5`) +- PR already exists for this branch +- Invalid base branch specified + +**Solution:** +```bash +# Ensure branch is pushed +git push origin 9.5 + +# Check existing PRs +gh pr list --head 9.5 +``` + +## CI/CD Integration + +### Buildkite + +The release automation integrates with Buildkite pipelines: + +```yaml +# .buildkite/pipeline-release-major-minor.yml +steps: + - label: "Prepare Release" + command: | + export CURRENT_RELEASE="${RELEASE_VERSION}" + export GITHUB_TOKEN="${GITHUB_TOKEN_SECRET}" + mage release:prepareMajorMinor + mage release:createBranch + mage release:createPR +``` + +### Manual Trigger + +You can manually trigger releases from CI by setting environment variables in the Buildkite UI. + +## Migration from Makefile + +If you're migrating from the old `elastic-agent.mak` system: + +| Old Makefile Target | New Mage Command | Notes | +|---------------------|------------------|-------| +| `make update-version` | `mage release:updateVersion` | Same functionality | +| `make update-docs` | `mage release:updateDocs` | Updates K8s manifests | +| `make update-mergify` | `mage release:updateMergify` | Adds backport rules | +| `make prepare-major-minor-release` | `mage release:prepareMajorMinor` | Orchestrates all updates | +| `make create-branch-major-minor-release` | `mage release:createBranch` | Creates and commits to branch | +| N/A | `mage release:createPR` | New: Creates PR via GitHub API | + +### Key Differences + +- **No external tools needed**: No `hub`, `gh`, `sed`, `yq`, or Python +- **Pure Go**: All logic in Go, better testing and type safety +- **Integrated**: Part of existing magefile, consistent with project +- **Better error handling**: Type-safe APIs with proper error messages + +## Architecture + +### File Structure + +``` +dev-tools/mage/release/ +├── release.go # Main release functions +├── git.go # Git operations (branch, commit, push) +├── github.go # GitHub API integration (PR creation) +├── release_test.go # Tests for release functions +└── git_test.go # Tests for git operations +``` + +### Dependencies + +- `github.com/go-git/go-git/v5` - Git operations in pure Go +- `github.com/google/go-github/v68` - GitHub API client +- `gopkg.in/yaml.v3` - YAML parsing for mergify config + +## Best Practices + +### Before Running + +1. **Always start from a clean state:** + ```bash + git checkout main + git pull origin main + git status # Should be clean + ``` + +2. **Set environment variables explicitly:** + ```bash + export CURRENT_RELEASE="9.5.0" + export GITHUB_TOKEN="ghp_..." + ``` + +3. **Review changes before pushing:** + ```bash + git diff + git log --oneline -1 + ``` + +### During Release + +1. **Test on a fork first** if you're unsure +2. **Verify versions** in all updated files +3. **Check CI status** before merging PRs +4. **Communicate with team** about release timing + +### After Release + +1. **Document any issues** encountered +2. **Update this README** if you found gaps +3. **Run tests** to ensure nothing broke + +## Getting Help + +- **Issues with this tool**: Create an issue in `elastic/elastic-agent` +- **Questions**: Ask in #ingest-team Slack channel +- **Documentation**: This README or `specs/MIGRATION_PLAN_ELASTIC_AGENT.md` + +## Examples + +### Complete Automated Workflow + +```bash +#!/bin/bash +# Example: Release 9.5.0 with dry run first + +set -e # Exit on error + +# Configuration +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="${GITHUB_TOKEN}" # From your environment +export BASE_BRANCH="main" + +echo "=== Preparing release ${CURRENT_RELEASE} ===" + +# Ensure clean state +git checkout main +git pull origin main + +# DRY RUN FIRST +echo "Step 1: Running dry run..." +export DRY_RUN=true +mage release:runMajorMinor + +# Review changes +echo "" +echo "Step 2: Review changes..." +git diff + +read -p "Do the changes look correct? (y/n) " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Aborting release. Run 'git checkout .' to discard changes." + exit 1 +fi + +# RUN FOR REAL +echo "" +echo "Step 3: Running for real..." +export DRY_RUN=false +mage release:runMajorMinor + +echo "" +echo "=== Release preparation complete! ===" +echo "PR created. Review and merge when ready." +``` + +### Complete Manual Workflow + +```bash +#!/bin/bash +# Example: Release 9.5.0 (manual steps) + +set -e # Exit on error + +# Configuration +export CURRENT_RELEASE="9.5.0" +export GITHUB_TOKEN="${GITHUB_TOKEN}" +export BASE_BRANCH="main" + +echo "=== Preparing release ${CURRENT_RELEASE} ===" + +# Ensure clean state +git checkout main +git pull origin main + +# Prepare files +echo "Step 1: Preparing release files..." +mage release:prepareMajorMinor + +# Review changes +echo "Step 2: Review changes..." +git diff + +read -p "Do the changes look correct? (y/n) " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Aborting release. Run 'git checkout .' to discard changes." + exit 1 +fi + +# Create branch +echo "Step 3: Creating release branch..." +mage release:createBranch + +# Push branch +echo "Step 4: Pushing to remote..." +git push origin 9.5 + +# Create PR +echo "Step 5: Creating pull request..." +mage release:createPR + +echo "=== Release preparation complete! ===" +echo "PR created. Review and merge when ready." +``` + +### Quick Update (Single File) + +```bash +# Just update version +mage release:updateVersion 9.5.0 + +# Just update docs +mage release:updateDocs 9.5.0 + +# Just update mergify +mage release:updateMergify 9.5.0 +``` + +## FAQ + +**Q: Can I run this on my local machine?** +A: Yes! That's the primary use case. Just set the environment variables and run the commands. + +**Q: Do I need Docker?** +A: No, everything runs in pure Go. + +**Q: What if I make a mistake?** +A: Before pushing, you can reset with `git reset --hard origin/main`. After pushing, you can delete the branch and start over. + +**Q: Can I use this for patch releases?** +A: Yes, set `BASE_BRANCH` to the release branch (e.g., `9.4`) and run the same commands. + +**Q: How do I test without affecting production?** +A: Use a fork by setting `PROJECT_OWNER` to your GitHub username. + +**Q: Where are the release scripts now?** +A: They're in `dev-tools/mage/release/` as Go code, integrated into the existing magefile. + +## Version History + +- **v1.0** (2026-03-12): Initial implementation with core functionality + - File updates (version, docs, mergify) + - Git operations (branch, commit, push) + - GitHub PR creation + - Unit tests with 60%+ coverage diff --git a/dev-tools/mage/release/git.go b/dev-tools/mage/release/git.go new file mode 100644 index 00000000000..6ed84e433ed --- /dev/null +++ b/dev-tools/mage/release/git.go @@ -0,0 +1,162 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package release + +import ( + "errors" + "fmt" + "time" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" +) + +// GitRepo represents a Git repository with common operations +type GitRepo struct { + repo *git.Repository +} + +// OpenRepo opens the Git repository at the given path +func OpenRepo(path string) (*GitRepo, error) { + repo, err := git.PlainOpen(path) + if err != nil { + return nil, fmt.Errorf("failed to open git repo: %w", err) + } + return &GitRepo{repo: repo}, nil +} + +// CreateBranch creates and checks out a new branch +func (g *GitRepo) CreateBranch(branchName string) error { + w, err := g.repo.Worktree() + if err != nil { + return fmt.Errorf("failed to get worktree: %w", err) + } + + // Get current HEAD reference + headRef, err := g.repo.Head() + if err != nil { + return fmt.Errorf("failed to get HEAD: %w", err) + } + + // Create new branch reference + refName := plumbing.NewBranchReferenceName(branchName) + ref := plumbing.NewHashReference(refName, headRef.Hash()) + + err = g.repo.Storer.SetReference(ref) + if err != nil { + return fmt.Errorf("failed to create branch: %w", err) + } + + // Checkout the new branch + err = w.Checkout(&git.CheckoutOptions{ + Branch: refName, + }) + if err != nil { + return fmt.Errorf("failed to checkout branch: %w", err) + } + + fmt.Printf("✓ Created and checked out branch: %s\n", branchName) + return nil +} + +// CommitAll commits all changes with the given message +func (g *GitRepo) CommitAll(message, authorName, authorEmail string) error { + w, err := g.repo.Worktree() + if err != nil { + return fmt.Errorf("failed to get worktree: %w", err) + } + + // Add all changes + err = w.AddWithOptions(&git.AddOptions{ + All: true, + }) + if err != nil { + return fmt.Errorf("failed to add changes: %w", err) + } + + // Create commit + commit, err := w.Commit(message, &git.CommitOptions{ + Author: &object.Signature{ + Name: authorName, + Email: authorEmail, + When: time.Now(), + }, + }) + if err != nil { + return fmt.Errorf("failed to commit: %w", err) + } + + fmt.Printf("✓ Committed changes: %s\n", commit.String()[:7]) + return nil +} + +// Push pushes the current branch to the remote +func (g *GitRepo) Push(remoteName string) error { + err := g.repo.Push(&git.PushOptions{ + RemoteName: remoteName, + }) + if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { + return fmt.Errorf("failed to push: %w", err) + } + + if errors.Is(err, git.NoErrAlreadyUpToDate) { + fmt.Println(" Branch already up to date on remote") + } else { + fmt.Printf("✓ Pushed to remote: %s\n", remoteName) + } + return nil +} + +// GetCurrentBranch returns the name of the current branch +func (g *GitRepo) GetCurrentBranch() (string, error) { + ref, err := g.repo.Head() + if err != nil { + return "", fmt.Errorf("failed to get HEAD: %w", err) + } + + if !ref.Name().IsBranch() { + return "", fmt.Errorf("HEAD is not a branch") + } + + return ref.Name().Short(), nil +} + +// SetRemoteURL sets the URL for a remote +func (g *GitRepo) SetRemoteURL(remoteName, url string) error { + _, err := g.repo.Remote(remoteName) + if errors.Is(err, git.ErrRemoteNotFound) { + // Remote doesn't exist, create it + _, err = g.repo.CreateRemote(&config.RemoteConfig{ + Name: remoteName, + URLs: []string{url}, + }) + if err != nil { + return fmt.Errorf("failed to create remote: %w", err) + } + fmt.Printf("✓ Created remote %s: %s\n", remoteName, url) + return nil + } else if err != nil { + return fmt.Errorf("failed to get remote: %w", err) + } + + // Update remote URL + err = g.repo.DeleteRemote(remoteName) + if err != nil { + return fmt.Errorf("failed to delete remote: %w", err) + } + + _, err = g.repo.CreateRemote(&config.RemoteConfig{ + Name: remoteName, + URLs: []string{url}, + }) + if err != nil { + return fmt.Errorf("failed to recreate remote: %w", err) + } + + fmt.Printf("✓ Updated remote %s: %s\n", remoteName, url) + return nil +} diff --git a/dev-tools/mage/release/git_test.go b/dev-tools/mage/release/git_test.go new file mode 100644 index 00000000000..b579ee802f3 --- /dev/null +++ b/dev-tools/mage/release/git_test.go @@ -0,0 +1,289 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package release + +import ( + "os" + "path/filepath" + "testing" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/object" +) + +func createTestRepo(t *testing.T) (*GitRepo, string) { + t.Helper() + + tmpDir := t.TempDir() + + // Initialize a git repository + repo, err := git.PlainInit(tmpDir, false) + if err != nil { + t.Fatalf("failed to init repo: %v", err) + } + + // Create an initial commit + w, err := repo.Worktree() + if err != nil { + t.Fatalf("failed to get worktree: %v", err) + } + + // Create a test file + testFile := filepath.Join(tmpDir, "README.md") + err = os.WriteFile(testFile, []byte("# Test Repo"), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + // Add and commit + _, err = w.Add("README.md") + if err != nil { + t.Fatalf("failed to add file: %v", err) + } + + _, err = w.Commit("Initial commit", &git.CommitOptions{ + Author: &object.Signature{ + Name: "Test User", + Email: "test@example.com", + }, + }) + if err != nil { + t.Fatalf("failed to create initial commit: %v", err) + } + + gitRepo := &GitRepo{repo: repo} + return gitRepo, tmpDir +} + +func TestOpenRepo(t *testing.T) { + _, tmpDir := createTestRepo(t) + + // Test opening existing repo + gitRepo, err := OpenRepo(tmpDir) + if err != nil { + t.Errorf("OpenRepo() error = %v", err) + return + } + + if gitRepo == nil || gitRepo.repo == nil { + t.Error("OpenRepo() returned nil repo") + } + + // Test opening non-existent repo + _, err = OpenRepo("/non/existent/path") + if err == nil { + t.Error("OpenRepo() should fail for non-existent path") + } +} + +func TestCreateBranch(t *testing.T) { + gitRepo, _ := createTestRepo(t) + + tests := []struct { + name string + branchName string + wantError bool + }{ + { + name: "create valid branch", + branchName: "feature/test", + wantError: false, + }, + { + name: "create release branch", + branchName: "9.4", + wantError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := gitRepo.CreateBranch(tt.branchName) + if (err != nil) != tt.wantError { + t.Errorf("CreateBranch() error = %v, wantError %v", err, tt.wantError) + return + } + + if !tt.wantError { + // Verify the branch was created and checked out + currentBranch, err := gitRepo.GetCurrentBranch() + if err != nil { + t.Errorf("GetCurrentBranch() error = %v", err) + return + } + + if currentBranch != tt.branchName { + t.Errorf("CreateBranch() created branch %s, want %s", currentBranch, tt.branchName) + } + } + }) + } +} + +func TestCommitAll(t *testing.T) { + gitRepo, tmpDir := createTestRepo(t) + + // Create a new file + testFile := filepath.Join(tmpDir, "test.txt") + err := os.WriteFile(testFile, []byte("test content"), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + // Commit changes + err = gitRepo.CommitAll("Test commit", "Test Author", "test@example.com") + if err != nil { + t.Errorf("CommitAll() error = %v", err) + return + } + + // Verify commit was created + ref, err := gitRepo.repo.Head() + if err != nil { + t.Fatalf("failed to get HEAD: %v", err) + } + + commit, err := gitRepo.repo.CommitObject(ref.Hash()) + if err != nil { + t.Fatalf("failed to get commit: %v", err) + } + + if commit.Message != "Test commit" { + t.Errorf("CommitAll() commit message = %s, want %s", commit.Message, "Test commit") + } + + if commit.Author.Name != "Test Author" { + t.Errorf("CommitAll() author name = %s, want %s", commit.Author.Name, "Test Author") + } +} + +func TestGetCurrentBranch(t *testing.T) { + gitRepo, _ := createTestRepo(t) + + // Default branch should be "master" or "main" + branch, err := gitRepo.GetCurrentBranch() + if err != nil { + t.Errorf("GetCurrentBranch() error = %v", err) + return + } + + if branch != "master" && branch != "main" { + t.Logf("GetCurrentBranch() = %s (expected master or main)", branch) + } + + // Create and checkout a new branch + testBranch := "test-branch" + err = gitRepo.CreateBranch(testBranch) + if err != nil { + t.Fatalf("CreateBranch() error = %v", err) + } + + branch, err = gitRepo.GetCurrentBranch() + if err != nil { + t.Errorf("GetCurrentBranch() error = %v", err) + return + } + + if branch != testBranch { + t.Errorf("GetCurrentBranch() = %s, want %s", branch, testBranch) + } +} + +func TestSetRemoteURL(t *testing.T) { + gitRepo, _ := createTestRepo(t) + + tests := []struct { + name string + remoteName string + url string + wantError bool + }{ + { + name: "create new remote", + remoteName: "origin", + url: "https://github.com/test/repo.git", + wantError: false, + }, + { + name: "update existing remote", + remoteName: "origin", + url: "https://github.com/test/repo2.git", + wantError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := gitRepo.SetRemoteURL(tt.remoteName, tt.url) + if (err != nil) != tt.wantError { + t.Errorf("SetRemoteURL() error = %v, wantError %v", err, tt.wantError) + return + } + + if !tt.wantError { + // Verify remote was created/updated + remote, err := gitRepo.repo.Remote(tt.remoteName) + if err != nil { + t.Errorf("Failed to get remote: %v", err) + return + } + + if len(remote.Config().URLs) == 0 || remote.Config().URLs[0] != tt.url { + t.Errorf("SetRemoteURL() URL = %v, want %s", remote.Config().URLs, tt.url) + } + } + }) + } +} + +func TestCommitAllErrorCases(t *testing.T) { + gitRepo, tmpDir := createTestRepo(t) + + // Test committing with no changes + err := gitRepo.CommitAll("Empty commit", "Test", "test@example.com") + // This might or might not error depending on git version + // Just test that the function doesn't panic + if err == nil { + t.Log("CommitAll() allowed empty commit") + } else { + t.Logf("CommitAll() rejected empty commit: %v", err) + } + + // Create a change and test normal commit + testFile := filepath.Join(tmpDir, "test2.txt") + if err := os.WriteFile(testFile, []byte("test"), 0644); err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + err = gitRepo.CommitAll("Test commit", "Author", "author@test.com") + if err != nil { + t.Errorf("CommitAll() with changes error = %v", err) + } +} + +func TestCreateBranchIdempotent(t *testing.T) { + gitRepo, _ := createTestRepo(t) + + // Create a branch + err := gitRepo.CreateBranch("test-branch") + if err != nil { + t.Fatalf("CreateBranch() initial error = %v", err) + } + + // Creating the same branch again should be idempotent (just checkout) + err = gitRepo.CreateBranch("test-branch") + if err != nil { + t.Logf("CreateBranch() with existing branch error = %v", err) + } + + // Verify we're still on the branch + branch, err := gitRepo.GetCurrentBranch() + if err != nil { + t.Errorf("GetCurrentBranch() error = %v", err) + } + if branch != "test-branch" { + t.Errorf("GetCurrentBranch() = %s, want test-branch", branch) + } +} diff --git a/dev-tools/mage/release/github.go b/dev-tools/mage/release/github.go new file mode 100644 index 00000000000..f680c1b5ad8 --- /dev/null +++ b/dev-tools/mage/release/github.go @@ -0,0 +1,121 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package release + +import ( + "context" + "errors" + "fmt" + "os" + + "github.com/google/go-github/v68/github" +) + +// GitHubClient wraps the GitHub API client +type GitHubClient struct { + client *github.Client + ctx context.Context +} + +// NewGitHubClient creates a new GitHub client with authentication +func NewGitHubClient(token string) *GitHubClient { + ctx := context.Background() + client := github.NewClient(nil).WithAuthToken(token) + + return &GitHubClient{ + client: client, + ctx: ctx, + } +} + +// NewGitHubClientFromEnv creates a GitHub client using GITHUB_TOKEN env var +func NewGitHubClientFromEnv() (*GitHubClient, error) { + token := os.Getenv("GITHUB_TOKEN") + if token == "" { + return nil, fmt.Errorf("GITHUB_TOKEN environment variable not set") + } + return NewGitHubClient(token), nil +} + +// PROptions contains options for creating a pull request +type PROptions struct { + Owner string + Repo string + Title string + Head string // branch name + Base string // target branch (e.g., "main") + Body string + Draft bool + Maintainers bool // allow maintainers to edit +} + +// CreatePR creates a new pull request +func (gh *GitHubClient) CreatePR(opts PROptions) (*github.PullRequest, error) { + newPR := &github.NewPullRequest{ + Title: github.Ptr(opts.Title), + Head: github.Ptr(opts.Head), + Base: github.Ptr(opts.Base), + Body: github.Ptr(opts.Body), + MaintainerCanModify: github.Ptr(opts.Maintainers), + Draft: github.Ptr(opts.Draft), + } + + pr, _, err := gh.client.PullRequests.Create(gh.ctx, opts.Owner, opts.Repo, newPR) + if err != nil { + return nil, fmt.Errorf("failed to create PR: %w", err) + } + + fmt.Printf("✓ Created PR #%d: %s\n", pr.GetNumber(), pr.GetHTMLURL()) + return pr, nil +} + +// AddLabels adds labels to a pull request +func (gh *GitHubClient) AddLabels(owner, repo string, prNumber int, labels []string) error { + _, _, err := gh.client.Issues.AddLabelsToIssue(gh.ctx, owner, repo, prNumber, labels) + if err != nil { + return fmt.Errorf("failed to add labels: %w", err) + } + + fmt.Printf("✓ Added labels to PR #%d: %v\n", prNumber, labels) + return nil +} + +// RequestReviewers requests reviews from users +func (gh *GitHubClient) RequestReviewers(owner, repo string, prNumber int, reviewers []string) error { + reviewReq := github.ReviewersRequest{ + Reviewers: reviewers, + } + + _, _, err := gh.client.PullRequests.RequestReviewers(gh.ctx, owner, repo, prNumber, reviewReq) + if err != nil { + return fmt.Errorf("failed to request reviewers: %w", err) + } + + fmt.Printf("✓ Requested reviews from: %v\n", reviewers) + return nil +} + +// GetDefaultBranch gets the default branch for a repository +func (gh *GitHubClient) GetDefaultBranch(owner, repo string) (string, error) { + repository, _, err := gh.client.Repositories.Get(gh.ctx, owner, repo) + if err != nil { + return "", fmt.Errorf("failed to get repository: %w", err) + } + + return repository.GetDefaultBranch(), nil +} + +// BranchExists checks if a branch exists in the repository +func (gh *GitHubClient) BranchExists(owner, repo, branch string) (bool, error) { + _, _, err := gh.client.Repositories.GetBranch(gh.ctx, owner, repo, branch, 0) + if err != nil { + var ghErr *github.ErrorResponse + if errors.As(err, &ghErr) && ghErr.Response.StatusCode == 404 { + return false, nil + } + return false, fmt.Errorf("failed to check branch: %w", err) + } + return true, nil +} diff --git a/dev-tools/mage/release/release.go b/dev-tools/mage/release/release.go new file mode 100644 index 00000000000..c2b2a60e051 --- /dev/null +++ b/dev-tools/mage/release/release.go @@ -0,0 +1,464 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package release + +import ( + "fmt" + "os" + "regexp" + "strings" + + "gopkg.in/yaml.v3" +) + +// UpdateVersion updates the version in version/version.go +func UpdateVersion(newVersion string) error { + versionFile := "version/version.go" + + content, err := os.ReadFile(versionFile) + if err != nil { + return fmt.Errorf("failed to read %s: %w", versionFile, err) + } + + // Replace the version string + // Pattern: const defaultBeatVersion = "X.Y.Z" + re := regexp.MustCompile(`(const\s+defaultBeatVersion\s*=\s*)"[^"]+"`) + newContent := re.ReplaceAllString(string(content), `${1}"`+newVersion+`"`) + + if newContent == string(content) { + return fmt.Errorf("version pattern not found in %s", versionFile) + } + + err = os.WriteFile(versionFile, []byte(newContent), 0644) + if err != nil { + return fmt.Errorf("failed to write %s: %w", versionFile, err) + } + + fmt.Printf("✓ Updated version to %s in %s\n", newVersion, versionFile) + return nil +} + +// UpdateDocs updates version references in documentation and K8s manifests +func UpdateDocs(newVersion string) error { + // Update K8s manifests + k8sFiles := []string{ + "deploy/kubernetes/elastic-agent-managed-kubernetes.yaml", + "deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml", + } + + for _, file := range k8sFiles { + if err := updateVersionInFile(file, newVersion); err != nil { + return err + } + } + + return nil +} + +// updateVersionInFile updates version references in a file +func updateVersionInFile(filePath, newVersion string) error { + content, err := os.ReadFile(filePath) + if err != nil { + return fmt.Errorf("failed to read %s: %w", filePath, err) + } + + // Pattern: docker.elastic.co/elastic-agent/elastic-agent:X.Y.Z + re := regexp.MustCompile(`(docker\.elastic\.co/elastic-agent/elastic-agent:)[0-9]+\.[0-9]+\.[0-9]+`) + newContent := re.ReplaceAllString(string(content), `${1}`+newVersion) + + if newContent == string(content) { + // No changes needed + fmt.Printf(" No version changes needed in %s\n", filePath) + return nil + } + + err = os.WriteFile(filePath, []byte(newContent), 0644) + if err != nil { + return fmt.Errorf("failed to write %s: %w", filePath, err) + } + + fmt.Printf("✓ Updated version to %s in %s\n", newVersion, filePath) + return nil +} + +// UpdateMergify adds a new backport rule to .mergify.yml +func UpdateMergify(version string) error { + mergifyFile := ".mergify.yml" + + // Read the YAML file + content, err := os.ReadFile(mergifyFile) + if err != nil { + return fmt.Errorf("failed to read %s: %w", mergifyFile, err) + } + + var config map[string]interface{} + if err := yaml.Unmarshal(content, &config); err != nil { + return fmt.Errorf("failed to parse %s: %w", mergifyFile, err) + } + + // Extract major.minor from version (e.g., "9.4.0" -> "9.4") + parts := strings.Split(version, ".") + if len(parts) < 2 { + return fmt.Errorf("invalid version format: %s (expected X.Y.Z)", version) + } + branchVersion := fmt.Sprintf("%s.%s", parts[0], parts[1]) + + // Get pull_request_rules array + rules, ok := config["pull_request_rules"].([]interface{}) + if !ok { + return fmt.Errorf("pull_request_rules not found or invalid format") + } + + // Check if rule already exists + label := fmt.Sprintf("backport-%s", branchVersion) + for _, rule := range rules { + ruleMap, ok := rule.(map[string]interface{}) + if !ok { + continue + } + name, ok := ruleMap["name"].(string) + if ok && strings.Contains(name, branchVersion) { + fmt.Printf(" Backport rule for %s already exists\n", branchVersion) + return nil + } + } + + // Create new backport rule + newRule := map[string]interface{}{ + "name": fmt.Sprintf("backport patches to %s branch", branchVersion), + "conditions": []interface{}{ + "merged", + fmt.Sprintf("label=%s", label), + }, + "actions": map[string]interface{}{ + "backport": map[string]interface{}{ + "branches": []interface{}{branchVersion}, + }, + }, + } + + // Add the new rule to the end of pull_request_rules + rules = append(rules, newRule) + config["pull_request_rules"] = rules + + // Marshal back to YAML + output, err := yaml.Marshal(config) + if err != nil { + return fmt.Errorf("failed to marshal YAML: %w", err) + } + + // Write back to file + err = os.WriteFile(mergifyFile, output, 0644) + if err != nil { + return fmt.Errorf("failed to write %s: %w", mergifyFile, err) + } + + fmt.Printf("✓ Added backport rule for %s to %s\n", branchVersion, mergifyFile) + return nil +} + +// ReleaseConfig holds configuration for release operations +type ReleaseConfig struct { + Version string + BaseBranch string + ReleaseBranch string + Owner string + Repo string + AuthorName string + AuthorEmail string +} + +// LoadReleaseConfigFromEnv loads release configuration from environment variables +func LoadReleaseConfigFromEnv() (*ReleaseConfig, error) { + version := os.Getenv("CURRENT_RELEASE") + if version == "" { + return nil, fmt.Errorf("CURRENT_RELEASE environment variable not set") + } + + baseBranch := os.Getenv("BASE_BRANCH") + if baseBranch == "" { + baseBranch = "main" + } + + // Extract major.minor for release branch (e.g., "9.4.0" -> "9.4") + parts := strings.Split(version, ".") + if len(parts) < 2 { + return nil, fmt.Errorf("invalid version format: %s", version) + } + releaseBranch := fmt.Sprintf("%s.%s", parts[0], parts[1]) + + owner := os.Getenv("PROJECT_OWNER") + if owner == "" { + owner = "elastic" + } + + repo := os.Getenv("PROJECT_REPO") + if repo == "" { + repo = "elastic-agent" + } + + authorName := os.Getenv("GIT_AUTHOR_NAME") + if authorName == "" { + authorName = "elastic-machine" + } + + authorEmail := os.Getenv("GIT_AUTHOR_EMAIL") + if authorEmail == "" { + authorEmail = "infra-root+elasticmachine@elastic.co" + } + + return &ReleaseConfig{ + Version: version, + BaseBranch: baseBranch, + ReleaseBranch: releaseBranch, + Owner: owner, + Repo: repo, + AuthorName: authorName, + AuthorEmail: authorEmail, + }, nil +} + +// PrepareMajorMinorRelease prepares files for a major/minor release +func PrepareMajorMinorRelease(cfg *ReleaseConfig) error { + fmt.Printf("=== Preparing Major/Minor Release %s ===\n", cfg.Version) + + // Update version files + if err := UpdateVersion(cfg.Version); err != nil { + return err + } + + // Update documentation + if err := UpdateDocs(cfg.Version); err != nil { + return err + } + + // Update mergify config + if err := UpdateMergify(cfg.Version); err != nil { + return err + } + + fmt.Println("✓ All files updated for major/minor release") + return nil +} + +// CreateReleaseBranch creates a release branch and commits changes +func CreateReleaseBranch(cfg *ReleaseConfig, repoPath string) error { + fmt.Printf("=== Creating Release Branch %s ===\n", cfg.ReleaseBranch) + + // Open the repository + gitRepo, err := OpenRepo(repoPath) + if err != nil { + return err + } + + // Create the release branch + if err := gitRepo.CreateBranch(cfg.ReleaseBranch); err != nil { + return err + } + + // Commit all changes + commitMsg := fmt.Sprintf("[Release] Prepare release %s", cfg.Version) + if err := gitRepo.CommitAll(commitMsg, cfg.AuthorName, cfg.AuthorEmail); err != nil { + return err + } + + fmt.Printf("✓ Created release branch %s with changes\n", cfg.ReleaseBranch) + return nil +} + +// CreateReleasePR creates a pull request for the release +func CreateReleasePR(cfg *ReleaseConfig, ghClient *GitHubClient) error { + fmt.Printf("=== Creating Release PR ===\n") + + prBody := fmt.Sprintf(`## Release %s + +### Changes +- Updated version to %s +- Updated documentation and K8s manifests +- Added backport rule to .mergify.yml + +### Checklist +- [ ] Verify version is correct in version/version.go +- [ ] Check K8s manifests have correct image tags +- [ ] Confirm mergify config is updated +- [ ] Run integration tests + +--- +🤖 This PR was created by the release automation system. +`, cfg.Version, cfg.Version) + + prOpts := PROptions{ + Owner: cfg.Owner, + Repo: cfg.Repo, + Title: fmt.Sprintf("[Release %s] Prepare release branch", cfg.Version), + Head: cfg.ReleaseBranch, + Base: cfg.BaseBranch, + Body: prBody, + Draft: false, + Maintainers: true, + } + + pr, err := ghClient.CreatePR(prOpts) + if err != nil { + return err + } + + fmt.Printf("✓ Created PR: %s\n", pr.GetHTMLURL()) + return nil +} + +// RunMajorMinorRelease orchestrates the complete major/minor release workflow +func RunMajorMinorRelease(cfg *ReleaseConfig, dryRun bool) error { + if dryRun { + fmt.Println("🔍 DRY RUN MODE - No changes will be pushed or branches created remotely") + fmt.Println() + } + + fmt.Printf("=== Starting Major/Minor Release Workflow for %s ===\n", cfg.Version) + fmt.Println() + + // Step 1: Prepare release files + fmt.Println("Step 1: Preparing release files...") + if err := PrepareMajorMinorRelease(cfg); err != nil { + return err + } + fmt.Println() + + // Step 2: Create release branch and commit + if !dryRun { + fmt.Println("Step 2: Creating release branch and committing changes...") + if err := CreateReleaseBranch(cfg, "."); err != nil { + return err + } + fmt.Println() + + // Step 3: Push branch + fmt.Println("Step 3: Pushing release branch to remote...") + gitRepo, err := OpenRepo(".") + if err != nil { + return err + } + if err := gitRepo.Push("origin"); err != nil { + return err + } + fmt.Println() + + // Step 4: Create PR + fmt.Println("Step 4: Creating pull request...") + ghClient, err := NewGitHubClientFromEnv() + if err != nil { + return err + } + if err := CreateReleasePR(cfg, ghClient); err != nil { + return err + } + fmt.Println() + } else { + fmt.Println("Step 2: [DRY RUN] Would create release branch and commit") + fmt.Printf(" Branch: %s\n", cfg.ReleaseBranch) + fmt.Printf(" Commit: [Release] Prepare release %s\n", cfg.Version) + fmt.Println() + + fmt.Println("Step 3: [DRY RUN] Would push branch to remote") + fmt.Printf(" git push origin %s\n", cfg.ReleaseBranch) + fmt.Println() + + fmt.Println("Step 4: [DRY RUN] Would create pull request") + fmt.Printf(" Title: [Release %s] Prepare release branch\n", cfg.Version) + fmt.Printf(" Head: %s\n", cfg.ReleaseBranch) + fmt.Printf(" Base: %s\n", cfg.BaseBranch) + fmt.Println() + } + + fmt.Println("=== Major/Minor Release Workflow Complete ===") + if dryRun { + fmt.Println("\n⚠️ This was a DRY RUN. Review the changes with 'git diff' and run again without DRY_RUN=true") + } else { + fmt.Println("\n✓ Release PR created successfully. Review and merge when ready.") + } + + return nil +} + +// RunPatchRelease orchestrates the complete patch release workflow +func RunPatchRelease(cfg *ReleaseConfig, dryRun bool) error { + if dryRun { + fmt.Println("🔍 DRY RUN MODE - No changes will be pushed") + fmt.Println() + } + + fmt.Printf("=== Starting Patch Release Workflow for %s ===\n", cfg.Version) + fmt.Println() + + // Step 1: Verify we're on the release branch + fmt.Println("Step 1: Verifying current branch...") + gitRepo, err := OpenRepo(".") + if !dryRun { + if err != nil { + return err + } + currentBranch, err := gitRepo.GetCurrentBranch() + if err != nil { + return err + } + if currentBranch != cfg.ReleaseBranch { + return fmt.Errorf("not on release branch %s (currently on %s). Run: git checkout %s", + cfg.ReleaseBranch, currentBranch, cfg.ReleaseBranch) + } + fmt.Printf("✓ On release branch: %s\n", currentBranch) + fmt.Println() + } else { + fmt.Println("✓ [DRY RUN] Would verify current branch") + fmt.Println() + } + + // Step 2: Update version files + fmt.Println("Step 2: Updating version files...") + if err := UpdateVersion(cfg.Version); err != nil { + return err + } + if err := UpdateDocs(cfg.Version); err != nil { + return err + } + fmt.Println() + + // Step 3: Commit changes + if !dryRun { + fmt.Println("Step 3: Committing changes...") + commitMsg := fmt.Sprintf("[Release] Prepare patch release %s", cfg.Version) + if err := gitRepo.CommitAll(commitMsg, cfg.AuthorName, cfg.AuthorEmail); err != nil { + return err + } + fmt.Println() + + // Step 4: Push changes + fmt.Println("Step 4: Pushing changes to remote...") + if err := gitRepo.Push("origin"); err != nil { + return err + } + fmt.Println() + } else { + fmt.Println("Step 3: [DRY RUN] Would commit changes") + fmt.Printf(" Commit: [Release] Prepare patch release %s\n", cfg.Version) + fmt.Println() + + fmt.Println("Step 4: [DRY RUN] Would push changes to remote") + fmt.Printf(" git push origin %s\n", cfg.ReleaseBranch) + fmt.Println() + } + + fmt.Println("=== Patch Release Workflow Complete ===") + if dryRun { + fmt.Println("\n⚠️ This was a DRY RUN. Review the changes with 'git diff' and run again without DRY_RUN=true") + } else { + fmt.Println("\n✓ Patch release changes pushed successfully.") + fmt.Println("Next steps:") + fmt.Printf(" 1. Verify changes in branch %s\n", cfg.ReleaseBranch) + fmt.Println(" 2. Wait for CI to pass") + fmt.Println(" 3. Tag and release when ready") + } + + return nil +} diff --git a/dev-tools/mage/release/release_test.go b/dev-tools/mage/release/release_test.go new file mode 100644 index 00000000000..51def4159ae --- /dev/null +++ b/dev-tools/mage/release/release_test.go @@ -0,0 +1,660 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package release + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/object" + "gopkg.in/yaml.v3" +) + +func TestUpdateVersion(t *testing.T) { + // Create a temporary directory for test files + tmpDir := t.TempDir() + versionDir := filepath.Join(tmpDir, "version") + err := os.Mkdir(versionDir, 0755) + if err != nil { + t.Fatalf("failed to create version dir: %v", err) + } + + versionFile := filepath.Join(versionDir, "version.go") + initialContent := `// Copyright notice + +package version + +const defaultBeatVersion = "9.4.0" +const Agent = defaultBeatVersion +` + err = os.WriteFile(versionFile, []byte(initialContent), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + // Change to temp directory + originalWd, _ := os.Getwd() + defer func() { + if err := os.Chdir(originalWd); err != nil { + t.Logf("failed to restore working directory: %v", err) + } + }() + if err := os.Chdir(tmpDir); err != nil { + t.Fatalf("failed to change to temp directory: %v", err) + } + + tests := []struct { + name string + newVersion string + wantVersion string + wantError bool + }{ + { + name: "update to new version", + newVersion: "9.5.0", + wantVersion: `"9.5.0"`, + wantError: false, + }, + { + name: "update to major version", + newVersion: "10.0.0", + wantVersion: `"10.0.0"`, + wantError: false, + }, + { + name: "update to patch version", + newVersion: "9.4.1", + wantVersion: `"9.4.1"`, + wantError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := UpdateVersion(tt.newVersion) + if (err != nil) != tt.wantError { + t.Errorf("UpdateVersion() error = %v, wantError %v", err, tt.wantError) + return + } + + if !tt.wantError { + content, err := os.ReadFile(versionFile) + if err != nil { + t.Fatalf("failed to read version file: %v", err) + } + + if !strings.Contains(string(content), tt.wantVersion) { + t.Errorf("UpdateVersion() content = %v, want to contain %v", string(content), tt.wantVersion) + } + } + }) + } +} + +func TestUpdateDocs(t *testing.T) { + // Create a temporary directory for test files + tmpDir := t.TempDir() + + // Create deploy/kubernetes directory + k8sDir := filepath.Join(tmpDir, "deploy", "kubernetes") + err := os.MkdirAll(k8sDir, 0755) + if err != nil { + t.Fatalf("failed to create k8s dir: %v", err) + } + + // Create test K8s manifests + managedManifest := filepath.Join(k8sDir, "elastic-agent-managed-kubernetes.yaml") + standaloneManifest := filepath.Join(k8sDir, "elastic-agent-standalone-kubernetes.yaml") + + manifestContent := `apiVersion: apps/v1 +kind: DaemonSet +spec: + template: + spec: + containers: + - name: elastic-agent + image: docker.elastic.co/elastic-agent/elastic-agent:9.4.0 +` + + err = os.WriteFile(managedManifest, []byte(manifestContent), 0644) + if err != nil { + t.Fatalf("failed to write managed manifest: %v", err) + } + + err = os.WriteFile(standaloneManifest, []byte(manifestContent), 0644) + if err != nil { + t.Fatalf("failed to write standalone manifest: %v", err) + } + + // Change to temp directory + originalWd, _ := os.Getwd() + defer func() { + if err := os.Chdir(originalWd); err != nil { + t.Logf("failed to restore working directory: %v", err) + } + }() + if err := os.Chdir(tmpDir); err != nil { + t.Fatalf("failed to change to temp directory: %v", err) + } + + // Test UpdateDocs + newVersion := "9.5.0" + err = UpdateDocs(newVersion) + if err != nil { + t.Errorf("UpdateDocs() error = %v", err) + return + } + + // Verify both manifests were updated + for _, manifest := range []string{managedManifest, standaloneManifest} { + content, err := os.ReadFile(manifest) + if err != nil { + t.Fatalf("failed to read manifest: %v", err) + } + + expectedImage := "docker.elastic.co/elastic-agent/elastic-agent:" + newVersion + if !strings.Contains(string(content), expectedImage) { + t.Errorf("UpdateDocs() manifest %s does not contain %s", manifest, expectedImage) + } + } +} + +func TestUpdateVersionInFile(t *testing.T) { + tmpDir := t.TempDir() + + tests := []struct { + name string + content string + newVersion string + wantContent string + }{ + { + name: "update K8s manifest image tag", + content: `apiVersion: apps/v1 +kind: DaemonSet +spec: + template: + spec: + containers: + - name: elastic-agent + image: docker.elastic.co/elastic-agent/elastic-agent:9.4.0 +`, + newVersion: "9.5.0", + wantContent: "docker.elastic.co/elastic-agent/elastic-agent:9.5.0", + }, + { + name: "no change when pattern not found", + content: "some other content", + newVersion: "9.5.0", + wantContent: "some other content", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testFile := filepath.Join(tmpDir, "test.yaml") + err := os.WriteFile(testFile, []byte(tt.content), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + err = updateVersionInFile(testFile, tt.newVersion) + if err != nil { + t.Errorf("updateVersionInFile() error = %v", err) + return + } + + content, err := os.ReadFile(testFile) + if err != nil { + t.Fatalf("failed to read test file: %v", err) + } + + if !strings.Contains(string(content), tt.wantContent) { + t.Errorf("updateVersionInFile() content = %v, want to contain %v", string(content), tt.wantContent) + } + }) + } +} + +func TestUpdateMergify(t *testing.T) { + tmpDir := t.TempDir() + + // Change to temp directory + originalWd, _ := os.Getwd() + defer func() { + if err := os.Chdir(originalWd); err != nil { + t.Logf("failed to restore working directory: %v", err) + } + }() + if err := os.Chdir(tmpDir); err != nil { + t.Fatalf("failed to change to temp directory: %v", err) + } + + // Create a basic .mergify.yml file + mergifyContent := `pull_request_rules: + - name: backport patches to 9.3 branch + conditions: + - merged + - label=backport-9.3 + actions: + backport: + branches: + - "9.3" +` + err := os.WriteFile(".mergify.yml", []byte(mergifyContent), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + tests := []struct { + name string + version string + wantBranch string + wantLabel string + }{ + { + name: "add backport rule for 9.4", + version: "9.4.0", + wantBranch: "9.4", + wantLabel: "backport-9.4", + }, + { + name: "add backport rule for 9.5", + version: "9.5.0", + wantBranch: "9.5", + wantLabel: "backport-9.5", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := UpdateMergify(tt.version) + if err != nil { + t.Errorf("UpdateMergify() error = %v", err) + return + } + + // Read and parse the updated file + content, err := os.ReadFile(".mergify.yml") + if err != nil { + t.Fatalf("failed to read .mergify.yml: %v", err) + } + + var config map[string]interface{} + err = yaml.Unmarshal(content, &config) + if err != nil { + t.Fatalf("failed to parse .mergify.yml: %v", err) + } + + rules, ok := config["pull_request_rules"].([]interface{}) + if !ok { + t.Fatal("pull_request_rules not found") + } + + // Check if the new rule was added + found := false + for _, rule := range rules { + ruleMap, ok := rule.(map[string]interface{}) + if !ok { + continue + } + + conditions, ok := ruleMap["conditions"].([]interface{}) + if !ok { + continue + } + + for _, cond := range conditions { + if condStr, ok := cond.(string); ok && condStr == "label="+tt.wantLabel { + found = true + break + } + } + } + + if !found { + t.Errorf("UpdateMergify() did not add label %s", tt.wantLabel) + } + }) + } +} + +func TestUpdateMergifyIdempotent(t *testing.T) { + tmpDir := t.TempDir() + + // Change to temp directory + originalWd, _ := os.Getwd() + defer func() { + if err := os.Chdir(originalWd); err != nil { + t.Logf("failed to restore working directory: %v", err) + } + }() + if err := os.Chdir(tmpDir); err != nil { + t.Fatalf("failed to change to temp directory: %v", err) + } + + // Create a basic .mergify.yml file + mergifyContent := `pull_request_rules: + - name: backport patches to 9.4 branch + conditions: + - merged + - label=backport-9.4 + actions: + backport: + branches: + - "9.4" +` + err := os.WriteFile(".mergify.yml", []byte(mergifyContent), 0644) + if err != nil { + t.Fatalf("failed to write test file: %v", err) + } + + // First update + err = UpdateMergify("9.4.0") + if err != nil { + t.Errorf("UpdateMergify() first call error = %v", err) + } + + // Read the file after first update + content1, err := os.ReadFile(".mergify.yml") + if err != nil { + t.Fatalf("failed to read .mergify.yml: %v", err) + } + + // Second update with same version + err = UpdateMergify("9.4.0") + if err != nil { + t.Errorf("UpdateMergify() second call error = %v", err) + } + + // Read the file after second update + content2, err := os.ReadFile(".mergify.yml") + if err != nil { + t.Fatalf("failed to read .mergify.yml: %v", err) + } + + // The content should be the same (idempotent) + if string(content1) != string(content2) { + t.Error("UpdateMergify() is not idempotent - file changed on second call") + } +} + +func TestLoadReleaseConfigFromEnv(t *testing.T) { + // Save original env vars + originalVars := map[string]string{ + "CURRENT_RELEASE": os.Getenv("CURRENT_RELEASE"), + "BASE_BRANCH": os.Getenv("BASE_BRANCH"), + "PROJECT_OWNER": os.Getenv("PROJECT_OWNER"), + "PROJECT_REPO": os.Getenv("PROJECT_REPO"), + } + defer func() { + for key, val := range originalVars { + if val == "" { + os.Unsetenv(key) + } else { + os.Setenv(key, val) + } + } + }() + + tests := []struct { + name string + envVars map[string]string + wantError bool + validate func(t *testing.T, cfg *ReleaseConfig) + }{ + { + name: "valid config with all env vars", + envVars: map[string]string{ + "CURRENT_RELEASE": "9.5.0", + "BASE_BRANCH": "main", + "PROJECT_OWNER": "elastic", + "PROJECT_REPO": "elastic-agent", + }, + wantError: false, + validate: func(t *testing.T, cfg *ReleaseConfig) { + if cfg.Version != "9.5.0" { + t.Errorf("Version = %s, want 9.5.0", cfg.Version) + } + if cfg.ReleaseBranch != "9.5" { + t.Errorf("ReleaseBranch = %s, want 9.5", cfg.ReleaseBranch) + } + if cfg.BaseBranch != "main" { + t.Errorf("BaseBranch = %s, want main", cfg.BaseBranch) + } + }, + }, + { + name: "missing version", + envVars: map[string]string{ + "BASE_BRANCH": "main", + }, + wantError: true, + }, + { + name: "invalid version format", + envVars: map[string]string{ + "CURRENT_RELEASE": "invalid", + }, + wantError: true, + }, + { + name: "defaults applied", + envVars: map[string]string{ + "CURRENT_RELEASE": "9.5.0", + }, + wantError: false, + validate: func(t *testing.T, cfg *ReleaseConfig) { + if cfg.BaseBranch != "main" { + t.Errorf("BaseBranch = %s, want default 'main'", cfg.BaseBranch) + } + if cfg.Owner != "elastic" { + t.Errorf("Owner = %s, want default 'elastic'", cfg.Owner) + } + if cfg.Repo != "elastic-agent" { + t.Errorf("Repo = %s, want default 'elastic-agent'", cfg.Repo) + } + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Clear env vars + os.Unsetenv("CURRENT_RELEASE") + os.Unsetenv("BASE_BRANCH") + os.Unsetenv("PROJECT_OWNER") + os.Unsetenv("PROJECT_REPO") + + // Set test env vars + for key, val := range tt.envVars { + os.Setenv(key, val) + } + + cfg, err := LoadReleaseConfigFromEnv() + if (err != nil) != tt.wantError { + t.Errorf("LoadReleaseConfigFromEnv() error = %v, wantError %v", err, tt.wantError) + return + } + + if !tt.wantError && tt.validate != nil { + tt.validate(t, cfg) + } + }) + } +} + +func TestPrepareMajorMinorRelease(t *testing.T) { + tmpDir := t.TempDir() + + // Change to temp directory + originalWd, _ := os.Getwd() + defer func() { + if err := os.Chdir(originalWd); err != nil { + t.Logf("failed to restore working directory: %v", err) + } + }() + if err := os.Chdir(tmpDir); err != nil { + t.Fatalf("failed to change to temp directory: %v", err) + } + + // Create required directory structure + versionDir := filepath.Join(tmpDir, "version") + k8sDir := filepath.Join(tmpDir, "deploy", "kubernetes") + err := os.MkdirAll(versionDir, 0755) + if err != nil { + t.Fatalf("failed to create version dir: %v", err) + } + err = os.MkdirAll(k8sDir, 0755) + if err != nil { + t.Fatalf("failed to create k8s dir: %v", err) + } + + // Create test files + versionFile := filepath.Join(versionDir, "version.go") + err = os.WriteFile(versionFile, []byte(`package version + +const defaultBeatVersion = "9.4.0" +const Agent = defaultBeatVersion +`), 0644) + if err != nil { + t.Fatalf("failed to write version file: %v", err) + } + + managedManifest := filepath.Join(k8sDir, "elastic-agent-managed-kubernetes.yaml") + standaloneManifest := filepath.Join(k8sDir, "elastic-agent-standalone-kubernetes.yaml") + manifestContent := `image: docker.elastic.co/elastic-agent/elastic-agent:9.4.0` + + err = os.WriteFile(managedManifest, []byte(manifestContent), 0644) + if err != nil { + t.Fatalf("failed to write managed manifest: %v", err) + } + err = os.WriteFile(standaloneManifest, []byte(manifestContent), 0644) + if err != nil { + t.Fatalf("failed to write standalone manifest: %v", err) + } + + // Create .mergify.yml + mergifyContent := `pull_request_rules: []` + err = os.WriteFile(".mergify.yml", []byte(mergifyContent), 0644) + if err != nil { + t.Fatalf("failed to write mergify file: %v", err) + } + + // Test PrepareMajorMinorRelease + cfg := &ReleaseConfig{ + Version: "9.5.0", + BaseBranch: "main", + ReleaseBranch: "9.5", + Owner: "elastic", + Repo: "elastic-agent", + AuthorName: "Test User", + AuthorEmail: "test@example.com", + } + + err = PrepareMajorMinorRelease(cfg) + if err != nil { + t.Errorf("PrepareMajorMinorRelease() error = %v", err) + return + } + + // Verify version was updated + versionContent, err := os.ReadFile(versionFile) + if err != nil { + t.Fatalf("failed to read version file: %v", err) + } + if !strings.Contains(string(versionContent), "9.5.0") { + t.Error("Version file was not updated") + } + + // Verify manifests were updated + managedContent, err := os.ReadFile(managedManifest) + if err != nil { + t.Fatalf("failed to read managed manifest: %v", err) + } + if !strings.Contains(string(managedContent), "9.5.0") { + t.Error("Managed manifest was not updated") + } +} + +func TestCreateReleaseBranch(t *testing.T) { + tmpDir := t.TempDir() + + // Initialize a git repository + gitRepo, err := git.PlainInit(tmpDir, false) + if err != nil { + t.Fatalf("failed to init repo: %v", err) + } + + // Create an initial commit + w, err := gitRepo.Worktree() + if err != nil { + t.Fatalf("failed to get worktree: %v", err) + } + + testFile := filepath.Join(tmpDir, "README.md") + err = os.WriteFile(testFile, []byte("# Test"), 0644) + if err != nil { + t.Fatalf("failed to write file: %v", err) + } + + _, err = w.Add("README.md") + if err != nil { + t.Fatalf("failed to add file: %v", err) + } + + _, err = w.Commit("Initial commit", &git.CommitOptions{ + Author: &object.Signature{ + Name: "Test", + Email: "test@example.com", + }, + }) + if err != nil { + t.Fatalf("failed to commit: %v", err) + } + + // Test CreateReleaseBranch + cfg := &ReleaseConfig{ + Version: "9.5.0", + BaseBranch: "main", + ReleaseBranch: "9.5", + Owner: "elastic", + Repo: "elastic-agent", + AuthorName: "Test User", + AuthorEmail: "test@example.com", + } + + // Create another file to commit + changeFile := filepath.Join(tmpDir, "change.txt") + err = os.WriteFile(changeFile, []byte("changes"), 0644) + if err != nil { + t.Fatalf("failed to write change file: %v", err) + } + + err = CreateReleaseBranch(cfg, tmpDir) + if err != nil { + t.Errorf("CreateReleaseBranch() error = %v", err) + return + } + + // Verify the branch was created + repo, err := OpenRepo(tmpDir) + if err != nil { + t.Fatalf("failed to open repo: %v", err) + } + + currentBranch, err := repo.GetCurrentBranch() + if err != nil { + t.Errorf("GetCurrentBranch() error = %v", err) + return + } + + if currentBranch != cfg.ReleaseBranch { + t.Errorf("CreateReleaseBranch() branch = %s, want %s", currentBranch, cfg.ReleaseBranch) + } +} diff --git a/go.mod b/go.mod index f55f258cba4..c732b8459ae 100644 --- a/go.mod +++ b/go.mod @@ -30,11 +30,13 @@ require ( github.com/elastic/mock-es v0.0.0-20250530054253-8c3b6053f9b6 github.com/fatih/color v1.18.0 github.com/fsnotify/fsnotify v1.9.0 + github.com/go-git/go-git/v5 v5.12.0 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/gofrs/flock v0.13.0 github.com/gofrs/uuid/v5 v5.4.0 github.com/google/go-cmp v0.7.0 github.com/google/go-containerregistry v0.20.3 + github.com/google/go-github/v68 v68.0.0 github.com/google/pprof v0.0.0-20250923004556-9e5a51aed1e8 github.com/gorilla/mux v1.8.1 github.com/jaypipes/ghw v0.12.0 @@ -44,7 +46,7 @@ require ( github.com/knadh/koanf/maps v0.1.2 github.com/magefile/mage v1.15.0 github.com/oklog/ulid/v2 v2.1.1 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.147.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.148.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.147.0 github.com/otiai10/copy v1.14.0 github.com/rednafi/link-patrol v0.0.0-20240826150821-057643e74d4d @@ -60,26 +62,26 @@ require ( go.elastic.co/apm/v2 v2.7.2 go.elastic.co/ecszap v1.0.3 go.elastic.co/go-licence-detector v0.7.0 - go.opentelemetry.io/collector/component/componentstatus v0.147.0 - go.opentelemetry.io/collector/component/componenttest v0.147.0 - go.opentelemetry.io/collector/confmap/xconfmap v0.147.0 - go.opentelemetry.io/collector/exporter/exportertest v0.147.0 - go.opentelemetry.io/collector/extension/extensiontest v0.147.0 - go.opentelemetry.io/collector/pdata v1.53.0 - go.opentelemetry.io/collector/pipeline v1.53.0 - go.opentelemetry.io/otel/sdk/metric v1.40.0 + go.opentelemetry.io/collector/component/componentstatus v0.148.0 + go.opentelemetry.io/collector/component/componenttest v0.148.0 + go.opentelemetry.io/collector/confmap/xconfmap v0.148.0 + go.opentelemetry.io/collector/exporter/exportertest v0.148.0 + go.opentelemetry.io/collector/extension/extensiontest v0.148.0 + go.opentelemetry.io/collector/pdata v1.54.0 + go.opentelemetry.io/collector/pipeline v1.54.0 + go.opentelemetry.io/otel/sdk/metric v1.42.0 go.uber.org/zap v1.27.1 go.yaml.in/yaml/v3 v3.0.4 golang.org/x/crypto v0.48.0 - golang.org/x/exp v0.0.0-20260112195511-716be5621a96 - golang.org/x/mod v0.32.0 + golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa + golang.org/x/mod v0.33.0 golang.org/x/net v0.51.0 - golang.org/x/sync v0.19.0 - golang.org/x/sys v0.41.0 + golang.org/x/sync v0.20.0 + golang.org/x/sys v0.42.0 golang.org/x/term v0.40.0 golang.org/x/text v0.34.0 golang.org/x/time v0.14.0 - golang.org/x/tools v0.41.0 + golang.org/x/tools v0.42.0 google.golang.org/api v0.257.0 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 @@ -101,15 +103,15 @@ require ( require ( github.com/distribution/reference v0.6.0 // indirect - go.opentelemetry.io/collector/component v1.53.0 - go.opentelemetry.io/collector/confmap v1.53.0 - go.opentelemetry.io/collector/connector v0.147.0 // indirect - go.opentelemetry.io/collector/exporter v1.53.0 - go.opentelemetry.io/collector/extension v1.53.0 - go.opentelemetry.io/collector/featuregate v1.53.0 // indirect - go.opentelemetry.io/collector/otelcol v0.147.0 - go.opentelemetry.io/collector/processor v1.53.0 // indirect - go.opentelemetry.io/collector/receiver v1.53.0 // indirect + go.opentelemetry.io/collector/component v1.54.0 + go.opentelemetry.io/collector/confmap v1.54.0 + go.opentelemetry.io/collector/connector v0.148.0 // indirect + go.opentelemetry.io/collector/exporter v1.54.0 + go.opentelemetry.io/collector/extension v1.54.0 + go.opentelemetry.io/collector/featuregate v1.54.0 // indirect + go.opentelemetry.io/collector/otelcol v0.148.0 + go.opentelemetry.io/collector/processor v1.54.0 // indirect + go.opentelemetry.io/collector/receiver v1.54.0 // indirect ) require ( @@ -125,6 +127,7 @@ require ( github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/akavel/rsrc v0.10.2 // indirect github.com/apache/thrift v0.22.0 // indirect @@ -135,6 +138,7 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cilium/ebpf v0.20.0 // indirect + github.com/cloudflare/circl v1.3.7 // indirect github.com/containerd/containerd v1.7.29 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect @@ -150,7 +154,7 @@ require ( github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/ebitengine/purego v0.9.1 // indirect + github.com/ebitengine/purego v0.10.0 // indirect github.com/elastic/go-docappender/v2 v2.13.0 // indirect github.com/elastic/go-freelru v0.16.0 // indirect github.com/elastic/go-lumber v0.1.2-0.20220819171948-335fde24ea0f // indirect @@ -160,6 +164,7 @@ require ( github.com/elastic/gosigar v0.14.4 // indirect github.com/elastic/sarama v1.19.1-0.20260310070522-abae92ca1603 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch v5.9.11+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect @@ -168,6 +173,8 @@ require ( github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-errors/errors v1.4.2 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -190,9 +197,11 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gohugoio/hashstructure v0.6.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-tpm v0.9.8 // indirect github.com/google/licenseclassifier v0.0.0-20221004142553-c1ed8fcf4bab // indirect github.com/google/s2a-go v0.1.9 // indirect @@ -203,7 +212,7 @@ require ( github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -211,16 +220,18 @@ require ( github.com/huandu/xstrings v1.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jaypipes/pcidb v1.0.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/knadh/koanf/providers/confmap v1.0.0 // indirect - github.com/knadh/koanf/v2 v2.3.2 // indirect + github.com/knadh/koanf/v2 v2.3.3 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lestrrat-go/strftime v1.1.1 // indirect @@ -245,30 +256,33 @@ require ( github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.147.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.147.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.148.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.148.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/osquery/osquery-go v0.0.0-20260226222546-0cc22f415e57 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pierrec/lz4/v4 v4.1.25 // indirect + github.com/pierrec/lz4/v4 v4.1.26 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect - github.com/prometheus/procfs v0.19.2 // indirect + github.com/prometheus/otlptranslator v1.0.0 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rs/cors v1.11.1 // indirect github.com/rubenv/sql-migrate v1.8.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect - github.com/sergi/go-diff v1.3.1 // indirect - github.com/shirou/gopsutil/v4 v4.26.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/shirou/gopsutil/v4 v4.26.2 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect @@ -276,6 +290,7 @@ require ( github.com/urfave/cli/v2 v2.27.4 // indirect github.com/vbatts/tar-split v0.11.6 // indirect github.com/x448/float16 v0.8.4 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -289,75 +304,76 @@ require ( go.elastic.co/apm/module/apmzap/v2 v2.7.0 // indirect go.elastic.co/fastjson v1.5.1 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/collector/client v1.53.0 // indirect - go.opentelemetry.io/collector/config/configauth v1.53.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.53.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.147.0 // indirect - go.opentelemetry.io/collector/config/configmiddleware v1.53.0 // indirect - go.opentelemetry.io/collector/config/confignet v1.53.0 // indirect - go.opentelemetry.io/collector/config/configopaque v1.53.0 // indirect - go.opentelemetry.io/collector/config/configoptional v1.53.0 // indirect - go.opentelemetry.io/collector/config/configretry v1.53.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.147.0 // indirect - go.opentelemetry.io/collector/config/configtls v1.53.0 // indirect - go.opentelemetry.io/collector/connector/connectortest v0.147.0 // indirect - go.opentelemetry.io/collector/connector/xconnector v0.147.0 // indirect - go.opentelemetry.io/collector/consumer v1.53.0 // indirect - go.opentelemetry.io/collector/consumer/consumererror v0.147.0 // indirect - go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.147.0 // indirect - go.opentelemetry.io/collector/consumer/consumertest v0.147.0 // indirect - go.opentelemetry.io/collector/consumer/xconsumer v0.147.0 // indirect - go.opentelemetry.io/collector/exporter/exporterhelper v0.147.0 // indirect - go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.147.0 // indirect - go.opentelemetry.io/collector/exporter/xexporter v0.147.0 // indirect - go.opentelemetry.io/collector/extension/extensionauth v1.53.0 // indirect - go.opentelemetry.io/collector/extension/extensioncapabilities v0.147.0 // indirect - go.opentelemetry.io/collector/extension/extensionmiddleware v0.147.0 // indirect - go.opentelemetry.io/collector/extension/xextension v0.147.0 // indirect - go.opentelemetry.io/collector/internal/componentalias v0.147.0 // indirect - go.opentelemetry.io/collector/internal/fanoutconsumer v0.147.0 // indirect - go.opentelemetry.io/collector/internal/telemetry v0.147.0 // indirect - go.opentelemetry.io/collector/pdata/pprofile v0.147.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.147.0 // indirect - go.opentelemetry.io/collector/pdata/xpdata v0.147.0 // indirect - go.opentelemetry.io/collector/pipeline/xpipeline v0.147.0 // indirect - go.opentelemetry.io/collector/processor/processortest v0.147.0 // indirect - go.opentelemetry.io/collector/processor/xprocessor v0.147.0 // indirect - go.opentelemetry.io/collector/receiver/receivertest v0.147.0 // indirect - go.opentelemetry.io/collector/receiver/xreceiver v0.147.0 // indirect - go.opentelemetry.io/collector/service v0.147.0 // indirect - go.opentelemetry.io/collector/service/hostcapabilities v0.147.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/contrib/otelconf v0.18.0 // indirect - go.opentelemetry.io/ebpf-profiler v0.0.202606 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.60.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.16.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0 // indirect - go.opentelemetry.io/otel/log v0.16.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.16.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect - go.opentelemetry.io/proto/otlp v1.9.0 // indirect + go.opentelemetry.io/collector/client v1.54.0 // indirect + go.opentelemetry.io/collector/config/configauth v1.54.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.54.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.148.0 // indirect + go.opentelemetry.io/collector/config/configmiddleware v1.54.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.54.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.54.0 // indirect + go.opentelemetry.io/collector/config/configoptional v1.54.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.54.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.148.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.54.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.148.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.148.0 // indirect + go.opentelemetry.io/collector/consumer v1.54.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.148.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.148.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.148.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.148.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper v0.148.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.148.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.148.0 // indirect + go.opentelemetry.io/collector/extension/extensionauth v1.54.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.148.0 // indirect + go.opentelemetry.io/collector/extension/extensionmiddleware v0.148.0 // indirect + go.opentelemetry.io/collector/extension/xextension v0.148.0 // indirect + go.opentelemetry.io/collector/internal/componentalias v0.148.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.148.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.148.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.148.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.148.0 // indirect + go.opentelemetry.io/collector/pdata/xpdata v0.148.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.148.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.148.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.148.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.148.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.148.0 // indirect + go.opentelemetry.io/collector/service v0.148.0 // indirect + go.opentelemetry.io/collector/service/hostcapabilities v0.148.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect + go.opentelemetry.io/contrib/otelconf v0.22.0 // indirect + go.opentelemetry.io/ebpf-profiler v0.0.202610 // indirect + go.opentelemetry.io/otel v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.64.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 // indirect + go.opentelemetry.io/otel/log v0.18.0 // indirect + go.opentelemetry.io/otel/metric v1.42.0 // indirect + go.opentelemetry.io/otel/sdk v1.42.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.18.0 // indirect + go.opentelemetry.io/otel/trace v1.42.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect - golang.org/x/oauth2 v0.34.0 // indirect - golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 // indirect + golang.org/x/oauth2 v0.35.0 // indirect + golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect gonum.org/v1/gonum v0.17.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect k8s.io/apiextensions-apiserver v0.34.2 // indirect k8s.io/apiserver v0.34.2 // indirect k8s.io/component-base v0.34.2 // indirect diff --git a/go.sum b/go.sum index ee86dc81847..60dae7cdfb7 100644 --- a/go.sum +++ b/go.sum @@ -40,12 +40,17 @@ github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= @@ -56,36 +61,36 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU= -github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= -github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY= -github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.7 h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM= +github.com/aws/aws-sdk-go-v2 v1.41.2 h1:LuT2rzqNQsauaGkPK/7813XxcZ3o3yePY0Iy891T2ls= +github.com/aws/aws-sdk-go-v2 v1.41.2/go.mod h1:IvvlAZQXvTXznUPfRVfryiG1fbzE2NGK6m9u39YQ+S4= +github.com/aws/aws-sdk-go-v2/config v1.32.10 h1:9DMthfO6XWZYLfzZglAgW5Fyou2nRI5CuV44sTedKBI= +github.com/aws/aws-sdk-go-v2/config v1.32.10/go.mod h1:2rUIOnA2JaiqYmSKYmRJlcMWy6qTj1vuRFscppSBMcw= +github.com/aws/aws-sdk-go-v2/credentials v1.19.10 h1:EEhmEUFCE1Yhl7vDhNOI5OCL/iKMdkkYFTRpZXNw7m8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.10/go.mod h1:RnnlFCAlxQCkN2Q379B67USkBMu1PipEEiibzYN5UTE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18 h1:Ii4s+Sq3yDfaMLpjrJsqD6SmG/Wq/P5L/hw2qa78UAY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.18/go.mod h1:6x81qnY++ovptLE6nWQeWrpXxbnlIex+4H4eYYGcqfc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 h1:F43zk1vemYIqPAwhjTjYIz0irU2EY7sOb/F5eJ3HuyM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18/go.mod h1:w1jdlZXrGKaJcNoL+Nnrj+k5wlpGXqnNrKoP22HvAug= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 h1:xCeWVjj0ki0l3nruoyP2slHsGArMxeiiaoPN5QZH6YQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18/go.mod h1:r/eLGuGCBw6l36ZRWiw6PaZwPXb6YOj+i/7MizNl5/k= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= github.com/aws/aws-sdk-go-v2/service/ec2 v1.277.0 h1:RHJSkRXDGkAKrV4CTEsZsZkOmSpxXKO4aKx4rXd94K4= github.com/aws/aws-sdk-go-v2/service/ec2 v1.277.0/go.mod h1:Wg68QRgy2gEGGdmTPU/UbVpdv8sM14bUZmF64KFwAsY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.5/go.mod h1:k029+U8SY30/3/ras4G/Fnv/b88N4mAfliNn08Dem4M= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 h1:v6EiMvhEYBoHABfbGB4alOYmCIrcgyPPiBE1wZAEbqk= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.9/go.mod h1:yifAsgBxgJWn3ggx70A3urX2AN49Y5sJTD1UQFlfqBw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 h1:gd84Omyu9JLriJVCbGApcLzVR3XtmC4ZDPcAI6Ftvds= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13/go.mod h1:sTGThjphYE4Ohw8vJiRStAcu3rbjtXRsdNB0TvZ5wwo= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 h1:5fFjR/ToSOzB2OQ/XqWpZBmNvmP/pJ1jOWYlFDJTjRQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.6/go.mod h1:qgFDZQSD/Kys7nJnVqYlWKnh0SSdMjAi0uSwON4wgYQ= -github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= -github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5 h1:CeY9LUdur+Dxoeldqoun6y4WtJ3RQtzk0JMP2gfUay0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.5/go.mod h1:AZLZf2fMaahW5s/wMRciu1sYbdsikT/UHwbUjOdEVTc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18 h1:LTRCYFlnnKFlKsyIQxKhJuDuA3ZkrDQMRYm6rXiHlLY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.18/go.mod h1:XhwkgGG6bHSd00nO/mexWTcTjgd6PjuvWQMqSn2UaEk= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.6 h1:MzORe+J94I+hYu2a6XmV5yC9huoTv8NRcCrUNedDypQ= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.6/go.mod h1:hXzcHLARD7GeWnifd8j9RWqtfIgxj4/cAtIVIK7hg8g= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.11 h1:7oGD8KPfBOJGXiCoRKrrrQkbvCp8N++u36hrLMPey6o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.11/go.mod h1:0DO9B5EUJQlIDif+XJRWCljZRKsAFKh3gpFz7UnDtOo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15 h1:edCcNp9eGIUDUCrzoCu1jWAXLGFIizeqkdkKgRlJwWc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.15/go.mod h1:lyRQKED9xWfgkYC/wmmYfv7iVIM68Z5OQ88ZdcV1QbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.7 h1:NITQpgo9A5NrDZ57uOWj+abvXSb83BbyggcUBVksN7c= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.7/go.mod h1:sks5UWBhEuWYDPdwlnRFn1w7xWdH29Jcpe+/PJQefEs= +github.com/aws/smithy-go v1.24.1 h1:VbyeNfmYkWoxMVpGUAbQumkODcYmfMRfZ8yQiH30SK0= +github.com/aws/smithy-go v1.24.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE= @@ -98,6 +103,7 @@ github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKO github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cavaliergopher/rpm v1.2.0 h1:s0h+QeVK252QFTolkhGiMeQ1f+tMeIMhGl8B1HUmGUc= github.com/cavaliergopher/rpm v1.2.0/go.mod h1:R0q3vTqa7RUvPofAZYrnjJ63hh2vngjFfphuXiExVos= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -110,6 +116,9 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/cilium/ebpf v0.20.0 h1:atwWj9d3NffHyPZzVlx3hmw1on5CLe9eljR8VuHTwhM= github.com/cilium/ebpf v0.20.0/go.mod h1:pzLjFymM+uZPLk/IXZUL63xdx5VXEo+enTzxkZXdycw= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -172,8 +181,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4A github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= -github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= +github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/elastic/cloud-on-k8s/v2 v2.0.0-20250327073047-b624240832ae h1:OiShmbWAyGU0MS0ADJWr1/QgeLIZliMk9xsrFicR3/s= github.com/elastic/cloud-on-k8s/v2 v2.0.0-20250327073047-b624240832ae/go.mod h1:D2IckZVXARugvikE4fv1glvaJMohKSZRzrPsxCjo9O0= github.com/elastic/elastic-agent-autodiscover v0.10.2 h1:fzi+CIcK7FKUQlQHfKP+3Ixg1wbuEYacaChunmMAP38= @@ -216,8 +225,12 @@ github.com/elastic/opentelemetry-collector-contrib/pkg/status v0.0.0-20260128133 github.com/elastic/opentelemetry-collector-contrib/pkg/status v0.0.0-20260128133812-7296485a6185/go.mod h1:SUBfpA6bGw4clvLmiq0Hfpn9m7WAYYnB0Z3M69Ex2wk= github.com/elastic/sarama v1.19.1-0.20260310070522-abae92ca1603 h1:QFDM5JuLch52FxjHizLP2tiuzfhulUdyOsUe/JuPhrQ= github.com/elastic/sarama v1.19.1-0.20260310070522-abae92ca1603/go.mod h1:J0lqNUlLxjFJpAGJDmFT8+vOlAnOMbQCoBQmUJ79zT4= +github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1 h1:g7YUigN4dW2+zpdusdTTghZ+5Py3BaUMAStvL8Nk+FY= +github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= @@ -240,8 +253,18 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= +github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -313,6 +336,8 @@ github.com/gohugoio/hashstructure v0.6.0 h1:7wMB/2CfXoThFYhdWRGv3u3rUM761Cq29CxU github.com/gohugoio/hashstructure v0.6.0/go.mod h1:lapVLk9XidheHG1IQ4ZSbyYrXcaILU1ZEP/+vno5rBQ= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= @@ -326,6 +351,10 @@ 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/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI= github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI= +github.com/google/go-github/v68 v68.0.0 h1:ZW57zeNZiXTdQ16qrDiZ0k6XucrxZ2CGmoTvcCyQG6s= +github.com/google/go-github/v68 v68.0.0/go.mod h1:K9HAUBovM2sLwM408A18h+wd9vqdLOEqTUCbnRIcx68= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/go-tpm-tools v0.4.7 h1:J3ycC8umYxM9A4eF73EofRZu4BxY0jjQnUnkhIBbvws= @@ -362,8 +391,8 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -389,6 +418,8 @@ github.com/jaypipes/ghw v0.12.0 h1:xU2/MDJfWmBhJnujHY9qwXQLs3DBsf0/Xa9vECY0Tho= github.com/jaypipes/ghw v0.12.0/go.mod h1:jeJGbkRB2lL3/gxYzNYzEDETV1ZJ56OKr+CSeSEym+g= github.com/jaypipes/pcidb v1.0.0 h1:vtZIfkiCUE42oYbJS0TAq9XSfSmcsgo9IdxSm9qzYU8= github.com/jaypipes/pcidb v1.0.0/go.mod h1:TnYUvqhPBzCKnH34KrIX22kAeEbDCSRJ9cqLRCuNDfk= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -411,6 +442,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kardianos/service v1.2.1-0.20210728001519-a323c3813bc7 h1:oohm9Rk9JAxxmp2NLZa7Kebgz9h4+AJDcc64txg3dQ0= github.com/kardianos/service v1.2.1-0.20210728001519-a323c3813bc7/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= @@ -421,8 +454,8 @@ github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpb github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v1.0.0 h1:mHKLJTE7iXEys6deO5p6olAiZdG5zwp8Aebir+/EaRE= github.com/knadh/koanf/providers/confmap v1.0.0/go.mod h1:txHYHiI2hAtF0/0sCmcuol4IDcuQbKTybiB1nOcUo1A= -github.com/knadh/koanf/v2 v2.3.2 h1:Ee6tuzQYFwcZXQpc2MiVeC6qHMandf5SMUJJNoFp/c4= -github.com/knadh/koanf/v2 v2.3.2/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= +github.com/knadh/koanf/v2 v2.3.3 h1:jLJC8XCRfLC7n4F+ZKKdBsbq1bfXTpuFhf4L7t94D94= +github.com/knadh/koanf/v2 v2.3.3/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -508,16 +541,16 @@ github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.147.0 h1:JGGveRoLkgt3S1pS1uKaIDKcBSIOqXQaT5caDBzrPt4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.147.0/go.mod h1:JdEePqCSuwLUdMZgCjjbiUTHaBA/AOOU4SJw49E7Zjg= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.147.0 h1:T7yBzSHaI7kKMe8skPtnqQvp4hp8sAmLZdQav2MDrW0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.147.0/go.mod h1:ZsCmntCwaHQFhjYdn1CnT6+wadDNDbHqCSWjRwpr63U= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.147.0 h1:DVadnM6h9kbXkpCQLbr12Z+fuQPmAlY51iHWs5ut3fw= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.147.0/go.mod h1:aF8IuTH/4RSG3znojA0KFavdtGfykAqExX1YjOaIa5M= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.147.0 h1:jgmHvcC3WCrkA49VBm/Tay6O5OEaLvevlqd+OEoPI3M= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.147.0/go.mod h1:NMXNbNZ4aEhyW0Oe4BfbGLLOI8Y9FmB/unZp01HUlKU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.147.0 h1:EYy8gmyjGLS0iYV7ksOOHrjZgiTjbWU26vziBAt4jKI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.147.0/go.mod h1:VDqy65biIJI9iYN9rrVi2nm9KAvSfq+6Fzrm8WyL4Qw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.148.0 h1:Uh4rbsLGqgVYnsZxbsNVI+MFhzExP69EsPO9uBJE5C0= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.148.0/go.mod h1:xXeu6kDX6ANYNiMauPXL4AmtaJdSMN/CJHmYolPZ+D4= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.148.0 h1:XfnWquAk1ZhCuUNFIg4MKKOXiTfJrSulU8yKPxArFSM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.148.0/go.mod h1:uq/XRz2qvgDqO03Z90K/pqV8+h20uauP3E2XseKIIDE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.148.0 h1:pbsTNnV4+4q27bIftrITw/EuJbI5z94RF5bwcRrMZJY= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.148.0/go.mod h1:Nk8pkfQ5BxhCCODJvBIsC8b8VWXg35OxwRSUT6R+fUE= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.148.0 h1:i12duJOl5VCb9mbb8FfZCaP2CjeXbNsbg82JjSe7sy8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.148.0/go.mod h1:jyw+QvkmCrF/oYy31O2ndb5KZZK4l+iR89msnV3LN/k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.148.0 h1:1TLg6YrS3Au6F7xw3ws2Njbwj13IMqPplvGFi+18fWs= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.148.0/go.mod h1:P8hZEDIQk4REgUWyLhSVRHwTxK6KkifKfg36BmmQ/DI= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -533,8 +566,10 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= -github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= +github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= +github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -553,8 +588,10 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= -github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= +github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= @@ -586,14 +623,17 @@ github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCw github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shirou/gopsutil/v4 v4.26.1 h1:TOkEyriIXk2HX9d4isZJtbjXbEjf5qyKPAzbzY0JWSo= -github.com/shirou/gopsutil/v4 v4.26.1/go.mod h1:medLI9/UNAb0dOI9Q3/7yWSqKkj00u+1tgY8nvv41pc= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= +github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= @@ -634,6 +674,8 @@ github.com/winlabs/gowin32 v0.0.0-20240930213947-f504d7e14639 h1:9MJGHk/ErosklMj github.com/winlabs/gowin32 v0.0.0-20240930213947-f504d7e14639/go.mod h1:N51TYkG9JGR5sytj0EoPl31Xg2kuB507lxEmrwSNvfQ= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -673,184 +715,184 @@ go.elastic.co/go-licence-detector v0.7.0 h1:qC31sfyfNcNx/zMYcLABU0ac3MbGHZgksCAb go.elastic.co/go-licence-detector v0.7.0/go.mod h1:f5ty8pjynzQD8BcS+s0qtlOGKc35/HKQxCVi8SHhV5k= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/collector/client v1.53.0 h1:1O7PAvv2F35rzRNgvS/ZugnctM7tmIHqQEOnvCo6Bzs= -go.opentelemetry.io/collector/client v1.53.0/go.mod h1:7Tyz93uX4Ur65ApO/EAwk/3aRnNJSwSKWmnHSnHj4eM= -go.opentelemetry.io/collector/component v1.53.0 h1:A+GU9n4eKnFVmrr7NPpbVvJ1kp985jXtachb9gy12mk= -go.opentelemetry.io/collector/component v1.53.0/go.mod h1:yqyFwDuP4JKwOFaxdqoWj25aVthtavGkSDp2K42x+YY= -go.opentelemetry.io/collector/component/componentstatus v0.147.0 h1:Qaiqr7AAkqeAtZvh6oYxWwFwVPEfXtI6ICbZVPLeHPc= -go.opentelemetry.io/collector/component/componentstatus v0.147.0/go.mod h1:HbRGdTxY2JpySKI7FVIevPctRmM941C6ST6FuHe9NHQ= -go.opentelemetry.io/collector/component/componenttest v0.147.0 h1:9XTwUT87gFWScoP29GEyMjKjr0jycVon6u/EVLrw08w= -go.opentelemetry.io/collector/component/componenttest v0.147.0/go.mod h1:ph5UnCbKUeX3xBg9eSdueRnGmNB4DmhQ0KC6lTsGYTs= -go.opentelemetry.io/collector/config/configauth v1.53.0 h1:vo3xZOga3Ss6IMCMCPrF7CCrPQYeveV/QnQNdNIe2Gc= -go.opentelemetry.io/collector/config/configauth v1.53.0/go.mod h1:Ro/XCFmWWzLgTu3QTHRMKty/Ac29sLr40QsBxrBcce0= -go.opentelemetry.io/collector/config/configcompression v1.53.0 h1:kr6Xr73qu8s9EtDqqbUAzLNYFombuM/CyhIqsBbbaTE= -go.opentelemetry.io/collector/config/configcompression v1.53.0/go.mod h1:SEcE2uFLHHPc/Vi8WCkW5MhOMUwaT321HBdZ3P8x8D0= -go.opentelemetry.io/collector/config/confighttp v0.147.0 h1:DDZT5/CVZUJoXv3tcKIVu/ZMLP3QJulP/1HZ2nIS8G0= -go.opentelemetry.io/collector/config/confighttp v0.147.0/go.mod h1:K7Qw/xGXCuoduoKvE4ImXOCEPTfAipkE7QMsgqcllq0= -go.opentelemetry.io/collector/config/configmiddleware v1.53.0 h1:7GPw68VbMAeCh7L4+cYX7xFyLhI8qehIac1WxYS8Ctc= -go.opentelemetry.io/collector/config/configmiddleware v1.53.0/go.mod h1:25XTB96jdlp1xb1z3rkme/xxD144CLydZZX3zA0B+5k= -go.opentelemetry.io/collector/config/confignet v1.53.0 h1:12xlR5F1A16EUqnqKc99AzUPp4uvPqe8tLoBq6c9jo0= -go.opentelemetry.io/collector/config/confignet v1.53.0/go.mod h1:okpHzgIUQW9ga1P9PXzUsggmG1woR1rYsfZGDWKAC6c= -go.opentelemetry.io/collector/config/configopaque v1.53.0 h1:xuXfIl0PIQjuTg8TZ/tRtdkAtXEBUVH2FekC/c46Wco= -go.opentelemetry.io/collector/config/configopaque v1.53.0/go.mod h1:4zVbxe+oVVcYTl9xH2ww/4p8NDmlzvFKmy8cIm7FAXo= -go.opentelemetry.io/collector/config/configoptional v1.53.0 h1:ltapYduU3tEzY+4Dl1JO8Vmlp0XAsEbCQi13PsUXnWE= -go.opentelemetry.io/collector/config/configoptional v1.53.0/go.mod h1:H76oaUv8JlhOl8VfNRffKdkwfCfAnATgSXi/e7xhgqI= -go.opentelemetry.io/collector/config/configretry v1.53.0 h1:9qOKqaTIiYw4mfplpjPuFgXv+z4QQQdFgWt7dkhp9BY= -go.opentelemetry.io/collector/config/configretry v1.53.0/go.mod h1:1BoQ5SvJT751bqP/5g0VTPLkNgMtvifAr2QqMCVOv2o= -go.opentelemetry.io/collector/config/configtelemetry v0.147.0 h1:6KaRBgmsMcTz8elHl8Rab9pHuW+XR22tIZwXVwD/uu4= -go.opentelemetry.io/collector/config/configtelemetry v0.147.0/go.mod h1:vLUthxDJbDk0ZE9MXPvmSslNESDdGblIXWoDMov3UOE= -go.opentelemetry.io/collector/config/configtls v1.53.0 h1:1Ku5EaMjT49BsT2au6/TD+1fWiHFIhU61Se3NuAmCVo= -go.opentelemetry.io/collector/config/configtls v1.53.0/go.mod h1:oOoq1WyryvBJ0WXeaJDXbVTU9jhY4A8UsrvyfxwuQJI= -go.opentelemetry.io/collector/confmap v1.53.0 h1:gp5CDXNv2Bg+Ytr3A+ZiaVg9SfNiZKbxLUo6ogfyVVE= -go.opentelemetry.io/collector/confmap v1.53.0/go.mod h1:Abi0meDEJeUNlHF2uw2whtuH10TyW2pkqH547sgmRTc= -go.opentelemetry.io/collector/confmap/provider/fileprovider v1.53.0 h1:buxrLwRKdaJSy8whqAdg3JteC9S5+hr5rmwuqd+UvrU= -go.opentelemetry.io/collector/confmap/provider/fileprovider v1.53.0/go.mod h1:982ygZ+Pnnss9eDzSXK6wFkaiHZSjol4IWrH06KGBg0= -go.opentelemetry.io/collector/confmap/xconfmap v0.147.0 h1:4FWhq/szzeYEJLLMXWsLMY5b1qYy83M7rbEBUJCHnUY= -go.opentelemetry.io/collector/confmap/xconfmap v0.147.0/go.mod h1:EHgZFJzZU88Y9A+NlKCn9EwrVHEzASEtCsHw3kv+jgI= -go.opentelemetry.io/collector/connector v0.147.0 h1:9aiyF5cLc/Jo1CnEgQO4ThJrmQ0ET85+pgQB3IPabv4= -go.opentelemetry.io/collector/connector v0.147.0/go.mod h1:WJunT5xczjKcMqQRkLWzGpfIdchR6I95qUO6/f1gyTc= -go.opentelemetry.io/collector/connector/connectortest v0.147.0 h1:EF//xnmtPpJ41nxxeKXOIo03x0X0GiCYFHvb6U0NFRA= -go.opentelemetry.io/collector/connector/connectortest v0.147.0/go.mod h1:XHtZ/m+NxQDTNYoyL2nL7TOznIkxheZD31rmaBJJxBg= -go.opentelemetry.io/collector/connector/xconnector v0.147.0 h1:Lq/Y7x6ZePMV9gsWRIbbor54hdjOjeFL3HnyenukiD8= -go.opentelemetry.io/collector/connector/xconnector v0.147.0/go.mod h1:rVeIX2LRcwRUoP8KTod6hnbdIkfDvqG7Ry9rkCXA2gQ= -go.opentelemetry.io/collector/consumer v1.53.0 h1:Gyy80dX5r1Lv9lvQk8XFtUkWs1eniicOzzCQBejLseg= -go.opentelemetry.io/collector/consumer v1.53.0/go.mod h1:f5U6ibd+XpC5eOSeEYhERAQJ2a5bp1d2RzW3MFddMDM= -go.opentelemetry.io/collector/consumer/consumererror v0.147.0 h1:c4jjAEke6AEqoxalOAIEudGuN4rnnheaLWdpJXPCAPQ= -go.opentelemetry.io/collector/consumer/consumererror v0.147.0/go.mod h1:9MwE9k6xHd3TGBSAeKSmt42dwWyxwUhYqfwPUx1ZQJY= -go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.147.0 h1:HSmBAtam5792w4nOSntYD66eUkBlScdj+CzR8RwB6uI= -go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.147.0/go.mod h1:QIng6ovCvUvD2KwHCufDvS9l9JWig5u/1l1luEEidCw= -go.opentelemetry.io/collector/consumer/consumertest v0.147.0 h1:AU3sUm2L3pezrg6hzPJAO19ZANQoCcfgbyanN0q360g= -go.opentelemetry.io/collector/consumer/consumertest v0.147.0/go.mod h1:QWGFRmeYNbKaseDTNT3a2iGDmjl+DCZnLzMP7Rjj0JM= -go.opentelemetry.io/collector/consumer/xconsumer v0.147.0 h1:XJVQc2dYyalaFXMTa4/RE+aweQTiBpw1edfwdCIJSxw= -go.opentelemetry.io/collector/consumer/xconsumer v0.147.0/go.mod h1:mtwh1VsUoGjxwdmXEzjbswH7KAGByJNCIMHmhqwXeK0= -go.opentelemetry.io/collector/exporter v1.53.0 h1:B+Qpfr6Tu0ocUbZOBkhG6l3Cwgu72nJfSVUw94F+8yI= -go.opentelemetry.io/collector/exporter v1.53.0/go.mod h1:ho0WReomrL9Xex0XF95ZZ4oSAVrjm9yFGbGaRZjXhXI= -go.opentelemetry.io/collector/exporter/exporterhelper v0.147.0 h1:LSKMjcoq/sfhxYSMmdCSHcHnOQAysfRZXcjOLbz0Prk= -go.opentelemetry.io/collector/exporter/exporterhelper v0.147.0/go.mod h1:6Yl9DTcsj8tRyjOfNFR0rUjkZil6Z7qwWcDb1fEfFvA= -go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.147.0 h1:uCa4+J+RX4Kpa7k+AIUWrP5vRHscjCNgKpYhwfroY7o= -go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.147.0/go.mod h1:lNU6ofNUnIL0zrKUKCNWZzFMtETqCBwR9rnZf5iMMxI= -go.opentelemetry.io/collector/exporter/exportertest v0.147.0 h1:Ax8ZFBv86ZtdhG1vGw1+xkyn/XWgqJMu7ek27Hohqkw= -go.opentelemetry.io/collector/exporter/exportertest v0.147.0/go.mod h1:V+QvACPt52yL0x2Em3UDYDXQZdaR8vASdbOgq0jMT/Q= -go.opentelemetry.io/collector/exporter/xexporter v0.147.0 h1:3PqWr987tOqYl08sijJyVhCjRP3HGoavuxl23fNVMVg= -go.opentelemetry.io/collector/exporter/xexporter v0.147.0/go.mod h1:ILJrtuHTQH+bkG5uRRDMVI2cyQrcvL7oZR1FwegNjV8= -go.opentelemetry.io/collector/extension v1.53.0 h1:rgg0zQe6zHPF2okbnoEA7UQ2Tyw12lwU1ToQTfxvp6M= -go.opentelemetry.io/collector/extension v1.53.0/go.mod h1:UawW4sBNV+TIXgz1GR+UtnMQYb8AfFbhEdKoKTYyf7M= -go.opentelemetry.io/collector/extension/extensionauth v1.53.0 h1:zo2Sm6G6SrtYondJz/c4hGWwx/V2H4nZlf8yZlo0vIM= -go.opentelemetry.io/collector/extension/extensionauth v1.53.0/go.mod h1:xZVclEW3nnh1U+eu7apnt9KI+nf3MalpL40dhUeUtZQ= -go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.147.0 h1:VK8OeyWTtT9bkbCTSRIOM0wmvXamMm4eeWuszkc+1uc= -go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.147.0/go.mod h1:qi8SUTVdd+3FqTY5oaNaagoS/xR/Mj0xVmoHe6Z4S9k= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.147.0 h1:bA+SZXZAUuzMpWRirpUNUeBFBAF7Xo0DAmebN0QcJxw= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.147.0/go.mod h1:RFIB23JGZzRkw13iarMO7jL04btdhGwrqH9bvnXaHqE= -go.opentelemetry.io/collector/extension/extensionmiddleware v0.147.0 h1:krtFnUXeOrtvZV0t56o+k2FOA6VeWx5d7gGaI4PPiW0= -go.opentelemetry.io/collector/extension/extensionmiddleware v0.147.0/go.mod h1:jveBzwcNqD3kq4N9i04C2xOUQ+wWiwsbqZ7x7zdnA7k= -go.opentelemetry.io/collector/extension/extensionmiddleware/extensionmiddlewaretest v0.147.0 h1:QsuUpmBwAZHOLdFC+j6EzL43G1EmGvBqz9JlJv4Bovc= -go.opentelemetry.io/collector/extension/extensionmiddleware/extensionmiddlewaretest v0.147.0/go.mod h1:rXkQ/Kw+UD3IovJQb8pXKoA8ZU7rm0nfwylsHzeF05A= -go.opentelemetry.io/collector/extension/extensiontest v0.147.0 h1:UfJQ+kxTXLPjMDhlfoFOp4EM2KykfAHjTUVPYQzDHw0= -go.opentelemetry.io/collector/extension/extensiontest v0.147.0/go.mod h1:td5cl9har3aV7ZWwASX6oO4PakFwxR3MQmwRkvFyQhM= -go.opentelemetry.io/collector/extension/xextension v0.147.0 h1:qOTnVoLomYZVpCbynYI1z2Su7MyURW3UeTpXVPXydsg= -go.opentelemetry.io/collector/extension/xextension v0.147.0/go.mod h1:DJOku9Lc0q+i06ElPg4xYTgH1xV0bHetGOjOiyawVDE= -go.opentelemetry.io/collector/extension/zpagesextension v0.147.0 h1:ngLh28D5oxRpb9URBXD9r2LNm2n2AE4omC75JCRxOaI= -go.opentelemetry.io/collector/extension/zpagesextension v0.147.0/go.mod h1:ZuyNwhOrKIYv/coXPVctu44qdVYuxm/zrv9dMvgewlA= -go.opentelemetry.io/collector/featuregate v1.53.0 h1:cgjXdtl7jezWxq6V0eohe/JqjY4PBotZGb5+bTR2OJw= -go.opentelemetry.io/collector/featuregate v1.53.0/go.mod h1:PS7zY/zaCb28EqciePVwRHVhc3oKortTFXsi3I6ee4g= -go.opentelemetry.io/collector/internal/componentalias v0.147.0 h1:cC1gEQwzQnDvbELVjE3FXqgBkrsUl5JhzOT+6hISaLI= -go.opentelemetry.io/collector/internal/componentalias v0.147.0/go.mod h1:RxuMjMy1j+2jZcY1Ej0E+NC6DnoqTMEvIwRiXtk82rc= -go.opentelemetry.io/collector/internal/fanoutconsumer v0.147.0 h1:OGya/jGpfg0Ild0IFkML2WJQ0M5YSsKrhszAq8E64Ho= -go.opentelemetry.io/collector/internal/fanoutconsumer v0.147.0/go.mod h1:6KMTdTvpsX2qlAIy8ZLMIIKA86BGmM6pRqY5f/R4GTI= -go.opentelemetry.io/collector/internal/telemetry v0.147.0 h1:g4s2jN5hqzdSM23e120J1qlH5FWTjnBTlwuVOqsJTRw= -go.opentelemetry.io/collector/internal/telemetry v0.147.0/go.mod h1:hIPm+9H91r2TrtRF6Y9FxEPLC2ul6/fjpD2QEJgc1a4= -go.opentelemetry.io/collector/internal/testutil v0.147.0 h1:DFlRxBRp23/sZnpTITK25yqe0d56yNvK+63IaWc6OsU= -go.opentelemetry.io/collector/internal/testutil v0.147.0/go.mod h1:Jkjs6rkqs973LqgZ0Fe3zrokQRKULYXPIf4HuqStiEE= -go.opentelemetry.io/collector/otelcol v0.147.0 h1:sFJ0YyaEWgMFIGBRFTvYjgXzvvqbIV7kmJsfEkbUoZQ= -go.opentelemetry.io/collector/otelcol v0.147.0/go.mod h1:7HtKw0F2pwgfYnVVCln3/la/M4ALrjPstUFojHJVKoc= -go.opentelemetry.io/collector/pdata v1.53.0 h1:DlYDbRwammEZaxDZHINx5v0n8SEOVNniPbi6FRTlVkA= -go.opentelemetry.io/collector/pdata v1.53.0/go.mod h1:LRSYGNjKXaUrZEwZv3Yl+8/zV2HmRGKXW62zB2bysms= -go.opentelemetry.io/collector/pdata/pprofile v0.147.0 h1:yQS3RBvcvRcy9N7AnJvsxmse0AxJcRqBZfwMA22xBA8= -go.opentelemetry.io/collector/pdata/pprofile v0.147.0/go.mod h1:pm9mUqHNpT1SaCkxILu4FW1BvMAelh7EKhpSKe2KJIQ= -go.opentelemetry.io/collector/pdata/testdata v0.147.0 h1:fZB5jY5F+zC/oeGYBa92IknhPQIlLSwoxDUMzhrpTP4= -go.opentelemetry.io/collector/pdata/testdata v0.147.0/go.mod h1:+AB6qTXrYEBvqrv394SEXzuWxtL9LLrnVgIjYpP9HHU= -go.opentelemetry.io/collector/pdata/xpdata v0.147.0 h1:JZPYCIrIhmpmUJ1SNkGv13LQykBPY9eLpC+kQm8fex0= -go.opentelemetry.io/collector/pdata/xpdata v0.147.0/go.mod h1:w3iv1rH00eMB/7lYBn9dDJuYujJUpgca5Zoz3KDLgrc= -go.opentelemetry.io/collector/pipeline v1.53.0 h1:+RrNuAmHnzldGOzCCYLJv0qTFoi9QJGrLm+MEYMozmo= -go.opentelemetry.io/collector/pipeline v1.53.0/go.mod h1:RD90NG3Jbk965Xaqym3JyHkuol4uZJjQVUkD9ddXJIs= -go.opentelemetry.io/collector/pipeline/xpipeline v0.147.0 h1:Pq3UGFbGHvU88XoCe9z5nLf0QHDgeXdAW8pGb6OfUhQ= -go.opentelemetry.io/collector/pipeline/xpipeline v0.147.0/go.mod h1:NoL1h8a2rma3PRvcaSgDkHfU0sTv+Z5oJgfpgC+oEUE= -go.opentelemetry.io/collector/processor v1.53.0 h1:ehUBUjVUIs8M/bfNfDuq1YhWuGzlet1UCKsdNP+8CWg= -go.opentelemetry.io/collector/processor v1.53.0/go.mod h1:LtUUfQUo6FKJpd9uf9jwUqjJKa5twyiqkn4MSlHhcog= -go.opentelemetry.io/collector/processor/processortest v0.147.0 h1:1HzGo3CfRxH0RreJKbw9INZwNwnvtUfb0yYlT7A7DwY= -go.opentelemetry.io/collector/processor/processortest v0.147.0/go.mod h1:JkeOS3E1BH6MUAcvTaVNIgUSXD+IGggi1pdvbRwMctE= -go.opentelemetry.io/collector/processor/xprocessor v0.147.0 h1:whDSBgNY/fiRpaCLoz1FgJ6h/Ont3WotCiHQm2N3kAw= -go.opentelemetry.io/collector/processor/xprocessor v0.147.0/go.mod h1:5gQLlLM2ijMQ+ofGxColoCMA7uVSt1k/USf70NTxo3I= -go.opentelemetry.io/collector/receiver v1.53.0 h1:FACspX7EMj91g8OY3twlJKzw2LKj0g5wZAXT4Ys2XRU= -go.opentelemetry.io/collector/receiver v1.53.0/go.mod h1:rhBr1+X3N9ijDBBKrVCiRMfVTUlOSWj+Gj0A6qevmoA= -go.opentelemetry.io/collector/receiver/receivertest v0.147.0 h1:t+AqCUJT0ivO1eE09f8gIqnO73UeEFqjvL/annt6rWg= -go.opentelemetry.io/collector/receiver/receivertest v0.147.0/go.mod h1:8kZCwsG8KNpWRf+2izpoY8iIOyfC2cQ2CLSZc9LgOP0= -go.opentelemetry.io/collector/receiver/xreceiver v0.147.0 h1:/KAxTban2sQhiksAu/EG+ri0mNgSxldhJ4lj/XGT+xQ= -go.opentelemetry.io/collector/receiver/xreceiver v0.147.0/go.mod h1:DCjNMipiIv59Jc/YfWFxAvgonurJET9cw3D79U1yLMc= -go.opentelemetry.io/collector/service v0.147.0 h1:GOeTKksk/FInCkOB41vCVh604+BP1FHUEKZgRFmaVpM= -go.opentelemetry.io/collector/service v0.147.0/go.mod h1:q+HliTIx/7Fpbh2n9JOjQqXnirtK3zYGRxJHGZhXGO4= -go.opentelemetry.io/collector/service/hostcapabilities v0.147.0 h1:/i1dqtm8xpVF5XY2jHCNSD+PWGNz+6lt8aNavYi1YsA= -go.opentelemetry.io/collector/service/hostcapabilities v0.147.0/go.mod h1:upqV4SuIHEZNgZITN47XOXqQ5ez8sB16fohzxwqKtAo= -go.opentelemetry.io/collector/service/telemetry/telemetrytest v0.147.0 h1:QjNJi2Ey4ngwJ8IChYyFqchTRswYcVVKFNYgvo1DCSU= -go.opentelemetry.io/collector/service/telemetry/telemetrytest v0.147.0/go.mod h1:OyfBW/uyAecmasDJMiAwYcPgJS5EWJChJT/srObe/DM= +go.opentelemetry.io/collector/client v1.54.0 h1:JDpDdc67n2LGVcDzMKN7fSsmmB7333g6d38LshTuXR0= +go.opentelemetry.io/collector/client v1.54.0/go.mod h1:4ODFLlgYmMEA+GNy96Qsn6Gi2PwFQFNUScvv5vVTyfE= +go.opentelemetry.io/collector/component v1.54.0 h1:LvtX0Tzz18n44OrUFVk77N1FNsejfWJqztB28hrmDM8= +go.opentelemetry.io/collector/component v1.54.0/go.mod h1:yUMBYsySY/sDcXm8kOzEoZxt+JLdala6hxzSW0npOxY= +go.opentelemetry.io/collector/component/componentstatus v0.148.0 h1:sCGRaXNQolHFhPjrNJEwQ1WZOf96iL99tzm9GxuZsvg= +go.opentelemetry.io/collector/component/componentstatus v0.148.0/go.mod h1:yqg3SpGQc22W3wGICdnb+2kZVW9daBr3+LrGUCHkKfc= +go.opentelemetry.io/collector/component/componenttest v0.148.0 h1:tBXJWmy2X6KD8S0QU2YZa2zYBqP+IycSM4iOtwDD2pA= +go.opentelemetry.io/collector/component/componenttest v0.148.0/go.mod h1:1c1+6mZOmI0raoya5vA/X0F+fawEjNS6tCEs5xLATtA= +go.opentelemetry.io/collector/config/configauth v1.54.0 h1:qJ3JdalSJmKWa59kkJoD/nElPlxWvyGf3xZAVnp1TrI= +go.opentelemetry.io/collector/config/configauth v1.54.0/go.mod h1:vyp8mZJ793H82GV4eVuuoL+sG6n32SQgG/6jGGfOf+o= +go.opentelemetry.io/collector/config/configcompression v1.54.0 h1:YDnrdNSEXqam0OQWRAE+arMsvm/fxQb3oNhgcWhAZ5k= +go.opentelemetry.io/collector/config/configcompression v1.54.0/go.mod h1:SEcE2uFLHHPc/Vi8WCkW5MhOMUwaT321HBdZ3P8x8D0= +go.opentelemetry.io/collector/config/confighttp v0.148.0 h1:1OYlN1pK0IlJrZTLiNxQNPD90AnrEjJ72HXd77w5Xqs= +go.opentelemetry.io/collector/config/confighttp v0.148.0/go.mod h1:bXmmkVH3L4E2XZwKOQuy/5EbOzhX97e0iuv9iMlFbXQ= +go.opentelemetry.io/collector/config/configmiddleware v1.54.0 h1:FPMNDPumiZ7FhfzRggn5PR0AnPZQOVB7VWua11VGAUU= +go.opentelemetry.io/collector/config/configmiddleware v1.54.0/go.mod h1:6PYzhcC5402GuSjIs6Q14O2HjH2ZE+A60wWdQuI7ZhY= +go.opentelemetry.io/collector/config/confignet v1.54.0 h1:Led1uZQkFDSRIaO9GyZjvpIfuMBAADou7MvhtZkV/Pc= +go.opentelemetry.io/collector/config/confignet v1.54.0/go.mod h1:okpHzgIUQW9ga1P9PXzUsggmG1woR1rYsfZGDWKAC6c= +go.opentelemetry.io/collector/config/configopaque v1.54.0 h1:DsVlBIk3RDbRz48GxkrKFN5uNet8EaGXU39C6VsUjZQ= +go.opentelemetry.io/collector/config/configopaque v1.54.0/go.mod h1:beDuR48blgodzbJkUgMFu9vg0qxjU04tcBtb/rVEP/A= +go.opentelemetry.io/collector/config/configoptional v1.54.0 h1:W6MHMrVEbjw/5boxN+VXGZmMBi62IF/lf41vhuNGebU= +go.opentelemetry.io/collector/config/configoptional v1.54.0/go.mod h1:c8cFSCUN/A6U00janThFC64ZpyKV1viq/chPOoaqe3I= +go.opentelemetry.io/collector/config/configretry v1.54.0 h1:v0G/FxIkkcZzaM/1JrHN5sWBoUWWvb3c+UEgvo5iFs4= +go.opentelemetry.io/collector/config/configretry v1.54.0/go.mod h1:1BoQ5SvJT751bqP/5g0VTPLkNgMtvifAr2QqMCVOv2o= +go.opentelemetry.io/collector/config/configtelemetry v0.148.0 h1:TZPiz6T6AOvEHmKzU0cPF+CcRbJVR0c3DCqP8Orylx8= +go.opentelemetry.io/collector/config/configtelemetry v0.148.0/go.mod h1:vLUthxDJbDk0ZE9MXPvmSslNESDdGblIXWoDMov3UOE= +go.opentelemetry.io/collector/config/configtls v1.54.0 h1:Xt5oEs+q7Y6l7mdFYqSrqr0lwJilGcg9EBlCBd/jiBw= +go.opentelemetry.io/collector/config/configtls v1.54.0/go.mod h1:ikruZqHoIlR+MaqUgDKotQiuN64uAdlH6zxsTjSKjSM= +go.opentelemetry.io/collector/confmap v1.54.0 h1:RUoxQ4uAYHTI57GfHh61D00tTQsXm9T88ozrAiicByc= +go.opentelemetry.io/collector/confmap v1.54.0/go.mod h1:mQxG8bk0IWIt9gbWMvzE+cRkOuCuzbzkNGBq2YJ4wNM= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.54.0 h1:oypNOydhUDKyg2GBhchpwofKQbgnGrLmXkldrXD8T3Q= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.54.0/go.mod h1:x2HycFHWpfplIjjMERFOO9byCLLMCnuoxZ87TYwvPF4= +go.opentelemetry.io/collector/confmap/xconfmap v0.148.0 h1:UW8MX5VlKJf67x4Et7J9kPwP9Rv4VSmJ+UUpgRcb//c= +go.opentelemetry.io/collector/confmap/xconfmap v0.148.0/go.mod h1:4qTMr3V0uSXXac9wVs/UD5fIqRKw5yIl58+Vjsc6RHM= +go.opentelemetry.io/collector/connector v0.148.0 h1:nJOvqm57ab4xRDxF0C+PQdptOF/x6NU9MAaqQJqOq7A= +go.opentelemetry.io/collector/connector v0.148.0/go.mod h1:Evipn8SpEed4NSynwcef3s/VihyutpAzv9aFh2KvtJA= +go.opentelemetry.io/collector/connector/connectortest v0.148.0 h1:LPrjLF9UbGOtZkG/PfA2Lh94Aouxf0FeqtL4TLvKXvY= +go.opentelemetry.io/collector/connector/connectortest v0.148.0/go.mod h1:y9S8I7FLfb8+nyqugOFiExv/ZlGi/BIcINUEdowX4eQ= +go.opentelemetry.io/collector/connector/xconnector v0.148.0 h1:O6GOSkFezdCovPWIlcx0ZkymLGBlmMIoBrRzMLUV8ho= +go.opentelemetry.io/collector/connector/xconnector v0.148.0/go.mod h1:FMtp0iuWWmv2wY30QQyMbetNLn0MJfFgVXZDAViUwKs= +go.opentelemetry.io/collector/consumer v1.54.0 h1:RGGtUN+GbkV1px3T6XdUHmgJ+ldJ1hAHdesFzW/wgL0= +go.opentelemetry.io/collector/consumer v1.54.0/go.mod h1:1PC6XINTL9DdT1bwvfMdHE72EB4RWU/WcPemUrhqKN8= +go.opentelemetry.io/collector/consumer/consumererror v0.148.0 h1:lKVkNWBeRXG41lHBf5KzA9oErRZifx6qTd9erAFfEkE= +go.opentelemetry.io/collector/consumer/consumererror v0.148.0/go.mod h1:N/UppmtknIdzpEiy3xirH1EiBEBOqKqD77NCyNi2Rbc= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.148.0 h1:61RfzjtvnATQEahTN/Enwz0QFEBK9M9eNcxHh5Etzm0= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.148.0/go.mod h1:vJSXpbjZelXtXdV3AjdGC2WjoVQkNLpzxy+5MUl3Xd8= +go.opentelemetry.io/collector/consumer/consumertest v0.148.0 h1:ms0HtWMj17tI1Yds0hSuUI5QYpNEqd11AAhwIoUY2HE= +go.opentelemetry.io/collector/consumer/consumertest v0.148.0/go.mod h1:wScw/OzKkf/ZzJn4ToI30OoI1kJiY16WNrcFToXSzK0= +go.opentelemetry.io/collector/consumer/xconsumer v0.148.0 h1:m3b9rY7CLD5Pcge6sSKHIT3OlcPN6xqYsdtVs9oJ528= +go.opentelemetry.io/collector/consumer/xconsumer v0.148.0/go.mod h1:bG+Wz6xmIBl/gHzq1sqvksWXqTLuTX17Wo//zIsdZpw= +go.opentelemetry.io/collector/exporter v1.54.0 h1:SSkEc9VGCf4OJaf+spj4euZ/FcswzOwLm8zR9an5Fxc= +go.opentelemetry.io/collector/exporter v1.54.0/go.mod h1:thsNaoV7xRq91sXkKsyFXHj0l2c/ZDM88Mdwe2/QP40= +go.opentelemetry.io/collector/exporter/exporterhelper v0.148.0 h1:mZXGdleKMaEF0jSOcCoOVRWwt3AcgSTAnIZmAqdDYNs= +go.opentelemetry.io/collector/exporter/exporterhelper v0.148.0/go.mod h1:+EZCJ6vlgQiozHvUoeEJHnIaV6Ez7HHOLdNWNpo+CUc= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.148.0 h1:LpTc/OsKXy/MBIdpCJ0VC9BCJreH5JUE8DIaNRlw488= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.148.0/go.mod h1:bc03Yf1kCAG4LwkztlOR9NXKBZ6dMfnJLV6SL77zAzQ= +go.opentelemetry.io/collector/exporter/exportertest v0.148.0 h1:joLVWwfWDk7idnikGPeOWOa7nJG1pG1+jGvuuOOB1/E= +go.opentelemetry.io/collector/exporter/exportertest v0.148.0/go.mod h1:R202E9bjYU4R+2jiDt+aiZSwsIZI3slL6M8y1MeuqkM= +go.opentelemetry.io/collector/exporter/xexporter v0.148.0 h1:QKMwwrUe4snzB9B97NaBtf9qFEeIjx4/oBSwv8EZbJc= +go.opentelemetry.io/collector/exporter/xexporter v0.148.0/go.mod h1:rZ60Z9Ny4H+IX5dsn+RiJEJQRNEXAEYZ6XFwE2EWxGU= +go.opentelemetry.io/collector/extension v1.54.0 h1:nF+pPfXWcWXjauX0+E1gsWUlUdAe2+26VKIb9hKZJAk= +go.opentelemetry.io/collector/extension v1.54.0/go.mod h1:hqjEnkrjjxLXjzyDnLsOJnWMLWkfEjbqm8CHj1ud5pY= +go.opentelemetry.io/collector/extension/extensionauth v1.54.0 h1:IglgKxygOcGCCCB31bBxOYwtB8h1oQ2MXVGWKV0k1C0= +go.opentelemetry.io/collector/extension/extensionauth v1.54.0/go.mod h1:5SXF5D0r+uhrHU50xCXAnJ1HNmSDDuXamD+fZdcYRLs= +go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.148.0 h1:k2Hk5VhnWkn5C79tkZ554KAydyf0awfaW6Ku/bttS6s= +go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.148.0/go.mod h1:LhiPIqE7pIDo0+Njo9gPtrAbpnx4tjzqVCP8C0UFBvQ= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.148.0 h1:nhIKJyE5YDy0KkI1mrULLBxMwLsq/EyeXQJJZDSRXHI= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.148.0/go.mod h1:WQEEnK/GdM4n5EwEUL5PYimT4JFYgGzUrT7yAe8yaxI= +go.opentelemetry.io/collector/extension/extensionmiddleware v0.148.0 h1:GdlmwwQ1IxExKL27Ou5YRCs91Z8QYzlENUOBax252bc= +go.opentelemetry.io/collector/extension/extensionmiddleware v0.148.0/go.mod h1:ySiHSkCzMcgphWdZiGYIPrFgaEGO2tPY3D0MipGsYpo= +go.opentelemetry.io/collector/extension/extensionmiddleware/extensionmiddlewaretest v0.148.0 h1:SgNl5DswPxs+gDH5Ojg8xyorogbxTqXoayLGZkvdB/A= +go.opentelemetry.io/collector/extension/extensionmiddleware/extensionmiddlewaretest v0.148.0/go.mod h1:WMKYe+WIhgCnXAmOtn69yY7tTZZqgSkx+lh1Y5tk3OI= +go.opentelemetry.io/collector/extension/extensiontest v0.148.0 h1:ZBrYWe+7oQQVqChXrq4PL1P/Febuo6un2/g7oQP9zfQ= +go.opentelemetry.io/collector/extension/extensiontest v0.148.0/go.mod h1:wLxKb/SkoqbStm6zv+9MAhzhySI49oGw2aszPaw9No4= +go.opentelemetry.io/collector/extension/xextension v0.148.0 h1:LoSXaI3jd7fhQbPdIDpXy0HC2j4ftsG7LlVrUrghtwA= +go.opentelemetry.io/collector/extension/xextension v0.148.0/go.mod h1:dlMQsSTo8Jgd+u8/ssdg0oIItQptkUIfX4zO9xy+hiE= +go.opentelemetry.io/collector/extension/zpagesextension v0.148.0 h1:s2M8HLykiRB7Ub5qyTsYoeJ5hR9MdsG9FJR9wricyVM= +go.opentelemetry.io/collector/extension/zpagesextension v0.148.0/go.mod h1:+x2vb3TFNtE32qCv6ScG//RpAYdAZYE6ok4Ua++DWkU= +go.opentelemetry.io/collector/featuregate v1.54.0 h1:ufo5Hy4Co9pcHVg24hyanm8qFG3TkkYbVyQXPVAbwDc= +go.opentelemetry.io/collector/featuregate v1.54.0/go.mod h1:PS7zY/zaCb28EqciePVwRHVhc3oKortTFXsi3I6ee4g= +go.opentelemetry.io/collector/internal/componentalias v0.148.0 h1:Y6MftNIZSzOr47TTj6A2z2UR3IwbeG46sAQshicGtDg= +go.opentelemetry.io/collector/internal/componentalias v0.148.0/go.mod h1:uwKzfehzwRgHxdHgFXYSBHNBeWSSqsqQYGWr5fk08G0= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.148.0 h1:Vy5HOsm6IODqbg7ZHaGizcs0mXXU7yZYFTH9Be0u4mM= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.148.0/go.mod h1:0wG5wD4+XPIrrS69j1DnUvCbfAvnhMqcrxPvQkWzdpo= +go.opentelemetry.io/collector/internal/telemetry v0.148.0 h1:7U/be+11agYLb67lzoRzsCBoDpaGy8vDFhgI1gGYcco= +go.opentelemetry.io/collector/internal/telemetry v0.148.0/go.mod h1:pvflQkIAaj5UwURlkaB8BNTaYw6OjmXTbiWQ75PnYqc= +go.opentelemetry.io/collector/internal/testutil v0.148.0 h1:3Z9hperte3vSmbBTYeNndoEUICICrNz8hzx+v0FYXBQ= +go.opentelemetry.io/collector/internal/testutil v0.148.0/go.mod h1:Jkjs6rkqs973LqgZ0Fe3zrokQRKULYXPIf4HuqStiEE= +go.opentelemetry.io/collector/otelcol v0.148.0 h1:MFhR9u5SMJG3WcT+ON0aV8CV7lIuBWo0o7DQM1TXWtE= +go.opentelemetry.io/collector/otelcol v0.148.0/go.mod h1:ocDXLyaKKJOPyb7A5Mr0VuIJWgqUtiL6qpispV/xVv8= +go.opentelemetry.io/collector/pdata v1.54.0 h1:3LharKb792cQ3VrUGxd3IcpWwfu3ST+GSTU382jVz1s= +go.opentelemetry.io/collector/pdata v1.54.0/go.mod h1:+MqC3VVOv/EX9YVFUo+mI4F0YmwJ+fXBYwjmu+mRiZ8= +go.opentelemetry.io/collector/pdata/pprofile v0.148.0 h1:MgrNZmqwhZGfiYwcKKtM/iXgTZqqvG5dUphriRXMZHU= +go.opentelemetry.io/collector/pdata/pprofile v0.148.0/go.mod h1:MTTMnZPqWX1S/rBDatU0W19udlycBkWuzVV5qnemHdc= +go.opentelemetry.io/collector/pdata/testdata v0.148.0 h1:yzakPuFgoKK8WcrlhyYHLMLA/kLScQKGsXkIgwieAQ8= +go.opentelemetry.io/collector/pdata/testdata v0.148.0/go.mod h1:2rFvxm8qwd3nlO90FtJw6ZGAjt+bLndxmQuJaMO9kfQ= +go.opentelemetry.io/collector/pdata/xpdata v0.148.0 h1:pTXz872QDl5oHByjlIEkQhIFvv0oeX/5cKNWsUg9KeY= +go.opentelemetry.io/collector/pdata/xpdata v0.148.0/go.mod h1:4iL8wugmu589aQNx0dFVT3Ecui/d3TEvVgMlAu8S//0= +go.opentelemetry.io/collector/pipeline v1.54.0 h1:jYlCkdFLITVBdeB+IGS07zXWywEgvT3Ky46vdKKT+Ks= +go.opentelemetry.io/collector/pipeline v1.54.0/go.mod h1:RD90NG3Jbk965Xaqym3JyHkuol4uZJjQVUkD9ddXJIs= +go.opentelemetry.io/collector/pipeline/xpipeline v0.148.0 h1:WTgUC/QXYxhWEwPQ0ezOMbkh4p4DzsRdCxdYLBqNz+U= +go.opentelemetry.io/collector/pipeline/xpipeline v0.148.0/go.mod h1:ECXG1qs+H1pUnK0Wu0MUlAbsUlzJOKhV9z4wqep6KWQ= +go.opentelemetry.io/collector/processor v1.54.0 h1:zmHBFiEFmU9ZYuHhVP3lHIkbfy+ueapzGpTdXVMcWBg= +go.opentelemetry.io/collector/processor v1.54.0/go.mod h1:L0lA6DZ0VbrtQBg44cmYfSpRlgm4zxW1I6QfBnRizPw= +go.opentelemetry.io/collector/processor/processortest v0.148.0 h1:p0k59frZxy/Z4fXe82i5eOJv/UyOH75XhI8nFD1ZWCE= +go.opentelemetry.io/collector/processor/processortest v0.148.0/go.mod h1:E2Li2gnkUXgvApvGyEtn3Eq5KyzV05ljfbFRsZ7sTC4= +go.opentelemetry.io/collector/processor/xprocessor v0.148.0 h1:v7Qv6k2b2cvgGWuTO5KN5QYDLl1r5sznt7Le4Fhpa4c= +go.opentelemetry.io/collector/processor/xprocessor v0.148.0/go.mod h1:r7ADpSX2nf0rZR9STxh956Qw1740QOWMXLnEM/ZiaF8= +go.opentelemetry.io/collector/receiver v1.54.0 h1:2e9o+eihZ/nJnzVj5JAcJ+VQ653HcZRiT127qBZRqa8= +go.opentelemetry.io/collector/receiver v1.54.0/go.mod h1:xFZnvYTBjdi9iS/d/UUXzss4h311mLsZliQFQXk4o/k= +go.opentelemetry.io/collector/receiver/receivertest v0.148.0 h1:Fu+B4jCqgZVZmhsKBz3tcgimFryR6TRAK2D5VGLD2Xc= +go.opentelemetry.io/collector/receiver/receivertest v0.148.0/go.mod h1:K8dMDMEggEg6jB688VOHutivOGEEZ20FJGe4jV9RtWU= +go.opentelemetry.io/collector/receiver/xreceiver v0.148.0 h1:u66Zi3udD9RMRiNOsZzsVcUjRwqJEK+5LV76Ry9l3K0= +go.opentelemetry.io/collector/receiver/xreceiver v0.148.0/go.mod h1:jyHxf8SOfH48ZXb32IS3vPbVYDinsLlZYQddyrveqMg= +go.opentelemetry.io/collector/service v0.148.0 h1:GsAx4nkGTB21QRK9hOTFmLcATN/mugLWsb3iQwt91nY= +go.opentelemetry.io/collector/service v0.148.0/go.mod h1:f7oBS9IdX0nLRtyPOIgPj0Q1HCqbxepgWJfEpyVNAfE= +go.opentelemetry.io/collector/service/hostcapabilities v0.148.0 h1:BHQV7Fa1y8fQ87V1ieXNpP4+7UGOAj66xWryXSSj27I= +go.opentelemetry.io/collector/service/hostcapabilities v0.148.0/go.mod h1:UwHkux+xSVl7k5PEl+qYi8VSONv538rgZeHhfYqBwmE= +go.opentelemetry.io/collector/service/telemetry/telemetrytest v0.148.0 h1:0KKY0VHy8y+6LRkW/jE7a2G96tK7rfpl/6hKCt3mHD4= +go.opentelemetry.io/collector/service/telemetry/telemetrytest v0.148.0/go.mod h1:uhEy3Ez2aJjGpAIYuy1C0NFO5yr86EJlJGoKFucXQFE= go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/contrib/otelconf v0.18.0 h1:ciF2Gf00BWs0DnexKFZXcxg9kJ8r3SUW1LOzW3CsKA8= -go.opentelemetry.io/contrib/otelconf v0.18.0/go.mod h1:FcP7k+JLwBLdOxS6qY6VQ/4b5VBntI6L6o80IMwhAeI= -go.opentelemetry.io/contrib/zpages v0.65.0 h1:mi6aZS4PRSDIOYmr8DB7mdKpuyL+Q7ivIhbq2UV+NrQ= -go.opentelemetry.io/contrib/zpages v0.65.0/go.mod h1:eMI6Q53htJ08b8+QxQsIjofw+oUSsT4ieNGu5fcimoU= -go.opentelemetry.io/ebpf-profiler v0.0.202606 h1:M2sod84uA6iNlKXmUMK9iJH7lul/3angJ8QvkLoAgLI= -go.opentelemetry.io/ebpf-profiler v0.0.202606/go.mod h1:juJNEKBb1n1SzMCAdIVgVeumwzPJswc62Ajd60hAfck= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 h1:ZVg+kCXxd9LtAaQNKBxAvJ5NpMf7LpvEr4MIZqb0TMQ= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0/go.mod h1:hh0tMeZ75CCXrHd9OXRYxTlCAdxcXioWHFIpYw2rZu8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 h1:djrxvDxAe44mJUrKataUbOhCKhR3F8QCyWucO16hTQs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0/go.mod h1:dt3nxpQEiSoKvfTVxp3TUg5fHPLhKtbcnN3Z1I1ePD0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 h1:NOyNnS19BF2SUDApbOKbDtWZ0IK7b8FJ2uAGdIWOGb0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0/go.mod h1:VL6EgVikRLcJa9ftukrHu/ZkkhFBSo1lzvdBC9CF1ss= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0 h1:9y5sHvAxWzft1WQ4BwqcvA+IFVUJ1Ya75mSAUnFEVwE= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0/go.mod h1:eQqT90eR3X5Dbs1g9YSM30RavwLF725Ris5/XSXWvqE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 h1:wVZXIWjQSeSmMoxF74LzAnpVQOAFDo3pPji9Y4SOFKc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0/go.mod h1:khvBS2IggMFNwZK/6lEeHg/W57h/IX6J4URh57fuI40= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= +go.opentelemetry.io/contrib/otelconf v0.22.0 h1:+kpcfczGOFM85zDZyqQCzWefhovegfn24D0WwmQz0n4= +go.opentelemetry.io/contrib/otelconf v0.22.0/go.mod h1:ojdbOukO+JRDJQmJY2PRIZEg0UYVzcOuZR59hp7xffc= +go.opentelemetry.io/contrib/zpages v0.67.0 h1:cIUwWSVDovuLEbDIKreptjdxMuIhGiqwq0uL8YNaq1c= +go.opentelemetry.io/contrib/zpages v0.67.0/go.mod h1:vK8fsYHgPYg4Z/XDbFSEvItSGZDbjWTvjBOu8+AiDhc= +go.opentelemetry.io/ebpf-profiler v0.0.202610 h1:CRmpVpzoGhff0nSjSab3/F24YB3KGX/MNv+rBzaFVsI= +go.opentelemetry.io/ebpf-profiler v0.0.202610/go.mod h1:YcOGWpHl5DRZQxxSLH9P2a4MI51eexSeSWODzPY5FTc= +go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= +go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 h1:icqq3Z34UrEFk2u+HMhTtRsvo7Ues+eiJVjaJt62njs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0/go.mod h1:W2m8P+d5Wn5kipj4/xmbt9uMqezEKfBjzVJadfABSBE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 h1:H7O6RlGOMTizyl3R08Kn5pdM06bnH8oscSj7o11tmLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0/go.mod h1:mBFWu/WOVDkWWsR7Tx7h6EpQB8wsv7P0Yrh0Pb7othc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 h1:uLXP+3mghfMf7XmV4PkGfFhFKuNWoCvvx5wP/wOXo0o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0/go.mod h1:v0Tj04armyT59mnURNUJf7RCKcKzq+lgJs6QSjHjaTc= go.opentelemetry.io/otel/exporters/prometheus v0.58.0 h1:CJAxWKFIqdBennqxJyOgnt5LqkeFRT+Mz3Yjz3hL+h8= go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.16.0 h1:ivlbaajBWJqhcCPniDqDJmRwj4lc6sRT+dCAVKNmxlQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.16.0/go.mod h1:u/G56dEKDDwXNCVLsbSrllB2o8pbtFLUC4HpR66r2dc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0 h1:MzfofMZN8ulNqobCmCAVbqVL5syHw+eB2qPRkCMA/fQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0/go.mod h1:E73G9UFtKRXrxhBsHtG00TB5WxX57lpsQzogDkqBTz8= -go.opentelemetry.io/otel/log v0.16.0 h1:DeuBPqCi6pQwtCK0pO4fvMB5eBq6sNxEnuTs88pjsN4= -go.opentelemetry.io/otel/log v0.16.0/go.mod h1:rWsmqNVTLIA8UnwYVOItjyEZDbKIkMxdQunsIhpUMes= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/log v0.16.0 h1:e/b4bdlQwC5fnGtG3dlXUrNOnP7c8YLVSpSfEBIkTnI= -go.opentelemetry.io/otel/sdk/log v0.16.0/go.mod h1:JKfP3T6ycy7QEuv3Hj8oKDy7KItrEkus8XJE6EoSzw4= -go.opentelemetry.io/otel/sdk/log/logtest v0.16.0 h1:/XVkpZ41rVRTP4DfMgYv1nEtNmf65XPPyAdqV90TMy4= -go.opentelemetry.io/otel/sdk/log/logtest v0.16.0/go.mod h1:iOOPgQr5MY9oac/F5W86mXdeyWZGleIx3uXO98X2R6Y= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= -go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= -go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= -go.opentelemetry.io/proto/slim/otlp v1.9.0 h1:fPVMv8tP3TrsqlkH1HWYUpbCY9cAIemx184VGkS6vlE= -go.opentelemetry.io/proto/slim/otlp v1.9.0/go.mod h1:xXdeJJ90Gqyll+orzUkY4bOd2HECo5JofeoLpymVqdI= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0 h1:o13nadWDNkH/quoDomDUClnQBpdQQ2Qqv0lQBjIXjE8= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0/go.mod h1:Gyb6Xe7FTi/6xBHwMmngGoHqL0w29Y4eW8TGFzpefGA= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0 h1:EiUYvtwu6PMrMHVjcPfnsG3v+ajPkbUeH+IL93+QYyk= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0/go.mod h1:mUUHKFiN2SST3AhJ8XhJxEoeVW12oqfXog0Bo8W3Ec4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 h1:KJVjPD3rcPb98rIs3HznyJlrfx9ge5oJvxxlGR+P/7s= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0/go.mod h1:K3kRa2ckmHWQaTWQdPRHc7qGXASuVuoEQXzrvlA98Ws= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 h1:s/1iRkCKDfhlh1JF26knRneorus8aOwVIDhvYx9WoDw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0/go.mod h1:UI3wi0FXg1Pofb8ZBiBLhtMzgoTm1TYkMvn71fAqDzs= +go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= +go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= +go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= +go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= +go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= +go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= +go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= +go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0 h1:l3mYuPsuBx6UKE47BVcPrZoZ0q/KER57vbj2qkgDLXA= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0/go.mod h1:7cHtiVJpZebB3wybTa4NG+FUo5NPe3PROz1FqB0+qdw= +go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= +go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= +go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= +go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.opentelemetry.io/proto/slim/otlp v1.10.0 h1:iR97Vs/ZDR+y9TfuP9b1XBtdPWeC+OMslIBmhcLU7jM= +go.opentelemetry.io/proto/slim/otlp v1.10.0/go.mod h1:lV9250stpjYLPNA5viFabIgP2QlUGRT1GdTgAf8SIUk= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.3.0 h1:RUF5rO0hAlgiJt1fzQVzcVs3vZVNHIcMLgOgG4rWNcQ= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.3.0/go.mod h1:I89cynRj8y+383o7tEQVg2SVA6SRgDVIouWPUVXjx0U= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.3.0 h1:CQvJSldHRUN6Z8jsUeYv8J0lXRvygALXIzsmAeCcZE0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.3.0/go.mod h1:xSQ+mEfJe/GjK1LXEyVOoSI1N9JV9ZI923X5kup43W4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -865,39 +907,51 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= -golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= -golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= -golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= +golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -907,20 +961,29 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo= -golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 h1:bTLqdHv7xrGlFbvf5/TXNxy/iUwwdkjhqQTJDjW7aj0= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= 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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= @@ -930,8 +993,9 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= -golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -942,10 +1006,10 @@ google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA= google.golang.org/api v0.257.0/go.mod h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M= -google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 h1:H86B94AW+VfJWDqFeEbBPhEtHzJwJfTbgE2lZa54ZAQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= +google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/examples v0.0.0-20230831183909-e498bbc9bd37 h1:kNDwMX0e15RGrBh4L1jfhVxyddRi6J/y8Gg+dcZr+S8= @@ -964,6 +1028,8 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mcuadros/go-syslog.v2 v2.3.0 h1:kcsiS+WsTKyIEPABJBJtoG0KkOS6yzvJ+/eZlhD79kk= gopkg.in/mcuadros/go-syslog.v2 v2.3.0/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/magefile.go b/magefile.go index 0320116b1c2..c2d385e420c 100644 --- a/magefile.go +++ b/magefile.go @@ -37,6 +37,7 @@ import ( "time" "github.com/elastic/elastic-agent/dev-tools/mage/otel" + "github.com/elastic/elastic-agent/dev-tools/mage/release" "github.com/jedib0t/go-pretty/v6/table" filecopy "github.com/otiai10/copy" @@ -179,6 +180,9 @@ type Otel mg.Namespace // Devmachine namespace contains tasks related to remote development machines. type Devmachine mg.Namespace +// Release namespace contains tasks for release automation. +type Release mg.Namespace + func CheckNoChanges() error { fmt.Println(">> fmt - go run") err := sh.RunV("go", "mod", "tidy", "-v") @@ -4378,3 +4382,75 @@ func getMacOSMajorVersion() (int, error) { return majorVer, nil } + +// UpdateVersion updates the version in version/version.go +func (Release) UpdateVersion(version string) error { + return release.UpdateVersion(version) +} + +// UpdateDocs updates version references in documentation and K8s manifests +func (Release) UpdateDocs(version string) error { + return release.UpdateDocs(version) +} + +// UpdateMergify adds a new backport rule to .mergify.yml +func (Release) UpdateMergify(version string) error { + return release.UpdateMergify(version) +} + +// PrepareMajorMinor prepares files for a major/minor release using env vars +func (Release) PrepareMajorMinor() error { + cfg, err := release.LoadReleaseConfigFromEnv() + if err != nil { + return err + } + return release.PrepareMajorMinorRelease(cfg) +} + +// CreateBranch creates a release branch with all changes committed +func (Release) CreateBranch() error { + cfg, err := release.LoadReleaseConfigFromEnv() + if err != nil { + return err + } + return release.CreateReleaseBranch(cfg, ".") +} + +// CreatePR creates a pull request for the release (requires GITHUB_TOKEN) +func (Release) CreatePR() error { + cfg, err := release.LoadReleaseConfigFromEnv() + if err != nil { + return err + } + + ghClient, err := release.NewGitHubClientFromEnv() + if err != nil { + return err + } + + return release.CreateReleasePR(cfg, ghClient) +} + +// RunMajorMinor orchestrates the complete major/minor release workflow +// Set DRY_RUN=true to preview changes without pushing +func (Release) RunMajorMinor() error { + cfg, err := release.LoadReleaseConfigFromEnv() + if err != nil { + return err + } + + dryRun := os.Getenv("DRY_RUN") == "true" + return release.RunMajorMinorRelease(cfg, dryRun) +} + +// RunPatch orchestrates the complete patch release workflow +// Set DRY_RUN=true to preview changes without pushing +func (Release) RunPatch() error { + cfg, err := release.LoadReleaseConfigFromEnv() + if err != nil { + return err + } + + dryRun := os.Getenv("DRY_RUN") == "true" + return release.RunPatchRelease(cfg, dryRun) +}