diff --git a/.gitattributes b/.gitattributes index be1c40c4a5..0080e1ec99 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ mise.lock linguist-generated +.mise/locks/** linguist-generated CHANGELOG.md linguist-generated **/src/main/generated/** linguist-generated docs/apidiffs/** linguist-generated diff --git a/.github/config/.release-please-manifest.json b/.github/config/.release-please-manifest.json index 099626f4fc..d9246ddf2c 100644 --- a/.github/config/.release-please-manifest.json +++ b/.github/config/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.8.0" + ".": "1.10.0" } diff --git a/.github/config/actionlint.yml b/.github/config/actionlint.yml new file mode 100644 index 0000000000..d1194fa216 --- /dev/null +++ b/.github/config/actionlint.yml @@ -0,0 +1,5 @@ +# actionlint 1.7.12 does not yet include the ubuntu-26.04 hosted runner label. +# Keep runner-label validation enabled while this repository uses that image. +self-hosted-runner: + labels: + - ubuntu-26.04 diff --git a/.github/config/flint.toml b/.github/config/flint.toml index 45ec061d45..690e8caffc 100644 --- a/.github/config/flint.toml +++ b/.github/config/flint.toml @@ -2,4 +2,4 @@ exclude = ["docs/themes/**", "mvnw", "simpleclient-archive/**"] [checks.renovate-deps] -exclude_managers = ["github-actions", "github-runners", "maven"] +exclude_managers = ["github-runners", "maven"] diff --git a/.github/config/lychee.toml b/.github/config/lychee.toml index d9c1cffa56..27f6f84dfc 100644 --- a/.github/config/lychee.toml +++ b/.github/config/lychee.toml @@ -16,6 +16,9 @@ exclude = [ # excluding links to pull requests and issues is done for performance "^https://github.com/prometheus/client_java/(issues|pull)/\\d+$", + # Slack workspace links return 403 to unauthenticated link checkers + "^https://cloud-native\\.slack\\.com/?$", + # exclude localhost URLs as they require running services "^http://localhost", "^https://localhost", diff --git a/.github/config/release-please-config.json b/.github/config/release-please-config.json index b7986d08e4..7561bba7d6 100644 --- a/.github/config/release-please-config.json +++ b/.github/config/release-please-config.json @@ -4,7 +4,57 @@ "pull-request-footer": "> [!IMPORTANT]\n> Close and reopen this PR to trigger CI checks.", "packages": { ".": { - "release-type": "maven" + "release-type": "maven", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "deps", + "section": "Dependencies" + }, + { + "type": "docs", + "section": "Internal" + }, + { + "type": "style", + "section": "Internal" + }, + { + "type": "chore", + "section": "Internal" + }, + { + "type": "refactor", + "section": "Internal" + }, + { + "type": "test", + "section": "Internal" + }, + { + "type": "build", + "section": "Internal" + }, + { + "type": "ci", + "section": "Internal" + }, + { + "type": "revert", + "section": "Internal" + } + ] } } } diff --git a/.github/renovate-tracked-deps.json b/.github/renovate-tracked-deps.json index 4f3f8c203e..af9b26ba66 100644 --- a/.github/renovate-tracked-deps.json +++ b/.github/renovate-tracked-deps.json @@ -12,100 +12,222 @@ ] }, ".github/workflows/acceptance-tests.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/api-diff.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ] + }, + ".github/workflows/approve-workflows.yml": { + "github-actions": [ + "prometheus/promci", + "ubuntu" ] }, ".github/workflows/build.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/bump-api-diff-baseline.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ] + }, + ".github/workflows/codeql.yml": { + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/setup-java", + "github/codeql-action", + "ubuntu" + ] + }, + ".github/workflows/detect-api-changes.yml": { + "github-actions": [ + "ubuntu" ] }, ".github/workflows/generate-protobuf.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/download-artifact", + "actions/upload-artifact", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/github-pages.yaml": { - "regex": [ - "mise" + "github-actions": [ + "actions/checkout", + "actions/configure-pages", + "actions/deploy-pages", + "actions/upload-pages-artifact", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ] + }, + ".github/workflows/issue-management-stale-action.yml": { + "github-actions": [ + "actions/stale", + "ubuntu" ] }, ".github/workflows/java-version-matrix-tests.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/jmx-exporter-compatibility.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/lint.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/micrometer-compatibility.yml": { + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ], "regex": [ - "micrometer-metrics/micrometer", - "mise", - "zeitlinger/micrometer" + "micrometer-metrics/micrometer" + ] + }, + ".github/workflows/multi-version-test.yml": { + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/setup-java", + "ubuntu" ] }, ".github/workflows/native-tests.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, ".github/workflows/nightly-benchmarks.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/download-artifact", + "actions/upload-artifact", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ] + }, + ".github/workflows/pr-benchmark-report.yml": { + "github-actions": [ + "ubuntu" ] }, ".github/workflows/pr-benchmarks.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/download-artifact", + "actions/upload-artifact", + "jdx/mise", + "jdx/mise-action", + "ubuntu" + ] + }, + ".github/workflows/pr-title.yml": { + "github-actions": [ + "grafana/shared-workflows", + "ubuntu" ] }, ".github/workflows/regenerate-api-diff-otel.yml": { - "regex": [ - "mise" + "github-actions": [ + "actions/cache", + "actions/checkout", + "actions/download-artifact", + "actions/upload-artifact", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, - ".github/workflows/release.yml": { - "regex": [ - "mise" + ".github/workflows/release-please.yml": { + "github-actions": [ + "googleapis/release-please-action", + "ubuntu" ] }, - ".github/workflows/test-release-build.yml": { - "regex": [ - "mise" + ".github/workflows/release.yml": { + "github-actions": [ + "actions/checkout", + "actions/setup-java", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, - ".mise/envs/jmx-exporter/mise.toml": { - "mise": [ - "java" + ".github/workflows/scorecard.yml": { + "github-actions": [ + "actions/checkout", + "actions/upload-artifact", + "github/codeql-action", + "ossf/scorecard-action", + "ubuntu" ] }, - ".mise/envs/micrometer/mise.toml": { - "mise": [ - "java" + ".github/workflows/test-release-build.yml": { + "github-actions": [ + "actions/cache", + "actions/checkout", + "jdx/mise", + "jdx/mise-action", + "ubuntu" ] }, - ".mise/envs/native/mise.toml": { - "mise": [ - "java" + ".mise/locks/npm-renovate/44.82.0~026f02c4/package.json": { + "npm": [ + "renovate" ] }, ".mvn/wrapper/maven-wrapper.properties": { @@ -158,11 +280,13 @@ "mise": [ "actionlint", "aqua:grafana/flint", + "aqua:grafana/gcx", + "aqua:grafana/oats", "aqua:jonwiggins/xmloxide", "aqua:owenlamont/ryl", "biome", + "checkstyle", "editorconfig-checker", - "go:github.com/grafana/oats", "google-java-format", "hugo", "java", @@ -194,5 +318,76 @@ "maven-wrapper" ] } + }, + "actionMeta": { + "actions/cache": { + "packageName": "actions/cache", + "refKind": "version-tag" + }, + "actions/checkout": { + "packageName": "actions/checkout", + "refKind": "version-tag" + }, + "actions/configure-pages": { + "packageName": "actions/configure-pages", + "refKind": "version-tag" + }, + "actions/deploy-pages": { + "packageName": "actions/deploy-pages", + "refKind": "version-tag" + }, + "actions/download-artifact": { + "packageName": "actions/download-artifact", + "refKind": "version-tag" + }, + "actions/setup-java": { + "packageName": "actions/setup-java", + "refKind": "version-tag" + }, + "actions/stale": { + "packageName": "actions/stale", + "refKind": "version-tag" + }, + "actions/upload-artifact": { + "packageName": "actions/upload-artifact", + "refKind": "version-tag" + }, + "actions/upload-pages-artifact": { + "packageName": "actions/upload-pages-artifact", + "refKind": "version-tag" + }, + "github/codeql-action/analyze": { + "packageName": "github/codeql-action", + "refKind": "version-tag" + }, + "github/codeql-action/init": { + "packageName": "github/codeql-action", + "refKind": "version-tag" + }, + "github/codeql-action/upload-sarif": { + "packageName": "github/codeql-action", + "refKind": "version-tag" + }, + "googleapis/release-please-action": { + "packageName": "googleapis/release-please-action", + "refKind": "version-tag" + }, + "grafana/shared-workflows/actions/lint-pr-title": { + "packageName": "grafana/shared-workflows", + "refKind": "version-tag", + "compatibility": "lint-pr-title" + }, + "jdx/mise-action": { + "packageName": "jdx/mise-action", + "refKind": "version-tag" + }, + "ossf/scorecard-action": { + "packageName": "ossf/scorecard-action", + "refKind": "version-tag" + }, + "prometheus/promci/approve_workflows": { + "packageName": "prometheus/promci", + "refKind": "version-tag" + } } } diff --git a/.github/renovate.json5 b/.github/renovate.json5 index e0f47d2a1f..6d2af46d9a 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,75 +1,134 @@ { - $schema: "https://docs.renovatebot.com/renovate-schema.json", - extends: ["config:best-practices", "config:recommended", "github>grafana/flint#v0.22.7"], - platformCommit: "enabled", + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + extends: [ + 'config:best-practices', + 'config:recommended', + 'github>grafana/flint#v0.22.14', + ], + platformCommit: 'enabled', + semanticCommits: 'enabled', + semanticCommitType: 'deps', automerge: true, ignorePaths: [ - "**/simpleclient-archive/**", + '**/simpleclient-archive/**', // old projects // agent resources packages an OTel API that is the minimum required API version - "**/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml", + '**/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml', + ], + labels: [ + 'dependencies', ], - labels: ["dependencies"], + mise: { + 'updatePinnedDependencies': false + }, packageRules: [ { - matchFileNames: ["mise.toml"], - matchDepNames: ["java"], - groupName: "java temurin", - additionalBranchPrefix: "temurin-", + description: 'Update component-prefixed shared-workflow action tags', + matchManagers: [ + 'github-actions', + ], + matchPackageNames: [ + 'grafana/shared-workflows', + ], + matchCurrentValue: '/^.+[-/]v?\\d+\\.\\d+(?:\\.\\d+)?$/', + overrideDatasource: 'github-tags', + versioning: 'regex:^(?.*)[-/]v?(?\\d+)\\.(?\\d+)(?:\\.(?\\d+))?$', }, { - matchFileNames: [".mise/envs/native/mise.toml"], - matchDepNames: ["java"], - groupName: "java graalvm", - additionalBranchPrefix: "graalvm-", + matchFileNames: [ + 'mise.toml', + ], + matchDepNames: [ + 'java', + ], + matchDepTypes: [ + 'tools', + ], + groupName: 'java temurin', + additionalBranchPrefix: 'temurin-', }, { - description: "Compat tests pin an LTS JDK the upstream release supports; block major JDK bumps that would break those builds", - matchFileNames: [".mise/envs/jmx-exporter/mise.toml", ".mise/envs/micrometer/mise.toml"], - matchDepNames: ["java"], - matchUpdateTypes: ["major"], - enabled: false, + matchFileNames: [ + 'mise.toml', + ], + matchDepNames: [ + 'java', + ], + matchDepTypes: [ + 'task-native-test-tools', + ], + groupName: 'java graalvm', + additionalBranchPrefix: 'graalvm-', }, { - matchPackageNames: ["io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha"], + matchPackageNames: [ + 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha', + ], ignoreUnstable: false, }, { enabled: false, - description: "Ignore internal project modules", - matchPackageNames: ["/^io\\.prometheus:(prometheus-metrics-bom|examples|example-.+|integration-tests|it-.+)$/"], + description: 'Ignore internal project modules', + matchPackageNames: [ + '/^io\\.prometheus:(prometheus-metrics-bom|examples|example-.+|integration-tests|it-.+)$/', + ], }, { - description: "Group protobuf-java and protoc together so generated code can be updated in one PR", - matchDepNames: ["com.google.protobuf:protobuf-java", "protoc"], - groupName: "protobuf", + description: 'Group protobuf-java and protoc together so generated code can be updated in one PR', + matchDepNames: [ + 'com.google.protobuf:protobuf-java', + 'protoc', + ], + groupName: 'protobuf', separateMajorMinor: false, }, + { + description: 'Update the Micrometer typed-descriptor compatibility ref weekly', + matchManagers: [ + 'custom.regex', + ], + matchDatasources: [ + 'git-refs', + ], + matchDepNames: [ + 'micrometer-metrics/micrometer', + ], + matchCurrentValue: 'main', + schedule: [ + 'on sunday', + ], + }, ], customManagers: [ - { - "customType": "regex", - "description": "update _VERSION variables in mise.toml", - "managerFilePatterns": ["/^mise\\.toml$/"], - "matchStrings": [ - "# renovate: datasource=(?[a-z-]+?)(?: depName=(?.+?))?(?: packageName=(?.+?))?(?: versioning=(?[a-z-]+?))?\\s.+?_VERSION\\s*=\\s*\"?(?[^@\"]+?)(?:@(?sha256:[a-f0-9]+))?\"?\\s" - ] - }, - { - customType: "regex", - description: "track the latest Micrometer release for upstream compatibility", - managerFilePatterns: ["/^\\.github\\/workflows\\/micrometer-compatibility\\.yml$/"], - matchStrings: [ - "# renovate: datasource=(?\\S+) depName=(?\\S+) packageName=(?\\S+)\\n\\s*ref:\\s*(?v[0-9][^\\s]*)", - ], - }, - { - customType: "regex", - description: "pin the Micrometer typed-descriptor compatibility ref", - managerFilePatterns: ["/^\\.github\\/workflows\\/micrometer-compatibility\\.yml$/"], - matchStrings: [ - "# renovate: datasource=(?\\S+) depName=(?\\S+) packageName=(?\\S+) currentValue=(?\\S+)\\n\\s*ref:\\s*(?[a-f0-9]{40})", - ], - }, + { + customType: 'regex', + description: 'update _VERSION variables in mise.toml', + managerFilePatterns: [ + '/^mise\\.toml$/', + ], + matchStrings: [ + '# renovate: datasource=(?[a-z-]+?)(?: depName=(?.+?))?(?: packageName=(?.+?))?(?: versioning=(?[a-z-]+?))?\\s.+?_VERSION\\s*=\\s*"?(?[^@"]+?)(?:@(?sha256:[a-f0-9]+))?"?\\s', + ], + }, + { + customType: 'regex', + description: 'track the latest Micrometer release for upstream compatibility', + managerFilePatterns: [ + '/^\\.github\\/workflows\\/micrometer-compatibility\\.yml$/', + ], + matchStrings: [ + '# renovate: datasource=(?\\S+) depName=(?\\S+) packageName=(?\\S+)\\n\\s*ref:\\s*(?v[0-9][^\\s]*)', + ], + }, + { + customType: 'regex', + description: 'pin the Micrometer typed-descriptor compatibility ref', + managerFilePatterns: [ + '/^\\.github\\/workflows\\/micrometer-compatibility\\.yml$/', + ], + matchStrings: [ + '# renovate: datasource=(?\\S+) depName=(?\\S+) packageName=(?\\S+) currentValue=(?\\S+)\\n\\s*ref:\\s*(?[a-f0-9]{40})', + ], + }, ], } diff --git a/.github/workflows/acceptance-tests.yml b/.github/workflows/acceptance-tests.yml index 457568672a..890b9eadb3 100644 --- a/.github/workflows/acceptance-tests.yml +++ b/.github/workflows/acceptance-tests.yml @@ -7,15 +7,15 @@ permissions: {} jobs: acceptance-tests: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Check out with: persist-credentials: false - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Run acceptance tests run: mise run acceptance-test diff --git a/.github/workflows/api-diff.yml b/.github/workflows/api-diff.yml index 6d4a83f37d..91e0d4dd62 100644 --- a/.github/workflows/api-diff.yml +++ b/.github/workflows/api-diff.yml @@ -22,20 +22,20 @@ permissions: jobs: api-diff: if: ${{ !startsWith(github.head_ref, 'release-please--branches--') }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 env: # Empty unless overridden via workflow_dispatch; the api-diff task then # falls back to in pom.xml. API_DIFF_BASELINE_VERSION: ${{ inputs.baseline_version }} steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: diff --git a/.github/workflows/approve-workflows.yml b/.github/workflows/approve-workflows.yml index adbcb48175..697118dfc1 100644 --- a/.github/workflows/approve-workflows.yml +++ b/.github/workflows/approve-workflows.yml @@ -15,13 +15,13 @@ jobs: if: >- github.event.issue.pull_request && github.event.comment.body == '/workflow-approve' && - github.repository_owner == 'prometheus' + (github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community') runs-on: ubuntu-latest permissions: actions: write contents: read pull-requests: write steps: - - uses: prometheus/promci/approve_workflows@370e8c15dcec50043cbe66f2f34633d9efc0a190 + - uses: prometheus/promci/approve_workflows@872d318d090d73df349cb6ed90aadd072ca478f7 # v0.10.0 with: github_token: ${{ github.token }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b6009e1ab1..d1a778b207 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,15 +7,15 @@ permissions: {} jobs: build: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: diff --git a/.github/workflows/bump-api-diff-baseline.yml b/.github/workflows/bump-api-diff-baseline.yml index 4df5ee582c..1f8d306e7b 100644 --- a/.github/workflows/bump-api-diff-baseline.yml +++ b/.github/workflows/bump-api-diff-baseline.yml @@ -25,18 +25,18 @@ env: jobs: bump: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: write # push to the snapshot PR branch steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: ${{ env.SNAPSHOT_BRANCH }} persist-credentials: true - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index b0295def69..85aa6aa198 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -14,22 +14,22 @@ permissions: {} jobs: analyze: name: Analyze Java - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: actions: read # required for github/codeql-action/init to get workflow details contents: read security-events: write # required for github/codeql-action/analyze to upload SARIF steps: - name: Checkout repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - name: Set up Java - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5 + uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: distribution: temurin - java-version: "25" + java-version: "25.0.4+101.0.LTS" - name: Cache Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -37,7 +37,7 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-codeql-${{ hashFiles('**/pom.xml') }} - name: Initialize CodeQL - uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: languages: java tools: linked @@ -56,6 +56,6 @@ jobs: -Djavadoc.skip=true - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: category: /language:java diff --git a/.github/workflows/detect-api-changes.yml b/.github/workflows/detect-api-changes.yml index f0de28c7a4..030af0bbba 100644 --- a/.github/workflows/detect-api-changes.yml +++ b/.github/workflows/detect-api-changes.yml @@ -18,7 +18,7 @@ permissions: {} jobs: detect-api-changes: if: github.repository == 'prometheus/client_java' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: issues: write pull-requests: write diff --git a/.github/workflows/generate-protobuf.yml b/.github/workflows/generate-protobuf.yml index 60483ade7c..eee0201e2f 100644 --- a/.github/workflows/generate-protobuf.yml +++ b/.github/workflows/generate-protobuf.yml @@ -10,18 +10,18 @@ permissions: {} jobs: generate: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read # checkout + read-only `git fetch origin main` for the verify step steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: ${{ github.ref }} persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: @@ -33,15 +33,33 @@ jobs: run: | git fetch origin main DIFF_POM=$(git diff origin/main -- pom.xml) - DIFF_MISE=$(git diff origin/main -- mise.toml) if ! echo "$DIFF_POM" | grep -q 'protobuf-java.version'; then echo "::error::protobuf-java not updated in pom.xml" exit 1 fi - if ! echo "$DIFF_MISE" | grep -q 'protoc'; then - echo "::error::protoc not updated in mise.toml" - exit 1 - fi + python3 - <<'PY' + import subprocess + import tomllib + + def protoc_version(text): + return tomllib.loads(text)["tools"]["protoc"][0]["version"] + + base_lock = subprocess.run( + ["git", "show", "origin/main:mise.lock"], + check=True, + capture_output=True, + text=True, + ).stdout + with open("mise.lock", "rb") as lock_file: + current_lock = tomllib.load(lock_file) + base_version = protoc_version(base_lock) + current_version = current_lock["tools"]["protoc"][0]["version"] + if base_version == current_version: + raise SystemExit( + f"protoc version unchanged in mise.lock ({current_version})" + ) + print(f"protoc updated: {base_version} -> {current_version}") + PY - name: Generate protobuf sources run: mise run generate - name: Validate and export generated sources as a patch @@ -56,25 +74,25 @@ jobs: git add -A -- '*.java' git diff --cached --binary > /tmp/protobuf-sources.patch - name: Upload generated patch - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: protobuf-sources-patch path: /tmp/protobuf-sources.patch retention-days: 5 publish: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: generate permissions: contents: write # push regenerated sources back to the renovate branch steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: ${{ github.ref }} # zizmor: ignore[artipacked] -- needs credentials to push persist-credentials: true - name: Download generated patch - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: name: protobuf-sources-patch path: /tmp/patch diff --git a/.github/workflows/github-pages.yaml b/.github/workflows/github-pages.yaml index 310a023bf1..0032c75c5e 100644 --- a/.github/workflows/github-pages.yaml +++ b/.github/workflows/github-pages.yaml @@ -30,17 +30,17 @@ jobs: # Build job build: if: github.repository == 'prometheus/client_java' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false fetch-tags: "true" fetch-depth: 0 - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 cache: "false" - name: Setup Pages id: pages @@ -65,9 +65,9 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: build steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5 + uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5 diff --git a/.github/workflows/issue-management-stale-action.yml b/.github/workflows/issue-management-stale-action.yml index e90b120a53..f0a2947452 100644 --- a/.github/workflows/issue-management-stale-action.yml +++ b/.github/workflows/issue-management-stale-action.yml @@ -25,7 +25,7 @@ jobs: # Handle stale PRs # - After 120 days inactive: Adds "stale" label + warning comment # - After 30 more days inactive: Closes - - uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 # v10.4.0 + - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 with: days-before-issue-stale: -1 days-before-issue-close: -1 @@ -43,7 +43,7 @@ jobs: # Handle stale issues # - After 360 days (12 months) inactive: Adds "stale" label + warning comment # - After 30 more days inactive: Closes - - uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 # v10.4.0 + - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 with: days-before-issue-stale: 360 days-before-issue-close: 30 diff --git a/.github/workflows/java-version-matrix-tests.yml b/.github/workflows/java-version-matrix-tests.yml index 83e13d7d4e..2747bd2172 100644 --- a/.github/workflows/java-version-matrix-tests.yml +++ b/.github/workflows/java-version-matrix-tests.yml @@ -19,22 +19,22 @@ permissions: {} jobs: integration-tests: name: Java ${{ matrix.java-version }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 strategy: fail-fast: false matrix: java-version: [8, 11, 17, 21, 25] steps: - name: Check out - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Set up mise - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 diff --git a/.github/workflows/jmx-exporter-compatibility.yml b/.github/workflows/jmx-exporter-compatibility.yml index 4869559277..135310a139 100644 --- a/.github/workflows/jmx-exporter-compatibility.yml +++ b/.github/workflows/jmx-exporter-compatibility.yml @@ -17,24 +17,22 @@ permissions: {} jobs: jmx-exporter-compatibility: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 - working_directory: .mise/envs/jmx-exporter + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - name: Run JMX Exporter compatibility tests - working-directory: .mise/envs/jmx-exporter env: JMX_EXPORTER_REPOSITORY: ${{ inputs.repository || 'prometheus/jmx_exporter' }} JMX_EXPORTER_REF: ${{ inputs.ref }} - run: mise compat-test + run: mise run jmx-exporter:compat-test diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c9b20142ea..099ca1683d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,23 +8,23 @@ permissions: {} jobs: lint: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read steps: - name: Checkout code - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false fetch-depth: 0 # needed for git diff --merge-base in lint:links - name: Setup mise - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Lint env: @@ -34,3 +34,9 @@ jobs: GITHUB_HEAD_REF: ${{ github.head_ref }} PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} run: mise run lint + + - name: Test benchmark tooling + run: | + for test_file in .mise/tasks/test_*.py; do + python3 -B "$test_file" + done diff --git a/.github/workflows/micrometer-compatibility.yml b/.github/workflows/micrometer-compatibility.yml index e13198be4c..7b9591ed64 100644 --- a/.github/workflows/micrometer-compatibility.yml +++ b/.github/workflows/micrometer-compatibility.yml @@ -10,7 +10,7 @@ permissions: {} jobs: compat-test: name: ${{ matrix.name }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 strategy: fail-fast: false matrix: @@ -18,38 +18,36 @@ jobs: - name: upstream repository: micrometer-metrics/micrometer # renovate: datasource=github-releases depName=micrometer-metrics/micrometer packageName=micrometer-metrics/micrometer - ref: v1.17.0 - - name: typed-descriptor - # TODO: remove this temporary opt-in leg once Micrometer switches the - # Prometheus client integration to typed descriptors by default. + ref: v1.17.1 + - name: upstream-main + # Track upstream main until the typed-descriptor change is included + # in a Micrometer release. # Follow-up: https://github.com/prometheus/client_java/issues/2182 - repository: zeitlinger/micrometer - # renovate: datasource=git-refs depName=zeitlinger/micrometer packageName=https://github.com/zeitlinger/micrometer currentValue=feat/prom-client-java-typed-family-descriptor - ref: 8f90b70807f5a063c592e3b17ef3b908be894086 + repository: micrometer-metrics/micrometer + # renovate: datasource=git-refs depName=micrometer-metrics/micrometer packageName=https://github.com/micrometer-metrics/micrometer currentValue=main + ref: 29cfb5cf7e251540b7331ed67665bd3ed99c7ad4 steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 - working_directory: .mise/envs/micrometer + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - name: Run Micrometer compatibility tests - working-directory: .mise/envs/micrometer env: MICROMETER_REPOSITORY: ${{ matrix.repository }} MICROMETER_REF: ${{ matrix.ref }} - run: mise compat-test + run: mise run micrometer:compat-test micrometer-compatibility: name: micrometer-compatibility - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: compat-test if: always() steps: diff --git a/.github/workflows/multi-version-test.yml b/.github/workflows/multi-version-test.yml index 2ae27bc02e..e4ae2eef25 100644 --- a/.github/workflows/multi-version-test.yml +++ b/.github/workflows/multi-version-test.yml @@ -8,20 +8,20 @@ permissions: {} jobs: compatibility-test: name: Test on Java ${{ matrix.java }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 strategy: fail-fast: false matrix: java: [17, 21, 25] steps: - name: Check out - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - name: Set up Java ${{ matrix.java }} id: setup-java - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5 + uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: distribution: "temurin" java-version: ${{ matrix.java }} diff --git a/.github/workflows/native-tests.yml b/.github/workflows/native-tests.yml index 6352f57a14..62078cedce 100644 --- a/.github/workflows/native-tests.yml +++ b/.github/workflows/native-tests.yml @@ -7,17 +7,15 @@ permissions: {} jobs: native-tests: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - name: Check out with: persist-credentials: false - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 - working_directory: .mise/envs/native + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Run native tests - working-directory: .mise/envs/native - run: mise native-test + run: mise run native-test diff --git a/.github/workflows/nightly-benchmarks.yml b/.github/workflows/nightly-benchmarks.yml index 0cde105bc6..30f9350c54 100644 --- a/.github/workflows/nightly-benchmarks.yml +++ b/.github/workflows/nightly-benchmarks.yml @@ -23,21 +23,21 @@ defaults: jobs: benchmark: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read # checkout only steps: - name: Checkout main branch - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false fetch-depth: 0 - name: Setup mise - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -62,27 +62,27 @@ jobs: GITHUB_REPOSITORY: ${{ github.repository }} - name: Upload benchmark results - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: benchmark-results path: benchmark-results retention-days: 5 publish: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: benchmark permissions: contents: write # push generated results to the benchmarks branch steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: # zizmor: ignore[artipacked] -- needs credentials to push to benchmarks branch persist-credentials: true fetch-depth: 0 - name: Download benchmark results - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: name: benchmark-results path: /tmp/benchmark-output diff --git a/.github/workflows/pr-benchmark-report.yml b/.github/workflows/pr-benchmark-report.yml index 25e3d848eb..41af4151fe 100644 --- a/.github/workflows/pr-benchmark-report.yml +++ b/.github/workflows/pr-benchmark-report.yml @@ -16,8 +16,9 @@ jobs: comment: if: > github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion != 'cancelled' - runs-on: ubuntu-24.04 + github.event.workflow_run.conclusion != 'cancelled' && + github.event.workflow_run.conclusion != 'skipped' + runs-on: ubuntu-26.04 permissions: actions: read contents: read diff --git a/.github/workflows/pr-benchmarks.yml b/.github/workflows/pr-benchmarks.yml index 0e38c28692..f549e29ca2 100644 --- a/.github/workflows/pr-benchmarks.yml +++ b/.github/workflows/pr-benchmarks.yml @@ -18,68 +18,90 @@ defaults: jobs: benchmark: if: github.event.label.name == 'benchmark' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 strategy: fail-fast: false matrix: include: - - name: base - repository: ${{ github.repository }} - ref: ${{ github.event.pull_request.base.sha }} - sha: ${{ github.event.pull_request.base.sha }} - - name: head - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - sha: ${{ github.event.pull_request.head.sha }} + - topic: counter + pattern: 'CounterBenchmark[.]prometheus.*' + - topic: histogram + pattern: 'HistogramBenchmark[.]prometheus.*' + - topic: exposition + pattern: HistogramTextFormatBenchmark|TextFormatUtilBenchmark permissions: contents: read # checkout only env: HEAD_SHA: ${{ github.event.pull_request.head.sha }} PR_NUMBER: ${{ github.event.pull_request.number }} + JMH_PATTERN: ${{ matrix.pattern }} steps: - - name: Checkout ${{ matrix.name }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - name: Checkout PR base + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - repository: ${{ matrix.repository }} - ref: ${{ matrix.ref }} + repository: ${{ github.repository }} + ref: ${{ github.event.pull_request.base.sha }} persist-credentials: false fetch-depth: 0 - name: Setup mise - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ~/.m2/repository - key: ${{ runner.os }}-pr-bench-maven-${{ matrix.name }}-${{ matrix.sha }} + key: ${{ runner.os }}-pr-bench-maven-${{ matrix.topic }}-${{ env.HEAD_SHA }} restore-keys: | + ${{ runner.os }}-pr-bench-maven-${{ matrix.topic }}- ${{ runner.os }}-pr-bench-maven- ${{ runner.os }}-maven- - - name: Run ${{ matrix.name }} JMH benchmarks - run: mise run benchmark:ci-json - - - name: Capture ${{ matrix.name }} runner info + - name: Capture runner info run: | python3 ./.mise/tasks/generate_benchmark_summary.py \ - --write-system-info runner-info.json + --write-system-info /tmp/runner-info.json + + - name: Run base ${{ matrix.topic }} benchmarks + run: mise run benchmark:ci-json + env: + JMH_ARGS: -f 3 -wi 3 -i 5 ${{ env.JMH_PATTERN }} - - name: Upload ${{ matrix.name }} raw benchmark results - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + - name: Save base ${{ matrix.topic }} results + run: mv benchmark-results.json /tmp/base-results.json + + - name: Checkout PR head + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - name: pr-benchmark-raw-${{ matrix.name }}-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + persist-credentials: false + fetch-depth: 0 + + - name: Run head ${{ matrix.topic }} benchmarks + run: mise run benchmark:ci-json + env: + JMH_ARGS: -f 3 -wi 3 -i 5 ${{ env.JMH_PATTERN }} + + - name: Save head ${{ matrix.topic }} results + run: mv benchmark-results.json /tmp/head-results.json + + - name: Upload ${{ matrix.topic }} benchmark results + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: pr-benchmark-topic-${{ matrix.topic }}-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} path: | - benchmark-results.json - runner-info.json + /tmp/base-results.json + /tmp/head-results.json + /tmp/runner-info.json retention-days: 5 summarize: if: github.event.label.name == 'benchmark' - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: benchmark permissions: contents: read # checkout only @@ -88,35 +110,49 @@ jobs: PR_NUMBER: ${{ github.event.pull_request.number }} steps: - name: Checkout PR head - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.sha }} persist-credentials: false fetch-depth: 0 - - name: Download base benchmark results - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + - name: Download topic benchmark results + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: - name: pr-benchmark-raw-base-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} - path: /tmp/base-benchmark-results + pattern: pr-benchmark-topic-*-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} + path: /tmp/topic-benchmark-results - - name: Download head benchmark results - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: pr-benchmark-raw-head-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} - path: /tmp/head-benchmark-results + - name: Merge topic benchmark results + run: | + python3 - <<'PY' + import json + from pathlib import Path + + root = Path('/tmp/topic-benchmark-results') + for name in ('base', 'head'): + files = sorted(root.glob(f'*/{name}-results.json')) + if not files: + raise SystemExit(f'No {name} benchmark result files found') + merged = [] + for file in files: + with open(file, 'r') as f: + merged.extend(json.load(f)) + with open(f'/tmp/{name}-benchmark-results.json', 'w') as f: + json.dump(merged, f) + f.write('\n') + PY - name: Generate benchmark summary run: | python3 ./.mise/tasks/generate_benchmark_summary.py \ - --input /tmp/head-benchmark-results/benchmark-results.json \ - --baseline /tmp/base-benchmark-results/benchmark-results.json \ - --system-info /tmp/head-benchmark-results/runner-info.json \ - --baseline-system-info /tmp/base-benchmark-results/runner-info.json \ + --input /tmp/head-benchmark-results.json \ + --baseline /tmp/base-benchmark-results.json \ --output-dir benchmark-results \ --commit-sha "${{ github.event.pull_request.head.sha }}" \ - --baseline-sha "${{ github.event.pull_request.base.sha }}" + --baseline-sha "${{ github.event.pull_request.base.sha }}" \ + --comparison-note \ + "Base and head are compared on the same runner within each topic." env: GITHUB_REPOSITORY: ${{ github.event.pull_request.head.repo.full_name }} GITHUB_BASE_REPOSITORY: ${{ github.repository }} @@ -126,14 +162,14 @@ jobs: cp benchmark-results/README.md pr-benchmark-comment.md - name: Upload PR benchmark results - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: pr-benchmark-results-pr-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} path: benchmark-results retention-days: 5 - name: Upload PR benchmark comment - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: pr-benchmark-comment-pr-${{ env.PR_NUMBER }}-${{ env.HEAD_SHA }} path: pr-benchmark-comment.md diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 5434323e04..7d4b715ca7 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -6,14 +6,14 @@ on: types: - opened - edited + - reopened + - synchronize permissions: {} jobs: - lint: + pr-title: runs-on: ubuntu-latest permissions: pull-requests: read # action-semantic-pull-request reads the PR title steps: - - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 - env: - GITHUB_TOKEN: ${{ github.token }} + - uses: grafana/shared-workflows/actions/lint-pr-title@70c40e5b6522c854a55334124545261cae3d4c73 # lint-pr-title/v1.2.4 diff --git a/.github/workflows/regenerate-api-diff-otel.yml b/.github/workflows/regenerate-api-diff-otel.yml index 9e91fcfa31..c3d30a365e 100644 --- a/.github/workflows/regenerate-api-diff-otel.yml +++ b/.github/workflows/regenerate-api-diff-otel.yml @@ -10,18 +10,18 @@ permissions: {} jobs: generate: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: read # checkout + read-only `git fetch origin main` for the verify step steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: ${{ github.ref }} persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: @@ -49,25 +49,25 @@ jobs: fi git diff --binary -- docs/apidiffs > /tmp/apidiffs.patch - name: Upload generated patch - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: apidiffs-patch path: /tmp/apidiffs.patch retention-days: 5 publish: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 needs: generate permissions: contents: write # push regenerated apidiffs back to the renovate branch steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: ref: ${{ github.ref }} # zizmor: ignore[artipacked] -- needs credentials to push persist-credentials: true - name: Download generated patch - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 with: name: apidiffs-patch path: /tmp/patch diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 9e2b1cf624..909bc891b6 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -11,7 +11,7 @@ permissions: {} jobs: release-please: if: ${{ github.repository == 'prometheus/client_java' }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 permissions: contents: write # release-please creates release commits, tags, and the GitHub release pull-requests: write # release-please opens/updates the release PR diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29d0416c2e..2aa8be559c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,10 @@ jobs: deploy: if: ${{ github.repository == 'prometheus/client_java' }} environment: release - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 + env: + # Artifact releases pair a focused tool allowlist with cache: false. + MISE_ENABLE_TOOLS: java permissions: actions: write # required to trigger bump-api-diff-baseline.yml via `gh workflow run` @@ -64,25 +67,25 @@ jobs: "If the GPG Key Expired" fi - name: Checkout Plugin Repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.tag }} persist-credentials: false - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 cache: false - name: Build release version run: mise run build-release - name: Set up Apache Maven Central - uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5 + uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6 with: distribution: "temurin" - java-version: "21" + java-version: "25.0.4+101.0.LTS" server-id: ossrh server-username: MAVEN_USERNAME server-password: MAVEN_CENTRAL_TOKEN @@ -90,7 +93,9 @@ jobs: gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Publish to Apache Maven Central - run: mvn deploy -P 'release,!default' -Dmaven.test.skip=true + run: >- + ./mvnw -B deploy -P 'release,!default,!examples-and-integration-tests' + -Dmaven.test.skip=true env: MAVEN_USERNAME: ${{ secrets.SONATYPE_MAVEN_REPOSITORY_USERNAME }} MAVEN_CENTRAL_TOKEN: ${{ secrets.SONATYPE_MAVEN_REPOSITORY_PASSWORD }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 184664f37f..f054ba2cf5 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -13,7 +13,7 @@ permissions: {} jobs: analysis: name: Scorecard analysis - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 # Prevents fork runs from failing due to missing write permissions or secrets. if: ${{ github.repository == 'prometheus/client_java' }} permissions: @@ -22,25 +22,25 @@ jobs: id-token: write # required by scorecard-action for OIDC token steps: - name: Checkout repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false - name: Run OSSF Scorecard analysis - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 + uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0 with: results_file: results.sarif results_format: sarif publish_results: true - name: Upload artifact - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: SARIF file path: results.sarif retention-days: 5 - name: Upload to code scanning - uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: sarif_file: results.sarif diff --git a/.github/workflows/test-release-build.yml b/.github/workflows/test-release-build.yml index dfb82be265..923a06cb66 100644 --- a/.github/workflows/test-release-build.yml +++ b/.github/workflows/test-release-build.yml @@ -11,22 +11,24 @@ permissions: {} jobs: build: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: persist-credentials: false fetch-tags: "true" fetch-depth: 0 - - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + - uses: jdx/mise-action@fc42bcc7ddbf51124c30f95a877a0c5168a3bfde # v5.2.1 with: - version: v2026.7.5 - sha256: 5f7ab76afdf0780d12edeaa67e908094e9ccf7924cfe203e415c1cfb87bbf778 + version: v2026.10.14 + sha256: 50be7185bcf75929f01cc5630276bcb43ca367f7c5b176e2580903d28c611dc4 - name: Cache local Maven repository uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + - name: Check release deployment configuration + run: python3 .mise/tasks/test_release_configuration.py - name: Build GitHub Pages run: mise run build-gh-pages env: diff --git a/.mise/envs/jmx-exporter/mise.lock b/.mise/envs/jmx-exporter/mise.lock deleted file mode 100644 index 3a07b15c3c..0000000000 --- a/.mise/envs/jmx-exporter/mise.lock +++ /dev/null @@ -1,33 +0,0 @@ -# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html - -[[tools.java]] -version = "temurin-21.0.11+10.0.LTS" -backend = "core:java" - -[tools.java."platforms.linux-arm64"] -checksum = "sha256:8d498ec88e1c1989fab95c6784240ab92d011e29c54d20a3f9c324b13476f9ad" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-arm64-musl"] -checksum = "sha256:c8d63598d1dc0a656033515ed258bd6db37506a05407d9f65cd23b95c21027b5" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_alpine-linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-x64"] -checksum = "sha256:4b2220e232a97997b436ca6ab15cbf70171ecff52958a46159dfa5a8c44ca4de" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-x64-musl"] -checksum = "sha256:38bfdcef1e4b45de2ec222047ac79c76bea75d4d7406a310e26cfa236763f05f" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_alpine-linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.macos-arm64"] -checksum = "sha256:6ebcf221c9b41507b14c098e93c6ead6440b8d9bd154f8ec666c4c73abbdb201" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.macos-x64"] -checksum = "sha256:34180eb03e6d207c388cce3da668f6cc7cd7508c185c24782fadac2c9c0e66f9" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_mac_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.windows-x64"] -checksum = "sha256:d3625e7cadf23787ea540229544b6e2ab494b3b54da1801879e583e1dfee0a64" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_windows_hotspot_21.0.11_10.zip" diff --git a/.mise/envs/jmx-exporter/mise.toml b/.mise/envs/jmx-exporter/mise.toml deleted file mode 100644 index a04b4948c0..0000000000 --- a/.mise/envs/jmx-exporter/mise.toml +++ /dev/null @@ -1,10 +0,0 @@ -# The pinned JMX Exporter release does not build on the primary JDK (Java 25): -# its spotless google-java-format predates JDK 25 support. Build it under an LTS -# JDK the release supports instead. -[tools] -java = "temurin-21.0.11+10.0.LTS" - -[tasks.compat-test] -description = "Run JMX Exporter compatibility tests under a supported JDK" -dir = "../../.." -run = "python3 .mise/tasks/jmx-exporter/test.py" diff --git a/.mise/envs/micrometer/mise.lock b/.mise/envs/micrometer/mise.lock deleted file mode 100644 index 3a07b15c3c..0000000000 --- a/.mise/envs/micrometer/mise.lock +++ /dev/null @@ -1,33 +0,0 @@ -# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html - -[[tools.java]] -version = "temurin-21.0.11+10.0.LTS" -backend = "core:java" - -[tools.java."platforms.linux-arm64"] -checksum = "sha256:8d498ec88e1c1989fab95c6784240ab92d011e29c54d20a3f9c324b13476f9ad" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-arm64-musl"] -checksum = "sha256:c8d63598d1dc0a656033515ed258bd6db37506a05407d9f65cd23b95c21027b5" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_alpine-linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-x64"] -checksum = "sha256:4b2220e232a97997b436ca6ab15cbf70171ecff52958a46159dfa5a8c44ca4de" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.linux-x64-musl"] -checksum = "sha256:38bfdcef1e4b45de2ec222047ac79c76bea75d4d7406a310e26cfa236763f05f" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_alpine-linux_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.macos-arm64"] -checksum = "sha256:6ebcf221c9b41507b14c098e93c6ead6440b8d9bd154f8ec666c4c73abbdb201" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.macos-x64"] -checksum = "sha256:34180eb03e6d207c388cce3da668f6cc7cd7508c185c24782fadac2c9c0e66f9" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_mac_hotspot_21.0.11_10.tar.gz" - -[tools.java."platforms.windows-x64"] -checksum = "sha256:d3625e7cadf23787ea540229544b6e2ab494b3b54da1801879e583e1dfee0a64" -url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_windows_hotspot_21.0.11_10.zip" diff --git a/.mise/envs/micrometer/mise.toml b/.mise/envs/micrometer/mise.toml deleted file mode 100644 index e5318c1d6d..0000000000 --- a/.mise/envs/micrometer/mise.toml +++ /dev/null @@ -1,10 +0,0 @@ -# The pinned Micrometer release does not build on the primary JDK (Java 25): -# its bundled Kotlin compiler predates JDK 25 support. Build it under an LTS JDK -# the release supports instead. -[tools] -java = "temurin-21.0.11+10.0.LTS" - -[tasks.compat-test] -description = "Run Micrometer compatibility tests under a supported JDK" -dir = "../../.." -run = "python3 .mise/tasks/micrometer/test.py" diff --git a/.mise/envs/native/mise.lock b/.mise/envs/native/mise.lock deleted file mode 100644 index 87f54de47f..0000000000 --- a/.mise/envs/native/mise.lock +++ /dev/null @@ -1,25 +0,0 @@ -# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html - -[[tools.java]] -version = "oracle-graalvm-25.0.1" -backend = "core:java" - -[tools.java."platforms.linux-arm64"] -checksum = "sha256:edd77565c76570a6df5f38e53d54524102f2c1b1cf74eebd9f51e7fc19f667cd" -url = "https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.1_linux-aarch64_bin.tar.gz" - -[tools.java."platforms.linux-x64"] -checksum = "sha256:d4ab02ba1029e639f03374fdf91c242e1d0d49079880e1af1932ea7b7c431837" -url = "https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.1_linux-x64_bin.tar.gz" - -[tools.java."platforms.macos-arm64"] -checksum = "sha256:19dfd49ad112e6e6c2bdedc507c6859bf21294fa4c164f1be670d469c65b7993" -url = "https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.1_macos-aarch64_bin.tar.gz" - -[tools.java."platforms.macos-x64"] -checksum = "sha256:a762ca1d9a163e32790b9286f3af4c16369729ff27999d8dbab60d7be16cff2f" -url = "https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.1_macos-x64_bin.tar.gz" - -[tools.java."platforms.windows-x64"] -checksum = "sha256:5398592ecdf8f47f4b481896e1e63cbfff4cb8e0ba61538526e3b3795b1a85e5" -url = "https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.1_windows-x64_bin.zip" diff --git a/.mise/envs/native/mise.toml b/.mise/envs/native/mise.toml deleted file mode 100644 index 594ec3d803..0000000000 --- a/.mise/envs/native/mise.toml +++ /dev/null @@ -1,7 +0,0 @@ -[tools] -java = "oracle-graalvm-25.0.1" - -[tasks.native-test] -depends = "build" -run = "../../mvnw test -PnativeTest" -dir = "../../../integration-tests/it-spring-boot-smoke-test" diff --git a/.mise/lib/jmx_exporter_compat.py b/.mise/lib/jmx_exporter_compat.py index be29a2715d..8a7b54a033 100755 --- a/.mise/lib/jmx_exporter_compat.py +++ b/.mise/lib/jmx_exporter_compat.py @@ -7,8 +7,6 @@ import subprocess import xml.etree.ElementTree as ET from pathlib import Path -from typing import Optional - DEFAULT_JMX_EXPORTER_DIR = Path( os.environ.get("JMX_EXPORTER_DIR", "/tmp/jmx-exporter-compat") @@ -34,8 +32,8 @@ def run_cmd( cmd: list[str], - cwd: Optional[Path] = None, - env: Optional[dict[str, str]] = None, + cwd: Path | None = None, + env: dict[str, str] | None = None, ) -> None: subprocess.run(cmd, cwd=cwd, check=True, env=env) @@ -59,10 +57,12 @@ def check_clean_worktree(jmx_exporter_dir: Path) -> None: ) -def get_prom_version(root_dir: Path = Path.cwd()) -> str: +def get_prom_version(root_dir: Path | None = None) -> str: configured_version = DEFAULT_PROM_VERSION if configured_version: return configured_version + if root_dir is None: + root_dir = Path.cwd() pom = ET.parse(root_dir / "pom.xml") root = pom.getroot() version = root.findtext("./{*}version") @@ -96,7 +96,9 @@ def prepare_repo( ) -def install_local_artifacts(root_dir: Path = Path.cwd()) -> None: +def install_local_artifacts(root_dir: Path | None = None) -> None: + if root_dir is None: + root_dir = Path.cwd() run_cmd( [ "./mvnw", @@ -132,23 +134,27 @@ def quick_test_images( if override: images[var] = override continue - match = re.search(rf'^\s*export\s+{var}="([^"]+)"', script, re.MULTILINE) + match = re.search( + rf'^\s*export\s+{var}=(?:"([^"]+)"|([^\s#]+))', + script, + re.MULTILINE, + ) if not match: raise RuntimeError(f"could not find {var} in {script_path}") - images[var] = match.group(1) + images[var] = match.group(1) or match.group(2) return images def run_maven_test( jmx_exporter_dir: Path = DEFAULT_JMX_EXPORTER_DIR, - prom_version: Optional[str] = None, + prom_version: str | None = None, ) -> None: if prom_version is None: prom_version = get_prom_version() # Build the full reactor (including the integration_test_suite) the same way # run-quick-test.sh does, but against our locally installed io.prometheus - # artifacts. The pinned distribution env vars keep this to the quick (single - # cell) matrix rather than the full smoke-test matrix. + # artifacts. This PR check intentionally runs only one representative smoke + # test; the pinned distribution env vars also keep it to a single matrix cell. env = {**os.environ, **quick_test_images(jmx_exporter_dir)} cmd = [ "./mvnw", @@ -156,6 +162,7 @@ def run_maven_test( "clean", "install", f"-Dprometheus.metrics.version={prom_version}", + "-Dparamixel.match.class.regex=io.prometheus.jmx.test.core.BasicTest", f"-Dparamixel.parallelism={os.cpu_count() or 1}", "-Djacoco.skip=true", ] diff --git a/.mise/lib/micrometer_compat.py b/.mise/lib/micrometer_compat.py index dc3b9191f2..b890873ce0 100755 --- a/.mise/lib/micrometer_compat.py +++ b/.mise/lib/micrometer_compat.py @@ -6,8 +6,6 @@ import subprocess import xml.etree.ElementTree as ET from pathlib import Path -from typing import Optional - DEFAULT_MICROMETER_DIR = Path( os.environ.get("MICROMETER_DIR", "/tmp/micrometer-compat") @@ -27,7 +25,7 @@ DEFAULT_PROM_VERSION = os.environ.get("PROM_VERSION") -def run_cmd(cmd: list[str], cwd: Optional[Path] = None) -> None: +def run_cmd(cmd: list[str], cwd: Path | None = None) -> None: subprocess.run(cmd, cwd=cwd, check=True) @@ -49,10 +47,12 @@ def check_clean_worktree(micrometer_dir: Path) -> None: ) -def get_prom_version(root_dir: Path = Path.cwd()) -> str: +def get_prom_version(root_dir: Path | None = None) -> str: configured_version = DEFAULT_PROM_VERSION if configured_version: return configured_version + if root_dir is None: + root_dir = Path.cwd() pom = ET.parse(root_dir / "pom.xml") root = pom.getroot() version = root.findtext("./{*}version") @@ -64,7 +64,7 @@ def get_prom_version(root_dir: Path = Path.cwd()) -> str: def write_init_script( - init_script: Path = DEFAULT_INIT_SCRIPT, prom_version: Optional[str] = None + init_script: Path = DEFAULT_INIT_SCRIPT, prom_version: str | None = None ) -> None: if prom_version is None: prom_version = get_prom_version() @@ -120,7 +120,9 @@ def prepare_repo( ) -def install_local_artifacts(root_dir: Path = Path.cwd()) -> None: +def install_local_artifacts(root_dir: Path | None = None) -> None: + if root_dir is None: + root_dir = Path.cwd() run_cmd( [ "./mvnw", @@ -144,13 +146,16 @@ def install_local_artifacts(root_dir: Path = Path.cwd()) -> None: def run_gradle_test( - test_selector: Optional[str] = None, + test_selector: str | None = None, micrometer_dir: Path = DEFAULT_MICROMETER_DIR, init_script: Path = DEFAULT_INIT_SCRIPT, ) -> None: cmd = [ "./gradlew", "--no-daemon", + # micrometer wires in a remote build cache into settings.gradle. + # compatibility tests have no use for upstream's cache + "--no-build-cache", "-I", str(init_script), ":micrometer-registry-prometheus:test", diff --git a/.mise/locks/npm-renovate/44.82.0~026f02c4/aube-lock.yaml b/.mise/locks/npm-renovate/44.82.0~026f02c4/aube-lock.yaml new file mode 100644 index 0000000000..8d02b36fdd --- /dev/null +++ b/.mise/locks/npm-renovate/44.82.0~026f02c4/aube-lock.yaml @@ -0,0 +1,5154 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + renovate: + specifier: 44.82.0 + version: 44.82.0(typanion@3.14.0) + +packages: + + '@arcanis/slice-ansi@1.1.1': + resolution: {integrity: sha512-xguP2WR2Dv0gQ7Ykbdb7BNCnPnIPB94uTi0Z2NvkRBEnhbwjOQ7QyQKJXrVQg4qDpiD9hA5l5cCwy/z2OXgc3w==} + + '@aws-sdk/checksums@3.1001.0': + resolution: {integrity: sha512-6uTniZc87q+B5eXouGTl+7Tmc482rEeCcvxpsvREP8EfF0gvloRZ41UOA9sbSJlyy8TbqIBXb3kKfKarEArUQA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-codecommit@3.1117.0': + resolution: {integrity: sha512-xdEqGEz6EIgWb/ng3OEPqlf0Uf/REVnCFZrVTaM/zzHDmcaugnAwn4ztP/y9dyVNtPHNFcgIpiwkuNAJCiLaGQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-ec2@3.1117.0': + resolution: {integrity: sha512-K/hGMuMZ7yYgVQql1Y8GAifAlf7z7TzjIPqz4czAJbuJJ2C5rD+FVH7cZADXspOoiOO7sKsRPVvsxGxbuSgKJw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-ecr@3.1117.0': + resolution: {integrity: sha512-YrmLy2eue1DLwBQn5ZwAyuw+89TeHCzOMwAn7z2i1Y4WMFGxGAykS2iOagzCz6v0asUvHg4MZFSsC5sHPvXBBQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-eks@3.1117.0': + resolution: {integrity: sha512-jEQRpRhJkvNMOPok1XAaruSw24vMkq8yOLphITLbUysv+hwT6DYu8cVdE5IGd37074UkqMl2306PwMPQ2tD5Jw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-rds@3.1117.0': + resolution: {integrity: sha512-nP1ATe2CBeTyjSI7TEPMzEdFd6wyi1Cat/9F7rtdUbiwpiabJu7acxuTrlH1emd4gJvg/nCce4RbCKd/44JbZA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-s3@3.1117.0': + resolution: {integrity: sha512-M/zyjg0u0Sxm73sInvyDb9+/YUuAOz8/xxmcmj0quJ7NXllZqXPxzjti3oVDz/lQ5mDf7iuxBLc0Y3deJI2hRw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.978.0': + resolution: {integrity: sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.972.70': + resolution: {integrity: sha512-KlU89w6Hmb4oZB5zFz/MNIhPOBQGVE7KrDr3BTPCwC4W+q566YH8tGNsAML781LKATtqmNCGFry8XvsJ2XPusg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.71': + resolution: {integrity: sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.73': + resolution: {integrity: sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.973.16': + resolution: {integrity: sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.78': + resolution: {integrity: sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.83': + resolution: {integrity: sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.71': + resolution: {integrity: sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.973.15': + resolution: {integrity: sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.77': + resolution: {integrity: sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-providers@3.1117.0': + resolution: {integrity: sha512-ronfFql+JiuS43r05PqmI7bb/qz3S/E1/1HszvLkCOxemPSaJsrHNRAisw3Mf0+v4XEP73vIZ9cRQOyRlChOXQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-ec2@3.972.59': + resolution: {integrity: sha512-BJLwpH+l4ZpzEhMzigwR35Ox24a41oOm70b92pwbF2Pq5n9IPBZhqiN5WyF7XH9zoJwc9wsDmC1wC7rlz8idBg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-rds@3.972.59': + resolution: {integrity: sha512-doexDWIfVvd8wB9a4GnDomxqqtq20N/198jd8dSG6t9jJMEAN0p5lJE5RPofWVJhzCCdmbUz1yzHWTBDTEOfsA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.972.76': + resolution: {integrity: sha512-NfnTkVUTBKTBuBgqaapFK9r3YdkKt1b2oRvgLzZq91bwNKh6ZS0S7sEcheguttREaL4iyfs/xQnqD7Z7AsWSsA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.997.45': + resolution: {integrity: sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.996.46': + resolution: {integrity: sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1129.0': + resolution: {integrity: sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.974.5': + resolution: {integrity: sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.40': + resolution: {integrity: sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.3.0': + resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime-corejs3@7.29.7': + resolution: {integrity: sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==} + engines: {node: '>=6.9.0'} + + '@baszalmstra/rattler@0.2.1': + resolution: {integrity: sha512-HZ2xu6Nk+XzAeateyzDKYM47ySkjkuKtTNpKRAy+Y+YcRH1qHM2le4iLlG32wDddaHCLUsBsyBxirClOj1TLjw==} + + '@breejs/later@4.2.0': + resolution: {integrity: sha512-EVMD0SgJtOuFeg0lAVbCwa+qeTKILb87jqvLyUtQswGD9+ce2nB52Y5zbTF1Hc0MDFfbydcMcxb47jSdhikVHA==} + engines: {node: '>= 10'} + + '@cdktf/hcl2json@0.21.0': + resolution: {integrity: sha512-cwX3i/mSJI/cRrtqwEPRfawB7pXgNioriSlkvou8LWiCrrcDe9ZtTbAbu8W1tEJQpe1pnX9VEgpzf/BbM7xF8Q==} + + '@grpc/grpc-js@1.14.5': + resolution: {integrity: sha512-7VZM+SVdEcUUqSQeNI3zM8Qs/BhQKZndPo2h5VkYkAM8Iz0wJIa8mKV5ekQGqG8UUsnkQ0NMxIxwkIHYvj0qOw==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} + engines: {node: '>=6'} + hasBin: true + + '@gwhitney/detect-indent@7.0.1': + resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==} + engines: {node: '>=12.20'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@one-ini/wasm@0.2.1': + resolution: {integrity: sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg==} + + '@opentelemetry/api-logs@0.222.0': + resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.11.0': + resolution: {integrity: sha512-Tr79DyWI8itsBdg+jH+opjfrwLzX+erk1/ExkIwhWoAVjVrJIn2y5+cGjTC0Vy8fyNIA/y8wuJPZwr1T3xCZeQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-grpc@0.222.0': + resolution: {integrity: sha512-uisilePEdOMa3hIfXW82XXU6FofF8gw3iv+PoboIMWEUBC7XbJB3XnIHSdrSDsqCw3njR/If08qD0yzOY1U9Sg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.222.0': + resolution: {integrity: sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.222.0': + resolution: {integrity: sha512-imLrLzNhnABJt3tUyT63h6MqfZrG3Gdv3TE7+OUQTvwD088RfCUx3rF01lcgfu2KXBFk13vwi0yKZLvFEalkIA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-bunyan@0.67.0': + resolution: {integrity: sha512-a/ucku1yx4qW2zpYpepTM/rZlv92DG/C+k/Kxn/nqhh5HOoe3pHFbXUXunvy2EtHW/7l81PI++AUm+rIxXqlTg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.222.0': + resolution: {integrity: sha512-HhMHW32LyGzIJEmUElxaML4oUe6JiCq0Hvjt/Awxb60SlMsSFetFLFjed45g/0wrPr1n7z+xW+x1B/584WBAkg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.70.0': + resolution: {integrity: sha512-jXHduXt6GQWluGtqBPibAvpw27seRjA6SMyLp0Oc41AzSQz1JFZq1CNw6gvdOrRasH4AJPpRykPxw02IjHYr0A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.222.0': + resolution: {integrity: sha512-fhbRDuAgzPKpq1k5+hX3uS+3QAYNca0on0Ngot/R8dDsQtuFaADeZnG2uSgxABuvcI7S2phAaRhbct9jieeKZw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.222.0': + resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.222.0': + resolution: {integrity: sha512-Kw5WqDBYYpCgY+edHWZS/Jp3bdguqNkCyEWOsqFhf8RmtcEuWYzPFA9i+L6UsNoJXTs8ngeQB6dwELH1czNYjA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.222.0': + resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.38.3': + resolution: {integrity: sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resource-detector-aws@2.22.0': + resolution: {integrity: sha512-3kM+xfsSHs0hShUAx9IFhX5jniaXxJL3CTjbCMNCFS+EY7bswWbukV3au0jfqEgzeNxGxHEy8RLA1TOhAVLpTQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.30.0': + resolution: {integrity: sha512-fwGDPVGJ6PyRMc5CPdHBfASX5prg3mLhZA0rs+n8ZJK4DjpJw9CvB1FujWl8l0QAsTmvrYBm9Deal3fvfqZBkQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.57.0': + resolution: {integrity: sha512-wp+hk7jD7mxA6swAqa5wQ3jws2egh1DCPZ9FfEgntmFw/mc8MaGZjwuttOoMeRjIlcBCCaNUHuN8B+MZaujAXQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-github@0.32.0': + resolution: {integrity: sha512-CwaKgoukIcEUZfOXf1c9W37ixRT3dhanSqG5P1hZx8zr13A4xZQHTuS4rn03v+RewIJWTkAfi7Ei1eI1rgRfaQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.222.0': + resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.11.0': + resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.11.0': + resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.11.0': + resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.11.0': + resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/catalogs.protocol-parser@1001.0.0': + resolution: {integrity: sha512-9rHKCMRvhfv7TSAVSCVLI+8OZhi1OcT8lanAGqOPbGgQTkFrPH3PfEWJNxz43xqrXRa4HCFRAMu+g19su5eRLA==} + engines: {node: '>=18.12'} + + '@pnpm/catalogs.resolver@1000.0.5': + resolution: {integrity: sha512-h6UiDAu/Ztj0LCd9sqmJwSWvJYTMUuxo/+/Iz2WZuWboyUI+2BylWJvokkMG4hNlvroLzBQ5+cz9/e+TDSLpoA==} + engines: {node: '>=18.12'} + + '@pnpm/catalogs.types@1000.0.0': + resolution: {integrity: sha512-xRf72lk7xHNvbenA4sp4Of/90QDdRW0CRYT+V+EbqpUXu1xsXtedHai34cTU6VGe7C1hUukxxE9eYTtIpYrx5g==} + engines: {node: '>=18.12'} + + '@pnpm/constants@1001.3.1': + resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} + engines: {node: '>=18.12'} + + '@pnpm/constants@6.1.0': + resolution: {integrity: sha512-L6AiU3OXv9kjKGTJN9j8n1TeJGDcLX9atQlZvAkthlvbXjvKc5SKNWESc/eXhr5nEfuMWhQhiKHDJCpYejmeCQ==} + engines: {node: '>=14.19'} + + '@pnpm/error@1000.1.0': + resolution: {integrity: sha512-Dqc2IJJPjUatwc9Letw+vG29rnaMrDGi5g6WCx1HiZYm0obXbTmLygeRafMbgf+sLKXrWE1shOeiayQuczBdoA==} + engines: {node: '>=18.12'} + + '@pnpm/error@4.0.0': + resolution: {integrity: sha512-NI4DFCMF6xb1SA0bZiiV5KrMCaJM2QmPJFC6p78FXujn7FpiRSWhT9r032wpuQumsl7DEmN4s3wl/P8TA+bL8w==} + engines: {node: '>=14.6'} + + '@pnpm/graceful-fs@2.0.0': + resolution: {integrity: sha512-ogUZCGf0/UILZt6d8PsO4gA4pXh7f0BumXeFkcCe4AQ65PXPKfAkHC0C30Lheh2EgFOpLZm3twDP1Eiww18gew==} + engines: {node: '>=14.19'} + + '@pnpm/parse-overrides@1001.0.4': + resolution: {integrity: sha512-fk6gFXDKN61vZfb/qbTne/938GPQaYy8U+B2TdBPxPuw2M/U8l1ltlUoJZzR3SW4O+jghzaFKTVVIPiPs3K1AQ==} + engines: {node: '>=18.12'} + + '@pnpm/parse-wanted-dependency@1001.0.0': + resolution: {integrity: sha512-cIZao+Jdu/4znu76d3ttAWBycDj6GWKiDVNlx1GVgqYgS/Qn7ak3Lm0FGIMAIHr5oOnX63jwzKIhW35AHNaTjQ==} + engines: {node: '>=18.12'} + + '@pnpm/read-project-manifest@4.1.1': + resolution: {integrity: sha512-jGNoofG8kkUlgAMX8fqbUwRRXYf4WcWdvi/y1Sv1abUfcoVgXW6GdGVm0MIJ+enaong3hXHjaLl/AwmSj6O1Uw==} + engines: {node: '>=14.6'} + + '@pnpm/text.comments-parser@1.0.0': + resolution: {integrity: sha512-iG0qrFcObze3uK+HligvzaTocZKukqqIj1dC3NOH58NeMACUW1NUitSKBgeWuNIE4LJT3SPxnyLEBARMMcqVKA==} + engines: {node: '>=14.6'} + + '@pnpm/types@8.9.0': + resolution: {integrity: sha512-3MYHYm8epnciApn6w5Fzx6sepawmsNU7l6lvIq+ER22/DPSrr83YMhU/EQWnf4lORn2YyiXFj0FJSyJzEtIGmw==} + engines: {node: '>=14.6'} + + '@pnpm/util.lex-comparator@1.0.0': + resolution: {integrity: sha512-3aBQPHntVgk5AweBWZn+1I/fqZ9krK/w01197aYVkAJQGftb+BVWgEepxY5GChjSW12j52XX+CmfynYZ/p0DFQ==} + engines: {node: '>=12.22.0'} + + '@pnpm/write-project-manifest@4.1.1': + resolution: {integrity: sha512-nRqvPYO8xUVdgy/KhJuaCrWlVT/4uZr97Mpbuizsa6CmvtCQf3NuYnVvOOrpYiKUJcZYtEvm84OooJ8+lJytMQ==} + engines: {node: '>=14.6'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + + '@qnighy/marshal@0.1.3': + resolution: {integrity: sha512-uaDZTJYtD2UgQTGemmgWeth+e2WapZm+GkAq8UU8AJ55PKRFaf1GkH7X/uzA+Ygu8iInzIlM2FGyCUnruyMKMg==} + + '@redis/client@6.2.1': + resolution: {integrity: sha512-LzxBY7SIBvvJiyCgcaJZZakE3fJrZZ++i24+EDW9fKpCl68D35uJcKFpZZwCfOoG9WZTbyZlMzMeM0gtOAMU9Q==} + engines: {node: '>= 20.0.0'} + peerDependencies: + '@node-rs/xxhash': ^1.1.0 + '@opentelemetry/api': '>=1 <2' + peerDependenciesMeta: + '@node-rs/xxhash': + optional: true + '@opentelemetry/api': + optional: true + + '@renovatebot/detect-tools@4.0.14': + resolution: {integrity: sha512-ZPKqa1fV99sCtKTCmPTG2NyIO6v/DO1QlN4hPJqg54QQm9gvhfcE2razmV10eZYC0J7Fx5/wwXXDvww/fd7Dqw==} + engines: {node: '>=22.12.0', pnpm: '>=10.0.0'} + + '@renovatebot/good-enough-parser@2.0.1': + resolution: {integrity: sha512-FBLawccaWOPwqXgMSB3FTp1VTfGJWSTTXY2Q3kWPoLYOpKYBr3V37vtqFLjb5wUFkrXN2Sj+S840JXKfHwy8Rg==} + engines: {node: '>=22.12.0', pnpm: '>=10.0.0'} + + '@renovatebot/osv-offline-db@3.0.10': + resolution: {integrity: sha512-xH4jJzMUagwJt4ofAtG8qWGc4TxgdNyVaUj6gjmdSVqd81fVu2qSkgVdd+Oh3O+MhTS6rOR3MZq+X5LqX4E4Iw==} + engines: {node: '>=22.12.0', pnpm: '>=10.0.0'} + + '@renovatebot/osv-offline@3.0.10': + resolution: {integrity: sha512-btStcVTVmUaJ89qwdPlI+1yMyXTZSEpTMdgJv/77MsDzhOvVTNtoaDu6k0PHSPFoUfQ2X5WvZGRq2+CxUSqLPQ==} + engines: {node: '>=22.12.0', pnpm: '>=10.0.0'} + + '@renovatebot/pep440@5.0.1': + resolution: {integrity: sha512-KmMz+X68YvrS6aN6TJWtDiH8aCIL2Igcvceh17STHxMUN3KxXsC24COoOXjMOl/Gb+okBwwduMm8PY/WY/0Cpg==} + engines: {node: ^22.11.0 || >=24.10.0, pnpm: '>=10.0.0'} + + '@renovatebot/pgp@1.4.1': + resolution: {integrity: sha512-e4lknjxPe354YISRvhR5s9Vx2gB9hEJVK+O6dYzeE9MsAbyTpcHKcIeDXE2QGGi8h0WV5seUAQUhDh3f5jZ1Wg==} + engines: {node: ^22.11.0 || >=24.10.0, pnpm: '>=10.0.0'} + + '@renovatebot/ruby-semver@5.0.0': + resolution: {integrity: sha512-yQgeq4HVV9mh2AJHHlStd//7mD/96lWj8KWB5Szi5YDjPwpvk12Sj3H+Y4waNC3N2D4t5xqbwYYpTHB5KsrSVg==} + engines: {node: ^22.11.0 || >=24.10.0, pnpm: '>=10.0.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@8.1.0': + resolution: {integrity: sha512-2SX/1jW6CIMAiebvVv5ZInoCEuWQmMyBoJXXGC6Vjakjp/fpxP5eHs7/V6WKuPEIbuK06+VpjH+vjLQhr98rDQ==} + engines: {node: '>=22'} + + '@smithy/core@3.34.1': + resolution: {integrity: sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.5.2': + resolution: {integrity: sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.8.0': + resolution: {integrity: sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.12.1': + resolution: {integrity: sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.7.3': + resolution: {integrity: sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.18.0': + resolution: {integrity: sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==} + engines: {node: '>=18.0.0'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@thi.ng/api@7.2.0': + resolution: {integrity: sha512-4NcwHXxwPF/JgJG/jSFd9rjfQNguF0QrHvd6e+CEf4T0sFChqetW6ZmJ6/a2X+noDVntgulegA+Bx0HHzw+Tyw==} + + '@thi.ng/arrays@1.0.3': + resolution: {integrity: sha512-ZUB27bdpTwcvxYJTlt/eWKrj98nWXo0lAUPwRwubk4GlH8rTKKkc7qZr9/4LCKPsNjnZdQqbBtNvNf3HjYxCzw==} + + '@thi.ng/checks@2.9.11': + resolution: {integrity: sha512-fBvWod32w24JlJsrrOdl+tlx+UNehCORi4rHaJ7l7HH+SEhD/lYTCXOBjwu9D/ztIUjMP5Q+n8cAqI5iPhbvAQ==} + + '@thi.ng/compare@1.3.34': + resolution: {integrity: sha512-E+UWhmo8l5yeHDuriPUsfrnk/Mj5kSDNRX7lPfv2zNdAQ7N8UDzc0IXu46U6EpqtCReo+2n5N8qzfD3TjerFRw==} + + '@thi.ng/equiv@1.0.45': + resolution: {integrity: sha512-tdXaJfF0pFvT80Q7BOlhc7H7ja/RbVGzlGpE4LqjDWfXPPbLYwmq6EbQuHWeXuvT0qe+BsGnuO5UXAR5B8oGGQ==} + + '@thi.ng/errors@1.3.4': + resolution: {integrity: sha512-hTk71OPKnioN349sdj2DAoY+69eSerB3MN4Zwz6mosr1QFzIMkfkNOtBeC+Gm0yi0V0EY5LeBYFgqb3oXbtTbw==} + + '@thi.ng/hex@1.0.4': + resolution: {integrity: sha512-9ofIG4nXhEskGeOJthpi/9LXFIPrlZ/MmHpgLWa3wNqTVhODP/o++mu9jDKojHEpKvswkkFCE+mSVmMu8xo4mQ==} + + '@thi.ng/random@2.4.8': + resolution: {integrity: sha512-4JJB8zbaPxjlAp1kCqsBbs6eN4Ivd/5fs1e4GlvmNkyGSucHIDTWvw6NnQWqUx2oPaAEDB9CFCH7SOcGC/cwkw==} + + '@thi.ng/zipper@1.0.3': + resolution: {integrity: sha512-dWfuk5nzf5wGEmcF90AXNEuWr3NVwRF+cf/9ZSE6xImA7Vy5XpHNMwLHFszZaC+kqiDXr+EZ0lXWDF46a8lSPA==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/emscripten@1.41.6': + resolution: {integrity: sha512-uN+9i8bFT5CUcZfyIEYDrSueACEyKGbUs5kC/72DGlZZoinh84sJfVV0i8UOJD1asdzkvLPBRrKs41kZ8MdEXg==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/moo@0.5.10': + resolution: {integrity: sha512-W6KzyZjXUYpwQfLK1O1UDzqcqYlul+lO7Bt71luyIIyNlOZwJaNeWWdqFs1C/f2hohZvUFHMk6oFNe9Rg48DbA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@26.6.2': + resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==} + + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} + + '@types/treeify@1.0.3': + resolution: {integrity: sha512-hx0o7zWEUU4R2Amn+pjCBQQt23Khy/Dk56gQU5xi5jtPL1h83ACJCeFaB2M/+WO1AntvWrSoVnnCAfI1AQH4Cg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@yarnpkg/core@4.9.1': + resolution: {integrity: sha512-P8H10ehQBFWL5eR1y/8nLRzFHx1yumgE9P1DQjJ+EIVvqeWo0MjbwQ+ZJjPDT+HqVDslE+e6I/9GrJ7Arbx/8A==} + engines: {node: '>=18.12.0'} + + '@yarnpkg/fslib@3.1.5': + resolution: {integrity: sha512-hXaPIWl5GZA+rXcx+yaKWUuePJruZuD+3A5A2X6paEBfFsyCD7oEp88lSMj1ym1ehBWUmhNH/YGOp+SrbmSBPg==} + engines: {node: '>=18.12.0'} + + '@yarnpkg/libzip@3.2.2': + resolution: {integrity: sha512-Kqxgjfy6SwwC4tTGQYToIWtUhIORTpkowqgd9kkMiBixor0eourHZZAggt/7N4WQKt9iCyPSkO3Xvr44vXUBAw==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@yarnpkg/fslib': ^3.1.3 + + '@yarnpkg/parsers@3.1.0': + resolution: {integrity: sha512-WoxUM/Be4hfsX06FxsvpGgfYqwgivMV7/Ol7aFuSfSmY6rRaiju4QxOEe9RUS0iYcSHWl5i9AhB1cMoE0p+XiA==} + engines: {node: '>=18.12.0'} + + '@yarnpkg/shell@4.1.3': + resolution: {integrity: sha512-5igwsHbPtSAlLdmMdKqU3atXjwhtLFQXsYAG0sn1XcPb3yF8WxxtWxN6fycBoUvFyIHFz1G0KeRefnAy8n6gdw==} + engines: {node: '>=18.12.0'} + hasBin: true + + abbrev@5.0.0: + resolution: {integrity: sha512-/XrFJgzQQQHpti1raDJC6m4ws6aNktmjBlhk8Fdlk7LwCEuDoieEJJY9OFHjfiFJFFRM2tK+Ky/IsfbbmlMu1w==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + adm-zip@0.6.0: + resolution: {integrity: sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==} + engines: {node: '>=14.0'} + + ae-cvss-calculator@1.0.13: + resolution: {integrity: sha512-QnPO1O5gZ/1NM+X4fbfqN/y5rImEZ8CSkbSk7Arv4RrmxPzxLXr9RSLmsQJykDtXFUXn9wHLxC0/fe/pO78t3w==} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + argparse@3.0.2: + resolution: {integrity: sha512-mFdDM6WqWKraGLsVb+C9CahPnzTXOefAOLq3jYcca2YZ8bEWpr++Tzj+zSaKW9+X9L5uSxcm1AZ3Y6aZJ09OhQ==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + azure-devops-node-api@17.0.0: + resolution: {integrity: sha512-Ej/C91R56m98p99B6RoePnCsWH2NEME1a7rYE7WWyX8AMuIILEDFyVlwRypfHOSJTTRJZVHkXISkPDqs6To/HQ==} + engines: {node: '>= 16.0.0'} + + backslash@0.2.2: + resolution: {integrity: sha512-PKRYPE2LLTtNUYz1dszquxKSBs6XyLyJRHgFpY5rlq7y3DscDx239k5Gm+zenoY47OU4CApan1o0k2R8ptZC1Q==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} + + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + bunyan@1.8.15: + resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} + hasBin: true + + byte-counter@0.1.0: + resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} + engines: {node: '>=20'} + + cacache@20.0.4: + resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} + engines: {node: ^20.17.0 || >=22.9.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@13.0.19: + resolution: {integrity: sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==} + engines: {node: '>=18'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + changelog-filename-regex@2.0.1: + resolution: {integrity: sha512-DZdyJpCprw8V3jp8V2x13nAA05Yy/IN+Prowj+0mrAHNENYkuMtNI4u5m449TTjPqShIslQSEuXee+Jtkn4m+g==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chunk-data@0.1.0: + resolution: {integrity: sha512-zFyPtyC0SZ6Zu79b9sOYtXZcgrsXe0RpePrzRyj52hYVFG1+Rk6rBqjjOEk+GNQwc3PIX+86teQMok970pod1g==} + engines: {node: '>=20'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} + + clean-git-ref@2.0.1: + resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} + + clipanion@4.0.0-rc.4: + resolution: {integrity: sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==} + peerDependencies: + typanion: '*' + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + core-js-pure@3.50.0: + resolution: {integrity: sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==} + + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + + cronstrue@3.24.0: + resolution: {integrity: sha512-t/Ji3Ur2c/pzhIAWNwC0ftl3JAE4dLfCjAdZoTZXmPDZwcispnS1PaMcMS4OmIIXyIVouAz+yw+mfQiE3hz5OQ==} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dtrace-provider@0.8.8: + resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} + engines: {node: '>=0.10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + editorconfig@3.0.2: + resolution: {integrity: sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA==} + engines: {node: '>=20'} + hasBin: true + + email-addresses@5.0.0: + resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojibase-regex@17.0.0: + resolution: {integrity: sha512-iWlqiz2l2zNf2lDqgN/7qjqKHVUX6H4D+8F5vDZkgjyWyRFXcA5K4rxkoTl7AJmyjHnoytw0m/do2SrGByui+g==} + + emojibase@17.0.0: + resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} + engines: {node: '>=18.12.0'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} + engines: {node: '>=20.19.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@3.0.2: + resolution: {integrity: sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-packages@10.0.4: + resolution: {integrity: sha512-JmO9lEBUEYOiRw/bdbdgFWpGFgBZBGLcK/5GjQKo3ZN+zR6jmQOh9gWyZoqxlQmnldZ9WBWhna0QYyuq6BxvRg==} + engines: {node: '>=14.6'} + + find-up@8.0.0: + resolution: {integrity: sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==} + engines: {node: '>=20'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} + engines: {node: '>=18'} + + gcp-metadata@8.1.4: + resolution: {integrity: sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==} + engines: {node: '>=18'} + + gcp-metadata@9.0.4: + resolution: {integrity: sha512-p6WvbXOhfwnVtv/MyPq5kBiVhfV/qglMIxwwTVNEI1Ha1HmOgz5uHYHtYO6SfGckFaXe8blA11IJJ3wqXmvmBA==} + engines: {node: '>=22'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} + + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} + + github-url-from-git@1.5.0: + resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + google-auth-library@11.0.2: + resolution: {integrity: sha512-vzpgPutxrghPsnjrjpzLX2bdv8IOL719Rh0oEjGnQu8YCIbnbMuTTQ5zU9LcKvLdOPgCxBwppbvnhgW90Qna5Q==} + engines: {node: '>=22'} + + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + + google-logging-utils@2.0.1: + resolution: {integrity: sha512-HMhaQghlOTvbcb3c4T5jmmOMtG3JUF1iOQMezaJXL86CDS+Tm2vHd0IeLFRAx3+ewd+bo9E1HFHoy17X5aJa9A==} + engines: {node: '>=22'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@15.1.0: + resolution: {integrity: sha512-DG+DAAkRtno+oDr/GBsliAkhN9+zczOPM5qXk3efDZY3qvyRnZU+NwQlb/IOY6cSnxxTR9z3aHCcShJyjb0hJA==} + engines: {node: '>=22'} + + got@16.0.0: + resolution: {integrity: sha512-UtzSUebtRHHAUaNB/X37X1LQgHvdSrgXUIWGUBDhLu05CYtUr9svjeN6wmG333nzdJASFUjXMOuRBjZLf8oF1w==} + engines: {node: '>=22'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graph-data-structure@4.5.0: + resolution: {integrity: sha512-OCeIzpK9JnV5js4gtDJgwebRbcOsZpoN9CNIwEooHkV/FNol+OykWPOugSTXBH/QICEW2N6U+6L2d9DcK4YBcw==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hpagent@1.2.0: + resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} + engines: {node: '>=14'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} + engines: {node: '>= 4'} + + import-in-the-middle@3.5.1: + resolution: {integrity: sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ==} + engines: {node: '>=18'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + install-artifact-from-github@1.8.1: + resolution: {integrity: sha512-lV8dRlR/3i6Tk4X9agaqhMRY6ScVU3YOuKse0VRnP9+rUWfImeCjo1TeAefXEauNVF3a8QgOb6jW3CZJetVopw==} + engines: {node: '>=18'} + hasBin: true + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-ssh@1.4.1: + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-md4@0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-dup-key-validator@1.0.3: + resolution: {integrity: sha512-JvJcV01JSiO7LRz7DY1Fpzn4wX2rJ3dfNTiAfnlvLNdhhnm0Pgdvhi2SGpENrZn7eSg26Ps3TPhOcuD/a4STXQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-stringify-pretty-compact@4.0.0: + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonata@2.2.1: + resolution: {integrity: sha512-xd1uwUrKeIcJbsWhaoS3qAX4Ea8m0Mw0G5nlnAQvPT7TbZ5qaPdzBVTQia9KfyuyQm+nenfyjvzUDTRYHsC2sw==} + engines: {node: '>= 8'} + + jsonc-morph@0.3.6: + resolution: {integrity: sha512-TkGcePt+6p+7wzOXXkIhwuAs/WFJ+UBwJYlnjLOhvC29z0YxKy5AhBW3YWEvpXI/yQXPxEM5oqwZpcK4Q/ouFw==} + + jsonc-weaver@0.3.1: + resolution: {integrity: sha512-a6e90+Hn5e+l7i6MC2YJ57TE6nv9gDKFyCLBIVKt0Jdv48lUBEV7StnnuwC0Y+sjnux41cnPlHJl65DH4+d9eA==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@6.1.0: + resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==} + + locate-path@8.0.0: + resolution: {integrity: sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==} + engines: {node: '>=20'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lowercase-keys@4.0.1: + resolution: {integrity: sha512-wI9Nui/L8VfADa/cr/7NQruaASk1k23/Uh1khQ02BCVYiiy8F4AhOGnQzJy3Fl/c44GnYSbZHv8g7EcG3kJ1Qg==} + engines: {node: '>=20'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + + markdown-it@15.0.1: + resolution: {integrity: sha512-9/7gE95FNPkfUWrjJIoHZza2iLmuJlPD0UNMxPi7bxUrbCR525YZY0r+zyfes0dZI5ZZ/uNIXUJca0pJvtw41g==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@2.1.0: + resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.2: + resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-flush@1.0.7: + resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + + moment@2.31.0: + resolution: {integrity: sha512-0acOTfMiWOheYS4eoWb80yYMb/JLvVv9SHbs2PehaDzfUG0Bw855SKyk0IKTnPGa5+U2bmi3W68l1+sGLX/pvw==} + + moo@0.5.3: + resolution: {integrity: sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mv@2.1.1: + resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} + engines: {node: '>=0.8.0'} + + nan@2.29.0: + resolution: {integrity: sha512-GlGk3HIvitbvs+LT3g6XUP1kpirKNvmDFwF/bmo6XNWSb/eYEs/O4bfgIEIXCZ+lIOTS5xNwDvSGMw6FJdAhtA==} + + ncp@2.0.0: + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + neotraverse@1.0.1: + resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==} + engines: {node: '>= 10'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp@13.0.2: + resolution: {integrity: sha512-SXTvw3PxznpowYhJSOD9mVQBgDaCTWXffX+wQZsQ7PbcTV86TsXCUcSZhHnskFQvrvn/OdSzJPMsptT2pIj9ww==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hasBin: true + + node-html-parser@9.0.3: + resolution: {integrity: sha512-iaQ9rokcYNp99IY0h82q04Wtc27SObRT+OEytdJh0bFv2IN0fypnU63KUNVavkPSiwsmIELG1eUenajGhzrvpg==} + + nopt@10.0.1: + resolution: {integrity: sha512-df3sBr/6ax9hSGuC3CspvLlbnX8cP5L5nZwXF8cGN8l0zSWR6BvzmQ6jPUKjvo6+/xdpkNvEcucBNUdBeeV13g==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hasBin: true + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + openpgp@6.3.1: + resolution: {integrity: sha512-7oSPvmlKPojxFoyelT5DWPIAVmqWZh4qU/5pO6bdoShEtRpCw9Sye9IXUQj6EFM3XpgGssqccAr705YtTcLNQw==} + engines: {node: '>= 18.0.0', typescript: '>= 5.0.0'} + peerDependencies: + '@openpgp/web-stream-tools': ~0.3.0 + peerDependenciesMeta: + '@openpgp/web-stream-tools': + optional: true + + p-all@5.0.1: + resolution: {integrity: sha512-LMT7WX9ZSaq3J1zjloApkIVmtz0ZdMFSIqbuiEa3txGYPLjUPOvgOPOx3nFjo+f37ZYL+1aY666I2SG7GVwLOA==} + engines: {node: '>=16'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@6.0.0: + resolution: {integrity: sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==} + engines: {node: '>=16'} + + p-map@7.0.7: + resolution: {integrity: sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ==} + engines: {node: '>=18'} + + p-queue@9.3.3: + resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==} + engines: {node: '>=20'} + + p-throttle@8.1.0: + resolution: {integrity: sha512-c1wmXavsHZIC4g1OLhOsafK6jZSAeMo0Ap3yivj59PUcCkpacy5YgWdgIp/dB4vp1JZrfBSsPCR0YuADB+ENLQ==} + engines: {node: '>=20'} + + p-timeout@7.0.2: + resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} + engines: {node: '>=20'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-link-header@2.0.0: + resolution: {integrity: sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==} + + parse-path@7.1.0: + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} + + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + proc-log@7.0.0: + resolution: {integrity: sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + protobufjs@7.6.6: + resolution: {integrity: sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==} + engines: {node: '>=12.0.0'} + + protobufjs@8.8.0: + resolution: {integrity: sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==} + engines: {node: '>=12.0.0'} + + protocols@2.0.2: + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + re2@1.26.1: + resolution: {integrity: sha512-oi79a4h6EO3PAwNsDMWgeCcsRGQEUa52DIgOiFTZGDEZocEXG9h+oXy0qZqndo47huUeJuVWSoOJIEhOupqOcg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + + read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-github@12.0.0: + resolution: {integrity: sha512-ByefQKFN184LeiGRCabfl7zUJsdlMYWEhiLX1gpmQ11yFg6xSuOTW7LVCv0oc1x+YvUMJW23NU36sJX2RWGgvg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + renovate@44.82.0: + resolution: {integrity: sha512-ReRWg+M7cnKN7Iiy9xHXgWAhiREw1pwP3v0vNRvEjizVTrSyskrwIVAtYkZhDE71lsTwLrMq/nW0S02zvb3pqA==} + engines: {node: ^24.11.0, pnpm: ^11.0.0} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.4.5: + resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-json-stringify@1.2.0: + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver-stable@3.0.0: + resolution: {integrity: sha512-lolq9k0lqdnZ0C4+QJvrPBWiAHGhLaVSMTPJajn527ptOHAcZnEhj0n2r6ALnryNiRKPO9AIO9iBI3ZSheHCaw==} + engines: {node: '>=0.10.0'} + + semver-utils@1.1.4: + resolution: {integrity: sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shlex@3.0.0: + resolution: {integrity: sha512-jHPXQQk9d/QXCvJuLPYMOYWez3c43sORAgcIEoV7bFv5AJSJRAOyw5lQO12PMfd385qiLRCaDt7OtEzgrIGZUA==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + + sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@13.0.1: + resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + string-width-cjs@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + aliasOf: string-width + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi-cjs@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + aliasOf: strip-ansi + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-comments-strings@1.2.0: + resolution: {integrity: sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ==} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinylogic@2.0.0: + resolution: {integrity: sha512-dljTkiLLITtsjqBvTA1MRZQK/sGP4kI3UJKc3yA9fMzYbMF2RhcN04SeROVqJBIYYOoJMM8u0WDnhFwMSFQotw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-vfile@8.0.0: + resolution: {integrity: sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==} + + toml-eslint-parser@1.0.3: + resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + typanion@3.14.0: + resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@5.10.0: + resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} + engines: {node: '>=20'} + + typed-rest-client@3.1.0: + resolution: {integrity: sha512-8fMeur8aKaJw8WsqYUZD4CsUfpMFH3zWlRQigM3KWs406KGjqPMdTBn7RfIpMvPjZ1bH+S8QwG+FK/VY/8ndKg==} + engines: {node: '>= 20.0.0'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + uc.micro@3.0.0: + resolution: {integrity: sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + underscore@1.13.8: + resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} + + undici@8.11.0: + resolution: {integrity: sha512-AdzuGcAkzhbha3GgCSoUBx2P0quwym6qdFNCQz/fDGZc8w9XJ741wHUbt2kTmfPz+ZIOMkySFkiY7RXmiDDC8w==} + engines: {node: '>=22.19.0'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@3.0.8: + resolution: {integrity: sha512-YAsrLMIlhfSCm9rga5TZsJ1mXgahs7N0qOTokzU8mFz35hUrYMvVkaEPefI3rEb/vkAWAOj1Km/qdije9RC1kQ==} + engines: {node: '>=20'} + + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@7.0.0: + resolution: {integrity: sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi-cjs@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + aliasOf: wrap-ansi + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + write-yaml-file@4.2.0: + resolution: {integrity: sha512-LwyucHy0uhWqbrOkh9cBluZBeNVxzHjDaE9mwepZG3n3ZlbM4v3ndrFw51zW/NXYFFqP+QWZ72ihtLWTh05e4Q==} + engines: {node: '>=10.13'} + + xmldoc@3.0.0: + resolution: {integrity: sha512-lwxfsv7+O+0vSVSDlfK60afS7kWWGMFeJmbZQwRfHPY37oPDBQ1iI4sCE14bE+NeJeNG0hC0M4RETUavPcvk6w==} + engines: {node: '>=22.0.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yauzl@3.4.0: + resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} + engines: {node: '>=12'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@arcanis/slice-ansi@1.1.1': + dependencies: + grapheme-splitter: 1.0.4 + + '@aws-sdk/checksums@3.1001.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-codecommit@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-ec2@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/middleware-sdk-ec2': 3.972.59 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-ecr@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-eks@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-rds@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/middleware-sdk-rds': 3.972.59 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.1117.0': + dependencies: + '@aws-sdk/checksums': 3.1001.0 + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/middleware-sdk-s3': 3.972.76 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.978.0': + dependencies: + '@aws-sdk/types': 3.974.5 + '@aws-sdk/xml-builder': 3.972.40 + '@aws/lambda-invoke-store': 0.3.0 + '@smithy/core': 3.34.1 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.972.70': + dependencies: + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.71': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.73': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.973.16': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-env': 3.972.71 + '@aws-sdk/credential-provider-http': 3.972.73 + '@aws-sdk/credential-provider-login': 3.972.78 + '@aws-sdk/credential-provider-process': 3.972.71 + '@aws-sdk/credential-provider-sso': 3.973.15 + '@aws-sdk/credential-provider-web-identity': 3.972.77 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-login@3.972.78': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-node@3.972.83': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.71 + '@aws-sdk/credential-provider-http': 3.972.73 + '@aws-sdk/credential-provider-ini': 3.973.16 + '@aws-sdk/credential-provider-process': 3.972.71 + '@aws-sdk/credential-provider-sso': 3.973.15 + '@aws-sdk/credential-provider-web-identity': 3.972.77 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.71': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.973.15': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/token-providers': 3.1129.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-web-identity@3.972.77': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/credential-providers@3.1117.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/credential-provider-cognito-identity': 3.972.70 + '@aws-sdk/credential-provider-env': 3.972.71 + '@aws-sdk/credential-provider-http': 3.972.73 + '@aws-sdk/credential-provider-ini': 3.973.16 + '@aws-sdk/credential-provider-login': 3.972.78 + '@aws-sdk/credential-provider-node': 3.972.83 + '@aws-sdk/credential-provider-process': 3.972.71 + '@aws-sdk/credential-provider-sso': 3.973.15 + '@aws-sdk/credential-provider-web-identity': 3.972.77 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-ec2@3.972.59': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-rds@3.972.59': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.76': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.997.45': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.46': + dependencies: + '@aws-sdk/types': 3.974.5 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1129.0': + dependencies: + '@aws-sdk/core': 3.978.0 + '@aws-sdk/nested-clients': 3.997.45 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.974.5': + dependencies: + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.40': + dependencies: + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.3.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime-corejs3@7.29.7': + dependencies: + core-js-pure: 3.50.0 + + '@baszalmstra/rattler@0.2.1': {} + + '@breejs/later@4.2.0': {} + + '@cdktf/hcl2json@0.21.0': + dependencies: + fs-extra: 11.3.0 + + '@grpc/grpc-js@1.14.5': + dependencies: + '@grpc/proto-loader': 0.8.1 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.1': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.6 + yargs: 17.7.3 + + '@gwhitney/detect-indent@7.0.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: 4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: 6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: 7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@keyv/serialize@1.1.1': {} + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + + '@npmcli/fs@5.0.0': + dependencies: + semver: 7.8.5 + + '@one-ini/wasm@0.2.1': {} + + '@opentelemetry/api-logs@0.222.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/context-async-hooks@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-http@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-proto@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/instrumentation-bunyan@0.67.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/instrumentation': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.70.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/instrumentation': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/redis-common': 0.38.3 + '@opentelemetry/semantic-conventions': 1.43.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.222.0 + import-in-the-middle: 3.5.1 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-grpc-exporter-base@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.5 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/redis-common@0.38.3': {} + + '@opentelemetry/resource-detector-aws@2.22.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/resource-detector-azure@0.30.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/resource-detector-gcp@0.57.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + gcp-metadata: 8.1.4 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/resource-detector-github@0.32.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.222.0 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.43.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/catalogs.protocol-parser@1001.0.0': {} + + '@pnpm/catalogs.resolver@1000.0.5': + dependencies: + '@pnpm/catalogs.protocol-parser': 1001.0.0 + '@pnpm/error': 1000.1.0 + + '@pnpm/catalogs.types@1000.0.0': {} + + '@pnpm/constants@1001.3.1': {} + + '@pnpm/constants@6.1.0': {} + + '@pnpm/error@1000.1.0': + dependencies: + '@pnpm/constants': 1001.3.1 + + '@pnpm/error@4.0.0': + dependencies: + '@pnpm/constants': 6.1.0 + + '@pnpm/graceful-fs@2.0.0': + dependencies: + graceful-fs: 4.2.11 + + '@pnpm/parse-overrides@1001.0.4': + dependencies: + '@pnpm/catalogs.resolver': 1000.0.5 + '@pnpm/catalogs.types': 1000.0.0 + '@pnpm/error': 1000.1.0 + '@pnpm/parse-wanted-dependency': 1001.0.0 + + '@pnpm/parse-wanted-dependency@1001.0.0': + dependencies: + validate-npm-package-name: 5.0.0 + + '@pnpm/read-project-manifest@4.1.1': + dependencies: + '@gwhitney/detect-indent': 7.0.1 + '@pnpm/error': 4.0.0 + '@pnpm/graceful-fs': 2.0.0 + '@pnpm/text.comments-parser': 1.0.0 + '@pnpm/types': 8.9.0 + '@pnpm/write-project-manifest': 4.1.1 + fast-deep-equal: 3.1.3 + is-windows: 1.0.2 + json5: 2.2.3 + parse-json: 5.2.0 + read-yaml-file: 2.1.0 + sort-keys: 4.2.0 + strip-bom: 4.0.0 + + '@pnpm/text.comments-parser@1.0.0': + dependencies: + strip-comments-strings: 1.2.0 + + '@pnpm/types@8.9.0': {} + + '@pnpm/util.lex-comparator@1.0.0': {} + + '@pnpm/write-project-manifest@4.1.1': + dependencies: + '@pnpm/text.comments-parser': 1.0.0 + '@pnpm/types': 8.9.0 + json5: 2.2.3 + write-file-atomic: 5.0.1 + write-yaml-file: 4.2.0 + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + + '@qnighy/marshal@0.1.3': + dependencies: + '@babel/runtime-corejs3': 7.29.7 + + '@redis/client@6.2.1(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + cluster-key-slot: 1.1.2 + + '@renovatebot/detect-tools@4.0.14': + dependencies: + fs-extra: 11.4.0 + toml-eslint-parser: 1.0.3 + upath: 3.0.8 + zod: 4.5.4 + + '@renovatebot/good-enough-parser@2.0.1': + dependencies: + '@thi.ng/zipper': 1.0.3 + '@types/moo': 0.5.10 + klona: 2.0.6 + moo: 0.5.3 + + '@renovatebot/osv-offline-db@3.0.10': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@renovatebot/osv-offline@3.0.10': + dependencies: + '@renovatebot/osv-offline-db': 3.0.10 + adm-zip: 0.6.0 + debug: 4.4.3 + fs-extra: 11.4.0 + got: 15.1.0 + luxon: 3.7.2 + transitivePeerDependencies: + - supports-color + + '@renovatebot/pep440@5.0.1': {} + + '@renovatebot/pgp@1.4.1': {} + + '@renovatebot/ruby-semver@5.0.0': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/is@8.1.0': {} + + '@smithy/core@3.34.1': + dependencies: + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.5.2': + dependencies: + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.8.0': + dependencies: + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.12.1': + dependencies: + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.7.3': + dependencies: + '@smithy/core': 3.34.1 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@smithy/types@4.18.0': + dependencies: + tslib: 2.8.1 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@thi.ng/api@7.2.0': {} + + '@thi.ng/arrays@1.0.3': + dependencies: + '@thi.ng/api': 7.2.0 + '@thi.ng/checks': 2.9.11 + '@thi.ng/compare': 1.3.34 + '@thi.ng/equiv': 1.0.45 + '@thi.ng/errors': 1.3.4 + '@thi.ng/random': 2.4.8 + + '@thi.ng/checks@2.9.11': + dependencies: + tslib: 2.8.1 + + '@thi.ng/compare@1.3.34': + dependencies: + '@thi.ng/api': 7.2.0 + + '@thi.ng/equiv@1.0.45': {} + + '@thi.ng/errors@1.3.4': {} + + '@thi.ng/hex@1.0.4': {} + + '@thi.ng/random@2.4.8': + dependencies: + '@thi.ng/api': 7.2.0 + '@thi.ng/checks': 2.9.11 + '@thi.ng/hex': 1.0.4 + + '@thi.ng/zipper@1.0.3': + dependencies: + '@thi.ng/api': 7.2.0 + '@thi.ng/arrays': 1.0.3 + '@thi.ng/checks': 2.9.11 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 26.6.2 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/emscripten@1.41.6': {} + + '@types/http-cache-semantics@4.2.0': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 26.6.2 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/moo@0.5.10': {} + + '@types/ms@2.1.0': {} + + '@types/node@26.6.2': + dependencies: + undici-types: 8.9.0 + + '@types/parse-path@7.1.0': + dependencies: + parse-path: 7.1.0 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 26.6.2 + + '@types/semver@7.8.0': {} + + '@types/treeify@1.0.3': {} + + '@types/unist@3.0.3': {} + + '@yarnpkg/core@4.9.1(typanion@3.14.0)': + dependencies: + '@arcanis/slice-ansi': 1.1.1 + '@types/semver': 7.8.0 + '@types/treeify': 1.0.3 + '@yarnpkg/fslib': 3.1.5 + '@yarnpkg/libzip': 3.2.2(@yarnpkg/fslib@3.1.5) + '@yarnpkg/parsers': 3.1.0 + '@yarnpkg/shell': 4.1.3(typanion@3.14.0) + camelcase: 5.3.1 + chalk: 4.1.2 + ci-info: 4.4.0 + clipanion: 4.0.0-rc.4(typanion@3.14.0) + cross-spawn: 7.0.6 + diff: 5.2.2 + dotenv: 16.6.1 + es-toolkit: 1.52.0 + fast-glob: 3.3.3 + got: 11.8.6 + hpagent: 1.2.0 + micromatch: 4.0.8 + p-limit: 2.3.0 + semver: 7.8.5 + strip-ansi: 6.0.1 + tar: 7.5.22 + tinylogic: 2.0.0 + treeify: 1.1.0 + tslib: 2.8.1 + + '@yarnpkg/fslib@3.1.5': + dependencies: + tslib: 2.8.1 + + '@yarnpkg/libzip@3.2.2(@yarnpkg/fslib@3.1.5)': + dependencies: + '@types/emscripten': 1.41.6 + '@yarnpkg/fslib': 3.1.5 + tslib: 2.8.1 + + '@yarnpkg/parsers@3.1.0': + dependencies: + js-yaml: 4.3.2 + tslib: 2.8.1 + + '@yarnpkg/shell@4.1.3(typanion@3.14.0)': + dependencies: + '@yarnpkg/fslib': 3.1.5 + '@yarnpkg/parsers': 3.1.0 + chalk: 4.1.2 + clipanion: 4.0.0-rc.4(typanion@3.14.0) + cross-spawn: 7.0.6 + fast-glob: 3.3.3 + micromatch: 4.0.8 + tslib: 2.8.1 + + abbrev@5.0.0: + optional: true + + adm-zip@0.6.0: {} + + ae-cvss-calculator@1.0.13: {} + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.3.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + argparse@3.0.2: {} + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + aws4@1.13.2: {} + + azure-devops-node-api@17.0.0: + dependencies: + tunnel: 0.0.6 + typed-rest-client: 3.1.0 + + backslash@0.2.2: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + + bignumber.js@9.3.1: {} + + boolbase@1.0.0: {} + + boolean@3.2.0: {} + + bowser@2.14.1: {} + + brace-expansion@1.1.21: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + optional: true + + brace-expansion@2.1.7: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + builtins@5.1.0: + dependencies: + semver: 7.8.5 + + bunyan@1.8.15: + optionalDependencies: + dtrace-provider: 0.8.8 + moment: 2.31.0 + mv: 2.1.1 + safe-json-stringify: 1.2.0 + + byte-counter@0.1.0: {} + + cacache@20.0.4: + dependencies: + '@npmcli/fs': 5.0.0 + fs-minipass: 3.0.3 + glob: 13.0.6 + lru-cache: 11.5.2 + minipass: 7.1.3 + minipass-collect: 2.0.1 + minipass-flush: 1.0.7 + minipass-pipeline: 1.2.4 + p-map: 7.0.7 + ssri: 13.0.1 + + cacheable-lookup@5.0.4: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@13.0.19: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 9.0.1 + http-cache-semantics: 4.2.0 + keyv: 5.6.0 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 4.0.2 + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camelcase@5.3.1: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + changelog-filename-regex@2.0.1: {} + + character-entities@2.0.2: {} + + chownr@3.0.0: {} + + chunk-data@0.1.0: {} + + ci-info@4.4.0: {} + + cjs-module-lexer@2.2.1: {} + + clean-git-ref@2.0.1: {} + + clipanion@4.0.0-rc.4(typanion@3.14.0): + dependencies: + typanion: 3.14.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + cluster-key-slot@1.1.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@14.0.3: {} + + commander@15.0.0: {} + + common-tags@1.8.2: {} + + concat-map@0.0.1: + optional: true + + core-js-pure@3.50.0: {} + + croner@10.0.1: {} + + cronstrue@3.24.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + data-uri-to-buffer@4.0.1: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@10.0.0: + dependencies: + mimic-response: 4.0.0 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deepmerge@4.3.1: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + detect-indent@7.0.2: {} + + detect-node@2.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.2: {} + + diff@9.0.0: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@16.6.1: {} + + dtrace-provider@0.8.8: + dependencies: + nan: 2.29.0 + optional: true + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + editorconfig@3.0.2: + dependencies: + '@one-ini/wasm': 0.2.1 + commander: 14.0.3 + minimatch: 10.2.6 + semver: 7.8.5 + + email-addresses@5.0.0: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojibase-regex@17.0.0: {} + + emojibase@17.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + entities@8.1.0: {} + + env-paths@2.2.1: + optional: true + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@3.0.2: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-toolkit@1.52.0: {} + + es6-error@4.1.1: {} + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-visitor-keys@5.0.1: {} + + eventemitter3@5.0.4: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exponential-backoff@3.1.3: + optional: true + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.3: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.7): + dependencies: + picomatch: 4.0.7 + optional: true + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-packages@10.0.4: + dependencies: + '@pnpm/read-project-manifest': 4.1.1 + '@pnpm/types': 8.9.0 + '@pnpm/util.lex-comparator': 1.0.0 + fast-glob: 3.3.3 + p-filter: 2.1.0 + + find-up@8.0.0: + dependencies: + locate-path: 8.0.0 + unicorn-magic: 0.3.0 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded-parse@2.1.2: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.3 + + function-bind@1.1.2: {} + + gaxios@7.1.3: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + + gaxios@7.3.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.4: + dependencies: + gaxios: 7.1.3 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + gcp-metadata@9.0.4: + dependencies: + gaxios: 7.3.1 + google-logging-utils: 2.0.1 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + git-up@8.1.1: + dependencies: + is-ssh: 1.4.1 + parse-url: 9.2.0 + + git-url-parse@16.1.0: + dependencies: + git-up: 8.1.1 + + github-url-from-git@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 + + glob@6.0.4: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + optional: true + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.8.5 + serialize-error: 7.0.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + google-auth-library@11.0.2: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.3.1 + gcp-metadata: 9.0.4 + google-logging-utils: 2.0.1 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + google-logging-utils@1.1.3: {} + + google-logging-utils@2.0.1: {} + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + got@15.1.0: + dependencies: + '@sindresorhus/is': 8.1.0 + byte-counter: 0.1.0 + cacheable-lookup: 7.0.0 + cacheable-request: 13.0.19 + chunk-data: 0.1.0 + decompress-response: 10.0.0 + http2-wrapper: 2.2.1 + keyv: 5.6.0 + lowercase-keys: 4.0.1 + responselike: 4.0.2 + type-fest: 5.10.0 + uint8array-extras: 1.5.0 + + got@16.0.0: + dependencies: + '@sindresorhus/is': 8.1.0 + byte-counter: 0.1.0 + cacheable-request: 13.0.19 + chunk-data: 0.1.0 + decompress-response: 10.0.0 + keyv: 5.6.0 + lowercase-keys: 4.0.1 + responselike: 4.0.2 + type-fest: 5.10.0 + uint8array-extras: 1.5.0 + + graceful-fs@4.2.11: {} + + graph-data-structure@4.5.0: {} + + grapheme-splitter@1.0.4: {} + + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hpagent@1.2.0: {} + + http-cache-semantics@4.2.0: {} + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ignore@7.0.8: {} + + import-in-the-middle@3.5.1: + dependencies: + cjs-module-lexer: 2.2.1 + es-module-lexer: 3.0.2 + module-details-from-path: 1.0.4 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + optional: true + + inherits@2.0.4: {} + + ini@6.0.0: {} + + install-artifact-from-github@1.8.1: + optional: true + + is-arrayish@0.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-ssh@1.4.1: + dependencies: + protocols: 2.0.2 + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-typedarray@1.0.0: {} + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + isexe@4.0.0: + optional: true + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-md4@0.3.2: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-buffer@3.0.1: {} + + json-dup-key-validator@1.0.3: + dependencies: + backslash: 0.2.2 + + json-parse-even-better-errors@2.3.1: {} + + json-stringify-pretty-compact@4.0.0: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonata@2.2.1: {} + + jsonc-morph@0.3.6: {} + + jsonc-weaver@0.3.1: + dependencies: + jsonc-morph: 0.3.6 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + klona@2.0.6: {} + + lines-and-columns@1.2.4: {} + + linkify-it@6.1.0: + dependencies: + uc.micro: 3.0.0 + + locate-path@8.0.0: + dependencies: + p-locate: 6.0.0 + + lodash.camelcase@4.3.0: {} + + long@5.3.2: {} + + longest-streak@3.1.0: {} + + lowercase-keys@2.0.0: {} + + lowercase-keys@3.0.0: {} + + lowercase-keys@4.0.1: {} + + lru-cache@10.4.3: {} + + lru-cache@11.5.2: {} + + luxon@3.7.2: {} + + markdown-it@15.0.1: + dependencies: + argparse: 3.0.2 + entities: 8.1.0 + linkify-it: 6.1.0 + mdurl: 2.1.0 + punycode.js: 2.3.1 + uc.micro: 3.0.0 + + markdown-table@3.0.4: {} + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdurl@2.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.2 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mimic-fn@4.0.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.21 + optional: true + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.7 + + minimist@1.2.8: {} + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.3 + + minipass-flush@1.0.7: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + optional: true + + module-details-from-path@1.0.4: {} + + moment@2.31.0: + optional: true + + moo@0.5.3: {} + + ms@2.1.3: {} + + mv@2.1.1: + dependencies: + mkdirp: 0.5.6 + ncp: 2.0.0 + rimraf: 2.4.5 + optional: true + + nan@2.29.0: + optional: true + + ncp@2.0.0: + optional: true + + neo-async@2.6.2: {} + + neotraverse@1.0.1: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp@13.0.2: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + nopt: 10.0.1 + proc-log: 7.0.0 + semver: 7.8.5 + tar: 7.5.22 + tinyglobby: 0.2.17 + undici: 8.11.0 + which: 7.0.0 + optional: true + + node-html-parser@9.0.3: + dependencies: + css-select: 5.2.2 + entities: 8.1.0 + + nopt@10.0.1: + dependencies: + abbrev: 5.0.0 + optional: true + + normalize-url@6.1.0: {} + + normalize-url@8.1.1: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + openpgp@6.3.1: + optional: true + + p-all@5.0.1: + dependencies: + p-map: 6.0.0 + + p-cancelable@2.1.1: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@2.1.0: {} + + p-map@6.0.0: {} + + p-map@7.0.7: {} + + p-queue@9.3.3: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.2 + + p-throttle@8.1.0: {} + + p-timeout@7.0.2: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-link-header@2.0.0: + dependencies: + xtend: 4.0.2 + + parse-path@7.1.0: + dependencies: + protocols: 2.0.2 + + parse-url@9.2.0: + dependencies: + '@types/parse-path': 7.1.0 + parse-path: 7.1.0 + + path-is-absolute@1.0.1: + optional: true + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.7: + optional: true + + prettier@3.9.6: {} + + proc-log@7.0.0: + optional: true + + protobufjs@7.6.6: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 26.6.2 + long: 5.3.2 + + protobufjs@8.8.0: + dependencies: + long: 5.3.2 + + protocols@2.0.2: {} + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + re2@1.26.1: + dependencies: + install-artifact-from-github: 1.8.1 + nan: 2.29.0 + node-gyp: 13.0.2 + optional: true + + read-yaml-file@2.1.0: + dependencies: + js-yaml: 4.3.2 + strip-bom: 4.0.0 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github@12.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-find-and-replace: 3.0.2 + mdast-util-to-string: 4.0.0 + to-vfile: 8.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + renovate@44.82.0(typanion@3.14.0): + dependencies: + '@aws-sdk/client-codecommit': 3.1117.0 + '@aws-sdk/client-ec2': 3.1117.0 + '@aws-sdk/client-ecr': 3.1117.0 + '@aws-sdk/client-eks': 3.1117.0 + '@aws-sdk/client-rds': 3.1117.0 + '@aws-sdk/client-s3': 3.1117.0 + '@aws-sdk/credential-providers': 3.1117.0 + '@baszalmstra/rattler': 0.2.1 + '@breejs/later': 4.2.0 + '@cdktf/hcl2json': 0.21.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-bunyan': 0.67.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-http': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-redis': 0.70.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-aws': 2.22.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-azure': 0.30.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-gcp': 0.57.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-github': 0.32.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + '@pnpm/parse-overrides': 1001.0.4 + '@qnighy/marshal': 0.1.3 + '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) + '@renovatebot/detect-tools': 4.0.14 + '@renovatebot/good-enough-parser': 2.0.1 + '@renovatebot/osv-offline': 3.0.10 + '@renovatebot/pep440': 5.0.1 + '@renovatebot/pgp': 1.4.1 + '@renovatebot/ruby-semver': 5.0.0 + '@sindresorhus/is': 8.1.0 + '@yarnpkg/core': 4.9.1(typanion@3.14.0) + '@yarnpkg/parsers': 3.1.0 + adm-zip: 0.6.0 + ae-cvss-calculator: 1.0.13 + agentkeepalive: 4.6.0 + async-mutex: 0.5.0 + aws4: 1.13.2 + azure-devops-node-api: 17.0.0 + bunyan: 1.8.15 + cacache: 20.0.4 + changelog-filename-regex: 2.0.1 + clean-git-ref: 2.0.1 + commander: 15.0.0 + common-tags: 1.8.2 + croner: 10.0.1 + cronstrue: 3.24.0 + deepmerge: 4.3.1 + dequal: 2.0.3 + detect-indent: 7.0.2 + diff: 9.0.0 + editorconfig: 3.0.2 + email-addresses: 5.0.0 + emoji-regex: 10.6.0 + emojibase: 17.0.0 + emojibase-regex: 17.0.0 + execa: 8.0.1 + find-packages: 10.0.4 + find-up: 8.0.0 + fs-extra: 11.4.0 + git-url-parse: 16.1.0 + github-url-from-git: 1.5.0 + glob: 13.0.6 + global-agent: 3.0.0 + google-auth-library: 11.0.2 + got: 16.0.0 + graph-data-structure: 4.5.0 + handlebars: 4.7.9 + ignore: 7.0.8 + ini: 6.0.0 + json-dup-key-validator: 1.0.3 + json-stringify-pretty-compact: 4.0.0 + json5: 2.2.3 + jsonata: 2.2.1 + jsonc-weaver: 0.3.1 + klona: 2.0.6 + lru-cache: 11.5.2 + luxon: 3.7.2 + markdown-it: 15.0.1 + markdown-table: 3.0.4 + minimatch: 10.2.6 + moo: 0.5.3 + ms: 2.1.3 + neotraverse: 1.0.1 + node-html-parser: 9.0.3 + p-all: 5.0.1 + p-map: 7.0.7 + p-queue: 9.3.3 + p-throttle: 8.1.0 + parse-link-header: 2.0.0 + prettier: 3.9.6 + protobufjs: 8.8.0 + punycode: 2.3.1 + remark: 15.0.1 + remark-gfm: 4.0.1 + remark-github: 12.0.0 + safe-stable-stringify: 2.5.0 + sax: 1.6.1 + semver: 7.8.5 + semver-stable: 3.0.0 + semver-utils: 1.1.4 + shlex: 3.0.0 + simple-git: 3.36.0 + slugify: 1.6.9 + source-map-support: 0.5.21 + strip-json-comments: 5.0.3 + tar: 7.5.22 + toml-eslint-parser: 1.0.3 + tslib: 2.8.1 + upath: 3.0.8 + url-join: 5.0.0 + validate-npm-package-name: 7.0.2 + xmldoc: 3.0.0 + yaml: 2.9.0 + yauzl: 3.4.0 + zod: 4.5.4 + optionalDependencies: + openpgp: 6.3.1 + re2: 1.26.1 + transitivePeerDependencies: + - '@node-rs/xxhash' + - '@openpgp/web-stream-tools' + - supports-color + + require-directory@2.1.1: {} + + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + responselike@4.0.2: + dependencies: + lowercase-keys: 3.0.0 + + reusify@1.1.0: {} + + rimraf@2.4.5: + dependencies: + glob: 6.0.4 + optional: true + + rimraf@5.0.10: + dependencies: + glob: 10.5.0 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-json-stringify@1.2.0: + optional: true + + safe-stable-stringify@2.5.0: {} + + sax@1.6.1: {} + + semver-compare@1.0.0: {} + + semver-stable@3.0.0: + dependencies: + semver: 6.3.1 + + semver-utils@1.1.4: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shlex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-git@3.36.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + slugify@1.6.9: {} + + sort-keys@4.2.0: + dependencies: + is-plain-obj: 2.1.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: {} + + ssri@13.0.1: + dependencies: + minipass: 7.1.3 + + string-width-cjs@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + strip-ansi-cjs@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + strip-bom@4.0.0: {} + + strip-comments-strings@1.2.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@5.0.3: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tagged-tag@1.0.0: {} + + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + optional: true + + tinylogic@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-vfile@8.0.0: + dependencies: + vfile: 6.0.3 + + toml-eslint-parser@1.0.3: + dependencies: + eslint-visitor-keys: 5.0.1 + + treeify@1.1.0: {} + + trough@2.2.0: {} + + tslib@2.8.1: {} + + tunnel@0.0.6: {} + + typanion@3.14.0: {} + + type-fest@0.13.1: {} + + type-fest@5.10.0: + dependencies: + tagged-tag: 1.0.0 + + typed-rest-client@3.1.0: + dependencies: + des.js: 1.1.0 + js-md4: 0.3.2 + qs: 6.15.3 + tunnel: 0.0.6 + underscore: 1.13.8 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + uc.micro@3.0.0: {} + + uglify-js@3.19.3: + optional: true + + uint8array-extras@1.5.0: {} + + underscore@1.13.8: {} + + undici-types@8.9.0: {} + + undici@8.11.0: + optional: true + + unicorn-magic@0.3.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + upath@3.0.8: {} + + url-join@5.0.0: {} + + validate-npm-package-name@5.0.0: + dependencies: + builtins: 5.1.0 + + validate-npm-package-name@7.0.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + web-streams-polyfill@3.3.3: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@7.0.0: + dependencies: + isexe: 4.0.0 + optional: true + + wordwrap@1.0.0: {} + + wrap-ansi-cjs@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + write-yaml-file@4.2.0: + dependencies: + js-yaml: 4.3.2 + write-file-atomic: 3.0.3 + + xmldoc@3.0.0: + dependencies: + sax: 1.6.1 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@3.4.0: + dependencies: + pend: 1.2.0 + + yocto-queue@1.2.2: {} + + zod@4.5.4: {} + + zwitch@2.0.4: {} diff --git a/.mise/locks/npm-renovate/44.82.0~026f02c4/package.json b/.mise/locks/npm-renovate/44.82.0~026f02c4/package.json new file mode 100644 index 0000000000..0c0e3651eb --- /dev/null +++ b/.mise/locks/npm-renovate/44.82.0~026f02c4/package.json @@ -0,0 +1,12 @@ +{ + "name": "mise-npm-install", + "private": true, + "aube": { + "allowBuilds": { + "re2": true + } + }, + "dependencies": { + "renovate": "44.164.10" + } +} diff --git a/.mise/tasks/build-release.sh b/.mise/tasks/build-release.sh index 620dca77af..30a124fcfa 100755 --- a/.mise/tasks/build-release.sh +++ b/.mise/tasks/build-release.sh @@ -4,5 +4,5 @@ set -euo pipefail -mvn -B package -P 'release,!default,!examples-and-integration-tests' \ +./mvnw -B package -P 'release,!default,!examples-and-integration-tests' \ -Dmaven.test.skip=true -Dgpg.skip=true diff --git a/.mise/tasks/generate_benchmark_summary.py b/.mise/tasks/generate_benchmark_summary.py old mode 100644 new mode 100755 index cd51e8ac03..9199269fcd --- a/.mise/tasks/generate_benchmark_summary.py +++ b/.mise/tasks/generate_benchmark_summary.py @@ -18,12 +18,15 @@ import argparse import json +import math import os import shutil +import subprocess import sys from datetime import datetime, timezone from pathlib import Path -from typing import Dict, List, Optional, Tuple + +PRACTICAL_CHANGE_THRESHOLD = 5.0 def parse_args(): @@ -60,6 +63,11 @@ def parse_args(): default=None, help="Baseline GitHub repository for commit links", ) + parser.add_argument( + "--comparison-note", + default=None, + help="Optional note to include in the benchmark comparison section", + ) parser.add_argument( "--system-info", default=None, @@ -78,7 +86,7 @@ def parse_args(): return parser.parse_args() -def get_system_info() -> Dict[str, str]: +def get_system_info() -> dict[str, str]: """Capture system hardware information.""" import multiprocessing import platform @@ -87,7 +95,7 @@ def get_system_info() -> Dict[str, str]: try: info["cpu_cores"] = str(multiprocessing.cpu_count()) - except Exception: + except NotImplementedError: pass try: @@ -99,17 +107,16 @@ def get_system_info() -> Dict[str, str]: except FileNotFoundError: # macOS try: - import subprocess - result = subprocess.run( ["sysctl", "-n", "machdep.cpu.brand_string"], capture_output=True, + check=False, text=True, timeout=5, ) if result.returncode == 0: info["cpu_model"] = result.stdout.strip() - except Exception: + except (OSError, subprocess.SubprocessError): pass try: @@ -122,18 +129,17 @@ def get_system_info() -> Dict[str, str]: except FileNotFoundError: # macOS try: - import subprocess - result = subprocess.run( ["sysctl", "-n", "hw.memsize"], capture_output=True, + check=False, text=True, timeout=5, ) if result.returncode == 0: bytes_mem = int(result.stdout.strip()) info["memory_gb"] = str(round(bytes_mem / 1024 / 1024 / 1024)) - except Exception: + except (OSError, ValueError, subprocess.SubprocessError): pass info["os"] = f"{platform.system()} {platform.release()}" @@ -141,7 +147,7 @@ def get_system_info() -> Dict[str, str]: return info -def read_system_info(path: Optional[str]) -> Dict[str, str]: +def read_system_info(path: str | None) -> dict[str, str]: """Read system info from JSON, or capture it from the current host.""" if not path: return get_system_info() @@ -158,7 +164,7 @@ def write_system_info(path: str) -> None: f.write("\n") -def format_system_info(sysinfo: Optional[Dict[str, str]]) -> str: +def format_system_info(sysinfo: dict[str, str] | None) -> str: """Format captured system info for markdown.""" if not sysinfo: return "unknown" @@ -174,23 +180,22 @@ def format_system_info(sysinfo: Optional[Dict[str, str]]) -> str: return ", ".join(parts) if parts else "unknown" -def get_commit_sha(provided_sha: Optional[str]) -> str: +def get_commit_sha(provided_sha: str | None) -> str: """Get commit SHA from argument, git, or return 'local'.""" if provided_sha: return provided_sha try: - import subprocess - result = subprocess.run( ["git", "rev-parse", "HEAD"], capture_output=True, + check=False, text=True, timeout=5, ) if result.returncode == 0: return result.stdout.strip() - except Exception: + except (OSError, subprocess.SubprocessError): pass return "local" @@ -199,7 +204,7 @@ def get_commit_sha(provided_sha: Optional[str]) -> str: def format_score(score) -> str: """Format score with appropriate precision.""" if score is None: - return "" + return "—" try: val = float(score) if val >= 1_000_000: @@ -216,7 +221,7 @@ def format_error(error) -> str: """Format error value, handling NaN.""" try: error_val = float(error) - if error_val != error_val: # NaN check + if math.isnan(error_val): return "" elif error_val >= 1_000: return f"± {error_val / 1_000:.2f}K" @@ -239,18 +244,18 @@ def short_benchmark_name(name: str) -> str: return name.replace("io.prometheus.metrics.benchmarks.", "") -def metric_score(result: Dict) -> Optional[float]: +def metric_score(result: dict) -> float | None: """Extract a benchmark score as a finite float.""" try: score = float(result.get("primaryMetric", {}).get("score")) - if score == score: + if math.isfinite(score): return score except (ValueError, TypeError): pass return None -def score_interval(result: Dict) -> Optional[Tuple[float, float]]: +def score_interval(result: dict) -> tuple[float, float] | None: """Extract the JMH confidence interval for a benchmark result.""" metric = result.get("primaryMetric", {}) confidence = metric.get("scoreConfidence") @@ -258,7 +263,7 @@ def score_interval(result: Dict) -> Optional[Tuple[float, float]]: try: low = float(confidence[0]) high = float(confidence[1]) - if low == low and high == high: + if math.isfinite(low) and math.isfinite(high): return min(low, high), max(low, high) except (ValueError, TypeError): pass @@ -268,78 +273,154 @@ def score_interval(result: Dict) -> Optional[Tuple[float, float]]: return None try: error = float(metric.get("scoreError")) - if error == error: + if math.isfinite(error) and error >= 0: return score - error, score + error except (ValueError, TypeError): pass return None -def lower_is_better(result: Dict) -> bool: +def lower_is_better(result: dict) -> bool: """Return true for JMH modes where lower score is better.""" mode = str(result.get("mode", "")) unit = str(result.get("primaryMetric", {}).get("scoreUnit", "")) return mode in {"avgt", "sample", "ss"} or unit.endswith("/op") -def comparison_status(head: Dict, baseline: Dict) -> str: - """Classify a benchmark comparison using confidence intervals.""" +def normalize_jvm_args(value) -> list: + """Normalize optional JMH JVM argument fields for metadata comparison.""" + if value is None: + return [] + if isinstance(value, list): + return value + return [value] + + +def benchmark_metadata(result: dict) -> dict: + """Return metadata that must match for a base/head comparison.""" + primary_metric = result.get("primaryMetric", {}) + return { + "jmhVersion": result.get("jmhVersion"), + "mode": result.get("mode"), + "vmName": result.get("vmName"), + "vmVersion": result.get("vmVersion"), + "jvmArgs": normalize_jvm_args(result.get("jvmArgs")), + "jvmArgsPrepend": normalize_jvm_args(result.get("jvmArgsPrepend")), + "jvmArgsAppend": normalize_jvm_args(result.get("jvmArgsAppend")), + "threads": result.get("threads"), + "forks": result.get("forks"), + "warmupIterations": result.get("warmupIterations"), + "warmupTime": result.get("warmupTime"), + "warmupBatchSize": result.get("warmupBatchSize"), + "measurementIterations": result.get("measurementIterations"), + "measurementTime": result.get("measurementTime"), + "measurementBatchSize": result.get("measurementBatchSize"), + "jdkVersion": result.get("jdkVersion"), + "scoreUnit": primary_metric.get("scoreUnit"), + "params": result.get("params", {}), + } + + +def comparable_metadata(head: dict, baseline: dict) -> bool: + """Return whether two results describe the same benchmark configuration.""" + return benchmark_metadata(head) == benchmark_metadata(baseline) + + +def comparison_status(head: dict, baseline: dict) -> str: + """Classify a benchmark comparison using confidence intervals and a threshold.""" head_interval = score_interval(head) baseline_interval = score_interval(baseline) head_score = metric_score(head) baseline_score = metric_score(baseline) - if head_score is None or baseline_score is None: - return "" + if ( + not comparable_metadata(head, baseline) + or head_score is None + or baseline_score is None + ): + return "inconclusive" + + change = performance_change(head, baseline) + if change is None: + return "inconclusive" + if head_interval is None or baseline_interval is None: + return "inconclusive (missing or invalid confidence interval)" - is_lower_better = lower_is_better(head) - if head_interval and baseline_interval: - head_low, head_high = head_interval - baseline_low, baseline_high = baseline_interval - if is_lower_better: - if head_high < baseline_low: - return "faster" - if head_low > baseline_high: - return "slower" - else: - if head_low > baseline_high: - return "faster" - if head_high < baseline_low: - return "slower" - return "within noise" + head_low, head_high = head_interval + baseline_low, baseline_high = baseline_interval + intervals_overlap = head_low <= baseline_high and baseline_low <= head_high + if intervals_overlap: + return "inconclusive (overlapping intervals)" + if abs(change) < PRACTICAL_CHANGE_THRESHOLD: + return f"below {PRACTICAL_CHANGE_THRESHOLD:g}% threshold" - if is_lower_better: - return "faster" if head_score < baseline_score else "slower" - return "faster" if head_score > baseline_score else "slower" + return "meaningful improvement" if change > 0 else "meaningful regression" -def performance_change(head: Dict, baseline: Dict) -> Optional[float]: +def performance_change(head: dict, baseline: dict) -> float | None: """Return percent performance change, with positive meaning faster.""" head_score = metric_score(head) baseline_score = metric_score(baseline) - if head_score is None or baseline_score in (None, 0): + if ( + head_score is None + or baseline_score is None + or head_score == 0 + or baseline_score == 0 + ): return None if lower_is_better(head): return (float(baseline_score) / head_score - 1) * 100 return (head_score / float(baseline_score) - 1) * 100 -def format_change(change: Optional[float]) -> str: +def format_change(change: float | None) -> str: """Format a percent performance change.""" if change is None: return "" return f"{change:+.1f}%" +def format_score_with_interval(result: dict) -> str: + """Format a score together with its JMH confidence interval.""" + score = metric_score(result) + interval = score_interval(result) + if score is None or interval is None: + return format_score(score) + low, high = interval + return f"{format_score(score)} [{format_score(low)}, {format_score(high)}]" + + +def metric_direction_note(results: list) -> str: + """Describe whether scores represent throughput or latency.""" + directions = { + "latency" if lower_is_better(result) else "throughput" for result in results + } + if directions == {"throughput"}: + return ( + "Throughput scores are higher-is-better; positive Head vs base deltas " + "indicate faster performance." + ) + if directions == {"latency"}: + return ( + "Latency scores are lower-is-better; positive Head vs base deltas " + "indicate faster performance." + ) + return ( + "Throughput scores are higher-is-better and latency scores are " + "lower-is-better; positive Head vs base deltas indicate faster performance." + ) + + def generate_comparison_section( - results: List, - baseline_results: List, + results: list, + baseline_results: list, commit_sha: str, baseline_sha: str, repo: str, baseline_repo: str, - system_info: Optional[Dict[str, str]] = None, - baseline_system_info: Optional[Dict[str, str]] = None, -) -> List[str]: + comparison_note: str | None = None, + system_info: dict[str, str] | None = None, + baseline_system_info: dict[str, str] | None = None, +) -> list[str]: """Generate a base-vs-head benchmark comparison section.""" by_name = {b.get("benchmark", ""): b for b in results if b.get("benchmark")} baseline_by_name = { @@ -352,7 +433,14 @@ def generate_comparison_section( md.append("") md.append(f"- **Head:** {format_commit_link(commit_sha, repo)}") md.append(f"- **Base:** {format_commit_link(baseline_sha, baseline_repo)}") - md.append("- **Change:** positive means the PR is faster than base.") + md.append(f"- **Metric direction:** {metric_direction_note(results)}") + md.append( + "- **Uncertainty:** values include JMH 99.9% confidence intervals; verdicts use " + "interval overlap and a practical-change threshold as a conservative heuristic, " + "not as a statistical significance test." + ) + if comparison_note: + md.append(f"- **Note:** {comparison_note}") if baseline_system_info: md.append(f"- **Head runner:** {format_system_info(system_info)}") md.append(f"- **Base runner:** {format_system_info(baseline_system_info)}") @@ -367,19 +455,19 @@ def generate_comparison_section( md.append("") return md - md.append("| Benchmark | PR | Base | Change | Result |") - md.append("|:----------|---:|-----:|-------:|:-------|") + md.append( + "| Benchmark | PR (99.9% CI) | Base (99.9% CI) | Head vs base | Regression verdict |" + ) + md.append("|:----------|--------------:|----------------:|-------:|:-------|") for name in common_names: head = by_name[name] baseline = baseline_by_name[name] - head_score = metric_score(head) - baseline_score = metric_score(baseline) md.append( "| " f"{short_benchmark_name(name)} | " - f"{format_score(head_score)} | " - f"{format_score(baseline_score)} | " + f"{format_score_with_interval(head)} | " + f"{format_score_with_interval(baseline)} | " f"{format_change(performance_change(head, baseline))} | " f"{comparison_status(head, baseline)} |" ) @@ -390,7 +478,9 @@ def generate_comparison_section( md.append("") if missing_in_base: missing = ", ".join(short_benchmark_name(name) for name in missing_in_base) - md.append(f"- Benchmarks only in PR results: {missing}") + md.append( + f"- Benchmarks only in PR results (listed separately below): {missing}" + ) if missing_in_head: missing = ", ".join(short_benchmark_name(name) for name in missing_in_head) md.append(f"- Benchmarks only in base results: {missing}") @@ -399,15 +489,70 @@ def generate_comparison_section( return md +def allocation_score(result: dict) -> float | None: + """Read normalized GC allocation, accepting zero but not missing/invalid data.""" + metric = result.get("secondaryMetrics", {}).get("gc.alloc.rate.norm", {}) + if metric.get("scoreUnit") != "B/op": + return None + try: + score = float(metric.get("score")) + except (TypeError, ValueError): + return None + return score if math.isfinite(score) and score >= 0 else None + + +def generate_allocation_section(results: list, baseline_results: list) -> list[str]: + """Show allocation separately from the throughput/latency regression verdict.""" + baseline_by_name = {b.get("benchmark", ""): b for b in baseline_results} + rows = [] + for head in sorted(results, key=lambda b: b.get("benchmark", "")): + name = head.get("benchmark", "") + baseline = baseline_by_name.get(name, {}) + head_score = allocation_score(head) + base_score = allocation_score(baseline) + if head_score is None and base_score is None: + continue + head_text = "—" if head_score is None else f"{head_score:.3f}" + base_text = "—" if base_score is None else f"{base_score:.3f}" + change = "—" + if ( + head_score is not None + and base_score is not None + and comparable_metadata(head, baseline) + ): + change = f"{head_score - base_score:+.3f}" + rows.append( + f"| {short_benchmark_name(name)} | {head_text} | {base_text} | {change} |" + ) + if not rows: + return [] + return [ + "## Allocation per operation", + "", + "JMH GC profiler `gc.alloc.rate.norm`, in bytes per benchmark operation (lower is better).", + ( + "Delta is PR minus base, shown only for matching benchmark configurations. " + "Values are descriptive, not statistical regression verdicts; " + "— means unavailable or not comparable. Each benchmark defines its own operation." + ), + "", + "| Benchmark | PR B/op | Base B/op | Delta B/op |", + "|:----------|--------:|----------:|-----------:|", + *rows, + "", + ] + + def generate_markdown( - results: List, + results: list, commit_sha: str, repo: str, - baseline_results: Optional[List] = None, - baseline_sha: Optional[str] = None, - baseline_repo: Optional[str] = None, - system_info: Optional[Dict[str, str]] = None, - baseline_system_info: Optional[Dict[str, str]] = None, + baseline_results: list | None = None, + baseline_sha: str | None = None, + baseline_repo: str | None = None, + comparison_note: str | None = None, + system_info: dict[str, str] | None = None, + baseline_system_info: dict[str, str] | None = None, ) -> str: """Generate markdown summary from JMH results.""" datetime_str = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") @@ -416,7 +561,7 @@ def generate_markdown( first = results[0] if results else {} jdk_version = first.get("jdkVersion", "unknown") vm_name = first.get("vmName", "unknown") - threads = first.get("threads", "?") + threads = "/".join(sorted({str(b.get("threads", "?")) for b in results})) or "?" forks = first.get("forks", "?") warmup_iters = first.get("warmupIterations", "?") measure_iters = first.get("measurementIterations", "?") @@ -461,18 +606,35 @@ def generate_markdown( baseline_sha, repo, baseline_repo, + comparison_note=comparison_note, system_info=sysinfo, baseline_system_info=baseline_system_info, ) ) + # A benchmark without a base counterpart cannot receive a regression verdict. + # Keep it out of the comparison-oriented head table and list it separately. + baseline_names = { + b.get("benchmark", "") for b in (baseline_results or []) if b.get("benchmark") + } + if baseline_results: + comparable_results = [ + b for b in results if b.get("benchmark", "") in baseline_names + ] + head_only_results = [ + b for b in results if b.get("benchmark", "") not in baseline_names + ] + else: + comparable_results = results + head_only_results = [] + # Group by benchmark class - benchmarks_by_class: Dict[str, List] = {} - for b in results: + benchmarks_by_class: dict[str, list] = {} + for b in comparable_results: name = b.get("benchmark", "") parts = name.rsplit(".", 1) if len(parts) == 2: - class_name, method = parts + class_name, _method = parts class_short = class_name.split(".")[-1] else: class_short = "Other" @@ -494,46 +656,47 @@ def generate_markdown( reverse=True, ) - md.append("| Benchmark | Score | Error | Units | Within run |") - md.append("|:----------|------:|------:|:------|:-----------|") + md.append("| Benchmark | Score | Error | Units |") + md.append("|:----------|------:|------:|:------|") - best_score = ( - sorted_benchmarks[0].get("primaryMetric", {}).get("score", 1) - if sorted_benchmarks - else 1 - ) - - for i, b in enumerate(sorted_benchmarks): + for b in sorted_benchmarks: name = b.get("benchmark", "").split(".")[-1] - score = b.get("primaryMetric", {}).get("score", 0) - error = b.get("primaryMetric", {}).get("scoreError", 0) + score = b.get("primaryMetric", {}).get("score") + error = b.get("primaryMetric", {}).get("scoreError") unit = b.get("primaryMetric", {}).get("scoreUnit", "ops/s") score_fmt = format_score(score) error_fmt = format_error(error) - # Calculate relative performance as multiplier - try: - if i == 0: - relative_fmt = "**fastest**" - else: - multiplier = float(best_score) / float(score) - if multiplier >= 10: - relative_fmt = f"{multiplier:.0f}x slower" - else: - relative_fmt = f"{multiplier:.1f}x slower" - except (ValueError, TypeError, ZeroDivisionError): - relative_fmt = "" + md.append(f"| {name} | {score_fmt} | {error_fmt} | {unit} |") + + md.append("") + if head_only_results: + md.append("## New benchmarks in PR head") + md.append("") + md.append( + "These benchmarks have no base counterpart; scores are descriptive only " + "and have no regression verdict." + ) + md.append("") + md.append("| Benchmark | Score | Error | Units |") + md.append("|:----------|------:|------:|:------|") + for b in sorted(head_only_results, key=lambda x: x.get("benchmark", "")): + name = short_benchmark_name(b.get("benchmark", "")) + score = b.get("primaryMetric", {}).get("score") + error = b.get("primaryMetric", {}).get("scoreError") + unit = b.get("primaryMetric", {}).get("scoreUnit", "ops/s") md.append( - f"| {name} | {score_fmt} | {error_fmt} | {unit} | {relative_fmt} |" + f"| {name} | {format_score(score)} | {format_error(error)} | {unit} |" ) - md.append("") + md.extend(generate_allocation_section(results, baseline_results or [])) + md.append("### Raw Results") md.append("") - md.append("```") + md.append("```text") md.append( f"{'Benchmark':<50} {'Mode':>6} {'Cnt':>4} {'Score':>14} {'Error':>12} Units" ) @@ -542,18 +705,18 @@ def generate_markdown( name = short_benchmark_name(b.get("benchmark", "")) mode = b.get("mode", "thrpt") cnt = b.get("measurementIterations", 0) * b.get("forks", 1) - score = b.get("primaryMetric", {}).get("score", 0) - error = b.get("primaryMetric", {}).get("scoreError", 0) + score = b.get("primaryMetric", {}).get("score") + error = b.get("primaryMetric", {}).get("scoreError") unit = b.get("primaryMetric", {}).get("scoreUnit", "ops/s") try: score_str = f"{float(score):.3f}" except (ValueError, TypeError): - score_str = str(score) + score_str = format_score(score) try: error_val = float(error) - if error_val != error_val: # NaN + if math.isnan(error_val): error_str = "" else: error_str = f"± {error_val:.3f}" @@ -569,16 +732,22 @@ def generate_markdown( md.append("## Notes") md.append("") - md.append("- **Score** = Throughput in operations per second (higher is better)") + md.append( + "- **Score** = the JMH primary metric; " + "throughput is higher-is-better and latency is lower-is-better." + ) md.append("- **Error** = 99.9% confidence interval") if baseline_results: md.append( - "- **Comparison with base** uses JMH confidence intervals when " - 'available; overlapping intervals are marked "within noise".' + "- **Regression verdict** requires comparable benchmark metadata, " + "non-overlapping JMH confidence intervals, and a change of at least " + f"{PRACTICAL_CHANGE_THRESHOLD:.0f}%; otherwise it is marked " + '"below the practical threshold" or "inconclusive". This is a ' + "conservative heuristic, not a statistical significance test." ) md.append( - "- **Within run** compares benchmarks in the same result set, not against " - "the base commit." + "- Scores for different benchmark methods are not ranked against one another; " + "they may measure different workloads." ) md.append("") @@ -587,8 +756,8 @@ def generate_markdown( md.append("| Benchmark | Description |") md.append("|:----------|:------------|") md.append( - "| **CounterBenchmark** | Counter increment performance: " - "Prometheus, OpenTelemetry, simpleclient, Codahale |" + "| **CounterBenchmark** | Counter updates and label-value lookup " + "(selected methods only) |" ) md.append( "| **HistogramBenchmark** | Histogram observation performance " @@ -671,6 +840,7 @@ def main(): baseline_results=baseline_results, baseline_sha=baseline_sha, baseline_repo=baseline_repo, + comparison_note=args.comparison_note, system_info=system_info, baseline_system_info=baseline_system_info, ) diff --git a/.mise/tasks/jmx-exporter/prepare.py b/.mise/tasks/jmx-exporter/prepare.py index 348415f7f3..845b76661a 100755 --- a/.mise/tasks/jmx-exporter/prepare.py +++ b/.mise/tasks/jmx-exporter/prepare.py @@ -5,7 +5,6 @@ import sys - sys.path.insert(0, ".mise/lib") diff --git a/.mise/tasks/jmx-exporter/test.py b/.mise/tasks/jmx-exporter/test.py index 3e39893004..0f7694c190 100755 --- a/.mise/tasks/jmx-exporter/test.py +++ b/.mise/tasks/jmx-exporter/test.py @@ -5,7 +5,6 @@ import sys - sys.path.insert(0, ".mise/lib") diff --git a/.mise/tasks/lint/bom.py b/.mise/tasks/lint/bom.py index d77b88e231..e4c70988ca 100755 --- a/.mise/tasks/lint/bom.py +++ b/.mise/tasks/lint/bom.py @@ -7,7 +7,6 @@ import sys from fnmatch import fnmatch from pathlib import Path -from typing import List ROOT = Path(__file__).resolve().parents[3] # repo root (.. from .mise/tasks/lint) IGNORE_DIRS = {"prometheus-metrics-parent"} @@ -31,7 +30,7 @@ def first_artifact_id(pom_file: Path) -> str: return matches[1].strip() -def add_dir(dir_path: Path, want: List[str]): +def add_dir(dir_path: Path, want: list[str]): if not dir_path.is_dir(): raise FileNotFoundError(f"Directory {dir_path} does not exist.") @@ -49,8 +48,8 @@ def add_dir(dir_path: Path, want: List[str]): want.append(artifact_id) -def collect_want(root: Path) -> List[str]: - want: List[str] = [] +def collect_want(root: Path) -> list[str]: + want: list[str] = [] # top-level prometheus-metrics* for entry in sorted(root.iterdir()): if entry.is_dir() and fnmatch(entry.name, f"{MODULE_PREFIX}*"): @@ -68,14 +67,15 @@ def collect_want(root: Path) -> List[str]: return want_unique -def collect_have(bom_pom: Path) -> List[str]: +def collect_have(bom_pom: Path) -> list[str]: if not bom_pom.is_file(): raise FileNotFoundError(f"BOM file {bom_pom} does not exist.") text = bom_pom.read_text(encoding="utf-8") # find artifactId values that start with MODULE_PREFIX matches = re.findall( - r"\s*(%s[^<\s]*)\s*" % re.escape(MODULE_PREFIX), text + rf"\s*({re.escape(MODULE_PREFIX)}[^<\s]*)\s*", + text, ) return sorted(matches) @@ -108,7 +108,7 @@ def main() -> int: else: return 0 - except Exception as e: + except (OSError, RuntimeError) as e: print(e, file=sys.stderr) return 1 diff --git a/.mise/tasks/micrometer/prepare.py b/.mise/tasks/micrometer/prepare.py index ba13acf691..c4fbf2208a 100755 --- a/.mise/tasks/micrometer/prepare.py +++ b/.mise/tasks/micrometer/prepare.py @@ -5,7 +5,6 @@ import sys - sys.path.insert(0, ".mise/lib") diff --git a/.mise/tasks/micrometer/test.py b/.mise/tasks/micrometer/test.py index 40316f5695..68fb3f661e 100755 --- a/.mise/tasks/micrometer/test.py +++ b/.mise/tasks/micrometer/test.py @@ -5,7 +5,6 @@ import sys - sys.path.insert(0, ".mise/lib") diff --git a/.mise/tasks/test_generate-benchmark-summary.py b/.mise/tasks/test_generate-benchmark-summary.py new file mode 100644 index 0000000000..82f882fa2e --- /dev/null +++ b/.mise/tasks/test_generate-benchmark-summary.py @@ -0,0 +1,299 @@ +import os +import sys +import unittest + +here = os.path.dirname(__file__) +if here not in sys.path: + sys.path.insert(0, here) + +from generate_benchmark_summary import ( + allocation_score, + comparison_status, + generate_allocation_section, + generate_markdown, +) + + +def result( + name="io.prometheus.metrics.benchmarks.CounterBenchmark.prometheusInc", + score=100.0, + error=1.0, + threads=4, +): + primary_metric = { + "score": score, + "scoreUnit": "ops/s", + } + if error is not None: + primary_metric.update( + { + "scoreError": error, + "scoreConfidence": [score - error, score + error], + } + ) + + return { + "benchmark": name, + "jmhVersion": "1.37", + "mode": "thrpt", + "threads": threads, + "forks": 3, + "warmupIterations": 3, + "warmupTime": "10 s", + "measurementIterations": 5, + "measurementTime": "10 s", + "jdkVersion": "25.0.3", + "primaryMetric": primary_metric, + } + + +def with_allocation(benchmark, score, unit="B/op"): + benchmark["secondaryMetrics"] = { + "gc.alloc.rate.norm": {"score": score, "scoreUnit": unit} + } + return benchmark + + +class TestAllocationSummary(unittest.TestCase): + def test_zero_is_valid_but_missing_invalid_and_wrong_units_are_not(self): + self.assertEqual(allocation_score(with_allocation(result(), 0)), 0) + self.assertIsNone(allocation_score(result())) + self.assertIsNone(allocation_score(with_allocation(result(), 1, "MB/sec"))) + for score in (None, "NaN", float("inf"), -1, "not a number"): + self.assertIsNone(allocation_score(with_allocation(result(), score))) + + def test_allocation_delta_is_absolute_and_lower_is_better(self): + head = with_allocation(result(), 0) + base = with_allocation(result(), 16) + section = "\n".join(generate_allocation_section([head], [base])) + self.assertIn("| 0.000 | 16.000 | -16.000 |", section) + self.assertIn("not statistical regression verdicts", section) + + def test_missing_or_incomparable_base_has_no_delta(self): + head = with_allocation(result(), 16) + for base in ([], [result()], [with_allocation(result(threads=1), 32)]): + section = "\n".join(generate_allocation_section([head], base)) + self.assertTrue(section.rstrip().endswith("| — |")) + self.assertIn( + "| 16.000 | — | — |", + "\n".join(generate_allocation_section([head], [])), + ) + + def test_missing_head_allocation_is_not_reported_as_zero(self): + section = "\n".join( + generate_allocation_section([result()], [with_allocation(result(), 16)]) + ) + self.assertIn("| — | 16.000 | — |", section) + + def test_no_gc_data_omits_allocation_section(self): + self.assertEqual(generate_allocation_section([result()], []), []) + + def test_markdown_includes_head_only_allocations_and_mixed_threads(self): + base = result() + head = with_allocation(result(name="CounterBenchmark.newLookup", threads=1), 24) + markdown = generate_markdown( + [base, head], + "head", + "prometheus/client_java", + [base], + "base", + "prometheus/client_java", + ) + self.assertIn("## Allocation per operation", markdown) + self.assertIn("| CounterBenchmark.newLookup | 24.000 | — | — |", markdown) + self.assertIn("1/4 threads", markdown) + + +class TestBenchmarkComparison(unittest.TestCase): + def test_meaningful_improvement_requires_threshold_and_separation(self): + self.assertEqual( + comparison_status(result(score=106), result()), "meaningful improvement" + ) + + def test_meaningful_regression_requires_threshold_and_separation(self): + self.assertEqual( + comparison_status(result(score=94), result()), "meaningful regression" + ) + + def test_overlapping_intervals_are_inconclusive(self): + self.assertEqual( + comparison_status(result(score=102, error=5), result(error=5)), + "inconclusive (overlapping intervals)", + ) + + def test_overlapping_intervals_are_inconclusive_even_for_large_change(self): + head = result(score=9946.81, error=None) + base = result(score=7239.716, error=None) + head["primaryMetric"]["scoreConfidence"] = [8459.55, 11434.08] + base["primaryMetric"]["scoreConfidence"] = [5298.4, 9181.03] + self.assertEqual( + comparison_status(head, base), "inconclusive (overlapping intervals)" + ) + + def test_non_overlapping_change_below_threshold_is_below_threshold(self): + self.assertEqual( + comparison_status(result(score=103, error=0.1), result(error=0.1)), + "below 5% threshold", + ) + + def test_non_overlapping_change_is_meaningful(self): + self.assertEqual( + comparison_status(result(score=110, error=0.1), result(error=0.1)), + "meaningful improvement", + ) + + def test_mismatched_metadata_is_inconclusive(self): + self.assertEqual(comparison_status(result(threads=1), result()), "inconclusive") + + def test_execution_metadata_mismatch_is_inconclusive(self): + for field, value in ( + ("vmName", "different-vm"), + ("vmVersion", "different-vm-version"), + ("jvmArgs", ["-Xmx1g"]), + ("jvmArgsPrepend", ["-XX:+UseZGC"]), + ("jvmArgsAppend", ["-XX:-UseCompressedOops"]), + ("warmupBatchSize", 2), + ("measurementBatchSize", 2), + ): + head = result() + base = result() + head[field] = value + self.assertEqual(comparison_status(head, base), "inconclusive", field) + + def test_latency_uses_lower_is_better_direction(self): + head = result(score=94, error=1) + base = result(score=100, error=1) + head["mode"] = base["mode"] = "avgt" + head["primaryMetric"]["scoreUnit"] = base["primaryMetric"]["scoreUnit"] = "ms" + self.assertEqual(comparison_status(head, base), "meaningful improvement") + + def test_exact_practical_threshold_is_meaningful(self): + self.assertEqual( + comparison_status(result(score=105, error=0.1), result(error=0.1)), + "meaningful improvement", + ) + + def test_zero_or_non_finite_scores_are_inconclusive(self): + self.assertEqual(comparison_status(result(score=0), result()), "inconclusive") + self.assertEqual(comparison_status(result(), result(score=0)), "inconclusive") + self.assertEqual( + comparison_status(result(score=float("inf")), result()), "inconclusive" + ) + + def test_invalid_fallback_uncertainty_is_inconclusive(self): + for error in (float("inf"), float("-inf"), -1.0): + head = result(error=error) + head["primaryMetric"].pop("scoreConfidence") + self.assertEqual( + comparison_status(head, result()), + "inconclusive (missing or invalid confidence interval)", + error, + ) + + def test_missing_confidence_interval_is_inconclusive(self): + head = result(score=106, error=None) + self.assertEqual( + comparison_status(head, result()), + "inconclusive (missing or invalid confidence interval)", + ) + + def test_invalid_confidence_interval_is_inconclusive(self): + head = result(score=106, error=1) + head["primaryMetric"]["scoreConfidence"] = [0, float("nan")] + head["primaryMetric"].pop("scoreError") + self.assertEqual( + comparison_status(head, result()), + "inconclusive (missing or invalid confidence interval)", + ) + + +class TestBenchmarkMarkdown(unittest.TestCase): + def test_head_only_benchmarks_are_separate_and_not_ranked(self): + base = [result()] + head_only = result( + name="io.prometheus.metrics.benchmarks.HistogramBenchmark.newProbe", + score=5.0, + ) + markdown = generate_markdown( + base + [head_only], + "head", + "prometheus/client_java", + baseline_results=base, + baseline_sha="base", + baseline_repo="prometheus/client_java", + ) + + self.assertIn( + "| Benchmark | PR (99.9% CI) | Base (99.9% CI) | Head vs base | Regression verdict |", + markdown, + ) + self.assertIn("## New benchmarks in PR head", markdown) + self.assertIn("no base counterpart", markdown) + self.assertIn("Throughput scores are higher-is-better", markdown) + self.assertNotIn("Within run", markdown) + self.assertNotIn("x slower", markdown) + + def test_comparison_table_shows_confidence_intervals_and_uncertainty_note(self): + markdown = generate_markdown( + [result(score=110, error=1)], + "head", + "prometheus/client_java", + baseline_results=[result(score=100, error=1)], + baseline_sha="base", + baseline_repo="prometheus/client_java", + ) + self.assertIn("110.00 [109.00, 111.00]", markdown) + self.assertIn("100.00 [99.00, 101.00]", markdown) + self.assertIn("not as a statistical significance test", markdown) + + def test_real_overlapping_example_is_rendered_with_intervals(self): + head = result(score=9946.81, error=None) + base = result(score=7239.716, error=None) + head["primaryMetric"]["scoreConfidence"] = [8459.55, 11434.08] + base["primaryMetric"]["scoreConfidence"] = [5298.4, 9181.03] + markdown = generate_markdown( + [head], + "head", + "prometheus/client_java", + baseline_results=[base], + baseline_sha="base", + baseline_repo="prometheus/client_java", + ) + self.assertIn("9.95K [8.46K, 11.43K]", markdown) + self.assertIn("7.24K [5.30K, 9.18K]", markdown) + self.assertIn("inconclusive (overlapping intervals)", markdown) + + def test_missing_values_are_not_rendered_as_zero(self): + missing_interval = result(score=106, error=None) + missing_score = result(score=100) + missing_score["primaryMetric"].pop("score") + markdown = generate_markdown( + [missing_interval, missing_score], + "head", + "prometheus/client_java", + baseline_results=[result(), result()], + baseline_sha="base", + baseline_repo="prometheus/client_java", + ) + self.assertIn("106.00 |", markdown) + self.assertIn("— |", markdown) + self.assertNotIn("| 0.00 |", markdown) + + def test_latency_note_is_mode_aware(self): + base = result() + head = result() + base["mode"] = head["mode"] = "avgt" + base["primaryMetric"]["scoreUnit"] = head["primaryMetric"]["scoreUnit"] = "ms" + markdown = generate_markdown( + [head], + "head", + "prometheus/client_java", + baseline_results=[base], + baseline_sha="base", + baseline_repo="prometheus/client_java", + ) + self.assertIn("Latency scores are lower-is-better", markdown) + + +if __name__ == "__main__": + unittest.main() diff --git a/.mise/tasks/test_pr-benchmark-selection.py b/.mise/tasks/test_pr-benchmark-selection.py new file mode 100644 index 0000000000..63befebf78 --- /dev/null +++ b/.mise/tasks/test_pr-benchmark-selection.py @@ -0,0 +1,79 @@ +import re +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +WORKFLOW = (ROOT / ".github/workflows/pr-benchmarks.yml").read_text() +PATTERNS = { + topic: pattern.strip("'\"") + for topic, pattern in re.findall(r"- topic: (\w+)\s+pattern: ([^\n]+)", WORKFLOW) +} +PACKAGE = "io.prometheus.metrics.benchmarks." + + +class TestPrBenchmarkSelection(unittest.TestCase): + def test_only_client_java_counter_and_histogram_methods_are_selected(self): + for topic, class_name in ( + ("counter", "CounterBenchmark"), + ("histogram", "HistogramBenchmark"), + ): + source = ( + ROOT + / "benchmarks/src/main/java/io/prometheus/metrics/benchmarks" + / f"{class_name}.java" + ).read_text() + methods = re.findall( + r"@Benchmark\s+@Threads\(\d+\)\s+public \S+ (\w+)\(", source + ) + self.assertTrue(methods) + for method in methods: + with self.subTest(method=method): + selected = re.search( + PATTERNS[topic], PACKAGE + class_name + "." + method + ) + self.assertEqual( + selected is not None, method.startswith("prometheus") + ) + + def test_external_systems_including_future_bound_instruments_are_excluded(self): + for class_name in ("CounterBenchmark", "HistogramBenchmark"): + for method in ( + "openTelemetryAdd", + "openTelemetryBoundInc", + "openTelemetryBoundClassic", + "codahaleIncNoLabels", + "simpleclientAdd", + "simpleclient", + ): + name = PACKAGE + class_name + "." + method + self.assertFalse( + any(re.search(p, name) for p in PATTERNS.values()), name + ) + + def test_all_lookup_and_cached_variants_are_selected(self): + for method in ( + "prometheusLabelValuesInc", + "prometheusLabelValuesIncSingleThread", + "prometheusCachedLabelValuesInc", + "prometheusCachedLabelValuesIncSingleThread", + ): + self.assertRegex( + PACKAGE + "CounterBenchmark." + method, PATTERNS["counter"] + ) + + def test_exposition_keeps_openmetrics_and_prometheus_formats(self): + for class_name in ("HistogramTextFormatBenchmark", "TextFormatUtilBenchmark"): + for method in ("openMetricsWriteToNull", "prometheusWriteToNull"): + self.assertRegex( + PACKAGE + class_name + "." + method, PATTERNS["exposition"] + ) + + def test_base_and_head_use_the_same_selection(self): + self.assertIn("JMH_PATTERN: ${{ matrix.pattern }}", WORKFLOW) + self.assertEqual( + WORKFLOW.count("JMH_ARGS: -f 3 -wi 3 -i 5 ${{ env.JMH_PATTERN }}"), 2 + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/.mise/tasks/test_release_configuration.py b/.mise/tasks/test_release_configuration.py new file mode 100644 index 0000000000..4375e6c2e0 --- /dev/null +++ b/.mise/tasks/test_release_configuration.py @@ -0,0 +1,34 @@ +"""Guard the release reactor configuration without credentials or publishing artifacts.""" + +import re +import shlex +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + + +def profiles(text): + """Read the single explicit Maven profile selection in a release command.""" + selections = re.findall(r"\s-P\s+('[^']*'|\"[^\"]*\"|[^\s]+)", text) + if len(selections) != 1: + raise AssertionError("Expected exactly one explicit Maven -P selection") + return set(shlex.split(selections[0])[0].split(",")) + + +class ReleaseConfigurationTest(unittest.TestCase): + def test_build_and_deploy_use_the_same_release_reactor(self): + build = (ROOT / ".mise/tasks/build-release.sh").read_text() + deploy = (ROOT / ".github/workflows/release.yml").read_text() + expected = {"release", "!default", "!examples-and-integration-tests"} + self.assertEqual(profiles(build), expected) + self.assertEqual(profiles(deploy), profiles(build)) + + def test_regression_detects_the_failed_release_configuration(self): + build = (ROOT / ".mise/tasks/build-release.sh").read_text() + failed_command = "mvn deploy -P 'release,!default' -Dmaven.test.skip=true" + self.assertNotEqual(profiles(failed_command), profiles(build)) + + +if __name__ == "__main__": + unittest.main() diff --git a/.mise/tasks/test_update-benchmarks.py b/.mise/tasks/test_update-benchmarks.py index 3d80b4983f..a42091ef1e 100644 --- a/.mise/tasks/test_update-benchmarks.py +++ b/.mise/tasks/test_update-benchmarks.py @@ -66,7 +66,7 @@ def test_update_only_inserts_matching_class_lines(self): updated = update_pre_blocks_under_module(self.module_path, self.table) # All three files should be updated self.assertEqual( - set(os.path.basename(p) for p in updated), + {os.path.basename(p) for p in updated}, { os.path.basename(self.files["CounterBenchmark"]), os.path.basename(self.files["HistogramBenchmark"]), diff --git a/.mise/tasks/update_benchmarks.py b/.mise/tasks/update_benchmarks.py index b6eeba53c5..6f7f788dd7 100755 --- a/.mise/tasks/update_benchmarks.py +++ b/.mise/tasks/update_benchmarks.py @@ -29,10 +29,9 @@ import shlex import subprocess import sys -from typing import List, Optional -def run_cmd(cmd: List[str], cwd: Optional[str] = None) -> str: +def run_cmd(cmd: list[str], cwd: str | None = None) -> str: """Run a command, stream stdout/stderr to the console for progress, and return the full output. This replaces the previous blocking subprocess.run approach so users can see build / JMH @@ -47,7 +46,7 @@ def run_cmd(cmd: List[str], cwd: Optional[str] = None) -> str: print(f"Command not found: {cmd[0]}") raise - output_lines: List[str] = [] + output_lines: list[str] = [] try: assert proc.stdout is not None # Stream lines as they appear and capture them for returning @@ -94,7 +93,7 @@ def find_benchmarks_jar(module: str) -> str: return jar -def run_jmh(jar: str, java_cmd: str, extra_args: Optional[str]) -> str: +def run_jmh(jar: str, java_cmd: str, extra_args: str | None) -> str: args = [java_cmd, "-jar", jar, "-rf", "text"] if extra_args: args += shlex.split(extra_args) @@ -128,7 +127,7 @@ def extract_first_table(jmh_output: str) -> str: return table -def filter_table_for_class(table: str, class_name: str) -> Optional[str]: +def filter_table_for_class(table: str, class_name: str) -> str | None: """ Return a table string that contains only the header and the lines belonging to `class_name`. If no matching lines are found, return None. @@ -157,16 +156,19 @@ def filter_table_for_class(table: str, class_name: str) -> Optional[str]: return header + "\n" + "\n".join(matched) -def update_pre_blocks_under_module(module: str, table: str) -> List[str]: +def update_pre_blocks_under_module(module: str, table: str) -> list[str]: # Find files under module and update any
...
block that contains 'thrpt' updated_files = [] for path in glob.glob(os.path.join(module, "**"), recursive=True): if os.path.isdir(path): continue + content = None try: with open(path, "r", encoding="utf-8") as f: content = f.read() - except Exception: + except (OSError, UnicodeError): + pass + if content is None: continue # quick filter if "
" not in content or "thrpt" not in content:
@@ -188,10 +190,10 @@ def update_pre_blocks_under_module(module: str, table: str) -> List[str]:
         # This will match patterns like: " * 
... 
" and capture the prefix (e.g. " * ") pattern = re.compile(r"(?m)^(?P[ \t]*\*[ \t]*)
[\s\S]*?
") - def repl(m: re.Match) -> str: + def repl(m: re.Match, replacement_table: str = filtered_table) -> str: prefix = m.group("prefix") # Build the new block with the same prefix on each line - lines = filtered_table.splitlines() + lines = replacement_table.splitlines() replaced = prefix + "
\n"
             for ln in lines:
                 replaced += prefix + ln.rstrip() + "\n"
@@ -207,7 +209,7 @@ def repl(m: re.Match) -> str:
     return updated_files
 
 
-def main(argv: List[str]):
+def main(argv: list[str]):
     parser = argparse.ArgumentParser()
     parser.add_argument("--mvnw", default="./mvnw", help="Path to maven wrapper")
     parser.add_argument(
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
index e788e5e691..fd3cc440db 100644
--- a/.mvn/wrapper/maven-wrapper.properties
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -1,2 +1,2 @@
 distributionType=only-script
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.10.0/apache-maven-3.10.0-bin.zip
diff --git a/AGENTS.md b/AGENTS.md
index 24481b8e5c..2949d8089e 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -15,7 +15,7 @@ mise run ci
 # Quick compile without tests or checks (fastest)
 mise run compile
 
-# Run unit tests only (skips formatting/coverage/checkstyle)
+# Run unit tests only (skips formatting and coverage)
 mise run test
 
 # Run all tests including integration tests
@@ -23,15 +23,15 @@ mise run test-all
 
 # Run a single test class
 ./mvnw test -Dtest=CounterTest \
-  -Dcoverage.skip=true -Dcheckstyle.skip=true
+  -Dcoverage.skip=true
 
 # Run a single test method
 ./mvnw test -Dtest=CounterTest#testIncrement \
-  -Dcoverage.skip=true -Dcheckstyle.skip=true
+  -Dcoverage.skip=true
 
 # Run tests in a specific module
 ./mvnw test -pl prometheus-metrics-core \
-  -Dcoverage.skip=true -Dcheckstyle.skip=true
+  -Dcoverage.skip=true
 
 # Regenerate protobuf classes (after protobuf dep update)
 mise run generate
@@ -125,6 +125,13 @@ commits. CI will fail if these checks fail.
   - Build succeeds (tests are skipped;
     run `mise run test` or `mise run test-all` for tests)
 
+## API Design
+
+- For internal or SDK-facing classes, prefer static factories and builders
+  over adding new public constructors.
+- Keep constructors non-public unless they are intentionally part of the
+  stable API.
+
 ## Testing
 
 - JUnit 5 (Jupiter) with `@Test` annotations
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 81ba1f52ac..41a213b438 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,105 @@
 # Changelog
 
+## [1.10.0](https://github.com/prometheus/client_java/compare/v1.9.0...v1.10.0) (2026-10-16)
+
+
+### Features
+
+* preserve metric suffixes in OpenMetrics 2.0 ([#2529](https://github.com/prometheus/client_java/issues/2529)) ([b1aa8b3](https://github.com/prometheus/client_java/commit/b1aa8b38be304b7c935da77014afb02267ed01a6))
+
+
+### Bug Fixes
+
+* **deps:** update dependency com.github.ben-manes.caffeine:caffeine to v3.3.0 ([#2493](https://github.com/prometheus/client_java/issues/2493)) ([5bf31dc](https://github.com/prometheus/client_java/commit/5bf31dc287edac5eb052f57a561b61b8a3309133))
+* **deps:** update dependency com.github.ben-manes.caffeine:caffeine to v3.3.1 ([#2548](https://github.com/prometheus/client_java/issues/2548)) ([72afa41](https://github.com/prometheus/client_java/commit/72afa4199731ef18b251ccba8ff6d270baf1c0c5))
+* **deps:** update dependency com.google.guava:guava to v33.7.2-jre ([#2510](https://github.com/prometheus/client_java/issues/2510)) ([78820b0](https://github.com/prometheus/client_java/commit/78820b069d07909c40a329922d99a2768959a9b4))
+* **deps:** update dependency io.opentelemetry:opentelemetry-bom to v1.67.0 ([#2547](https://github.com/prometheus/client_java/issues/2547)) ([4c9bf78](https://github.com/prometheus/client_java/commit/4c9bf78055019b5d460a5f1a4e1899cfb6fca275))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.32.0-alpha ([#2523](https://github.com/prometheus/client_java/issues/2523)) ([933c38b](https://github.com/prometheus/client_java/commit/933c38b32853bacd8001db10a4c6511fc483b0e6))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.32.0-alpha ([#2524](https://github.com/prometheus/client_java/issues/2524)) ([d7c3286](https://github.com/prometheus/client_java/commit/d7c3286f0967ae390ecf0611243c16f3d4ceab17))
+* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core to v11.0.27 ([#2543](https://github.com/prometheus/client_java/issues/2543)) ([48c768a](https://github.com/prometheus/client_java/commit/48c768aee1a3d79cc482acfc030c2ce32ce23d1a))
+* **deps:** update dependency renovate to v44.149.1 ([#2549](https://github.com/prometheus/client_java/issues/2549)) ([2edf838](https://github.com/prometheus/client_java/commit/2edf838fa0f734b74beda1e228861bde6018468c))
+* **deps:** update dependency renovate to v44.150.1 ([#2555](https://github.com/prometheus/client_java/issues/2555)) ([7eaa0bd](https://github.com/prometheus/client_java/commit/7eaa0bdfd902a4b6bcd538de0f0da81d97cf53dd))
+* **deps:** update dependency renovate to v44.151.5 ([#2558](https://github.com/prometheus/client_java/issues/2558)) ([52e07ad](https://github.com/prometheus/client_java/commit/52e07ad457afdbb9b2731699e270286454f4f6c1))
+* **deps:** update dependency renovate to v44.153.1 ([#2559](https://github.com/prometheus/client_java/issues/2559)) ([daa9f3a](https://github.com/prometheus/client_java/commit/daa9f3a829bd77edb376081b722b7032f6baad42))
+* **deps:** update dependency renovate to v44.154.0 ([#2560](https://github.com/prometheus/client_java/issues/2560)) ([068ad4e](https://github.com/prometheus/client_java/commit/068ad4e355e97e9183cda5a529dd9a7f0b3c7b20))
+* **deps:** update jetty monorepo to v12.1.14 ([#2527](https://github.com/prometheus/client_java/issues/2527)) ([3fb8ccc](https://github.com/prometheus/client_java/commit/3fb8ccca65cdc176e3015f6038f41a425e481216))
+* don't escape UTF-8 names by default for OpenMetrics 2.0 ([#2519](https://github.com/prometheus/client_java/issues/2519)) ([513a2d7](https://github.com/prometheus/client_java/commit/513a2d79b17ec0438e823e9bce15f8635f029ca3))
+* exclude non-release modules from Maven deployment ([#2481](https://github.com/prometheus/client_java/issues/2481)) ([f27baf4](https://github.com/prometheus/client_java/commit/f27baf4196aea08304df67124e84af4d7e102bab))
+* mark tracer initializer OSGi import optional ([#2528](https://github.com/prometheus/client_java/issues/2528)) ([fc5d0ba](https://github.com/prometheus/client_java/commit/fc5d0ba6fad6c9cb26e455139accd446d250ac08))
+
+
+### Performance Improvements
+
+* scan metric name validity once per metric family ([#2443](https://github.com/prometheus/client_java/issues/2443)) ([5d36228](https://github.com/prometheus/client_java/commit/5d36228aeddfbd7d9160fe7398fa07121431d20c))
+* update otel benchmark dependencies, add otel bound instrument scenarios ([#2451](https://github.com/prometheus/client_java/issues/2451)) ([fd343a2](https://github.com/prometheus/client_java/commit/fd343a2b42a34011fb67fddbca279067e94fb2ab))
+
+## [1.9.0](https://github.com/prometheus/client_java/compare/v1.8.0...v1.9.0) (2026-09-16)
+
+
+### Features
+
+* support metric name filtering in OpenTelemetry exporter ([#2344](https://github.com/prometheus/client_java/issues/2344)) ([9b0ede8](https://github.com/prometheus/client_java/commit/9b0ede830fcf233fb9f9c4cb08ed91ef21fbd667))
+
+
+### Bug Fixes
+
+* avoid protobuf debug reflection in native images ([#2251](https://github.com/prometheus/client_java/issues/2251)) ([7f899e7](https://github.com/prometheus/client_java/commit/7f899e79ded325256bd0e444e33696b5f194700d))
+* bound HTTPServer request resources ([#2333](https://github.com/prometheus/client_java/issues/2333)) ([33ec556](https://github.com/prometheus/client_java/commit/33ec5565227ff60345496edf0186934fc39df25b))
+* bound observation buffering during collection ([#2336](https://github.com/prometheus/client_java/issues/2336)) ([43788f5](https://github.com/prometheus/client_java/commit/43788f583a9078b1be2dc81b22d8645461739523))
+* bound scrape query parameters ([#2334](https://github.com/prometheus/client_java/issues/2334)) ([27e1912](https://github.com/prometheus/client_java/commit/27e19125668227fac1f39599a93efa2d60cb41a5))
+* **ci:** skip benchmark report for skipped runs ([#2422](https://github.com/prometheus/client_java/issues/2422)) ([40eddb0](https://github.com/prometheus/client_java/commit/40eddb060f21054a439bf07961cf55473cb35507))
+* clarify benchmark regression report verdicts ([#2394](https://github.com/prometheus/client_java/issues/2394)) ([e5fa067](https://github.com/prometheus/client_java/commit/e5fa067fec3e07270ebd273cb6903b1f819b1bc6))
+* **deps:** update dependency com.google.guava:guava to v33.7.0-jre ([#2387](https://github.com/prometheus/client_java/issues/2387)) ([bf0db49](https://github.com/prometheus/client_java/commit/bf0db49a9f921d1372edbe0eab554ec50743cd77))
+* **deps:** update dependency io.dropwizard.metrics:metrics-core to v4.2.40 ([#2432](https://github.com/prometheus/client_java/issues/2432)) ([dd88326](https://github.com/prometheus/client_java/commit/dd88326fa9113aadf55627856d788deda42982d8))
+* **deps:** update dependency io.dropwizard.metrics5:metrics-core to v5.0.8 ([#2433](https://github.com/prometheus/client_java/issues/2433)) ([42f3c8a](https://github.com/prometheus/client_java/commit/42f3c8a0d11af4bc5afa84c79b4de7dc16d32e6e))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.29.0-alpha ([#2235](https://github.com/prometheus/client_java/issues/2235)) ([cf9f702](https://github.com/prometheus/client_java/commit/cf9f70219e103c6004d8c315fdcfab2cfd7c447d))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.30.0-alpha ([#2328](https://github.com/prometheus/client_java/issues/2328)) ([1ca2716](https://github.com/prometheus/client_java/commit/1ca27164b646266a10ead6ad1e2e6b5648567b2f))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.30.0-alpha ([#2330](https://github.com/prometheus/client_java/issues/2330)) ([07623c1](https://github.com/prometheus/client_java/commit/07623c14dedfeffed3eace5b8718127add250668))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.31.0-alpha ([#2401](https://github.com/prometheus/client_java/issues/2401)) ([6c26619](https://github.com/prometheus/client_java/commit/6c2661975277a04b6931e8063c3123ac0cf16a69))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.31.0-alpha ([#2402](https://github.com/prometheus/client_java/issues/2402)) ([ac0d68a](https://github.com/prometheus/client_java/commit/ac0d68a62886473ac4afd736602760e97024b528))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.31.1-alpha ([#2409](https://github.com/prometheus/client_java/issues/2409)) ([5eea652](https://github.com/prometheus/client_java/commit/5eea652d80b0c5fdfce1f7e071cdd55cc624ce01))
+* **deps:** update dependency io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha to v2.31.1-alpha ([#2410](https://github.com/prometheus/client_java/issues/2410)) ([0bcef89](https://github.com/prometheus/client_java/commit/0bcef891b2ada3d684266b6cbaf5d373ece7cd84))
+* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core to v11.0.23 ([#2241](https://github.com/prometheus/client_java/issues/2241)) ([a017f80](https://github.com/prometheus/client_java/commit/a017f80980d91a5fa8ffe930c820f836c3d1b2ff))
+* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core to v11.0.24 ([#2294](https://github.com/prometheus/client_java/issues/2294)) ([63967bd](https://github.com/prometheus/client_java/commit/63967bd36ebc638234742ec58ad28f6098a92b3a))
+* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core to v11.0.25 ([#2389](https://github.com/prometheus/client_java/issues/2389)) ([92f8344](https://github.com/prometheus/client_java/commit/92f834476837cab3d281d4b435937e11a2ff7729))
+* **deps:** update dependency org.apache.tomcat.embed:tomcat-embed-core to v11.0.26 ([#2477](https://github.com/prometheus/client_java/issues/2477)) ([05146c0](https://github.com/prometheus/client_java/commit/05146c03858be86fcd88d5d0a90a1073d4e29ec9))
+* **deps:** update dependency org.springframework.boot:spring-boot-starter-parent to v4.1.1 ([#2399](https://github.com/prometheus/client_java/issues/2399)) ([a0b0880](https://github.com/prometheus/client_java/commit/a0b0880cecf00484d610b529a7ffbb5b2c98a65e))
+* **deps:** update jetty monorepo to v12.1.11 ([#2279](https://github.com/prometheus/client_java/issues/2279)) ([4dc54da](https://github.com/prometheus/client_java/commit/4dc54da0c5b768fd66710bd3736b95116df445c5))
+* **deps:** update jetty monorepo to v12.1.12 ([#2371](https://github.com/prometheus/client_java/issues/2371)) ([08967e0](https://github.com/prometheus/client_java/commit/08967e0aca1442935f2052f59f10df66c807ca0b))
+* **deps:** update jetty monorepo to v12.1.13 ([#2459](https://github.com/prometheus/client_java/issues/2459)) ([b217f05](https://github.com/prometheus/client_java/commit/b217f0529e7c2ee11a3883684d767e3744ec7304))
+* **deps:** update junit-framework monorepo to v6.1.2 ([#2300](https://github.com/prometheus/client_java/issues/2300)) ([5966d1d](https://github.com/prometheus/client_java/commit/5966d1d4fdfc30e3a7eb09b0a88da5b2e9dc07c5))
+* **deps:** update junit-framework monorepo to v6.1.3 ([#2374](https://github.com/prometheus/client_java/issues/2374)) ([d1ade52](https://github.com/prometheus/client_java/commit/d1ade5280bdc613d3c7fc5f231ead1e2dca9882e))
+* **deps:** update otel.instrumentation.version ([#2236](https://github.com/prometheus/client_java/issues/2236)) ([158230d](https://github.com/prometheus/client_java/commit/158230d2418a0b6d1b80c590e8fc63c9e444072c))
+* **deps:** update protobuf ([#2400](https://github.com/prometheus/client_java/issues/2400)) ([e2db1ed](https://github.com/prometheus/client_java/commit/e2db1edadbfd87cf284ff72ab7c333d742866d9c))
+* **deps:** update protobuf ([#2438](https://github.com/prometheus/client_java/issues/2438)) ([8ad6fa8](https://github.com/prometheus/client_java/commit/8ad6fa846ab557a020f8805eb5515b0773f11068))
+* **deps:** update protobuf to v4.35.1 ([#2221](https://github.com/prometheus/client_java/issues/2221)) ([cf17073](https://github.com/prometheus/client_java/commit/cf17073eebbdf67bc67dcbea2af30f27a0190079))
+* disable micrometer compat build cache ([#2457](https://github.com/prometheus/client_java/issues/2457)) ([6a40eda](https://github.com/prometheus/client_java/commit/6a40eda1af7dceda5b1f6e1dd9f8aabbce5a189f))
+* drop +Inf bound from OpenTelemetry classic histogram boundaries ([#2458](https://github.com/prometheus/client_java/issues/2458)) ([a3bce9a](https://github.com/prometheus/client_java/commit/a3bce9aafebefedd5020c81965e89c0c608ed9d8))
+* **exposition:** export internal package for OSGi resolution ([#2415](https://github.com/prometheus/client_java/issues/2415)) ([28b503d](https://github.com/prometheus/client_java/commit/28b503df2e9da44a4e26a09f97ed5dfcdca3b19b))
+* **httpserver:** make scrape error responses secure and configurable ([f6d9df5](https://github.com/prometheus/client_java/commit/f6d9df52bc022bfabaa82fd67375f529e4371038))
+* include counter names in negative value errors ([#2315](https://github.com/prometheus/client_java/issues/2315)) ([ea8f935](https://github.com/prometheus/client_java/commit/ea8f935c2112bf511210a065d74e6e3292067e9f))
+* include license files in release source jars ([#2250](https://github.com/prometheus/client_java/issues/2250)) ([08cf925](https://github.com/prometheus/client_java/commit/08cf925b564247a497437e29e4a64ebb335cd328)), closes [#2216](https://github.com/prometheus/client_java/issues/2216)
+* keep late observations out of subsequent collection buffers ([#2471](https://github.com/prometheus/client_java/issues/2471)) ([d78b149](https://github.com/prometheus/client_java/commit/d78b149c8d25bb3ad967e41b4682f8a23423a9f2))
+* keep PR title check required after rebases ([#2414](https://github.com/prometheus/client_java/issues/2414)) ([e3d4c3b](https://github.com/prometheus/client_java/commit/e3d4c3ba66b1e92078cd2f1c8ccc38a803ac3a07))
+* prevent buffer stripe index overflow ([#2331](https://github.com/prometheus/client_java/issues/2331)) ([b6cd000](https://github.com/prometheus/client_java/commit/b6cd000a39f9bbf78cf0ae1209c60910219c9cbf))
+* redact invalid configuration values ([#2335](https://github.com/prometheus/client_java/issues/2335)) ([7e7e533](https://github.com/prometheus/client_java/commit/7e7e53364496a1dd6d21d2c01c59219166d7826d))
+* show uncertainty in benchmark comparisons ([#2476](https://github.com/prometheus/client_java/issues/2476)) ([398d087](https://github.com/prometheus/client_java/commit/398d0872d640d879e9d7207c88ad468b4c170ba9))
+* stabilize OpenTelemetry exporter builder API ([#2257](https://github.com/prometheus/client_java/issues/2257)) ([09e6e2d](https://github.com/prometheus/client_java/commit/09e6e2de9261122b2e03620f9c6264f389f2fd25))
+* Summary quantiles collapsing for targeted quantiles with 2*epsilon >= 1-quantile ([#2396](https://github.com/prometheus/client_java/issues/2396)) ([9c7479f](https://github.com/prometheus/client_java/commit/9c7479fd11beadd70a7c7ea76d40b70f1e3dcc8c))
+* update component-prefixed action tags ([#2419](https://github.com/prometheus/client_java/issues/2419)) ([4acf481](https://github.com/prometheus/client_java/commit/4acf48149bc5e7f1e7ade2d0dbe123a48765c7c1))
+
+
+### Performance Improvements
+
+* skip snapshot rebuild in mergeDuplicates when names are unique ([#2441](https://github.com/prometheus/client_java/issues/2441)) ([8722230](https://github.com/prometheus/client_java/commit/87222302c46c529c8a6f0c1b84fb787a5ba6a963))
+
+
+### Documentation
+
+* add API design guideline to contributing docs ([#2350](https://github.com/prometheus/client_java/issues/2350)) ([23ae29a](https://github.com/prometheus/client_java/commit/23ae29aa71825c2a83abf249fc45cca2a46e3c8b))
+* document scrape query limits in request API ([#2391](https://github.com/prometheus/client_java/issues/2391)) ([ba8f5eb](https://github.com/prometheus/client_java/commit/ba8f5eb121cd4f68574c9657bf86cf42ae5edb93))
+* document semantic PR title guidance ([#2318](https://github.com/prometheus/client_java/issues/2318)) ([5e813a0](https://github.com/prometheus/client_java/commit/5e813a0a8cd488b678fcc55dca85bb8d5c84dbad))
+
 ## [1.8.0](https://github.com/prometheus/client_java/compare/v1.7.0...v1.8.0) (2026-06-11)
 
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d2a93b6769..49d1dc24f8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,6 +12,18 @@ Prometheus uses GitHub to manage reviews of pull requests.
   This will avoid unnecessary work and surely give you and us a good deal
   of inspiration.
 
+## Pull Request Titles
+
+Use a [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary)-style
+title for pull requests:
+
+```text
+[optional scope]: 
+```
+
+For example: `fix(metrics): handle empty scrapes`. Common types include `feat`, `fix`,
+`docs`, `test`, `refactor`, `perf`, `build`, `ci`, `chore`, and `revert`.
+
 ## Signing Off Commits
 
 Every commit must include a `Signed-off-by` line, as required by the
@@ -61,6 +73,13 @@ This requires native lint tools,
 which you can install with `mise run setup:native-lint-tools`.
 These are optional but catch formatting and lint issues before CI.
 
+## API Design
+
+For internal or SDK-facing classes, prefer static factories and builders over
+adding new public constructors. Constructors are difficult to evolve
+compatibly, so keep them non-public unless they are intentionally part of the
+stable API.
+
 ## Running Tests
 
 If you're getting errors when running tests:
@@ -71,20 +90,18 @@ If you're getting errors when running tests:
 ### Running native tests
 
 ```shell
-mise --cd .mise/envs/native run native-test
+mise run native-test
 ```
 
 ### Avoid failures while running tests
 
 - Use `-Dcoverage.skip=true` to skip the coverage check during development.
-- Use `-Dcheckstyle.skip=true` to skip the checkstyle check during development.
 - Use `-Dwarnings=-nowarn` to skip the warnings during development.
 
 Combine all with
 
 ```shell
-./mvnw install -DskipTests -Dcoverage.skip=true \
-  -Dcheckstyle.skip=true -Dwarnings=-nowarn
+./mvnw install -DskipTests -Dcoverage.skip=true -Dwarnings=-nowarn
 ```
 
 or simply
diff --git a/RELEASING.md b/RELEASING.md
index c5ae0ed4b8..6365ba31ae 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -44,6 +44,36 @@ the benchmarks before merging the release PR:
 mise run update-benchmarks
 ```
 
+## Retrying a Failed Maven Central Deployment
+
+A GitHub release and a Maven Central publication are separate operations.
+An immutable GitHub release does not prevent publishing artifacts from its
+existing tag. Do not move the tag or rebuild the release from newer source.
+
+Before retrying, check the failed job's full log and the Sonatype Central
+Deployments page. Maven reactor `SUCCESS` entries can mean artifacts were
+only staged locally; look for an uploaded bundle and deployment ID. If a
+deployment is already pending, inspect it before submitting another one.
+Already published Maven Central versions cannot be overwritten.
+
+For a workflow-only fix, merge the correction to `main`, then dispatch the
+updated workflow with the original release tag:
+
+```shell
+gh workflow run release.yml --repo prometheus/client_java --ref main -f tag=v1.9.0
+```
+
+Replace `v1.9.0` with the tag being recovered. The workflow comes from `main`,
+but its checkout uses the supplied tag. Rerunning the original failed job
+instead uses its original workflow and repeats the same configuration error.
+Changes to scripts or POMs on `main` are not picked up by that tagged checkout;
+those require a separate recovery plan or a new release.
+
+Keep the deployment profile selection aligned with `mise run build-release`:
+examples, benchmarks, and integration tests must not enter the release reactor.
+The Test Build Release workflow checks this configuration before building.
+This check does not validate signing credentials or Sonatype availability.
+
 ## If the Sonatype Central Token is Invalid
 
 The release workflow verifies the token before deploy. If it fails:
diff --git a/benchmarks/README.md b/benchmarks/README.md
index 3859eddea1..0d70149134 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -55,6 +55,35 @@ JMH parameter reference:
 
 ## Results
 
+### Pull request benchmarks
+
+The `benchmark` label runs the PR head and base on the same runner for each topic.
+PR runs select only client_java counter and histogram methods (`prometheus*`), plus
+the exposition benchmarks. OpenTelemetry, Codahale, and legacy simpleclient methods
+are excluded from PR runs, but remain available in the full/local and nightly suites.
+OpenMetrics exposition remains included: it is a client_java output format.
+
+The `CounterBenchmark.prometheusLabelValuesInc*` methods repeatedly look up an
+existing label combination and increment it. The matching
+`prometheusCachedLabelValuesInc*` methods increment a cached data point instead.
+Both have one-thread and four-thread variants sharing a counter. Each invocation
+performs one metric update, so throughput and GC profiler allocation in B/op are
+per update, unlike older benchmarks that batch updates in a loop.
+
+Run just the lookup and cached variants with allocation profiling:
+
+```shell
+./mvnw -pl benchmarks -am package -DskipTests
+java -jar benchmarks/target/benchmarks.jar \
+  'CounterBenchmark[.]prometheus(Cached)?LabelValuesInc.*' \
+  -f 3 -wi 3 -i 5 -prof gc
+```
+
+The PR report shows allocation separately from throughput. Allocation deltas are
+descriptive, not statistical verdicts, and require matching base/head configurations.
+New benchmarks initially have head-only results. To evaluate a production change,
+run the same benchmark source and JVM configuration against both implementations.
+
 See Javadoc of the benchmark classes:
 
 - [CounterBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java)
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index 6d8c9c5c45..c90cd0b606 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   benchmarks
@@ -19,12 +19,31 @@
     1.37
     0.16.0
     3.0.2
+    
+    1.67.0
     true
     true
   
 
   
     
+      
+      
+        io.opentelemetry
+        opentelemetry-bom
+        ${benchmark.otel.version}
+        pom
+        import
+      
+      
+        io.opentelemetry
+        opentelemetry-bom-alpha
+        ${benchmark.otel.version}-alpha
+        pom
+        import
+      
       
         io.opentelemetry.instrumentation
         opentelemetry-instrumentation-bom-alpha
@@ -73,6 +92,10 @@
       io.opentelemetry
       opentelemetry-sdk-testing
     
+    
+      io.opentelemetry
+      opentelemetry-api-incubator
+    
   
   
     ${project.artifactId}
diff --git a/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java
index d8b75e437c..c0cb16b1dc 100644
--- a/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java
+++ b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java
@@ -3,10 +3,15 @@
 import io.opentelemetry.api.OpenTelemetry;
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
+import io.opentelemetry.api.incubator.metrics.BoundDoubleCounter;
+import io.opentelemetry.api.incubator.metrics.BoundLongCounter;
+import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounter;
+import io.opentelemetry.api.incubator.metrics.ExtendedLongCounter;
 import io.opentelemetry.api.metrics.DoubleCounter;
 import io.opentelemetry.api.metrics.LongCounter;
 import io.opentelemetry.api.metrics.Meter;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.metrics.ExemplarFilter;
 import io.opentelemetry.sdk.metrics.SdkMeterProvider;
 import io.opentelemetry.sdk.resources.Resource;
 import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
@@ -55,6 +60,48 @@ public PrometheusCounter() {
     }
   }
 
+  /** Pre-populated labels so lookup benchmarks measure hits, not data point creation. */
+  @State(Scope.Benchmark)
+  public static class PrometheusLabelLookup {
+    final Counter counter =
+        Counter.builder().name("lookup_test").labelNames("path", "status").build();
+    final String path = "/";
+    final String status = "200";
+    final CounterDataPoint cached = counter.labelValues(path, status);
+  }
+
+  // Each invocation performs one increment, so GC profiler B/op is per metric update. Keep the
+  // same work and shared counter in the lookup and cached variants; only label resolution differs.
+  @Benchmark
+  @Threads(1)
+  public CounterDataPoint prometheusLabelValuesIncSingleThread(PrometheusLabelLookup state) {
+    CounterDataPoint dataPoint = state.counter.labelValues(state.path, state.status);
+    dataPoint.inc();
+    return dataPoint;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public CounterDataPoint prometheusLabelValuesInc(PrometheusLabelLookup state) {
+    CounterDataPoint dataPoint = state.counter.labelValues(state.path, state.status);
+    dataPoint.inc();
+    return dataPoint;
+  }
+
+  @Benchmark
+  @Threads(1)
+  public CounterDataPoint prometheusCachedLabelValuesIncSingleThread(PrometheusLabelLookup state) {
+    state.cached.inc();
+    return state.cached;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public CounterDataPoint prometheusCachedLabelValuesInc(PrometheusLabelLookup state) {
+    state.cached.inc();
+    return state.cached;
+  }
+
   @State(Scope.Benchmark)
   public static class SimpleclientCounter {
 
@@ -94,6 +141,7 @@ public OpenTelemetryCounter() {
           SdkMeterProvider.builder()
               .registerMetricReader(InMemoryMetricReader.create())
               .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
               .build();
       OpenTelemetry openTelemetry =
           OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
@@ -111,6 +159,45 @@ public OpenTelemetryCounter() {
     }
   }
 
+  /**
+   * OpenTelemetry counter using the incubator "bound instrument" API, which pre-binds a set of
+   * attributes at initialization time to avoid a per-record attribute map lookup.
+   */
+  @State(Scope.Benchmark)
+  public static class OpenTelemetryBoundCounter {
+
+    final BoundLongCounter longCounter;
+    final BoundDoubleCounter doubleCounter;
+
+    public OpenTelemetryBoundCounter() {
+
+      SdkMeterProvider sdkMeterProvider =
+          SdkMeterProvider.builder()
+              .registerMetricReader(InMemoryMetricReader.create())
+              .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
+              .build();
+      OpenTelemetry openTelemetry =
+          OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
+      Meter meter =
+          openTelemetry
+              .meterBuilder("instrumentation-library-name")
+              .setInstrumentationVersion("1.0.0")
+              .build();
+      Attributes attributes =
+          Attributes.of(
+              AttributeKey.stringKey("path"), "/",
+              AttributeKey.stringKey("status"), "200");
+      this.longCounter =
+          ((ExtendedLongCounter) meter.counterBuilder("test1").setDescription("test").build())
+              .bind(attributes);
+      this.doubleCounter =
+          ((ExtendedDoubleCounter)
+                  meter.counterBuilder("test2").ofDoubles().setDescription("test").build())
+              .bind(attributes);
+    }
+  }
+
   @Benchmark
   @Threads(4)
   public CounterDataPoint prometheusAdd(RandomNumbers randomNumbers, PrometheusCounter counter) {
@@ -156,6 +243,25 @@ public LongCounter openTelemetryIncNoLabels(OpenTelemetryCounter counter) {
     return counter.longCounter;
   }
 
+  @Benchmark
+  @Threads(4)
+  public BoundDoubleCounter openTelemetryBoundAdd(
+      RandomNumbers randomNumbers, OpenTelemetryBoundCounter counter) {
+    for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
+      counter.doubleCounter.add(randomNumbers.randomNumbers[i]);
+    }
+    return counter.doubleCounter;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public BoundLongCounter openTelemetryBoundInc(OpenTelemetryBoundCounter counter) {
+    for (int i = 0; i < 10 * 1024; i++) {
+      counter.longCounter.add(1);
+    }
+    return counter.longCounter;
+  }
+
   @Benchmark
   @Threads(4)
   public io.prometheus.client.Counter.Child simpleclientAdd(
diff --git a/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java
index 72cba0f9f6..29f730e6f5 100644
--- a/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java
+++ b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java
@@ -1,9 +1,14 @@
 package io.prometheus.metrics.benchmarks;
 
 import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.common.AttributeKey;
+import io.opentelemetry.api.common.Attributes;
+import io.opentelemetry.api.incubator.metrics.BoundDoubleHistogram;
+import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram;
 import io.opentelemetry.api.metrics.Meter;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.metrics.Aggregation;
+import io.opentelemetry.sdk.metrics.ExemplarFilter;
 import io.opentelemetry.sdk.metrics.InstrumentSelector;
 import io.opentelemetry.sdk.metrics.SdkMeterProvider;
 import io.opentelemetry.sdk.metrics.View;
@@ -47,6 +52,16 @@ public PrometheusClassicHistogram() {
     }
   }
 
+  @State(Scope.Thread)
+  public static class PrometheusClassicHistogramPerThread {
+
+    final Histogram noLabels;
+
+    public PrometheusClassicHistogramPerThread() {
+      noLabels = Histogram.builder().name("test").help("help").classicOnly().build();
+    }
+  }
+
   @State(Scope.Benchmark)
   public static class PrometheusNativeHistogram {
 
@@ -78,6 +93,7 @@ public SimpleclientHistogram() {
   public static class OpenTelemetryClassicHistogram {
 
     final io.opentelemetry.api.metrics.DoubleHistogram histogram;
+    final Attributes attributes;
 
     public OpenTelemetryClassicHistogram() {
 
@@ -85,6 +101,7 @@ public OpenTelemetryClassicHistogram() {
           SdkMeterProvider.builder()
               .registerMetricReader(InMemoryMetricReader.create())
               .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
               .registerView(
                   InstrumentSelector.builder().setName("test").build(),
                   View.builder()
@@ -102,6 +119,10 @@ public OpenTelemetryClassicHistogram() {
               .setInstrumentationVersion("1.0.0")
               .build();
       this.histogram = meter.histogramBuilder("test").setDescription("test").build();
+      this.attributes =
+          Attributes.of(
+              AttributeKey.stringKey("path"), "/",
+              AttributeKey.stringKey("status"), "200");
     }
   }
 
@@ -109,6 +130,7 @@ public OpenTelemetryClassicHistogram() {
   public static class OpenTelemetryExponentialHistogram {
 
     final io.opentelemetry.api.metrics.DoubleHistogram histogram;
+    final Attributes attributes;
 
     public OpenTelemetryExponentialHistogram() {
 
@@ -116,6 +138,7 @@ public OpenTelemetryExponentialHistogram() {
           SdkMeterProvider.builder()
               .registerMetricReader(InMemoryMetricReader.create())
               .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
               .registerView(
                   InstrumentSelector.builder().setName("test").build(),
                   View.builder()
@@ -130,6 +153,89 @@ public OpenTelemetryExponentialHistogram() {
               .setInstrumentationVersion("1.0.0")
               .build();
       this.histogram = meter.histogramBuilder("test").setDescription("test").build();
+      this.attributes =
+          Attributes.of(
+              AttributeKey.stringKey("path"), "/",
+              AttributeKey.stringKey("status"), "200");
+    }
+  }
+
+  /**
+   * OpenTelemetry classic histogram using the incubator "bound instrument" API to pre-bind
+   * attributes at initialization time.
+   */
+  @State(Scope.Benchmark)
+  public static class OpenTelemetryBoundClassicHistogram {
+
+    final BoundDoubleHistogram histogram;
+
+    public OpenTelemetryBoundClassicHistogram() {
+      SdkMeterProvider sdkMeterProvider =
+          SdkMeterProvider.builder()
+              .registerMetricReader(InMemoryMetricReader.create())
+              .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
+              .registerView(
+                  InstrumentSelector.builder().setName("test").build(),
+                  View.builder()
+                      .setAggregation(
+                          Aggregation.explicitBucketHistogram(
+                              Arrays.asList(
+                                  .005, .01, .025, .05, .1, .25, .5, 1.0, 2.5, 5.0, 10.0)))
+                      .build())
+              .build();
+      OpenTelemetry openTelemetry =
+          OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
+      Meter meter =
+          openTelemetry
+              .meterBuilder("instrumentation-library-name")
+              .setInstrumentationVersion("1.0.0")
+              .build();
+      Attributes attributes =
+          Attributes.of(
+              AttributeKey.stringKey("path"), "/",
+              AttributeKey.stringKey("status"), "200");
+      this.histogram =
+          ((ExtendedDoubleHistogram) meter.histogramBuilder("test").setDescription("test").build())
+              .bind(attributes);
+    }
+  }
+
+  /**
+   * OpenTelemetry exponential histogram using the incubator "bound instrument" API to pre-bind
+   * attributes at initialization time.
+   */
+  @State(Scope.Benchmark)
+  public static class OpenTelemetryBoundExponentialHistogram {
+
+    final BoundDoubleHistogram histogram;
+
+    public OpenTelemetryBoundExponentialHistogram() {
+      SdkMeterProvider sdkMeterProvider =
+          SdkMeterProvider.builder()
+              .registerMetricReader(InMemoryMetricReader.create())
+              .setResource(Resource.getDefault())
+              .setExemplarFilter(ExemplarFilter.alwaysOff())
+              .registerView(
+                  InstrumentSelector.builder().setName("test").build(),
+                  View.builder()
+                      .setAggregation(Aggregation.base2ExponentialBucketHistogram(10_000, 5))
+                      .build())
+              .build();
+      OpenTelemetry openTelemetry =
+          OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
+      Meter meter =
+          openTelemetry
+              .meterBuilder("instrumentation-library-name")
+              .setInstrumentationVersion("1.0.0")
+              .build();
+      Attributes attributes =
+          Attributes.of(
+              AttributeKey.stringKey("path"), "/",
+              AttributeKey.stringKey("status"), "200");
+      this.histogram =
+          ((ExtendedDoubleHistogram) meter.histogramBuilder("test").setDescription("test").build())
+              .bind(attributes);
     }
   }
 
@@ -143,6 +249,26 @@ public Histogram prometheusClassic(
     return histogram.noLabels;
   }
 
+  @Benchmark
+  @Threads(1)
+  public Histogram prometheusClassicSingleThread(
+      RandomNumbers randomNumbers, PrometheusClassicHistogram histogram) {
+    for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
+      histogram.noLabels.observe(randomNumbers.randomNumbers[i]);
+    }
+    return histogram.noLabels;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public Histogram prometheusClassicPerThread(
+      RandomNumbers randomNumbers, PrometheusClassicHistogramPerThread histogram) {
+    for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
+      histogram.noLabels.observe(randomNumbers.randomNumbers[i]);
+    }
+    return histogram.noLabels;
+  }
+
   @Benchmark
   @Threads(4)
   public Histogram prometheusNative(
@@ -168,7 +294,7 @@ public io.prometheus.client.Histogram simpleclient(
   public io.opentelemetry.api.metrics.DoubleHistogram openTelemetryClassic(
       RandomNumbers randomNumbers, OpenTelemetryClassicHistogram histogram) {
     for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
-      histogram.histogram.record(randomNumbers.randomNumbers[i]);
+      histogram.histogram.record(randomNumbers.randomNumbers[i], histogram.attributes);
     }
     return histogram.histogram;
   }
@@ -177,6 +303,26 @@ public io.opentelemetry.api.metrics.DoubleHistogram openTelemetryClassic(
   @Threads(4)
   public io.opentelemetry.api.metrics.DoubleHistogram openTelemetryExponential(
       RandomNumbers randomNumbers, OpenTelemetryExponentialHistogram histogram) {
+    for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
+      histogram.histogram.record(randomNumbers.randomNumbers[i], histogram.attributes);
+    }
+    return histogram.histogram;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public BoundDoubleHistogram openTelemetryBoundClassic(
+      RandomNumbers randomNumbers, OpenTelemetryBoundClassicHistogram histogram) {
+    for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
+      histogram.histogram.record(randomNumbers.randomNumbers[i]);
+    }
+    return histogram.histogram;
+  }
+
+  @Benchmark
+  @Threads(4)
+  public BoundDoubleHistogram openTelemetryBoundExponential(
+      RandomNumbers randomNumbers, OpenTelemetryBoundExponentialHistogram histogram) {
     for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
       histogram.histogram.record(randomNumbers.randomNumbers[i]);
     }
diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml
index 82e9646589..b1b9d6cfe3 100644
--- a/checkstyle-suppressions.xml
+++ b/checkstyle-suppressions.xml
@@ -21,4 +21,12 @@
 
   
   
+
+  
+  
+  
+
+  
+  
 
diff --git a/checkstyle.xml b/checkstyle.xml
index cac6be8d3b..bc6375b3f0 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -48,18 +48,6 @@
   
 
   
-    
-      
-      
-    
-    
-      
-      
-    
     
     
       
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-annotations.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-annotations.txt
new file mode 100644
index 0000000000..c9d8bb58c3
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-annotations.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-annotations-1.9.1-SNAPSHOT.jar against prometheus-metrics-annotations-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-config.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-config.txt
new file mode 100644
index 0000000000..d83c50781b
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-config.txt
@@ -0,0 +1,11 @@
+Comparing source compatibility of prometheus-metrics-config-1.9.1-SNAPSHOT.jar against prometheus-metrics-config-1.9.0.jar
+***  MODIFIED ENUM: PUBLIC FINAL io.prometheus.metrics.config.EscapingScheme  (compatible)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) STATIC(+) io.prometheus.metrics.config.EscapingScheme fromAcceptHeader(java.lang.String, io.prometheus.metrics.config.EscapingScheme)
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.config.OpenMetrics2Properties  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) boolean getSuffixes()
+***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.config.OpenMetrics2Properties$Builder  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.config.OpenMetrics2Properties$Builder suffixes(boolean)
+
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-core.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-core.txt
new file mode 100644
index 0000000000..0488f6c054
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-core.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-core-1.9.1-SNAPSHOT.jar against prometheus-metrics-core-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-common.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-common.txt
new file mode 100644
index 0000000000..f2e0b9b3a9
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-common.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-common-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-common-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-httpserver.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-httpserver.txt
new file mode 100644
index 0000000000..d79d86a72d
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-httpserver.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-httpserver-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-httpserver-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
new file mode 100644
index 0000000000..c28061e7c6
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-shaded.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-shaded.txt
new file mode 100644
index 0000000000..b6df5c4795
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry-shaded.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry.txt
new file mode 100644
index 0000000000..f8af7d6e94
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-opentelemetry.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-no-otel-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-no-otel-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-pushgateway.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-pushgateway.txt
new file mode 100644
index 0000000000..d38138860c
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-pushgateway.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-pushgateway-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-pushgateway-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-jakarta.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-jakarta.txt
new file mode 100644
index 0000000000..37e318bf45
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-jakarta.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-servlet-jakarta-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-jakarta-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-javax.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-javax.txt
new file mode 100644
index 0000000000..8e0517f91f
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exporter-servlet-javax.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-servlet-javax-1.9.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-javax-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats-shaded.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats-shaded.txt
new file mode 100644
index 0000000000..f834ffeff4
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats-shaded.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-formats-1.9.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats.txt
new file mode 100644
index 0000000000..14a4544141
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-formats.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-formats-no-protobuf-1.9.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-no-protobuf-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-textformats.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-textformats.txt
new file mode 100644
index 0000000000..88d0781d26
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-exposition-textformats.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-textformats-1.9.1-SNAPSHOT.jar against prometheus-metrics-exposition-textformats-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-caffeine.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-caffeine.txt
new file mode 100644
index 0000000000..3e82c5092c
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-caffeine.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-caffeine-1.9.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-caffeine-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard.txt
new file mode 100644
index 0000000000..3eda7ebef3
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard-1.9.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard5.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard5.txt
new file mode 100644
index 0000000000..a6c14684b4
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-dropwizard5.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard5-1.9.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard5-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-guava.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-guava.txt
new file mode 100644
index 0000000000..928b7650cf
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-guava.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-guava-1.9.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-guava-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-jvm.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-jvm.txt
new file mode 100644
index 0000000000..4b3de2a8a8
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-instrumentation-jvm.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-jvm-1.9.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-jvm-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-model.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-model.txt
new file mode 100644
index 0000000000..531739c332
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-model.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-model-1.9.1-SNAPSHOT.jar against prometheus-metrics-model-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-simpleclient-bridge.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-simpleclient-bridge.txt
new file mode 100644
index 0000000000..c4b1db09c1
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-simpleclient-bridge.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-simpleclient-bridge-1.9.1-SNAPSHOT.jar against prometheus-metrics-simpleclient-bridge-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-common.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-common.txt
new file mode 100644
index 0000000000..cc215a28e7
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-common.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-common-1.9.1-SNAPSHOT.jar against prometheus-metrics-tracer-common-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-initializer.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-initializer.txt
new file mode 100644
index 0000000000..bc16ce85f0
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-initializer.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-initializer-1.9.1-SNAPSHOT.jar against prometheus-metrics-tracer-initializer-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel-agent.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel-agent.txt
new file mode 100644
index 0000000000..9bb39a0b7f
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel-agent.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-otel-agent-1.9.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-agent-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel.txt b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel.txt
new file mode 100644
index 0000000000..c6e812fa5f
--- /dev/null
+++ b/docs/apidiffs/1.10.0_vs_1.9.0/prometheus-metrics-tracer-otel.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-otel-1.9.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-1.9.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-annotations.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-annotations.txt
new file mode 100644
index 0000000000..a7fe17c136
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-annotations.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-annotations-1.8.1-SNAPSHOT.jar against prometheus-metrics-annotations-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-config.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-config.txt
new file mode 100644
index 0000000000..60dad6c1f2
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-config.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-config-1.8.1-SNAPSHOT.jar against prometheus-metrics-config-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-core.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-core.txt
new file mode 100644
index 0000000000..136f7f6f1a
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-core.txt
@@ -0,0 +1,6 @@
+Comparing source compatibility of prometheus-metrics-core-1.8.1-SNAPSHOT.jar against prometheus-metrics-core-1.8.0.jar
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.core.exemplars.ExemplarSampler  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.core.metrics.Histogram$DataPoint  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-common.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-common.txt
new file mode 100644
index 0000000000..daa5ef822b
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-common.txt
@@ -0,0 +1,4 @@
+Comparing source compatibility of prometheus-metrics-exporter-common-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-common-1.8.0.jar
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.common.PrometheusScrapeHandler  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-httpserver.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-httpserver.txt
new file mode 100644
index 0000000000..55ed8d9c34
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-httpserver.txt
@@ -0,0 +1,21 @@
+Comparing source compatibility of prometheus-metrics-exporter-httpserver-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-httpserver-1.8.0.jar
++++  NEW CLASS: PUBLIC(+) FINAL(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy  (not serializable)
+	+++  CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+	+++  NEW SUPERCLASS: java.lang.Object
+	+++  NEW METHOD: PUBLIC(+) STATIC(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy$Builder builder()
+	+++  NEW METHOD: PUBLIC(+) STATIC(+) java.util.function.Consumer julReporter()
++++  NEW CLASS: PUBLIC(+) STATIC(+) FINAL(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy$Builder  (not serializable)
+	+++  CLASS FILE FORMAT VERSION: 52.0 <- n.a.
+	+++  NEW SUPERCLASS: java.lang.Object
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy build()
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy$Builder errorReporter(java.util.function.Consumer)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy$Builder unsafeDebugResponse(boolean)
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.httpserver.HTTPServer  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.exporter.httpserver.HTTPServer$Builder  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.httpserver.HTTPServer$Builder errorHandlingPolicy(io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy)
+***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.httpserver.MetricsHandler  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW CONSTRUCTOR: PUBLIC(+) MetricsHandler(io.prometheus.metrics.config.PrometheusProperties, io.prometheus.metrics.model.registry.PrometheusRegistry, io.prometheus.metrics.exporter.httpserver.HttpErrorHandlingPolicy)
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
new file mode 100644
index 0000000000..10f0cbe921
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-shaded.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-shaded.txt
new file mode 100644
index 0000000000..1b6d81f728
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry-shaded.txt
@@ -0,0 +1,20 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-1.8.0.jar
+***! MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	---! REMOVED CONSTRUCTOR: PUBLIC(-) OpenTelemetryExporter(io.prometheus.metrics.shaded.io_opentelemetry_2_28_1_alpha.sdk.metrics.export.MetricReader)
+***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter buildAndStart()
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder endpoint(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder header(java.lang.String, java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder intervalSeconds(int)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder preserveNames(boolean)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder protocol(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder registry(io.prometheus.metrics.model.registry.PrometheusRegistry)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder resourceAttribute(java.lang.String, java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceInstanceId(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceName(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceNamespace(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceVersion(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder timeoutSeconds(int)
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry.txt
new file mode 100644
index 0000000000..d0177b813d
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-opentelemetry.txt
@@ -0,0 +1,20 @@
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-no-otel-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-no-otel-1.8.0.jar
+***! MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	---! REMOVED CONSTRUCTOR: PUBLIC(-) OpenTelemetryExporter(io.opentelemetry.sdk.metrics.export.MetricReader)
+***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter buildAndStart()
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder endpoint(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder header(java.lang.String, java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder intervalSeconds(int)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder preserveNames(boolean)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder protocol(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder registry(io.prometheus.metrics.model.registry.PrometheusRegistry)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder resourceAttribute(java.lang.String, java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceInstanceId(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceName(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceNamespace(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceVersion(java.lang.String)
+	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder timeoutSeconds(int)
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-pushgateway.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-pushgateway.txt
new file mode 100644
index 0000000000..9d500f9811
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-pushgateway.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-pushgateway-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-pushgateway-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-jakarta.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-jakarta.txt
new file mode 100644
index 0000000000..324db2bc54
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-jakarta.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-servlet-jakarta-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-jakarta-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-javax.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-javax.txt
new file mode 100644
index 0000000000..38e76eeb4c
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exporter-servlet-javax.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exporter-servlet-javax-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-javax-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats-shaded.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats-shaded.txt
new file mode 100644
index 0000000000..a2c9bee8fe
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats-shaded.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-formats-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats.txt
new file mode 100644
index 0000000000..8dcdc54e96
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-formats.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-formats-no-protobuf-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-no-protobuf-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-textformats.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-textformats.txt
new file mode 100644
index 0000000000..d3e0a25814
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-exposition-textformats.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-exposition-textformats-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-textformats-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-caffeine.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-caffeine.txt
new file mode 100644
index 0000000000..2745dbce5c
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-caffeine.txt
@@ -0,0 +1,6 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-caffeine-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-caffeine-1.8.0.jar
+===  UNCHANGED CLASS: PUBLIC io.prometheus.metrics.instrumentation.caffeine.CacheMetricsCollector  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	===  UNCHANGED METHOD: PUBLIC com.github.benmanes.caffeine.cache.Cache removeCache(java.lang.String)
+		+++  NEW ANNOTATION: javax.annotation.Nullable
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard.txt
new file mode 100644
index 0000000000..f995c74430
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard5.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard5.txt
new file mode 100644
index 0000000000..ebd5b7f563
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-dropwizard5.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard5-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard5-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-guava.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-guava.txt
new file mode 100644
index 0000000000..bb87fbec95
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-guava.txt
@@ -0,0 +1,6 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-guava-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-guava-1.8.0.jar
+===  UNCHANGED CLASS: PUBLIC io.prometheus.metrics.instrumentation.guava.CacheMetricsCollector  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+	===  UNCHANGED METHOD: PUBLIC com.google.common.cache.Cache removeCache(java.lang.String)
+		+++  NEW ANNOTATION: javax.annotation.Nullable
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-jvm.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-jvm.txt
new file mode 100644
index 0000000000..9160a63125
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-instrumentation-jvm.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-instrumentation-jvm-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-jvm-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-model.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-model.txt
new file mode 100644
index 0000000000..d514400194
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-model.txt
@@ -0,0 +1,6 @@
+Comparing source compatibility of prometheus-metrics-model-1.8.1-SNAPSHOT.jar against prometheus-metrics-model-1.8.0.jar
+***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.model.snapshots.CounterSnapshot$CounterDataPointSnapshot  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+***  MODIFIED CLASS: PUBLIC FINAL io.prometheus.metrics.model.snapshots.Labels  (not serializable)
+	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-simpleclient-bridge.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-simpleclient-bridge.txt
new file mode 100644
index 0000000000..28f5e87ab3
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-simpleclient-bridge.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-simpleclient-bridge-1.8.1-SNAPSHOT.jar against prometheus-metrics-simpleclient-bridge-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-common.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-common.txt
new file mode 100644
index 0000000000..720c4c2c83
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-common.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-common-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-common-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-initializer.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-initializer.txt
new file mode 100644
index 0000000000..82cd884d78
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-initializer.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-initializer-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-initializer-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel-agent.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel-agent.txt
new file mode 100644
index 0000000000..c1ac9275d1
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel-agent.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-otel-agent-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-agent-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel.txt b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel.txt
new file mode 100644
index 0000000000..a95f29ea46
--- /dev/null
+++ b/docs/apidiffs/1.9.0_vs_1.8.0/prometheus-metrics-tracer-otel.txt
@@ -0,0 +1,2 @@
+Comparing source compatibility of prometheus-metrics-tracer-otel-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-1.8.0.jar
+No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-annotations.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-annotations.txt
index a7fe17c136..f8b2d0ab27 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-annotations.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-annotations.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-annotations-1.8.1-SNAPSHOT.jar against prometheus-metrics-annotations-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-annotations-1.10.1-SNAPSHOT.jar against prometheus-metrics-annotations-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-config.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-config.txt
index 60dad6c1f2..f7a0b63b72 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-config.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-config.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-config-1.8.1-SNAPSHOT.jar against prometheus-metrics-config-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-config-1.10.1-SNAPSHOT.jar against prometheus-metrics-config-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-core.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-core.txt
index ffb4a1d52d..f417d99060 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-core.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-core.txt
@@ -1,4 +1,2 @@
-Comparing source compatibility of prometheus-metrics-core-1.8.1-SNAPSHOT.jar against prometheus-metrics-core-1.8.0.jar
-***  MODIFIED CLASS: PUBLIC io.prometheus.metrics.core.exemplars.ExemplarSampler  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-
+Comparing source compatibility of prometheus-metrics-core-1.10.1-SNAPSHOT.jar against prometheus-metrics-core-1.10.0.jar
+No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-common.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-common.txt
index e83e9a6f57..edefe7a1f8 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-common.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-common.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-common-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-common-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-common-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-common-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-httpserver.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-httpserver.txt
index 17fccaa455..45e2d1b45d 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-httpserver.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-httpserver.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-httpserver-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-httpserver-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-httpserver-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-httpserver-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
index 10f0cbe921..c2a922a7ee 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-otel-agent-resources.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-otel-agent-resources-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-shaded.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-shaded.txt
index 1b6d81f728..5851eba9d8 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-shaded.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry-shaded.txt
@@ -1,20 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-1.8.0.jar
-***! MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-	---! REMOVED CONSTRUCTOR: PUBLIC(-) OpenTelemetryExporter(io.prometheus.metrics.shaded.io_opentelemetry_2_28_1_alpha.sdk.metrics.export.MetricReader)
-***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter buildAndStart()
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder endpoint(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder header(java.lang.String, java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder intervalSeconds(int)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder preserveNames(boolean)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder protocol(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder registry(io.prometheus.metrics.model.registry.PrometheusRegistry)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder resourceAttribute(java.lang.String, java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceInstanceId(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceName(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceNamespace(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceVersion(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder timeoutSeconds(int)
-
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-1.10.0.jar
+No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry.txt
index d0177b813d..fb07e4064d 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-opentelemetry.txt
@@ -1,20 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-no-otel-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-no-otel-1.8.0.jar
-***! MODIFIED CLASS: PUBLIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-	---! REMOVED CONSTRUCTOR: PUBLIC(-) OpenTelemetryExporter(io.opentelemetry.sdk.metrics.export.MetricReader)
-***  MODIFIED CLASS: PUBLIC STATIC io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter buildAndStart()
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder endpoint(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder header(java.lang.String, java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder intervalSeconds(int)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder preserveNames(boolean)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder protocol(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder registry(io.prometheus.metrics.model.registry.PrometheusRegistry)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder resourceAttribute(java.lang.String, java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceInstanceId(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceName(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceNamespace(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder serviceVersion(java.lang.String)
-	+++  NEW METHOD: PUBLIC(+) io.prometheus.metrics.exporter.opentelemetry.OpenTelemetryExporter$Builder timeoutSeconds(int)
-
+Comparing source compatibility of prometheus-metrics-exporter-opentelemetry-no-otel-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-opentelemetry-no-otel-1.10.0.jar
+No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-pushgateway.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-pushgateway.txt
index 9d500f9811..933bec5ab7 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-pushgateway.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-pushgateway.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-pushgateway-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-pushgateway-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-pushgateway-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-pushgateway-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-jakarta.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-jakarta.txt
index 324db2bc54..6afc191111 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-jakarta.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-jakarta.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-servlet-jakarta-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-jakarta-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-servlet-jakarta-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-jakarta-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-javax.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-javax.txt
index 38e76eeb4c..63883ae35c 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-javax.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exporter-servlet-javax.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exporter-servlet-javax-1.8.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-javax-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exporter-servlet-javax-1.10.1-SNAPSHOT.jar against prometheus-metrics-exporter-servlet-javax-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats-shaded.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats-shaded.txt
index a2c9bee8fe..91e647284a 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats-shaded.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats-shaded.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exposition-formats-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exposition-formats-1.10.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats.txt
index 8dcdc54e96..4acb4739c7 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-formats.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exposition-formats-no-protobuf-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-no-protobuf-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exposition-formats-no-protobuf-1.10.1-SNAPSHOT.jar against prometheus-metrics-exposition-formats-no-protobuf-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-textformats.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-textformats.txt
index d3e0a25814..49f81c5d80 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-textformats.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-exposition-textformats.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-exposition-textformats-1.8.1-SNAPSHOT.jar against prometheus-metrics-exposition-textformats-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-exposition-textformats-1.10.1-SNAPSHOT.jar against prometheus-metrics-exposition-textformats-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-caffeine.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-caffeine.txt
index 731adee45b..d318af56ff 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-caffeine.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-caffeine.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-instrumentation-caffeine-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-caffeine-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-instrumentation-caffeine-1.10.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-caffeine-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard.txt
index f995c74430..ff6078d48b 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard-1.10.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard5.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard5.txt
index ebd5b7f563..687280b792 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard5.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-dropwizard5.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard5-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard5-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-instrumentation-dropwizard5-1.10.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-dropwizard5-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-guava.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-guava.txt
index 7391e926c5..991a1950bc 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-guava.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-guava.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-instrumentation-guava-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-guava-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-instrumentation-guava-1.10.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-guava-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-jvm.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-jvm.txt
index 9160a63125..113ebd8c3f 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-jvm.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-instrumentation-jvm.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-instrumentation-jvm-1.8.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-jvm-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-instrumentation-jvm-1.10.1-SNAPSHOT.jar against prometheus-metrics-instrumentation-jvm-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-model.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-model.txt
index d298829ca6..3807a0ca01 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-model.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-model.txt
@@ -1,4 +1,2 @@
-Comparing source compatibility of prometheus-metrics-model-1.8.1-SNAPSHOT.jar against prometheus-metrics-model-1.8.0.jar
-***  MODIFIED CLASS: PUBLIC FINAL io.prometheus.metrics.model.snapshots.Labels  (not serializable)
-	===  CLASS FILE FORMAT VERSION: 52.0 <- 52.0
-
+Comparing source compatibility of prometheus-metrics-model-1.10.1-SNAPSHOT.jar against prometheus-metrics-model-1.10.0.jar
+No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-simpleclient-bridge.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-simpleclient-bridge.txt
index 28f5e87ab3..f2157b517f 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-simpleclient-bridge.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-simpleclient-bridge.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-simpleclient-bridge-1.8.1-SNAPSHOT.jar against prometheus-metrics-simpleclient-bridge-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-simpleclient-bridge-1.10.1-SNAPSHOT.jar against prometheus-metrics-simpleclient-bridge-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-common.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-common.txt
index 720c4c2c83..1fdbfd87df 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-common.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-common.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-tracer-common-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-common-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-tracer-common-1.10.1-SNAPSHOT.jar against prometheus-metrics-tracer-common-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-initializer.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-initializer.txt
index 82cd884d78..b46b746d5f 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-initializer.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-initializer.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-tracer-initializer-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-initializer-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-tracer-initializer-1.10.1-SNAPSHOT.jar against prometheus-metrics-tracer-initializer-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel-agent.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel-agent.txt
index c1ac9275d1..9fefe32d2e 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel-agent.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel-agent.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-tracer-otel-agent-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-agent-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-tracer-otel-agent-1.10.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-agent-1.10.0.jar
 No changes.
diff --git a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel.txt b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel.txt
index a95f29ea46..92918ad056 100644
--- a/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel.txt
+++ b/docs/apidiffs/current_vs_latest/prometheus-metrics-tracer-otel.txt
@@ -1,2 +1,2 @@
-Comparing source compatibility of prometheus-metrics-tracer-otel-1.8.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-1.8.0.jar
+Comparing source compatibility of prometheus-metrics-tracer-otel-1.10.1-SNAPSHOT.jar against prometheus-metrics-tracer-otel-1.10.0.jar
 No changes.
diff --git a/docs/content/config/config.md b/docs/content/config/config.md
index d3110939f7..099746a12e 100644
--- a/docs/content/config/config.md
+++ b/docs/content/config/config.md
@@ -146,10 +146,11 @@ This works for all Metrics properties.
 | io.prometheus.openmetrics2.composite_values    | [OpenMetrics2Properties.getCompositeValues()]()       | (1)  |
 | io.prometheus.openmetrics2.exemplar_compliance | [OpenMetrics2Properties.getExemplarCompliance()]() | (1)  |
 | io.prometheus.openmetrics2.native_histograms   | [OpenMetrics2Properties.getNativeHistograms()]()     | (1)  |
+| io.prometheus.openmetrics2.suffixes            | [OpenMetrics2Properties.getSuffixes()]()                       | (1)  |
 
 (1) Boolean value, `true` or `false`. `enabled=true` switches OpenMetrics responses to the OM2
-writer, preserving metric names as written by the application. The other OM2 properties remain
-opt-in. All OpenMetrics 2.0 flags are experimental and default to `false`.
+writer. All OM2 properties default to `false`; set `suffixes=true` to preserve OM1 series names
+during migration. All OpenMetrics 2.0 flags are experimental.
 
 ## Exporter Filter Properties
 
diff --git a/docs/content/exporters/filter.md b/docs/content/exporters/filter.md
index ae7ad95643..7d3e71d0e3 100644
--- a/docs/content/exporters/filter.md
+++ b/docs/content/exporters/filter.md
@@ -18,3 +18,13 @@ params:
     - jvm_threads_current
     - jvm_threads_daemon
 ```
+
+## Query parameter limits
+
+For safety, exporters limit the query string to 65,536 characters and accept at most 1,024
+query parameters. The parameter limit counts every `&`-separated pair, including repeated
+parameters and empty pairs. These are fixed implementation limits and cannot be changed through
+runtime configuration.
+
+If a request exceeds either limit or contains invalid percent-encoding, the `/metrics` endpoint
+returns HTTP `400 Bad Request` with the plain-text response `Invalid query parameters`.
diff --git a/docs/content/exporters/httpserver.md b/docs/content/exporters/httpserver.md
index c0db181c97..1845ec9317 100644
--- a/docs/content/exporters/httpserver.md
+++ b/docs/content/exporters/httpserver.md
@@ -26,6 +26,54 @@ or [inetAddress()]().
 
+## Scrape error handling
+
+By default, scrape failures return a generic HTTP 500 response. Exception details are not
+included in the response, and are not logged when the error response can be delivered, because
+the server may run inside an application or a Java agent with its own diagnostic pipeline. If the
+error response itself cannot be delivered, the transport failure is logged because no useful
+client response remains possible.
+
+Configure a reporter to send exception details to an appropriate logging or telemetry sink:
+
+```java
+HTTPServer server = HTTPServer.builder()
+  .port(9400)
+  .errorHandlingPolicy(
+    HttpErrorHandlingPolicy.builder()
+      .errorReporter(error -> logger.log(Level.SEVERE, "Prometheus scrape failed", error))
+      .build())
+  .buildAndStart();
+```
+
+The reporter runs synchronously on the request thread and may be called concurrently. Reporter
+runtime exceptions do not prevent the generic HTTP 500 response from being sent. Rate limiting
+or deduplication can be implemented in the reporter when needed.
+
+For applications using Java Util Logging, the synchronous reporter can be enabled explicitly:
+
+```java
+HttpErrorHandlingPolicy.builder()
+  .errorReporter(HttpErrorHandlingPolicy.julReporter())
+  .build()
+```
+
+This logs scrape exceptions at `SEVERE`. It is intentionally opt-in so applications and Java
+agents do not receive an implicit logging side effect.
+
+For local debugging, an unsafe response containing the full exception stack trace can be enabled
+explicitly:
+
+```java
+HttpErrorHandlingPolicy.builder()
+  .unsafeDebugResponse(true)
+  .build()
+```
+
+This setting is independent of the error reporter, so both can be configured when needed. The
+unsafe debug response can disclose application internals and must not be enabled for an endpoint
+reachable by untrusted clients.
+
 ## Authentication and HTTPS
 
 - [authenticator()]()
diff --git a/docs/content/exporters/openmetrics2.md b/docs/content/exporters/openmetrics2.md
index 607273881d..f65b3b9109 100644
--- a/docs/content/exporters/openmetrics2.md
+++ b/docs/content/exporters/openmetrics2.md
@@ -35,7 +35,8 @@ only need to configure the sub-flags you want.
 With `enabled=true` alone:
 
 - OpenMetrics requests use the OM2 writer.
-- Metric names are preserved as written by the application.
+- Registered metric names are preserved; the required `_info` suffix is still emitted for info
+  metrics.
 - Optional OM2 features such as `composite_values`, `exemplar_compliance`, and
   `native_histograms` remain off.
 
@@ -56,37 +57,43 @@ PrometheusProperties properties = PrometheusProperties.builder()
 
 ## Naming Behavior
 
-OpenMetrics 2.0 removes OM1 suffix rewriting.
+By default, the OpenMetrics 2.0 writer preserves registered metric names:
 
-- Counters do not get `_total` appended automatically.
-- Units do not get appended automatically.
-- Info metrics still end in `_info` because that is required by the spec.
+- Counter and unit suffixes are not appended.
+- Info metrics end in `_info` because that is required by the spec.
+
+Set `suffixes=true` to append missing counter and unit suffixes. Existing suffixes are not
+duplicated.
 
 Examples:
 
-| Metric builder input               | OM1 output        | OM2 output     |
-| ---------------------------------- | ----------------- | -------------- |
-| `Counter("events")`                | `events_total`    | `events`       |
-| `Counter("events_total")`          | `events_total`    | `events_total` |
-| `Counter("req").unit(BYTES)`       | `req_bytes_total` | `req`          |
-| `Counter("req_bytes").unit(BYTES)` | `req_bytes_total` | `req_bytes`    |
-| `Info("target")`                   | `target_info`     | `target_info`  |
+| Metric builder input               | OM1 output        | Default OM2 output |
+| ---------------------------------- | ----------------- | ------------------ |
+| `Counter("events")`                | `events_total`    | `events`            |
+| `Counter("events_total")`          | `events_total`    | `events_total`      |
+| `Counter("req").unit(BYTES)`       | `req_bytes_total` | `req`               |
+| `Counter("req_bytes").unit(BYTES)` | `req_bytes_total` | `req_bytes`         |
+| `Info("target")`                   | `target_info`     | `target_info`       |
+
+To retain the previous OM1-compatible suffix behavior during migration, set:
 
-This means OpenMetrics 2.0 does not apply OM1 suffix behavior such as appending `_total` or unit
-suffixes, while the legacy OpenMetrics 1.0 and Prometheus text formats keep that existing suffix
-behavior.
+```properties
+io.prometheus.openmetrics2.suffixes=true
+```
 
 ## Feature Flags
 
-All OpenMetrics 2.0 flags default to `false`.
+OpenMetrics 2.0 feature flags default to `false`. Set `suffixes=true` to preserve OM1 series names
+while migrating.
 
 | Property                                         | Effect                                                                                 |
 | ------------------------------------------------ | -------------------------------------------------------------------------------------- |
-| `io.prometheus.openmetrics2.enabled`             | Metric names are preserved as written by the application.                              |
+| `io.prometheus.openmetrics2.enabled`             | Enable the OpenMetrics 2.0 writer.                                                      |
 | `io.prometheus.openmetrics2.content_negotiation` | Apply OM2 behavior only when the scraper requests `version=2.0.0`.                     |
 | `io.prometheus.openmetrics2.composite_values`    | Emit histograms, summaries, and gauge histograms as single composite lines with `st@`. |
 | `io.prometheus.openmetrics2.exemplar_compliance` | Emit only OM2-compliant exemplars with timestamps.                                     |
 | `io.prometheus.openmetrics2.native_histograms`   | Emit OM2 native histogram text fields.                                                 |
+| `io.prometheus.openmetrics2.suffixes`            | Append counter and unit suffixes to preserve OM1 series names (opt-in).                |
 
 Enable all flags at once:
 
@@ -104,6 +111,7 @@ io.prometheus.openmetrics2.content_negotiation=true
 io.prometheus.openmetrics2.composite_values=true
 io.prometheus.openmetrics2.exemplar_compliance=true
 io.prometheus.openmetrics2.native_histograms=true
+io.prometheus.openmetrics2.suffixes=true
 ```
 
 ## Content Negotiation
diff --git a/docs/content/exporters/unicode.md b/docs/content/exporters/unicode.md
index 026292c390..15a972e92b 100644
--- a/docs/content/exporters/unicode.md
+++ b/docs/content/exporters/unicode.md
@@ -26,6 +26,23 @@ When `escaping=allow-utf-8` is passed, add valid UTF-8 characters to the metric
 without replacing them. This allows you to use dots in metric and label names, as well as
 other UTF-8 characters, without any replacements.
 
+Names outside the legacy character set must use the quoted syntax in the Prometheus and
+OpenMetrics 1.0 text formats. A quoted metric name is written inside braces, followed by its
+labels. For example, a counter named `test_我喜欢茶` with a `test` label is exposed as:
+
+```text
+# TYPE "test_我喜欢茶" counter
+{"test_我喜欢茶_total",test="test_我喜欢茶"} 1.0
+```
+
+The braces do not turn the metric name into a label. They are the required text-format notation
+for a quoted metric name. See the [Prometheus exposition
+format](https://prometheus.io/docs/instrumenting/exposition_formats/) for the complete syntax.
+
+OpenMetrics 2.0 supports UTF-8 names natively, so when the OpenMetrics 2.0 writer serves a request
+that explicitly asks for `version=2.0.0`, names are not escaped unless the request also contains an
+`escaping` parameter.
+
 ## PushGateway
 
 When using the [Pushgateway]({{< relref "pushgateway.md" >}}), Unicode support has to be enabled
diff --git a/docs/content/getting-started/metric-types.md b/docs/content/getting-started/metric-types.md
index 7522051077..73b4ca433d 100644
--- a/docs/content/getting-started/metric-types.md
+++ b/docs/content/getting-started/metric-types.md
@@ -41,9 +41,9 @@ For the default OpenMetrics 1.0 and Prometheus text formats, counters are expose
 `_total` suffix. You can name a counter either `service_time_seconds` or
 `service_time_seconds_total`; the exposed name will be `service_time_seconds_total` in both cases.
 
-The experimental OpenMetrics 2.0 writer behaves differently: It preserves metric names instead of
-appending `_total` or unit suffixes automatically. In OpenMetrics 2.0, `_total` is recommended for
-counters, but not enforced by the Java client.
+The experimental OpenMetrics 2.0 writer preserves registered metric names by default. Set
+`io.prometheus.openmetrics2.suffixes=true` to append `_total` and unit suffixes for compatibility
+when migrating from OpenMetrics 1.0.
 
 ## Gauge
 
diff --git a/docs/content/otel/otlp.md b/docs/content/otel/otlp.md
index 31aacfcbd4..e2ea987dd0 100644
--- a/docs/content/otel/otlp.md
+++ b/docs/content/otel/otlp.md
@@ -44,6 +44,9 @@ By default, the `OpenTelemetryExporter` will push metrics every 60 seconds to
 the [OpenTelemetryExporter.Builder][builder-javadoc], or at runtime via
 [`io.prometheus.exporter.opentelemetry.*`][otel-properties] properties.
 
+The OpenTelemetry exporter also honors the shared [`io.prometheus.exporter.filter.*`][exporter-filter-properties] metric-name
+filter properties.
+
 In addition to the Prometheus Java client configuration, the exporter also recognizes standard
 OpenTelemetry configuration. For example, you can set
 the [OTEL_EXPORTER_OTLP_METRICS_ENDPOINT](https://opentelemetry.io/docs/concepts/sdk-configuration/otlp-exporter-configuration/#otel_exporter_otlp_metrics_endpoint)
@@ -62,4 +65,5 @@ OTel collector, and a Prometheus server.
 [builder-javadoc]: /client_java/api/io/prometheus/metrics/exporter/opentelemetry/OpenTelemetryExporter.Builder.html
 [opentelemetry-example]: https://github.com/prometheus/client_java/tree/main/examples/example-exporter-opentelemetry
 [otel-pipeline]: /client_java/images/otel-pipeline.png
+[exporter-filter-properties]: {{< relref "../config/config.md#exporter-filter-properties" >}}
 [otel-properties]: {{< relref "../config/config.md#exporter-opentelemetry-properties" >}}
diff --git a/examples/example-custom-buckets/docker-compose.yaml b/examples/example-custom-buckets/docker-compose.yaml
index 97d20349d6..56ff3b8743 100644
--- a/examples/example-custom-buckets/docker-compose.yaml
+++ b/examples/example-custom-buckets/docker-compose.yaml
@@ -1,7 +1,7 @@
 version: "3"
 services:
   example-application:
-    image: eclipse-temurin:25.0.3_9-jre@sha256:681c543d6f36c50f45e9b5226930a46203dcfa351d3670e9d0bdf0dabae53539
+    image: eclipse-temurin:25.0.4_7-jre@sha256:bb036ed6cfdc57e3da7c22634d15f1b840d2caf76183861c80e81ca4b5104abb
     network_mode: host
     volumes:
       - ./target/example-custom-buckets.jar:/example-custom-buckets.jar
@@ -10,7 +10,7 @@ services:
       - -jar
       - /example-custom-buckets.jar
   prometheus:
-    image: prom/prometheus:v3.13.1@sha256:3c42b892cf723fa54d2f262c37a0e1f80aa8c8ddb1da7b9b0df9455a35a7f893
+    image: prom/prometheus:v3.15.0@sha256:efd719c99d83b060d9daefdcf00360461adf279f45ef5391f8d111892118753e
     network_mode: host
     volumes:
       - ./docker-compose/prometheus.yml:/prometheus.yml
@@ -18,7 +18,7 @@ services:
       - --enable-feature=native-histograms
       - --config.file=/prometheus.yml
   grafana:
-    image: grafana/grafana:13.1.0@sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63
+    image: grafana/grafana:13.2.4@sha256:dbbc38ea21103cefb50396340cd88afec779c7e070b0a7bf5a75b4ce46651d3f
     network_mode: host
     volumes:
       - ./docker-compose/grafana-datasources.yaml:/etc/grafana/provisioning/datasources/grafana-datasources.yaml
diff --git a/examples/example-custom-buckets/pom.xml b/examples/example-custom-buckets/pom.xml
index 2436e179fb..8b7d2ec8c4 100644
--- a/examples/example-custom-buckets/pom.xml
+++ b/examples/example-custom-buckets/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-custom-buckets
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-exemplars-tail-sampling/docker-compose.yaml b/examples/example-exemplars-tail-sampling/docker-compose.yaml
index 4811ace29f..e7ab066559 100644
--- a/examples/example-exemplars-tail-sampling/docker-compose.yaml
+++ b/examples/example-exemplars-tail-sampling/docker-compose.yaml
@@ -36,14 +36,14 @@ services:
       - -jar
       - /example-greeting-service.jar
   collector:
-    image: otel/opentelemetry-collector-contrib:0.156.0@sha256:125bdbeb7590cc1952c5b3430ecf14063568980c2c93d5b38676cc0446ed8108
+    image: otel/opentelemetry-collector-contrib:0.163.1@sha256:1175b03003053962012f5a231f5567f66a3e8fdb960c7835c0e48f7aa1555806
     network_mode: host
     volumes:
       - ./config/otelcol-config.yaml:/config.yaml
     command:
       - --config=file:/config.yaml
   prometheus:
-    image: prom/prometheus:v3.13.1@sha256:3c42b892cf723fa54d2f262c37a0e1f80aa8c8ddb1da7b9b0df9455a35a7f893
+    image: prom/prometheus:v3.15.0@sha256:efd719c99d83b060d9daefdcf00360461adf279f45ef5391f8d111892118753e
     network_mode: host
     volumes:
       - ./config/prometheus.yaml:/prometheus.yaml
@@ -52,14 +52,14 @@ services:
       - --enable-feature=native-histograms
       - --config.file=/prometheus.yaml
   tempo:
-    image: grafana/tempo:3.0.2@sha256:cda87c212d8c584dc0b89e337e7ed648a5100feb657e5d528480ee4fa03dbbe3
+    image: grafana/tempo:3.1.0@sha256:3076b8dcdfb32fd6bc5ccef85e7b7313e6199b9cb84366257fc17ecb696db5fd
     network_mode: host
     volumes:
       - ./config/tempo-config.yaml:/config.yaml
     command:
       - --config.file=/config.yaml
   grafana:
-    image: grafana/grafana:13.1.0@sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63
+    image: grafana/grafana:13.2.4@sha256:dbbc38ea21103cefb50396340cd88afec779c7e070b0a7bf5a75b4ce46651d3f
     network_mode: host
     ports:
       - "3000:3000"
@@ -68,7 +68,7 @@ services:
       - ./config/grafana-dashboards.yaml:/etc/grafana/provisioning/dashboards/grafana-dashboards.yaml
       - ./config/grafana-example-dashboard.json:/etc/grafana/example-dashboard.json
   k6:
-    image: grafana/k6@sha256:e7eeddf1ce2361df6920d925297f487c0ba549c44be242c6a9c22f28d9b08efa
+    image: grafana/k6@sha256:e66db15b860113878fa74670e31f5e274830b7b6e42c8bff28b2f2d86a257603
     network_mode: host
     volumes:
       - ./config/k6-script.js:/k6-script.js
diff --git a/examples/example-exemplars-tail-sampling/example-greeting-service/pom.xml b/examples/example-exemplars-tail-sampling/example-greeting-service/pom.xml
index 5781786616..5594815eff 100644
--- a/examples/example-exemplars-tail-sampling/example-greeting-service/pom.xml
+++ b/examples/example-exemplars-tail-sampling/example-greeting-service/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-greeting-service
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     17
@@ -45,7 +45,7 @@
     
       org.apache.tomcat.embed
       tomcat-embed-core
-      11.0.24
+      11.0.27
     
   
 
diff --git a/examples/example-exemplars-tail-sampling/example-greeting-service/src/main/java/io/prometheus/metrics/examples/otel/exemplars/greeting/Main.java b/examples/example-exemplars-tail-sampling/example-greeting-service/src/main/java/io/prometheus/metrics/examples/otel/exemplars/greeting/Main.java
index 99ba1084c1..ed47d37872 100644
--- a/examples/example-exemplars-tail-sampling/example-greeting-service/src/main/java/io/prometheus/metrics/examples/otel/exemplars/greeting/Main.java
+++ b/examples/example-exemplars-tail-sampling/example-greeting-service/src/main/java/io/prometheus/metrics/examples/otel/exemplars/greeting/Main.java
@@ -20,10 +20,10 @@ public static void main(String[] args) throws LifecycleException {
     Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
 
     Tomcat.addServlet(ctx, "hello", new GreetingServlet());
-    ctx.addServletMappingDecoded("/*", "hello");
+    ctx.addServletMapping("/*", "hello");
 
     Tomcat.addServlet(ctx, "metrics", new PrometheusMetricsServlet());
-    ctx.addServletMappingDecoded("/metrics", "metrics");
+    ctx.addServletMapping("/metrics", "metrics");
 
     tomcat.getConnector();
     tomcat.start();
diff --git a/examples/example-exemplars-tail-sampling/example-hello-world-app/pom.xml b/examples/example-exemplars-tail-sampling/example-hello-world-app/pom.xml
index 5022bc3279..27aa8f2818 100644
--- a/examples/example-exemplars-tail-sampling/example-hello-world-app/pom.xml
+++ b/examples/example-exemplars-tail-sampling/example-hello-world-app/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-hello-world-app
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     17
@@ -45,7 +45,7 @@
     
       org.apache.tomcat.embed
       tomcat-embed-core
-      11.0.24
+      11.0.27
     
   
 
diff --git a/examples/example-exemplars-tail-sampling/example-hello-world-app/src/main/java/io/prometheus/metrics/examples/otel/exemplars/app/Main.java b/examples/example-exemplars-tail-sampling/example-hello-world-app/src/main/java/io/prometheus/metrics/examples/otel/exemplars/app/Main.java
index 25ea8a1c6a..b3e83cb7db 100644
--- a/examples/example-exemplars-tail-sampling/example-hello-world-app/src/main/java/io/prometheus/metrics/examples/otel/exemplars/app/Main.java
+++ b/examples/example-exemplars-tail-sampling/example-hello-world-app/src/main/java/io/prometheus/metrics/examples/otel/exemplars/app/Main.java
@@ -20,10 +20,10 @@ public static void main(String[] args) throws LifecycleException {
     Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
 
     Tomcat.addServlet(ctx, "hello", new HelloWorldServlet());
-    ctx.addServletMappingDecoded("/*", "hello");
+    ctx.addServletMapping("/*", "hello");
 
     Tomcat.addServlet(ctx, "metrics", new PrometheusMetricsServlet());
-    ctx.addServletMappingDecoded("/metrics", "metrics");
+    ctx.addServletMapping("/metrics", "metrics");
 
     tomcat.getConnector();
     tomcat.start();
diff --git a/examples/example-exemplars-tail-sampling/pom.xml b/examples/example-exemplars-tail-sampling/pom.xml
index 24df1f9e58..4c87da4fad 100644
--- a/examples/example-exemplars-tail-sampling/pom.xml
+++ b/examples/example-exemplars-tail-sampling/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-exemplars-tail-sampling
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
   pom
 
   Example - Exemplars with OpenTelemetry's Tail Sampling
diff --git a/examples/example-exporter-httpserver/pom.xml b/examples/example-exporter-httpserver/pom.xml
index cda7dad6e6..3ed5f7dff1 100644
--- a/examples/example-exporter-httpserver/pom.xml
+++ b/examples/example-exporter-httpserver/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-exporter-httpserver
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-exporter-multi-target/pom.xml b/examples/example-exporter-multi-target/pom.xml
index 0457a75919..104bacaf72 100644
--- a/examples/example-exporter-multi-target/pom.xml
+++ b/examples/example-exporter-multi-target/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-exporter-multi-target
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-exporter-opentelemetry/docker-compose.yaml b/examples/example-exporter-opentelemetry/docker-compose.yaml
index 300bd18ef5..4b024adb0f 100644
--- a/examples/example-exporter-opentelemetry/docker-compose.yaml
+++ b/examples/example-exporter-opentelemetry/docker-compose.yaml
@@ -13,14 +13,14 @@ services:
       #- -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
       - /example-exporter-opentelemetry.jar
   collector:
-    image: otel/opentelemetry-collector-contrib:0.156.0@sha256:125bdbeb7590cc1952c5b3430ecf14063568980c2c93d5b38676cc0446ed8108
+    image: otel/opentelemetry-collector-contrib:0.163.1@sha256:1175b03003053962012f5a231f5567f66a3e8fdb960c7835c0e48f7aa1555806
     network_mode: host
     volumes:
       - ./config/otelcol-config.yaml:/config.yaml
     command:
       - --config=file:/config.yaml
   prometheus:
-    image: prom/prometheus:v3.13.1@sha256:3c42b892cf723fa54d2f262c37a0e1f80aa8c8ddb1da7b9b0df9455a35a7f893
+    image: prom/prometheus:v3.15.0@sha256:efd719c99d83b060d9daefdcf00360461adf279f45ef5391f8d111892118753e
     network_mode: host
     volumes:
       - ./config/prometheus.yaml:/prometheus.yaml
diff --git a/examples/example-exporter-opentelemetry/oats-tests/agent/Dockerfile b/examples/example-exporter-opentelemetry/oats-tests/agent/Dockerfile
index 86fc52f9c9..d89cb313f5 100644
--- a/examples/example-exporter-opentelemetry/oats-tests/agent/Dockerfile
+++ b/examples/example-exporter-opentelemetry/oats-tests/agent/Dockerfile
@@ -1,4 +1,4 @@
-FROM eclipse-temurin:25.0.3_9-jre@sha256:681c543d6f36c50f45e9b5226930a46203dcfa351d3670e9d0bdf0dabae53539
+FROM eclipse-temurin:25.0.4_7-jre@sha256:bb036ed6cfdc57e3da7c22634d15f1b840d2caf76183861c80e81ca4b5104abb
 
 COPY target/example-exporter-opentelemetry.jar ./app.jar
 # check that the resource attributes from the agent are used, epsecially the service.instance.id should be the same
diff --git a/examples/example-exporter-opentelemetry/oats-tests/agent/oats-case.yaml b/examples/example-exporter-opentelemetry/oats-tests/agent/oats-case.yaml
new file mode 100644
index 0000000000..a8a05d0f2c
--- /dev/null
+++ b/examples/example-exporter-opentelemetry/oats-tests/agent/oats-case.yaml
@@ -0,0 +1,20 @@
+name: java agent exporter preserves target_info identity
+fixture:
+  compose:
+    template: lgtm
+    file: docker-compose.yml
+seed:
+  type: app
+expected:
+  metrics:
+    - promql: "uptime_seconds_total{}"
+      value: ">= 0"
+    - promql: 'count(target_info{service_name!="otelcol-contrib"})'
+      value: "== 2"
+    - promql: 'count(count by (instance) (target_info{service_name!="otelcol-contrib"}))'
+      value: "== 1"
+  custom-checks:
+    - script: |
+        #!/usr/bin/env bash
+        set -euo pipefail
+        curl -fsS "${OATS_GRAFANA_URL:?}/api/health" >/dev/null
diff --git a/examples/example-exporter-opentelemetry/oats-tests/agent/oats.yaml b/examples/example-exporter-opentelemetry/oats-tests/agent/oats.yaml
deleted file mode 100644
index 899d1cd5dd..0000000000
--- a/examples/example-exporter-opentelemetry/oats-tests/agent/oats.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-# OATS is an acceptance testing framework for OpenTelemetry -
-# https://github.com/grafana/oats/tree/main/yaml
-oats-schema-version: 2
-docker-compose:
-  files:
-    - ./docker-compose.yml
-expected:
-  custom-checks:
-    - script: ./service_instance_id_check.py
-  metrics:
-    - promql: "uptime_seconds_total{}"
-      value: ">= 0"
diff --git a/examples/example-exporter-opentelemetry/oats-tests/agent/service_instance_id_check.py b/examples/example-exporter-opentelemetry/oats-tests/agent/service_instance_id_check.py
deleted file mode 100755
index 35ff88b8db..0000000000
--- a/examples/example-exporter-opentelemetry/oats-tests/agent/service_instance_id_check.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python3
-"""
-Check if the service instance id is present in the exported data.
-Returns 0 if the service instance id is present in the exported data.
-"""
-
-import json
-import urllib.parse
-from urllib.request import urlopen
-
-
-def get_json(url):
-    with urlopen(url) as response:
-        return json.loads(response.read().decode("utf-8"))
-
-
-def main():
-    # Query Prometheus for target_info
-    res = get_json("http://localhost:9090/api/v1/query?query=target_info")
-
-    # Uncomment for local debugging
-    # with open('example_target_info.json') as f:
-    #     res = json.load(f)
-
-    instance_ids = {
-        r["metric"]["instance"]
-        for r in res["data"]["result"]
-        if r["metric"].get("service_name") != "otelcol-contrib"
-    }
-    instance_ids = list(instance_ids)
-
-    print(f"Instance ids found:{instance_ids}")
-    if len(instance_ids) > 1:
-        print("More than one instance id found")
-        print(res)
-
-    # Both the agent and the exporter should report the same instance id
-    assert len(instance_ids) == 1, "Expected exactly one instance id"
-
-    query = f'target_info{{instance="{instance_ids[0]}"}}'
-    encoded_query = urllib.parse.quote_plus(query)
-    res = get_json(f"http://localhost:9090/api/v1/query?query={encoded_query}")
-
-    infos = res["data"]["result"]
-    print(infos)
-
-    # They should not have the same target info (e.g. only the agent has telemetry_distro_name)
-    assert len(infos) == 2, "Expected two target info results"
-
-
-if __name__ == "__main__":
-    main()
diff --git a/examples/example-exporter-opentelemetry/oats-tests/http/Dockerfile b/examples/example-exporter-opentelemetry/oats-tests/http/Dockerfile
index 89915692df..4098244f09 100644
--- a/examples/example-exporter-opentelemetry/oats-tests/http/Dockerfile
+++ b/examples/example-exporter-opentelemetry/oats-tests/http/Dockerfile
@@ -1,4 +1,4 @@
-FROM eclipse-temurin:25.0.3_9-jre@sha256:681c543d6f36c50f45e9b5226930a46203dcfa351d3670e9d0bdf0dabae53539
+FROM eclipse-temurin:25.0.4_7-jre@sha256:bb036ed6cfdc57e3da7c22634d15f1b840d2caf76183861c80e81ca4b5104abb
 
 COPY target/example-exporter-opentelemetry.jar ./app.jar
 
diff --git a/examples/example-exporter-opentelemetry/oats-tests/http/oats-case.yaml b/examples/example-exporter-opentelemetry/oats-tests/http/oats-case.yaml
new file mode 100644
index 0000000000..fab99dfe32
--- /dev/null
+++ b/examples/example-exporter-opentelemetry/oats-tests/http/oats-case.yaml
@@ -0,0 +1,11 @@
+name: http protobuf exporter emits uptime metric
+fixture:
+  compose:
+    template: lgtm
+    file: docker-compose.yml
+seed:
+  type: app
+expected:
+  metrics:
+    - promql: "uptime_seconds_total{}"
+      value: ">= 0"
diff --git a/examples/example-exporter-opentelemetry/oats-tests/http/oats.yaml b/examples/example-exporter-opentelemetry/oats-tests/http/oats.yaml
deleted file mode 100644
index dbcfcf84f5..0000000000
--- a/examples/example-exporter-opentelemetry/oats-tests/http/oats.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# OATS is an acceptance testing framework for OpenTelemetry -
-# https://github.com/grafana/oats/tree/main/yaml
-oats-schema-version: 2
-docker-compose:
-  files:
-    - ./docker-compose.yml
-expected:
-  metrics:
-    - promql: "uptime_seconds_total{}"
-      value: ">= 0"
diff --git a/examples/example-exporter-opentelemetry/pom.xml b/examples/example-exporter-opentelemetry/pom.xml
index 3bfec61437..d06ca6d78e 100644
--- a/examples/example-exporter-opentelemetry/pom.xml
+++ b/examples/example-exporter-opentelemetry/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-exporter-opentelemetry
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-exporter-servlet-tomcat/pom.xml b/examples/example-exporter-servlet-tomcat/pom.xml
index 197676b313..7ff6cd2fec 100644
--- a/examples/example-exporter-servlet-tomcat/pom.xml
+++ b/examples/example-exporter-servlet-tomcat/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-exporter-servlet-tomcat
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     17
@@ -44,7 +44,7 @@
     
       org.apache.tomcat.embed
       tomcat-embed-core
-      11.0.24
+      11.0.27
     
   
 
diff --git a/examples/example-exporter-servlet-tomcat/src/main/java/io/prometheus/metrics/examples/tomcat_servlet/Main.java b/examples/example-exporter-servlet-tomcat/src/main/java/io/prometheus/metrics/examples/tomcat_servlet/Main.java
index 81bc2ac194..2348cea9d6 100644
--- a/examples/example-exporter-servlet-tomcat/src/main/java/io/prometheus/metrics/examples/tomcat_servlet/Main.java
+++ b/examples/example-exporter-servlet-tomcat/src/main/java/io/prometheus/metrics/examples/tomcat_servlet/Main.java
@@ -24,10 +24,10 @@ public static void main(String[] args) throws LifecycleException, IOException {
     Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
 
     Tomcat.addServlet(ctx, "hello", new HelloWorldServlet());
-    ctx.addServletMappingDecoded("/*", "hello");
+    ctx.addServletMapping("/*", "hello");
 
     Tomcat.addServlet(ctx, "metrics", new PrometheusMetricsServlet());
-    ctx.addServletMappingDecoded("/metrics", "metrics");
+    ctx.addServletMapping("/metrics", "metrics");
 
     tomcat.getConnector();
     tomcat.start();
diff --git a/examples/example-native-histogram/docker-compose.yaml b/examples/example-native-histogram/docker-compose.yaml
index 8cb3b73c24..73f904b675 100644
--- a/examples/example-native-histogram/docker-compose.yaml
+++ b/examples/example-native-histogram/docker-compose.yaml
@@ -1,7 +1,7 @@
 version: "3"
 services:
   example-application:
-    image: eclipse-temurin:25.0.3_9-jre@sha256:681c543d6f36c50f45e9b5226930a46203dcfa351d3670e9d0bdf0dabae53539
+    image: eclipse-temurin:25.0.4_7-jre@sha256:bb036ed6cfdc57e3da7c22634d15f1b840d2caf76183861c80e81ca4b5104abb
     network_mode: host
     volumes:
       - ./target/example-native-histogram.jar:/example-native-histogram.jar
@@ -10,7 +10,7 @@ services:
       - -jar
       - /example-native-histogram.jar
   prometheus:
-    image: prom/prometheus:v3.13.1@sha256:3c42b892cf723fa54d2f262c37a0e1f80aa8c8ddb1da7b9b0df9455a35a7f893
+    image: prom/prometheus:v3.15.0@sha256:efd719c99d83b060d9daefdcf00360461adf279f45ef5391f8d111892118753e
     network_mode: host
     volumes:
       - ./docker-compose/prometheus.yml:/prometheus.yml
@@ -18,7 +18,7 @@ services:
       - --enable-feature=native-histograms
       - --config.file=/prometheus.yml
   grafana:
-    image: grafana/grafana:13.1.0@sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63
+    image: grafana/grafana:13.2.4@sha256:dbbc38ea21103cefb50396340cd88afec779c7e070b0a7bf5a75b4ce46651d3f
     network_mode: host
     volumes:
       - ./docker-compose/grafana-datasources.yaml:/etc/grafana/provisioning/datasources/grafana-datasources.yaml
diff --git a/examples/example-native-histogram/pom.xml b/examples/example-native-histogram/pom.xml
index ab0045e882..7d0d4f66a6 100644
--- a/examples/example-native-histogram/pom.xml
+++ b/examples/example-native-histogram/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-native-histogram
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-otel-jvm-runtime-metrics/pom.xml b/examples/example-otel-jvm-runtime-metrics/pom.xml
index cd0c1ba791..f104f2e269 100644
--- a/examples/example-otel-jvm-runtime-metrics/pom.xml
+++ b/examples/example-otel-jvm-runtime-metrics/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-otel-jvm-runtime-metrics
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
@@ -28,7 +28,7 @@
       
         io.opentelemetry.instrumentation
         opentelemetry-instrumentation-bom-alpha
-        2.29.0-alpha
+        2.32.0-alpha
         pom
         import
       
diff --git a/examples/example-prometheus-properties/pom.xml b/examples/example-prometheus-properties/pom.xml
index 3bf352d163..1788adcda7 100644
--- a/examples/example-prometheus-properties/pom.xml
+++ b/examples/example-prometheus-properties/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-prometheus-properties
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/example-simpleclient-bridge/pom.xml b/examples/example-simpleclient-bridge/pom.xml
index 0f8bf496a2..0740401cc3 100644
--- a/examples/example-simpleclient-bridge/pom.xml
+++ b/examples/example-simpleclient-bridge/pom.xml
@@ -4,7 +4,7 @@
 
   io.prometheus
   example-simpleclient-bridge
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   
     8
diff --git a/examples/pom.xml b/examples/pom.xml
index 80594e550b..4a69710433 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   examples
diff --git a/integration-tests/it-common/pom.xml b/integration-tests/it-common/pom.xml
index 9a4895f1c4..b35093cb93 100644
--- a/integration-tests/it-common/pom.xml
+++ b/integration-tests/it-common/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration-tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-common
diff --git a/integration-tests/it-exporter/it-exporter-duplicate-metrics-sample/pom.xml b/integration-tests/it-exporter/it-exporter-duplicate-metrics-sample/pom.xml
index e0c05f7f8f..3d5648815a 100644
--- a/integration-tests/it-exporter/it-exporter-duplicate-metrics-sample/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-duplicate-metrics-sample/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-duplicate-metrics-sample
diff --git a/integration-tests/it-exporter/it-exporter-httpserver-sample/pom.xml b/integration-tests/it-exporter/it-exporter-httpserver-sample/pom.xml
index 5255122dd6..9c11d40b6b 100644
--- a/integration-tests/it-exporter/it-exporter-httpserver-sample/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-httpserver-sample/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-httpserver-sample
diff --git a/integration-tests/it-exporter/it-exporter-no-protobuf/pom.xml b/integration-tests/it-exporter/it-exporter-no-protobuf/pom.xml
index 0193d414f6..6c991fa038 100644
--- a/integration-tests/it-exporter/it-exporter-no-protobuf/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-no-protobuf/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-no-protobuf
diff --git a/integration-tests/it-exporter/it-exporter-servlet-jetty-sample/pom.xml b/integration-tests/it-exporter/it-exporter-servlet-jetty-sample/pom.xml
index e17e391a08..6cf246b413 100644
--- a/integration-tests/it-exporter/it-exporter-servlet-jetty-sample/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-servlet-jetty-sample/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-servlet-jetty-sample
@@ -15,7 +15,7 @@
     Jetty Sample for the Exporter Integration Test
   
   
-    12.1.11
+    12.1.14
     25
   
 
diff --git a/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/pom.xml b/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/pom.xml
index 1d56f2bb81..ac9cfcb0f4 100644
--- a/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-servlet-tomcat-sample
@@ -33,7 +33,7 @@
     
       org.apache.tomcat.embed
       tomcat-embed-core
-      11.0.24
+      11.0.27
     
   
 
diff --git a/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/src/main/java/io/prometheus/metrics/it/exporter/servlet/tomcat/ExporterServletTomcatSample.java b/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/src/main/java/io/prometheus/metrics/it/exporter/servlet/tomcat/ExporterServletTomcatSample.java
index fa470b3069..3cfd603c00 100644
--- a/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/src/main/java/io/prometheus/metrics/it/exporter/servlet/tomcat/ExporterServletTomcatSample.java
+++ b/integration-tests/it-exporter/it-exporter-servlet-tomcat-sample/src/main/java/io/prometheus/metrics/it/exporter/servlet/tomcat/ExporterServletTomcatSample.java
@@ -78,7 +78,7 @@ private static void run(Mode mode, int port) throws IOException, LifecycleExcept
     tomcat.setBaseDir(tmpDir.toFile().getAbsolutePath());
     Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
     Tomcat.addServlet(ctx, "metrics", new PrometheusMetricsServlet());
-    ctx.addServletMappingDecoded("/metrics", "metrics");
+    ctx.addServletMapping("/metrics", "metrics");
 
     tomcat.getConnector();
     tomcat.start();
diff --git a/integration-tests/it-exporter/it-exporter-test/pom.xml b/integration-tests/it-exporter/it-exporter-test/pom.xml
index 40ee584129..d64c71ea83 100644
--- a/integration-tests/it-exporter/it-exporter-test/pom.xml
+++ b/integration-tests/it-exporter/it-exporter-test/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter-test
@@ -29,5 +29,36 @@
       ${guava.version}
       test
     
+    
+    
+      io.prometheus
+      it-exporter-servlet-tomcat-sample
+      ${project.version}
+      test
+    
+    
+      io.prometheus
+      it-exporter-servlet-jetty-sample
+      ${project.version}
+      test
+    
+    
+      io.prometheus
+      it-exporter-httpserver-sample
+      ${project.version}
+      test
+    
+    
+      io.prometheus
+      it-exporter-duplicate-metrics-sample
+      ${project.version}
+      test
+    
   
 
diff --git a/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/ExporterIT.java b/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/ExporterIT.java
index 5a80d8bdf2..3ba88dcc15 100644
--- a/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/ExporterIT.java
+++ b/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/ExporterIT.java
@@ -157,7 +157,11 @@ void testErrorHandling() throws IOException {
     start("error");
     Response response = scrape("GET", "");
     assertThat(response.status).isEqualTo(500);
-    assertThat(response.stringBody()).contains("Simulating an error.");
+    assertErrorResponseBody(response.stringBody());
+  }
+
+  protected void assertErrorResponseBody(String body) {
+    assertThat(body).contains("Simulating an error.");
   }
 
   @Test
diff --git a/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/HttpServerIT.java b/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/HttpServerIT.java
index 4c7e614727..6cc5bc8178 100644
--- a/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/HttpServerIT.java
+++ b/integration-tests/it-exporter/it-exporter-test/src/test/java/io/prometheus/metrics/it/exporter/test/HttpServerIT.java
@@ -1,5 +1,7 @@
 package io.prometheus.metrics.it.exporter.test;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import java.io.IOException;
 import java.net.URISyntaxException;
 
@@ -7,4 +9,13 @@ class HttpServerIT extends ExporterIT {
   public HttpServerIT() throws IOException, URISyntaxException {
     super("exporter-httpserver-sample");
   }
+
+  @Override
+  protected void assertErrorResponseBody(String body) {
+    assertThat(body)
+        .isEqualTo(
+            "An internal error occurred while scraping metrics. "
+                + "Configure an HTTP error reporter for details.\n")
+        .doesNotContain("Simulating an error.");
+  }
 }
diff --git a/integration-tests/it-exporter/it-no-protobuf-test/pom.xml b/integration-tests/it-exporter/it-no-protobuf-test/pom.xml
index 389867de54..a6ccf55c7e 100644
--- a/integration-tests/it-exporter/it-no-protobuf-test/pom.xml
+++ b/integration-tests/it-exporter/it-no-protobuf-test/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     it-exporter
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-no-protobuf-test
@@ -23,5 +23,18 @@
       ${project.version}
       test
     
+    
+    
+      io.prometheus
+      it-exporter-no-protobuf
+      ${project.version}
+      test
+    
   
 
diff --git a/integration-tests/it-exporter/pom.xml b/integration-tests/it-exporter/pom.xml
index b759c4330b..6ba8c0fd81 100644
--- a/integration-tests/it-exporter/pom.xml
+++ b/integration-tests/it-exporter/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration-tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-exporter
diff --git a/integration-tests/it-pushgateway/pom.xml b/integration-tests/it-pushgateway/pom.xml
index bfc73ab10a..bdf1f2f300 100644
--- a/integration-tests/it-pushgateway/pom.xml
+++ b/integration-tests/it-pushgateway/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration-tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it-pushgateway
diff --git a/integration-tests/it-spring-boot-smoke-test/pom.xml b/integration-tests/it-spring-boot-smoke-test/pom.xml
index 7261a024f0..73b5f5d2f8 100644
--- a/integration-tests/it-spring-boot-smoke-test/pom.xml
+++ b/integration-tests/it-spring-boot-smoke-test/pom.xml
@@ -6,13 +6,13 @@
   
     org.springframework.boot
     spring-boot-starter-parent
-    4.1.0
+    4.1.1
      
   
 
   io.prometheus
   it-spring-boot-smoke-test
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   Integration Test - Spring Smoke Tests
   
@@ -20,7 +20,7 @@
   
   
     25
-    6.1.2
+    6.1.3
   
 
   
@@ -56,6 +56,22 @@
       micrometer-registry-prometheus
       runtime
     
+    
+    
+      io.prometheus
+      prometheus-metrics-core
+      runtime
+      
+        
+          io.prometheus
+          prometheus-metrics-tracer-initializer
+        
+      
+    
     
       org.springframework.boot
       spring-boot-starter-test
@@ -91,6 +107,19 @@
         org.springframework.boot
         spring-boot-maven-plugin
       
+      
+      
+        org.apache.maven.plugins
+        maven-failsafe-plugin
+        
+          
+            
+              integration-test
+              verify
+            
+          
+        
+      
     
   
 
diff --git a/integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationTest.java b/integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationIT.java
similarity index 92%
rename from integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationTest.java
rename to integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationIT.java
index c566346246..43f3894826 100644
--- a/integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationTest.java
+++ b/integration-tests/it-spring-boot-smoke-test/src/test/java/io/prometheus/metrics/it/springboot/ApplicationIT.java
@@ -17,7 +17,13 @@
 import org.springframework.boot.test.context.SpringBootTest;
 
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-class ApplicationTest {
+class ApplicationIT {
+  @Test
+  void testUsesShadedProtobufRuntime() {
+    assertThat(Metrics.MetricFamily.class.getSuperclass().getName())
+        .startsWith("io.prometheus.metrics.shaded.com_google_protobuf_");
+  }
+
   @Test
   void testPrometheusProtobufFormat() throws IOException {
     ExporterTest.Response response =
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index c3f299d690..9cfe52e811 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   integration-tests
diff --git a/mise.lock b/mise.lock
index 89d88d8942..78f388daa1 100644
--- a/mise.lock
+++ b/mise.lock
@@ -1,8 +1,11 @@
 # @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
 
+lockfile_version = 2
+
 [[tools.actionlint]]
 version = "1.7.12"
 backend = "aqua:rhysd/actionlint"
+specifiers = ["latest"]
 
 [tools.actionlint."platforms.linux-arm64"]
 checksum = "sha256:325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6"
@@ -47,326 +50,518 @@ url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/3849249
 provenance = "github-attestations"
 
 [[tools."aqua:grafana/flint"]]
-version = "0.22.7"
+version = "0.22.14"
 backend = "aqua:grafana/flint"
+specifiers = ["latest"]
 
 [tools."aqua:grafana/flint"."platforms.linux-arm64"]
-checksum = "sha256:a9dc15057dee4a896b0015c5574a330865b5f031f9b67e64a50c342f04d70de1"
-url = "https://github.com/grafana/flint/releases/download/v0.22.7/flint-aarch64-unknown-linux-gnu.tar.gz"
-url_api = "https://api.github.com/repos/grafana/flint/releases/assets/469225119"
+checksum = "sha256:f3f88892b1b129bd56f61e1a38e784e625284b37636155b5752b58585d7ac7c4"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586350611"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.linux-arm64-musl"]
+checksum = "sha256:486d1cb4f619cd41a893db4bc1789510ae67112ebab1e071d3bd06d0c543883d"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586351210"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.linux-x64"]
-checksum = "sha256:9a0fdec27fa1d101b139e73ba73c4837210a8659903e0a3fefb83b7fadb60048"
-url = "https://github.com/grafana/flint/releases/download/v0.22.7/flint-x86_64-unknown-linux-gnu.tar.gz"
-url_api = "https://api.github.com/repos/grafana/flint/releases/assets/469224671"
+checksum = "sha256:37cf209f7a3d49bac222d7aebd12c4b623de7f7cfcb9f5bd8c0725733ddc6d39"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586350080"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.linux-x64-musl"]
+checksum = "sha256:d3bc50adf5f40a91b26cceb8ee0ab86420622baccc334b23f3accea9dbffe2c4"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586351062"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.macos-arm64"]
-checksum = "sha256:e3a7df200923fc22d34df5e67caebe949a6f7fa9a4ebaf3afd51f3c92bc85f63"
-url = "https://github.com/grafana/flint/releases/download/v0.22.7/flint-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/grafana/flint/releases/assets/469225067"
+checksum = "sha256:d777718c94102cdc55df6065081bc0d2e5a98d3d8965fc96cf6c316c08bc0eef"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586351724"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.macos-x64"]
-checksum = "sha256:79c85a3abd9cbec8c1d2844cf0c5d2c2da1857278149df38d8075e48775bef34"
-url = "https://github.com/grafana/flint/releases/download/v0.22.7/flint-x86_64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/grafana/flint/releases/assets/469226207"
+checksum = "sha256:5e860f846517a40559db4a6792fbe8b3422bc03c92c1684621e8be1cbc5437fd"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-x86_64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586360754"
 provenance = "github-attestations"
 
 [tools."aqua:grafana/flint"."platforms.windows-x64"]
-checksum = "sha256:a42a94ba2b7035d1d21f5ba34b64093c2e7c9c2af2b151adab113c787e6c0220"
-url = "https://github.com/grafana/flint/releases/download/v0.22.7/flint-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/grafana/flint/releases/assets/469229804"
+checksum = "sha256:1e0010f102da4714aa11859de05bad09d2025697485321a9285b7ce04c7c6bc8"
+url = "https://github.com/grafana/flint/releases/download/v0.22.14/flint-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/grafana/flint/releases/assets/586353820"
+provenance = "github-attestations"
+
+[[tools."aqua:grafana/gcx"]]
+version = "v1.6.0"
+backend = "aqua:grafana/gcx"
+specifiers = ["latest"]
+
+[tools."aqua:grafana/gcx"."platforms.linux-arm64"]
+checksum = "sha256:116fd1a9f25d5f5e29802b705d9964578a01614f94499b85461b6abca1cb4a04"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_linux_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664105"
+
+[tools."aqua:grafana/gcx"."platforms.linux-arm64-musl"]
+checksum = "sha256:116fd1a9f25d5f5e29802b705d9964578a01614f94499b85461b6abca1cb4a04"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_linux_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664105"
+
+[tools."aqua:grafana/gcx"."platforms.linux-x64"]
+checksum = "sha256:335e051cda6edfb4ad5757540208961dbdfab6d89d4af11a4087de6ffa0ec111"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_linux_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664108"
+
+[tools."aqua:grafana/gcx"."platforms.linux-x64-musl"]
+checksum = "sha256:335e051cda6edfb4ad5757540208961dbdfab6d89d4af11a4087de6ffa0ec111"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_linux_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664108"
+
+[tools."aqua:grafana/gcx"."platforms.macos-arm64"]
+checksum = "sha256:4eb4cd9c31a38281c2f9e147b0108cf3b201bef8f4279fddbdc7a30b32706603"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_darwin_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664103"
+
+[tools."aqua:grafana/gcx"."platforms.macos-x64"]
+checksum = "sha256:8384e756deaba210fd3370ed80a0307a82b66eecc3fab443b18bb44265ad089d"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_darwin_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664203"
+
+[tools."aqua:grafana/gcx"."platforms.windows-x64"]
+checksum = "sha256:72cd96615a2eecd7599d4344dd1c16bb99022442ad238026b8bf2e51286d1a83"
+url = "https://github.com/grafana/gcx/releases/download/v1.6.0/gcx_1.6.0_windows_amd64.zip"
+url_api = "https://api.github.com/repos/grafana/gcx/releases/assets/636664104"
+
+[[tools."aqua:grafana/oats"]]
+version = "0.10.0"
+backend = "aqua:grafana/oats"
+specifiers = ["latest"]
+
+[tools."aqua:grafana/oats"."platforms.linux-arm64"]
+checksum = "sha256:be195aeeafce644c8a59438bbc8c472f5ca51df6f9570c6b646373a703d686b0"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_linux_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772122"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.linux-arm64-musl"]
+checksum = "sha256:be195aeeafce644c8a59438bbc8c472f5ca51df6f9570c6b646373a703d686b0"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_linux_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772122"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.linux-x64"]
+checksum = "sha256:b72a7a587148d1eaa15ccea3ce1adfd67e040d1cd9f9e267c850154035ef9a18"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_linux_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772131"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.linux-x64-musl"]
+checksum = "sha256:b72a7a587148d1eaa15ccea3ce1adfd67e040d1cd9f9e267c850154035ef9a18"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_linux_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772131"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.macos-arm64"]
+checksum = "sha256:570d5c3b43c0cbe0d88c527d2fcecb9ee565e2f9d1a4d49fb4b6bbf5c3fa47e5"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_darwin_arm64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772124"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.macos-x64"]
+checksum = "sha256:c3579f73928df56d1cf6d6bbb90d20424649ff08c228daa4810914017f8620d8"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_darwin_amd64.tar.gz"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772123"
+provenance = "github-attestations"
+
+[tools."aqua:grafana/oats"."platforms.windows-x64"]
+checksum = "sha256:b52112bf0932ea8dea1fb051bc04e29efa5ef138f67d09d775c4eb716d3d92f9"
+url = "https://github.com/grafana/oats/releases/download/v0.10.0/oats_0.10.0_windows_amd64.zip"
+url_api = "https://api.github.com/repos/grafana/oats/releases/assets/493772125"
 provenance = "github-attestations"
 
 [[tools."aqua:jonwiggins/xmloxide"]]
-version = "v0.4.3"
+version = "v0.5.0"
 backend = "aqua:jonwiggins/xmloxide"
+specifiers = ["latest"]
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.linux-arm64"]
-checksum = "sha256:abb840c558fdc94b4c1eddb1e4a3901d6c8129dcb76f387428dc2b30a7364967"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_linux-aarch64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587060"
+checksum = "sha256:554d4ae976782bed0d9fa44b9ee7106a756f6a599ef9867b412db47a2a664399"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_linux-aarch64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799877"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.linux-arm64-musl"]
-checksum = "sha256:abb840c558fdc94b4c1eddb1e4a3901d6c8129dcb76f387428dc2b30a7364967"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_linux-aarch64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587060"
+checksum = "sha256:554d4ae976782bed0d9fa44b9ee7106a756f6a599ef9867b412db47a2a664399"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_linux-aarch64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799877"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.linux-x64"]
-checksum = "sha256:46ccd30ff3a242b3d01ab72366cc3b6762882be604ebceaa32123a40d0af2dfc"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_linux-x86-64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587058"
+checksum = "sha256:4dd8c45676bb34bd397db97179231f4e6f77caff35059f18de9d1d4b68773d55"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_linux-x86-64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799872"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.linux-x64-musl"]
-checksum = "sha256:46ccd30ff3a242b3d01ab72366cc3b6762882be604ebceaa32123a40d0af2dfc"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_linux-x86-64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587058"
+checksum = "sha256:4dd8c45676bb34bd397db97179231f4e6f77caff35059f18de9d1d4b68773d55"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_linux-x86-64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799872"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.macos-arm64"]
-checksum = "sha256:6a2cb055e63ae97d75cd346c34138a9e31626e1dfc0983006c422c203b5cc288"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_darwin-aarch64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587063"
+checksum = "sha256:02a44c8cab86cd2d8765fcf0dc7e7610768571a0cf0af3785fb691196d1eebe5"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_darwin-aarch64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799873"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.macos-x64"]
-checksum = "sha256:e83cbba88862d009405b5ce9e48025ff84b683a39a0832dde2db5395cb54734f"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_darwin-x86-64"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587061"
+checksum = "sha256:6876c1f1ec9dd31bc80a6417548fa337898e78e50ac0479ed391f3bd26e0b4f3"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_darwin-x86-64"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799874"
 
 [tools."aqua:jonwiggins/xmloxide"."platforms.windows-x64"]
-checksum = "sha256:22872cad20b8ce8ccab28c42ce17acc9aa64b82cbad7d130ee74196cd74cd414"
-url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.4.3/xmllint_windows-x86-64.exe"
-url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/411587062"
+checksum = "sha256:ecf509be8f9de6cb86921c88a516a9fac4a920f0905c18f62d91a4ed41af920f"
+url = "https://github.com/jonwiggins/xmloxide/releases/download/v0.5.0/xmllint_windows-x86-64.exe"
+url_api = "https://api.github.com/repos/jonwiggins/xmloxide/releases/assets/506799871"
 
 [[tools."aqua:owenlamont/ryl"]]
-version = "0.21.0"
+version = "0.24.0"
 backend = "aqua:owenlamont/ryl"
+specifiers = ["latest"]
 
 [tools."aqua:owenlamont/ryl"."platforms.linux-arm64"]
-checksum = "sha256:134dfccd5dd7fd13092dbaf482e14e1e9c2b238ecf4306ac020b036212f85abc"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375977"
+checksum = "sha256:184a727fabbec5a2d2de11fd64483f9c3040f1822d9b4e142d75c2046fef8d6f"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310931"
 provenance = "github-attestations"
 
 [tools."aqua:owenlamont/ryl"."platforms.linux-arm64-musl"]
-checksum = "sha256:134dfccd5dd7fd13092dbaf482e14e1e9c2b238ecf4306ac020b036212f85abc"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375977"
+checksum = "sha256:88a4a0b1f59cda012a35c8e3333649859a868a166670f19b556a4fdb506e0744"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310938"
 provenance = "github-attestations"
 
 [tools."aqua:owenlamont/ryl"."platforms.linux-x64"]
-checksum = "sha256:36867148c4e7415b5f8dd24a1c4e3212e8ec016a6a16d1d1e0d16d7c2f641214"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375995"
+checksum = "sha256:ee496e9d246352abd40bb19b932dda36f5dc23a561ac51d5c56218ba3f25d8a8"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310977"
 provenance = "github-attestations"
 
 [tools."aqua:owenlamont/ryl"."platforms.linux-x64-musl"]
-checksum = "sha256:36867148c4e7415b5f8dd24a1c4e3212e8ec016a6a16d1d1e0d16d7c2f641214"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375995"
+checksum = "sha256:2d42ab79bcded398587401a4682dbf30a9977f907a3c3f3843eaf9a8cb0cbcfb"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310983"
 provenance = "github-attestations"
 
 [tools."aqua:owenlamont/ryl"."platforms.macos-arm64"]
-checksum = "sha256:ed5e23a5634f138aac5c2c15e72975f0f485f694582ef6874625e38460b0c3b4"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375976"
+checksum = "sha256:55ae4a170ece424c5a9ac939fc2fadeeddaea62dc3f4303b24d33ad4def3126f"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310936"
 provenance = "github-attestations"
 
 [tools."aqua:owenlamont/ryl"."platforms.windows-x64"]
-checksum = "sha256:7522a1fde12775ad43b74e154a6abe3affb676bb52d719ac9e7eb6980bda856d"
-url = "https://github.com/owenlamont/ryl/releases/download/v0.21.0/ryl-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/454375990"
+checksum = "sha256:e86231ca8ef367f309fe0e49038c220426fca9ebc51d3f806972a015da3d42b0"
+url = "https://github.com/owenlamont/ryl/releases/download/v0.24.0/ryl-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/611310978"
 provenance = "github-attestations"
 
 [[tools.biome]]
-version = "2.5.3"
+version = "2.5.15"
 backend = "aqua:biomejs/biome"
+specifiers = ["latest"]
 
 [tools.biome."platforms.linux-arm64"]
-checksum = "sha256:b642ded43aebcad738926b40eefd4dc2187a206d1fbfb37a45f1db4986804dbd"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-linux-arm64"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058837"
+checksum = "sha256:a56bcd73ddbfdb0f57a82bb67b7ea698eed4027aff602b95aa18fafe919d59e0"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-linux-arm64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227632"
 provenance = "github-attestations"
 
 [tools.biome."platforms.linux-arm64-musl"]
-checksum = "sha256:1a69ea4eb55baaec0bedd7d6ada3b1e626e2b430ecfc9a8f1b90373ca78aeb70"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-linux-arm64-musl"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058836"
+checksum = "sha256:a56bcd73ddbfdb0f57a82bb67b7ea698eed4027aff602b95aa18fafe919d59e0"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-linux-arm64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227632"
 provenance = "github-attestations"
 
 [tools.biome."platforms.linux-x64"]
-checksum = "sha256:ab8e74af2366127306e250652d2f32bd193601f208fcd0604112080c0ca3245b"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-linux-x64"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058832"
+checksum = "sha256:5d867a0b2ccea1755b7e508b01d836a8c64e31a1e4d11ec24b43b6b4eec8b3b6"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-linux-x64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227626"
 provenance = "github-attestations"
 
 [tools.biome."platforms.linux-x64-musl"]
-checksum = "sha256:03cf125720b1d791093c9c68be34875d08638c314b3e1e63db1a45f2b418b1ca"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-linux-x64-musl"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058833"
+checksum = "sha256:5d867a0b2ccea1755b7e508b01d836a8c64e31a1e4d11ec24b43b6b4eec8b3b6"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-linux-x64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227626"
 provenance = "github-attestations"
 
 [tools.biome."platforms.macos-arm64"]
-checksum = "sha256:610d3e1e770d373368d4ccee5a19c5e1735b0235024fcbed6ae07eb080d3bb09"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-darwin-arm64"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058834"
+checksum = "sha256:3636796d8c78bfcfe0d45946dc93e21e12d27a49eba7401e18af1ea854d25503"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-darwin-arm64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227628"
 provenance = "github-attestations"
 
 [tools.biome."platforms.macos-x64"]
-checksum = "sha256:4df90556830ed35e6238e4b976b942d369a5378447c8d68b260b7a38e08b26f9"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-darwin-x64"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058835"
+checksum = "sha256:86fc618563d19f373ac24eb5b8f1e41bd753a506d5df1f198c152ec365141490"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-darwin-x64"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227623"
 provenance = "github-attestations"
 
 [tools.biome."platforms.windows-x64"]
-checksum = "sha256:04c9ca46af43a0d060b22b21f94c7e1a9e8c57963a09778b8ff1d808ed536b31"
-url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.3/biome-win32-x64.exe"
-url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/470058831"
-provenance = "github-attestations"
+checksum = "sha256:f2beadee753b78fe76081158123538be886a31b5e67a34863e42535f3f491926"
+url = "https://github.com/biomejs/biome/releases/download/%40biomejs/biome%402.5.15/biome-win32-x64.exe"
+url_api = "https://api.github.com/repos/biomejs/biome/releases/assets/601227624"
+provenance = "github-attestations"
+
+[[tools.checkstyle]]
+version = "14.3.0"
+backend = "aqua:checkstyle/checkstyle"
+specifiers = ["latest"]
+
+[tools.checkstyle."platforms.linux-arm64"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.linux-arm64-musl"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.linux-x64"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.linux-x64-musl"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.macos-arm64"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.macos-x64"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
+
+[tools.checkstyle."platforms.windows-x64"]
+checksum = "sha256:754e218ab1fcabb1e1c5f8530e9d3aa37636806c22987bb279dd907a6ee749b2"
+url = "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-14.3.0/checkstyle-14.3.0-all.jar"
+url_api = "https://api.github.com/repos/checkstyle/checkstyle/releases/assets/593192192"
 
 [[tools.editorconfig-checker]]
-version = "3.8.0"
+version = "4.0.2"
 backend = "aqua:editorconfig-checker/editorconfig-checker"
+specifiers = ["latest"]
 
 [tools.editorconfig-checker."platforms.linux-arm64"]
-checksum = "sha256:5676889ac4eed1036180ffbe2aeb2062d985ac50f7e6035fe61160c6b8be2c33"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-linux-arm64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248498"
+checksum = "sha256:abad76da8c9950fdc2a314bcd66969172aa823e9c595fa7e3a389a91e34d025e"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-arm64.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675779"
 
 [tools.editorconfig-checker."platforms.linux-arm64-musl"]
-checksum = "sha256:5676889ac4eed1036180ffbe2aeb2062d985ac50f7e6035fe61160c6b8be2c33"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-linux-arm64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248498"
+checksum = "sha256:abad76da8c9950fdc2a314bcd66969172aa823e9c595fa7e3a389a91e34d025e"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-arm64.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675779"
 
 [tools.editorconfig-checker."platforms.linux-x64"]
-checksum = "sha256:613bd88f34165a334adcb6b7e92a123c9de0eada65846d31af63613b779ff3be"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-linux-amd64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248510"
+checksum = "sha256:44efaef3ed14c6ab52eb87481d78e5e5c204796dccf26e2f4598a61ba17f8003"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-amd64.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675771"
 
 [tools.editorconfig-checker."platforms.linux-x64-musl"]
-checksum = "sha256:613bd88f34165a334adcb6b7e92a123c9de0eada65846d31af63613b779ff3be"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-linux-amd64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248510"
+checksum = "sha256:44efaef3ed14c6ab52eb87481d78e5e5c204796dccf26e2f4598a61ba17f8003"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-amd64.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675771"
 
 [tools.editorconfig-checker."platforms.macos-arm64"]
-checksum = "sha256:73bbb23c24b94c9e61d7ed3694cc313943c59e5e8bc5bee9f186a997a45eb046"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-darwin-arm64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248516"
+checksum = "sha256:ff59f57717d95fc62b8e372c8051dbbb766f7d660942409a85d027b0feb2422c"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-darwin-all.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675773"
 
 [tools.editorconfig-checker."platforms.macos-x64"]
-checksum = "sha256:ee0d45c94b9808a5aa15e08f94333a81842b456f511f29f71a8fe589b82d72a1"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-darwin-amd64.tar.gz"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248506"
+checksum = "sha256:ff59f57717d95fc62b8e372c8051dbbb766f7d660942409a85d027b0feb2422c"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-darwin-all.tar.gz"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675773"
 
 [tools.editorconfig-checker."platforms.windows-x64"]
-checksum = "sha256:7ec31e1a6a9983aa2a4942cb66dfd35e8b61e76263460413988438ae1426906a"
-url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v3.8.0/ec-windows-amd64.zip"
-url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/460248513"
-
-[[tools."go:github.com/grafana/oats"]]
-version = "0.7.0"
-backend = "go:github.com/grafana/oats"
+checksum = "sha256:857f8f74dfc259d73dac93573e37cf3ce01150787d7b139bf839549cc6b5beb9"
+url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-windows-amd64.zip"
+url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675794"
 
 [[tools.google-java-format]]
-version = "1.35.0"
+version = "1.37.0"
 backend = "aqua:google/google-java-format"
+specifiers = ["latest"]
 
 [tools.google-java-format."platforms.linux-arm64"]
-checksum = "sha256:a69b2e85deb681f3eae4c946b948908e162e76ef27d752fa31830866dd7aa764"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_linux-arm64"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365933462"
+checksum = "sha256:e8c1c4ae92f5a86367500d78ff0d09ad12bf8ad213fa35b372468fcabf281bd3"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_linux-arm64"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603147101"
 
 [tools.google-java-format."platforms.linux-arm64-musl"]
-checksum = "sha256:a69b2e85deb681f3eae4c946b948908e162e76ef27d752fa31830866dd7aa764"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_linux-arm64"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365933462"
+checksum = "sha256:e8c1c4ae92f5a86367500d78ff0d09ad12bf8ad213fa35b372468fcabf281bd3"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_linux-arm64"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603147101"
 
 [tools.google-java-format."platforms.linux-x64"]
-checksum = "sha256:e0f95ad6d26b8fbd5b1e3fd3014f8306c4eb3b29d2a6b15fab62d0a364629437"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_linux-x86-64"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365933717"
+checksum = "sha256:881821ffd1a52b175886c4ebeeacce2ba5b5d7326b52d32a18d384d8a783bd77"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_linux-x86-64"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603147019"
 
 [tools.google-java-format."platforms.linux-x64-musl"]
-checksum = "sha256:e0f95ad6d26b8fbd5b1e3fd3014f8306c4eb3b29d2a6b15fab62d0a364629437"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_linux-x86-64"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365933717"
+checksum = "sha256:881821ffd1a52b175886c4ebeeacce2ba5b5d7326b52d32a18d384d8a783bd77"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_linux-x86-64"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603147019"
 
 [tools.google-java-format."platforms.macos-arm64"]
-checksum = "sha256:563f066c324687885b5f4039325f8952fbb9aaf3d67c68e0b2eafccc8069d3b8"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_darwin-arm64"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365933286"
+checksum = "sha256:657cf1011c8dfb7e0dac08516db02b701436e59600b961077f83b89b69cc3495"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_darwin-arm64"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603148240"
 
 [tools.google-java-format."platforms.windows-x64"]
-checksum = "sha256:2451e70f7805ce51dc026c0ca6b76b689b20c99c5e5769412ae5235f59f3a427"
-url = "https://github.com/google/google-java-format/releases/download/v1.35.0/google-java-format_windows-x86-64.exe"
-url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/365934498"
+checksum = "sha256:48260bed87f6830bae44a7a27f66ce98f7d9fb245f500021bd7ae16c9e2daa06"
+url = "https://github.com/google/google-java-format/releases/download/v1.37.0/google-java-format_windows-x86-64.exe"
+url_api = "https://api.github.com/repos/google/google-java-format/releases/assets/603148681"
 
 [[tools.hugo]]
-version = "0.164.0"
+version = "0.168.0"
 backend = "aqua:gohugoio/hugo"
+specifiers = ["latest"]
 
 [tools.hugo."platforms.linux-arm64"]
-checksum = "sha256:948ee5f0ed30175f31937d592d63a2712f0761a69f1cbe812f780eb918a08b8e"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-arm64.tar.gz"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320173"
+checksum = "sha256:91ce984e998a955a3dc1b5852eb4e65d0ed0f6d12a5c51690df97a548e1fdeeb"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_linux-arm64.tar.gz"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728524"
 
 [tools.hugo."platforms.linux-arm64-musl"]
-checksum = "sha256:948ee5f0ed30175f31937d592d63a2712f0761a69f1cbe812f780eb918a08b8e"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-arm64.tar.gz"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320173"
+checksum = "sha256:91ce984e998a955a3dc1b5852eb4e65d0ed0f6d12a5c51690df97a548e1fdeeb"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_linux-arm64.tar.gz"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728524"
 
 [tools.hugo."platforms.linux-x64"]
-checksum = "sha256:d9c8b17285ea4ec004d9f814273ea910f2051ce02c284993fd1f91ba455ae50d"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-amd64.tar.gz"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320170"
+checksum = "sha256:fada83ad56bb27ed4cb7dd81590303bdac16140f944ac4e66fc248117e2d5594"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_linux-amd64.tar.gz"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728522"
 
 [tools.hugo."platforms.linux-x64-musl"]
-checksum = "sha256:d9c8b17285ea4ec004d9f814273ea910f2051ce02c284993fd1f91ba455ae50d"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-amd64.tar.gz"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320170"
+checksum = "sha256:fada83ad56bb27ed4cb7dd81590303bdac16140f944ac4e66fc248117e2d5594"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_linux-amd64.tar.gz"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728522"
 
 [tools.hugo."platforms.macos-arm64"]
-checksum = "sha256:c994e2cc6946838bb76521039509a7ce71282827e7035e344b6c225a83a5d0d3"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_darwin-universal.pkg"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320272"
+checksum = "sha256:01b2f0abc453242225a9bfac2c91c66a078135a28f12222a475649a299a20281"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_darwin-universal.pkg"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728680"
 
 [tools.hugo."platforms.macos-x64"]
-checksum = "sha256:c994e2cc6946838bb76521039509a7ce71282827e7035e344b6c225a83a5d0d3"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_darwin-universal.pkg"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320272"
+checksum = "sha256:01b2f0abc453242225a9bfac2c91c66a078135a28f12222a475649a299a20281"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_darwin-universal.pkg"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728680"
 
 [tools.hugo."platforms.windows-x64"]
-checksum = "sha256:dadf3499d4c6a27f6bc9d56d5a992ba62d82a74a3771fcc165c364ec1eeaac1c"
-url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_windows-amd64.zip"
-url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320283"
+checksum = "sha256:f6cf760426de305cdd85c6eaa7e203a4d623e74cc6ad8fea61228caf1e59f243"
+url = "https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_0.168.0_windows-amd64.zip"
+url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/637728720"
+
+[[tools.java]]
+version = "temurin-25.0.4+101.0.LTS"
+backend = "core:java"
+specifiers = ["temurin-25"]
+
+[tools.java."platforms.linux-arm64"]
+checksum = "sha256:69df11a02cfa3ef7d7ca645e03edce6778ec090e100f6ae2b42097865730ac52"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_aarch64_linux_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.linux-arm64-musl"]
+checksum = "sha256:8d19373d427017d86ac87cf6a47ba49746be864832f60b52b7e3b1531c6b2cb8"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_aarch64_alpine-linux_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.linux-x64"]
+checksum = "sha256:dbb698396d478e7fa2b1e50f4103324b2a99b90569ee27c33f2261f9215cf41e"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_x64_linux_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.linux-x64-musl"]
+checksum = "sha256:f18648ee5ce45261f50dc9493fdae7ddebaa2a7a857cafda3e2a448a79c03dee"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_x64_alpine-linux_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.macos-arm64"]
+checksum = "sha256:61979887f7506a24a57439ff99adb8b3a7fc89977d9cfe3b8984f58a981b7b9d"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_aarch64_mac_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.macos-x64"]
+checksum = "sha256:e6229d9504f7922053ab31821b9e6bee8761daf7b026a3476d1a027563009880"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_x64_mac_hotspot_25.0.4.1_1.tar.gz"
+
+[tools.java."platforms.windows-x64"]
+checksum = "sha256:00c847d804f4a78e9f04f2683faf14fed898535b177b7fc704486cb0284e9283"
+url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.4.1%2B1/OpenJDK25U-jdk_x64_windows_hotspot_25.0.4.1_1.zip"
 
 [[tools.java]]
-version = "temurin-25.0.3+9.0.LTS"
+version = "temurin-21.0.12+101.0.LTS"
 backend = "core:java"
+specifiers = ["temurin-21"]
 
 [tools.java."platforms.linux-arm64"]
-checksum = "sha256:3e4287cb98870ba824ed698854bdc27cff984254caf66dd12cc291e7bfdde26b"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_aarch64_linux_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:23e37e026f12f3e706f18938ff611db3032d075b09d0879a25d06718c773e223"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.12.1_1.tar.gz"
 
 [tools.java."platforms.linux-arm64-musl"]
-checksum = "sha256:6ed368e93049d3b188c045fce0b20953bbea92fe0614dbbf4d3fd8daad7be3b2"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_aarch64_alpine-linux_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:8242627927adc90ac2561d0812dd39890ebc21ef09b550bc2e8b93640b8af4f8"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_aarch64_alpine-linux_hotspot_21.0.12.1_1.tar.gz"
 
 [tools.java."platforms.linux-x64"]
-checksum = "sha256:69264a7a211bf5029830d07bc3370f879769d62ebc5b5488e90c9343a2da0e1f"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_x64_linux_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:ce79869e1307ed8ee1e2baa86a412b1eb5b75d10a01006d788a6f968bcfaee94"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_linux_hotspot_21.0.12.1_1.tar.gz"
 
 [tools.java."platforms.linux-x64-musl"]
-checksum = "sha256:51c2415b370aac7c3796b0c4663c8fcf91bc22d76f03df95b25fa5667cb5fdd8"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_x64_alpine-linux_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:bd8824214e42b33333c7f55a039ea078ad6ea6be20d7c5b011c801fb2bdb44f0"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_alpine-linux_hotspot_21.0.12.1_1.tar.gz"
 
 [tools.java."platforms.macos-arm64"]
-checksum = "sha256:7baab4d69a15554e119b86ff78d40e3fdc28819b5b322955c913cebfe3f6a37c"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_aarch64_mac_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:3623232f33a9c3baadf304480b2535f9a3cba8a58d42ecbb438ba267315d9998"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.12.1_1.tar.gz"
 
 [tools.java."platforms.macos-x64"]
-checksum = "sha256:4c539a18b4d656960ff6766727e9ca546fc17f7a29714dba9e7b47bdcb37c447"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_x64_mac_hotspot_25.0.3_9.tar.gz"
+checksum = "sha256:44db0f08196daf19a47f90d13388b0c943b67663cb537f998fe29e836fa842ce"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_mac_hotspot_21.0.12.1_1.tar.gz"
+
+[tools.java."platforms.windows-x64"]
+checksum = "sha256:f9d6e191ab098c0d416e7d588a24420a8621cd2f4720dab2459b8b7b2d2d8b4e"
+url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_windows_hotspot_21.0.12.1_1.zip"
+
+[[tools.java]]
+version = "oracle-graalvm-25.0.4.1.1"
+backend = "core:java"
+specifiers = ["oracle-graalvm-25"]
+
+[tools.java."platforms.linux-arm64"]
+checksum = "sha256:479a762a33b96921fce5cb39e0656833a36fc9f3add422cfffabb55f4119dd3b"
+url = "https://gds.oracle.com/download/graal/25/archive/graalvm-jdk-25.0.4.1.1_linux-aarch64_bin.tar.gz"
+
+[tools.java."platforms.linux-x64"]
+checksum = "sha256:b923080f922a8be2a5742b6dadc8b149357c5b2365822e33f94ef68b7df94884"
+url = "https://gds.oracle.com/download/graal/25/archive/graalvm-jdk-25.0.4.1.1_linux-x64_bin.tar.gz"
+
+[tools.java."platforms.macos-arm64"]
+checksum = "sha256:e14dbe0dac6451c170c8b9403b04993bc8ae22e24f8b6c2a5b15e1803824e97c"
+url = "https://gds.oracle.com/download/graal/25/archive/graalvm-jdk-25.0.4.1.1_macos-aarch64_bin.tar.gz"
 
 [tools.java."platforms.windows-x64"]
-checksum = "sha256:709312cd0420296d9b9de917fe6e28a5b979e875ee5ab91783fb79bcd5857235"
-url = "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.3%2B9/OpenJDK25U-jdk_x64_windows_hotspot_25.0.3_9.zip"
+checksum = "sha256:72a79765541c2c83ccc918dd1f2a3f565760aaab519ef2cf44d36b6ad39728bf"
+url = "https://gds.oracle.com/download/graal/25/archive/graalvm-jdk-25.0.4.1.1_windows-x64_bin.zip"
 
 [[tools.lychee]]
 version = "0.24.2"
 backend = "aqua:lycheeverse/lychee"
+specifiers = ["latest"]
 
 [tools.lychee."platforms.linux-arm64"]
-checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535"
-url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602"
+checksum = "sha256:91a7bd65685da41b90ccb9bc867a3d649a7818042dae04ff405e55a25bddee4c"
+url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959442"
 
 [tools.lychee."platforms.linux-arm64-musl"]
 checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535"
@@ -374,9 +569,9 @@ url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/ly
 url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602"
 
 [tools.lychee."platforms.linux-x64"]
-checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5"
-url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271"
+checksum = "sha256:1f4e0ef7f6554a6ed33dd7ac144fb2e1bbed98598e7af973042fc5cd43951c9a"
+url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959156"
 
 [tools.lychee."platforms.linux-x64-musl"]
 checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5"
@@ -399,175 +594,186 @@ url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/ly
 url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959491"
 
 [[tools.node]]
-version = "24.18.0"
+version = "24.22.0"
 backend = "core:node"
+specifiers = ["lts"]
 
 [tools.node."platforms.linux-arm64"]
-checksum = "sha256:6b4484c2190274175df9aa8f28e2d758a819cb1c1fe6ab481e2f95b463ab8508"
-url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-arm64.tar.gz"
+checksum = "sha256:b7e7991d5407815adfa74a2a9cd4db683552c8ce32ff4a295c22e972849c3f5d"
+url = "https://nodejs.org/dist/v24.22.0/node-v24.22.0-linux-arm64.tar.gz"
 
 [tools.node."platforms.linux-arm64-musl"]
-checksum = "sha256:b1c6c2dc31b46dd8fb2322f4fe75b07e775c5120bc37251deeea28f529d4567b"
-url = "https://unofficial-builds.nodejs.org/download/release/v24.18.0/node-v24.18.0-linux-arm64-musl.tar.gz"
+checksum = "sha256:6812a53e5b37fbc32476d6c3511038d2bc3bbd1b3bb348d6c04dd2c70a1c8f4a"
+url = "https://unofficial-builds.nodejs.org/download/release/v24.22.0/node-v24.22.0-linux-arm64-musl.tar.gz"
 
 [tools.node."platforms.linux-x64"]
-checksum = "sha256:783130984963db7ba9cbd01089eaf2c2efb055c7c1693c943174b967b3050cb8"
-url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-x64.tar.gz"
+checksum = "sha256:28ea0a438de9a13bd7891fd758eee6c7819ee8af5442dfd8d45bd65e56d4228c"
+url = "https://nodejs.org/dist/v24.22.0/node-v24.22.0-linux-x64.tar.gz"
 
 [tools.node."platforms.linux-x64-musl"]
-checksum = "sha256:ea58409911e141ec6b19d9178efa2d9185a13295005b1cbf5521b3157eed1d95"
-url = "https://unofficial-builds.nodejs.org/download/release/v24.18.0/node-v24.18.0-linux-x64-musl.tar.gz"
+checksum = "sha256:72cd253fbe0c2539d52208ed098d47b78ff2c32ba76295d8e6b5b0ce067dcba5"
+url = "https://unofficial-builds.nodejs.org/download/release/v24.22.0/node-v24.22.0-linux-x64-musl.tar.gz"
 
 [tools.node."platforms.macos-arm64"]
-checksum = "sha256:e1a97e14c99c803e96c7339403282ea05a499c32f8d83defe9ef5ec66f979ed1"
-url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-darwin-arm64.tar.gz"
+checksum = "sha256:6a9724d9b50a5f22b4816cded441b5a8d9ddae546191a5e5b7efa5a5e2ee26d5"
+url = "https://nodejs.org/dist/v24.22.0/node-v24.22.0-darwin-arm64.tar.gz"
 
 [tools.node."platforms.macos-x64"]
-checksum = "sha256:dfd0dbd3e721503434df7b7205e719f61b3a3a31b2bcf9729b8b91fea240f080"
-url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-darwin-x64.tar.gz"
+checksum = "sha256:495e3f273c645f3c4677d438304cdfc701729ea5dec5728f5c8e76a2dece4b91"
+url = "https://nodejs.org/dist/v24.22.0/node-v24.22.0-darwin-x64.tar.gz"
 
 [tools.node."platforms.windows-x64"]
-checksum = "sha256:0ae68406b42d7725661da979b1403ec9926da205c6770827f33aac9d8f26e821"
-url = "https://nodejs.org/dist/v24.18.0/node-v24.18.0-win-x64.zip"
+checksum = "sha256:f9683a19877e12a9b167305c8db71040d812876359de21f0d2e97c3f321f80c3"
+url = "https://nodejs.org/dist/v24.22.0/node-v24.22.0-win-x64.zip"
 
 [[tools."npm:renovate"]]
-version = "43.257.4"
+version = "44.82.0"
+aube = { path = ".mise/locks/npm-renovate/44.82.0~026f02c4", digest = "sha256:07b3b5d8f170cfc1797e639fcc1f270b498c0b283ad72db728a51d40d11d53ae" }
 backend = "npm:renovate"
+specifiers = ["latest"]
+
+[tools."npm:renovate".options]
+allow_builds = '["re2"]'
+trust_policy_excludes = '["@yarnpkg/libzip@3.2.2"]'
 
 [[tools.protoc]]
-version = "35.1"
+version = "36.2"
 backend = "aqua:protocolbuffers/protobuf/protoc"
+specifiers = ["latest"]
 
 [tools.protoc."platforms.linux-arm64"]
-checksum = "sha256:01bf9d08808c7f96678b63f4bd8efa559bb4f83d5a7a270d5edaf507f9d5d9cf"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-linux-aarch_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060236"
+checksum = "sha256:8b8f18bd2b30346efbc698dd5a73dd7c805f3ef8380f6dfc95c768f3f1852f6a"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-linux-aarch_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742403"
 
 [tools.protoc."platforms.linux-arm64-musl"]
-checksum = "sha256:01bf9d08808c7f96678b63f4bd8efa559bb4f83d5a7a270d5edaf507f9d5d9cf"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-linux-aarch_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060236"
+checksum = "sha256:8b8f18bd2b30346efbc698dd5a73dd7c805f3ef8380f6dfc95c768f3f1852f6a"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-linux-aarch_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742403"
 
 [tools.protoc."platforms.linux-x64"]
-checksum = "sha256:6930ebf62bd4ea607b98fff052596c6ee564b9835b4ce172c75a3f53ae9d91b7"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-linux-x86_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060247"
+checksum = "sha256:121f6c7afe1d4d0e3ea6aab9432038599250134cbf4474cb1167d2c7decd4278"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-linux-x86_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742434"
 
 [tools.protoc."platforms.linux-x64-musl"]
-checksum = "sha256:6930ebf62bd4ea607b98fff052596c6ee564b9835b4ce172c75a3f53ae9d91b7"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-linux-x86_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060247"
+checksum = "sha256:121f6c7afe1d4d0e3ea6aab9432038599250134cbf4474cb1167d2c7decd4278"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-linux-x86_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742434"
 
 [tools.protoc."platforms.macos-arm64"]
-checksum = "sha256:193289af0470c6a1aada357d4fba0bbf8d78bfaac8b5e42ca30af2ef75583de2"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-osx-aarch_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060249"
+checksum = "sha256:9cd98a532c5c5e0c4161314de0225de27e4c8a323917b6ea7b1b714d3ae23466"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-osx-aarch_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742436"
 
 [tools.protoc."platforms.macos-x64"]
-checksum = "sha256:537d73604a344ded6fc94e98e07e529d4fe3e4a0b09e59905353950fafc2a1f7"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-osx-x86_64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060254"
+checksum = "sha256:228cc7add4616cc14ca5e80dee83209d44449a7aee95a914ae748fa374efb078"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-osx-x86_64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742448"
 
 [tools.protoc."platforms.windows-x64"]
-checksum = "sha256:5d3ff218d7d91eea95f7569bcb5a98f3030f8996d44151279d9772edcff76082"
-url = "https://github.com/protocolbuffers/protobuf/releases/download/v35.1/protoc-35.1-win64.zip"
-url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/445060259"
+checksum = "sha256:f0c128dc0d8492eceece83bb459a4c0e316764b929ffbf1aa416357fd644edd3"
+url = "https://github.com/protocolbuffers/protobuf/releases/download/v36.2/protoc-36.2-win64.zip"
+url_api = "https://api.github.com/repos/protocolbuffers/protobuf/releases/assets/570742465"
 
 [[tools.ruff]]
-version = "0.15.21"
+version = "0.16.10"
 backend = "aqua:astral-sh/ruff"
+specifiers = ["latest"]
 
 [tools.ruff."platforms.linux-arm64"]
-checksum = "sha256:2ec7c0077431f96f74c3c72aea6505e902bc2ff47127653c8de1389ee30a3cb3"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700003"
+checksum = "sha256:dc0d74de837ef0a7bcc62ce98c48a622b075d057161f13b958be2934becd55a6"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603826868"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.linux-arm64-musl"]
-checksum = "sha256:2ec7c0077431f96f74c3c72aea6505e902bc2ff47127653c8de1389ee30a3cb3"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700003"
+checksum = "sha256:38ebc0ec3e0de538d1c399729ca04e124749211d66aa134c24ad0c1f09a935b9"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603826873"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.linux-x64"]
-checksum = "sha256:7e157ff9a2e13676118c587e6db0ec02d040e415b21014346d230e64789c0e78"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700081"
+checksum = "sha256:9567ff1201e2fb3da31ff04c35587d768c66d6cb42dfa84de474e2bfe360b608"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603827060"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.linux-x64-musl"]
-checksum = "sha256:7e157ff9a2e13676118c587e6db0ec02d040e415b21014346d230e64789c0e78"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700081"
+checksum = "sha256:ad1b2138407a0c53b936524df99d87211333f7bc40478d6860f42994597f7ff0"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603827079"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.macos-arm64"]
-checksum = "sha256:0452f9d5da6e8051d332cf21ae82a608d8e2cfeec5a71a46ffa9e50adbb2381d"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471699864"
+checksum = "sha256:f051cd306de2691262a0574f8857cd1f4d6bfcd448084ea23d61b9c1c37df510"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603826852"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.macos-x64"]
-checksum = "sha256:7e6ff3bd585b5b7c47634c957ac84fb5806d3c7ab4ef0e5ec1c53ce272f489da"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-x86_64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700061"
+checksum = "sha256:ace641df42926e962cf04bc52c79eb6c50ba1ae6a17b602f081960616ecc1bd1"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-x86_64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603827024"
 provenance = "github-attestations"
 
 [tools.ruff."platforms.windows-x64"]
-checksum = "sha256:035c59abfd7bd1102e0b656f5771e6ae7a712a45ef54b5ab575541c7ff7d1eb0"
-url = "https://github.com/astral-sh/ruff/releases/download/0.15.21/ruff-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/471700068"
+checksum = "sha256:6b90457fbd249923db196044d5f3c26e4f7cefacc769c26fd52520fa033f736e"
+url = "https://github.com/astral-sh/ruff/releases/download/0.16.10/ruff-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/603827051"
 provenance = "github-attestations"
 
 [[tools.rumdl]]
-version = "v0.2.31"
+version = "0.2.78"
 backend = "aqua:rvben/rumdl"
+specifiers = ["latest"]
 
 [tools.rumdl."platforms.linux-arm64"]
-checksum = "sha256:d5aa4ac3f94de9b6508021f70d78be592c6dc8b67ea499c6e203c1e3daf044b0"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381480"
+checksum = "sha256:16e518695868a650ad0f584f60f225e65e63ffb71b46aba2428c365c7225d262"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548742"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.linux-arm64-musl"]
-checksum = "sha256:d5aa4ac3f94de9b6508021f70d78be592c6dc8b67ea499c6e203c1e3daf044b0"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381480"
+checksum = "sha256:83afca5be68f8710cf5e3faef103927af8ef8dec3b19bd33ceebef348f3e546e"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548747"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.linux-x64"]
-checksum = "sha256:5550f7954457248c6e29715b69d4ec2e9394613de51f98b50fa81f197a29af92"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381477"
+checksum = "sha256:5597ecab62c6cd50e63f85451fe4e763abc58195a3e7eff9186b6dfae890ca24"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548740"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.linux-x64-musl"]
-checksum = "sha256:5550f7954457248c6e29715b69d4ec2e9394613de51f98b50fa81f197a29af92"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381477"
+checksum = "sha256:507d2243ca3582094588c0610c2ee5c3bcd0a50a8564149dcce4268cdf50de82"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548743"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.macos-arm64"]
-checksum = "sha256:368a02639247be530043abc36c40310090c09ef69b32f5744f9a0d9cc2673be5"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381484"
+checksum = "sha256:450f00cdbf1da3bc3fbdf56c52dc9e6b2ab08bfd1ee6a26b44848e52a180dba5"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548745"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.macos-x64"]
-checksum = "sha256:bc8933e04b5c83b8b14c21793c7f7902bc8b1a841bb1f1964c5f177b3cf7d05f"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-x86_64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381479"
+checksum = "sha256:0cb4eecf286798e770c1f9e85fbf532ee135becc248a25fab388355c998543f9"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-x86_64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548751"
 provenance = "github-attestations"
 
 [tools.rumdl."platforms.windows-x64"]
-checksum = "sha256:f8a4b2abf774301fd4ffd04f56e12fb0b2bf4357b28c63ec355405d57f0cfe88"
-url = "https://github.com/rvben/rumdl/releases/download/v0.2.31/rumdl-v0.2.31-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/474381488"
+checksum = "sha256:fb8f475e68e754fdddc1c7c7d85914df984465ce6a8a9e9fe5fcc434782b5f7d"
+url = "https://github.com/rvben/rumdl/releases/download/v0.2.78/rumdl-v0.2.78-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/rvben/rumdl/releases/assets/598548749"
 provenance = "github-attestations"
 
 [[tools.shellcheck]]
 version = "v0.11.0"
 backend = "aqua:koalaman/shellcheck"
+specifiers = ["latest"]
 
 [tools.shellcheck."platforms.linux-arm64"]
 checksum = "sha256:12b331c1d2db6b9eb13cfca64306b1b157a86eb69db83023e261eaa7e7c14588"
@@ -605,47 +811,49 @@ url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellche
 url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056944"
 
 [[tools.shfmt]]
-version = "3.13.1"
+version = "3.14.1"
 backend = "aqua:mvdan/sh"
+specifiers = ["latest"]
 
 [tools.shfmt."platforms.linux-arm64"]
-checksum = "sha256:32d92acaa5cd8abb29fc49dac123dc412442d5713967819d8af2c29f1b3857c7"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_linux_arm64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322859"
+checksum = "sha256:5f2db09dae91fca848f7adbdd014632e921a383863a2ad7e0450ad3aba0c6489"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_linux_arm64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320869"
 
 [tools.shfmt."platforms.linux-arm64-musl"]
-checksum = "sha256:32d92acaa5cd8abb29fc49dac123dc412442d5713967819d8af2c29f1b3857c7"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_linux_arm64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322859"
+checksum = "sha256:5f2db09dae91fca848f7adbdd014632e921a383863a2ad7e0450ad3aba0c6489"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_linux_arm64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320869"
 
 [tools.shfmt."platforms.linux-x64"]
-checksum = "sha256:fb096c5d1ac6beabbdbaa2874d025badb03ee07929f0c9ff67563ce8c75398b1"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_linux_amd64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322866"
+checksum = "sha256:76e77641faa025814b77f153b29796b8e6fa2fca03e0c76a691608b86c7ea7bf"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_linux_amd64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320883"
 
 [tools.shfmt."platforms.linux-x64-musl"]
-checksum = "sha256:fb096c5d1ac6beabbdbaa2874d025badb03ee07929f0c9ff67563ce8c75398b1"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_linux_amd64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322866"
+checksum = "sha256:76e77641faa025814b77f153b29796b8e6fa2fca03e0c76a691608b86c7ea7bf"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_linux_amd64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320883"
 
 [tools.shfmt."platforms.macos-arm64"]
-checksum = "sha256:9680526be4a66ea1ffe988ed08af58e1400fe1e4f4aef5bd88b20bb9b3da33f8"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_darwin_arm64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322881"
+checksum = "sha256:b7c872db63553ccffc7253aba3ed7d4885a27d83f1ba567b1138c6315a5847e5"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_darwin_arm64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320930"
 
 [tools.shfmt."platforms.macos-x64"]
-checksum = "sha256:6feedafc72915794163114f512348e2437d080d0047ef8b8fa2ec63b575f12af"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_darwin_amd64"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322886"
+checksum = "sha256:d33eee0da0f92835b3562e9767a05cee7e4eaeef47daa03bfd09da17b4b590a6"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_darwin_amd64"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320946"
 
 [tools.shfmt."platforms.windows-x64"]
-checksum = "sha256:60cd368533d0ad73fa86d93d5bbf95ef40587245ce684ed138c1b31557b5fe97"
-url = "https://github.com/mvdan/sh/releases/download/v3.13.1/shfmt_v3.13.1_windows_amd64.exe"
-url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/390322844"
+checksum = "sha256:13629ce28442ca80b6b5a819f7574ab39e1c28c6e26734ca816c9714e04851df"
+url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_windows_amd64.exe"
+url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320827"
 
 [[tools.taplo]]
 version = "0.10.0"
 backend = "aqua:tamasfe/taplo"
+specifiers = ["latest"]
 
 [tools.taplo."platforms.linux-arm64"]
 url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-linux-aarch64.gz"
@@ -676,80 +884,82 @@ url = "https://github.com/tamasfe/taplo/releases/download/0.10.0/taplo-windows-x
 url_api = "https://api.github.com/repos/tamasfe/taplo/releases/assets/257323062"
 
 [[tools.typos]]
-version = "1.48.0"
+version = "1.50.3"
 backend = "aqua:crate-ci/typos"
+specifiers = ["latest"]
 
 [tools.typos."platforms.linux-arm64"]
-checksum = "sha256:2960ae07bc1ffe19e4895e4359394dd349c9c31de78aac3a124b6e4aeb206698"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462429655"
+checksum = "sha256:456f9fe7aa6e7c1597879f5e951d7de2fab261a9ca05f16f324f896c806c55db"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/588999780"
 
 [tools.typos."platforms.linux-arm64-musl"]
-checksum = "sha256:2960ae07bc1ffe19e4895e4359394dd349c9c31de78aac3a124b6e4aeb206698"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-aarch64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462429655"
+checksum = "sha256:456f9fe7aa6e7c1597879f5e951d7de2fab261a9ca05f16f324f896c806c55db"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-aarch64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/588999780"
 
 [tools.typos."platforms.linux-x64"]
-checksum = "sha256:72a930c9a94fc3914aa56835c5b859c892a797d40c1c42638b98d93f16ff519c"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462429902"
+checksum = "sha256:aca6b5d546307092b8d0a8e0a89dd80f9da51f2f7617c5e45c5607c1684ffbf2"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/589000924"
 
 [tools.typos."platforms.linux-x64-musl"]
-checksum = "sha256:72a930c9a94fc3914aa56835c5b859c892a797d40c1c42638b98d93f16ff519c"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-x86_64-unknown-linux-musl.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462429902"
+checksum = "sha256:aca6b5d546307092b8d0a8e0a89dd80f9da51f2f7617c5e45c5607c1684ffbf2"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-x86_64-unknown-linux-musl.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/589000924"
 
 [tools.typos."platforms.macos-arm64"]
-checksum = "sha256:7dcaf386ec255995dcbaf629641f961574b7e8785203921115eab75cbf1ca107"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462430254"
+checksum = "sha256:844d4121fb47a95604aa5566843bb9e3d6078040b3c8f22367709f563038f2c5"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/589002568"
 
 [tools.typos."platforms.macos-x64"]
-checksum = "sha256:f4335c255db3d57374484e0e96505c8910c0e2fa6d8813b15de529c98f93b1a9"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-x86_64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462431306"
+checksum = "sha256:7cc75e42fff1e3b66928de325b3ea1ec7e23ce35ffaa3561fdb0ede8e7275f6f"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-x86_64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/589006772"
 
 [tools.typos."platforms.windows-x64"]
-checksum = "sha256:ce018a2352da7c1b23bd2684019ee279d2080dc063087020e80c1247d11b0743"
-url = "https://github.com/crate-ci/typos/releases/download/v1.48.0/typos-v1.48.0-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/462430871"
+checksum = "sha256:b59f149d84e86aab535d52db029fa8d3ac5ecba9ae5c7f19cf07acb5aa0caaaf"
+url = "https://github.com/crate-ci/typos/releases/download/v1.50.3/typos-v1.50.3-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/crate-ci/typos/releases/assets/589001623"
 
 [[tools.zizmor]]
-version = "1.26.1"
+version = "1.30.1"
 backend = "aqua:zizmorcore/zizmor"
+specifiers = ["latest"]
 
 [tools.zizmor."platforms.linux-arm64"]
-checksum = "sha256:711f5af366b299128f9a04b1470e37d990b41fbd21f14a1a4148d25004a83762"
-url = "https://github.com/zizmorcore/zizmor/releases/download/v1.26.1/zizmor-aarch64-unknown-linux-gnu.tar.gz"
-url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/453417983"
+checksum = "sha256:7ff1dce33bdd18fd2a4affe63bdd47efcccca97b2cec1c1863ec26e9e2647540"
+url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-aarch64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067643"
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.linux-arm64-musl"]
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.linux-x64"]
-checksum = "sha256:8556289a64e7aaf2400cd516f61a471aa91c5902cc56ad96a82fd12f90c2ef73"
-url = "https://github.com/zizmorcore/zizmor/releases/download/v1.26.1/zizmor-x86_64-unknown-linux-gnu.tar.gz"
-url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/453417985"
+checksum = "sha256:e65324f4430c2717591937edcec90ccbefaf14c174f8ec9415e03ca875b46e1a"
+url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-unknown-linux-gnu.tar.gz"
+url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067642"
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.linux-x64-musl"]
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.macos-arm64"]
-checksum = "sha256:68ab2b37836bbd44f6cfffcc102b9ffffbc20c5d67d84293dafb63bd2775a1da"
-url = "https://github.com/zizmorcore/zizmor/releases/download/v1.26.1/zizmor-aarch64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/453417984"
+checksum = "sha256:e28d22b087f9ebb8d99da6e740d348c930f559961c7c3f12badda54f882195a2"
+url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-aarch64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067640"
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.macos-x64"]
-checksum = "sha256:2967414a561f8c1264121e8f723c3b5abcf3d1bf7ce5063114df99985dd75801"
-url = "https://github.com/zizmorcore/zizmor/releases/download/v1.26.1/zizmor-x86_64-apple-darwin.tar.gz"
-url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/453417982"
+checksum = "sha256:10e6b18b11ea07e515a16f0f0518c7b07527bc9977c1fd5698181ce7f3554202"
+url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-apple-darwin.tar.gz"
+url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067641"
 provenance = "github-attestations"
 
 [tools.zizmor."platforms.windows-x64"]
-checksum = "sha256:c6cea156935e3b9d36faeca4fd8f622d23f7a7578da26adb34e6456abd9beb9a"
-url = "https://github.com/zizmorcore/zizmor/releases/download/v1.26.1/zizmor-x86_64-pc-windows-msvc.zip"
-url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/453417981"
+checksum = "sha256:b183b1e996eddfab9659f1e9b46e059f1ef1cf984a1f14e5da09f7876a4b3a1c"
+url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-pc-windows-msvc.zip"
+url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067645"
 provenance = "github-attestations"
diff --git a/mise.toml b/mise.toml
index 5b4b30beb5..ba3f3e3c07 100644
--- a/mise.toml
+++ b/mise.toml
@@ -1,37 +1,45 @@
 [tools]
-"go:github.com/grafana/oats" = "0.7.0"
-hugo = "0.164.0"
-java = "temurin-25.0.3+9.0.LTS"
-node = "24.18.0"
-protoc = "35.1"
+"aqua:grafana/gcx" = "latest"
+"aqua:grafana/oats" = "latest"
+hugo = "latest"
+java = "temurin-25"
+node = "lts"
+protoc = "latest"
 
 # Linters
-actionlint = "1.7.12"
-"aqua:grafana/flint" = "0.22.7"
-"aqua:jonwiggins/xmloxide" = "v0.4.3"
-"aqua:owenlamont/ryl" = "0.21.0"
-biome = "2.5.3"
-editorconfig-checker = "3.8.0"
-google-java-format = "1.35.0"
-lychee = "0.24.2"
-"npm:renovate" = "43.257.4"
-ruff = "0.15.21"
-rumdl = "v0.2.31"
-shellcheck = "v0.11.0"
-shfmt = "3.13.1"
-taplo = "0.10.0"
-typos = "1.48.0"
-zizmor = "1.26.1"
+actionlint = "latest"
+"aqua:grafana/flint" = "latest"
+"aqua:jonwiggins/xmloxide" = "latest"
+"aqua:owenlamont/ryl" = "latest"
+biome = "latest"
+checkstyle = "latest"
+editorconfig-checker = "latest"
+google-java-format = "latest"
+lychee = "latest"
+ruff = "latest"
+rumdl = "latest"
+shellcheck = "latest"
+shfmt = "latest"
+taplo = "latest"
+typos = "latest"
+zizmor = "latest"
+
+[tools."npm:renovate"]
+version = "latest"
+allow_builds = ["re2"]
+# @yarnpkg/libzip 3.2.2 is npm-signed and matches Yarn's release commit, but
+# was published without provenance; mise's no-downgrade policy otherwise rejects Renovate.
+trust_policy_excludes = ["@yarnpkg/libzip@3.2.2"]
 
 [env]
 FLINT_CONFIG_DIR = ".github/config"
 # renovate: datasource=github-releases depName=grafana/docker-otel-lgtm
-LGTM_VERSION = "0.29.0"
+LGTM_VERSION = "0.37.0"
 # Latest JMX Exporter release; used as the default ref for the compatibility job.
 # renovate: datasource=github-tags depName=prometheus/jmx_exporter versioning=semver-coerced
-DEFAULT_JMX_EXPORTER_VERSION = "v1.6.0"
+DEFAULT_JMX_EXPORTER_VERSION = "1.7.0"
 # renovate: datasource=github-tags depName=micrometer-metrics/micrometer versioning=semver-coerced
-DEFAULT_MICROMETER_VERSION = "v1.17.0"
+DEFAULT_MICROMETER_VERSION = "v1.17.1"
 
 [tasks.ci]
 description = "CI Build"
@@ -45,16 +53,16 @@ run = "./mvnw clean"
 
 [tasks.compile]
 description = "bare compile, ignoring formatting and linters"
-run = "./mvnw install -DskipTests -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn"
+run = "./mvnw install -DskipTests -Dcoverage.skip=true -Dwarnings=-nowarn"
 
 [tasks.generate]
 description = "regenerate protobuf sources"
-run = "./mvnw clean install -DskipTests -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn"
+run = "./mvnw clean install -DskipTests -Dcoverage.skip=true -Dwarnings=-nowarn"
 env.PROTO_GENERATION = "true"
 
 [tasks.test]
 description = "run unit tests, ignoring formatting and linters"
-run = "./mvnw test -Dcoverage.skip=true -Dcheckstyle.skip=true -Dwarnings=-nowarn"
+run = "./mvnw test -Dcoverage.skip=true -Dwarnings=-nowarn"
 
 [tasks.test-all]
 description = "run all tests"
@@ -64,6 +72,32 @@ run = "./mvnw verify"
 description = "build all modules without tests"
 run = "./mvnw install -DskipTests -Dcoverage.skip=true"
 
+[tasks.native-test]
+description = "Run GraalVM native tests"
+tools.java = "oracle-graalvm-25"
+# Native Test uses Surefire, so explicitly select the Failsafe-named test class.
+run = '''
+./mvnw -pl integration-tests/it-spring-boot-smoke-test -am install -DskipTests -Dcoverage.skip=true
+cd "$MISE_CONFIG_ROOT/integration-tests/it-spring-boot-smoke-test"
+"$MISE_CONFIG_ROOT/mvnw" test -PnativeTest -Dtest=ApplicationIT
+'''
+
+[tasks."jmx-exporter:compat-test"]
+description = "Run JMX Exporter compatibility tests under a supported JDK"
+# The pinned JMX Exporter release does not build on the primary JDK (Java 25):
+# its spotless google-java-format predates JDK 25 support. Build it under an LTS
+# JDK the release supports instead.
+tools.java = "temurin-21"
+run = "python3 .mise/tasks/jmx-exporter/test.py"
+
+[tasks."micrometer:compat-test"]
+description = "Run Micrometer compatibility tests under a supported JDK"
+# The pinned Micrometer release does not build on the primary JDK (Java 25):
+# its bundled Kotlin compiler predates JDK 25 support. Build it under an LTS JDK
+# the release supports instead.
+tools.java = "temurin-21"
+run = "python3 .mise/tasks/micrometer/test.py"
+
 [tasks."api-diff"]
 description = "Compare published API against the japicmp baseline and refresh docs/apidiffs"
 run = """
@@ -75,7 +109,6 @@ BASELINE_OVERRIDE="${API_DIFF_BASELINE_VERSION:+-Dapi.diff.baseline.version=${AP
   ${BASELINE_OVERRIDE} \
   -DskipTests \
   -Dcoverage.skip=true \
-  -Dcheckstyle.skip=true \
   -Dwarnings=-nowarn
 ./.github/scripts/sync-api-diffs.sh
 """
@@ -93,7 +126,7 @@ run = "flint run --fix"
 [tasks.acceptance-test]
 description = "Run OATs acceptance tests"
 depends = "build"
-run = "oats -lgtm-version $LGTM_VERSION -timeout 5m examples/"
+run = "oats --no-cache --lgtm-version $LGTM_VERSION --timeout 5m ."
 
 [tasks.javadoc]
 description = "Generate Javadoc"
diff --git a/oats-config.yaml b/oats-config.yaml
new file mode 100644
index 0000000000..d23490ffb5
--- /dev/null
+++ b/oats-config.yaml
@@ -0,0 +1,6 @@
+meta:
+  version: 3
+
+cases:
+  - examples/example-exporter-opentelemetry/oats-tests/http/oats-case.yaml
+  - examples/example-exporter-opentelemetry/oats-tests/agent/oats-case.yaml
diff --git a/pom.xml b/pom.xml
index 5752f4ce91..deecfc5caf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   
     io.prometheus
     client_java_parent
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
     prometheus-metrics-parent/pom.xml
   
 
@@ -20,19 +20,18 @@
   
     UTF-8
     --module-name-need-to-be-overridden--
-    4.35.1
-    33.6.0-jre
+    4.36.2
+    33.7.2-jre
     2.3.0
     4.3.0
     3.13.2
-    6.1.2
-    2.29.0-alpha
+    6.1.3
+    2.32.0-alpha
     8
     25
     
-    1.8.0
+    1.10.0
     0.70
-    false
     false
     false
     -Werror
@@ -89,7 +88,7 @@
     
       org.mockito
       mockito-core
-      5.23.0
+      5.24.0
       test
     
     
@@ -101,7 +100,7 @@
     
       org.slf4j
       slf4j-simple
-      2.0.18
+      2.0.20
       test
     
   
@@ -113,7 +112,7 @@
         
         
           maven-install-plugin
-          3.1.4
+          3.2.0
         
         
           maven-resources-plugin
@@ -121,19 +120,19 @@
         
         
           maven-compiler-plugin
-          3.15.0
+          3.16.0
         
         
           maven-surefire-plugin
-          3.5.6
+          3.6.0
         
         
           maven-jar-plugin
-          3.5.0
+          3.5.1
         
         
           maven-deploy-plugin
-          3.1.4
+          3.2.0
         
         
           maven-clean-plugin
@@ -150,7 +149,7 @@
         
         
           maven-failsafe-plugin
-          3.5.6
+          3.6.0
         
         
           maven-dependency-plugin
@@ -167,43 +166,21 @@
         
           org.codehaus.mojo
           build-helper-maven-plugin
-          3.6.1
+          3.6.2
         
         
           org.codehaus.mojo
           exec-maven-plugin
-          3.6.3
+          3.6.4
         
         
           com.github.siom79.japicmp
           japicmp-maven-plugin
-          0.26.1
+          0.26.5
         
       
     
     
-      
-        org.apache.maven.plugins
-        maven-checkstyle-plugin
-        3.6.0
-        
-          true
-          google_checks.xml
-          checkstyle.xml
-          warning
-          true
-          ${checkstyle.skip}
-          checkstyle-suppressions.xml
-          **/generated/**,**/jmh_generated/*
-        
-        
-          
-            
-              check
-            
-          
-        
-      
       
         org.jacoco
         jacoco-maven-plugin
@@ -281,7 +258,7 @@
       
         org.apache.felix
         maven-bundle-plugin
-        6.0.2
+        6.2.0
         true
         
           
@@ -314,7 +291,7 @@
       
         org.codehaus.mojo
         versions-maven-plugin
-        2.21.0
+        2.23.0
         
           file://${project.basedir}/version-rules.xml
         
@@ -505,7 +482,7 @@
                 
                   com.uber.nullaway
                   nullaway
-                  0.13.7
+                  0.14.2
                 
               
             
diff --git a/prometheus-metrics-annotations/pom.xml b/prometheus-metrics-annotations/pom.xml
index 3552a8ddb7..20733cb422 100644
--- a/prometheus-metrics-annotations/pom.xml
+++ b/prometheus-metrics-annotations/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-annotations
diff --git a/prometheus-metrics-bom/pom.xml b/prometheus-metrics-bom/pom.xml
index c2c9935f70..fd14948693 100644
--- a/prometheus-metrics-bom/pom.xml
+++ b/prometheus-metrics-bom/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java_parent
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
     ../prometheus-metrics-parent/pom.xml
   
 
diff --git a/prometheus-metrics-config/pom.xml b/prometheus-metrics-config/pom.xml
index 681f4a5578..0681b89f5e 100644
--- a/prometheus-metrics-config/pom.xml
+++ b/prometheus-metrics-config/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-config
diff --git a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/EscapingScheme.java b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/EscapingScheme.java
index 1d6bd37cf8..360d380400 100644
--- a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/EscapingScheme.java
+++ b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/EscapingScheme.java
@@ -45,6 +45,15 @@ public final String getValue() {
    * exists, that will be used. Otherwise, the global default will be returned.
    */
   public static EscapingScheme fromAcceptHeader(@Nullable String acceptHeader) {
+    return fromAcceptHeader(acceptHeader, DEFAULT);
+  }
+
+  /**
+   * Like {@link #fromAcceptHeader(String)}, but returns {@code fallback} instead of {@link
+   * #DEFAULT} if the header has no valid "escaping" term.
+   */
+  public static EscapingScheme fromAcceptHeader(
+      @Nullable String acceptHeader, EscapingScheme fallback) {
     if (acceptHeader != null) {
       for (String p : acceptHeader.split(";")) {
         String[] toks = p.split("=");
@@ -58,12 +67,12 @@ public static EscapingScheme fromAcceptHeader(@Nullable String acceptHeader) {
             return EscapingScheme.forString(value);
           } catch (IllegalArgumentException e) {
             // If the escaping parameter is unknown, ignore it.
-            return DEFAULT;
+            return fallback;
           }
         }
       }
     }
-    return DEFAULT;
+    return fallback;
   }
 
   static EscapingScheme forString(String value) {
diff --git a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/ExporterPushgatewayProperties.java b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/ExporterPushgatewayProperties.java
index 10e8c0f33f..e97ade191f 100644
--- a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/ExporterPushgatewayProperties.java
+++ b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/ExporterPushgatewayProperties.java
@@ -94,9 +94,8 @@ static ExporterPushgatewayProperties load(PropertySource propertySource)
     if (scheme != null) {
       if (!scheme.equals("http") && !scheme.equals("https")) {
         throw new PrometheusPropertiesException(
-            String.format(
-                "%s.%s: Illegal value. Expecting 'http' or 'https'. Found: %s",
-                PREFIX, SCHEME, scheme));
+            Util.invalidValueMessage(
+                PREFIX + "." + SCHEME, "Illegal value. Expecting 'http' or 'https'."));
       }
     }
 
@@ -119,10 +118,9 @@ static ExporterPushgatewayProperties load(PropertySource propertySource)
         return EscapingScheme.DOTS_ESCAPING;
       default:
         throw new PrometheusPropertiesException(
-            String.format(
-                "%s.%s: Illegal value. Expecting 'allow-utf-8', 'values', 'underscores', "
-                    + "or 'dots'. Found: %s",
-                PREFIX, ESCAPING_SCHEME, scheme));
+            Util.invalidValueMessage(
+                PREFIX + "." + ESCAPING_SCHEME,
+                "Illegal value. Expecting 'allow-utf-8', 'values', 'underscores', or 'dots'."));
     }
   }
 
diff --git a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/OpenMetrics2Properties.java b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/OpenMetrics2Properties.java
index 1f5080f055..3a8289c945 100644
--- a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/OpenMetrics2Properties.java
+++ b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/OpenMetrics2Properties.java
@@ -16,24 +16,28 @@ public class OpenMetrics2Properties {
   private static final String COMPOSITE_VALUES = "composite_values";
   private static final String EXEMPLAR_COMPLIANCE = "exemplar_compliance";
   private static final String NATIVE_HISTOGRAMS = "native_histograms";
+  private static final String SUFFIXES = "suffixes";
 
   @Nullable private final Boolean enabled;
   @Nullable private final Boolean contentNegotiation;
   @Nullable private final Boolean compositeValues;
   @Nullable private final Boolean exemplarCompliance;
   @Nullable private final Boolean nativeHistograms;
+  @Nullable private final Boolean suffixes;
 
   private OpenMetrics2Properties(
       @Nullable Boolean enabled,
       @Nullable Boolean contentNegotiation,
       @Nullable Boolean compositeValues,
       @Nullable Boolean exemplarCompliance,
-      @Nullable Boolean nativeHistograms) {
+      @Nullable Boolean nativeHistograms,
+      @Nullable Boolean suffixes) {
     this.enabled = enabled;
     this.contentNegotiation = contentNegotiation;
     this.compositeValues = compositeValues;
     this.exemplarCompliance = exemplarCompliance;
     this.nativeHistograms = nativeHistograms;
+    this.suffixes = suffixes;
   }
 
   /**
@@ -64,6 +68,11 @@ public boolean getNativeHistograms() {
     return nativeHistograms != null && nativeHistograms;
   }
 
+  /** Append unit and type suffixes to metric names. Default is {@code false}. */
+  public boolean getSuffixes() {
+    return suffixes != null && suffixes;
+  }
+
   /**
    * Note that this will remove entries from {@code propertySource}. This is because we want to know
    * if there are unused properties remaining after all properties have been loaded.
@@ -75,8 +84,14 @@ static OpenMetrics2Properties load(PropertySource propertySource)
     Boolean compositeValues = Util.loadBoolean(PREFIX, COMPOSITE_VALUES, propertySource);
     Boolean exemplarCompliance = Util.loadBoolean(PREFIX, EXEMPLAR_COMPLIANCE, propertySource);
     Boolean nativeHistograms = Util.loadBoolean(PREFIX, NATIVE_HISTOGRAMS, propertySource);
+    Boolean suffixes = Util.loadBoolean(PREFIX, SUFFIXES, propertySource);
     return new OpenMetrics2Properties(
-        enabled, contentNegotiation, compositeValues, exemplarCompliance, nativeHistograms);
+        enabled,
+        contentNegotiation,
+        compositeValues,
+        exemplarCompliance,
+        nativeHistograms,
+        suffixes);
   }
 
   public static Builder builder() {
@@ -90,6 +105,7 @@ public static class Builder {
     @Nullable private Boolean compositeValues;
     @Nullable private Boolean exemplarCompliance;
     @Nullable private Boolean nativeHistograms;
+    @Nullable private Boolean suffixes;
 
     private Builder() {}
 
@@ -123,6 +139,12 @@ public Builder nativeHistograms(boolean nativeHistograms) {
       return this;
     }
 
+    /** See {@link #getSuffixes()} */
+    public Builder suffixes(boolean suffixes) {
+      this.suffixes = suffixes;
+      return this;
+    }
+
     /** Enable all OpenMetrics 2.0 features */
     public Builder enableAll() {
       this.enabled = true;
@@ -135,7 +157,12 @@ public Builder enableAll() {
 
     public OpenMetrics2Properties build() {
       return new OpenMetrics2Properties(
-          enabled, contentNegotiation, compositeValues, exemplarCompliance, nativeHistograms);
+          enabled,
+          contentNegotiation,
+          compositeValues,
+          exemplarCompliance,
+          nativeHistograms,
+          suffixes);
     }
   }
 }
diff --git a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/PrometheusPropertiesLoader.java b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/PrometheusPropertiesLoader.java
index 6d52b71efa..04bbfe4a53 100644
--- a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/PrometheusPropertiesLoader.java
+++ b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/PrometheusPropertiesLoader.java
@@ -169,8 +169,7 @@ private static Properties loadPropertiesFromFile() throws PrometheusPropertiesEx
       try (InputStream stream = Files.newInputStream(Paths.get(path))) {
         properties.load(stream);
       } catch (IOException e) {
-        throw new PrometheusPropertiesException(
-            "Failed to read Prometheus properties from " + path + ": " + e.getMessage(), e);
+        throw new PrometheusPropertiesException("Failed to read Prometheus properties file.", e);
       }
     }
     return properties;
diff --git a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/Util.java b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/Util.java
index 20bd756999..d90810fafb 100644
--- a/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/Util.java
+++ b/prometheus-metrics-config/src/main/java/io/prometheus/metrics/config/Util.java
@@ -24,7 +24,7 @@ static Boolean loadBoolean(String prefix, String propertyName, PropertySource pr
       String fullKey = prefix.isEmpty() ? propertyName : prefix + "." + propertyName;
       if (!"true".equalsIgnoreCase(property) && !"false".equalsIgnoreCase(property)) {
         throw new PrometheusPropertiesException(
-            String.format("%s: Expecting 'true' or 'false'. Found: %s", fullKey, property));
+            invalidValueMessage(fullKey, "Expecting 'true' or 'false'."));
       }
       return Boolean.parseBoolean(property);
     }
@@ -88,7 +88,7 @@ static List loadDoubleList(
           }
         } catch (NumberFormatException e) {
           throw new PrometheusPropertiesException(
-              fullKey + "=" + property + ": Expecting comma separated list of double values");
+              invalidValueMessage(fullKey, "Expecting comma separated list of double values"));
         }
       }
       return Arrays.asList(result);
@@ -130,7 +130,7 @@ static Integer loadInteger(String prefix, String propertyName, PropertySource pr
         return Integer.parseInt(property);
       } catch (NumberFormatException e) {
         throw new PrometheusPropertiesException(
-            fullKey + "=" + property + ": Expecting integer value");
+            invalidValueMessage(fullKey, "Expecting integer value"));
       }
     }
     return null;
@@ -146,7 +146,7 @@ static Double loadDouble(String prefix, String propertyName, PropertySource prop
         return Double.parseDouble(property);
       } catch (NumberFormatException e) {
         throw new PrometheusPropertiesException(
-            fullKey + "=" + property + ": Expecting double value");
+            invalidValueMessage(fullKey, "Expecting double value"));
       }
     }
     return null;
@@ -162,7 +162,7 @@ static Long loadLong(String prefix, String propertyName, PropertySource property
         return Long.parseLong(property);
       } catch (NumberFormatException e) {
         throw new PrometheusPropertiesException(
-            fullKey + "=" + property + ": Expecting long value");
+            invalidValueMessage(fullKey, "Expecting long value"));
       }
     }
     return null;
@@ -197,4 +197,8 @@ static  void assertValue(
       throw new PrometheusPropertiesException(fullMessage);
     }
   }
+
+  static String invalidValueMessage(String fullKey, String message) {
+    return fullKey + ": " + message;
+  }
 }
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/EscapingSchemeTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/EscapingSchemeTest.java
index 329644bf57..00b1a665f7 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/EscapingSchemeTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/EscapingSchemeTest.java
@@ -32,4 +32,20 @@ void fromAcceptHeader() {
     assertThat(EscapingScheme.fromAcceptHeader("application/json"))
         .isEqualTo(EscapingScheme.DEFAULT);
   }
+
+  @Test
+  void fromAcceptHeaderWithFallback() {
+    assertThat(EscapingScheme.fromAcceptHeader("application/json", EscapingScheme.ALLOW_UTF8))
+        .isEqualTo(EscapingScheme.ALLOW_UTF8);
+    assertThat(EscapingScheme.fromAcceptHeader(null, EscapingScheme.ALLOW_UTF8))
+        .isEqualTo(EscapingScheme.ALLOW_UTF8);
+    assertThat(
+            EscapingScheme.fromAcceptHeader(
+                "application/json; escaping=unknown", EscapingScheme.ALLOW_UTF8))
+        .isEqualTo(EscapingScheme.ALLOW_UTF8);
+    assertThat(
+            EscapingScheme.fromAcceptHeader(
+                "application/json; escaping=underscores", EscapingScheme.ALLOW_UTF8))
+        .isEqualTo(EscapingScheme.UNDERSCORE_ESCAPING);
+  }
 }
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPropertiesTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPropertiesTest.java
index 514c5ff521..2f912ff777 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPropertiesTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPropertiesTest.java
@@ -27,8 +27,7 @@ void load() {
                     new HashMap<>(
                         Map.of("io.prometheus.exporter.include_created_timestamps", "invalid"))))
         .withMessage(
-            "io.prometheus.exporter.include_created_timestamps: Expecting 'true' or 'false'. Found:"
-                + " invalid");
+            "io.prometheus.exporter.include_created_timestamps: Expecting 'true' or 'false'.");
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () ->
@@ -36,8 +35,7 @@ void load() {
                     new HashMap<>(
                         Map.of("io.prometheus.exporter.exemplars_on_all_metric_types", "invalid"))))
         .withMessage(
-            "io.prometheus.exporter.exemplars_on_all_metric_types: Expecting 'true' or 'false'."
-                + " Found: invalid");
+            "io.prometheus.exporter.exemplars_on_all_metric_types: Expecting 'true' or 'false'.");
   }
 
   private static ExporterProperties load(Map map) {
@@ -84,7 +82,6 @@ void prometheusTimestampsInMs() {
                     new HashMap<>(
                         Map.of("io.prometheus.exporter.prometheus_timestamps_in_ms", "invalid"))))
         .withMessage(
-            "io.prometheus.exporter.prometheus_timestamps_in_ms: Expecting 'true' or 'false'."
-                + " Found: invalid");
+            "io.prometheus.exporter.prometheus_timestamps_in_ms: Expecting 'true' or 'false'.");
   }
 }
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPushgatewayPropertiesTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPushgatewayPropertiesTest.java
index c92e6f2f9e..4715662f3d 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPushgatewayPropertiesTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/ExporterPushgatewayPropertiesTest.java
@@ -27,7 +27,7 @@ void load() {
         .isThrownBy(() -> load(Map.of("io.prometheus.exporter.pushgateway.scheme", "foo")))
         .withMessage(
             "io.prometheus.exporter.pushgateway.scheme: Illegal value. Expecting 'http' or 'https'."
-                + " Found: foo");
+                + "");
   }
 
   @Test
@@ -60,7 +60,7 @@ void loadWithInvalidEscapingScheme() {
             () -> load(Map.of("io.prometheus.exporter.pushgateway.escaping_scheme", "invalid")))
         .withMessage(
             "io.prometheus.exporter.pushgateway.escaping_scheme: Illegal value. Expecting"
-                + " 'allow-utf-8', 'values', 'underscores', or 'dots'. Found: invalid");
+                + " 'allow-utf-8', 'values', 'underscores', or 'dots'.");
   }
 
   @Test
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/OpenMetrics2PropertiesTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/OpenMetrics2PropertiesTest.java
index e7a2734643..372e80856d 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/OpenMetrics2PropertiesTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/OpenMetrics2PropertiesTest.java
@@ -24,12 +24,15 @@ void load() {
                     "io.prometheus.openmetrics2.exemplar_compliance",
                     "true",
                     "io.prometheus.openmetrics2.native_histograms",
-                    "true")));
+                    "true",
+                    "io.prometheus.openmetrics2.suffixes",
+                    "false")));
     assertThat(properties.getEnabled()).isTrue();
     assertThat(properties.getContentNegotiation()).isTrue();
     assertThat(properties.getCompositeValues()).isTrue();
     assertThat(properties.getExemplarCompliance()).isTrue();
     assertThat(properties.getNativeHistograms()).isTrue();
+    assertThat(properties.getSuffixes()).isFalse();
   }
 
   @Test
@@ -37,8 +40,7 @@ void loadInvalidValue() {
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () -> load(new HashMap<>(Map.of("io.prometheus.openmetrics2.enabled", "invalid"))))
-        .withMessage(
-            "io.prometheus.openmetrics2.enabled: Expecting 'true' or 'false'. Found: invalid");
+        .withMessage("io.prometheus.openmetrics2.enabled: Expecting 'true' or 'false'.");
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () ->
@@ -46,17 +48,14 @@ void loadInvalidValue() {
                     new HashMap<>(
                         Map.of("io.prometheus.openmetrics2.content_negotiation", "invalid"))))
         .withMessage(
-            "io.prometheus.openmetrics2.content_negotiation: Expecting 'true' or 'false'. Found:"
-                + " invalid");
+            "io.prometheus.openmetrics2.content_negotiation: Expecting 'true' or 'false'.");
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () ->
                 load(
                     new HashMap<>(
                         Map.of("io.prometheus.openmetrics2.composite_values", "invalid"))))
-        .withMessage(
-            "io.prometheus.openmetrics2.composite_values: Expecting 'true' or 'false'. Found:"
-                + " invalid");
+        .withMessage("io.prometheus.openmetrics2.composite_values: Expecting 'true' or 'false'.");
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () ->
@@ -64,17 +63,18 @@ void loadInvalidValue() {
                     new HashMap<>(
                         Map.of("io.prometheus.openmetrics2.exemplar_compliance", "invalid"))))
         .withMessage(
-            "io.prometheus.openmetrics2.exemplar_compliance: Expecting 'true' or 'false'. Found:"
-                + " invalid");
+            "io.prometheus.openmetrics2.exemplar_compliance: Expecting 'true' or 'false'.");
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(
             () ->
                 load(
                     new HashMap<>(
                         Map.of("io.prometheus.openmetrics2.native_histograms", "invalid"))))
-        .withMessage(
-            "io.prometheus.openmetrics2.native_histograms: Expecting 'true' or 'false'. Found:"
-                + " invalid");
+        .withMessage("io.prometheus.openmetrics2.native_histograms: Expecting 'true' or 'false'.");
+    assertThatExceptionOfType(PrometheusPropertiesException.class)
+        .isThrownBy(
+            () -> load(new HashMap<>(Map.of("io.prometheus.openmetrics2.suffixes", "invalid"))))
+        .withMessage("io.prometheus.openmetrics2.suffixes: Expecting 'true' or 'false'.");
   }
 
   private static OpenMetrics2Properties load(Map map) {
@@ -92,12 +92,14 @@ void builder() {
             .compositeValues(false)
             .exemplarCompliance(true)
             .nativeHistograms(false)
+            .suffixes(false)
             .build();
     assertThat(properties.getEnabled()).isTrue();
     assertThat(properties.getContentNegotiation()).isTrue();
     assertThat(properties.getCompositeValues()).isFalse();
     assertThat(properties.getExemplarCompliance()).isTrue();
     assertThat(properties.getNativeHistograms()).isFalse();
+    assertThat(properties.getSuffixes()).isFalse();
   }
 
   @Test
@@ -108,6 +110,7 @@ void builderEnableAll() {
     assertThat(properties.getCompositeValues()).isTrue();
     assertThat(properties.getExemplarCompliance()).isTrue();
     assertThat(properties.getNativeHistograms()).isTrue();
+    assertThat(properties.getSuffixes()).isFalse();
   }
 
   @Test
@@ -118,6 +121,7 @@ void defaultValues() {
     assertThat(properties.getCompositeValues()).isFalse();
     assertThat(properties.getExemplarCompliance()).isFalse();
     assertThat(properties.getNativeHistograms()).isFalse();
+    assertThat(properties.getSuffixes()).isFalse();
   }
 
   @Test
@@ -128,5 +132,6 @@ void partialConfiguration() {
     assertThat(properties.getCompositeValues()).isTrue();
     assertThat(properties.getExemplarCompliance()).isFalse();
     assertThat(properties.getNativeHistograms()).isFalse();
+    assertThat(properties.getSuffixes()).isFalse();
   }
 }
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesLoaderTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesLoaderTest.java
index 532b00295b..8f910ccebd 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesLoaderTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesLoaderTest.java
@@ -31,9 +31,8 @@ void propertiesShouldBeLoadedFromPropertiesFile() {
   void cantLoadPropertiesFile() {
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(() -> PrometheusPropertiesLoader.load(new Properties()))
-        .withMessage(
-            "Failed to read Prometheus properties from nonexistent.properties:"
-                + " nonexistent.properties");
+        .withMessage("Failed to read Prometheus properties file.")
+        .withMessageNotContaining("nonexistent.properties");
   }
 
   @Test
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesTest.java
index 2c6e11daff..ae5dedbd19 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/PrometheusPropertiesTest.java
@@ -181,10 +181,12 @@ void testOpenMetrics2PropertiesLoading() {
     properties.put("io.prometheus.openmetrics2.composite_values", "false");
     properties.put("io.prometheus.openmetrics2.exemplar_compliance", "true");
     properties.put("io.prometheus.openmetrics2.native_histograms", "false");
+    properties.put("io.prometheus.openmetrics2.suffixes", "false");
     PrometheusProperties config = PrometheusPropertiesLoader.load(properties);
     assertThat(config.getOpenMetrics2Properties().getContentNegotiation()).isTrue();
     assertThat(config.getOpenMetrics2Properties().getCompositeValues()).isFalse();
     assertThat(config.getOpenMetrics2Properties().getExemplarCompliance()).isTrue();
     assertThat(config.getOpenMetrics2Properties().getNativeHistograms()).isFalse();
+    assertThat(config.getOpenMetrics2Properties().getSuffixes()).isFalse();
   }
 }
diff --git a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/UtilTest.java b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/UtilTest.java
index e4d7fa829e..c3ed65ec7b 100644
--- a/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/UtilTest.java
+++ b/prometheus-metrics-config/src/test/java/io/prometheus/metrics/config/UtilTest.java
@@ -51,6 +51,18 @@ void loadOptionalDuration_invalidNumber_throws() {
 
     assertThatExceptionOfType(PrometheusPropertiesException.class)
         .isThrownBy(() -> Util.loadOptionalDuration("", "foo", propertySource))
-        .withMessage("foo=abc: Expecting long value");
+        .withMessage("foo: Expecting long value");
+  }
+
+  @Test
+  void invalidValueMessageRedactsRawValue() {
+    String secret = "bad\n\"secret-value";
+    Map regularProperties = new HashMap<>(Map.of("foo", secret));
+    PropertySource propertySource = new PropertySource(regularProperties);
+
+    assertThatExceptionOfType(PrometheusPropertiesException.class)
+        .isThrownBy(() -> Util.loadBoolean("", "foo", propertySource))
+        .withMessage("foo: Expecting 'true' or 'false'.")
+        .withMessageNotContaining(secret);
   }
 }
diff --git a/prometheus-metrics-core/pom.xml b/prometheus-metrics-core/pom.xml
index 236a3d34a8..4cfdfcce49 100644
--- a/prometheus-metrics-core/pom.xml
+++ b/prometheus-metrics-core/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-core
@@ -69,4 +69,31 @@
       test
     
   
+
+  
+    
+      
+        org.apache.felix
+        maven-bundle-plugin
+        
+          
+            ${automatic.module.name}
+            
+            
+              io.prometheus.metrics.tracer.initializer;resolution:=optional,*
+            
+          
+        
+        
+          
+            
+            
+              manifest
+            
+          
+        
+      
+    
+  
 
diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Buffer.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Buffer.java
index 1c47f867c3..9283e60fc1 100644
--- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Buffer.java
+++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Buffer.java
@@ -1,142 +1,269 @@
 package io.prometheus.metrics.core.metrics;
 
+import static java.util.Objects.requireNonNull;
+
 import io.prometheus.metrics.model.snapshots.DataPointSnapshot;
 import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
+import javax.annotation.Nullable;
 
 /**
- * Metrics support concurrent write and scrape operations.
+ * Coordinates concurrent metric observations with collection.
+ *
+ * 

Collection activates a generation. Observations that start after activation are appended to + * that generation while the collector waits for observations from the previous phase to finish. The + * collector then creates a snapshot, deactivates the generation, and replays its buffered + * observations into the live metric state. * - *

This is implemented by switching to a Buffer when the scrape starts, and applying the values - * from the buffer after the scrape ends. + *

The default collection wait is five seconds. A generation is capped at one million buffered + * observations (about eight MiB of double storage) to keep a stalled collection from growing + * without bound; the cap applies backpressure rather than dropping observations. */ class Buffer { + private static final long BUFFER_ACTIVE_BIT = 1L << 63; + private static final double[] EMPTY_BUFFER = new double[0]; + + // Keep collection bounded without failing healthy scrapes during short periods of scheduler or + // CI-host contention. The one-million-observation cap uses at most 8 MiB for one generation; + // it is deliberately an internal safeguard rather than a data-loss policy. + private static final long DEFAULT_MAX_SPIN_WAIT_NANOS = TimeUnit.SECONDS.toNanos(5); + private static final int DEFAULT_MAX_BUFFER_SIZE = 1_000_000; + private static final int INITIAL_BUFFER_SIZE = 128; + + /** Observations buffered during one collection cycle. */ + private static final class Generation { + private double[] values = EMPTY_BUFFER; + private int size; + private boolean active = true; + } - private static final long bufferActiveBit = 1L << 63; // Tracking observation counts requires an AtomicLong for coordination between recording and // collecting. AtomicLong does much worse under contention than the LongAdder instances used - // elsewhere to hold aggregated state. To improve, we stripe the AtomicLong into N instances, - // where N is the number of available processors. Each record operation chooses the appropriate - // instance to use based on the modulo of its thread id and N. This is a more naive / simple - // implementation compared to the striping used under the hood in java.util.concurrent classes - // like LongAdder - contention and hot spots can still occur if recording thread ids happen to - // resolve to the same index. Further improvement is possible. + // elsewhere to hold aggregated state. To reduce contention, the count is striped across the + // available processors. This is simpler than the striping used by LongAdder, so hot spots remain + // possible when several recording threads resolve to the same stripe. private final AtomicLong[] stripedObservationCounts; - private double[] observationBuffer = new double[0]; - private int bufferPos = 0; - private boolean reset = false; - + // Protected by appendLock. These are absolute per-stripe observation counts at activation, not + // the reset-adjusted count used by complete. Reused across generations to avoid scrape + // allocations. + private final long[] generationStartCounts; + private final ReentrantLock observationLock = new ReentrantLock(); + private boolean reset; + private long observationCountOffset; + @Nullable private volatile Generation activeGeneration; ReentrantLock appendLock = new ReentrantLock(); ReentrantLock runLock = new ReentrantLock(); - Condition bufferFilled = appendLock.newCondition(); + private final Condition bufferSpaceAvailable = appendLock.newCondition(); + private final long maxSpinWaitNanos; + private final int maxBufferSize; + // These hooks are test seams only; production buffers use no-op callbacks. + private final Runnable beforeGenerationRead; + private final Runnable afterGenerationRead; Buffer() { + this(DEFAULT_MAX_SPIN_WAIT_NANOS, DEFAULT_MAX_BUFFER_SIZE, () -> {}, () -> {}); + } + + Buffer(long maxSpinWaitNanos) { + this(maxSpinWaitNanos, DEFAULT_MAX_BUFFER_SIZE, () -> {}, () -> {}); + } + + Buffer(long maxSpinWaitNanos, int maxBufferSize, Runnable beforeGenerationRead) { + this(maxSpinWaitNanos, maxBufferSize, beforeGenerationRead, () -> {}); + } + + Buffer( + long maxSpinWaitNanos, + int maxBufferSize, + Runnable beforeGenerationRead, + Runnable afterGenerationRead) { + if (maxBufferSize <= 0) { + throw new IllegalArgumentException("maxBufferSize must be positive"); + } + this.maxSpinWaitNanos = maxSpinWaitNanos; + this.maxBufferSize = maxBufferSize; + this.beforeGenerationRead = beforeGenerationRead; + this.afterGenerationRead = afterGenerationRead; stripedObservationCounts = new AtomicLong[Runtime.getRuntime().availableProcessors()]; + generationStartCounts = new long[stripedObservationCounts.length]; for (int i = 0; i < stripedObservationCounts.length; i++) { - stripedObservationCounts[i] = new AtomicLong(0); + stripedObservationCounts[i] = new AtomicLong(); } } boolean append(double value) { - int index = Math.abs((int) Thread.currentThread().getId()) % stripedObservationCounts.length; - AtomicLong observationCountForThread = stripedObservationCounts[index]; - long count = observationCountForThread.incrementAndGet(); - if ((count & bufferActiveBit) == 0) { - return false; // sign bit not set -> buffer not active. - } else { - doAppend(value); - return true; + // Keep the uncontended hot path small enough for the JIT to inline into observations. + int stripe = stripeIndex(Thread.currentThread().getId(), stripedObservationCounts.length); + AtomicLong counter = stripedObservationCounts[stripe]; + long count = counter.incrementAndGet(); + // The active bit is the exact handoff decision. An observation either increments its stripe + // before the collector's getAndAdd(BUFFER_ACTIVE_BIT) and takes the direct path, or sees the + // active bit and may be buffered. The stripe ticket below also checks that it was not counted + // by a later collection that started before this thread read activeGeneration. + if ((count & BUFFER_ACTIVE_BIT) == 0) { + return false; } + return appendToActiveGeneration(value, stripe, count); } - private void doAppend(double amount) { + private boolean appendToActiveGeneration(double value, int stripe, long count) { + // Allow tests to pause between allocating an observation ticket and reading the generation. + beforeGenerationRead.run(); + Generation generation = activeGeneration; + afterGenerationRead.run(); + if (generation == null) { + return false; + } appendLock.lock(); try { - if (bufferPos >= observationBuffer.length) { - observationBuffer = Arrays.copyOf(observationBuffer, observationBuffer.length + 128); + Generation current = activeGeneration; + if (current != generation || !generation.active) { + return false; } - observationBuffer[bufferPos] = amount; - bufferPos++; - - bufferFilled.signalAll(); + if ((count & ~BUFFER_ACTIVE_BIT) <= generationStartCounts[stripe]) { + // This observation incremented its stripe in an earlier generation. The current collector + // already includes it in expectedCount, so buffering it here would make the collector wait + // for an observation that is only replayed after that same wait finishes. + return false; + } + while (generation.size >= maxBufferSize && generation.active) { + try { + bufferSpaceAvailable.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } + } + if (!generation.active) { + return false; + } + if (generation.size >= generation.values.length) { + int doubled = + generation.values.length > maxBufferSize / 2 + ? maxBufferSize + : generation.values.length * 2; + generation.values = + Arrays.copyOf( + generation.values, Math.min(maxBufferSize, Math.max(INITIAL_BUFFER_SIZE, doubled))); + } + generation.values[generation.size++] = value; + return true; } finally { appendLock.unlock(); } } - /** Must be called by the runnable in the run() method. */ + static int stripeIndex(long threadId, int stripeCount) { + return (int) Math.floorMod(threadId, stripeCount); + } + void reset() { reset = true; } + T observeDirect(Supplier observeFunction) { + // In steady state this is the lock-free path used before this buffer was introduced. Keep the + // lock only while a generation is active, so direct observations cannot race collection/replay. + if (activeGeneration == null) { + return observeFunction.get(); + } + observationLock.lock(); + try { + return observeFunction.get(); + } finally { + observationLock.unlock(); + } + } + @SuppressWarnings("ThreadPriorityCheck") T run( Function complete, Supplier createResult, Consumer observeFunction) { + return requireNonNull(run(complete, createResult, observeFunction, true)); + } + + @SuppressWarnings("ThreadPriorityCheck") + @Nullable + T run( + Function complete, + Supplier createResult, + Consumer observeFunction, + boolean failOnTimeout) { + Generation generation = new Generation(); double[] buffer; int bufferSize; - T result; - + boolean timedOut = false; + T result = null; runLock.lock(); try { - // Signal that the buffer is active. - long expectedCount = 0L; - for (AtomicLong observationCount : stripedObservationCounts) { - expectedCount += observationCount.getAndAdd(bufferActiveBit); + long expectedCount; + appendLock.lock(); + try { + activeGeneration = generation; + long total = 0; + for (int i = 0; i < stripedObservationCounts.length; i++) { + long count = stripedObservationCounts[i].getAndAdd(BUFFER_ACTIVE_BIT); + generationStartCounts[i] = count & ~BUFFER_ACTIVE_BIT; + total += count; + } + expectedCount = total - observationCountOffset; + } finally { + appendLock.unlock(); } - + long deadline = System.nanoTime() + maxSpinWaitNanos; while (!complete.apply(expectedCount)) { - // Wait until all in-flight threads have added their observations to the histogram / - // summary. - // we can't use a condition here, because the other thread doesn't have a lock as it's on - // the fast path. - Thread.yield(); - } - result = createResult.get(); - - // Signal that the buffer is inactive. - long expectedBufferSize = 0; - if (reset) { - for (AtomicLong observationCount : stripedObservationCounts) { - expectedBufferSize += observationCount.getAndSet(0) & ~bufferActiveBit; - } - reset = false; - } else { - for (AtomicLong observationCount : stripedObservationCounts) { - expectedBufferSize += observationCount.addAndGet(bufferActiveBit); + if (System.nanoTime() - deadline >= 0) { + timedOut = true; + break; } + Thread.yield(); } - expectedBufferSize -= expectedCount; - - appendLock.lock(); + observationLock.lock(); try { - while (bufferPos < expectedBufferSize) { - // Wait until all in-flight threads have added their observations to the buffer. - bufferFilled.await(); - } + result = timedOut ? null : createResult.get(); } finally { - appendLock.unlock(); + try { + appendLock.lock(); + try { + generation.active = false; + for (AtomicLong counter : stripedObservationCounts) { + counter.addAndGet(BUFFER_ACTIVE_BIT); + } + if (reset) { + observationCountOffset += expectedCount; + reset = false; + } + buffer = generation.values; + bufferSize = generation.size; + generation.values = EMPTY_BUFFER; + generation.size = 0; + bufferSpaceAvailable.signalAll(); + } finally { + appendLock.unlock(); + } + for (int i = 0; i < bufferSize; i++) { + observeFunction.accept(buffer[i]); + } + // Keep the inactive generation visible until replay completes. An appender that loses the + // generation race must take observationLock before observing directly. + activeGeneration = null; + } finally { + observationLock.unlock(); + } } - - buffer = observationBuffer; - bufferSize = bufferPos; - observationBuffer = new double[0]; - bufferPos = 0; - } catch (InterruptedException e) { - throw new RuntimeException(e); + if (timedOut && failOnTimeout) { + throw new IllegalStateException("Timed out while waiting for in-flight observations."); + } + return result; } finally { runLock.unlock(); } - - for (int i = 0; i < bufferSize; i++) { - observeFunction.accept(buffer[i]); - } - return result; } } diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CKMSQuantiles.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CKMSQuantiles.java index 83c8cfdc31..6f923babfa 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CKMSQuantiles.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CKMSQuantiles.java @@ -126,7 +126,12 @@ private void insertBefore(ListIterator iterator, double value, int r) { samples.addFirst(new Sample(value, 0)); } else { iterator.previous(); - iterator.add(new Sample(value, f(r) - 1)); + // delta is bounded by maxWidthNotCrossingTargets(r) in addition to the paper's f(r) - 1: + // for a targeted quantile with 2*epsilon >= 1-quantile, f(r) below the target is of order + // n-r, and a freshly inserted sample with such a delta has a possible-rank interval + // centered near rank n regardless of its position — indistinguishable in get() from a + // genuine sample near a target. See maxWidthNotCrossingTargets. + iterator.add(new Sample(value, effectiveMaxWidth(r) - 1)); iterator.next(); } } @@ -147,25 +152,40 @@ public double get(double q) { return samples.getLast().value; } + // Return the value of the sample that minimizes the worst-case rank error. The true rank + // of samples.get(i) is somewhere in [r(i), r(i) + delta(i)] with + // r(i) = g(0) + ... + g(i), so if that sample is picked the rank error can be as large as + // max(|r(i) - desiredRank|, |r(i) + delta(i) - desiredRank|), which equals the distance + // of the interval's center from the desired rank plus half the interval's width. Wide + // samples are penalized by their width: a narrow sample slightly off-center beats a wide + // sample whose center happens to fall near the desired rank. + // + // Note that the previous implementation ("stop at the first sample with + // r + g + delta > desiredRank + f(desiredRank)/2 and return the value of the sample + // before it") is only correct if g + delta is small for all samples up to the target + // rank. With targeted quantiles the error function f() allows g + delta to be large at + // ranks far below a target quantile (for a target (q, epsilon) and rank r < q*n it + // allows 2*epsilon*(n-r)/(1-q)), and freshly inserted samples used to get + // delta = f(r) - 1 (and flush() above guarantees freshly inserted samples are present). + // Such a sample tripped the old stop condition long before the target rank, so get() + // returned a value from a far lower quantile than requested. For example, with + // quantiles {(0.9, 0.05), (0.99, 0.005)} get(0.99) returned the minimum observation. + // Sample widths are additionally bounded by maxWidthNotCrossingTargets at insert and + // merge time, so near a target quantile the possible-rank intervals are tight. int r = 0; // sum of g's left of the current sample int desiredRank = (int) Math.ceil(q * n); - int upperBound = desiredRank + f(desiredRank) / 2; - - ListIterator iterator = samples.listIterator(); - while (iterator.hasNext()) { - Sample sample = iterator.next(); - if (r + sample.g + sample.delta > upperBound) { - iterator.previous(); // roll back the item.next() above - if (iterator.hasPrevious()) { - Sample result = iterator.previous(); - return result.value; - } else { - return sample.value; - } + double bestDistance = Double.MAX_VALUE; + Sample bestSample = samples.getFirst(); + for (Sample sample : samples) { + double rankEstimate = r + sample.g + sample.delta / 2.0; + double distance = Math.abs(rankEstimate - desiredRank) + sample.delta / 2.0; + if (distance < bestDistance) { + bestDistance = distance; + bestSample = sample; } r += sample.g; } - return samples.getLast().value; + return bestSample.value; } /** Error function, as in definition 5 of the paper. */ @@ -192,6 +212,67 @@ int f(int r) { return Math.max(minResult, 1); } + /** + * Maximum width (g + delta) of a sample whose predecessor has rank r such that the sample keeps + * enough resolution around the accuracy window [quantile*n - epsilon*n, quantile*n + epsilon*n] + * of every target quantile: below a window a sample may extend at most max(windowStart - r, + * 2*epsilon*n) — it can intrude into the window but never reach the window's end — and any sample + * overlapping a window has width at most the window's size 2*epsilon*n. So no single sample can + * span a whole window, and resolution around each target stays at the window scale: the center of + * a sample's possible-rank interval is within epsilon*n of any rank the sample covers inside the + * window. + * + *

This is needed in addition to the error function f(): for a target (quantile, epsilon) and + * rank r below the target, f() allows a width of 2*epsilon*(n-r)/(1-quantile). When 2*epsilon >= + * (1-quantile) — e.g. (0.9, 0.05) or (0.99, 0.005) — this is >= (n-r), i.e. a single sample may + * span all ranks from r to n. Two failure modes follow: compress() merges away all samples + * between r and n, permanently destroying the information needed to answer the quantile query + * (with quantiles {(0.9, 0.05), (0.99, 0.005)} the sample list collapsed to 3 samples regardless + * of how many values were inserted, and get() returned the minimum observation for every + * quantile), and insertBefore() assigns freshly inserted samples a delta of the same order, so + * their possible-rank intervals are centered near rank n and get() cannot tell them apart from + * genuine samples near a target. This bound is therefore applied both when merging in compress() + * and when assigning delta in insertBefore(). For configurations with 2*epsilon < (1-quantile) + * this bound is larger than f() near the target, so behavior is mostly unchanged. + * + *

The bound is anchored at the window's start rather than its end so that it does not + * degenerate for targets with quantile + epsilon >= 1 (e.g. (0.95, 0.05) or (0.99, 0.01)), where + * the window's end is rank n and "may not extend past the window's end" would be no constraint at + * all. + * + *

This is intentionally not part of the per-sample invariant (g + delta <= f(r)): the bound + * depends on n while a sample's delta is fixed at insert time, so it cannot be maintained as a + * static invariant — but enforcing it at insert and merge time is what matters, because those are + * the only operations that create sample widths. + */ + int maxWidthNotCrossingTargets(int r) { + double min = Double.MAX_VALUE; + for (Quantile q : quantiles) { + if (q.quantile == 0 || q.quantile == 1) { + continue; + } + double windowStart = q.quantile * n - q.epsilon * n; + double windowEnd = q.quantile * n + q.epsilon * n; + if (r < windowEnd) { + min = Math.min(min, Math.max(windowStart - r, 2 * q.epsilon * n)); + } + } + if (min == Double.MAX_VALUE) { + return Integer.MAX_VALUE; + } + return Math.max((int) (min + 0.00000000001), 1); + } + + /** + * Effective maximum width (g + delta) of a sample whose predecessor has rank r: the error + * function f() additionally bounded by {@link #maxWidthNotCrossingTargets(int)}. Both places that + * create sample widths — merging in compress() and delta assignment in insertBefore() — must use + * this combined bound. + */ + int effectiveMaxWidth(int r) { + return Math.min(f(r), maxWidthNotCrossingTargets(r)); + } + /** Merge pairs of consecutive samples if this doesn't violate the error function. */ void compress() { if (samples.size() < 3) { @@ -212,7 +293,7 @@ void compress() { // The min sample must never be merged. break; } - if (left.g + right.g + right.delta < f(r)) { + if (left.g + right.g + right.delta < effectiveMaxWidth(r)) { right.g += left.g; descendingIterator.remove(); left = right; diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Counter.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Counter.java index 1c614bdf33..8b7905571b 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Counter.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Counter.java @@ -92,8 +92,9 @@ public CounterSnapshot collect() { @Override protected CounterSnapshot collect(List labels, List metricData) { List data = new ArrayList<>(labels.size()); + String metricName = metadata.getName(); for (int i = 0; i < labels.size(); i++) { - data.add(metricData.get(i).collect(labels.get(i))); + data.add(metricData.get(i).collect(labels.get(i), metricName)); } return new CounterSnapshot(metadata, data); } @@ -199,7 +200,7 @@ private void validateAndAdd(double amount) { doubleValue.add(amount); } - private CounterSnapshot.CounterDataPointSnapshot collect(Labels labels) { + private CounterSnapshot.CounterDataPointSnapshot collect(Labels labels, String metricName) { // Read the exemplar first. Otherwise, there is a race condition where you might // see an Exemplar for a value that's not counted yet. // If there are multiple Exemplars (by default it's just one), use the newest. @@ -212,8 +213,13 @@ private CounterSnapshot.CounterDataPointSnapshot collect(Labels labels) { } } } - return new CounterSnapshot.CounterDataPointSnapshot( - get(), labels, latestExemplar, createdTimeMillis); + return CounterSnapshot.CounterDataPointSnapshot.builder() + .value(get()) + .labels(labels) + .exemplar(latestExemplar) + .createdTimestampMillis(createdTimeMillis) + .metricName(metricName) + .build(); } } diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CounterWithCallback.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CounterWithCallback.java index 514a13d268..cde6f18e1d 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CounterWithCallback.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/CounterWithCallback.java @@ -47,8 +47,11 @@ public CounterSnapshot collect() { callback.accept( (value, labelValues) -> { dataPoints.add( - new CounterSnapshot.CounterDataPointSnapshot( - value, makeLabels(labelValues), null, 0L)); + CounterSnapshot.CounterDataPointSnapshot.builder() + .value(value) + .labels(makeLabels(labelValues)) + .metricName(metadata.getName()) + .build()); }); return new CounterSnapshot(metadata, dataPoints); } diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Histogram.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Histogram.java index c4bb1f5fee..d03ac9b97b 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Histogram.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Histogram.java @@ -243,7 +243,8 @@ public void observe(double value) { return; } if (!buffer.append(value)) { - doObserve(value, false); + boolean nativeBucketCreated = buffer.observeDirect(() -> doObserve(value)); + maybeResetOrScaleDown(value, nativeBucketCreated); } if (exemplarSampler != null) { exemplarSampler.observe(value); @@ -257,14 +258,15 @@ public void observeWithExemplar(double value, Labels labels) { return; } if (!buffer.append(value)) { - doObserve(value, false); + boolean nativeBucketCreated = buffer.observeDirect(() -> doObserve(value)); + maybeResetOrScaleDown(value, nativeBucketCreated); } if (exemplarSampler != null) { exemplarSampler.observeWithExemplar(value, labels); } } - private void doObserve(double value, boolean fromBuffer) { + private boolean doObserve(double value) { // classicUpperBounds is an empty array if this is a native histogram only. for (int i = 0; i < classicUpperBounds.length; ++i) { // The last bucket is +Inf, so we always increment. @@ -287,16 +289,7 @@ private void doObserve(double value, boolean fromBuffer) { count .increment(); // must be the last step, because count is used to signal that the operation // is complete. - if (!fromBuffer) { - // maybeResetOrScaleDown will switch to the buffer, - // which won't work if we are currently still processing observations from the buffer. - // The reason is that before switching to the buffer we wait for all pending observations to - // be counted. - // If we do this while still applying observations from the buffer, the pending observations - // from - // the buffer will never be counted, and the buffer.run() method will wait forever. - maybeResetOrScaleDown(value, nativeBucketCreated); - } + return nativeBucketCreated; } private HistogramSnapshot.HistogramDataPointSnapshot collect(Labels labels) { @@ -339,7 +332,7 @@ private HistogramSnapshot.HistogramDataPointSnapshot collect(Labels labels) { createdTimeMillis); } }, - v -> doObserve(v, true)); + this::doObserve); } private boolean addToNativeBucket(double value, ConcurrentHashMap buckets) { @@ -444,7 +437,8 @@ private void maybeResetOrScaleDown(double value, boolean nativeBucketCreated) { } return null; }, - v -> doObserve(v, true)); + this::doObserve, + false); } else if (nativeBucketCreated) { // If a new bucket was created we need to check if nativeMaxBuckets is exceeded // and scale down if so. @@ -453,7 +447,11 @@ private void maybeResetOrScaleDown(double value, boolean nativeBucketCreated) { if (wasReset.get()) { // We just discarded the newly observed value. Observe it again. if (!buffer.append(value)) { - doObserve(value, true); + buffer.observeDirect( + () -> { + doObserve(value); + return null; + }); } } } @@ -488,7 +486,8 @@ private void maybeScaleDown(AtomicBoolean wasReset) { doubleBucketWidth(); return null; }, - v -> doObserve(v, true)); + this::doObserve, + false); } // maybeReset is called in the synchronized block while new observations go into the buffer. diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java index 6ad26fda32..140a5fc621 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java @@ -116,20 +116,20 @@ public D labelValues(String... labelValues) { "Expected " + labelNames.length + " label values, but got " + labelValues.length + "."); } } - return data.computeIfAbsent( - Arrays.asList(labelValues), - l -> { - for (int i = 0; i < l.size(); i++) { - if (l.get(i) == null) { - throw new IllegalArgumentException( - "null label value for metric " - + metadata.getName() - + " and label " - + labelNames[i]); - } - } - return newDataPoint(); - }); + List key = Arrays.asList(labelValues); + // Fast path: the data point for these label values almost always already exists, since the same + // label combinations are reused across updates. + T dataPoint = data.get(key); + if (dataPoint != null) { + return dataPoint; + } + for (int i = 0; i < labelValues.length; i++) { + if (labelValues[i] == null) { + throw new IllegalArgumentException( + "null label value for metric " + metadata.getName() + " and label " + labelNames[i]); + } + } + return data.computeIfAbsent(key, l -> newDataPoint()); } /** diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Summary.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Summary.java index 043f31129f..d75ac6c74d 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Summary.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/Summary.java @@ -185,7 +185,11 @@ public void observe(double value) { return; } if (!buffer.append(value)) { - doObserve(value); + buffer.observeDirect( + () -> { + doObserve(value); + return null; + }); } if (exemplarSampler != null) { exemplarSampler.observe(value); @@ -198,7 +202,11 @@ public void observeWithExemplar(double value, Labels labels) { return; } if (!buffer.append(value)) { - doObserve(value); + buffer.observeDirect( + () -> { + doObserve(value); + return null; + }); } if (exemplarSampler != null) { exemplarSampler.observeWithExemplar(value, labels); diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/exemplars/OsgiBundleManifestTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/exemplars/OsgiBundleManifestTest.java new file mode 100644 index 0000000000..89d2ea18c7 --- /dev/null +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/exemplars/OsgiBundleManifestTest.java @@ -0,0 +1,98 @@ +package io.prometheus.metrics.core.exemplars; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.InputStream; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.CodeSource; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import org.junit.jupiter.api.Test; + +class OsgiBundleManifestTest { + + private static final String TRACER_INITIALIZER = "io.prometheus.metrics.tracer.initializer"; + + @Test + void tracerInitializerImportIsOptional() throws Exception { + Manifest manifest = loadBundleManifest(ExemplarSampler.class); + String header = manifest.getMainAttributes().getValue("Import-Package"); + assertThat(header).as("Import-Package").isNotBlank(); + String clause = requireClause(header, TRACER_INITIALIZER); + assertThat(clause) + .as("OSGi resolution of %s", TRACER_INITIALIZER) + .contains("resolution:=optional"); + } + + private static Manifest loadBundleManifest(Class type) throws Exception { + CodeSource codeSource = type.getProtectionDomain().getCodeSource(); + assertThat(codeSource).as("code source for %s", type.getName()).isNotNull(); + URI location = codeSource.getLocation().toURI(); + Path path = Path.of(location); + if (Files.isDirectory(path)) { + Path manifestFile = path.resolve("META-INF/MANIFEST.MF"); + assertThat(Files.exists(manifestFile)) + .as("bnd MANIFEST.MF for %s at %s", type.getName(), manifestFile) + .isTrue(); + try (InputStream in = Files.newInputStream(manifestFile)) { + return new Manifest(in); + } + } + try (JarFile jar = new JarFile(path.toFile())) { + Manifest manifest = jar.getManifest(); + assertThat(manifest).as("MANIFEST.MF in %s", path).isNotNull(); + return manifest; + } + } + + private static String requireClause(String header, String packageName) { + for (String rawClause : splitRespectingQuotes(header, ',')) { + String name = rawClause.trim(); + int separator = indexOfUnquoted(name, ';'); + if (separator >= 0) { + name = name.substring(0, separator).trim(); + } + if (packageName.equals(name)) { + return rawClause.trim(); + } + } + throw new AssertionError("missing Import-Package clause " + packageName); + } + + private static int indexOfUnquoted(String value, char target) { + boolean inQuote = false; + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + inQuote = !inQuote; + } else if (!inQuote && c == target) { + return i; + } + } + return -1; + } + + private static List splitRespectingQuotes(String value, char separator) { + List parts = new ArrayList<>(); + StringBuilder current = new StringBuilder(); + boolean inQuote = false; + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + inQuote = !inQuote; + current.append(c); + } else if (!inQuote && c == separator) { + parts.add(current.toString()); + current.setLength(0); + } else { + current.append(c); + } + } + parts.add(current.toString()); + return parts; + } +} diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/BufferTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/BufferTest.java new file mode 100644 index 0000000000..064bb81863 --- /dev/null +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/BufferTest.java @@ -0,0 +1,353 @@ +package io.prometheus.metrics.core.metrics; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import io.prometheus.metrics.model.snapshots.CounterSnapshot; +import io.prometheus.metrics.model.snapshots.Labels; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.Test; + +class BufferTest { + + @Test + void stripeIndexDoesNotOverflowWhenThreadIdNarrowsToIntegerMinValue() { + assertThat(Buffer.stripeIndex(2_147_483_648L, 3)).isEqualTo(2); + assertThat(Buffer.stripeIndex(2_147_483_648L, 6)).isEqualTo(2); + assertThat(Buffer.stripeIndex(2_147_483_648L, 12)).isEqualTo(8); + } + + @Test + void timeoutDeactivatesBufferAndReplaysBufferedObservations() throws InterruptedException { + Buffer buffer = new Buffer(TimeUnit.SECONDS.toNanos(1)); + CountDownLatch spinWaitStarted = new CountDownLatch(1); + List replayedObservations = new ArrayList<>(); + AtomicBoolean timedOut = new AtomicBoolean(false); + + Thread runner = + new Thread( + () -> { + try { + buffer.run( + expectedCount -> { + spinWaitStarted.countDown(); + return false; + }, + () -> new CounterSnapshot.CounterDataPointSnapshot(0, Labels.EMPTY, null, 0), + replayedObservations::add); + } catch (IllegalStateException expected) { + timedOut.set(true); + } + }, + "buffer-timeout-runner"); + runner.setDaemon(true); + runner.start(); + + assertThat(spinWaitStarted.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(buffer.append(1.0)).isTrue(); + runner.join(5_000); + + assertThat(timedOut).isTrue(); + assertThat(replayedObservations).containsExactly(1.0); + assertThat(buffer.append(2.0)).isFalse(); + } + + @Test + void timeoutDoesNotCreateSnapshot() { + Buffer buffer = new Buffer(TimeUnit.MILLISECONDS.toNanos(1)); + + assertThatExceptionOfType(IllegalStateException.class) + .isThrownBy( + () -> + buffer.run( + expectedCount -> false, + () -> { + throw new AssertionError("snapshot should not be created"); + }, + ignored -> {})) + .withMessage("Timed out while waiting for in-flight observations."); + } + + @Test + void failedSnapshotReplaysBufferedObservationsAndAllowsNextCollection() { + assertFailedSnapshotIsRecovered(new IllegalStateException("snapshot failed")); + } + + @Test + void failedSnapshotWithErrorStillDeactivatesAndReplaysBuffer() { + assertFailedSnapshotIsRecovered(new AssertionError("snapshot failed")); + } + + private void assertFailedSnapshotIsRecovered(Throwable failure) { + Buffer buffer = new Buffer(); + List replayedObservations = new ArrayList<>(); + + assertThatExceptionOfType(failure.getClass()) + .isThrownBy( + () -> + buffer.run( + ignored -> true, + () -> { + assertThat(buffer.append(1.0)).isTrue(); + if (failure instanceof Error) { + throw (Error) failure; + } + throw (RuntimeException) failure; + }, + replayedObservations::add)) + .isSameAs(failure); + assertThat(replayedObservations).containsExactly(1.0); + assertThat(buffer.append(2.0)).isFalse(); + assertThat( + buffer.run( + ignored -> true, + () -> new CounterSnapshot.CounterDataPointSnapshot(0, Labels.EMPTY, null, 0), + replayedObservations::add)) + .isNotNull(); + assertThat(replayedObservations).containsExactly(1.0); + } + + @Test + void fullBufferUnblocksAppenderWhenGenerationIsDeactivated() throws InterruptedException { + CountDownLatch runStarted = new CountDownLatch(1); + CountDownLatch secondAppenderEntered = new CountDownLatch(1); + AtomicLong beforeAppendCount = new AtomicLong(); + AtomicReference appended = new AtomicReference<>(); + AtomicBoolean timedOut = new AtomicBoolean(); + Buffer buffer = + new Buffer( + TimeUnit.MILLISECONDS.toNanos(250), + 1, + () -> { + if (beforeAppendCount.incrementAndGet() == 2) { + secondAppenderEntered.countDown(); + } + }); + Thread runner = + new Thread( + () -> { + try { + buffer.run( + ignored -> { + runStarted.countDown(); + return false; + }, + () -> new CounterSnapshot.CounterDataPointSnapshot(0, Labels.EMPTY, null, 0), + ignored -> {}); + } catch (IllegalStateException expected) { + timedOut.set(true); + } + }, + "buffer-full-runner"); + runner.setDaemon(true); + runner.start(); + assertThat(runStarted.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(buffer.append(1.0)).isTrue(); + + Thread appender = new Thread(() -> appended.set(buffer.append(2.0)), "buffer-full-appender"); + appender.setDaemon(true); + appender.start(); + assertThat(secondAppenderEntered.await(5, TimeUnit.SECONDS)).isTrue(); + runner.join(5_000); + appender.join(5_000); + + assertThat(timedOut).isTrue(); + assertThat(appender.isAlive()).isFalse(); + assertThat(appended).hasValue(false); + } + + @Test + void interruptedAppenderLeavesBoundedBufferWait() throws InterruptedException { + CountDownLatch runStarted = new CountDownLatch(1); + CountDownLatch secondAppenderEntered = new CountDownLatch(1); + AtomicLong beforeAppendCount = new AtomicLong(); + AtomicBoolean interrupted = new AtomicBoolean(); + AtomicReference appended = new AtomicReference<>(); + Buffer buffer = + new Buffer( + TimeUnit.SECONDS.toNanos(1), + 1, + () -> { + if (beforeAppendCount.incrementAndGet() == 2) { + secondAppenderEntered.countDown(); + } + }); + Thread runner = + new Thread( + () -> { + try { + buffer.run( + ignored -> { + runStarted.countDown(); + return false; + }, + () -> new CounterSnapshot.CounterDataPointSnapshot(0, Labels.EMPTY, null, 0), + ignored -> {}); + } catch (IllegalStateException expected) { + // The runner is only used to hold the generation open for this test. + } + }, + "buffer-interrupt-runner"); + runner.setDaemon(true); + runner.start(); + assertThat(runStarted.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(buffer.append(1.0)).isTrue(); + + Thread appender = + new Thread( + () -> { + appended.set(buffer.append(2.0)); + interrupted.set(Thread.currentThread().isInterrupted()); + }, + "buffer-interrupt-appender"); + appender.setDaemon(true); + appender.start(); + assertThat(secondAppenderEntered.await(5, TimeUnit.SECONDS)).isTrue(); + appender.interrupt(); + appender.join(5_000); + runner.join(5_000); + + assertThat(appender.isAlive()).isFalse(); + assertThat(appended).hasValue(false); + assertThat(interrupted).isTrue(); + } + + @Test + void lateAppenderCountedByNextGenerationMustNotBeBufferedAgain() throws Exception { + assertLateAppenderHandoff(false, true); + } + + @Test + void lateAppenderHandoffUsesAbsoluteStripeCountsAfterReset() throws Exception { + assertLateAppenderHandoff(true, true); + } + + @Test + void lateAppenderAfterGenerationReadMustNotBeBufferedAgain() throws Exception { + assertLateAppenderHandoff(false, false); + } + + private static void assertLateAppenderHandoff(boolean reset, boolean pauseBeforeGenerationRead) + throws Exception { + CountDownLatch firstSnapshotStarted = new CountDownLatch(1); + CountDownLatch finishFirstSnapshot = new CountDownLatch(1); + CountDownLatch observationCounted = new CountDownLatch(1); + CountDownLatch readGeneration = new CountDownLatch(1); + CountDownLatch secondRunStarted = new CountDownLatch(1); + AtomicLong completedObservations = new AtomicLong(); + AtomicLong secondExpectedCount = new AtomicLong(); + AtomicBoolean pauseFirstAppender = new AtomicBoolean(true); + Runnable pauseHook = + () -> { + if (pauseFirstAppender.compareAndSet(true, false)) { + observationCounted.countDown(); + awaitLatch(readGeneration); + } + }; + Buffer buffer = + new Buffer( + TimeUnit.SECONDS.toNanos(5), + 16, + pauseBeforeGenerationRead ? pauseHook : () -> {}, + pauseBeforeGenerationRead ? () -> {} : pauseHook); + if (reset) { + assertThat(buffer.append(1.0)).isFalse(); + buffer.observeDirect(completedObservations::incrementAndGet); + } + ExecutorService executor = Executors.newFixedThreadPool(2); + try { + Future firstRun = + executor.submit( + () -> + buffer.run( + expectedCount -> completedObservations.get() == expectedCount, + () -> { + firstSnapshotStarted.countDown(); + awaitLatch(finishFirstSnapshot); + CounterSnapshot.CounterDataPointSnapshot snapshot = + new CounterSnapshot.CounterDataPointSnapshot( + completedObservations.get(), Labels.EMPTY, null, 0); + if (reset) { + completedObservations.set(0); + buffer.reset(); + } + return snapshot; + }, + ignored -> completedObservations.incrementAndGet())); + awaitLatch(firstSnapshotStarted); + + // Increment while generation A is active, but do not read activeGeneration yet. + Future appender = + executor.submit( + () -> { + boolean appended = buffer.append(1.0); + if (!appended) { + buffer.observeDirect(completedObservations::incrementAndGet); + } + return appended; + }); + awaitLatch(observationCounted); + finishFirstSnapshot.countDown(); + assertThat(firstRun.get(10, TimeUnit.SECONDS).getValue()).isEqualTo(reset ? 1 : 0); + + Future secondRun = + executor.submit( + () -> + buffer.run( + expectedCount -> { + secondExpectedCount.set(expectedCount); + secondRunStarted.countDown(); + return completedObservations.get() == expectedCount; + }, + () -> + new CounterSnapshot.CounterDataPointSnapshot( + completedObservations.get(), Labels.EMPTY, null, 0), + ignored -> completedObservations.incrementAndGet())); + awaitLatch(secondRunStarted); + assertThat(secondExpectedCount).hasValue(1); + // An observation arriving after B's activation still belongs in B's buffer. It must not + // appear in B's snapshot and must be replayed exactly once before the following collection. + assertThat(buffer.append(1.0)).isTrue(); + + // B includes the paused observation in expectedCount. Buffering it in B would make B wait + // until its own timeout/replay; it must instead complete via the direct observation path. + readGeneration.countDown(); + assertThat(secondRun.get(10, TimeUnit.SECONDS).getValue()).isEqualTo(1); + assertThat(appender.get(10, TimeUnit.SECONDS)).isFalse(); + assertThat(completedObservations).hasValue(2); + assertThat( + buffer + .run( + expectedCount -> completedObservations.get() == expectedCount, + () -> + new CounterSnapshot.CounterDataPointSnapshot( + completedObservations.get(), Labels.EMPTY, null, 0), + ignored -> completedObservations.incrementAndGet()) + .getValue()) + .isEqualTo(2); + } finally { + finishFirstSnapshot.countDown(); + readGeneration.countDown(); + executor.shutdownNow(); + } + assertThat(executor.awaitTermination(10, TimeUnit.SECONDS)).as("executor terminated").isTrue(); + } + + private static void awaitLatch(CountDownLatch latch) { + try { + assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } + } +} diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CKMSQuantilesTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CKMSQuantilesTest.java index 5a7fd7f48c..e78a076055 100644 --- a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CKMSQuantilesTest.java +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CKMSQuantilesTest.java @@ -224,6 +224,152 @@ void testMaxEpsilon() { validateResults(ckms); } + /** + * Reproducer for the quantile collapse bug: for a target quantile (q, epsilon) the error function + * allows samples below rank q*n to have g + delta up to 2*epsilon*(n-r)/(1-q). When 2*epsilon >= + * 1-q (as in (0.9, 0.05) or (0.99, 0.005) — both taken from real-world configurations) this is >= + * n-r, so (a) compress() merged almost all samples away and (b) get() stopped at the first + * freshly inserted sample (delta = f(r)-1) and returned the minimum observation for every + * quantile: get(0.9) == get(0.99) == 1.0 regardless of the input data. + */ + @Test + void testTargetedQuantilesDoNotCollapse() { + Random random = new Random(42); + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.9, 0.05), new Quantile(0.99, 0.005)); + for (double value : shuffledValues(100 * 1000, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** Like {@link #testTargetedQuantilesDoNotCollapse()}, with a single targeted quantile. */ + @Test + void testSingleTargetedQuantileDoesNotCollapse() { + Random random = new Random(43); + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.99, 0.005)); + for (double value : shuffledValues(100 * 1000, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** + * Adding a well-behaved quantile (0.5, 0.05) to the collapsing configuration bounds the error + * function in the lower ranks, but before the fix get(0.99) still returned a value from around + * the 85th percentile: samples between rank 0.8*n and 0.99*n may have g + delta up to n-r, and + * the old stop condition in get() tripped on the first of them. + */ + @Test + void testTargetedQuantilesWithMedian() { + Random random = new Random(44); + CKMSQuantiles ckms = + new CKMSQuantiles( + new Quantile(0.5, 0.05), new Quantile(0.9, 0.05), new Quantile(0.99, 0.005)); + for (double value : shuffledValues(100 * 1000, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** + * Deterministic small-n case from the review of an earlier fix attempt + * (https://github.com/prometheus/client_java/pull/2316): with values 1..10,000 shuffled with seed + * 2, selecting the sample whose possible-rank interval is centered nearest the desired rank + * returned 9784 there, outside the accuracy window [9800, 10000]. The additional merge bound in + * compress() keeps enough resolution around the target rank for this case to pass. + */ + @Test + void testSingleTargetedQuantileSmallN() { + Random random = new Random(2); + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.99, 0.005)); + for (double value : shuffledValues(10 * 1000, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** + * Counterexample: with a single well-behaved quantile (0.5, 0.025) and values 1..257 shuffled + * with seed 5, an earlier revision that selected the sample whose possible-rank interval is + * centered nearest the desired rank returned 121, outside the accuracy window [122, 135]. + * Selecting the sample that minimizes the worst-case rank error (center distance plus half the + * interval's width) returns 132. + */ + @Test + void testMedianSmallN() { + Random random = new Random(5); + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.5, 0.025)); + for (double value : shuffledValues(257, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** + * Targets with quantile + epsilon >= 1 are the degenerate end of the collapsing family: the + * accuracy window's end is rank n itself, so a bound phrased as "a sample may not extend past the + * window's end" is no constraint at all, and freshly inserted samples with delta = f(r) - 1 have + * possible-rank intervals centered near rank n regardless of their position. Both the merge bound + * and the insert-time delta bound must be anchored at the window's start for these + * configurations. + */ + @Test + void testTargetedQuantileWindowReachingMaximum() { + for (Quantile quantile : new Quantile[] {new Quantile(0.99, 0.01), new Quantile(0.95, 0.05)}) { + for (int seed = 0; seed < 5; seed++) { + Random random = new Random(seed); + CKMSQuantiles ckms = new CKMSQuantiles(quantile); + for (double value : shuffledValues(10 * 1000, random)) { + ckms.insert(value); + } + validateResults(ckms); + } + } + } + + /** + * Descending input is the worst case for the collapsing configurations: every insert happens at + * the front of the sample list, where the error function is loosest. Before the insert-time delta + * bound, get(0.9) was off by 2.9 * epsilon here. + */ + @Test + void testTargetedQuantilesDescendingInput() { + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.9, 0.05), new Quantile(0.99, 0.005)); + for (int value = 10 * 1000; value >= 1; value--) { + ckms.insert(value); + } + validateResults(ckms); + } + + /** + * At larger n, descending input can still exceed the 1 * epsilon rank bound (up to 1.75 * epsilon + * observed across the configurations tested): sample widths are bounded when they are created, + * but with descending input a sample's rank grows by 1 per insert while the accuracy windows move + * right by only quantile ± epsilon per insert, so old samples drift towards the windows and their + * width bound erodes. This is not a regression: the previous implementation exceeded 1 * epsilon + * on descending input for every configuration tested, in this exact case by 18 * epsilon for + * get(0.9) and 198 * epsilon for get(0.99). This test pins the remaining gap to at most 2 * + * epsilon. + */ + @Test + void testTargetedQuantilesDescendingInputLargeN() { + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.9, 0.05), new Quantile(0.99, 0.005)); + for (int value = 100 * 1000; value >= 1; value--) { + ckms.insert(value); + } + validateResults(ckms, 2); + } + + /** Ascending input order, the counterpart of {@link #testTargetedQuantilesDescendingInput()}. */ + @Test + void testTargetedQuantilesAscendingInput() { + CKMSQuantiles ckms = new CKMSQuantiles(new Quantile(0.9, 0.05), new Quantile(0.99, 0.005)); + for (int value = 1; value <= 10 * 1000; value++) { + ckms.insert(value); + } + validateResults(ckms); + } + @Test void testGetGaussian() { RandomGenerator rand = new JDKRandomGenerator(); @@ -332,11 +478,21 @@ private void validateSamples(CKMSQuantiles ckms) { } /** - * The values that we insert in these tests are always the numbers from 1 to n, in random order. - * So we can trivially calculate the range of acceptable results for each quantile. We check if - * the value returned by get() is within the range of acceptable results. + * The values that we insert in these tests are always the numbers from 1 to n, in some order. So + * we can trivially calculate the range of acceptable results for each quantile. We check if the + * value returned by get() is within the documented q ± epsilon rank bound (floor/ceil because + * ranks are integers). */ private void validateResults(CKMSQuantiles ckms) { + validateResults(ckms, 1); + } + + /** + * Only pass an epsilonFactor other than 1 for the known descending-input gap (see {@link + * #testTargetedQuantilesDescendingInputLargeN()}); everything else must meet the documented + * bound. + */ + private void validateResults(CKMSQuantiles ckms, double epsilonFactor) { for (Quantile q : ckms.quantiles) { double actual = ckms.get(q.quantile); double lowerBound, upperBound; @@ -347,8 +503,8 @@ private void validateResults(CKMSQuantiles ckms) { lowerBound = ckms.n; upperBound = ckms.n; } else { - lowerBound = Math.floor(ckms.n * (q.quantile - 2 * q.epsilon)); - upperBound = Math.ceil(ckms.n * (q.quantile + 2 * q.epsilon)); + lowerBound = Math.floor(ckms.n * (q.quantile - epsilonFactor * q.epsilon)); + upperBound = Math.ceil(ckms.n * (q.quantile + epsilonFactor * q.epsilon)); } boolean ok = actual >= lowerBound && actual <= upperBound; if (!ok) { diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CounterWithCallbackTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CounterWithCallbackTest.java index 2907a8a027..61377c18f9 100644 --- a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CounterWithCallbackTest.java +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/CounterWithCallbackTest.java @@ -43,4 +43,17 @@ void testCounterNoCallback() { .isThrownBy( () -> CounterWithCallback.builder().name("counter").labelNames("l1", "l2").build()); } + + @Test + void testNegativeValueIncludesMetricName() { + CounterWithCallback counter = + CounterWithCallback.builder() + .name("negative_counter") + .callback(callback -> callback.call(-1.0)) + .build(); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(counter::collect) + .withMessage("negative_counter=-1.0: counters cannot have a negative value"); + } } diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/OpenMetrics2TextFormatWriterTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/OpenMetrics2TextFormatWriterTest.java index 38ba672709..59918719e6 100644 --- a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/OpenMetrics2TextFormatWriterTest.java +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/OpenMetrics2TextFormatWriterTest.java @@ -16,6 +16,38 @@ class OpenMetrics2TextFormatWriterTest { + @Test + void preservesNamesByDefault() throws IOException { + Counter counter = Counter.builder().name("requests").unit(Unit.BYTES).build(); + counter.inc(); + + String output = + writeWithWriter( + MetricSnapshots.of(counter.collect()), OpenMetrics2TextFormatWriter.create()); + + assertThat(output) + .contains("# TYPE requests counter\n") + .contains("# UNIT requests bytes\n") + .containsPattern("(?m)^requests 1\\.0 st@\\d+\\.\\d{3}$"); + } + + @Test + void suffixesCanBeEnabledForOm1Compatibility() throws IOException { + Counter counter = Counter.builder().name("requests").unit(Unit.BYTES).build(); + counter.inc(); + + OpenMetrics2TextFormatWriter writer = + OpenMetrics2TextFormatWriter.builder() + .setOpenMetrics2Properties(OpenMetrics2Properties.builder().suffixes(true).build()) + .build(); + String output = writeWithWriter(MetricSnapshots.of(counter.collect()), writer); + + assertThat(output) + .contains("# TYPE requests_bytes_total counter\n") + .contains("# UNIT requests_bytes_total bytes\n") + .containsPattern("(?m)^requests_bytes_total 1\\.0 st@\\d+\\.\\d{3}$"); + } + @Test void counterPreservesOriginalNameWhenUnitIsConfigured() throws IOException { Counter counter = @@ -93,23 +125,27 @@ void nativeHistogramPreservesOriginalNameWhenUnitIsConfigured() throws IOExcepti } private String writeWithOM1(MetricSnapshots snapshots) throws IOException { - return write(snapshots, OpenMetricsTextFormatWriter.create()); + return writeWithWriter(snapshots, OpenMetricsTextFormatWriter.create()); } private String writeWithOM2(MetricSnapshots snapshots) throws IOException { - return write(snapshots, OpenMetrics2TextFormatWriter.create()); + OpenMetrics2TextFormatWriter writer = + OpenMetrics2TextFormatWriter.builder() + .setOpenMetrics2Properties(OpenMetrics2Properties.builder().suffixes(false).build()) + .build(); + return writeWithWriter(snapshots, writer); } private String writeWithNativeHistograms(MetricSnapshots snapshots) throws IOException { OpenMetrics2TextFormatWriter writer = OpenMetrics2TextFormatWriter.builder() .setOpenMetrics2Properties( - OpenMetrics2Properties.builder().nativeHistograms(true).build()) + OpenMetrics2Properties.builder().nativeHistograms(true).suffixes(false).build()) .build(); - return write(snapshots, writer); + return writeWithWriter(snapshots, writer); } - private String write(MetricSnapshots snapshots, ExpositionFormatWriter writer) + private String writeWithWriter(MetricSnapshots snapshots, ExpositionFormatWriter writer) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); writer.write(out, snapshots, EscapingScheme.ALLOW_UTF8); diff --git a/prometheus-metrics-exporter-common/pom.xml b/prometheus-metrics-exporter-common/pom.xml index 9fb2b96216..589a363293 100644 --- a/prometheus-metrics-exporter-common/pom.xml +++ b/prometheus-metrics-exporter-common/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-common diff --git a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/InvalidQueryParameterException.java b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/InvalidQueryParameterException.java new file mode 100644 index 0000000000..0622952e70 --- /dev/null +++ b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/InvalidQueryParameterException.java @@ -0,0 +1,21 @@ +package io.prometheus.metrics.exporter.common; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +class InvalidQueryParameterException extends RuntimeException { + + InvalidQueryParameterException(String message) { + super(message); + } + + // decode with Charset is only available in Java 10+, but we want to support Java 8 + @SuppressWarnings("JdkObsolete") + static String urlDecode(String value) throws UnsupportedEncodingException { + try { + return URLDecoder.decode(value, "UTF-8"); + } catch (IllegalArgumentException e) { + throw new InvalidQueryParameterException("Invalid percent-encoding in query string"); + } + } +} diff --git a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequest.java b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequest.java index a0c692c236..a0a8311f64 100644 --- a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequest.java +++ b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequest.java @@ -3,7 +3,6 @@ import io.prometheus.metrics.annotations.StableApi; import io.prometheus.metrics.model.registry.PrometheusScrapeRequest; import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; import java.util.ArrayList; import java.util.Enumeration; import javax.annotation.Nullable; @@ -42,22 +41,58 @@ default String getParameter(String name) { } } - /** See {@code jakarta.servlet.ServletRequest.getParameterValues(String)} */ + /** + * See {@code jakarta.servlet.ServletRequest.getParameterValues(String)}. + * + *

For safety, the default implementation applies two fixed limits: {@code maxQueryStringLength + * = 64 * 1024} (65,536 characters) and {@code maxQueryParameterCount = 1024} ({@code &}-separated + * parameter pairs). These implementation values are not exposed as runtime configuration. + * Requests that exceed either limit or contain invalid percent-encoding are rejected by the + * scrape handler with HTTP {@code 400 Bad Request}. + */ @Override @Nullable // decode with Charset is only available in Java 10+, but we want to support Java 8 @SuppressWarnings("JdkObsolete") default String[] getParameterValues(String name) { try { + int maxQueryStringLength = 64 * 1024; + int maxQueryParameterCount = 1024; ArrayList result = new ArrayList<>(); String queryString = getQueryString(); if (queryString != null) { - String[] pairs = queryString.split("&"); - for (String pair : pairs) { + if (queryString.length() > maxQueryStringLength) { + throw new InvalidQueryParameterException( + "Query string too long: " + + queryString.length() + + " characters (max " + + maxQueryStringLength + + ")"); + } + int start = 0; + int parameterCount = 0; + for (int end = queryString.indexOf('&'); start <= queryString.length(); ) { + parameterCount++; + if (parameterCount > maxQueryParameterCount) { + throw new InvalidQueryParameterException( + "Too many query parameters: " + + parameterCount + + " (max " + + maxQueryParameterCount + + ")"); + } + String pair = + end == -1 ? queryString.substring(start) : queryString.substring(start, end); int idx = pair.indexOf("="); - if (idx != -1 && URLDecoder.decode(pair.substring(0, idx), "UTF-8").equals(name)) { - result.add(URLDecoder.decode(pair.substring(idx + 1), "UTF-8")); + if (idx != -1 + && InvalidQueryParameterException.urlDecode(pair.substring(0, idx)).equals(name)) { + result.add(InvalidQueryParameterException.urlDecode(pair.substring(idx + 1))); + } + if (end == -1) { + break; } + start = end + 1; + end = queryString.indexOf('&', start); } } if (result.isEmpty()) { diff --git a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java index 20328382a6..b68b11c891 100644 --- a/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java +++ b/prometheus-metrics-exporter-common/src/main/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandler.java @@ -6,6 +6,7 @@ import io.prometheus.metrics.config.PrometheusProperties; import io.prometheus.metrics.expositionformats.ExpositionFormatWriter; import io.prometheus.metrics.expositionformats.ExpositionFormats; +import io.prometheus.metrics.expositionformats.OpenMetrics2TextFormatWriter; import io.prometheus.metrics.model.registry.MetricNameFilter; import io.prometheus.metrics.model.registry.PrometheusRegistry; import io.prometheus.metrics.model.snapshots.MetricSnapshots; @@ -60,13 +61,25 @@ public PrometheusScrapeHandler(PrometheusProperties config, PrometheusRegistry r public void handleRequest(PrometheusHttpExchange exchange) throws IOException { try { PrometheusHttpRequest request = exchange.getRequest(); - MetricSnapshots snapshots = scrape(request); + String[] includedNames = null; + String debugParam = null; + try { + includedNames = request.getParameterValues("name[]"); + debugParam = request.getParameter("debug"); + } catch (InvalidQueryParameterException e) { + writeInvalidQueryParametersResponse(exchange); + return; + } + MetricSnapshots snapshots = scrape(request, includedNames); String acceptHeader = request.getHeader("Accept"); - EscapingScheme escapingScheme = EscapingScheme.fromAcceptHeader(acceptHeader); - if (writeDebugResponse(snapshots, escapingScheme, exchange)) { + if (writeDebugResponse( + snapshots, EscapingScheme.fromAcceptHeader(acceptHeader), debugParam, exchange)) { return; } ExpositionFormatWriter writer = expositionFormats.findWriter(acceptHeader); + EscapingScheme escapingScheme = + EscapingScheme.fromAcceptHeader( + acceptHeader, defaultEscapingScheme(writer, acceptHeader)); PrometheusHttpResponse response = exchange.getResponse(); response.setHeader("Content-Type", writer.getContentType()); @@ -105,6 +118,39 @@ public void handleRequest(PrometheusHttpExchange exchange) throws IOException { } } + /** + * OpenMetrics 2.0 supports UTF-8 names and has no escaping parameter, so names are not escaped + * unless the scraper asks for it. With contentNegotiation=false the OM2 writer also serves OM 1.0 + * and unversioned requests, so 2.0.0 must have been requested explicitly. + */ + private EscapingScheme defaultEscapingScheme( + ExpositionFormatWriter writer, @Nullable String acceptHeader) { + if (writer instanceof OpenMetrics2TextFormatWriter + && "2.0.0".equals(parseOpenMetricsVersion(acceptHeader))) { + return EscapingScheme.ALLOW_UTF8; + } + return EscapingScheme.DEFAULT; + } + + @Nullable + private static String parseOpenMetricsVersion(@Nullable String acceptHeader) { + if (acceptHeader == null) { + return null; + } + for (String mediaType : acceptHeader.split(",")) { + if (mediaType.contains("application/openmetrics-text")) { + for (String param : mediaType.split(";")) { + String[] tokens = param.split("="); + if (tokens.length == 2 && tokens[0].trim().equals("version")) { + return tokens[1].trim(); + } + } + return null; + } + } + return null; + } + @Nullable private Predicate makeNameFilter(ExporterFilterProperties props) { if (props.getAllowedMetricNames() == null @@ -136,9 +182,9 @@ private Predicate makeNameFilter(@Nullable String[] includedNames) { return result; } - private MetricSnapshots scrape(PrometheusHttpRequest request) { + private MetricSnapshots scrape(PrometheusHttpRequest request, @Nullable String[] includedNames) { - Predicate filter = makeNameFilter(request.getParameterValues("name[]")); + Predicate filter = makeNameFilter(includedNames); if (filter != null) { return registry.scrape(filter, request); } else { @@ -147,9 +193,11 @@ private MetricSnapshots scrape(PrometheusHttpRequest request) { } private boolean writeDebugResponse( - MetricSnapshots snapshots, EscapingScheme escapingScheme, PrometheusHttpExchange exchange) + MetricSnapshots snapshots, + EscapingScheme escapingScheme, + @Nullable String debugParam, + PrometheusHttpExchange exchange) throws IOException { - String debugParam = exchange.getRequest().getParameter("debug"); PrometheusHttpResponse response = exchange.getResponse(); if (debugParam == null) { return false; @@ -184,6 +232,16 @@ private boolean writeDebugResponse( } } + private void writeInvalidQueryParametersResponse(PrometheusHttpExchange exchange) + throws IOException { + PrometheusHttpResponse response = exchange.getResponse(); + response.setHeader("Content-Type", "text/plain; charset=utf-8"); + byte[] message = "Invalid query parameters".getBytes(StandardCharsets.UTF_8); + try (OutputStream outputStream = response.sendHeadersAndGetBody(400, message.length)) { + outputStream.write(message); + } + } + private boolean shouldUseCompression(PrometheusHttpRequest request) { if (preferUncompressedResponse) { return false; diff --git a/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequestTest.java b/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequestTest.java index a2b630ecdb..c2af705a46 100644 --- a/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequestTest.java +++ b/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusHttpRequestTest.java @@ -1,6 +1,7 @@ package io.prometheus.metrics.exporter.common; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.util.Collections; import java.util.Enumeration; @@ -80,6 +81,22 @@ void testGetParameterValuesIgnoresParametersWithoutEquals() { assertThat(values).containsExactly("value1", "value2"); } + @Test + void testGetParameterValuesRejectsMalformedEncodedName() { + PrometheusHttpRequest request = new TestPrometheusHttpRequest("name%ZZ=value"); + + assertThatExceptionOfType(InvalidQueryParameterException.class) + .isThrownBy(() -> request.getParameterValues("name")); + } + + @Test + void testGetParameterValuesRejectsMalformedEncodedValue() { + PrometheusHttpRequest request = new TestPrometheusHttpRequest("name=value%ZZ"); + + assertThatExceptionOfType(InvalidQueryParameterException.class) + .isThrownBy(() -> request.getParameterValues("name")); + } + /** Test implementation of PrometheusHttpRequest for testing default methods. */ private static class TestPrometheusHttpRequest implements PrometheusHttpRequest { private final String queryString; diff --git a/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandlerTest.java b/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandlerTest.java index 07ea8ac52a..3429353d5c 100644 --- a/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandlerTest.java +++ b/prometheus-metrics-exporter-common/src/test/java/io/prometheus/metrics/exporter/common/PrometheusScrapeHandlerTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.prometheus.metrics.config.PrometheusProperties; import io.prometheus.metrics.core.metrics.Counter; import io.prometheus.metrics.model.registry.PrometheusRegistry; import java.io.ByteArrayOutputStream; @@ -164,6 +165,84 @@ void testMultipleMetricNameFilters() throws IOException { assertThat(body).doesNotContain("metric_three"); } + @Test + void testRejectsTooManyQueryParameters() throws IOException { + StringBuilder queryString = new StringBuilder("name[]=test_counter"); + for (int i = 0; i < 1024; i++) { + queryString.append("&name[]=metric_").append(i); + } + + TestHttpExchange exchange = new TestHttpExchange("GET", queryString.toString()); + handler.handleRequest(exchange); + + assertThat(exchange.getResponseCode()).isEqualTo(400); + assertThat(exchange.getResponseHeaders().get("Content-Type")) + .isEqualTo("text/plain; charset=utf-8"); + assertThat(exchange.getResponseBody()).isEqualTo("Invalid query parameters"); + } + + @Test + void testRejectsTooLongQueryString() throws IOException { + StringBuilder queryString = new StringBuilder("name[]="); + for (int i = 0; i < 64 * 1024; i++) { + queryString.append("a"); + } + + TestHttpExchange exchange = new TestHttpExchange("GET", queryString.toString()); + handler.handleRequest(exchange); + + assertThat(exchange.getResponseCode()).isEqualTo(400); + assertThat(exchange.getResponseBody()).isEqualTo("Invalid query parameters"); + } + + @Test + void testOpenMetrics2PreservesNamesAndDoesNotEscapeUtf8ByDefault() throws IOException { + for (boolean contentNegotiation : new boolean[] {true, false}) { + String body = + scrapeUtf8Counter(contentNegotiation, "application/openmetrics-text;version=2.0.0"); + assertThat(body) + .contains("\"my.counter\"") + .doesNotContain("my.counter_total") + .doesNotContain("my_counter"); + } + } + + @Test + void testOpenMetrics2ExplicitEscapingWins() throws IOException { + String body = + scrapeUtf8Counter(true, "application/openmetrics-text;version=2.0.0;escaping=underscores"); + assertThat(body).contains("my_counter").doesNotContain("my.counter"); + } + + @Test + void testUnderscoreEscapingStaysDefaultForOtherFormats() throws IOException { + for (boolean contentNegotiation : new boolean[] {true, false}) { + for (String accept : + new String[] { + "application/openmetrics-text;version=1.0.0", + "application/openmetrics-text", + "text/plain;version=0.0.4" + }) { + String body = scrapeUtf8Counter(contentNegotiation, accept); + assertThat(body).as(accept).contains("my_counter").doesNotContain("my.counter"); + } + } + } + + private static String scrapeUtf8Counter(boolean contentNegotiation, String accept) + throws IOException { + PrometheusRegistry utf8Registry = new PrometheusRegistry(); + Counter.builder().name("my.counter").help("UTF-8 counter").register(utf8Registry).inc(); + PrometheusProperties config = + PrometheusProperties.builder() + .enableOpenMetrics2(om2 -> om2.contentNegotiation(contentNegotiation)) + .build(); + TestHttpExchange exchange = new TestHttpExchange("GET", null).withHeader("Accept", accept); + new PrometheusScrapeHandler(config, utf8Registry).handleRequest(exchange); + assertThat(exchange.getResponseCode()).isEqualTo(200); + return exchange.getResponseBody(); + } + /** Test implementation of PrometheusHttpExchange for testing. */ private static class TestHttpExchange implements PrometheusHttpExchange { private final TestHttpRequest request; @@ -216,7 +295,7 @@ public Map getResponseHeaders() { } public String getResponseBody() { - return rawResponseBody.toString(StandardCharsets.UTF_8); + return new String(rawResponseBody.toByteArray(), StandardCharsets.UTF_8); } public boolean isGzipCompressed() { diff --git a/prometheus-metrics-exporter-httpserver/pom.xml b/prometheus-metrics-exporter-httpserver/pom.xml index cca3c09e29..63e16f539b 100644 --- a/prometheus-metrics-exporter-httpserver/pom.xml +++ b/prometheus-metrics-exporter-httpserver/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-httpserver diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/BlockingRejectedExecutionHandler.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/BlockingRejectedExecutionHandler.java deleted file mode 100644 index 023d3f2f0a..0000000000 --- a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/BlockingRejectedExecutionHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.prometheus.metrics.exporter.httpserver; - -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; - -class BlockingRejectedExecutionHandler implements RejectedExecutionHandler { - - @Override - public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { - if (!threadPoolExecutor.isShutdown()) { - try { - threadPoolExecutor.getQueue().put(runnable); - } catch (InterruptedException ignored) { - // ignore - } - } - } -} diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HTTPServer.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HTTPServer.java index e93b122b0f..947a3f5fb6 100644 --- a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HTTPServer.java +++ b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HTTPServer.java @@ -12,14 +12,13 @@ import io.prometheus.metrics.model.registry.PrometheusRegistry; import java.io.Closeable; import java.io.IOException; -import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; @@ -39,6 +38,10 @@ @StableApi public class HTTPServer implements Closeable { + private static final int DEFAULT_MIN_THREADS = 10; + private static final int DEFAULT_MAX_THREADS = 10; + private static final int DEFAULT_QUEUE_SIZE = 100; + static { if (!System.getProperties().containsKey("sun.net.httpserver.maxReqTime")) { System.setProperty("sun.net.httpserver.maxReqTime", "60"); @@ -61,7 +64,8 @@ private HTTPServer( @Nullable String authenticatedSubjectAttributeName, @Nullable HttpHandler defaultHandler, @Nullable String metricsHandlerPath, - @Nullable Boolean registerHealthHandler) { + @Nullable Boolean registerHealthHandler, + HttpErrorHandlingPolicy errorHandlingPolicy) { if (httpServer.getAddress() == null) { throw new IllegalArgumentException("HttpServer hasn't been bound to an address"); } @@ -85,7 +89,7 @@ private HTTPServer( } registerHandler( metricsPath, - new MetricsHandler(config, registry), + new MetricsHandler(config, registry, errorHandlingPolicy), authenticator, authenticatedSubjectAttributeName); if (registerHealthHandler == null || registerHealthHandler) { @@ -153,22 +157,14 @@ public void handle(HttpExchange exchange) throws IOException { } } } else { - drainInputAndClose(exchange); + exchange.getRequestBody().close(); exchange.sendResponseHeaders(403, -1); + exchange.close(); } } }; } - private void drainInputAndClose(HttpExchange httpExchange) throws IOException { - InputStream inputStream = httpExchange.getRequestBody(); - byte[] b = new byte[4096]; - while (inputStream.read(b) != -1) { - // nop - } - inputStream.close(); - } - /** Stop the HTTP server. Same as {@link #close()}. */ public void stop() { close(); @@ -211,6 +207,7 @@ public static class Builder { @Nullable private HttpHandler defaultHandler = null; @Nullable private String metricsHandlerPath = null; @Nullable private Boolean registerHealthHandler = null; + private HttpErrorHandlingPolicy errorHandlingPolicy = HttpErrorHandlingPolicy.builder().build(); private Builder(PrometheusProperties config) { this.config = config; @@ -295,6 +292,20 @@ public Builder registerHealthHandler(boolean registerHealthHandler) { return this; } + /** + * Configure how exceptions raised while scraping metrics are reported to the client and + * optionally to a caller-supplied diagnostic sink. + * + *

Default is {@code HttpErrorHandlingPolicy.builder().build()}. + */ + public Builder errorHandlingPolicy(HttpErrorHandlingPolicy errorHandlingPolicy) { + if (errorHandlingPolicy == null) { + throw new NullPointerException("errorHandlingPolicy"); + } + this.errorHandlingPolicy = errorHandlingPolicy; + return this; + } + /** Build and start the HTTPServer. */ public HTTPServer buildAndStart() throws IOException { if (registry == null) { @@ -318,7 +329,8 @@ public HTTPServer buildAndStart() throws IOException { authenticatedSubjectAttributeName, defaultHandler, metricsHandlerPath, - registerHealthHandler); + registerHealthHandler, + errorHandlingPolicy); } private InetSocketAddress makeInetSocketAddress() { @@ -337,13 +349,12 @@ private ExecutorService makeExecutorService() { return executorService; } else { return new ThreadPoolExecutor( - 1, - 10, + DEFAULT_MIN_THREADS, + DEFAULT_MAX_THREADS, 120, TimeUnit.SECONDS, - new SynchronousQueue<>(true), - NamedDaemonThreadFactory.defaultThreadFactory(true), - new BlockingRejectedExecutionHandler()); + new ArrayBlockingQueue<>(DEFAULT_QUEUE_SIZE), + NamedDaemonThreadFactory.defaultThreadFactory(true)); } } diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpErrorHandlingPolicy.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpErrorHandlingPolicy.java new file mode 100644 index 0000000000..ba940749c7 --- /dev/null +++ b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpErrorHandlingPolicy.java @@ -0,0 +1,120 @@ +package io.prometheus.metrics.exporter.httpserver; + +import io.prometheus.metrics.annotations.StableApi; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.Nullable; + +/** + * Controls how the {@link HTTPServer} handles exceptions raised while scraping metrics. + * + *

The default policy built by {@link #builder()} does not expose exception details and does not + * report the exception. Configure the builder to route diagnostic details to an + * application-appropriate sink. + */ +@StableApi +public final class HttpErrorHandlingPolicy { + + private static final Logger logger = Logger.getLogger(HttpErrorHandlingPolicy.class.getName()); + + private static final byte[] GENERIC_RESPONSE = + ("An internal error occurred while scraping metrics. " + + "Configure an HTTP error reporter for details.\n") + .getBytes(StandardCharsets.UTF_8); + + private final boolean unsafeDebugResponse; + @Nullable private final Consumer errorReporter; + + private HttpErrorHandlingPolicy( + boolean unsafeDebugResponse, @Nullable Consumer errorReporter) { + this.unsafeDebugResponse = unsafeDebugResponse; + this.errorReporter = errorReporter; + } + + /** + * Returns a builder for configuring scrape error handling. + * + *

The builder defaults to a generic HTTP 500 response with no error reporter. This avoids + * exposing exception details to scrape clients or adding an implicit dependency on an + * application's logging configuration. + */ + public static Builder builder() { + return new Builder(); + } + + byte[] getErrorResponse(Exception exception) { + if (!unsafeDebugResponse) { + return GENERIC_RESPONSE; + } + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + printWriter.write("An Exception occurred while scraping metrics: "); + exception.printStackTrace(printWriter); + return stringWriter.toString().getBytes(StandardCharsets.UTF_8); + } + + void report(Exception error) { + if (errorReporter != null) { + errorReporter.accept(error); + } + } + + boolean hasErrorReporter() { + return errorReporter != null; + } + + /** + * Returns a synchronous reporter that logs scrape exceptions at {@link Level#SEVERE} using JUL. + * + *

Reporting is opt-in; the default policy does not log scrape exceptions. + */ + public static Consumer julReporter() { + return error -> logger.log(Level.SEVERE, "Prometheus scrape failed", error); + } + + /** Builder for {@link HttpErrorHandlingPolicy}. */ + public static final class Builder { + + private boolean unsafeDebugResponse = false; + @Nullable private Consumer errorReporter; + + private Builder() {} + + /** + * Pass scrape exceptions to {@code errorReporter}. + * + *

The reporter runs synchronously on the HTTP request thread. It should return promptly and + * must be safe to call concurrently. Runtime exceptions thrown by the reporter are isolated + * from HTTP response handling. + */ + public Builder errorReporter(Consumer errorReporter) { + if (errorReporter == null) { + throw new NullPointerException("errorReporter"); + } + this.errorReporter = errorReporter; + return this; + } + + /** + * Configure whether the HTTP 500 response includes the full exception stack trace. + * + *

Security warning: Setting this to {@code true} exposes internal exception + * information to scrape clients. Do not enable it for endpoints reachable by untrusted clients. + * + *

This setting is independent of {@link #errorReporter(Consumer)}. + */ + public Builder unsafeDebugResponse(boolean unsafeDebugResponse) { + this.unsafeDebugResponse = unsafeDebugResponse; + return this; + } + + /** Build the policy. */ + public HttpErrorHandlingPolicy build() { + return new HttpErrorHandlingPolicy(unsafeDebugResponse, errorReporter); + } + } +} diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java index df99837cbf..a2aa4ef669 100644 --- a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java +++ b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapter.java @@ -6,10 +6,7 @@ import io.prometheus.metrics.exporter.common.PrometheusHttpResponse; import java.io.IOException; import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.StringWriter; import java.net.URI; -import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Enumeration; import java.util.List; @@ -18,13 +15,22 @@ public class HttpExchangeAdapter implements PrometheusHttpExchange { + private static final Logger logger = Logger.getLogger(HttpExchangeAdapter.class.getName()); + private final HttpExchange httpExchange; + private final HttpErrorHandlingPolicy errorHandlingPolicy; private final HttpRequest request = new HttpRequest(); private final HttpResponse response = new HttpResponse(); private volatile boolean responseSent = false; public HttpExchangeAdapter(HttpExchange httpExchange) { + this(httpExchange, HttpErrorHandlingPolicy.builder().build()); + } + + public HttpExchangeAdapter( + HttpExchange httpExchange, HttpErrorHandlingPolicy errorHandlingPolicy) { this.httpExchange = httpExchange; + this.errorHandlingPolicy = errorHandlingPolicy; } public class HttpRequest implements PrometheusHttpRequest { @@ -92,52 +98,59 @@ public HttpResponse getResponse() { @Override public void handleException(IOException e) throws IOException { - sendErrorResponseWithStackTrace(e); + sendErrorResponse(e); } @Override public void handleException(RuntimeException e) { - sendErrorResponseWithStackTrace(e); + sendErrorResponse(e); } - private void sendErrorResponseWithStackTrace(Exception requestHandlerException) { + private void sendErrorResponse(Exception requestHandlerException) { if (!responseSent) { responseSent = true; + byte[] errorResponse = errorHandlingPolicy.getErrorResponse(requestHandlerException); try { - StringWriter stringWriter = new StringWriter(); - PrintWriter printWriter = new PrintWriter(stringWriter); - printWriter.write("An Exception occurred while scraping metrics: "); - requestHandlerException.printStackTrace(new PrintWriter(printWriter)); - byte[] stackTrace = stringWriter.toString().getBytes(StandardCharsets.UTF_8); httpExchange.getResponseHeaders().set("Content-Type", "text/plain; charset=utf-8"); - httpExchange.sendResponseHeaders(500, stackTrace.length); - httpExchange.getResponseBody().write(stackTrace); + httpExchange.sendResponseHeaders(500, errorResponse.length); + httpExchange.getResponseBody().write(errorResponse); } catch (IOException errorWriterException) { - // We want to avoid logging so that we don't mess with application logs when the HTTPServer - // is used in a Java agent. - // However, if we can't even send an error response to the client there's nothing we can do - // but logging a message. - Logger.getLogger(this.getClass().getName()) - .log( - Level.SEVERE, - "The Prometheus metrics HTTPServer caught an Exception during scrape and " - + "failed to send an error response to the client.", - errorWriterException); - Logger.getLogger(this.getClass().getName()) - .log( - Level.SEVERE, - "Original Exception that caused the Prometheus scrape error:", - requestHandlerException); + // If we can't even send an error response to the client, logging is the only remaining + // signal. + logger.log( + Level.SEVERE, + "The Prometheus metrics HTTPServer caught an Exception during scrape and " + + "failed to send an error response to the client.", + errorWriterException); + if (!errorHandlingPolicy.hasErrorReporter()) { + logger.log( + Level.SEVERE, + "Original Exception that caused the Prometheus scrape error:", + requestHandlerException); + } } + reportException(requestHandlerException); } else { // If the exception occurs after response headers have been sent, it's too late to respond // with HTTP 500. - Logger.getLogger(this.getClass().getName()) - .log( - Level.SEVERE, - "The Prometheus metrics HTTPServer caught an Exception while trying to send " - + "the metrics response.", - requestHandlerException); + if (errorHandlingPolicy.hasErrorReporter()) { + reportException(requestHandlerException); + } else { + logger.log( + Level.SEVERE, + "The Prometheus metrics HTTPServer caught an Exception while trying to send " + + "the metrics response.", + requestHandlerException); + } + } + } + + private void reportException(Exception requestHandlerException) { + try { + errorHandlingPolicy.report(requestHandlerException); + } catch (RuntimeException ignored) { + // A caller-supplied reporter must not prevent the safe error response from being sent or + // implicitly fall back to application logging. } } diff --git a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/MetricsHandler.java b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/MetricsHandler.java index 175696b68d..21ce8b5e1f 100644 --- a/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/MetricsHandler.java +++ b/prometheus-metrics-exporter-httpserver/src/main/java/io/prometheus/metrics/exporter/httpserver/MetricsHandler.java @@ -13,25 +13,40 @@ public class MetricsHandler implements HttpHandler { private final PrometheusScrapeHandler prometheusScrapeHandler; + private final HttpErrorHandlingPolicy errorHandlingPolicy; public MetricsHandler() { - prometheusScrapeHandler = new PrometheusScrapeHandler(); + this(new PrometheusScrapeHandler(), HttpErrorHandlingPolicy.builder().build()); } public MetricsHandler(PrometheusRegistry registry) { - prometheusScrapeHandler = new PrometheusScrapeHandler(registry); + this(new PrometheusScrapeHandler(registry), HttpErrorHandlingPolicy.builder().build()); } public MetricsHandler(PrometheusProperties config) { - prometheusScrapeHandler = new PrometheusScrapeHandler(config); + this(new PrometheusScrapeHandler(config), HttpErrorHandlingPolicy.builder().build()); } public MetricsHandler(PrometheusProperties config, PrometheusRegistry registry) { - prometheusScrapeHandler = new PrometheusScrapeHandler(config, registry); + this(new PrometheusScrapeHandler(config, registry), HttpErrorHandlingPolicy.builder().build()); + } + + public MetricsHandler( + PrometheusProperties config, + PrometheusRegistry registry, + HttpErrorHandlingPolicy errorHandlingPolicy) { + this(new PrometheusScrapeHandler(config, registry), errorHandlingPolicy); + } + + private MetricsHandler( + PrometheusScrapeHandler prometheusScrapeHandler, + HttpErrorHandlingPolicy errorHandlingPolicy) { + this.prometheusScrapeHandler = prometheusScrapeHandler; + this.errorHandlingPolicy = errorHandlingPolicy; } @Override public void handle(HttpExchange t) throws IOException { - prometheusScrapeHandler.handleRequest(new HttpExchangeAdapter(t)); + prometheusScrapeHandler.handleRequest(new HttpExchangeAdapter(t, errorHandlingPolicy)); } } diff --git a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HTTPServerTest.java b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HTTPServerTest.java index ff2d550487..c833403a38 100644 --- a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HTTPServerTest.java +++ b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HTTPServerTest.java @@ -25,6 +25,7 @@ import java.security.Principal; import java.util.List; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; import javax.net.ssl.SSLContext; import javax.security.auth.Subject; import org.junit.jupiter.api.BeforeEach; @@ -45,7 +46,7 @@ void setUp() { } @Test - public void testSubjectDoAs() throws Exception { + void testSubjectDoAs() throws Exception { final String user = "joe"; final Subject subject = new Subject(); subject.getPrincipals().add(() -> user); @@ -158,6 +159,22 @@ void metricsCustomRootPath() throws Exception { "my_counter_total 1.0"); } + @Test + void defaultExecutorHasBoundedQueueAndNonBlockingRejection() throws Exception { + HTTPServer server = HTTPServer.builder().port(0).buildAndStart(); + try { + assertThat(server.executorService).isInstanceOf(ThreadPoolExecutor.class); + ThreadPoolExecutor executor = (ThreadPoolExecutor) server.executorService; + assertThat(executor.getCorePoolSize()).isEqualTo(10); + assertThat(executor.getMaximumPoolSize()).isEqualTo(10); + assertThat(executor.getQueue().remainingCapacity()).isEqualTo(100); + assertThat(executor.getRejectedExecutionHandler()) + .isInstanceOf(ThreadPoolExecutor.AbortPolicy.class); + } finally { + server.stop(); + } + } + @Test void registryThrows() throws Exception { HTTPServer server = @@ -171,7 +188,7 @@ public MetricSnapshots scrape(PrometheusScrapeRequest scrapeRequest) { } }) .buildAndStart(); - run(server, "/metrics", 500, "An Exception occurred while scraping metrics"); + run(server, "/metrics", 500, "An internal error occurred while scraping metrics"); } @Test diff --git a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapterTest.java b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapterTest.java index 19bc0d66e9..7d2ffecbe6 100644 --- a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapterTest.java +++ b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/HttpExchangeAdapterTest.java @@ -2,12 +2,21 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; +import java.io.ByteArrayOutputStream; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; import org.junit.jupiter.api.Test; class HttpExchangeAdapterTest { @@ -46,4 +55,172 @@ void getHeadersWhenNotPresent() { HttpExchangeAdapter adapter = new HttpExchangeAdapter(httpExchange); assertThat(adapter.getRequest().getHeaders("Accept").hasMoreElements()).isFalse(); } + + @Test + void handleExceptionReturnsGenericMessageWithoutStackTrace() throws Exception { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + HttpExchangeAdapter adapter = new HttpExchangeAdapter(httpExchange); + + adapter.handleException(new IllegalStateException("secret failure")); + + String body = new String(responseBody.toByteArray(), StandardCharsets.UTF_8); + assertThat(body) + .isEqualTo( + "An internal error occurred while scraping metrics. " + + "Configure an HTTP error reporter for details.\n"); + assertThat(body).doesNotContain("IllegalStateException"); + assertThat(body).doesNotContain("secret failure"); + assertThat(body).doesNotContain("at "); + assertThat(headers.getFirst("Content-Type")).isEqualTo("text/plain; charset=utf-8"); + verify(httpExchange).sendResponseHeaders(500, body.getBytes(StandardCharsets.UTF_8).length); + } + + @Test + void handleExceptionInvokesConfiguredReporter() { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + AtomicReference reportedError = new AtomicReference<>(); + HttpExchangeAdapter adapter = + new HttpExchangeAdapter( + httpExchange, + HttpErrorHandlingPolicy.builder().errorReporter(reportedError::set).build()); + IllegalStateException scrapeException = new IllegalStateException("secret failure"); + + adapter.handleException(scrapeException); + + assertThat(reportedError.get()).isSameAs(scrapeException); + } + + @Test + void reporterRunsAfterErrorResponseWasSent() throws Exception { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + AtomicBoolean reporterRanAfterResponse = new AtomicBoolean(); + HttpExchangeAdapter adapter = + new HttpExchangeAdapter( + httpExchange, + HttpErrorHandlingPolicy.builder() + .errorReporter(ignored -> reporterRanAfterResponse.set(responseBody.size() > 0)) + .build()); + + adapter.handleException(new IllegalStateException("secret failure")); + + assertThat(reporterRanAfterResponse).isTrue(); + } + + @Test + void reporterFailureDoesNotPreventGenericResponse() { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + HttpExchangeAdapter adapter = + new HttpExchangeAdapter( + httpExchange, + HttpErrorHandlingPolicy.builder() + .errorReporter( + ignored -> { + throw new IllegalStateException("reporter failed"); + }) + .build()); + + adapter.handleException(new IllegalStateException("secret failure")); + + String body = new String(responseBody.toByteArray(), StandardCharsets.UTF_8); + assertThat(body) + .contains("Configure an HTTP error reporter for details.") + .doesNotContain("secret failure") + .doesNotContain("reporter failed"); + } + + @Test + void unsafeDebugResponseIncludesStackTraceAndInvokesReporter() { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + AtomicReference reportedError = new AtomicReference<>(); + HttpExchangeAdapter adapter = + new HttpExchangeAdapter( + httpExchange, + HttpErrorHandlingPolicy.builder() + .unsafeDebugResponse(true) + .errorReporter(reportedError::set) + .build()); + + IllegalStateException scrapeException = new IllegalStateException("diagnostic detail"); + adapter.handleException(scrapeException); + + String body = new String(responseBody.toByteArray(), StandardCharsets.UTF_8); + assertThat(body) + .contains("An Exception occurred while scraping metrics:") + .contains("IllegalStateException: diagnostic detail") + .contains("at "); + assertThat(reportedError.get()).isSameAs(scrapeException); + } + + @Test + void configuredReporterHandlesExceptionAfterResponseHeadersWereSent() throws Exception { + HttpExchange httpExchange = mock(HttpExchange.class); + Headers headers = new Headers(); + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + when(httpExchange.getResponseHeaders()).thenReturn(headers); + when(httpExchange.getResponseBody()).thenReturn(responseBody); + AtomicReference reportedError = new AtomicReference<>(); + HttpExchangeAdapter adapter = + new HttpExchangeAdapter( + httpExchange, + HttpErrorHandlingPolicy.builder().errorReporter(reportedError::set).build()); + + adapter.getResponse().sendHeadersAndGetBody(200, 0); + IllegalStateException scrapeException = new IllegalStateException("secret failure"); + adapter.handleException(scrapeException); + + assertThat(reportedError.get()).isSameAs(scrapeException); + verify(httpExchange).sendResponseHeaders(200, 0); + } + + @Test + void julReporterLogsAtSevere() { + Logger logger = Logger.getLogger(HttpErrorHandlingPolicy.class.getName()); + AtomicReference record = new AtomicReference<>(); + Handler handler = + new Handler() { + @Override + public void publish(LogRecord logRecord) { + record.set(logRecord); + } + + @Override + public void flush() {} + + @Override + public void close() {} + }; + boolean useParentHandlers = logger.getUseParentHandlers(); + logger.setUseParentHandlers(false); + logger.addHandler(handler); + try { + IllegalStateException scrapeException = new IllegalStateException("secret failure"); + HttpErrorHandlingPolicy.julReporter().accept(scrapeException); + assertThat(record.get()).isNotNull(); + assertThat(record.get().getLevel()).isEqualTo(Level.SEVERE); + assertThat(record.get().getThrown()).isSameAs(scrapeException); + } finally { + logger.removeHandler(handler); + logger.setUseParentHandlers(useParentHandlers); + } + } } diff --git a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/MetricsHandlerTest.java b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/MetricsHandlerTest.java index 7032238618..99078040a3 100644 --- a/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/MetricsHandlerTest.java +++ b/prometheus-metrics-exporter-httpserver/src/test/java/io/prometheus/metrics/exporter/httpserver/MetricsHandlerTest.java @@ -33,4 +33,14 @@ void ctor() { verify(properties).getExporterProperties(); } + + @Test + void policyConfiguringCtorIsPublicAndUsesPolicy() { + PrometheusRegistry registry = new PrometheusRegistry(); + HttpErrorHandlingPolicy policy = HttpErrorHandlingPolicy.builder().build(); + + assertThat(new MetricsHandler(PrometheusProperties.get(), registry, policy)) + .extracting("errorHandlingPolicy") + .isSameAs(policy); + } } diff --git a/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml b/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml index b40b127828..55ee186b63 100644 --- a/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml +++ b/prometheus-metrics-exporter-opentelemetry-otel-agent-resources/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-opentelemetry-otel-agent-resources diff --git a/prometheus-metrics-exporter-opentelemetry-shaded/pom.xml b/prometheus-metrics-exporter-opentelemetry-shaded/pom.xml index 5f8eca6ea9..ea7a909c4e 100644 --- a/prometheus-metrics-exporter-opentelemetry-shaded/pom.xml +++ b/prometheus-metrics-exporter-opentelemetry-shaded/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-opentelemetry diff --git a/prometheus-metrics-exporter-opentelemetry/pom.xml b/prometheus-metrics-exporter-opentelemetry/pom.xml index e2845631bf..37c00b271d 100644 --- a/prometheus-metrics-exporter-opentelemetry/pom.xml +++ b/prometheus-metrics-exporter-opentelemetry/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-opentelemetry-no-otel diff --git a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfig.java b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfig.java index 2ea96e3c39..267ff23ad1 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfig.java +++ b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfig.java @@ -40,8 +40,10 @@ static MetricReader createReader( MetricReader reader = requireNonNull(readerRef.get()); boolean preserveNames = resolvePreserveNames(builder, config); reader.register( - new PrometheusMetricProducer( - registry, instrumentationScopeInfo, getResourceField(sdk), preserveNames)); + PrometheusMetricProducer.builder( + registry, instrumentationScopeInfo, getResourceField(sdk), preserveNames) + .exporterFilterProperties(config.getExporterFilterProperties()) + .build()); return reader; } diff --git a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/PrometheusMetricProducer.java b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/PrometheusMetricProducer.java index 886cdd85cf..2c3e399f7c 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/PrometheusMetricProducer.java +++ b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/PrometheusMetricProducer.java @@ -7,7 +7,9 @@ import io.opentelemetry.sdk.metrics.export.CollectionRegistration; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.ResourceBuilder; +import io.prometheus.metrics.config.ExporterFilterProperties; import io.prometheus.metrics.exporter.opentelemetry.otelmodel.MetricDataFactory; +import io.prometheus.metrics.model.registry.MetricNameFilter; import io.prometheus.metrics.model.registry.PrometheusRegistry; import io.prometheus.metrics.model.snapshots.CounterSnapshot; import io.prometheus.metrics.model.snapshots.GaugeSnapshot; @@ -22,6 +24,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.function.Predicate; import javax.annotation.Nullable; class PrometheusMetricProducer implements CollectionRegistration { @@ -30,29 +33,65 @@ class PrometheusMetricProducer implements CollectionRegistration { private final Resource resource; private final InstrumentationScopeInfo instrumentationScopeInfo; private final boolean preserveNames; + @Nullable private final Predicate nameFilter; - public PrometheusMetricProducer( + private PrometheusMetricProducer( PrometheusRegistry registry, InstrumentationScopeInfo instrumentationScopeInfo, Resource resource, - boolean preserveNames) { + boolean preserveNames, + @Nullable Predicate nameFilter) { this.registry = registry; this.instrumentationScopeInfo = instrumentationScopeInfo; this.resource = resource; this.preserveNames = preserveNames; + this.nameFilter = nameFilter; + } + + /** + * Creates a builder for a producer with no metric name filtering by default, i.e. all metrics in + * {@code registry} are exported unless filter properties are configured on the builder. + */ + static Builder builder( + PrometheusRegistry registry, + InstrumentationScopeInfo instrumentationScopeInfo, + Resource resource, + boolean preserveNames) { + return new Builder(registry, instrumentationScopeInfo, resource, preserveNames); + } + + /** + * Builds a name filter from {@code io.prometheus.exporter.filter.*} properties, mirroring how + * {@code PrometheusScrapeHandler} builds its filter for the Servlet/HTTPServer exporters so that + * filtering config behaves consistently across exporters. + * + *

OpenTelemetry's own Views API also supports filtering and aggregation, and may be preferable + * for OpenTelemetry-specific deployments; this filter is intended for users who want the same + * {@code io.prometheus.exporter.filter.*} config to apply regardless of which exporter they use. + * + * @return {@code null} if no filter properties are set, to avoid the overhead of testing every + * metric name against a filter that matches everything. + */ + @Nullable + private static Predicate makeNameFilter(ExporterFilterProperties props) { + if (props.getAllowedMetricNames() == null + && props.getExcludedMetricNames() == null + && props.getAllowedMetricNamePrefixes() == null + && props.getExcludedMetricNamePrefixes() == null) { + return null; + } + return MetricNameFilter.builder() + .nameMustBeEqualTo(props.getAllowedMetricNames()) + .nameMustNotBeEqualTo(props.getExcludedMetricNames()) + .nameMustStartWith(props.getAllowedMetricNamePrefixes()) + .nameMustNotStartWith(props.getExcludedMetricNamePrefixes()) + .build(); } @Override public Collection collectAllMetrics() { - // Note: Currently all metrics from the registry are exported. To add metric filtering - // similar to the Servlet exporter, one could: - // 1. Add filter properties to ExporterOpenTelemetryProperties (allowedNames, excludedNames, - // etc.) - // 2. Convert these properties to a Predicate using MetricNameFilter.builder() - // 3. Call registry.scrape(filter) instead of registry.scrape() - // OpenTelemetry also provides its own Views API for filtering and aggregation, which may be - // preferred for OpenTelemetry-specific deployments. - MetricSnapshots snapshots = registry.scrape(); + MetricSnapshots snapshots = + nameFilter != null ? registry.scrape(nameFilter) : registry.scrape(); Resource resourceWithTargetInfo = resource.merge(resourceFromTargetInfo(snapshots)); InstrumentationScopeInfo scopeFromInfo = instrumentationScopeFromOtelScopeInfo(snapshots); List result = new ArrayList<>(snapshots.size()); @@ -142,4 +181,37 @@ private void addUnlessNull(List result, @Nullable MetricData data) { result.add(data); } } + + static class Builder { + private final PrometheusRegistry registry; + private final Resource resource; + private final InstrumentationScopeInfo instrumentationScopeInfo; + private final boolean preserveNames; + private ExporterFilterProperties filterProperties = ExporterFilterProperties.builder().build(); + + private Builder( + PrometheusRegistry registry, + InstrumentationScopeInfo instrumentationScopeInfo, + Resource resource, + boolean preserveNames) { + this.registry = registry; + this.instrumentationScopeInfo = instrumentationScopeInfo; + this.resource = resource; + this.preserveNames = preserveNames; + } + + Builder exporterFilterProperties(ExporterFilterProperties filterProperties) { + this.filterProperties = filterProperties; + return this; + } + + PrometheusMetricProducer build() { + return new PrometheusMetricProducer( + registry, + instrumentationScopeInfo, + resource, + preserveNames, + makeNameFilter(filterProperties)); + } + } } diff --git a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogram.java b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogram.java index 1a2152fe06..d3ac7dc5f2 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogram.java +++ b/prometheus-metrics-exporter-opentelemetry/src/main/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogram.java @@ -67,10 +67,19 @@ private long calculateCount(ClassicHistogramBuckets buckets) { return result; } + /** + * OpenTelemetry explicit bucket boundaries are finite: the {@code +Inf} bucket is implicit, so + * {@code counts} has one more entry than {@code boundaries}. The count of the {@code +Inf} bucket + * is kept as the last element of {@link #makeCounts(ClassicHistogramBuckets)}. + */ private List makeBoundaries(ClassicHistogramBuckets buckets) { List result = new ArrayList<>(buckets.size()); for (int i = 0; i < buckets.size(); i++) { - result.add(buckets.getUpperBound(i)); + double upperBound = buckets.getUpperBound(i); + if (upperBound == Double.POSITIVE_INFINITY) { + continue; + } + result.add(upperBound); } return result; } diff --git a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExemplarTest.java b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExemplarTest.java index c21f1ead4c..c764f3e830 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExemplarTest.java +++ b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExemplarTest.java @@ -13,6 +13,7 @@ import static org.awaitility.Awaitility.await; import com.github.tomakehurst.wiremock.http.Request; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; import com.github.tomakehurst.wiremock.matching.MatchResult; import com.github.tomakehurst.wiremock.matching.ValueMatcher; @@ -34,7 +35,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -@WireMockTest(httpPort = 4317) +@WireMockTest class ExemplarTest { private static final String ENDPOINT_PATH = "/v1/metrics"; private static final int TIMEOUT = 3; @@ -45,10 +46,10 @@ class ExemplarTest { private OpenTelemetryExporter openTelemetryExporter; @BeforeEach - void setUp() { + void setUp(WireMockRuntimeInfo wireMockRuntimeInfo) { openTelemetryExporter = OpenTelemetryExporter.builder() - .endpoint("http://localhost:4317") + .endpoint(wireMockRuntimeInfo.getHttpBaseUrl()) .protocol("http/protobuf") .intervalSeconds(1) .buildAndStart(); diff --git a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExportTest.java b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExportTest.java index 0332eb5747..467015194b 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExportTest.java +++ b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/ExportTest.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension; +import io.prometheus.metrics.config.ExporterFilterProperties; import io.prometheus.metrics.core.metrics.Counter; import io.prometheus.metrics.core.metrics.Gauge; import io.prometheus.metrics.core.metrics.Histogram; @@ -46,11 +47,12 @@ void setUp() throws IllegalAccessException, NoSuchFieldException { MetricReader reader = (MetricReader) field.get(testing); PrometheusMetricProducer prometheusMetricProducer = - new PrometheusMetricProducer( - registry, - InstrumentationScopeInfo.create("test"), - Resource.create(Attributes.builder().put("staticRes", "value").build()), - false); + PrometheusMetricProducer.builder( + registry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + false) + .build(); reader.register(prometheusMetricProducer); } @@ -132,7 +134,7 @@ void histogram() { assertThat(p.getEpochNanos()).isPositive(); }) .hasExemplars() - .hasBucketBoundaries(1, 2, 3, Double.POSITIVE_INFINITY) + .hasBucketBoundaries(1, 2, 3) .hasBucketCounts(1, 0, 0, 0))); } @@ -332,11 +334,12 @@ void preserveNamesWithUnit() { InMemoryMetricReader reader = InMemoryMetricReader.create(); PrometheusRegistry preserveRegistry = new PrometheusRegistry(); reader.register( - new PrometheusMetricProducer( - preserveRegistry, - InstrumentationScopeInfo.create("test"), - Resource.create(Attributes.builder().put("staticRes", "value").build()), - true)); + PrometheusMetricProducer.builder( + preserveRegistry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + true) + .build()); Counter.builder().name("req").unit(Unit.BYTES).register(preserveRegistry).inc(); @@ -350,11 +353,12 @@ void preserveNamesWithUnitAlreadyInName() { InMemoryMetricReader reader = InMemoryMetricReader.create(); PrometheusRegistry preserveRegistry = new PrometheusRegistry(); reader.register( - new PrometheusMetricProducer( - preserveRegistry, - InstrumentationScopeInfo.create("test"), - Resource.create(Attributes.builder().put("staticRes", "value").build()), - true)); + PrometheusMetricProducer.builder( + preserveRegistry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + true) + .build()); Counter.builder().name("req_bytes").unit(Unit.BYTES).register(preserveRegistry).inc(); @@ -368,11 +372,12 @@ void preserveNamesWithoutUnit() { InMemoryMetricReader reader = InMemoryMetricReader.create(); PrometheusRegistry preserveRegistry = new PrometheusRegistry(); reader.register( - new PrometheusMetricProducer( - preserveRegistry, - InstrumentationScopeInfo.create("test"), - Resource.create(Attributes.builder().put("staticRes", "value").build()), - true)); + PrometheusMetricProducer.builder( + preserveRegistry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + true) + .build()); Counter.builder().name("events_total").register(preserveRegistry).inc(); @@ -381,6 +386,50 @@ void preserveNamesWithoutUnit() { OpenTelemetryAssertions.assertThat(metrics.get(0)).hasName("events_total"); } + @Test + void metricNameFilterExcludedNames() { + InMemoryMetricReader reader = InMemoryMetricReader.create(); + PrometheusRegistry filteredRegistry = new PrometheusRegistry(); + reader.register( + PrometheusMetricProducer.builder( + filteredRegistry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + false) + .exporterFilterProperties( + ExporterFilterProperties.builder().excludedNames("secret_total").build()) + .build()); + + Counter.builder().name("secret").register(filteredRegistry).inc(); + Counter.builder().name("public").register(filteredRegistry).inc(); + + List metrics = new ArrayList<>(reader.collectAllMetrics()); + assertThat(metrics).hasSize(1); + OpenTelemetryAssertions.assertThat(metrics.get(0)).hasName("public"); + } + + @Test + void metricNameFilterAllowedPrefixes() { + InMemoryMetricReader reader = InMemoryMetricReader.create(); + PrometheusRegistry filteredRegistry = new PrometheusRegistry(); + reader.register( + PrometheusMetricProducer.builder( + filteredRegistry, + InstrumentationScopeInfo.create("test"), + Resource.create(Attributes.builder().put("staticRes", "value").build()), + false) + .exporterFilterProperties( + ExporterFilterProperties.builder().allowedPrefixes("http_").build()) + .build()); + + Counter.builder().name("http_requests").register(filteredRegistry).inc(); + Counter.builder().name("jvm_threads").register(filteredRegistry).inc(); + + List metrics = new ArrayList<>(reader.collectAllMetrics()); + assertThat(metrics).hasSize(1); + OpenTelemetryAssertions.assertThat(metrics.get(0)).hasName("http_requests"); + } + private MetricAssert metricAssert() { List metrics = testing.getMetrics(); assertThat(metrics).hasSize(1); diff --git a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfigTest.java b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfigTest.java index a81aec4408..19a737122b 100644 --- a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfigTest.java +++ b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/OtelAutoConfigTest.java @@ -7,11 +7,21 @@ import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.CollectionRegistration; +import io.opentelemetry.sdk.metrics.export.MetricReader; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; +import io.prometheus.metrics.config.ExporterFilterProperties; import io.prometheus.metrics.config.ExporterOpenTelemetryProperties; import io.prometheus.metrics.config.PrometheusProperties; import io.prometheus.metrics.config.PrometheusPropertiesLoader; +import io.prometheus.metrics.core.metrics.Counter; +import io.prometheus.metrics.model.registry.PrometheusRegistry; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; @@ -67,21 +77,16 @@ public static Stream testCases() { "values from builder", new TestCase() .expectedProperties( - Map.of( - "otel.exporter.otlp.protocol", - Optional.of("http/protobuf"), - "otel.exporter.otlp.endpoint", - Optional.of("http://builder:4318"), - "otel.exporter.otlp.headers", - Optional.of("h=builder-v"), - "otel.metric.export.interval", - Optional.of("2s"), - "otel.exporter.otlp.timeout", - Optional.of("3s"), - "otel.service.name", - Optional.of("builder-service"))) + ImmutableMap.>builder() + .put("otel.exporter.otlp.protocol", Optional.of("http/protobuf")) + .put("otel.exporter.otlp.endpoint", Optional.of("http://builder:4318")) + .put("otel.exporter.otlp.headers", Optional.of("h=builder-v")) + .put("otel.metric.export.interval", Optional.of("2s")) + .put("otel.exporter.otlp.timeout", Optional.of("3s")) + .put("otel.service.name", Optional.of("builder-service")) + .build()) .expectedResourceAttributes( - Map.of( + ImmutableMap.of( "key", "builder-value", "service.name", @@ -316,6 +321,61 @@ void resolvePreserveNamesFromConfig() { assertThat(OtelAutoConfig.resolvePreserveNames(builder, config)).isTrue(); } + @Test + void createReaderUsesExporterFilterProperties() throws IllegalAccessException { + PrometheusRegistry registry = new PrometheusRegistry(); + PrometheusProperties config = + PrometheusProperties.builder() + .exporterFilterProperties( + ExporterFilterProperties.builder().excludedNames("secret_total").build()) + .build(); + OpenTelemetryExporter.Builder builder = + OpenTelemetryExporter.builder(config).registry(registry); + MetricReader reader = OtelAutoConfig.createReader(builder, config, registry); + + try { + Counter.builder().name("secret").register(registry).inc(); + Counter.builder().name("public").register(registry).inc(); + + PrometheusMetricProducer producer = findPrometheusMetricProducer(reader); + List metrics = new ArrayList<>(producer.collectAllMetrics()); + assertThat(metrics).hasSize(1); + OpenTelemetryAssertions.assertThat(metrics.get(0)).hasName("public"); + } finally { + reader.shutdown(); + } + } + + // MetricReader does not expose registered CollectionRegistrations, so this test locates the + // registered PrometheusMetricProducer reflectively to verify that OtelAutoConfig wires exporter + // filter properties through to it. + private static PrometheusMetricProducer findPrometheusMetricProducer(Object object) + throws IllegalAccessException { + assertThat(object).isNotNull(); + for (Field field : object.getClass().getDeclaredFields()) { + field.setAccessible(true); + Object value = field.get(object); + if (value instanceof PrometheusMetricProducer) { + return (PrometheusMetricProducer) value; + } + if (value instanceof CollectionRegistration) { + return findPrometheusMetricProducer(value); + } + if (value instanceof Iterable) { + for (Object element : (Iterable) value) { + if (element instanceof PrometheusMetricProducer) { + return (PrometheusMetricProducer) element; + } + if (element instanceof CollectionRegistration) { + return findPrometheusMetricProducer(element); + } + } + } + } + throw new AssertionError( + "Did not find PrometheusMetricProducer in " + object.getClass().getName()); + } + private static ExporterOpenTelemetryProperties getExporterOpenTelemetryProperties( TestCase testCase) { if (testCase.propertiesBuilder == null) { diff --git a/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogramTest.java b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogramTest.java new file mode 100644 index 0000000000..5ab0f3be55 --- /dev/null +++ b/prometheus-metrics-exporter-opentelemetry/src/test/java/io/prometheus/metrics/exporter/opentelemetry/otelmodel/PrometheusClassicHistogramTest.java @@ -0,0 +1,97 @@ +package io.prometheus.metrics.exporter.opentelemetry.otelmodel; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +import io.opentelemetry.exporter.internal.otlp.metrics.MetricsRequestMarshaler; +import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; +import io.opentelemetry.proto.metrics.v1.HistogramDataPoint; +import io.opentelemetry.sdk.common.InstrumentationScopeInfo; +import io.opentelemetry.sdk.metrics.data.HistogramPointData; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.internal.data.ImmutableHistogramPointData; +import io.opentelemetry.sdk.resources.Resource; +import io.prometheus.metrics.model.snapshots.ClassicHistogramBuckets; +import io.prometheus.metrics.model.snapshots.HistogramSnapshot; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.Objects; +import org.junit.jupiter.api.Test; + +class PrometheusClassicHistogramTest { + + // Prometheus classic buckets: le=1 -> 2, le=5 -> 3, le=+Inf -> 4 (non-cumulative counts). + private static final HistogramSnapshot SNAPSHOT = + HistogramSnapshot.builder() + .name("request_size_bytes") + .dataPoint( + HistogramSnapshot.HistogramDataPointSnapshot.builder() + .classicHistogramBuckets( + ClassicHistogramBuckets.of( + new double[] {1.0, 5.0, Double.POSITIVE_INFINITY}, new long[] {2, 3, 4})) + .sum(42.0) + .build()) + .build(); + + private static HistogramPointData toOtelPoint() { + PrometheusClassicHistogram histogram = new PrometheusClassicHistogram(SNAPSHOT, 1_000L); + assertThat(histogram.getPoints()).hasSize(1); + return histogram.getPoints().iterator().next(); + } + + @Test + void infBucketIsImplicitInOtelBoundaries() { + HistogramPointData point = toOtelPoint(); + // OTel explicit bounds are finite; the +Inf bucket is implicit, so counts has one more entry. + assertThat(point.getBoundaries()).containsExactly(1.0, 5.0); + assertThat(point.getBoundaries()).noneMatch(bound -> bound.isInfinite()); + assertThat(point.getCounts()).containsExactly(2L, 3L, 4L); + assertThat(point.getCounts()).hasSize(point.getBoundaries().size() + 1); + assertThat(point.getCount()).isEqualTo(9); + assertThat(point.getSum()).isEqualTo(42.0); + } + + @Test + void pointSatisfiesOtelSdkHistogramContract() { + HistogramPointData point = toOtelPoint(); + // The OTel SDK's own histogram point implementation validates the data model contract. + assertThatCode( + () -> + ImmutableHistogramPointData.create( + point.getStartEpochNanos(), + point.getEpochNanos(), + point.getAttributes(), + point.getSum(), + point.hasMin(), + point.getMin(), + point.hasMax(), + point.getMax(), + point.getBoundaries(), + point.getCounts(), + point.getExemplars())) + .doesNotThrowAnyException(); + } + + @Test + void otlpExplicitBoundsAreFinite() throws IOException { + MetricDataFactory factory = + new MetricDataFactory( + Resource.empty(), InstrumentationScopeInfo.create("test"), 1_000L, false); + MetricData metricData = Objects.requireNonNull(factory.create(SNAPSHOT)); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + MetricsRequestMarshaler.create(Collections.singletonList(metricData)).writeBinaryTo(out); + HistogramDataPoint dataPoint = + ExportMetricsServiceRequest.parseFrom(out.toByteArray()) + .getResourceMetrics(0) + .getInstrumentationLibraryMetrics(0) + .getMetrics(0) + .getHistogram() + .getDataPoints(0); + + assertThat(dataPoint.getExplicitBoundsList()).containsExactly(1.0, 5.0); + assertThat(dataPoint.getBucketCountsList()).containsExactly(2L, 3L, 4L); + assertThat(dataPoint.getCount()).isEqualTo(9); + } +} diff --git a/prometheus-metrics-exporter-pushgateway/pom.xml b/prometheus-metrics-exporter-pushgateway/pom.xml index b83119bbb8..d1ea4e5e96 100644 --- a/prometheus-metrics-exporter-pushgateway/pom.xml +++ b/prometheus-metrics-exporter-pushgateway/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-pushgateway @@ -35,7 +35,7 @@ org.mock-server mockserver-netty-no-dependencies - 7.4.0 + 9.0.0 test diff --git a/prometheus-metrics-exporter-pushgateway/src/main/java/io/prometheus/metrics/exporter/pushgateway/PushGateway.java b/prometheus-metrics-exporter-pushgateway/src/main/java/io/prometheus/metrics/exporter/pushgateway/PushGateway.java index 5bf26b6c1c..b7dd844ec3 100644 --- a/prometheus-metrics-exporter-pushgateway/src/main/java/io/prometheus/metrics/exporter/pushgateway/PushGateway.java +++ b/prometheus-metrics-exporter-pushgateway/src/main/java/io/prometheus/metrics/exporter/pushgateway/PushGateway.java @@ -554,9 +554,9 @@ public PushGateway build() { getEscapingScheme(properties), getConnectionTimeout(properties), getReadTimeout(properties)); - } catch (MalformedURLException e) { + } catch (MalformedURLException | IllegalArgumentException e) { throw new PrometheusPropertiesException( - address + ": Invalid address. Expecting :"); + "Invalid Pushgateway address. Expecting :"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); // cannot happen, UTF-8 is always supported } diff --git a/prometheus-metrics-exporter-pushgateway/src/test/java/io/prometheus/metrics/exporter/pushgateway/PushGatewayTest.java b/prometheus-metrics-exporter-pushgateway/src/test/java/io/prometheus/metrics/exporter/pushgateway/PushGatewayTest.java index bae8fdd916..8c33543f95 100644 --- a/prometheus-metrics-exporter-pushgateway/src/test/java/io/prometheus/metrics/exporter/pushgateway/PushGatewayTest.java +++ b/prometheus-metrics-exporter-pushgateway/src/test/java/io/prometheus/metrics/exporter/pushgateway/PushGatewayTest.java @@ -6,6 +6,7 @@ import static org.mockserver.model.HttpResponse.response; import io.prometheus.metrics.config.EscapingScheme; +import io.prometheus.metrics.config.PrometheusPropertiesException; import io.prometheus.metrics.core.metrics.Gauge; import io.prometheus.metrics.model.registry.PrometheusRegistry; import java.io.IOException; @@ -48,6 +49,15 @@ void testInvalidURLThrowsRuntimeException() { }); } + @Test + void testInvalidURLDoesNotExposeCredentials() { + String secretAddress = "user:secret@[::"; + assertThatExceptionOfType(PrometheusPropertiesException.class) + .isThrownBy(() -> PushGateway.builder().address(secretAddress).build()) + .withMessage("Invalid Pushgateway address. Expecting :") + .withMessageNotContaining("secret"); + } + @Test void testMultipleSlashesAreStrippedFromURL() throws NoSuchFieldException, IllegalAccessException { final PushGateway pushGateway = diff --git a/prometheus-metrics-exporter-servlet-jakarta/pom.xml b/prometheus-metrics-exporter-servlet-jakarta/pom.xml index 877431e562..32e4e7a115 100644 --- a/prometheus-metrics-exporter-servlet-jakarta/pom.xml +++ b/prometheus-metrics-exporter-servlet-jakarta/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-servlet-jakarta diff --git a/prometheus-metrics-exporter-servlet-javax/pom.xml b/prometheus-metrics-exporter-servlet-javax/pom.xml index 701d178d9e..6d7b08a255 100644 --- a/prometheus-metrics-exporter-servlet-javax/pom.xml +++ b/prometheus-metrics-exporter-servlet-javax/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exporter-servlet-javax diff --git a/prometheus-metrics-exposition-formats-shaded/pom.xml b/prometheus-metrics-exposition-formats-shaded/pom.xml index f7e65bcb8c..72626becf4 100644 --- a/prometheus-metrics-exposition-formats-shaded/pom.xml +++ b/prometheus-metrics-exposition-formats-shaded/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exposition-formats @@ -61,6 +61,32 @@ + + org.apache.felix + maven-bundle-plugin + + + + io.prometheus.metrics.expositionformats.generated* + + + <_exportcontents> + io.prometheus.metrics.expositionformats.internal + + + !com.google.protobuf,* + + + + + + + + manifest + + + + org.apache.maven.plugins maven-resources-plugin diff --git a/prometheus-metrics-exposition-formats/pom.xml b/prometheus-metrics-exposition-formats/pom.xml index 4f0202fafa..c9115a35e8 100644 --- a/prometheus-metrics-exposition-formats/pom.xml +++ b/prometheus-metrics-exposition-formats/pom.xml @@ -5,7 +5,7 @@ io.prometheus client_java - 1.8.1-SNAPSHOT + 1.10.1-SNAPSHOT prometheus-metrics-exposition-formats-no-protobuf @@ -61,6 +61,29 @@ + + org.apache.felix + maven-bundle-plugin + + + + io.prometheus.metrics.expositionformats.generated* + + + <_exportcontents> + io.prometheus.metrics.expositionformats.internal + + + + + + + + manifest + + + + org.codehaus.mojo build-helper-maven-plugin diff --git a/prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_35_1/Metrics.java b/prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_36_2/Metrics.java similarity index 88% rename from prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_35_1/Metrics.java rename to prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_36_2/Metrics.java index 95cb3afee5..60dcf9989f 100644 --- a/prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_35_1/Metrics.java +++ b/prometheus-metrics-exposition-formats/src/main/generated/io/prometheus/metrics/expositionformats/generated/com_google_protobuf_4_36_2/Metrics.java @@ -2,9 +2,9 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // NO CHECKED-IN PROTOBUF GENCODE // source: src/main/protobuf/metrics.proto -// Protobuf Java Version: 4.35.1 +// Protobuf Java Version: 4.36.2 -package io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1; +package io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2; @com.google.protobuf.Generated public class Metrics extends com.google.protobuf.GeneratedFile { @@ -13,8 +13,8 @@ protected Metrics() {} com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Metrics"); } @@ -86,8 +86,8 @@ public enum MetricType com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "MetricType"); } @@ -193,7 +193,7 @@ public MetricType findValueByNumber(int number) { } public static com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.getDescriptor().getEnumType(0); + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.getDescriptor().getEnumType(0); } private static final MetricType[] VALUES = values(); @@ -266,8 +266,8 @@ public static final class LabelPair extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "LabelPair"); } @@ -282,20 +282,20 @@ private LabelPair() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder.class); } private int bitField0_; @@ -446,10 +446,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair) obj; if (hasName() != other.hasName()) return false; if (hasName()) { @@ -485,44 +485,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -530,26 +530,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -562,7 +562,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -583,21 +583,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.LabelPair) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.newBuilder() private Builder() { } @@ -619,17 +619,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_LabelPair_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -637,14 +637,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair(this); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -660,16 +660,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance()) return this; if (other.hasName()) { name_ = other.name_; bitField0_ |= 0x00000001; @@ -695,9 +695,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -783,7 +781,7 @@ public java.lang.String getName() { */ public Builder setName( java.lang.String value) { - if (value == null) { throw new NullPointerException(); } + java.util.Objects.requireNonNull(value); name_ = value; bitField0_ |= 0x00000001; onChanged(); @@ -806,7 +804,7 @@ public Builder clearName() { */ public Builder setNameBytes( com.google.protobuf.ByteString value) { - if (value == null) { throw new NullPointerException(); } + java.util.Objects.requireNonNull(value); name_ = value; bitField0_ |= 0x00000001; onChanged(); @@ -863,7 +861,7 @@ public java.lang.String getValue() { */ public Builder setValue( java.lang.String value) { - if (value == null) { throw new NullPointerException(); } + java.util.Objects.requireNonNull(value); value_ = value; bitField0_ |= 0x00000002; onChanged(); @@ -886,7 +884,7 @@ public Builder clearValue() { */ public Builder setValueBytes( com.google.protobuf.ByteString value) { - if (value == null) { throw new NullPointerException(); } + java.util.Objects.requireNonNull(value); value_ = value; bitField0_ |= 0x00000002; onChanged(); @@ -897,12 +895,12 @@ public Builder setValueBytes( } // @@protoc_insertion_point(class_scope:io.prometheus.client.LabelPair) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -938,7 +936,7 @@ public com.google.protobuf.Parser getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -971,8 +969,8 @@ public static final class Gauge extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Gauge"); } @@ -985,20 +983,20 @@ private Gauge() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder.class); } private int bitField0_; @@ -1065,10 +1063,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge) obj; if (hasValue() != other.hasValue()) return false; if (hasValue()) { @@ -1097,44 +1095,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -1142,26 +1140,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -1174,7 +1172,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -1195,21 +1193,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.Gauge) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.newBuilder() private Builder() { } @@ -1230,17 +1228,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Gauge_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -1248,14 +1246,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge(this); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -1267,16 +1265,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance()) return this; if (other.hasValue()) { setValue(other.getValue()); } @@ -1295,9 +1293,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -1372,12 +1368,12 @@ public Builder clearValue() { } // @@protoc_insertion_point(class_scope:io.prometheus.client.Gauge) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -1413,7 +1409,7 @@ public com.google.protobuf.Parser getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -1443,11 +1439,11 @@ public interface CounterOrBuilder extends * optional .io.prometheus.client.Exemplar exemplar = 2; * @return The exemplar. */ - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar(); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar(); /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder(); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder(); /** * optional .google.protobuf.Timestamp created_timestamp = 3; @@ -1476,8 +1472,8 @@ public static final class Counter extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Counter"); } @@ -1490,20 +1486,20 @@ private Counter() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder.class); } private int bitField0_; @@ -1527,7 +1523,7 @@ public double getValue() { } public static final int EXEMPLAR_FIELD_NUMBER = 2; - private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar exemplar_; + private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar exemplar_; /** * optional .io.prometheus.client.Exemplar exemplar = 2; * @return Whether the exemplar field is set. @@ -1541,15 +1537,15 @@ public boolean hasExemplar() { * @return The exemplar. */ @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar() { - return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_; + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar() { + return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_; } /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder() { - return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_; + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder() { + return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_; } public static final int CREATED_TIMESTAMP_FIELD_NUMBER = 3; @@ -1636,10 +1632,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter) obj; if (hasValue() != other.hasValue()) return false; if (hasValue()) { @@ -1686,44 +1682,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -1731,26 +1727,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -1763,7 +1759,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -1784,21 +1780,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.Counter) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -1836,17 +1832,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Counter_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Counter_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -1854,14 +1850,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter(this); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -1885,16 +1881,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance()) return this; if (other.hasValue()) { setValue(other.getValue()); } @@ -1919,9 +1915,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -2006,9 +2000,9 @@ public Builder clearValue() { return this; } - private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar exemplar_; + private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar exemplar_; private com.google.protobuf.SingleFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> exemplarBuilder_; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> exemplarBuilder_; /** * optional .io.prometheus.client.Exemplar exemplar = 2; * @return Whether the exemplar field is set. @@ -2020,9 +2014,9 @@ public boolean hasExemplar() { * optional .io.prometheus.client.Exemplar exemplar = 2; * @return The exemplar. */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar() { if (exemplarBuilder_ == null) { - return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_; + return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_; } else { return exemplarBuilder_.getMessage(); } @@ -2030,11 +2024,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ - public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) { + public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) { if (exemplarBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); exemplar_ = value; } else { exemplarBuilder_.setMessage(value); @@ -2047,7 +2039,7 @@ public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com * optional .io.prometheus.client.Exemplar exemplar = 2; */ public Builder setExemplar( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder builderForValue) { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder builderForValue) { if (exemplarBuilder_ == null) { exemplar_ = builderForValue.build(); } else { @@ -2060,11 +2052,11 @@ public Builder setExemplar( /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ - public Builder mergeExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) { + public Builder mergeExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) { if (exemplarBuilder_ == null) { if (((bitField0_ & 0x00000002) != 0) && exemplar_ != null && - exemplar_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance()) { + exemplar_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance()) { getExemplarBuilder().mergeFrom(value); } else { exemplar_ = value; @@ -2094,7 +2086,7 @@ public Builder clearExemplar() { /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder getExemplarBuilder() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder getExemplarBuilder() { bitField0_ |= 0x00000002; onChanged(); return internalGetExemplarFieldBuilder().getBuilder(); @@ -2102,23 +2094,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder() { if (exemplarBuilder_ != null) { return exemplarBuilder_.getMessageOrBuilder(); } else { return exemplar_ == null ? - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_; } } /** * optional .io.prometheus.client.Exemplar exemplar = 2; */ private com.google.protobuf.SingleFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> internalGetExemplarFieldBuilder() { if (exemplarBuilder_ == null) { exemplarBuilder_ = new com.google.protobuf.SingleFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder>( + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder>( getExemplar(), getParentForChildren(), isClean()); @@ -2153,9 +2145,7 @@ public com.google.protobuf.Timestamp getCreatedTimestamp() { */ public Builder setCreatedTimestamp(com.google.protobuf.Timestamp value) { if (createdTimestampBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); createdTimestamp_ = value; } else { createdTimestampBuilder_.setMessage(value); @@ -2252,12 +2242,12 @@ public com.google.protobuf.TimestampOrBuilder getCreatedTimestampOrBuilder() { } // @@protoc_insertion_point(class_scope:io.prometheus.client.Counter) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -2293,7 +2283,7 @@ public com.google.protobuf.Parser getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -2337,8 +2327,8 @@ public static final class Quantile extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Quantile"); } @@ -2351,20 +2341,20 @@ private Quantile() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder.class); } private int bitField0_; @@ -2457,10 +2447,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile) obj; if (hasQuantile() != other.hasQuantile()) return false; if (hasQuantile()) { @@ -2500,44 +2490,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -2545,26 +2535,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -2577,7 +2567,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -2598,21 +2588,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.Quantile) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.newBuilder() private Builder() { } @@ -2634,17 +2624,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Quantile_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -2652,14 +2642,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile(this); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -2675,16 +2665,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.getDefaultInstance()) return this; if (other.hasQuantile()) { setQuantile(other.getQuantile()); } @@ -2706,9 +2696,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -2828,12 +2816,12 @@ public Builder clearValue() { } // @@protoc_insertion_point(class_scope:io.prometheus.client.Quantile) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -2869,7 +2857,7 @@ public com.google.protobuf.Parser getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -2904,12 +2892,12 @@ public interface SummaryOrBuilder extends /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - java.util.List + java.util.List getQuantileList(); /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getQuantile(int index); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getQuantile(int index); /** * repeated .io.prometheus.client.Quantile quantile = 3; */ @@ -2917,12 +2905,12 @@ public interface SummaryOrBuilder extends /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - java.util.List + java.util.List getQuantileOrBuilderList(); /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder getQuantileOrBuilder( + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder getQuantileOrBuilder( int index); /** @@ -2952,8 +2940,8 @@ public static final class Summary extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Summary"); } @@ -2967,20 +2955,20 @@ private Summary() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder.class); } private int bitField0_; @@ -3024,19 +3012,19 @@ public double getSampleSum() { public static final int QUANTILE_FIELD_NUMBER = 3; @SuppressWarnings("serial") - private java.util.List quantile_; + private java.util.List quantile_; /** * repeated .io.prometheus.client.Quantile quantile = 3; */ @java.lang.Override - public java.util.List getQuantileList() { + public java.util.List getQuantileList() { return quantile_; } /** * repeated .io.prometheus.client.Quantile quantile = 3; */ @java.lang.Override - public java.util.List + public java.util.List getQuantileOrBuilderList() { return quantile_; } @@ -3051,14 +3039,14 @@ public int getQuantileCount() { * repeated .io.prometheus.client.Quantile quantile = 3; */ @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getQuantile(int index) { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getQuantile(int index) { return quantile_.get(index); } /** * repeated .io.prometheus.client.Quantile quantile = 3; */ @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder getQuantileOrBuilder( + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder getQuantileOrBuilder( int index) { return quantile_.get(index); } @@ -3159,10 +3147,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary) obj; if (hasSampleCount() != other.hasSampleCount()) return false; if (hasSampleCount()) { @@ -3216,44 +3204,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -3261,26 +3249,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -3293,7 +3281,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -3314,21 +3302,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.Summary) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -3369,17 +3357,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Summary_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Summary_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -3387,15 +3375,15 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary(this); buildPartialRepeatedFields(result); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary result) { + private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary result) { if (quantileBuilder_ == null) { if (((bitField0_ & 0x00000004) != 0)) { quantile_ = java.util.Collections.unmodifiableList(quantile_); @@ -3407,7 +3395,7 @@ private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats. } } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -3429,16 +3417,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance()) return this; if (other.hasSampleCount()) { setSampleCount(other.getSampleCount()); } @@ -3489,9 +3477,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -3511,9 +3497,9 @@ public Builder mergeFrom( break; } // case 17 case 26: { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile m = + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile m = input.readMessage( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.parser(), + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.parser(), extensionRegistry); if (quantileBuilder_ == null) { ensureQuantileIsMutable(); @@ -3627,22 +3613,22 @@ public Builder clearSampleSum() { return this; } - private java.util.List quantile_ = + private java.util.List quantile_ = java.util.Collections.emptyList(); private void ensureQuantileIsMutable() { if (!((bitField0_ & 0x00000004) != 0)) { - quantile_ = new java.util.ArrayList(quantile_); + quantile_ = new java.util.ArrayList(quantile_); bitField0_ |= 0x00000004; } } private com.google.protobuf.RepeatedFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder> quantileBuilder_; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder> quantileBuilder_; /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public java.util.List getQuantileList() { + public java.util.List getQuantileList() { if (quantileBuilder_ == null) { return java.util.Collections.unmodifiableList(quantile_); } else { @@ -3662,7 +3648,7 @@ public int getQuantileCount() { /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile getQuantile(int index) { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile getQuantile(int index) { if (quantileBuilder_ == null) { return quantile_.get(index); } else { @@ -3673,11 +3659,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder setQuantile( - int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile value) { + int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile value) { if (quantileBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); ensureQuantileIsMutable(); quantile_.set(index, value); onChanged(); @@ -3690,7 +3674,7 @@ public Builder setQuantile( * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder setQuantile( - int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder builderForValue) { + int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder builderForValue) { if (quantileBuilder_ == null) { ensureQuantileIsMutable(); quantile_.set(index, builderForValue.build()); @@ -3703,11 +3687,9 @@ public Builder setQuantile( /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public Builder addQuantile(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile value) { + public Builder addQuantile(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile value) { if (quantileBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); ensureQuantileIsMutable(); quantile_.add(value); onChanged(); @@ -3720,11 +3702,9 @@ public Builder addQuantile(io.prometheus.metrics.expositionformats.generated.com * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder addQuantile( - int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile value) { + int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile value) { if (quantileBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); ensureQuantileIsMutable(); quantile_.add(index, value); onChanged(); @@ -3737,7 +3717,7 @@ public Builder addQuantile( * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder addQuantile( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder builderForValue) { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder builderForValue) { if (quantileBuilder_ == null) { ensureQuantileIsMutable(); quantile_.add(builderForValue.build()); @@ -3751,7 +3731,7 @@ public Builder addQuantile( * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder addQuantile( - int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder builderForValue) { + int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder builderForValue) { if (quantileBuilder_ == null) { ensureQuantileIsMutable(); quantile_.add(index, builderForValue.build()); @@ -3765,7 +3745,7 @@ public Builder addQuantile( * repeated .io.prometheus.client.Quantile quantile = 3; */ public Builder addAllQuantile( - java.lang.Iterable values) { + java.lang.Iterable values) { if (quantileBuilder_ == null) { ensureQuantileIsMutable(); com.google.protobuf.AbstractMessageLite.Builder.addAll( @@ -3805,14 +3785,14 @@ public Builder removeQuantile(int index) { /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder getQuantileBuilder( + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder getQuantileBuilder( int index) { return internalGetQuantileFieldBuilder().getBuilder(index); } /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder getQuantileOrBuilder( + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder getQuantileOrBuilder( int index) { if (quantileBuilder_ == null) { return quantile_.get(index); } else { @@ -3822,7 +3802,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public java.util.List + public java.util.List getQuantileOrBuilderList() { if (quantileBuilder_ != null) { return quantileBuilder_.getMessageOrBuilderList(); @@ -3833,31 +3813,31 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder addQuantileBuilder() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder addQuantileBuilder() { return internalGetQuantileFieldBuilder().addBuilder( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.getDefaultInstance()); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.getDefaultInstance()); } /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder addQuantileBuilder( + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder addQuantileBuilder( int index) { return internalGetQuantileFieldBuilder().addBuilder( - index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.getDefaultInstance()); + index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.getDefaultInstance()); } /** * repeated .io.prometheus.client.Quantile quantile = 3; */ - public java.util.List + public java.util.List getQuantileBuilderList() { return internalGetQuantileFieldBuilder().getBuilderList(); } private com.google.protobuf.RepeatedFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder> + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder> internalGetQuantileFieldBuilder() { if (quantileBuilder_ == null) { quantileBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.QuantileOrBuilder>( + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Quantile.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.QuantileOrBuilder>( quantile_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), @@ -3893,9 +3873,7 @@ public com.google.protobuf.Timestamp getCreatedTimestamp() { */ public Builder setCreatedTimestamp(com.google.protobuf.Timestamp value) { if (createdTimestampBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } + java.util.Objects.requireNonNull(value); createdTimestamp_ = value; } else { createdTimestampBuilder_.setMessage(value); @@ -3992,12 +3970,12 @@ public com.google.protobuf.TimestampOrBuilder getCreatedTimestampOrBuilder() { } // @@protoc_insertion_point(class_scope:io.prometheus.client.Summary) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -4033,7 +4011,7 @@ public com.google.protobuf.Parser

getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -4066,8 +4044,8 @@ public static final class Untyped extends com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, - /* minor= */ 35, - /* patch= */ 1, + /* minor= */ 36, + /* patch= */ 2, /* suffix= */ "", "Untyped"); } @@ -4080,20 +4058,20 @@ private Untyped() { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder.class); } private int bitField0_; @@ -4160,10 +4138,10 @@ public boolean equals(final java.lang.Object obj) { if (obj == this) { return true; } - if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped)) { + if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped)) { return super.equals(obj); } - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped) obj; + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped) obj; if (hasValue() != other.hasValue()) return false; if (hasValue()) { @@ -4192,44 +4170,44 @@ public int hashCode() { return hash; } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom(byte[] data) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -4237,26 +4215,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto .parseWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseDelimitedFrom(java.io.InputStream input) + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseDelimitedFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessage .parseWithIOException(PARSER, input); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped parseFrom( + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -4269,7 +4247,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped prototype) { + public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -4290,21 +4268,21 @@ protected Builder newBuilderForType( public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements // @@protoc_insertion_point(builder_implements:io.prometheus.client.Untyped) - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_fieldAccessorTable .ensureFieldAccessorsInitialized( - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder.class); + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder.class); } - // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.newBuilder() + // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.newBuilder() private Builder() { } @@ -4325,17 +4303,17 @@ public Builder clear() { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Untyped_descriptor; } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getDefaultInstanceForType() { - return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getDefaultInstanceForType() { + return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance(); } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped build() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped result = buildPartial(); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped build() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -4343,14 +4321,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3 } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped buildPartial() { - io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped(this); + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped buildPartial() { + io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped(this); if (bitField0_ != 0) { buildPartial0(result); } onBuilt(); return result; } - private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped result) { + private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped result) { int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) != 0)) { @@ -4362,16 +4340,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped) { - return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped)other); + if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped) { + return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped other) { - if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance()) return this; + public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped other) { + if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance()) return this; if (other.hasValue()) { setValue(other.getValue()); } @@ -4390,9 +4368,7 @@ public Builder mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + java.util.Objects.requireNonNull(extensionRegistry); try { boolean done = false; while (!done) { @@ -4467,12 +4443,12 @@ public Builder clearValue() { } // @@protoc_insertion_point(class_scope:io.prometheus.client.Untyped) - private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped DEFAULT_INSTANCE; + private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped(); + DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped(); } - public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getDefaultInstance() { + public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getDefaultInstance() { return DEFAULT_INSTANCE; } @@ -4508,7 +4484,7 @@ public com.google.protobuf.Parser getParserForType() { } @java.lang.Override - public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getDefaultInstanceForType() { + public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -4566,7 +4542,7 @@ public interface HistogramOrBuilder extends * * repeated .io.prometheus.client.Bucket bucket = 3; */ - java.util.List + java.util.List getBucketList(); /** *
@@ -4575,7 +4551,7 @@ public interface HistogramOrBuilder extends
      *
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getBucket(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getBucket(int index);
     /**
      * 
      * Buckets for the conventional histogram.
@@ -4591,7 +4567,7 @@ public interface HistogramOrBuilder extends
      *
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
-    java.util.List 
+    java.util.List 
         getBucketOrBuilderList();
     /**
      * 
@@ -4600,7 +4576,7 @@ public interface HistogramOrBuilder extends
      *
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder getBucketOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder getBucketOrBuilder(
         int index);
 
     /**
@@ -4709,7 +4685,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
-    java.util.List 
+    java.util.List 
         getNegativeSpanList();
     /**
      * 
@@ -4718,7 +4694,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getNegativeSpan(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getNegativeSpan(int index);
     /**
      * 
      * Negative buckets for the native histogram.
@@ -4734,7 +4710,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
-    java.util.List 
+    java.util.List 
         getNegativeSpanOrBuilderList();
     /**
      * 
@@ -4743,7 +4719,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
         int index);
 
     /**
@@ -4820,7 +4796,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
-    java.util.List 
+    java.util.List 
         getPositiveSpanList();
     /**
      * 
@@ -4832,7 +4808,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getPositiveSpan(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getPositiveSpan(int index);
     /**
      * 
      * Positive buckets for the native histogram.
@@ -4854,7 +4830,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
-    java.util.List 
+    java.util.List 
         getPositiveSpanOrBuilderList();
     /**
      * 
@@ -4866,7 +4842,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
         int index);
 
     /**
@@ -4940,7 +4916,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
-    java.util.List 
+    java.util.List 
         getExemplarsList();
     /**
      * 
@@ -4949,7 +4925,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplars(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplars(int index);
     /**
      * 
      * Only used for native histograms. These exemplars MUST have a timestamp.
@@ -4965,7 +4941,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
-    java.util.List 
+    java.util.List 
         getExemplarsOrBuilderList();
     /**
      * 
@@ -4974,7 +4950,7 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      *
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
         int index);
   }
   /**
@@ -4989,8 +4965,8 @@ public static final class Histogram extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "Histogram");
     }
@@ -5011,20 +4987,20 @@ private Histogram() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder.class);
     }
 
     private int bitField0_;
@@ -5095,7 +5071,7 @@ public double getSampleSum() {
 
     public static final int BUCKET_FIELD_NUMBER = 3;
     @SuppressWarnings("serial")
-    private java.util.List bucket_;
+    private java.util.List bucket_;
     /**
      * 
      * Buckets for the conventional histogram.
@@ -5104,7 +5080,7 @@ public double getSampleSum() {
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
     @java.lang.Override
-    public java.util.List getBucketList() {
+    public java.util.List getBucketList() {
       return bucket_;
     }
     /**
@@ -5115,7 +5091,7 @@ public java.util.Listrepeated .io.prometheus.client.Bucket bucket = 3;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getBucketOrBuilderList() {
       return bucket_;
     }
@@ -5138,7 +5114,7 @@ public int getBucketCount() {
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getBucket(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getBucket(int index) {
       return bucket_.get(index);
     }
     /**
@@ -5149,7 +5125,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
      * repeated .io.prometheus.client.Bucket bucket = 3;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder getBucketOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder getBucketOrBuilder(
         int index) {
       return bucket_.get(index);
     }
@@ -5298,7 +5274,7 @@ public double getZeroCountFloat() {
 
     public static final int NEGATIVE_SPAN_FIELD_NUMBER = 9;
     @SuppressWarnings("serial")
-    private java.util.List negativeSpan_;
+    private java.util.List negativeSpan_;
     /**
      * 
      * Negative buckets for the native histogram.
@@ -5307,7 +5283,7 @@ public double getZeroCountFloat() {
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
     @java.lang.Override
-    public java.util.List getNegativeSpanList() {
+    public java.util.List getNegativeSpanList() {
       return negativeSpan_;
     }
     /**
@@ -5318,7 +5294,7 @@ public java.util.Listrepeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getNegativeSpanOrBuilderList() {
       return negativeSpan_;
     }
@@ -5341,7 +5317,7 @@ public int getNegativeSpanCount() {
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getNegativeSpan(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getNegativeSpan(int index) {
       return negativeSpan_.get(index);
     }
     /**
@@ -5352,7 +5328,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
      * repeated .io.prometheus.client.BucketSpan negative_span = 9;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
         int index) {
       return negativeSpan_.get(index);
     }
@@ -5447,7 +5423,7 @@ public double getNegativeCount(int index) {
 
     public static final int POSITIVE_SPAN_FIELD_NUMBER = 12;
     @SuppressWarnings("serial")
-    private java.util.List positiveSpan_;
+    private java.util.List positiveSpan_;
     /**
      * 
      * Positive buckets for the native histogram.
@@ -5459,7 +5435,7 @@ public double getNegativeCount(int index) {
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
     @java.lang.Override
-    public java.util.List getPositiveSpanList() {
+    public java.util.List getPositiveSpanList() {
       return positiveSpan_;
     }
     /**
@@ -5473,7 +5449,7 @@ public java.util.Listrepeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getPositiveSpanOrBuilderList() {
       return positiveSpan_;
     }
@@ -5502,7 +5478,7 @@ public int getPositiveSpanCount() {
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getPositiveSpan(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getPositiveSpan(int index) {
       return positiveSpan_.get(index);
     }
     /**
@@ -5516,7 +5492,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
      * repeated .io.prometheus.client.BucketSpan positive_span = 12;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
         int index) {
       return positiveSpan_.get(index);
     }
@@ -5611,7 +5587,7 @@ public double getPositiveCount(int index) {
 
     public static final int EXEMPLARS_FIELD_NUMBER = 16;
     @SuppressWarnings("serial")
-    private java.util.List exemplars_;
+    private java.util.List exemplars_;
     /**
      * 
      * Only used for native histograms. These exemplars MUST have a timestamp.
@@ -5620,7 +5596,7 @@ public double getPositiveCount(int index) {
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
     @java.lang.Override
-    public java.util.List getExemplarsList() {
+    public java.util.List getExemplarsList() {
       return exemplars_;
     }
     /**
@@ -5631,7 +5607,7 @@ public java.util.Listrepeated .io.prometheus.client.Exemplar exemplars = 16;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getExemplarsOrBuilderList() {
       return exemplars_;
     }
@@ -5654,7 +5630,7 @@ public int getExemplarsCount() {
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplars(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplars(int index) {
       return exemplars_.get(index);
     }
     /**
@@ -5665,7 +5641,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
      * repeated .io.prometheus.client.Exemplar exemplars = 16;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
         int index) {
       return exemplars_.get(index);
     }
@@ -5853,10 +5829,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram) obj;
 
       if (hasSampleCount() != other.hasSampleCount()) return false;
       if (hasSampleCount()) {
@@ -6004,44 +5980,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -6049,26 +6025,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -6081,7 +6057,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -6102,21 +6078,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.Histogram)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -6190,17 +6166,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Histogram_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -6208,15 +6184,15 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram(this);
         buildPartialRepeatedFields(result);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram result) {
+      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram result) {
         if (bucketBuilder_ == null) {
           if (((bitField0_ & 0x00000008) != 0)) {
             bucket_ = java.util.Collections.unmodifiableList(bucket_);
@@ -6255,7 +6231,7 @@ private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.
         }
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000001) != 0)) {
@@ -6313,16 +6289,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance()) return this;
         if (other.hasSampleCount()) {
           setSampleCount(other.getSampleCount());
         }
@@ -6510,9 +6486,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -6532,9 +6506,9 @@ public Builder mergeFrom(
                 break;
               } // case 17
               case 26: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.parser(),
                         extensionRegistry);
                 if (bucketBuilder_ == null) {
                   ensureBucketIsMutable();
@@ -6570,9 +6544,9 @@ public Builder mergeFrom(
                 break;
               } // case 65
               case 74: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.parser(),
                         extensionRegistry);
                 if (negativeSpanBuilder_ == null) {
                   ensureNegativeSpanIsMutable();
@@ -6616,9 +6590,9 @@ public Builder mergeFrom(
                 break;
               } // case 90
               case 98: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.parser(),
                         extensionRegistry);
                 if (positiveSpanBuilder_ == null) {
                   ensurePositiveSpanIsMutable();
@@ -6669,9 +6643,9 @@ public Builder mergeFrom(
                 break;
               } // case 122
               case 130: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.parser(),
                         extensionRegistry);
                 if (exemplarsBuilder_ == null) {
                   ensureExemplarsIsMutable();
@@ -6834,17 +6808,17 @@ public Builder clearSampleSum() {
         return this;
       }
 
-      private java.util.List bucket_ =
+      private java.util.List bucket_ =
         java.util.Collections.emptyList();
       private void ensureBucketIsMutable() {
         if (!((bitField0_ & 0x00000008) != 0)) {
-          bucket_ = new java.util.ArrayList(bucket_);
+          bucket_ = new java.util.ArrayList(bucket_);
           bitField0_ |= 0x00000008;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder> bucketBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder> bucketBuilder_;
 
       /**
        * 
@@ -6853,7 +6827,7 @@ private void ensureBucketIsMutable() {
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public java.util.List getBucketList() {
+      public java.util.List getBucketList() {
         if (bucketBuilder_ == null) {
           return java.util.Collections.unmodifiableList(bucket_);
         } else {
@@ -6881,7 +6855,7 @@ public int getBucketCount() {
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getBucket(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getBucket(int index) {
         if (bucketBuilder_ == null) {
           return bucket_.get(index);
         } else {
@@ -6896,11 +6870,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder setBucket(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket value) {
         if (bucketBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureBucketIsMutable();
           bucket_.set(index, value);
           onChanged();
@@ -6917,7 +6889,7 @@ public Builder setBucket(
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder setBucket(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder builderForValue) {
         if (bucketBuilder_ == null) {
           ensureBucketIsMutable();
           bucket_.set(index, builderForValue.build());
@@ -6934,11 +6906,9 @@ public Builder setBucket(
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public Builder addBucket(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket value) {
+      public Builder addBucket(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket value) {
         if (bucketBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureBucketIsMutable();
           bucket_.add(value);
           onChanged();
@@ -6955,11 +6925,9 @@ public Builder addBucket(io.prometheus.metrics.expositionformats.generated.com_g
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder addBucket(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket value) {
         if (bucketBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureBucketIsMutable();
           bucket_.add(index, value);
           onChanged();
@@ -6976,7 +6944,7 @@ public Builder addBucket(
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder addBucket(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder builderForValue) {
         if (bucketBuilder_ == null) {
           ensureBucketIsMutable();
           bucket_.add(builderForValue.build());
@@ -6994,7 +6962,7 @@ public Builder addBucket(
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder addBucket(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder builderForValue) {
         if (bucketBuilder_ == null) {
           ensureBucketIsMutable();
           bucket_.add(index, builderForValue.build());
@@ -7012,7 +6980,7 @@ public Builder addBucket(
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
       public Builder addAllBucket(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (bucketBuilder_ == null) {
           ensureBucketIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -7064,7 +7032,7 @@ public Builder removeBucket(int index) {
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder getBucketBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder getBucketBuilder(
           int index) {
         return internalGetBucketFieldBuilder().getBuilder(index);
       }
@@ -7075,7 +7043,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder getBucketOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder getBucketOrBuilder(
           int index) {
         if (bucketBuilder_ == null) {
           return bucket_.get(index);  } else {
@@ -7089,7 +7057,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public java.util.List 
+      public java.util.List 
            getBucketOrBuilderList() {
         if (bucketBuilder_ != null) {
           return bucketBuilder_.getMessageOrBuilderList();
@@ -7104,9 +7072,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder addBucketBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder addBucketBuilder() {
         return internalGetBucketFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.getDefaultInstance());
       }
       /**
        * 
@@ -7115,10 +7083,10 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder addBucketBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder addBucketBuilder(
           int index) {
         return internalGetBucketFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.getDefaultInstance());
       }
       /**
        * 
@@ -7127,16 +7095,16 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Bucket bucket = 3;
        */
-      public java.util.List 
+      public java.util.List 
            getBucketBuilderList() {
         return internalGetBucketFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder> 
           internalGetBucketFieldBuilder() {
         if (bucketBuilder_ == null) {
           bucketBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder>(
                   bucket_,
                   ((bitField0_ & 0x00000008) != 0),
                   getParentForChildren(),
@@ -7172,9 +7140,7 @@ public com.google.protobuf.Timestamp getCreatedTimestamp() {
        */
       public Builder setCreatedTimestamp(com.google.protobuf.Timestamp value) {
         if (createdTimestampBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           createdTimestamp_ = value;
         } else {
           createdTimestampBuilder_.setMessage(value);
@@ -7507,17 +7473,17 @@ public Builder clearZeroCountFloat() {
         return this;
       }
 
-      private java.util.List negativeSpan_ =
+      private java.util.List negativeSpan_ =
         java.util.Collections.emptyList();
       private void ensureNegativeSpanIsMutable() {
         if (!((bitField0_ & 0x00000200) != 0)) {
-          negativeSpan_ = new java.util.ArrayList(negativeSpan_);
+          negativeSpan_ = new java.util.ArrayList(negativeSpan_);
           bitField0_ |= 0x00000200;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder> negativeSpanBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder> negativeSpanBuilder_;
 
       /**
        * 
@@ -7526,7 +7492,7 @@ private void ensureNegativeSpanIsMutable() {
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public java.util.List getNegativeSpanList() {
+      public java.util.List getNegativeSpanList() {
         if (negativeSpanBuilder_ == null) {
           return java.util.Collections.unmodifiableList(negativeSpan_);
         } else {
@@ -7554,7 +7520,7 @@ public int getNegativeSpanCount() {
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getNegativeSpan(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getNegativeSpan(int index) {
         if (negativeSpanBuilder_ == null) {
           return negativeSpan_.get(index);
         } else {
@@ -7569,11 +7535,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder setNegativeSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (negativeSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureNegativeSpanIsMutable();
           negativeSpan_.set(index, value);
           onChanged();
@@ -7590,7 +7554,7 @@ public Builder setNegativeSpan(
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder setNegativeSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (negativeSpanBuilder_ == null) {
           ensureNegativeSpanIsMutable();
           negativeSpan_.set(index, builderForValue.build());
@@ -7607,11 +7571,9 @@ public Builder setNegativeSpan(
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public Builder addNegativeSpan(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+      public Builder addNegativeSpan(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (negativeSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureNegativeSpanIsMutable();
           negativeSpan_.add(value);
           onChanged();
@@ -7628,11 +7590,9 @@ public Builder addNegativeSpan(io.prometheus.metrics.expositionformats.generated
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder addNegativeSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (negativeSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureNegativeSpanIsMutable();
           negativeSpan_.add(index, value);
           onChanged();
@@ -7649,7 +7609,7 @@ public Builder addNegativeSpan(
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder addNegativeSpan(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (negativeSpanBuilder_ == null) {
           ensureNegativeSpanIsMutable();
           negativeSpan_.add(builderForValue.build());
@@ -7667,7 +7627,7 @@ public Builder addNegativeSpan(
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder addNegativeSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (negativeSpanBuilder_ == null) {
           ensureNegativeSpanIsMutable();
           negativeSpan_.add(index, builderForValue.build());
@@ -7685,7 +7645,7 @@ public Builder addNegativeSpan(
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
       public Builder addAllNegativeSpan(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (negativeSpanBuilder_ == null) {
           ensureNegativeSpanIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -7737,7 +7697,7 @@ public Builder removeNegativeSpan(int index) {
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder getNegativeSpanBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder getNegativeSpanBuilder(
           int index) {
         return internalGetNegativeSpanFieldBuilder().getBuilder(index);
       }
@@ -7748,7 +7708,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getNegativeSpanOrBuilder(
           int index) {
         if (negativeSpanBuilder_ == null) {
           return negativeSpan_.get(index);  } else {
@@ -7762,7 +7722,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public java.util.List 
+      public java.util.List 
            getNegativeSpanOrBuilderList() {
         if (negativeSpanBuilder_ != null) {
           return negativeSpanBuilder_.getMessageOrBuilderList();
@@ -7777,9 +7737,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder addNegativeSpanBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder addNegativeSpanBuilder() {
         return internalGetNegativeSpanFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance());
       }
       /**
        * 
@@ -7788,10 +7748,10 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder addNegativeSpanBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder addNegativeSpanBuilder(
           int index) {
         return internalGetNegativeSpanFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance());
       }
       /**
        * 
@@ -7800,16 +7760,16 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan negative_span = 9;
        */
-      public java.util.List 
+      public java.util.List 
            getNegativeSpanBuilderList() {
         return internalGetNegativeSpanFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder> 
           internalGetNegativeSpanFieldBuilder() {
         if (negativeSpanBuilder_ == null) {
           negativeSpanBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder>(
                   negativeSpan_,
                   ((bitField0_ & 0x00000200) != 0),
                   getParentForChildren(),
@@ -8063,17 +8023,17 @@ public Builder clearNegativeCount() {
         return this;
       }
 
-      private java.util.List positiveSpan_ =
+      private java.util.List positiveSpan_ =
         java.util.Collections.emptyList();
       private void ensurePositiveSpanIsMutable() {
         if (!((bitField0_ & 0x00001000) != 0)) {
-          positiveSpan_ = new java.util.ArrayList(positiveSpan_);
+          positiveSpan_ = new java.util.ArrayList(positiveSpan_);
           bitField0_ |= 0x00001000;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder> positiveSpanBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder> positiveSpanBuilder_;
 
       /**
        * 
@@ -8085,7 +8045,7 @@ private void ensurePositiveSpanIsMutable() {
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public java.util.List getPositiveSpanList() {
+      public java.util.List getPositiveSpanList() {
         if (positiveSpanBuilder_ == null) {
           return java.util.Collections.unmodifiableList(positiveSpan_);
         } else {
@@ -8119,7 +8079,7 @@ public int getPositiveSpanCount() {
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getPositiveSpan(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getPositiveSpan(int index) {
         if (positiveSpanBuilder_ == null) {
           return positiveSpan_.get(index);
         } else {
@@ -8137,11 +8097,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder setPositiveSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (positiveSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensurePositiveSpanIsMutable();
           positiveSpan_.set(index, value);
           onChanged();
@@ -8161,7 +8119,7 @@ public Builder setPositiveSpan(
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder setPositiveSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (positiveSpanBuilder_ == null) {
           ensurePositiveSpanIsMutable();
           positiveSpan_.set(index, builderForValue.build());
@@ -8181,11 +8139,9 @@ public Builder setPositiveSpan(
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public Builder addPositiveSpan(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+      public Builder addPositiveSpan(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (positiveSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensurePositiveSpanIsMutable();
           positiveSpan_.add(value);
           onChanged();
@@ -8205,11 +8161,9 @@ public Builder addPositiveSpan(io.prometheus.metrics.expositionformats.generated
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder addPositiveSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan value) {
         if (positiveSpanBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensurePositiveSpanIsMutable();
           positiveSpan_.add(index, value);
           onChanged();
@@ -8229,7 +8183,7 @@ public Builder addPositiveSpan(
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder addPositiveSpan(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (positiveSpanBuilder_ == null) {
           ensurePositiveSpanIsMutable();
           positiveSpan_.add(builderForValue.build());
@@ -8250,7 +8204,7 @@ public Builder addPositiveSpan(
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder addPositiveSpan(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder builderForValue) {
         if (positiveSpanBuilder_ == null) {
           ensurePositiveSpanIsMutable();
           positiveSpan_.add(index, builderForValue.build());
@@ -8271,7 +8225,7 @@ public Builder addPositiveSpan(
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
       public Builder addAllPositiveSpan(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (positiveSpanBuilder_ == null) {
           ensurePositiveSpanIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -8332,7 +8286,7 @@ public Builder removePositiveSpan(int index) {
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder getPositiveSpanBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder getPositiveSpanBuilder(
           int index) {
         return internalGetPositiveSpanFieldBuilder().getBuilder(index);
       }
@@ -8346,7 +8300,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder getPositiveSpanOrBuilder(
           int index) {
         if (positiveSpanBuilder_ == null) {
           return positiveSpan_.get(index);  } else {
@@ -8363,7 +8317,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public java.util.List 
+      public java.util.List 
            getPositiveSpanOrBuilderList() {
         if (positiveSpanBuilder_ != null) {
           return positiveSpanBuilder_.getMessageOrBuilderList();
@@ -8381,9 +8335,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder addPositiveSpanBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder addPositiveSpanBuilder() {
         return internalGetPositiveSpanFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance());
       }
       /**
        * 
@@ -8395,10 +8349,10 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder addPositiveSpanBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder addPositiveSpanBuilder(
           int index) {
         return internalGetPositiveSpanFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance());
       }
       /**
        * 
@@ -8410,16 +8364,16 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.BucketSpan positive_span = 12;
        */
-      public java.util.List 
+      public java.util.List 
            getPositiveSpanBuilderList() {
         return internalGetPositiveSpanFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder> 
           internalGetPositiveSpanFieldBuilder() {
         if (positiveSpanBuilder_ == null) {
           positiveSpanBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder>(
                   positiveSpan_,
                   ((bitField0_ & 0x00001000) != 0),
                   getParentForChildren(),
@@ -8673,17 +8627,17 @@ public Builder clearPositiveCount() {
         return this;
       }
 
-      private java.util.List exemplars_ =
+      private java.util.List exemplars_ =
         java.util.Collections.emptyList();
       private void ensureExemplarsIsMutable() {
         if (!((bitField0_ & 0x00008000) != 0)) {
-          exemplars_ = new java.util.ArrayList(exemplars_);
+          exemplars_ = new java.util.ArrayList(exemplars_);
           bitField0_ |= 0x00008000;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> exemplarsBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> exemplarsBuilder_;
 
       /**
        * 
@@ -8692,7 +8646,7 @@ private void ensureExemplarsIsMutable() {
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public java.util.List getExemplarsList() {
+      public java.util.List getExemplarsList() {
         if (exemplarsBuilder_ == null) {
           return java.util.Collections.unmodifiableList(exemplars_);
         } else {
@@ -8720,7 +8674,7 @@ public int getExemplarsCount() {
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplars(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplars(int index) {
         if (exemplarsBuilder_ == null) {
           return exemplars_.get(index);
         } else {
@@ -8735,11 +8689,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder setExemplars(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) {
         if (exemplarsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureExemplarsIsMutable();
           exemplars_.set(index, value);
           onChanged();
@@ -8756,7 +8708,7 @@ public Builder setExemplars(
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder setExemplars(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder builderForValue) {
         if (exemplarsBuilder_ == null) {
           ensureExemplarsIsMutable();
           exemplars_.set(index, builderForValue.build());
@@ -8773,11 +8725,9 @@ public Builder setExemplars(
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public Builder addExemplars(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) {
+      public Builder addExemplars(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) {
         if (exemplarsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureExemplarsIsMutable();
           exemplars_.add(value);
           onChanged();
@@ -8794,11 +8744,9 @@ public Builder addExemplars(io.prometheus.metrics.expositionformats.generated.co
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder addExemplars(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) {
         if (exemplarsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureExemplarsIsMutable();
           exemplars_.add(index, value);
           onChanged();
@@ -8815,7 +8763,7 @@ public Builder addExemplars(
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder addExemplars(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder builderForValue) {
         if (exemplarsBuilder_ == null) {
           ensureExemplarsIsMutable();
           exemplars_.add(builderForValue.build());
@@ -8833,7 +8781,7 @@ public Builder addExemplars(
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder addExemplars(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder builderForValue) {
         if (exemplarsBuilder_ == null) {
           ensureExemplarsIsMutable();
           exemplars_.add(index, builderForValue.build());
@@ -8851,7 +8799,7 @@ public Builder addExemplars(
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
       public Builder addAllExemplars(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (exemplarsBuilder_ == null) {
           ensureExemplarsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -8903,7 +8851,7 @@ public Builder removeExemplars(int index) {
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder getExemplarsBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder getExemplarsBuilder(
           int index) {
         return internalGetExemplarsFieldBuilder().getBuilder(index);
       }
@@ -8914,7 +8862,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarsOrBuilder(
           int index) {
         if (exemplarsBuilder_ == null) {
           return exemplars_.get(index);  } else {
@@ -8928,7 +8876,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public java.util.List 
+      public java.util.List 
            getExemplarsOrBuilderList() {
         if (exemplarsBuilder_ != null) {
           return exemplarsBuilder_.getMessageOrBuilderList();
@@ -8943,9 +8891,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder addExemplarsBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder addExemplarsBuilder() {
         return internalGetExemplarsFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance());
       }
       /**
        * 
@@ -8954,10 +8902,10 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder addExemplarsBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder addExemplarsBuilder(
           int index) {
         return internalGetExemplarsFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance());
       }
       /**
        * 
@@ -8966,16 +8914,16 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        *
        * repeated .io.prometheus.client.Exemplar exemplars = 16;
        */
-      public java.util.List 
+      public java.util.List 
            getExemplarsBuilderList() {
         return internalGetExemplarsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> 
           internalGetExemplarsFieldBuilder() {
         if (exemplarsBuilder_ == null) {
           exemplarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder>(
                   exemplars_,
                   ((bitField0_ & 0x00008000) != 0),
                   getParentForChildren(),
@@ -8989,12 +8937,12 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.Histogram)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -9030,7 +8978,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -9106,11 +9054,11 @@ public interface BucketOrBuilder extends
      * optional .io.prometheus.client.Exemplar exemplar = 3;
      * @return The exemplar.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar();
     /**
      * optional .io.prometheus.client.Exemplar exemplar = 3;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder();
   }
   /**
    * 
@@ -9129,8 +9077,8 @@ public static final class Bucket extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "Bucket");
     }
@@ -9143,20 +9091,20 @@ private Bucket() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder.class);
     }
 
     private int bitField0_;
@@ -9242,7 +9190,7 @@ public double getUpperBound() {
     }
 
     public static final int EXEMPLAR_FIELD_NUMBER = 3;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar exemplar_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar exemplar_;
     /**
      * optional .io.prometheus.client.Exemplar exemplar = 3;
      * @return Whether the exemplar field is set.
@@ -9256,15 +9204,15 @@ public boolean hasExemplar() {
      * @return The exemplar.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar() {
-      return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar() {
+      return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_;
     }
     /**
      * optional .io.prometheus.client.Exemplar exemplar = 3;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder() {
-      return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder() {
+      return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -9332,10 +9280,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket) obj;
 
       if (hasCumulativeCount() != other.hasCumulativeCount()) return false;
       if (hasCumulativeCount()) {
@@ -9394,44 +9342,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -9439,26 +9387,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -9471,7 +9419,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -9497,21 +9445,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.Bucket)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -9545,17 +9493,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Bucket_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -9563,14 +9511,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket(this);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000001) != 0)) {
@@ -9596,16 +9544,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket.getDefaultInstance()) return this;
         if (other.hasCumulativeCount()) {
           setCumulativeCount(other.getCumulativeCount());
         }
@@ -9633,9 +9581,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -9851,9 +9797,9 @@ public Builder clearUpperBound() {
         return this;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar exemplar_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar exemplar_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> exemplarBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> exemplarBuilder_;
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        * @return Whether the exemplar field is set.
@@ -9865,9 +9811,9 @@ public boolean hasExemplar() {
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        * @return The exemplar.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getExemplar() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getExemplar() {
         if (exemplarBuilder_ == null) {
-          return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_;
+          return exemplar_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_;
         } else {
           return exemplarBuilder_.getMessage();
         }
@@ -9875,11 +9821,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
-      public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) {
+      public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) {
         if (exemplarBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           exemplar_ = value;
         } else {
           exemplarBuilder_.setMessage(value);
@@ -9892,7 +9836,7 @@ public Builder setExemplar(io.prometheus.metrics.expositionformats.generated.com
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
       public Builder setExemplar(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder builderForValue) {
         if (exemplarBuilder_ == null) {
           exemplar_ = builderForValue.build();
         } else {
@@ -9905,11 +9849,11 @@ public Builder setExemplar(
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
-      public Builder mergeExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar value) {
+      public Builder mergeExemplar(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar value) {
         if (exemplarBuilder_ == null) {
           if (((bitField0_ & 0x00000008) != 0) &&
             exemplar_ != null &&
-            exemplar_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance()) {
+            exemplar_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance()) {
             getExemplarBuilder().mergeFrom(value);
           } else {
             exemplar_ = value;
@@ -9939,7 +9883,7 @@ public Builder clearExemplar() {
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder getExemplarBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder getExemplarBuilder() {
         bitField0_ |= 0x00000008;
         onChanged();
         return internalGetExemplarFieldBuilder().getBuilder();
@@ -9947,23 +9891,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder getExemplarOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder getExemplarOrBuilder() {
         if (exemplarBuilder_ != null) {
           return exemplarBuilder_.getMessageOrBuilder();
         } else {
           return exemplar_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance() : exemplar_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance() : exemplar_;
         }
       }
       /**
        * optional .io.prometheus.client.Exemplar exemplar = 3;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder> 
           internalGetExemplarFieldBuilder() {
         if (exemplarBuilder_ == null) {
           exemplarBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder>(
                   getExemplar(),
                   getParentForChildren(),
                   isClean());
@@ -9976,12 +9920,12 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.Bucket)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -10017,7 +9961,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Bucket getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Bucket getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -10086,8 +10030,8 @@ public static final class BucketSpan extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "BucketSpan");
     }
@@ -10100,20 +10044,20 @@ private BucketSpan() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder.class);
     }
 
     private int bitField0_;
@@ -10222,10 +10166,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan) obj;
 
       if (hasOffset() != other.hasOffset()) return false;
       if (hasOffset()) {
@@ -10261,44 +10205,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -10306,26 +10250,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -10338,7 +10282,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -10368,21 +10312,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.BucketSpan)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpanOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpanOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.newBuilder()
       private Builder() {
 
       }
@@ -10404,17 +10348,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_BucketSpan_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -10422,14 +10366,14 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan(this);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000001) != 0)) {
@@ -10445,16 +10389,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan.getDefaultInstance()) return this;
         if (other.hasOffset()) {
           setOffset(other.getOffset());
         }
@@ -10476,9 +10420,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -10630,12 +10572,12 @@ public Builder clearLength() {
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.BucketSpan)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -10671,7 +10613,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.BucketSpan getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.BucketSpan getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -10684,12 +10626,12 @@ public interface ExemplarOrBuilder extends
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    java.util.List 
+    java.util.List 
         getLabelList();
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index);
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
@@ -10697,12 +10639,12 @@ public interface ExemplarOrBuilder extends
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    java.util.List 
+    java.util.List 
         getLabelOrBuilderList();
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
         int index);
 
     /**
@@ -10755,8 +10697,8 @@ public static final class Exemplar extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "Exemplar");
     }
@@ -10770,38 +10712,38 @@ private Exemplar() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder.class);
     }
 
     private int bitField0_;
     public static final int LABEL_FIELD_NUMBER = 1;
     @SuppressWarnings("serial")
-    private java.util.List label_;
+    private java.util.List label_;
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public java.util.List getLabelList() {
+    public java.util.List getLabelList() {
       return label_;
     }
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getLabelOrBuilderList() {
       return label_;
     }
@@ -10816,14 +10758,14 @@ public int getLabelCount() {
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index) {
       return label_.get(index);
     }
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
         int index) {
       return label_.get(index);
     }
@@ -10948,10 +10890,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar) obj;
 
       if (!getLabelList()
           .equals(other.getLabelList())) return false;
@@ -10995,44 +10937,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -11040,26 +10982,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -11072,7 +11014,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -11093,21 +11035,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.Exemplar)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.ExemplarOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.ExemplarOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -11147,17 +11089,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Exemplar_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -11165,15 +11107,15 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar(this);
         buildPartialRepeatedFields(result);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar result) {
+      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar result) {
         if (labelBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
             label_ = java.util.Collections.unmodifiableList(label_);
@@ -11185,7 +11127,7 @@ private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.
         }
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000002) != 0)) {
@@ -11203,16 +11145,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar.getDefaultInstance()) return this;
         if (labelBuilder_ == null) {
           if (!other.label_.isEmpty()) {
             if (label_.isEmpty()) {
@@ -11260,9 +11202,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -11272,9 +11212,9 @@ public Builder mergeFrom(
                 done = true;
                 break;
               case 10: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.parser(),
                         extensionRegistry);
                 if (labelBuilder_ == null) {
                   ensureLabelIsMutable();
@@ -11313,22 +11253,22 @@ public Builder mergeFrom(
       }
       private int bitField0_;
 
-      private java.util.List label_ =
+      private java.util.List label_ =
         java.util.Collections.emptyList();
       private void ensureLabelIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          label_ = new java.util.ArrayList(label_);
+          label_ = new java.util.ArrayList(label_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder> labelBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder> labelBuilder_;
 
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List getLabelList() {
+      public java.util.List getLabelList() {
         if (labelBuilder_ == null) {
           return java.util.Collections.unmodifiableList(label_);
         } else {
@@ -11348,7 +11288,7 @@ public int getLabelCount() {
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index) {
         if (labelBuilder_ == null) {
           return label_.get(index);
         } else {
@@ -11359,11 +11299,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder setLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.set(index, value);
           onChanged();
@@ -11376,7 +11314,7 @@ public Builder setLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder setLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.set(index, builderForValue.build());
@@ -11389,11 +11327,9 @@ public Builder setLabel(
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+      public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.add(value);
           onChanged();
@@ -11406,11 +11342,9 @@ public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_go
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.add(index, value);
           onChanged();
@@ -11423,7 +11357,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.add(builderForValue.build());
@@ -11437,7 +11371,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.add(index, builderForValue.build());
@@ -11451,7 +11385,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addAllLabel(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -11491,14 +11425,14 @@ public Builder removeLabel(int index) {
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder getLabelBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder getLabelBuilder(
           int index) {
         return internalGetLabelFieldBuilder().getBuilder(index);
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
           int index) {
         if (labelBuilder_ == null) {
           return label_.get(index);  } else {
@@ -11508,7 +11442,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List 
+      public java.util.List 
            getLabelOrBuilderList() {
         if (labelBuilder_ != null) {
           return labelBuilder_.getMessageOrBuilderList();
@@ -11519,31 +11453,31 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder addLabelBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder addLabelBuilder() {
         return internalGetLabelFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder addLabelBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder addLabelBuilder(
           int index) {
         return internalGetLabelFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List 
+      public java.util.List 
            getLabelBuilderList() {
         return internalGetLabelFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder> 
           internalGetLabelFieldBuilder() {
         if (labelBuilder_ == null) {
           labelBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder>(
                   label_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
@@ -11631,9 +11565,7 @@ public com.google.protobuf.Timestamp getTimestamp() {
        */
       public Builder setTimestamp(com.google.protobuf.Timestamp value) {
         if (timestampBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           timestamp_ = value;
         } else {
           timestampBuilder_.setMessage(value);
@@ -11754,12 +11686,12 @@ public com.google.protobuf.TimestampOrBuilder getTimestampOrBuilder() {
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.Exemplar)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -11795,7 +11727,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Exemplar getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Exemplar getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -11808,12 +11740,12 @@ public interface MetricOrBuilder extends
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    java.util.List 
+    java.util.List 
         getLabelList();
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index);
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
@@ -11821,12 +11753,12 @@ public interface MetricOrBuilder extends
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    java.util.List 
+    java.util.List 
         getLabelOrBuilderList();
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
         int index);
 
     /**
@@ -11838,11 +11770,11 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      * optional .io.prometheus.client.Gauge gauge = 2;
      * @return The gauge.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getGauge();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getGauge();
     /**
      * optional .io.prometheus.client.Gauge gauge = 2;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder getGaugeOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder getGaugeOrBuilder();
 
     /**
      * optional .io.prometheus.client.Counter counter = 3;
@@ -11853,11 +11785,11 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      * optional .io.prometheus.client.Counter counter = 3;
      * @return The counter.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getCounter();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getCounter();
     /**
      * optional .io.prometheus.client.Counter counter = 3;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder getCounterOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder getCounterOrBuilder();
 
     /**
      * optional .io.prometheus.client.Summary summary = 4;
@@ -11868,11 +11800,11 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      * optional .io.prometheus.client.Summary summary = 4;
      * @return The summary.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getSummary();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getSummary();
     /**
      * optional .io.prometheus.client.Summary summary = 4;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder getSummaryOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder getSummaryOrBuilder();
 
     /**
      * optional .io.prometheus.client.Untyped untyped = 5;
@@ -11883,11 +11815,11 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      * optional .io.prometheus.client.Untyped untyped = 5;
      * @return The untyped.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getUntyped();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getUntyped();
     /**
      * optional .io.prometheus.client.Untyped untyped = 5;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder getUntypedOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder getUntypedOrBuilder();
 
     /**
      * optional .io.prometheus.client.Histogram histogram = 7;
@@ -11898,11 +11830,11 @@ io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Met
      * optional .io.prometheus.client.Histogram histogram = 7;
      * @return The histogram.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getHistogram();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getHistogram();
     /**
      * optional .io.prometheus.client.Histogram histogram = 7;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder getHistogramOrBuilder();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder getHistogramOrBuilder();
 
     /**
      * optional int64 timestamp_ms = 6;
@@ -11927,8 +11859,8 @@ public static final class Metric extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "Metric");
     }
@@ -11942,38 +11874,38 @@ private Metric() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder.class);
     }
 
     private int bitField0_;
     public static final int LABEL_FIELD_NUMBER = 1;
     @SuppressWarnings("serial")
-    private java.util.List label_;
+    private java.util.List label_;
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public java.util.List getLabelList() {
+    public java.util.List getLabelList() {
       return label_;
     }
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getLabelOrBuilderList() {
       return label_;
     }
@@ -11988,20 +11920,20 @@ public int getLabelCount() {
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index) {
       return label_.get(index);
     }
     /**
      * repeated .io.prometheus.client.LabelPair label = 1;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
         int index) {
       return label_.get(index);
     }
 
     public static final int GAUGE_FIELD_NUMBER = 2;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge gauge_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge gauge_;
     /**
      * optional .io.prometheus.client.Gauge gauge = 2;
      * @return Whether the gauge field is set.
@@ -12015,19 +11947,19 @@ public boolean hasGauge() {
      * @return The gauge.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getGauge() {
-      return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance() : gauge_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getGauge() {
+      return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance() : gauge_;
     }
     /**
      * optional .io.prometheus.client.Gauge gauge = 2;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder getGaugeOrBuilder() {
-      return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance() : gauge_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder getGaugeOrBuilder() {
+      return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance() : gauge_;
     }
 
     public static final int COUNTER_FIELD_NUMBER = 3;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter counter_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter counter_;
     /**
      * optional .io.prometheus.client.Counter counter = 3;
      * @return Whether the counter field is set.
@@ -12041,19 +11973,19 @@ public boolean hasCounter() {
      * @return The counter.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getCounter() {
-      return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance() : counter_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getCounter() {
+      return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance() : counter_;
     }
     /**
      * optional .io.prometheus.client.Counter counter = 3;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder getCounterOrBuilder() {
-      return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance() : counter_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder getCounterOrBuilder() {
+      return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance() : counter_;
     }
 
     public static final int SUMMARY_FIELD_NUMBER = 4;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary summary_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary summary_;
     /**
      * optional .io.prometheus.client.Summary summary = 4;
      * @return Whether the summary field is set.
@@ -12067,19 +11999,19 @@ public boolean hasSummary() {
      * @return The summary.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getSummary() {
-      return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance() : summary_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getSummary() {
+      return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance() : summary_;
     }
     /**
      * optional .io.prometheus.client.Summary summary = 4;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder getSummaryOrBuilder() {
-      return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance() : summary_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder getSummaryOrBuilder() {
+      return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance() : summary_;
     }
 
     public static final int UNTYPED_FIELD_NUMBER = 5;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped untyped_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped untyped_;
     /**
      * optional .io.prometheus.client.Untyped untyped = 5;
      * @return Whether the untyped field is set.
@@ -12093,19 +12025,19 @@ public boolean hasUntyped() {
      * @return The untyped.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getUntyped() {
-      return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance() : untyped_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getUntyped() {
+      return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance() : untyped_;
     }
     /**
      * optional .io.prometheus.client.Untyped untyped = 5;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder getUntypedOrBuilder() {
-      return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance() : untyped_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder getUntypedOrBuilder() {
+      return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance() : untyped_;
     }
 
     public static final int HISTOGRAM_FIELD_NUMBER = 7;
-    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram histogram_;
+    private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram histogram_;
     /**
      * optional .io.prometheus.client.Histogram histogram = 7;
      * @return Whether the histogram field is set.
@@ -12119,15 +12051,15 @@ public boolean hasHistogram() {
      * @return The histogram.
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getHistogram() {
-      return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance() : histogram_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getHistogram() {
+      return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance() : histogram_;
     }
     /**
      * optional .io.prometheus.client.Histogram histogram = 7;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder getHistogramOrBuilder() {
-      return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance() : histogram_;
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder getHistogramOrBuilder() {
+      return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance() : histogram_;
     }
 
     public static final int TIMESTAMP_MS_FIELD_NUMBER = 6;
@@ -12240,10 +12172,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric) obj;
 
       if (!getLabelList()
           .equals(other.getLabelList())) return false;
@@ -12322,44 +12254,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -12367,26 +12299,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -12399,7 +12331,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -12420,21 +12352,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.Metric)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -12498,17 +12430,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_Metric_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -12516,15 +12448,15 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric(this);
         buildPartialRepeatedFields(result);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric result) {
+      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric result) {
         if (labelBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
             label_ = java.util.Collections.unmodifiableList(label_);
@@ -12536,7 +12468,7 @@ private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.
         }
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000002) != 0)) {
@@ -12578,16 +12510,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.getDefaultInstance()) return this;
         if (labelBuilder_ == null) {
           if (!other.label_.isEmpty()) {
             if (label_.isEmpty()) {
@@ -12647,9 +12579,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -12659,9 +12589,9 @@ public Builder mergeFrom(
                 done = true;
                 break;
               case 10: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.parser(),
                         extensionRegistry);
                 if (labelBuilder_ == null) {
                   ensureLabelIsMutable();
@@ -12728,22 +12658,22 @@ public Builder mergeFrom(
       }
       private int bitField0_;
 
-      private java.util.List label_ =
+      private java.util.List label_ =
         java.util.Collections.emptyList();
       private void ensureLabelIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          label_ = new java.util.ArrayList(label_);
+          label_ = new java.util.ArrayList(label_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder> labelBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder> labelBuilder_;
 
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List getLabelList() {
+      public java.util.List getLabelList() {
         if (labelBuilder_ == null) {
           return java.util.Collections.unmodifiableList(label_);
         } else {
@@ -12763,7 +12693,7 @@ public int getLabelCount() {
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair getLabel(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair getLabel(int index) {
         if (labelBuilder_ == null) {
           return label_.get(index);
         } else {
@@ -12774,11 +12704,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder setLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.set(index, value);
           onChanged();
@@ -12791,7 +12719,7 @@ public Builder setLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder setLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.set(index, builderForValue.build());
@@ -12804,11 +12732,9 @@ public Builder setLabel(
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+      public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.add(value);
           onChanged();
@@ -12821,11 +12747,9 @@ public Builder addLabel(io.prometheus.metrics.expositionformats.generated.com_go
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair value) {
         if (labelBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureLabelIsMutable();
           label_.add(index, value);
           onChanged();
@@ -12838,7 +12762,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.add(builderForValue.build());
@@ -12852,7 +12776,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addLabel(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder builderForValue) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           label_.add(index, builderForValue.build());
@@ -12866,7 +12790,7 @@ public Builder addLabel(
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
       public Builder addAllLabel(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (labelBuilder_ == null) {
           ensureLabelIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -12906,14 +12830,14 @@ public Builder removeLabel(int index) {
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder getLabelBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder getLabelBuilder(
           int index) {
         return internalGetLabelFieldBuilder().getBuilder(index);
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder getLabelOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder getLabelOrBuilder(
           int index) {
         if (labelBuilder_ == null) {
           return label_.get(index);  } else {
@@ -12923,7 +12847,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List 
+      public java.util.List 
            getLabelOrBuilderList() {
         if (labelBuilder_ != null) {
           return labelBuilder_.getMessageOrBuilderList();
@@ -12934,31 +12858,31 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder addLabelBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder addLabelBuilder() {
         return internalGetLabelFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder addLabelBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder addLabelBuilder(
           int index) {
         return internalGetLabelFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.LabelPair label = 1;
        */
-      public java.util.List 
+      public java.util.List 
            getLabelBuilderList() {
         return internalGetLabelFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder> 
           internalGetLabelFieldBuilder() {
         if (labelBuilder_ == null) {
           labelBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.LabelPairOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPair.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.LabelPairOrBuilder>(
                   label_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
@@ -12968,9 +12892,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
         return labelBuilder_;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge gauge_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge gauge_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder> gaugeBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder> gaugeBuilder_;
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        * @return Whether the gauge field is set.
@@ -12982,9 +12906,9 @@ public boolean hasGauge() {
        * optional .io.prometheus.client.Gauge gauge = 2;
        * @return The gauge.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge getGauge() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge getGauge() {
         if (gaugeBuilder_ == null) {
-          return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance() : gauge_;
+          return gauge_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance() : gauge_;
         } else {
           return gaugeBuilder_.getMessage();
         }
@@ -12992,11 +12916,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
-      public Builder setGauge(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge value) {
+      public Builder setGauge(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge value) {
         if (gaugeBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           gauge_ = value;
         } else {
           gaugeBuilder_.setMessage(value);
@@ -13009,7 +12931,7 @@ public Builder setGauge(io.prometheus.metrics.expositionformats.generated.com_go
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
       public Builder setGauge(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder builderForValue) {
         if (gaugeBuilder_ == null) {
           gauge_ = builderForValue.build();
         } else {
@@ -13022,11 +12944,11 @@ public Builder setGauge(
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
-      public Builder mergeGauge(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge value) {
+      public Builder mergeGauge(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge value) {
         if (gaugeBuilder_ == null) {
           if (((bitField0_ & 0x00000002) != 0) &&
             gauge_ != null &&
-            gauge_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance()) {
+            gauge_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance()) {
             getGaugeBuilder().mergeFrom(value);
           } else {
             gauge_ = value;
@@ -13056,7 +12978,7 @@ public Builder clearGauge() {
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder getGaugeBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder getGaugeBuilder() {
         bitField0_ |= 0x00000002;
         onChanged();
         return internalGetGaugeFieldBuilder().getBuilder();
@@ -13064,23 +12986,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder getGaugeOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder getGaugeOrBuilder() {
         if (gaugeBuilder_ != null) {
           return gaugeBuilder_.getMessageOrBuilder();
         } else {
           return gauge_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.getDefaultInstance() : gauge_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.getDefaultInstance() : gauge_;
         }
       }
       /**
        * optional .io.prometheus.client.Gauge gauge = 2;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder> 
           internalGetGaugeFieldBuilder() {
         if (gaugeBuilder_ == null) {
           gaugeBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.GaugeOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Gauge.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.GaugeOrBuilder>(
                   getGauge(),
                   getParentForChildren(),
                   isClean());
@@ -13089,9 +13011,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
         return gaugeBuilder_;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter counter_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter counter_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder> counterBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder> counterBuilder_;
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        * @return Whether the counter field is set.
@@ -13103,9 +13025,9 @@ public boolean hasCounter() {
        * optional .io.prometheus.client.Counter counter = 3;
        * @return The counter.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter getCounter() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter getCounter() {
         if (counterBuilder_ == null) {
-          return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance() : counter_;
+          return counter_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance() : counter_;
         } else {
           return counterBuilder_.getMessage();
         }
@@ -13113,11 +13035,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        */
-      public Builder setCounter(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter value) {
+      public Builder setCounter(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter value) {
         if (counterBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           counter_ = value;
         } else {
           counterBuilder_.setMessage(value);
@@ -13130,7 +13050,7 @@ public Builder setCounter(io.prometheus.metrics.expositionformats.generated.com_
        * optional .io.prometheus.client.Counter counter = 3;
        */
       public Builder setCounter(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder builderForValue) {
         if (counterBuilder_ == null) {
           counter_ = builderForValue.build();
         } else {
@@ -13143,11 +13063,11 @@ public Builder setCounter(
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        */
-      public Builder mergeCounter(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter value) {
+      public Builder mergeCounter(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter value) {
         if (counterBuilder_ == null) {
           if (((bitField0_ & 0x00000004) != 0) &&
             counter_ != null &&
-            counter_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance()) {
+            counter_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance()) {
             getCounterBuilder().mergeFrom(value);
           } else {
             counter_ = value;
@@ -13177,7 +13097,7 @@ public Builder clearCounter() {
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder getCounterBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder getCounterBuilder() {
         bitField0_ |= 0x00000004;
         onChanged();
         return internalGetCounterFieldBuilder().getBuilder();
@@ -13185,23 +13105,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder getCounterOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder getCounterOrBuilder() {
         if (counterBuilder_ != null) {
           return counterBuilder_.getMessageOrBuilder();
         } else {
           return counter_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.getDefaultInstance() : counter_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.getDefaultInstance() : counter_;
         }
       }
       /**
        * optional .io.prometheus.client.Counter counter = 3;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder> 
           internalGetCounterFieldBuilder() {
         if (counterBuilder_ == null) {
           counterBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.CounterOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Counter.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.CounterOrBuilder>(
                   getCounter(),
                   getParentForChildren(),
                   isClean());
@@ -13210,9 +13130,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
         return counterBuilder_;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary summary_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary summary_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder> summaryBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder> summaryBuilder_;
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        * @return Whether the summary field is set.
@@ -13224,9 +13144,9 @@ public boolean hasSummary() {
        * optional .io.prometheus.client.Summary summary = 4;
        * @return The summary.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary getSummary() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary getSummary() {
         if (summaryBuilder_ == null) {
-          return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance() : summary_;
+          return summary_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance() : summary_;
         } else {
           return summaryBuilder_.getMessage();
         }
@@ -13234,11 +13154,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        */
-      public Builder setSummary(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary value) {
+      public Builder setSummary(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary value) {
         if (summaryBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           summary_ = value;
         } else {
           summaryBuilder_.setMessage(value);
@@ -13251,7 +13169,7 @@ public Builder setSummary(io.prometheus.metrics.expositionformats.generated.com_
        * optional .io.prometheus.client.Summary summary = 4;
        */
       public Builder setSummary(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder builderForValue) {
         if (summaryBuilder_ == null) {
           summary_ = builderForValue.build();
         } else {
@@ -13264,11 +13182,11 @@ public Builder setSummary(
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        */
-      public Builder mergeSummary(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary value) {
+      public Builder mergeSummary(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary value) {
         if (summaryBuilder_ == null) {
           if (((bitField0_ & 0x00000008) != 0) &&
             summary_ != null &&
-            summary_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance()) {
+            summary_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance()) {
             getSummaryBuilder().mergeFrom(value);
           } else {
             summary_ = value;
@@ -13298,7 +13216,7 @@ public Builder clearSummary() {
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder getSummaryBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder getSummaryBuilder() {
         bitField0_ |= 0x00000008;
         onChanged();
         return internalGetSummaryFieldBuilder().getBuilder();
@@ -13306,23 +13224,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder getSummaryOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder getSummaryOrBuilder() {
         if (summaryBuilder_ != null) {
           return summaryBuilder_.getMessageOrBuilder();
         } else {
           return summary_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.getDefaultInstance() : summary_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.getDefaultInstance() : summary_;
         }
       }
       /**
        * optional .io.prometheus.client.Summary summary = 4;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder> 
           internalGetSummaryFieldBuilder() {
         if (summaryBuilder_ == null) {
           summaryBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.SummaryOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Summary.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.SummaryOrBuilder>(
                   getSummary(),
                   getParentForChildren(),
                   isClean());
@@ -13331,9 +13249,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
         return summaryBuilder_;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped untyped_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped untyped_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder> untypedBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder> untypedBuilder_;
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        * @return Whether the untyped field is set.
@@ -13345,9 +13263,9 @@ public boolean hasUntyped() {
        * optional .io.prometheus.client.Untyped untyped = 5;
        * @return The untyped.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped getUntyped() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped getUntyped() {
         if (untypedBuilder_ == null) {
-          return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance() : untyped_;
+          return untyped_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance() : untyped_;
         } else {
           return untypedBuilder_.getMessage();
         }
@@ -13355,11 +13273,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
-      public Builder setUntyped(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped value) {
+      public Builder setUntyped(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped value) {
         if (untypedBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           untyped_ = value;
         } else {
           untypedBuilder_.setMessage(value);
@@ -13372,7 +13288,7 @@ public Builder setUntyped(io.prometheus.metrics.expositionformats.generated.com_
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
       public Builder setUntyped(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder builderForValue) {
         if (untypedBuilder_ == null) {
           untyped_ = builderForValue.build();
         } else {
@@ -13385,11 +13301,11 @@ public Builder setUntyped(
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
-      public Builder mergeUntyped(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped value) {
+      public Builder mergeUntyped(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped value) {
         if (untypedBuilder_ == null) {
           if (((bitField0_ & 0x00000010) != 0) &&
             untyped_ != null &&
-            untyped_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance()) {
+            untyped_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance()) {
             getUntypedBuilder().mergeFrom(value);
           } else {
             untyped_ = value;
@@ -13419,7 +13335,7 @@ public Builder clearUntyped() {
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder getUntypedBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder getUntypedBuilder() {
         bitField0_ |= 0x00000010;
         onChanged();
         return internalGetUntypedFieldBuilder().getBuilder();
@@ -13427,23 +13343,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder getUntypedOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder getUntypedOrBuilder() {
         if (untypedBuilder_ != null) {
           return untypedBuilder_.getMessageOrBuilder();
         } else {
           return untyped_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.getDefaultInstance() : untyped_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.getDefaultInstance() : untyped_;
         }
       }
       /**
        * optional .io.prometheus.client.Untyped untyped = 5;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder> 
           internalGetUntypedFieldBuilder() {
         if (untypedBuilder_ == null) {
           untypedBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.UntypedOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Untyped.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.UntypedOrBuilder>(
                   getUntyped(),
                   getParentForChildren(),
                   isClean());
@@ -13452,9 +13368,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
         return untypedBuilder_;
       }
 
-      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram histogram_;
+      private io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram histogram_;
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder> histogramBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder> histogramBuilder_;
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        * @return Whether the histogram field is set.
@@ -13466,9 +13382,9 @@ public boolean hasHistogram() {
        * optional .io.prometheus.client.Histogram histogram = 7;
        * @return The histogram.
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram getHistogram() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram getHistogram() {
         if (histogramBuilder_ == null) {
-          return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance() : histogram_;
+          return histogram_ == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance() : histogram_;
         } else {
           return histogramBuilder_.getMessage();
         }
@@ -13476,11 +13392,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
-      public Builder setHistogram(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram value) {
+      public Builder setHistogram(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram value) {
         if (histogramBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           histogram_ = value;
         } else {
           histogramBuilder_.setMessage(value);
@@ -13493,7 +13407,7 @@ public Builder setHistogram(io.prometheus.metrics.expositionformats.generated.co
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
       public Builder setHistogram(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder builderForValue) {
         if (histogramBuilder_ == null) {
           histogram_ = builderForValue.build();
         } else {
@@ -13506,11 +13420,11 @@ public Builder setHistogram(
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
-      public Builder mergeHistogram(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram value) {
+      public Builder mergeHistogram(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram value) {
         if (histogramBuilder_ == null) {
           if (((bitField0_ & 0x00000020) != 0) &&
             histogram_ != null &&
-            histogram_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance()) {
+            histogram_ != io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance()) {
             getHistogramBuilder().mergeFrom(value);
           } else {
             histogram_ = value;
@@ -13540,7 +13454,7 @@ public Builder clearHistogram() {
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder getHistogramBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder getHistogramBuilder() {
         bitField0_ |= 0x00000020;
         onChanged();
         return internalGetHistogramFieldBuilder().getBuilder();
@@ -13548,23 +13462,23 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder getHistogramOrBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder getHistogramOrBuilder() {
         if (histogramBuilder_ != null) {
           return histogramBuilder_.getMessageOrBuilder();
         } else {
           return histogram_ == null ?
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.getDefaultInstance() : histogram_;
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.getDefaultInstance() : histogram_;
         }
       }
       /**
        * optional .io.prometheus.client.Histogram histogram = 7;
        */
       private com.google.protobuf.SingleFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder> 
           internalGetHistogramFieldBuilder() {
         if (histogramBuilder_ == null) {
           histogramBuilder_ = new com.google.protobuf.SingleFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.HistogramOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Histogram.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.HistogramOrBuilder>(
                   getHistogram(),
                   getParentForChildren(),
                   isClean());
@@ -13617,12 +13531,12 @@ public Builder clearTimestampMs() {
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.Metric)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -13658,7 +13572,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -13711,17 +13625,17 @@ public interface MetricFamilyOrBuilder extends
      * optional .io.prometheus.client.MetricType type = 3;
      * @return The type.
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType getType();
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType getType();
 
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
-    java.util.List 
+    java.util.List 
         getMetricList();
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getMetric(int index);
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getMetric(int index);
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
@@ -13729,12 +13643,12 @@ public interface MetricFamilyOrBuilder extends
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
-    java.util.List 
+    java.util.List 
         getMetricOrBuilderList();
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
-    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder getMetricOrBuilder(
+    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder getMetricOrBuilder(
         int index);
 
     /**
@@ -13766,8 +13680,8 @@ public static final class MetricFamily extends
       com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
         com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
         /* major= */ 4,
-        /* minor= */ 35,
-        /* patch= */ 1,
+        /* minor= */ 36,
+        /* patch= */ 2,
         /* suffix= */ "",
         "MetricFamily");
     }
@@ -13785,20 +13699,20 @@ private MetricFamily() {
 
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable
+      return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.Builder.class);
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.Builder.class);
     }
 
     private int bitField0_;
@@ -13913,26 +13827,26 @@ public java.lang.String getHelp() {
      * optional .io.prometheus.client.MetricType type = 3;
      * @return The type.
      */
-    @java.lang.Override public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType getType() {
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType result = io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType.forNumber(type_);
-      return result == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType.COUNTER : result;
+    @java.lang.Override public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType getType() {
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType result = io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType.forNumber(type_);
+      return result == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType.COUNTER : result;
     }
 
     public static final int METRIC_FIELD_NUMBER = 4;
     @SuppressWarnings("serial")
-    private java.util.List metric_;
+    private java.util.List metric_;
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
     @java.lang.Override
-    public java.util.List getMetricList() {
+    public java.util.List getMetricList() {
       return metric_;
     }
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
     @java.lang.Override
-    public java.util.List 
+    public java.util.List 
         getMetricOrBuilderList() {
       return metric_;
     }
@@ -13947,14 +13861,14 @@ public int getMetricCount() {
      * repeated .io.prometheus.client.Metric metric = 4;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getMetric(int index) {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getMetric(int index) {
       return metric_.get(index);
     }
     /**
      * repeated .io.prometheus.client.Metric metric = 4;
      */
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder getMetricOrBuilder(
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder getMetricOrBuilder(
         int index) {
       return metric_.get(index);
     }
@@ -14082,10 +13996,10 @@ public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily)) {
+      if (!(obj instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily)) {
         return super.equals(obj);
       }
-      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily) obj;
+      io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily other = (io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily) obj;
 
       if (hasName() != other.hasName()) return false;
       if (hasName()) {
@@ -14144,44 +14058,44 @@ public int hashCode() {
       return hash;
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(byte[] data)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -14189,26 +14103,26 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseDelimitedFrom(java.io.InputStream input)
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input);
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseDelimitedFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessage
           .parseWithIOException(PARSER, input);
     }
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily parseFrom(
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -14221,7 +14135,7 @@ public static io.prometheus.metrics.expositionformats.generated.com_google_proto
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily prototype) {
+    public static Builder newBuilder(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -14242,21 +14156,21 @@ protected Builder newBuilderForType(
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder implements
         // @@protoc_insertion_point(builder_implements:io.prometheus.client.MetricFamily)
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamilyOrBuilder {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamilyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.Builder.class);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.class, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.Builder.class);
       }
 
-      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.newBuilder()
+      // Construct using io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.newBuilder()
       private Builder() {
 
       }
@@ -14287,17 +14201,17 @@ public Builder clear() {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.internal_static_io_prometheus_client_MetricFamily_descriptor;
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily getDefaultInstanceForType() {
-        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.getDefaultInstance();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily getDefaultInstanceForType() {
+        return io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.getDefaultInstance();
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily build() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily result = buildPartial();
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily build() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -14305,15 +14219,15 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       }
 
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily buildPartial() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily(this);
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily buildPartial() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily result = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily(this);
         buildPartialRepeatedFields(result);
         if (bitField0_ != 0) { buildPartial0(result); }
         onBuilt();
         return result;
       }
 
-      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily result) {
+      private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily result) {
         if (metricBuilder_ == null) {
           if (((bitField0_ & 0x00000008) != 0)) {
             metric_ = java.util.Collections.unmodifiableList(metric_);
@@ -14325,7 +14239,7 @@ private void buildPartialRepeatedFields(io.prometheus.metrics.expositionformats.
         }
       }
 
-      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily result) {
+      private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily result) {
         int from_bitField0_ = bitField0_;
         int to_bitField0_ = 0;
         if (((from_bitField0_ & 0x00000001) != 0)) {
@@ -14349,16 +14263,16 @@ private void buildPartial0(io.prometheus.metrics.expositionformats.generated.com
 
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily) {
-          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily)other);
+        if (other instanceof io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily) {
+          return mergeFrom((io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily other) {
-        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily.getDefaultInstance()) return this;
+      public Builder mergeFrom(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily other) {
+        if (other == io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily.getDefaultInstance()) return this;
         if (other.hasName()) {
           name_ = other.name_;
           bitField0_ |= 0x00000001;
@@ -14418,9 +14332,7 @@ public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        if (extensionRegistry == null) {
-          throw new java.lang.NullPointerException();
-        }
+        java.util.Objects.requireNonNull(extensionRegistry);
         try {
           boolean done = false;
           while (!done) {
@@ -14441,8 +14353,8 @@ public Builder mergeFrom(
               } // case 18
               case 24: {
                 int tmpRaw = input.readEnum();
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType tmpValue =
-                    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType.forNumber(tmpRaw);
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType tmpValue =
+                    io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType.forNumber(tmpRaw);
                 if (tmpValue == null) {
                   mergeUnknownVarintField(3, tmpRaw);
                 } else {
@@ -14452,9 +14364,9 @@ public Builder mergeFrom(
                 break;
               } // case 24
               case 34: {
-                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric m =
+                io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric m =
                     input.readMessage(
-                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.parser(),
+                        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.parser(),
                         extensionRegistry);
                 if (metricBuilder_ == null) {
                   ensureMetricIsMutable();
@@ -14536,7 +14448,7 @@ public java.lang.String getName() {
        */
       public Builder setName(
           java.lang.String value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         name_ = value;
         bitField0_ |= 0x00000001;
         onChanged();
@@ -14559,7 +14471,7 @@ public Builder clearName() {
        */
       public Builder setNameBytes(
           com.google.protobuf.ByteString value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         name_ = value;
         bitField0_ |= 0x00000001;
         onChanged();
@@ -14616,7 +14528,7 @@ public java.lang.String getHelp() {
        */
       public Builder setHelp(
           java.lang.String value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         help_ = value;
         bitField0_ |= 0x00000002;
         onChanged();
@@ -14639,7 +14551,7 @@ public Builder clearHelp() {
        */
       public Builder setHelpBytes(
           com.google.protobuf.ByteString value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         help_ = value;
         bitField0_ |= 0x00000002;
         onChanged();
@@ -14659,17 +14571,17 @@ public Builder setHelpBytes(
        * @return The type.
        */
       @java.lang.Override
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType getType() {
-        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType result = io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType.forNumber(type_);
-        return result == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType.COUNTER : result;
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType getType() {
+        io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType result = io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType.forNumber(type_);
+        return result == null ? io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType.COUNTER : result;
       }
       /**
        * optional .io.prometheus.client.MetricType type = 3;
        * @param value The type to set.
        * @return This builder for chaining.
        */
-      public Builder setType(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricType value) {
-        if (value == null) { throw new NullPointerException(); }
+      public Builder setType(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricType value) {
+        java.util.Objects.requireNonNull(value);
         bitField0_ |= 0x00000004;
         type_ = value.getNumber();
         onChanged();
@@ -14686,22 +14598,22 @@ public Builder clearType() {
         return this;
       }
 
-      private java.util.List metric_ =
+      private java.util.List metric_ =
         java.util.Collections.emptyList();
       private void ensureMetricIsMutable() {
         if (!((bitField0_ & 0x00000008) != 0)) {
-          metric_ = new java.util.ArrayList(metric_);
+          metric_ = new java.util.ArrayList(metric_);
           bitField0_ |= 0x00000008;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder> metricBuilder_;
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder> metricBuilder_;
 
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public java.util.List getMetricList() {
+      public java.util.List getMetricList() {
         if (metricBuilder_ == null) {
           return java.util.Collections.unmodifiableList(metric_);
         } else {
@@ -14721,7 +14633,7 @@ public int getMetricCount() {
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric getMetric(int index) {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric getMetric(int index) {
         if (metricBuilder_ == null) {
           return metric_.get(index);
         } else {
@@ -14732,11 +14644,9 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder setMetric(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric value) {
         if (metricBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureMetricIsMutable();
           metric_.set(index, value);
           onChanged();
@@ -14749,7 +14659,7 @@ public Builder setMetric(
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder setMetric(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder builderForValue) {
         if (metricBuilder_ == null) {
           ensureMetricIsMutable();
           metric_.set(index, builderForValue.build());
@@ -14762,11 +14672,9 @@ public Builder setMetric(
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public Builder addMetric(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric value) {
+      public Builder addMetric(io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric value) {
         if (metricBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureMetricIsMutable();
           metric_.add(value);
           onChanged();
@@ -14779,11 +14687,9 @@ public Builder addMetric(io.prometheus.metrics.expositionformats.generated.com_g
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder addMetric(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric value) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric value) {
         if (metricBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
+          java.util.Objects.requireNonNull(value);
           ensureMetricIsMutable();
           metric_.add(index, value);
           onChanged();
@@ -14796,7 +14702,7 @@ public Builder addMetric(
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder addMetric(
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder builderForValue) {
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder builderForValue) {
         if (metricBuilder_ == null) {
           ensureMetricIsMutable();
           metric_.add(builderForValue.build());
@@ -14810,7 +14716,7 @@ public Builder addMetric(
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder addMetric(
-          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder builderForValue) {
+          int index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder builderForValue) {
         if (metricBuilder_ == null) {
           ensureMetricIsMutable();
           metric_.add(index, builderForValue.build());
@@ -14824,7 +14730,7 @@ public Builder addMetric(
        * repeated .io.prometheus.client.Metric metric = 4;
        */
       public Builder addAllMetric(
-          java.lang.Iterable values) {
+          java.lang.Iterable values) {
         if (metricBuilder_ == null) {
           ensureMetricIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -14864,14 +14770,14 @@ public Builder removeMetric(int index) {
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder getMetricBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder getMetricBuilder(
           int index) {
         return internalGetMetricFieldBuilder().getBuilder(index);
       }
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder getMetricOrBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder getMetricOrBuilder(
           int index) {
         if (metricBuilder_ == null) {
           return metric_.get(index);  } else {
@@ -14881,7 +14787,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public java.util.List 
+      public java.util.List 
            getMetricOrBuilderList() {
         if (metricBuilder_ != null) {
           return metricBuilder_.getMessageOrBuilderList();
@@ -14892,31 +14798,31 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder addMetricBuilder() {
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder addMetricBuilder() {
         return internalGetMetricFieldBuilder().addBuilder(
-            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.getDefaultInstance());
+            io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder addMetricBuilder(
+      public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder addMetricBuilder(
           int index) {
         return internalGetMetricFieldBuilder().addBuilder(
-            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.getDefaultInstance());
+            index, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.getDefaultInstance());
       }
       /**
        * repeated .io.prometheus.client.Metric metric = 4;
        */
-      public java.util.List 
+      public java.util.List 
            getMetricBuilderList() {
         return internalGetMetricFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilder<
-          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder> 
+          io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder> 
           internalGetMetricFieldBuilder() {
         if (metricBuilder_ == null) {
           metricBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
-              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricOrBuilder>(
+              io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.Metric.Builder, io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricOrBuilder>(
                   metric_,
                   ((bitField0_ & 0x00000008) != 0),
                   getParentForChildren(),
@@ -14976,7 +14882,7 @@ public java.lang.String getUnit() {
        */
       public Builder setUnit(
           java.lang.String value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         unit_ = value;
         bitField0_ |= 0x00000010;
         onChanged();
@@ -14999,7 +14905,7 @@ public Builder clearUnit() {
        */
       public Builder setUnitBytes(
           com.google.protobuf.ByteString value) {
-        if (value == null) { throw new NullPointerException(); }
+        java.util.Objects.requireNonNull(value);
         unit_ = value;
         bitField0_ |= 0x00000010;
         onChanged();
@@ -15010,12 +14916,12 @@ public Builder setUnitBytes(
     }
 
     // @@protoc_insertion_point(class_scope:io.prometheus.client.MetricFamily)
-    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily DEFAULT_INSTANCE;
+    private static final io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily();
+      DEFAULT_INSTANCE = new io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily();
     }
 
-    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily getDefaultInstance() {
+    public static io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
@@ -15051,7 +14957,7 @@ public com.google.protobuf.Parser getParserForType() {
     }
 
     @java.lang.Override
-    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics.MetricFamily getDefaultInstanceForType() {
+    public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics.MetricFamily getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -15176,7 +15082,7 @@ public io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_3
       "\002\022\013\n\007UNTYPED\020\003\022\r\n\tHISTOGRAM\020\004\022\023\n\017GAUGE_H" +
       "ISTOGRAM\020\005B\212\001\nLio.prometheus.metrics.exp" +
       "ositionformats.generated.com_google_prot" +
-      "obuf_4_35_1Z:github.com/prometheus/clien" +
+      "obuf_4_36_2Z:github.com/prometheus/clien" +
       "t_model/go;io_prometheus_client"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
diff --git a/prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/generated/Metrics.java b/prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/generated/Metrics.java
index 89130259e3..e04f18ed8c 100644
--- a/prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/generated/Metrics.java
+++ b/prometheus-metrics-exposition-formats/src/main/java/io/prometheus/metrics/expositionformats/generated/Metrics.java
@@ -1,6 +1,6 @@
 package io.prometheus.metrics.expositionformats.generated;
 
 public final class Metrics
-    extends io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_35_1.Metrics {
+    extends io.prometheus.metrics.expositionformats.generated.com_google_protobuf_4_36_2.Metrics {
   private Metrics() {}
 }
diff --git a/prometheus-metrics-exposition-formats/src/test/java/io/prometheus/metrics/expositionformats/OsgiBundleManifestTest.java b/prometheus-metrics-exposition-formats/src/test/java/io/prometheus/metrics/expositionformats/OsgiBundleManifestTest.java
new file mode 100644
index 0000000000..7614e37836
--- /dev/null
+++ b/prometheus-metrics-exposition-formats/src/test/java/io/prometheus/metrics/expositionformats/OsgiBundleManifestTest.java
@@ -0,0 +1,179 @@
+package io.prometheus.metrics.expositionformats;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.prometheus.metrics.expositionformats.internal.PrometheusProtobufWriterImpl;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.CodeSource;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.junit.jupiter.api.Test;
+
+class OsgiBundleManifestTest {
+
+  private static final String INTERNAL_PACKAGE = "io.prometheus.metrics.expositionformats.internal";
+  private static final String GENERATED_PREFIX =
+      "io.prometheus.metrics.expositionformats.generated";
+  private static final String SHADED_BSN = "io.prometheus.metrics-exposition-formats";
+  private static final String TEXTFORMATS_BSN = "io.prometheus.metrics-exposition-textformats";
+
+  @Test
+  void formatsBundleExportsInternalPackage() throws Exception {
+    Manifest manifest = loadBundleManifest(PrometheusProtobufWriterImpl.class);
+    assertThat(bundleSymbolicName(manifest)).contains("exposition-formats");
+    List exported = parsePackageHeader(manifest, "Export-Package");
+    assertThat(names(exported)).contains(INTERNAL_PACKAGE);
+    assertThat(exported).anyMatch(clause -> clause.name.startsWith(GENERATED_PREFIX));
+    for (PackageClause clause : exported) {
+      if (!INTERNAL_PACKAGE.equals(clause.name) && !clause.name.startsWith(GENERATED_PREFIX)) {
+        continue;
+      }
+      assertThat(clause.attributes.get("version"))
+          .as("version of %s", clause.name)
+          .isNotBlank()
+          .doesNotContain(".SNAPSHOT")
+          .doesNotContain("-SNAPSHOT");
+    }
+  }
+
+  @Test
+  void textformatsBundleImportsInternalPackageOptionally() throws Exception {
+    Manifest manifest = loadBundleManifest(PrometheusProtobufWriter.class);
+    assertThat(bundleSymbolicName(manifest)).isEqualTo(TEXTFORMATS_BSN);
+    PackageClause internal =
+        requireClause(parsePackageHeader(manifest, "Import-Package"), INTERNAL_PACKAGE);
+    assertThat(internal.directives.get("resolution")).isEqualTo("optional");
+  }
+
+  @Test
+  void protobufImportMatchesShading() throws Exception {
+    Manifest manifest = loadBundleManifest(PrometheusProtobufWriterImpl.class);
+    List imported = names(parsePackageHeader(manifest, "Import-Package"));
+    if (SHADED_BSN.equals(bundleSymbolicName(manifest))) {
+      assertThat(imported).doesNotContain("com.google.protobuf");
+    } else {
+      assertThat(imported).contains("com.google.protobuf");
+    }
+  }
+
+  private static String bundleSymbolicName(Manifest manifest) {
+    return manifest.getMainAttributes().getValue("Bundle-SymbolicName");
+  }
+
+  private static Manifest loadBundleManifest(Class type) throws Exception {
+    CodeSource codeSource = type.getProtectionDomain().getCodeSource();
+    assertThat(codeSource).as("code source for %s", type.getName()).isNotNull();
+    URI location = codeSource.getLocation().toURI();
+    Path path = Path.of(location);
+    if (Files.isDirectory(path)) {
+      Path manifestFile = path.resolve("META-INF/MANIFEST.MF");
+      assertThat(Files.exists(manifestFile))
+          .as("bnd MANIFEST.MF for %s at %s", type.getName(), manifestFile)
+          .isTrue();
+      try (InputStream in = Files.newInputStream(manifestFile)) {
+        return new Manifest(in);
+      }
+    }
+    try (JarFile jar = new JarFile(path.toFile())) {
+      Manifest manifest = jar.getManifest();
+      assertThat(manifest).as("MANIFEST.MF in %s", path).isNotNull();
+      return manifest;
+    }
+  }
+
+  private static PackageClause requireClause(List clauses, String packageName) {
+    return clauses.stream()
+        .filter(clause -> packageName.equals(clause.name))
+        .findFirst()
+        .orElseThrow(() -> new AssertionError("missing package clause " + packageName));
+  }
+
+  private static List names(List clauses) {
+    List names = new ArrayList<>();
+    for (PackageClause clause : clauses) {
+      names.add(clause.name);
+    }
+    return names;
+  }
+
+  /** OSGi headers are comma-separated clauses; attributes may contain quoted commas. */
+  private static List parsePackageHeader(Manifest manifest, String header) {
+    String value = manifest.getMainAttributes().getValue(header);
+    assertThat(value).as("%s", header).isNotBlank();
+    List clauses = new ArrayList<>();
+    for (String rawClause : splitRespectingQuotes(value, ',')) {
+      List parts = splitRespectingQuotes(rawClause, ';');
+      if (parts.isEmpty()) {
+        continue;
+      }
+      String name = parts.get(0).trim();
+      if (name.isEmpty()) {
+        continue;
+      }
+      Map attributes = new LinkedHashMap<>();
+      Map directives = new LinkedHashMap<>();
+      for (int i = 1; i < parts.size(); i++) {
+        String part = parts.get(i).trim();
+        int directiveEq = part.indexOf(":=");
+        int attributeEq = part.indexOf('=');
+        if (directiveEq >= 0 && (attributeEq < 0 || directiveEq <= attributeEq)) {
+          directives.put(
+              part.substring(0, directiveEq).trim(),
+              unquote(part.substring(directiveEq + 2).trim()));
+        } else if (attributeEq >= 0) {
+          attributes.put(
+              part.substring(0, attributeEq).trim(),
+              unquote(part.substring(attributeEq + 1).trim()));
+        }
+      }
+      clauses.add(new PackageClause(name, attributes, directives));
+    }
+    return clauses;
+  }
+
+  private static List splitRespectingQuotes(String value, char separator) {
+    List parts = new ArrayList<>();
+    StringBuilder current = new StringBuilder();
+    boolean inQuote = false;
+    for (int i = 0; i < value.length(); i++) {
+      char c = value.charAt(i);
+      if (c == '"') {
+        inQuote = !inQuote;
+        current.append(c);
+      } else if (!inQuote && c == separator) {
+        parts.add(current.toString());
+        current.setLength(0);
+      } else {
+        current.append(c);
+      }
+    }
+    parts.add(current.toString());
+    return parts;
+  }
+
+  private static String unquote(String value) {
+    if (value.length() >= 2 && value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"') {
+      return value.substring(1, value.length() - 1);
+    }
+    return value;
+  }
+
+  static final class PackageClause {
+    final String name;
+    final Map attributes;
+    final Map directives;
+
+    PackageClause(String name, Map attributes, Map directives) {
+      this.name = name;
+      this.attributes = attributes;
+      this.directives = directives;
+    }
+  }
+}
diff --git a/prometheus-metrics-exposition-textformats/pom.xml b/prometheus-metrics-exposition-textformats/pom.xml
index 55a4d5375b..350ff5505f 100644
--- a/prometheus-metrics-exposition-textformats/pom.xml
+++ b/prometheus-metrics-exposition-textformats/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-exposition-textformats
@@ -42,6 +42,25 @@
 
   
     
+      
+        org.apache.felix
+        maven-bundle-plugin
+        
+          
+            
+              io.prometheus.metrics.expositionformats.internal;resolution:=optional,*
+            
+          
+        
+        
+          
+            
+            
+              manifest
+            
+          
+        
+      
       
         org.apache.maven.plugins
         maven-jar-plugin
diff --git a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriter.java b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriter.java
index f400ecce0f..b2e5473ce7 100644
--- a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriter.java
+++ b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriter.java
@@ -6,6 +6,7 @@
 import static io.prometheus.metrics.expositionformats.TextFormatUtil.writeLong;
 import static io.prometheus.metrics.expositionformats.TextFormatUtil.writeName;
 import static io.prometheus.metrics.expositionformats.TextFormatUtil.writeOpenMetricsTimestamp;
+import static io.prometheus.metrics.model.snapshots.SnapshotEscaper.getExpositionBaseMetadataName;
 import static io.prometheus.metrics.model.snapshots.SnapshotEscaper.getOriginalMetadataName;
 import static io.prometheus.metrics.model.snapshots.SnapshotEscaper.getSnapshotLabelName;
 
@@ -40,9 +41,10 @@
 import javax.annotation.Nullable;
 
 /**
- * Write the OpenMetrics 2.0 text format. Unlike the OM1 writer, this writer outputs metric names as
- * provided by the user, without appending {@code _total} or unit suffixes. The {@code _info} suffix
- * is enforced per the OM2 spec (MUST). This is experimental and subject to change as the OpenMetrics
  * 2.0 specification evolves.
  */
@@ -174,11 +176,14 @@ public void write(OutputStream out, MetricSnapshots metricSnapshots, EscapingSch
   private void writeCounter(Writer writer, CounterSnapshot snapshot, EscapingScheme scheme)
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
-    // OM2: use the original name, no _total or unit suffix appending.
-    String counterName = getOriginalMetadataName(metadata, scheme);
+    String counterName = getMetricName(metadata, scheme);
+    if (openMetrics2Properties.getSuffixes()) {
+      counterName = ensureSuffix(counterName, "_total");
+    }
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(counterName);
     writeMetadataWithName(writer, counterName, "counter", metadata);
     for (CounterSnapshot.CounterDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       if (data.hasScrapeTimestamp()) {
         writer.write(' ');
@@ -196,10 +201,11 @@ private void writeCounter(Writer writer, CounterSnapshot snapshot, EscapingSchem
   private void writeGauge(Writer writer, GaugeSnapshot snapshot, EscapingScheme scheme)
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
-    String name = getOriginalMetadataName(metadata, scheme);
+    String name = getMetricName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     writeMetadataWithName(writer, name, "gauge", metadata);
     for (GaugeSnapshot.GaugeDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       if (exemplarsOnAllMetricTypesEnabled) {
         writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
@@ -214,41 +220,52 @@ private void writeHistogram(Writer writer, HistogramSnapshot snapshot, EscapingS
     boolean compositeHistogram =
         openMetrics2Properties.getCompositeValues() || openMetrics2Properties.getNativeHistograms();
     MetricMetadata metadata = snapshot.getMetadata();
-    String name = getOriginalMetadataName(metadata, scheme);
+    String name = getMetricName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     if (!compositeHistogram && !openMetrics2Properties.getExemplarCompliance()) {
-      writeClassicHistogram(writer, name, snapshot, scheme);
+      writeClassicHistogram(writer, name, snapshot, scheme, nameValidLegacy);
       return;
     }
     if (snapshot.isGaugeHistogram()) {
       writeMetadataWithName(writer, name, "gaugehistogram", metadata);
       for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
         if (openMetrics2Properties.getNativeHistograms() && data.hasNativeHistogramData()) {
-          writeNativeHistogramDataPoint(writer, name, "gcount", "gsum", data, scheme, false);
+          writeNativeHistogramDataPoint(
+              writer, name, "gcount", "gsum", data, scheme, false, nameValidLegacy);
         } else {
-          writeCompositeHistogramDataPoint(writer, name, "gcount", "gsum", data, scheme, false);
+          writeCompositeHistogramDataPoint(
+              writer, name, "gcount", "gsum", data, scheme, false, nameValidLegacy);
         }
       }
     } else {
       writeMetadataWithName(writer, name, "histogram", metadata);
       for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
         if (openMetrics2Properties.getNativeHistograms() && data.hasNativeHistogramData()) {
-          writeNativeHistogramDataPoint(writer, name, "count", "sum", data, scheme, true);
+          writeNativeHistogramDataPoint(
+              writer, name, "count", "sum", data, scheme, true, nameValidLegacy);
         } else {
-          writeCompositeHistogramDataPoint(writer, name, "count", "sum", data, scheme, true);
+          writeCompositeHistogramDataPoint(
+              writer, name, "count", "sum", data, scheme, true, nameValidLegacy);
         }
       }
     }
   }
 
   private void writeClassicHistogram(
-      Writer writer, String name, HistogramSnapshot snapshot, EscapingScheme scheme)
+      Writer writer,
+      String name,
+      HistogramSnapshot snapshot,
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
     if (snapshot.isGaugeHistogram()) {
       writeMetadataWithName(writer, name, "gaugehistogram", snapshot.getMetadata());
-      writeClassicHistogramDataPoints(writer, name, "_gcount", "_gsum", snapshot, scheme);
+      writeClassicHistogramDataPoints(
+          writer, name, "_gcount", "_gsum", snapshot, scheme, nameValidLegacy);
     } else {
       writeMetadataWithName(writer, name, "histogram", snapshot.getMetadata());
-      writeClassicHistogramDataPoints(writer, name, "_count", "_sum", snapshot, scheme);
+      writeClassicHistogramDataPoints(
+          writer, name, "_count", "_sum", snapshot, scheme, nameValidLegacy);
     }
   }
 
@@ -258,7 +275,8 @@ private void writeClassicHistogramDataPoints(
       String countSuffix,
       String sumSuffix,
       HistogramSnapshot snapshot,
-      EscapingScheme scheme)
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
     String bucketName = name + "_bucket";
     for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
@@ -268,7 +286,14 @@ private void writeClassicHistogramDataPoints(
       for (int i = 0; i < buckets.size(); i++) {
         cumulativeCount += buckets.getCount(i);
         writeNameAndLabels(
-            writer, bucketName, null, data.getLabels(), scheme, "le", buckets.getUpperBound(i));
+            writer,
+            bucketName,
+            null,
+            data.getLabels(),
+            scheme,
+            "le",
+            buckets.getUpperBound(i),
+            nameValidLegacy);
         writeLong(writer, cumulativeCount);
         Exemplar exemplar;
         if (i == 0) {
@@ -279,9 +304,10 @@ private void writeClassicHistogramDataPoints(
         writeScrapeTimestampAndExemplar(writer, data, exemplar, scheme);
       }
       if (data.hasCount() && data.hasSum()) {
-        writeClassicCountAndSum(writer, name, data, countSuffix, sumSuffix, exemplars, scheme);
+        writeClassicCountAndSum(
+            writer, name, data, countSuffix, sumSuffix, exemplars, scheme, nameValidLegacy);
       }
-      writeClassicCreated(writer, name, data, scheme);
+      writeClassicCreated(writer, name, data, scheme, nameValidLegacy);
     }
   }
 
@@ -292,16 +318,17 @@ private void writeClassicCountAndSum(
       String countSuffix,
       String sumSuffix,
       Exemplars exemplars,
-      EscapingScheme scheme)
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, countSuffix, data.getLabels(), scheme);
+    writeNameAndLabels(writer, name, countSuffix, data.getLabels(), scheme, nameValidLegacy);
     writeLong(writer, data.getCount());
     if (exemplarsOnAllMetricTypesEnabled) {
       writeScrapeTimestampAndExemplar(writer, data, exemplars.getLatest(), scheme);
     } else {
       writeScrapeTimestampAndExemplar(writer, data, null, scheme);
     }
-    writeNameAndLabels(writer, name, sumSuffix, data.getLabels(), scheme);
+    writeNameAndLabels(writer, name, sumSuffix, data.getLabels(), scheme, nameValidLegacy);
     writeDouble(writer, data.getSum());
     writeScrapeTimestampAndExemplar(writer, data, null, scheme);
   }
@@ -310,10 +337,11 @@ private void writeClassicCreated(
       Writer writer,
       String name,
       HistogramSnapshot.HistogramDataPointSnapshot data,
-      EscapingScheme scheme)
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
     if (createdTimestampsEnabled && data.hasCreatedTimestamp()) {
-      writeNameAndLabels(writer, name, "_created", data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, "_created", data.getLabels(), scheme, nameValidLegacy);
       writeOpenMetricsTimestamp(writer, data.getCreatedTimestampMillis());
       if (data.hasScrapeTimestamp()) {
         writer.write(' ');
@@ -330,9 +358,10 @@ private void writeCompositeHistogramDataPoint(
       String sumKey,
       HistogramSnapshot.HistogramDataPointSnapshot data,
       EscapingScheme scheme,
-      boolean includeStartTimestamp)
+      boolean includeStartTimestamp,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+    writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
     writer.write('{');
     writer.write(countKey);
     writer.write(':');
@@ -362,9 +391,10 @@ private void writeNativeHistogramDataPoint(
       String sumKey,
       HistogramSnapshot.HistogramDataPointSnapshot data,
       EscapingScheme scheme,
-      boolean includeStartTimestamp)
+      boolean includeStartTimestamp,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+    writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
     writer.write('{');
     writer.write(countKey);
     writer.write(':');
@@ -478,14 +508,15 @@ private boolean writeNativeBucketSpan(Writer writer, int offset, int length, boo
 
   private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingScheme scheme)
       throws IOException {
+    MetricMetadata metadata = snapshot.getMetadata();
+    String name = getMetricName(metadata, scheme);
     if (!openMetrics2Properties.getCompositeValues()
         && !openMetrics2Properties.getExemplarCompliance()) {
-      om1Writer.writeSummary(writer, snapshot, scheme);
+      om1Writer.writeSummary(writer, snapshot, scheme, name);
       return;
     }
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     boolean metadataWritten = false;
-    MetricMetadata metadata = snapshot.getMetadata();
-    String name = getOriginalMetadataName(metadata, scheme);
     for (SummarySnapshot.SummaryDataPointSnapshot data : snapshot.getDataPoints()) {
       if (data.getQuantiles().size() == 0 && !data.hasCount() && !data.hasSum()) {
         continue;
@@ -494,7 +525,7 @@ private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingSchem
         writeMetadataWithName(writer, name, "summary", metadata);
         metadataWritten = true;
       }
-      writeCompositeSummaryDataPoint(writer, name, data, scheme);
+      writeCompositeSummaryDataPoint(writer, name, data, scheme, nameValidLegacy);
     }
   }
 
@@ -502,9 +533,10 @@ private void writeCompositeSummaryDataPoint(
       Writer writer,
       String name,
       SummarySnapshot.SummaryDataPointSnapshot data,
-      EscapingScheme scheme)
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+    writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
     writer.write('{');
     boolean first = true;
     if (data.hasCount()) {
@@ -552,10 +584,11 @@ private void writeInfo(Writer writer, InfoSnapshot snapshot, EscapingScheme sche
     MetricMetadata metadata = snapshot.getMetadata();
     // OM2 spec: Info MetricFamily name MUST end in _info.
     // In OM2, TYPE/HELP use the same name as the data lines.
-    String infoName = ensureSuffix(getOriginalMetadataName(metadata, scheme), "_info");
+    String infoName = ensureSuffix(getMetricName(metadata, scheme), "_info");
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(infoName);
     writeMetadataWithName(writer, infoName, "info", metadata);
     for (InfoSnapshot.InfoDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme, nameValidLegacy);
       writer.write("1");
       writeScrapeTimestampAndExemplar(writer, data, null, scheme);
     }
@@ -564,7 +597,7 @@ private void writeInfo(Writer writer, InfoSnapshot snapshot, EscapingScheme sche
   private void writeStateSet(Writer writer, StateSetSnapshot snapshot, EscapingScheme scheme)
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
-    String name = getOriginalMetadataName(metadata, scheme);
+    String name = getMetricName(metadata, scheme);
     writeMetadataWithName(writer, name, "stateset", metadata);
     for (StateSetSnapshot.StateSetDataPointSnapshot data : snapshot.getDataPoints()) {
       for (int i = 0; i < data.size(); i++) {
@@ -600,10 +633,11 @@ private void writeStateSet(Writer writer, StateSetSnapshot snapshot, EscapingSch
   private void writeUnknown(Writer writer, UnknownSnapshot snapshot, EscapingScheme scheme)
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
-    String name = getOriginalMetadataName(metadata, scheme);
+    String name = getMetricName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     writeMetadataWithName(writer, name, "unknown", metadata);
     for (UnknownSnapshot.UnknownDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       if (exemplarsOnAllMetricTypesEnabled) {
         writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
@@ -618,9 +652,10 @@ private void writeNameAndLabels(
       String name,
       @Nullable String suffix,
       Labels labels,
-      EscapingScheme escapingScheme)
+      EscapingScheme escapingScheme,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0);
+    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0, nameValidLegacy);
   }
 
   private void writeNameAndLabels(
@@ -630,16 +665,19 @@ private void writeNameAndLabels(
       Labels labels,
       EscapingScheme escapingScheme,
       @Nullable String additionalLabelName,
-      double additionalLabelValue)
+      double additionalLabelValue,
+      boolean nameValidLegacy)
       throws IOException {
     boolean metricInsideBraces = false;
-    // If the name does not pass the legacy validity check, we must put the
-    // metric name inside the braces.
-    if (!PrometheusNaming.isValidLegacyMetricName(name)) {
+    // If the name does not pass the legacy validity check, we must put the metric name inside the
+    // braces. Validity is scanned once per family by the caller (the metric name is constant across
+    // all data points), not re-scanned for every series. A suffix built from legacy characters
+    // (_total, _bucket, ...) does not change legacy validity, so the base-name check applies here.
+    if (!nameValidLegacy) {
       metricInsideBraces = true;
       writer.write('{');
     }
-    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric);
+    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric, nameValidLegacy);
     if (!labels.isEmpty() || additionalLabelName != null) {
       writeLabels(
           writer,
@@ -714,6 +752,13 @@ private void writeMetadataWithName(
     }
   }
 
+  private String getMetricName(MetricMetadata metadata, EscapingScheme scheme) {
+    if (openMetrics2Properties.getSuffixes()) {
+      return getExpositionBaseMetadataName(metadata, scheme);
+    }
+    return getOriginalMetadataName(metadata, scheme);
+  }
+
   private static String ensureSuffix(String name, String suffix) {
     if (name.endsWith(suffix)) {
       return name;
diff --git a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetricsTextFormatWriter.java b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetricsTextFormatWriter.java
index 02614a5610..3f0bccb039 100644
--- a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetricsTextFormatWriter.java
+++ b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/OpenMetricsTextFormatWriter.java
@@ -146,12 +146,13 @@ private void writeCounter(Writer writer, CounterSnapshot snapshot, EscapingSchem
     MetricMetadata metadata = snapshot.getMetadata();
     String counterName = resolveExpositionName(metadata, "_total", scheme);
     String baseName = resolveBaseName(counterName, "_total");
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(counterName);
     writeMetadataWithName(writer, baseName, "counter", metadata);
     for (CounterSnapshot.CounterDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
-      writeCreated(writer, baseName, data, scheme);
+      writeCreated(writer, baseName, data, scheme, nameValidLegacy);
     }
   }
 
@@ -160,8 +161,9 @@ private void writeGauge(Writer writer, GaugeSnapshot snapshot, EscapingScheme sc
     MetricMetadata metadata = snapshot.getMetadata();
     writeMetadata(writer, "gauge", metadata, scheme);
     String name = getMetadataName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (GaugeSnapshot.GaugeDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       if (exemplarsOnAllMetricTypesEnabled) {
         writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
@@ -197,6 +199,7 @@ private void writeClassicHistogramBuckets(
     String bucketName = name + "_bucket";
     String countName = name + countSuffix;
     String sumName = name + sumSuffix;
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (HistogramSnapshot.HistogramDataPointSnapshot data : dataList) {
       ClassicHistogramBuckets buckets = getClassicBuckets(data);
       Exemplars exemplars = data.getExemplars();
@@ -204,7 +207,14 @@ private void writeClassicHistogramBuckets(
       for (int i = 0; i < buckets.size(); i++) {
         cumulativeCount += buckets.getCount(i);
         writeNameAndLabels(
-            writer, bucketName, null, data.getLabels(), scheme, "le", buckets.getUpperBound(i));
+            writer,
+            bucketName,
+            null,
+            data.getLabels(),
+            scheme,
+            "le",
+            buckets.getUpperBound(i),
+            nameValidLegacy);
         writeLong(writer, cumulativeCount);
         Exemplar exemplar;
         if (i == 0) {
@@ -216,9 +226,9 @@ private void writeClassicHistogramBuckets(
       }
       // In OpenMetrics format, histogram _count and _sum are either both present or both absent.
       if (data.hasCount() && data.hasSum()) {
-        writeCountAndSum(writer, countName, sumName, data, exemplars, scheme);
+        writeCountAndSum(writer, countName, sumName, data, exemplars, scheme, nameValidLegacy);
       }
-      writeCreated(writer, name, data, scheme);
+      writeCreated(writer, name, data, scheme, nameValidLegacy);
     }
   }
 
@@ -234,17 +244,22 @@ private ClassicHistogramBuckets getClassicBuckets(
 
   void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingScheme scheme)
       throws IOException {
+    writeSummary(writer, snapshot, scheme, getMetadataName(snapshot.getMetadata(), scheme));
+  }
+
+  void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingScheme scheme, String name)
+      throws IOException {
     boolean metadataWritten = false;
     MetricMetadata metadata = snapshot.getMetadata();
-    String name = getMetadataName(metadata, scheme);
     String countName = name + "_count";
     String sumName = name + "_sum";
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (SummarySnapshot.SummaryDataPointSnapshot data : snapshot.getDataPoints()) {
       if (data.getQuantiles().size() == 0 && !data.hasCount() && !data.hasSum()) {
         continue;
       }
       if (!metadataWritten) {
-        writeMetadata(writer, "summary", metadata, scheme);
+        writeMetadataWithName(writer, name, "summary", metadata);
         metadataWritten = true;
       }
       Exemplars exemplars = data.getExemplars();
@@ -256,7 +271,14 @@ void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingScheme scheme
       int exemplarIndex = 1;
       for (Quantile quantile : data.getQuantiles()) {
         writeNameAndLabels(
-            writer, name, null, data.getLabels(), scheme, "quantile", quantile.getQuantile());
+            writer,
+            name,
+            null,
+            data.getLabels(),
+            scheme,
+            "quantile",
+            quantile.getQuantile(),
+            nameValidLegacy);
         writeDouble(writer, quantile.getValue());
         if (exemplars.size() > 0 && exemplarsOnAllMetricTypesEnabled) {
           exemplarIndex = (exemplarIndex + 1) % exemplars.size();
@@ -266,8 +288,8 @@ void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingScheme scheme
         }
       }
       // Unlike histograms, summaries can have only a count or only a sum according to OpenMetrics.
-      writeCountAndSum(writer, countName, sumName, data, exemplars, scheme);
-      writeCreated(writer, name, data, scheme);
+      writeCountAndSum(writer, countName, sumName, data, exemplars, scheme, nameValidLegacy);
+      writeCreated(writer, name, data, scheme, nameValidLegacy);
     }
   }
 
@@ -276,9 +298,10 @@ private void writeInfo(Writer writer, InfoSnapshot snapshot, EscapingScheme sche
     MetricMetadata metadata = snapshot.getMetadata();
     String infoName = resolveExpositionName(metadata, "_info", scheme);
     String baseName = resolveBaseName(infoName, "_info");
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(infoName);
     writeMetadataWithName(writer, baseName, "info", metadata);
     for (InfoSnapshot.InfoDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme, nameValidLegacy);
       writer.write("1");
       writeScrapeTimestampAndExemplar(writer, data, null, scheme);
     }
@@ -325,8 +348,9 @@ private void writeUnknown(Writer writer, UnknownSnapshot snapshot, EscapingSchem
     MetricMetadata metadata = snapshot.getMetadata();
     writeMetadata(writer, "unknown", metadata, scheme);
     String name = getMetadataName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (UnknownSnapshot.UnknownDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       if (exemplarsOnAllMetricTypesEnabled) {
         writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
@@ -342,10 +366,11 @@ private void writeCountAndSum(
       String sumName,
       DistributionDataPointSnapshot data,
       Exemplars exemplars,
-      EscapingScheme scheme)
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
     if (data.hasCount()) {
-      writeNameAndLabels(writer, countName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, countName, null, data.getLabels(), scheme, nameValidLegacy);
       writeLong(writer, data.getCount());
       if (exemplarsOnAllMetricTypesEnabled) {
         writeScrapeTimestampAndExemplar(writer, data, exemplars.getLatest(), scheme);
@@ -354,17 +379,21 @@ private void writeCountAndSum(
       }
     }
     if (data.hasSum()) {
-      writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getSum());
       writeScrapeTimestampAndExemplar(writer, data, null, scheme);
     }
   }
 
   private void writeCreated(
-      Writer writer, String baseName, DataPointSnapshot data, EscapingScheme scheme)
+      Writer writer,
+      String baseName,
+      DataPointSnapshot data,
+      EscapingScheme scheme,
+      boolean nameValidLegacy)
       throws IOException {
     if (createdTimestampsEnabled && data.hasCreatedTimestamp()) {
-      writeNameAndLabels(writer, baseName, "_created", data.getLabels(), scheme);
+      writeNameAndLabels(writer, baseName, "_created", data.getLabels(), scheme, nameValidLegacy);
       writeOpenMetricsTimestamp(writer, data.getCreatedTimestampMillis());
       if (data.hasScrapeTimestamp()) {
         writer.write(' ');
@@ -379,9 +408,10 @@ private void writeNameAndLabels(
       String name,
       @Nullable String suffix,
       Labels labels,
-      EscapingScheme escapingScheme)
+      EscapingScheme escapingScheme,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0);
+    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0, nameValidLegacy);
   }
 
   private void writeNameAndLabels(
@@ -391,16 +421,19 @@ private void writeNameAndLabels(
       Labels labels,
       EscapingScheme escapingScheme,
       @Nullable String additionalLabelName,
-      double additionalLabelValue)
+      double additionalLabelValue,
+      boolean nameValidLegacy)
       throws IOException {
     boolean metricInsideBraces = false;
-    // If the name does not pass the legacy validity check, we must put the
-    // metric name inside the braces.
-    if (!PrometheusNaming.isValidLegacyMetricName(name)) {
+    // If the name does not pass the legacy validity check, we must put the metric name inside the
+    // braces. Validity is scanned once per family by the caller (the metric name is constant across
+    // all data points), not re-scanned for every series. A suffix built from legacy characters
+    // (_total, _bucket, ...) does not change legacy validity, so the base-name check applies here.
+    if (!nameValidLegacy) {
       metricInsideBraces = true;
       writer.write('{');
     }
-    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric);
+    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric, nameValidLegacy);
     if (!labels.isEmpty() || additionalLabelName != null) {
       writeLabels(
           writer,
diff --git a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/PrometheusTextFormatWriter.java b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/PrometheusTextFormatWriter.java
index f94d710ba3..ab5ed4c14d 100644
--- a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/PrometheusTextFormatWriter.java
+++ b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/PrometheusTextFormatWriter.java
@@ -168,13 +168,14 @@ public void writeCreated(Writer writer, MetricSnapshot snapshot, EscapingScheme
     if (snapshot instanceof CounterSnapshot) {
       baseName = resolveBaseName(resolveExpositionName(metadata, "_total", scheme), "_total");
     }
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(baseName);
     for (DataPointSnapshot data : snapshot.getDataPoints()) {
       if (data.hasCreatedTimestamp()) {
         if (!metadataWritten) {
           writeMetadataWithFullName(writer, baseName + "_created", "gauge", metadata);
           metadataWritten = true;
         }
-        writeNameAndLabels(writer, baseName, "_created", data.getLabels(), scheme);
+        writeNameAndLabels(writer, baseName, "_created", data.getLabels(), scheme, nameValidLegacy);
         writePrometheusTimestamp(writer, data.getCreatedTimestampMillis(), timestampsInMs);
         writeScrapeTimestampAndNewline(writer, data);
       }
@@ -186,9 +187,10 @@ private void writeCounter(Writer writer, CounterSnapshot snapshot, EscapingSchem
     if (!snapshot.getDataPoints().isEmpty()) {
       MetricMetadata metadata = snapshot.getMetadata();
       String counterName = resolveExpositionName(metadata, "_total", scheme);
+      boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(counterName);
       writeMetadataWithFullName(writer, counterName, "counter", metadata);
       for (CounterSnapshot.CounterDataPointSnapshot data : snapshot.getDataPoints()) {
-        writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme);
+        writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme, nameValidLegacy);
         writeDouble(writer, data.getValue());
         writeScrapeTimestampAndNewline(writer, data);
       }
@@ -200,9 +202,10 @@ private void writeGauge(
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
     String gaugeName = getLegacyGaugeName(metadata, rawOriginalName, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(gaugeName);
     writeMetadataWithFullName(writer, gaugeName, "gauge", metadata);
     for (GaugeSnapshot.GaugeDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, gaugeName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, gaugeName, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       writeScrapeTimestampAndNewline(writer, data);
     }
@@ -216,24 +219,32 @@ private void writeHistogram(Writer writer, HistogramSnapshot snapshot, EscapingS
     String bucketName = name + "_bucket";
     String countName = name + "_count";
     String sumName = name + "_sum";
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
       ClassicHistogramBuckets buckets = getClassicBuckets(data);
       long cumulativeCount = 0;
       for (int i = 0; i < buckets.size(); i++) {
         cumulativeCount += buckets.getCount(i);
         writeNameAndLabels(
-            writer, bucketName, null, data.getLabels(), scheme, "le", buckets.getUpperBound(i));
+            writer,
+            bucketName,
+            null,
+            data.getLabels(),
+            scheme,
+            "le",
+            buckets.getUpperBound(i),
+            nameValidLegacy);
         writeLong(writer, cumulativeCount);
         writeScrapeTimestampAndNewline(writer, data);
       }
       if (!snapshot.isGaugeHistogram()) {
         if (data.hasCount()) {
-          writeNameAndLabels(writer, countName, null, data.getLabels(), scheme);
+          writeNameAndLabels(writer, countName, null, data.getLabels(), scheme, nameValidLegacy);
           writeLong(writer, data.getCount());
           writeScrapeTimestampAndNewline(writer, data);
         }
         if (data.hasSum()) {
-          writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme);
+          writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme, nameValidLegacy);
           writeDouble(writer, data.getSum());
           writeScrapeTimestampAndNewline(writer, data);
         }
@@ -262,6 +273,7 @@ private void writeGaugeCountSum(
     String baseName = getMetadataName(metadata, scheme);
     String gaugeCountName = baseName + "_gcount";
     String gaugeSumName = baseName + "_gsum";
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(baseName);
     boolean metadataWritten = false;
     for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
       if (data.hasCount()) {
@@ -269,7 +281,7 @@ private void writeGaugeCountSum(
           writeMetadata(writer, "_gcount", "gauge", metadata, scheme);
           metadataWritten = true;
         }
-        writeNameAndLabels(writer, gaugeCountName, null, data.getLabels(), scheme);
+        writeNameAndLabels(writer, gaugeCountName, null, data.getLabels(), scheme, nameValidLegacy);
         writeLong(writer, data.getCount());
         writeScrapeTimestampAndNewline(writer, data);
       }
@@ -281,7 +293,7 @@ private void writeGaugeCountSum(
           writeMetadata(writer, "_gsum", "gauge", metadata, scheme);
           metadataWritten = true;
         }
-        writeNameAndLabels(writer, gaugeSumName, null, data.getLabels(), scheme);
+        writeNameAndLabels(writer, gaugeSumName, null, data.getLabels(), scheme, nameValidLegacy);
         writeDouble(writer, data.getSum());
         writeScrapeTimestampAndNewline(writer, data);
       }
@@ -295,6 +307,7 @@ private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingSchem
     String name = getMetadataName(metadata, scheme);
     String countName = name + "_count";
     String sumName = name + "_sum";
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (SummarySnapshot.SummaryDataPointSnapshot data : snapshot.getDataPoints()) {
       if (data.getQuantiles().size() == 0 && !data.hasCount() && !data.hasSum()) {
         continue;
@@ -305,17 +318,24 @@ private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingSchem
       }
       for (Quantile quantile : data.getQuantiles()) {
         writeNameAndLabels(
-            writer, name, null, data.getLabels(), scheme, "quantile", quantile.getQuantile());
+            writer,
+            name,
+            null,
+            data.getLabels(),
+            scheme,
+            "quantile",
+            quantile.getQuantile(),
+            nameValidLegacy);
         writeDouble(writer, quantile.getValue());
         writeScrapeTimestampAndNewline(writer, data);
       }
       if (data.hasCount()) {
-        writeNameAndLabels(writer, countName, null, data.getLabels(), scheme);
+        writeNameAndLabels(writer, countName, null, data.getLabels(), scheme, nameValidLegacy);
         writeLong(writer, data.getCount());
         writeScrapeTimestampAndNewline(writer, data);
       }
       if (data.hasSum()) {
-        writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme);
+        writeNameAndLabels(writer, sumName, null, data.getLabels(), scheme, nameValidLegacy);
         writeDouble(writer, data.getSum());
         writeScrapeTimestampAndNewline(writer, data);
       }
@@ -326,9 +346,10 @@ private void writeInfo(Writer writer, InfoSnapshot snapshot, EscapingScheme sche
       throws IOException {
     MetricMetadata metadata = snapshot.getMetadata();
     String infoName = resolveExpositionName(metadata, "_info", scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(infoName);
     writeMetadataWithFullName(writer, infoName, "gauge", metadata);
     for (InfoSnapshot.InfoDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme, nameValidLegacy);
       writer.write("1");
       writeScrapeTimestampAndNewline(writer, data);
     }
@@ -374,8 +395,9 @@ private void writeUnknown(Writer writer, UnknownSnapshot snapshot, EscapingSchem
     MetricMetadata metadata = snapshot.getMetadata();
     writeMetadata(writer, null, "untyped", metadata, scheme);
     String name = getMetadataName(metadata, scheme);
+    boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
     for (UnknownSnapshot.UnknownDataPointSnapshot data : snapshot.getDataPoints()) {
-      writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
+      writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
       writeDouble(writer, data.getValue());
       writeScrapeTimestampAndNewline(writer, data);
     }
@@ -386,9 +408,10 @@ private void writeNameAndLabels(
       String name,
       @Nullable String suffix,
       Labels labels,
-      EscapingScheme escapingScheme)
+      EscapingScheme escapingScheme,
+      boolean nameValidLegacy)
       throws IOException {
-    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0);
+    writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0, nameValidLegacy);
   }
 
   private void writeNameAndLabels(
@@ -398,16 +421,20 @@ private void writeNameAndLabels(
       Labels labels,
       EscapingScheme scheme,
       @Nullable String additionalLabelName,
-      double additionalLabelValue)
+      double additionalLabelValue,
+      boolean nameValidLegacy)
       throws IOException {
     boolean metricInsideBraces = false;
     // If the name does not pass the legacy validity check, we must put the
-    // metric name inside the braces.
-    if (!PrometheusNaming.isValidLegacyMetricName(name)) {
+    // metric name inside the braces. Validity is scanned once per family by the caller (the metric
+    // name is constant across all data points), not re-scanned for every series here. Appending a
+    // suffix built from legacy characters (_total, _bucket, ...) does not change legacy validity,
+    // so the caller's check of the base name applies to the suffixed name too.
+    if (!nameValidLegacy) {
       metricInsideBraces = true;
       writer.write('{');
     }
-    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric);
+    writeName(writer, suffix != null ? name + suffix : name, NameType.Metric, nameValidLegacy);
     if (!labels.isEmpty() || additionalLabelName != null) {
       writeLabels(
           writer, labels, additionalLabelName, additionalLabelValue, metricInsideBraces, scheme);
diff --git a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/TextFormatUtil.java b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/TextFormatUtil.java
index 8cfed2b299..cd5fbdf107 100644
--- a/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/TextFormatUtil.java
+++ b/prometheus-metrics-exposition-textformats/src/main/java/io/prometheus/metrics/expositionformats/TextFormatUtil.java
@@ -41,6 +41,24 @@ public static MetricSnapshots mergeDuplicates(MetricSnapshots metricSnapshots) {
       return metricSnapshots;
     }
 
+    // MetricSnapshots is sorted by prometheus name, so any duplicates are adjacent. Detect them in
+    // a single allocation-free pass; when there are none (the common case) return the input as-is
+    // rather than rebuilding it through a map, a list per group and a new MetricSnapshots.
+    boolean hasDuplicates = false;
+    for (int i = 1; i < metricSnapshots.size(); i++) {
+      if (metricSnapshots
+          .get(i)
+          .getMetadata()
+          .getPrometheusName()
+          .equals(metricSnapshots.get(i - 1).getMetadata().getPrometheusName())) {
+        hasDuplicates = true;
+        break;
+      }
+    }
+    if (!hasDuplicates) {
+      return metricSnapshots;
+    }
+
     Map> grouped = new LinkedHashMap<>();
 
     for (MetricSnapshot snapshot : metricSnapshots) {
@@ -205,25 +223,39 @@ static void writeLabels(
   }
 
   static void writeName(Writer writer, String name, NameType nameType) throws IOException {
+    writeName(writer, name, nameType, isValidLegacyName(name, nameType));
+  }
+
+  /**
+   * Variant of {@link #writeName(Writer, String, NameType)} for callers that already know whether
+   * {@code name} is a valid legacy name. The metric name is constant across all data points of a
+   * metric family, so a caller can scan it once per family (via {@link #isValidLegacyName}) and
+   * hoist the check out of the per-data-point loop instead of re-scanning the same string for every
+   * series.
+   */
+  static void writeName(Writer writer, String name, NameType nameType, boolean validLegacyName)
+      throws IOException {
+    if (validLegacyName) {
+      writer.write(name);
+      return;
+    }
+    if (nameType != NameType.Metric && nameType != NameType.Label) {
+      throw new RuntimeException("Invalid name type requested: " + nameType);
+    }
+    writer.write('"');
+    writeEscapedString(writer, name);
+    writer.write('"');
+  }
+
+  static boolean isValidLegacyName(String name, NameType nameType) {
     switch (nameType) {
       case Metric:
-        if (PrometheusNaming.isValidLegacyMetricName(name)) {
-          writer.write(name);
-          return;
-        }
-        break;
+        return PrometheusNaming.isValidLegacyMetricName(name);
       case Label:
-        if (PrometheusNaming.isValidLegacyLabelName(name)) {
-          writer.write(name);
-          return;
-        }
-        break;
+        return PrometheusNaming.isValidLegacyLabelName(name);
       default:
         throw new RuntimeException("Invalid name type requested: " + nameType);
     }
-    writer.write('"');
-    writeEscapedString(writer, name);
-    writer.write('"');
   }
 
   /**
diff --git a/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriterTest.java b/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriterTest.java
index 83c815c00a..928bf80b35 100644
--- a/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriterTest.java
+++ b/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/OpenMetrics2TextFormatWriterTest.java
@@ -273,9 +273,9 @@ void testCounterStartTimestampWithDefaultWriter() throws IOException {
                         .build())
                 .build());
 
-    String om2Output = writeWithOM2(snapshots);
+    String om2Output = write(snapshots, OpenMetrics2TextFormatWriter.create());
 
-    // OM2: no _total, start timestamp uses st@ inline.
+    // OM2 preserves the registered name by default and emits the start timestamp inline.
     assertThat(om2Output)
         .isEqualTo(
             "# TYPE my_counter counter\n"
@@ -834,7 +834,10 @@ private String writeWithOM1(MetricSnapshots snapshots) throws IOException {
   }
 
   private String writeWithOM2(MetricSnapshots snapshots) throws IOException {
-    OpenMetrics2TextFormatWriter writer = OpenMetrics2TextFormatWriter.create();
+    OpenMetrics2TextFormatWriter writer =
+        OpenMetrics2TextFormatWriter.builder()
+            .setOpenMetrics2Properties(OpenMetrics2Properties.builder().suffixes(false).build())
+            .build();
     return write(snapshots, writer);
   }
 
diff --git a/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/TextFormatUtilTest.java b/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/TextFormatUtilTest.java
index 5e1aa9766f..596d1a126c 100644
--- a/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/TextFormatUtilTest.java
+++ b/prometheus-metrics-exposition-textformats/src/test/java/io/prometheus/metrics/expositionformats/TextFormatUtilTest.java
@@ -178,4 +178,65 @@ void testMergeDuplicates_histogramSameGaugeFlag_preservesGaugeHistogram() {
     assertThat(merged.isGaugeHistogram()).isTrue();
     assertThat(merged.getDataPoints()).hasSize(2);
   }
+
+  @Test
+  void testMergeDuplicates_uniqueNames_returnsSameInstance() {
+    CounterSnapshot counter1 =
+        CounterSnapshot.builder()
+            .name("api_responses")
+            .dataPoint(CounterSnapshot.CounterDataPointSnapshot.builder().value(1).build())
+            .build();
+    CounterSnapshot counter2 =
+        CounterSnapshot.builder()
+            .name("api_errors")
+            .dataPoint(CounterSnapshot.CounterDataPointSnapshot.builder().value(2).build())
+            .build();
+
+    MetricSnapshots snapshots = new MetricSnapshots(counter1, counter2);
+
+    // No duplicate prometheus names, so the fast path returns the input unchanged rather
+    // than rebuilding it. isSameAs pins that: an inverted condition would rebuild and fail here.
+    assertThat(TextFormatUtil.mergeDuplicates(snapshots)).isSameAs(snapshots);
+  }
+
+  @Test
+  void testMergeDuplicates_duplicateNotAtStart_merges() {
+    CounterSnapshot a =
+        CounterSnapshot.builder()
+            .name("a")
+            .dataPoint(CounterSnapshot.CounterDataPointSnapshot.builder().value(1).build())
+            .build();
+    CounterSnapshot m =
+        CounterSnapshot.builder()
+            .name("m")
+            .dataPoint(CounterSnapshot.CounterDataPointSnapshot.builder().value(1).build())
+            .build();
+    CounterSnapshot z1 =
+        CounterSnapshot.builder()
+            .name("z")
+            .dataPoint(
+                CounterSnapshot.CounterDataPointSnapshot.builder()
+                    .labels(Labels.of("outcome", "SUCCESS"))
+                    .value(1)
+                    .build())
+            .build();
+    CounterSnapshot z2 =
+        CounterSnapshot.builder()
+            .name("z")
+            .dataPoint(
+                CounterSnapshot.CounterDataPointSnapshot.builder()
+                    .labels(Labels.of("outcome", "FAILURE"))
+                    .value(2)
+                    .build())
+            .build();
+
+    // Sorted by prometheus name the duplicate "z" pair is last (indices 2 and 3), so
+    // detection must scan the whole range, not just the first pair.
+    MetricSnapshots snapshots = new MetricSnapshots(a, m, z1, z2);
+    MetricSnapshots result = TextFormatUtil.mergeDuplicates(snapshots);
+
+    assertThat(result).hasSize(3);
+    assertThat(result.get(2).getMetadata().getName()).isEqualTo("z");
+    assertThat(result.get(2).getDataPoints()).hasSize(2);
+  }
 }
diff --git a/prometheus-metrics-instrumentation-caffeine/pom.xml b/prometheus-metrics-instrumentation-caffeine/pom.xml
index 9712a4a1ba..eae3b3f1dd 100644
--- a/prometheus-metrics-instrumentation-caffeine/pom.xml
+++ b/prometheus-metrics-instrumentation-caffeine/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-instrumentation-caffeine
@@ -43,7 +43,7 @@
     
       com.github.ben-manes.caffeine
       caffeine
-      3.2.4
+      3.3.1
       provided
     
 
diff --git a/prometheus-metrics-instrumentation-caffeine/src/main/java/io/prometheus/metrics/instrumentation/caffeine/CacheMetricsCollector.java b/prometheus-metrics-instrumentation-caffeine/src/main/java/io/prometheus/metrics/instrumentation/caffeine/CacheMetricsCollector.java
index ba7552910f..687cd43490 100644
--- a/prometheus-metrics-instrumentation-caffeine/src/main/java/io/prometheus/metrics/instrumentation/caffeine/CacheMetricsCollector.java
+++ b/prometheus-metrics-instrumentation-caffeine/src/main/java/io/prometheus/metrics/instrumentation/caffeine/CacheMetricsCollector.java
@@ -20,6 +20,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 
 /**
  * Collect metrics from Caffeine's com.github.benmanes.caffeine.cache.Cache.
@@ -149,6 +150,7 @@ public void addCache(String cacheName, AsyncCache cache) {
    *
    * @param cacheName cache to be removed
    */
+  @Nullable
   public Cache removeCache(String cacheName) {
     return children.remove(cacheName);
   }
diff --git a/prometheus-metrics-instrumentation-dropwizard/pom.xml b/prometheus-metrics-instrumentation-dropwizard/pom.xml
index 011cbba1a8..b4f7b02996 100644
--- a/prometheus-metrics-instrumentation-dropwizard/pom.xml
+++ b/prometheus-metrics-instrumentation-dropwizard/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-instrumentation-dropwizard
@@ -43,7 +43,7 @@
     
       io.dropwizard.metrics
       metrics-core
-      4.2.39
+      4.2.40
       provided
     
 
diff --git a/prometheus-metrics-instrumentation-dropwizard5/pom.xml b/prometheus-metrics-instrumentation-dropwizard5/pom.xml
index 6e1d418dd8..99381d46e6 100644
--- a/prometheus-metrics-instrumentation-dropwizard5/pom.xml
+++ b/prometheus-metrics-instrumentation-dropwizard5/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-instrumentation-dropwizard5
@@ -36,7 +36,7 @@
     
       io.dropwizard.metrics5
       metrics-core
-      5.0.7
+      5.0.8
       provided
     
     
diff --git a/prometheus-metrics-instrumentation-guava/pom.xml b/prometheus-metrics-instrumentation-guava/pom.xml
index fa2de2864a..befb855e11 100644
--- a/prometheus-metrics-instrumentation-guava/pom.xml
+++ b/prometheus-metrics-instrumentation-guava/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-instrumentation-guava
diff --git a/prometheus-metrics-instrumentation-guava/src/main/java/io/prometheus/metrics/instrumentation/guava/CacheMetricsCollector.java b/prometheus-metrics-instrumentation-guava/src/main/java/io/prometheus/metrics/instrumentation/guava/CacheMetricsCollector.java
index b807a28f03..0b6ff3d78f 100644
--- a/prometheus-metrics-instrumentation-guava/src/main/java/io/prometheus/metrics/instrumentation/guava/CacheMetricsCollector.java
+++ b/prometheus-metrics-instrumentation-guava/src/main/java/io/prometheus/metrics/instrumentation/guava/CacheMetricsCollector.java
@@ -16,6 +16,7 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import javax.annotation.Nullable;
 
 /**
  * Collect metrics from Guava's com.google.common.cache.Cache.
@@ -100,6 +101,7 @@ public void addCache(String cacheName, Cache cache) {
    *
    * @param cacheName cache to be removed
    */
+  @Nullable
   public Cache removeCache(String cacheName) {
     return children.remove(cacheName);
   }
diff --git a/prometheus-metrics-instrumentation-jvm/pom.xml b/prometheus-metrics-instrumentation-jvm/pom.xml
index c9916b874e..831471d530 100644
--- a/prometheus-metrics-instrumentation-jvm/pom.xml
+++ b/prometheus-metrics-instrumentation-jvm/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-instrumentation-jvm
diff --git a/prometheus-metrics-model/pom.xml b/prometheus-metrics-model/pom.xml
index 7d377c0435..4e8d1cc827 100644
--- a/prometheus-metrics-model/pom.xml
+++ b/prometheus-metrics-model/pom.xml
@@ -6,7 +6,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-model
diff --git a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/registry/MetricNameFilter.java b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/registry/MetricNameFilter.java
index 642f271501..ded1715004 100644
--- a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/registry/MetricNameFilter.java
+++ b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/registry/MetricNameFilter.java
@@ -6,6 +6,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.LinkedHashSet;
 import java.util.function.Predicate;
 import javax.annotation.Nullable;
 
@@ -26,10 +27,10 @@ private MetricNameFilter(
       Collection nameIsNotEqualTo,
       Collection nameStartsWith,
       Collection nameDoesNotStartWith) {
-    this.nameIsEqualTo = unmodifiableCollection(new ArrayList<>(nameIsEqualTo));
-    this.nameIsNotEqualTo = unmodifiableCollection(new ArrayList<>(nameIsNotEqualTo));
-    this.nameStartsWith = unmodifiableCollection(new ArrayList<>(nameStartsWith));
-    this.nameDoesNotStartWith = unmodifiableCollection(new ArrayList<>(nameDoesNotStartWith));
+    this.nameIsEqualTo = unmodifiableCollection(new LinkedHashSet<>(nameIsEqualTo));
+    this.nameIsNotEqualTo = unmodifiableCollection(new LinkedHashSet<>(nameIsNotEqualTo));
+    this.nameStartsWith = unmodifiableCollection(new LinkedHashSet<>(nameStartsWith));
+    this.nameDoesNotStartWith = unmodifiableCollection(new LinkedHashSet<>(nameDoesNotStartWith));
   }
 
   @Override
@@ -44,6 +45,9 @@ private boolean matchesNameEqualTo(String metricName) {
     if (nameIsEqualTo.isEmpty()) {
       return true;
     }
+    if (nameIsEqualTo.contains(metricName)) {
+      return true;
+    }
     for (String name : nameIsEqualTo) {
       // The following ignores suffixes like _total.
       // "request_count" and "request_count_total" both match a metric named "request_count".
@@ -58,6 +62,9 @@ private boolean matchesNameNotEqualTo(String metricName) {
     if (nameIsNotEqualTo.isEmpty()) {
       return false;
     }
+    if (nameIsNotEqualTo.contains(metricName)) {
+      return true;
+    }
     for (String name : nameIsNotEqualTo) {
       // The following ignores suffixes like _total.
       // "request_count" and "request_count_total" both match a metric named "request_count".
diff --git a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/CounterSnapshot.java b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/CounterSnapshot.java
index 42a06f3bbf..d2d3dfcaac 100644
--- a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/CounterSnapshot.java
+++ b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/CounterSnapshot.java
@@ -49,6 +49,9 @@ public static class CounterDataPointSnapshot extends DataPointSnapshot {
     private final double value;
     @Nullable private final Exemplar exemplar;
 
+    /** Optional metric name used only in validation error messages. */
+    @Nullable private final String metricName;
+
     /**
      * To create a new {@link CounterDataPointSnapshot}, you can either call the constructor
      * directly or use the Builder with {@link CounterDataPointSnapshot#builder()}.
@@ -62,7 +65,7 @@ public static class CounterDataPointSnapshot extends DataPointSnapshot {
      */
     public CounterDataPointSnapshot(
         double value, Labels labels, @Nullable Exemplar exemplar, long createdTimestampMillis) {
-      this(value, labels, exemplar, createdTimestampMillis, 0);
+      this(value, labels, exemplar, createdTimestampMillis, 0, false, null);
     }
 
     /**
@@ -77,7 +80,7 @@ public CounterDataPointSnapshot(
         @Nullable Exemplar exemplar,
         long createdTimestampMillis,
         long scrapeTimestampMillis) {
-      this(value, labels, exemplar, createdTimestampMillis, scrapeTimestampMillis, false);
+      this(value, labels, exemplar, createdTimestampMillis, scrapeTimestampMillis, false, null);
     }
 
     @SuppressWarnings("this-escape")
@@ -88,9 +91,22 @@ public CounterDataPointSnapshot(
         long createdTimestampMillis,
         long scrapeTimestampMillis,
         boolean internal) {
+      this(value, labels, exemplar, createdTimestampMillis, scrapeTimestampMillis, internal, null);
+    }
+
+    @SuppressWarnings("this-escape")
+    private CounterDataPointSnapshot(
+        double value,
+        Labels labels,
+        @Nullable Exemplar exemplar,
+        long createdTimestampMillis,
+        long scrapeTimestampMillis,
+        boolean internal,
+        @Nullable String metricName) {
       super(labels, createdTimestampMillis, scrapeTimestampMillis, internal);
       this.value = value;
       this.exemplar = exemplar;
+      this.metricName = metricName;
       if (!internal) {
         validate();
       }
@@ -107,7 +123,16 @@ public Exemplar getExemplar() {
 
     protected void validate() {
       if (value < 0.0) {
-        throw new IllegalArgumentException(value + ": counters cannot have a negative value");
+        StringBuilder message = new StringBuilder();
+        if (metricName != null && !metricName.isEmpty()) {
+          message.append(metricName).append('=');
+        }
+        message.append(value).append(": counters cannot have a negative value");
+        Labels labels = getLabels();
+        if (labels != null && !labels.isEmpty()) {
+          message.append(" (labels=").append(labels).append(')');
+        }
+        throw new IllegalArgumentException(message.toString());
       }
     }
 
@@ -119,7 +144,8 @@ DataPointSnapshot escape(EscapingScheme escapingScheme) {
           SnapshotEscaper.escapeExemplar(exemplar, escapingScheme),
           getCreatedTimestampMillis(),
           getScrapeTimestampMillis(),
-          true);
+          true,
+          metricName);
     }
 
     public static Builder builder() {
@@ -131,6 +157,7 @@ public static class Builder extends DataPointSnapshot.Builder {
       @Nullable private Exemplar exemplar = null;
       @Nullable private Double value = null;
       private long createdTimestampMillis = 0L;
+      @Nullable private String metricName = null;
 
       private Builder() {}
 
@@ -150,12 +177,27 @@ public Builder createdTimestampMillis(long createdTimestampMillis) {
         return this;
       }
 
+      /**
+       * Optional metric name included in the exception message when {@link #value(double)} is
+       * negative. Does not change the snapshot identity.
+       */
+      public Builder metricName(@Nullable String metricName) {
+        this.metricName = metricName;
+        return this;
+      }
+
       public CounterDataPointSnapshot build() {
         if (value == null) {
           throw new IllegalArgumentException("Missing required field: value is null.");
         }
         return new CounterDataPointSnapshot(
-            value, labels, exemplar, createdTimestampMillis, scrapeTimestampMillis);
+            value,
+            labels,
+            exemplar,
+            createdTimestampMillis,
+            scrapeTimestampMillis,
+            false,
+            metricName);
       }
 
       @Override
diff --git a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/Labels.java b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/Labels.java
index d5c0a3a953..deb1c7f943 100644
--- a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/Labels.java
+++ b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/Labels.java
@@ -40,9 +40,8 @@ private Labels(String[] names, String[] prometheusNames, String[] values) {
     this.values = values;
   }
 
-  @SuppressWarnings("ReferenceEquality")
   public boolean isEmpty() {
-    return this == EMPTY || this.equals(EMPTY);
+    return this.equals(EMPTY);
   }
 
   /**
diff --git a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/MetricSnapshots.java b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/MetricSnapshots.java
index c4d7101dfe..8f55041fd4 100644
--- a/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/MetricSnapshots.java
+++ b/prometheus-metrics-model/src/main/java/io/prometheus/metrics/model/snapshots/MetricSnapshots.java
@@ -36,6 +36,9 @@ public MetricSnapshots(MetricSnapshot... snapshots) {
    */
   public MetricSnapshots(Collection snapshots) {
     List list = new ArrayList<>(snapshots);
+    // Sort by prometheus name so snapshots that share a prometheus name (i.e. the same exposed
+    // family) are adjacent. TextFormatUtil.mergeDuplicates depends on this ordering to detect
+    // duplicates in a single linear pass; if this sort key changes, update that fast path too.
     list.sort(comparing(s -> s.getMetadata().getPrometheusName()));
 
     // Validate no conflicting metric types
diff --git a/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/CounterSnapshotTest.java b/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/CounterSnapshotTest.java
index af6060e65e..58f16a6b8e 100644
--- a/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/CounterSnapshotTest.java
+++ b/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/CounterSnapshotTest.java
@@ -130,4 +130,22 @@ void testDataImmutable() {
     iterator.next();
     assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(iterator::remove);
   }
+
+  @Test
+  void testNegativeValueIncludesMetricNameInMessage() {
+    assertThatExceptionOfType(IllegalArgumentException.class)
+        .isThrownBy(
+            () ->
+                CounterDataPointSnapshot.builder().metricName("http_requests").value(-2.0).build())
+        .withMessageContaining("http_requests")
+        .withMessageContaining("-2.0")
+        .withMessageContaining("counters cannot have a negative value");
+  }
+
+  @Test
+  void testNegativeValueWithoutMetricNameKeepsLegacyMessage() {
+    assertThatExceptionOfType(IllegalArgumentException.class)
+        .isThrownBy(() -> CounterDataPointSnapshot.builder().value(-1.0).build())
+        .withMessage("-1.0: counters cannot have a negative value");
+  }
 }
diff --git a/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/MetricSnapshotsTest.java b/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/MetricSnapshotsTest.java
index 224ca691a7..dfc0fbb047 100644
--- a/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/MetricSnapshotsTest.java
+++ b/prometheus-metrics-model/src/test/java/io/prometheus/metrics/model/snapshots/MetricSnapshotsTest.java
@@ -38,6 +38,29 @@ void testSort() {
     assertThat(snapshots.get(2).getMetadata().getName()).isEqualTo("counter3");
   }
 
+  @Test
+  void testSortIsByPrometheusName() {
+    // Pins the sort key to getPrometheusName(): TextFormatUtil.mergeDuplicates relies on
+    // same-family snapshots being adjacent, which only holds under that key. "foo.bar" has
+    // prometheusName "foo_bar"; "fooZbar" is already legacy-valid. In ASCII '.'(46) < 'Z'(90)
+    // < '_'(95), so sorting by prometheusName orders "fooZbar" before "foo_bar" - the opposite
+    // of sorting by name (or expositionBaseName, which equals name here). So this test fails if
+    // the sort key is changed to name or expositionBaseName, which would silently break merging.
+    GaugeSnapshot fooDotBar =
+        GaugeSnapshot.builder()
+            .name("foo.bar")
+            .dataPoint(GaugeSnapshot.GaugeDataPointSnapshot.builder().value(1.0).build())
+            .build();
+    GaugeSnapshot fooZBar =
+        GaugeSnapshot.builder()
+            .name("fooZbar")
+            .dataPoint(GaugeSnapshot.GaugeDataPointSnapshot.builder().value(1.0).build())
+            .build();
+    MetricSnapshots snapshots = new MetricSnapshots(fooDotBar, fooZBar);
+    assertThat(snapshots.get(0).getMetadata().getPrometheusName()).isEqualTo("fooZbar");
+    assertThat(snapshots.get(1).getMetadata().getPrometheusName()).isEqualTo("foo_bar");
+  }
+
   @Test
   void testDuplicateName() {
     // Q: What if you have a counter named "foo" and a gauge named "foo"?
diff --git a/prometheus-metrics-otel-support/pom.xml b/prometheus-metrics-otel-support/pom.xml
index a4d1791145..87203218df 100644
--- a/prometheus-metrics-otel-support/pom.xml
+++ b/prometheus-metrics-otel-support/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-otel-support
@@ -19,7 +19,6 @@
   
 
   
-    true
     true
     true
   
diff --git a/prometheus-metrics-parent/pom.xml b/prometheus-metrics-parent/pom.xml
index d84511964d..329afe1be4 100644
--- a/prometheus-metrics-parent/pom.xml
+++ b/prometheus-metrics-parent/pom.xml
@@ -5,7 +5,7 @@
 
   io.prometheus
   client_java_parent
-  1.8.1-SNAPSHOT
+  1.10.1-SNAPSHOT
 
   Prometheus Metrics Library Parent
   http://github.com/prometheus/client_java
@@ -14,7 +14,6 @@
   
 
   
-    true
     true
     true
   
@@ -76,7 +75,7 @@
           
             org.codehaus.mojo
             build-helper-maven-plugin
-            3.6.1
+            3.6.2
             
               
                 add-license-resources
@@ -135,7 +134,7 @@
           
             org.sonatype.central
             central-publishing-maven-plugin
-            0.11.0
+            0.12.0
             true
             
               ossrh
diff --git a/prometheus-metrics-simpleclient-bridge/pom.xml b/prometheus-metrics-simpleclient-bridge/pom.xml
index e40e042750..f09b62b2c3 100644
--- a/prometheus-metrics-simpleclient-bridge/pom.xml
+++ b/prometheus-metrics-simpleclient-bridge/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-simpleclient-bridge
diff --git a/prometheus-metrics-tracer/pom.xml b/prometheus-metrics-tracer/pom.xml
index 7ba9fe6f5a..0227d5ffbe 100644
--- a/prometheus-metrics-tracer/pom.xml
+++ b/prometheus-metrics-tracer/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-tracer
diff --git a/prometheus-metrics-tracer/prometheus-metrics-tracer-common/pom.xml b/prometheus-metrics-tracer/prometheus-metrics-tracer-common/pom.xml
index 6087f34314..fd90cd5eeb 100644
--- a/prometheus-metrics-tracer/prometheus-metrics-tracer-common/pom.xml
+++ b/prometheus-metrics-tracer/prometheus-metrics-tracer-common/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     prometheus-metrics-tracer
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-tracer-common
diff --git a/prometheus-metrics-tracer/prometheus-metrics-tracer-initializer/pom.xml b/prometheus-metrics-tracer/prometheus-metrics-tracer-initializer/pom.xml
index 7ff43b009b..bb645a56b8 100644
--- a/prometheus-metrics-tracer/prometheus-metrics-tracer-initializer/pom.xml
+++ b/prometheus-metrics-tracer/prometheus-metrics-tracer-initializer/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     prometheus-metrics-tracer
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-tracer-initializer
diff --git a/prometheus-metrics-tracer/prometheus-metrics-tracer-otel-agent/pom.xml b/prometheus-metrics-tracer/prometheus-metrics-tracer-otel-agent/pom.xml
index f16bca4c60..2e9a0f7416 100644
--- a/prometheus-metrics-tracer/prometheus-metrics-tracer-otel-agent/pom.xml
+++ b/prometheus-metrics-tracer/prometheus-metrics-tracer-otel-agent/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     prometheus-metrics-tracer
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-tracer-otel-agent
diff --git a/prometheus-metrics-tracer/prometheus-metrics-tracer-otel/pom.xml b/prometheus-metrics-tracer/prometheus-metrics-tracer-otel/pom.xml
index 37f0e79b83..3132c9d5ec 100644
--- a/prometheus-metrics-tracer/prometheus-metrics-tracer-otel/pom.xml
+++ b/prometheus-metrics-tracer/prometheus-metrics-tracer-otel/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     prometheus-metrics-tracer
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   prometheus-metrics-tracer-otel
diff --git a/simpleclient-archive/integration_tests/it_common/pom.xml b/simpleclient-archive/integration_tests/it_common/pom.xml
index ec9d5ad1c5..114744057e 100644
--- a/simpleclient-archive/integration_tests/it_common/pom.xml
+++ b/simpleclient-archive/integration_tests/it_common/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_common
diff --git a/simpleclient-archive/integration_tests/it_exemplars_otel_agent/pom.xml b/simpleclient-archive/integration_tests/it_exemplars_otel_agent/pom.xml
index a56cd25d40..328cba2997 100644
--- a/simpleclient-archive/integration_tests/it_exemplars_otel_agent/pom.xml
+++ b/simpleclient-archive/integration_tests/it_exemplars_otel_agent/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_exemplars_otel_agent
diff --git a/simpleclient-archive/integration_tests/it_exemplars_otel_sdk/pom.xml b/simpleclient-archive/integration_tests/it_exemplars_otel_sdk/pom.xml
index fbea39601d..7a5af66b1a 100644
--- a/simpleclient-archive/integration_tests/it_exemplars_otel_sdk/pom.xml
+++ b/simpleclient-archive/integration_tests/it_exemplars_otel_sdk/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_exemplars_otel_sdk
diff --git a/simpleclient-archive/integration_tests/it_java_versions/pom.xml b/simpleclient-archive/integration_tests/it_java_versions/pom.xml
index a58611b73b..3fc235fb94 100644
--- a/simpleclient-archive/integration_tests/it_java_versions/pom.xml
+++ b/simpleclient-archive/integration_tests/it_java_versions/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_java_versions
diff --git a/simpleclient-archive/integration_tests/it_log4j2/pom.xml b/simpleclient-archive/integration_tests/it_log4j2/pom.xml
index f432406b90..4a1da46029 100644
--- a/simpleclient-archive/integration_tests/it_log4j2/pom.xml
+++ b/simpleclient-archive/integration_tests/it_log4j2/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_log4j2
diff --git a/simpleclient-archive/integration_tests/it_pushgateway/pom.xml b/simpleclient-archive/integration_tests/it_pushgateway/pom.xml
index 36b8d75a11..50f1e10204 100644
--- a/simpleclient-archive/integration_tests/it_pushgateway/pom.xml
+++ b/simpleclient-archive/integration_tests/it_pushgateway/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_pushgateway
diff --git a/simpleclient-archive/integration_tests/it_servlet_jakarta_exporter_webxml/pom.xml b/simpleclient-archive/integration_tests/it_servlet_jakarta_exporter_webxml/pom.xml
index 734695ed92..f0484bf214 100644
--- a/simpleclient-archive/integration_tests/it_servlet_jakarta_exporter_webxml/pom.xml
+++ b/simpleclient-archive/integration_tests/it_servlet_jakarta_exporter_webxml/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     integration_tests
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   it_servlet_jakarta_exporter_webxml
diff --git a/simpleclient-archive/integration_tests/pom.xml b/simpleclient-archive/integration_tests/pom.xml
index 1daa97de63..b96ae60a1c 100644
--- a/simpleclient-archive/integration_tests/pom.xml
+++ b/simpleclient-archive/integration_tests/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   integration_tests
diff --git a/simpleclient-archive/simpleclient_graphite_bridge/pom.xml b/simpleclient-archive/simpleclient_graphite_bridge/pom.xml
index c539a5e6e6..699911f7ac 100644
--- a/simpleclient-archive/simpleclient_graphite_bridge/pom.xml
+++ b/simpleclient-archive/simpleclient_graphite_bridge/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_graphite_bridge
diff --git a/simpleclient-archive/simpleclient_hibernate/pom.xml b/simpleclient-archive/simpleclient_hibernate/pom.xml
index 10d2c29241..78bd23bb2f 100644
--- a/simpleclient-archive/simpleclient_hibernate/pom.xml
+++ b/simpleclient-archive/simpleclient_hibernate/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_hibernate
diff --git a/simpleclient-archive/simpleclient_httpserver/pom.xml b/simpleclient-archive/simpleclient_httpserver/pom.xml
index 3cc821908c..33b15b5418 100644
--- a/simpleclient-archive/simpleclient_httpserver/pom.xml
+++ b/simpleclient-archive/simpleclient_httpserver/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_httpserver
diff --git a/simpleclient-archive/simpleclient_jetty/pom.xml b/simpleclient-archive/simpleclient_jetty/pom.xml
index 924decf76f..bff679eb67 100644
--- a/simpleclient-archive/simpleclient_jetty/pom.xml
+++ b/simpleclient-archive/simpleclient_jetty/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_jetty
diff --git a/simpleclient-archive/simpleclient_jetty_jdk8/pom.xml b/simpleclient-archive/simpleclient_jetty_jdk8/pom.xml
index 8c8c5a82db..92f5dc25f4 100644
--- a/simpleclient-archive/simpleclient_jetty_jdk8/pom.xml
+++ b/simpleclient-archive/simpleclient_jetty_jdk8/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_jetty_jdk8
diff --git a/simpleclient-archive/simpleclient_log4j/pom.xml b/simpleclient-archive/simpleclient_log4j/pom.xml
index 214c5c6950..ad3f71d645 100644
--- a/simpleclient-archive/simpleclient_log4j/pom.xml
+++ b/simpleclient-archive/simpleclient_log4j/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_log4j
diff --git a/simpleclient-archive/simpleclient_log4j2/pom.xml b/simpleclient-archive/simpleclient_log4j2/pom.xml
index 9669eda304..1448f15d67 100644
--- a/simpleclient-archive/simpleclient_log4j2/pom.xml
+++ b/simpleclient-archive/simpleclient_log4j2/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_log4j2
diff --git a/simpleclient-archive/simpleclient_logback/pom.xml b/simpleclient-archive/simpleclient_logback/pom.xml
index e17168531b..734a2e06f1 100644
--- a/simpleclient-archive/simpleclient_logback/pom.xml
+++ b/simpleclient-archive/simpleclient_logback/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_logback
diff --git a/simpleclient-archive/simpleclient_servlet/pom.xml b/simpleclient-archive/simpleclient_servlet/pom.xml
index 364b1484ad..124c3b6a06 100644
--- a/simpleclient-archive/simpleclient_servlet/pom.xml
+++ b/simpleclient-archive/simpleclient_servlet/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_servlet
diff --git a/simpleclient-archive/simpleclient_servlet_common/pom.xml b/simpleclient-archive/simpleclient_servlet_common/pom.xml
index 7e7c8c0165..0e6c48378a 100644
--- a/simpleclient-archive/simpleclient_servlet_common/pom.xml
+++ b/simpleclient-archive/simpleclient_servlet_common/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_servlet_common
diff --git a/simpleclient-archive/simpleclient_servlet_jakarta/pom.xml b/simpleclient-archive/simpleclient_servlet_jakarta/pom.xml
index 0989f363b3..6704d492a8 100644
--- a/simpleclient-archive/simpleclient_servlet_jakarta/pom.xml
+++ b/simpleclient-archive/simpleclient_servlet_jakarta/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_servlet_jakarta
diff --git a/simpleclient-archive/simpleclient_spring_web/pom.xml b/simpleclient-archive/simpleclient_spring_web/pom.xml
index b6087f9f5a..77fbca7b74 100644
--- a/simpleclient-archive/simpleclient_spring_web/pom.xml
+++ b/simpleclient-archive/simpleclient_spring_web/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_spring_web
diff --git a/simpleclient-archive/simpleclient_vertx/pom.xml b/simpleclient-archive/simpleclient_vertx/pom.xml
index fede323e6f..6d11e8ba2d 100644
--- a/simpleclient-archive/simpleclient_vertx/pom.xml
+++ b/simpleclient-archive/simpleclient_vertx/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_vertx
diff --git a/simpleclient-archive/simpleclient_vertx4/pom.xml b/simpleclient-archive/simpleclient_vertx4/pom.xml
index 4c80b20f48..fa9d0d12b3 100644
--- a/simpleclient-archive/simpleclient_vertx4/pom.xml
+++ b/simpleclient-archive/simpleclient_vertx4/pom.xml
@@ -5,7 +5,7 @@
   
     io.prometheus
     client_java
-    1.8.1-SNAPSHOT
+    1.10.1-SNAPSHOT
   
 
   simpleclient_vertx4