diff --git a/.github/workflows/olm-stable.yaml b/.github/workflows/olm-stable.yaml index 715633640..90e6f53c8 100644 --- a/.github/workflows/olm-stable.yaml +++ b/.github/workflows/olm-stable.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest environment: quay steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/package-operator-stable.yaml b/.github/workflows/package-operator-stable.yaml index b73b73309..008911e09 100644 --- a/.github/workflows/package-operator-stable.yaml +++ b/.github/workflows/package-operator-stable.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest environment: quay steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/pr-checks.yaml b/.github/workflows/pr-checks.yaml index f5b7a778e..da7b53f88 100644 --- a/.github/workflows/pr-checks.yaml +++ b/.github/workflows/pr-checks.yaml @@ -8,7 +8,7 @@ jobs: name: Lint the commit messages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: wagoid/commitlint-github-action@v6 @@ -17,14 +17,14 @@ jobs: name: Lint Github Action runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: reviewdog/action-actionlint@v1 lint: name: Lint code runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: @@ -50,7 +50,7 @@ jobs: name: Verify generated code runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: @@ -63,7 +63,7 @@ jobs: runs-on: ubuntu-latest name: Validate tools cache steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: @@ -79,7 +79,7 @@ jobs: name: Build bundle image runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Go environment uses: actions/setup-go@v6 @@ -98,7 +98,7 @@ jobs: name: Run end-to-end tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: e2e tests through OLM uses: ./.github/e2e-tests-olm diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 792ea5215..b1750e0e0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,11 +4,14 @@ on: push: branches: [main] +permissions: + contents: write + jobs: e2e-tests-olm: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: e2e tests through OLM uses: ./.github/e2e-tests-olm @@ -20,7 +23,7 @@ jobs: needs: - e2e-tests-olm steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -83,7 +86,7 @@ jobs: if: "startsWith(github.event.head_commit.message, 'chore(release):')" steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} @@ -130,7 +133,7 @@ jobs: environment: quay steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.REPOSITORY_PUSH_TOKEN }} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..fe8badc0e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,176 @@ +## AGENTS GUIDE + +This document is for **AI/code assistants and other automation** contributing changes to this repository. + +The primary goal is to keep generated assets, CRDs, OLM bundles, and deployment manifests **consistent and reproducible** while making safe, reviewable edits. + +--- + +## Project Overview + +- **Name**: Observability Operator (`observability-operator`) +- **Type**: Kubernetes operator (Go, controller-runtime) plus Kustomize/OLM packaging +- **Purpose**: Manage monitoring/alerting stacks (and related observability components) via CRDs. + +Key entry points: + +- `cmd/operator/main.go` – operator binary entrypoint. +- `pkg/apis/...` – API types and CRDs definitions. +- `pkg/controllers/...` – reconcilers/controllers. +- `deploy/...` – Kustomize bases for CRDs, operator deployment, OLM, package-operator, etc. +- `bundle/...` – Generated OLM bundle (do not hand-edit). + +For human-focused docs, see `README.md` and `docs/developer.md`. + +--- + +## Conventions & Tooling + +- **Language**: Go (see Go version in root `go.mod`). +- **Build & generation**: GNU Make, controller-gen, kustomize, operator-sdk. +- **Commit messages**: Follow **Conventional Commits** (see `docs/developer.md`). +- **Versioning**: SemVer, automated via `make initiate-release`. + +Important make targets: + +- `make generate` – regenerate CRDs, RBAC, deepcopy, Kustomize outputs, and API docs. +- `make test-unit` – run Go unit tests. +- `make test-e2e` – run Go-based e2e tests (alternative to `./test/run-e2e.sh`). +- `make operator` / `make build` – build the operator binary into `tmp/operator`. + +Only **invoke** these commands in suggestions; do **not assume** they have been run. + +--- + +## Repository Layout (for Agents) + +- `cmd/` – CLI/entrypoint code. +- `pkg/apis/` – custom resource APIs; changes here require `make generate`. +- `pkg/controllers/` – controller logic; generally safe for targeted edits. +- `deploy/`: + - `crds/` – generated CRDs (kubernetes + common). + - `dependencies/` – Kustomize config for dependent operators (e.g. obo-prometheus-operator). + - `monitoring/`, `operator/`, `olm/`, `package-operator/` – operator deployment and packaging. +- `bundle/` – **generated** OLM bundle content. +- `jsonnet/`, `dashboards/`, `must-gather/` – ancillary assets. +- `tmp/` – build/test artifacts; never commit changes from here. + +Prefer editing **sources** (Go, Kustomize bases, templates) rather than generated artifacts. + +--- + +## Safe vs Unsafe Edits + +**Prefer to edit** + +- Go code in: + - `pkg/controllers/...` + - `pkg/operator/...` + - `pkg/reconciler/...` + - `cmd/operator/...` +- API types in `pkg/apis/...` (but remember to run `make generate` afterwards). +- Kustomize bases under `deploy/...`: + - `deploy/dependencies/...` + - `deploy/monitoring/...` + - `deploy/olm/...` + - `deploy/package-operator/...` +- Documentation in `docs/` and `README.md`. + +**Avoid hand-editing** + +- `bundle/...` – OLM bundle content is generated via `make bundle`. +- Generated CRDs/RBAC in: + - `deploy/crds/common/...` + - `deploy/crds/kubernetes/...` + - `deploy/operator/observability-operator-cluster-role.yaml` +- Files under `tmp/`. + +When in doubt, look for a related **Makefile target** or a comment indicating files are generated. + +--- + +## Common Change Patterns + +### 1. Updating or Adding API Fields / CRDs + +1. Modify Go API types under `pkg/apis/...`. +2. Update any validation/defaulting or controller logic in `pkg/controllers/...` as needed. +3. Regenerate artifacts: + + ```sh + make generate + ``` + +4. Ensure CRDs and RBAC changes are committed alongside the Go changes. + +### 2. Bumping the forked Prometheus Operator (obo-prometheus-operator) + +As described in `docs/developer.md`: + +1. Update the dependency version in: + - `go.mod` + - `deploy/dependencies/kustomization.yaml` +2. Regenerate manifests: + + ```sh + make generate + ``` + +3. Commit Go module + dependency + generated manifest changes together. + +### 3. Adjusting Operator / OLM Manifests + +- For operator deployment changes (env vars, args, resources, etc.): + - Prefer editing the relevant **Kustomize bases** under `deploy/operator/`, `deploy/monitoring/`, or `deploy/dependencies/`. +- For OLM bundle / CSV adjustments: + - Edit Kustomize configs in `deploy/olm/` rather than direct edits in `bundle/`. + - Recreate the bundle as needed with: + + ```sh + make bundle + ``` + + - Be aware that `make bundle` may reset uncommitted changes in `bundle/` (see `Makefile`). + +### 4. Tests & Linting + +To keep suggestions consistent with local workflows, assume the following are used: + +- Unit tests: + + ```sh + make test-unit + ``` + +- End-to-end tests: + + ```sh + ./test/run-e2e.sh + ``` + +- Linting: + + ```sh + make lint + ``` + +Proposed changes should be structured so they can pass these commands. + +--- + +## Style & Quality Notes for Agents + +- Follow existing **Go style** and `controller-runtime` patterns; avoid introducing new frameworks. +- Keep reconciliation logic **idempotent** and resilient to partial failures. +- When editing YAML, preserve: + - Resource kinds, API versions, and labels/annotations used by operators/OLM. + - Existing indentation and ordering where practical. +- For breaking or behavioural changes, ensure commit messages (authored by humans) can use + `feat:`, `fix:`, or `BREAKING CHANGE:` consistently. + +If a change appears to impact release automation, image tags, or OLM packaging, prefer to +suggest **small, focused diffs** and explicitly call out the potential impact in comments +or PR descriptions for human reviewers. + + + diff --git a/build/Dockerfile b/build/Dockerfile index 58440be5d..565beba5c 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -5,6 +5,7 @@ WORKDIR /workspace # Copy the Go Modules manifests COPY go.mod go.mod COPY go.sum go.sum +COPY pkg/apis/ pkg/apis/ # cache deps before building and copying source so that we don't need to re-download as much # and so that source changes don't invalidate our downloaded layer RUN go mod download diff --git a/bundle/manifests/monitoring.rhobs_alertmanagerconfigs.yaml b/bundle/manifests/monitoring.rhobs_alertmanagerconfigs.yaml index 211db3627..f493c857f 100644 --- a/bundle/manifests/monitoring.rhobs_alertmanagerconfigs.yaml +++ b/bundle/manifests/monitoring.rhobs_alertmanagerconfigs.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -5297,6 +5297,11 @@ spec: message defines the notification message content. This is the main body text of the Pushover notification. type: string + monospace: + description: |- + monospace optional HTML/monospace formatting for the message, see https://pushover.net/api#html + html and monospace formatting are mutually exclusive. + type: boolean priority: description: |- priority defines the notification priority level. @@ -8051,7 +8056,7 @@ spec: x-kubernetes-map-type: atomic useFIPSSTSEndpoint: description: |- - useFIPSSTSEndpoint defines FIPS mode for AWS STS endpoint. + useFIPSSTSEndpoint defines the FIPS mode for the AWS STS endpoint. It requires Prometheus >= v2.54.0. type: boolean type: object diff --git a/bundle/manifests/monitoring.rhobs_alertmanagers.yaml b/bundle/manifests/monitoring.rhobs_alertmanagers.yaml index f83ea462e..095f61f51 100644 --- a/bundle/manifests/monitoring.rhobs_alertmanagers.yaml +++ b/bundle/manifests/monitoring.rhobs_alertmanagers.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: Experimental-SSA - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator diff --git a/bundle/manifests/monitoring.rhobs_monitoringstacks.yaml b/bundle/manifests/monitoring.rhobs_monitoringstacks.yaml index 5ee332657..a8746abb2 100644 --- a/bundle/manifests/monitoring.rhobs_monitoringstacks.yaml +++ b/bundle/manifests/monitoring.rhobs_monitoringstacks.yaml @@ -50,6 +50,12 @@ spec: default: false description: Disables the deployment of Alertmanager. type: boolean + replicas: + default: 2 + description: Number of replicas/pods to deploy for Alertmanager. + format: int32 + minimum: 0 + type: integer webTLSConfig: description: Configure TLS options for the Alertmanager web server. properties: @@ -1709,10 +1715,23 @@ spec: retention: default: 120h description: |- - Time duration to retain data for. Default is '120h', - and must match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds seconds minutes hours days weeks years). + Time duration to retain data for. Default is '120h', and the value must + match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds + seconds minutes hours days weeks years). + + When both retention and retentionSize are defined, whichever triggers + first will be applied. pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ type: string + retentionSize: + description: |- + retentionSize defines the maximum number of bytes used by the Prometheus + data. By default the size is unlimited. + + When both retention and retentionSize are defined, whichever triggers + first will be applied. + pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ + type: string tolerations: description: Define tolerations for Monitoring Stack Pods. items: diff --git a/bundle/manifests/monitoring.rhobs_podmonitors.yaml b/bundle/manifests/monitoring.rhobs_podmonitors.yaml index af3a2ef83..42b30877e 100644 --- a/bundle/manifests/monitoring.rhobs_podmonitors.yaml +++ b/bundle/manifests/monitoring.rhobs_podmonitors.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -793,11 +793,29 @@ spec: description: |- port defines the `Pod` port name which exposes the endpoint. + If the pod doesn't expose a port with the same name, it will result + in no targets being discovered. + + If a `Pod` has multiple `Port`s with the same name (which is not + recommended), one target instance per unique port number will be + generated. + It takes precedence over the `portNumber` and `targetPort` fields. type: string portNumber: - description: portNumber defines the `Pod` port number which - exposes the endpoint. + description: |- + portNumber defines the `Pod` port number which exposes the endpoint. + + The `Pod` must declare the specified `Port` in its spec or the + target will be dropped by Prometheus. + + This cannot be used to enable scraping of an undeclared port. + To scrape targets on a port which isn't exposed, you need to use + relabeling to override the `__address__` label (but beware of + duplicate targets if the `Pod` has other declared ports). + + In practice Prometheus will select targets for which the + matches the target's __meta_kubernetes_pod_container_port_number. format: int32 maximum: 65535 minimum: 1 @@ -942,16 +960,12 @@ spec: type: object type: array scheme: - description: |- - scheme defines the HTTP scheme to use for scraping. - - `http` and `https` are the expected values unless you rewrite the - `__scheme__` label via relabeling. - - If empty, Prometheus uses the default value `http`. + description: scheme defines the HTTP scheme to use for scraping. enum: - http - https + - HTTP + - HTTPS type: string scrapeTimeout: description: |- diff --git a/bundle/manifests/monitoring.rhobs_probes.yaml b/bundle/manifests/monitoring.rhobs_probes.yaml index da952c197..c0271b1b3 100644 --- a/bundle/manifests/monitoring.rhobs_probes.yaml +++ b/bundle/manifests/monitoring.rhobs_probes.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -757,16 +757,22 @@ spec: pattern: ^(http|https|socks5)://.+$ type: string scheme: - description: |- - scheme defines the HTTP scheme to use for scraping. - `http` and `https` are the expected values unless you rewrite the `__scheme__` label via relabeling. - If empty, Prometheus uses the default value `http`. + description: scheme defines the HTTP scheme to use when scraping + the prober. enum: - http - https + - HTTP + - HTTPS type: string url: - description: url defines the mandatory URL of the prober. + description: |- + url defines the address of the prober. + + Unlike what the name indicates, the value should be in the form of + `address:port` without any scheme which should be specified in the + `scheme` field. + minLength: 1 type: string required: - url diff --git a/bundle/manifests/monitoring.rhobs_prometheusagents.yaml b/bundle/manifests/monitoring.rhobs_prometheusagents.yaml index 9bc80e6b8..a09793ed7 100644 --- a/bundle/manifests/monitoring.rhobs_prometheusagents.yaml +++ b/bundle/manifests/monitoring.rhobs_prometheusagents.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -5498,11 +5498,12 @@ spec: Cannot be set at the same time as `oauth` or `sdk`. properties: clientId: - description: clientId defines defines the Azure User-assigned - Managed identity. + description: |- + clientId defines the Azure User-assigned Managed identity. + + For Prometheus >= 3.5.0 and Thanos >= 0.40.0, this field is allowed to be empty to support system-assigned managed identities. + minLength: 1 type: string - required: - - clientId type: object oauth: description: |- @@ -5679,8 +5680,11 @@ spec: - V2.0 type: string metadataConfig: - description: metadataConfig defines how to send a series metadata - to the remote storage. + description: |- + metadataConfig defines how to send a series metadata to the remote storage. + + When the field is empty, **no metadata** is sent. But when the field is + null, metadata is sent. properties: maxSamplesPerSend: description: |- @@ -6252,7 +6256,7 @@ spec: x-kubernetes-map-type: atomic useFIPSSTSEndpoint: description: |- - useFIPSSTSEndpoint defines FIPS mode for AWS STS endpoint. + useFIPSSTSEndpoint defines the FIPS mode for the AWS STS endpoint. It requires Prometheus >= v2.54.0. type: boolean type: object diff --git a/bundle/manifests/monitoring.rhobs_prometheuses.yaml b/bundle/manifests/monitoring.rhobs_prometheuses.yaml index b9997e151..f4bafe663 100644 --- a/bundle/manifests/monitoring.rhobs_prometheuses.yaml +++ b/bundle/manifests/monitoring.rhobs_prometheuses.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: Experimental-SSA - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -1373,6 +1373,7 @@ spec: pathPrefix: description: pathPrefix defines the prefix for the HTTP path alerts are pushed to. + minLength: 1 type: string port: anyOf: @@ -1513,7 +1514,13 @@ spec: type: object type: array scheme: - description: scheme to use when firing alerts. + description: scheme defines the HTTP scheme to use when + sending alerts. + enum: + - http + - https + - HTTP + - HTTPS type: string sigv4: description: |- @@ -1589,7 +1596,7 @@ spec: x-kubernetes-map-type: atomic useFIPSSTSEndpoint: description: |- - useFIPSSTSEndpoint defines FIPS mode for AWS STS endpoint. + useFIPSSTSEndpoint defines the FIPS mode for the AWS STS endpoint. It requires Prometheus >= v2.54.0. type: boolean type: object @@ -7081,11 +7088,12 @@ spec: Cannot be set at the same time as `oauth` or `sdk`. properties: clientId: - description: clientId defines defines the Azure User-assigned - Managed identity. + description: |- + clientId defines the Azure User-assigned Managed identity. + + For Prometheus >= 3.5.0 and Thanos >= 0.40.0, this field is allowed to be empty to support system-assigned managed identities. + minLength: 1 type: string - required: - - clientId type: object oauth: description: |- @@ -7262,8 +7270,11 @@ spec: - V2.0 type: string metadataConfig: - description: metadataConfig defines how to send a series metadata - to the remote storage. + description: |- + metadataConfig defines how to send a series metadata to the remote storage. + + When the field is empty, **no metadata** is sent. But when the field is + null, metadata is sent. properties: maxSamplesPerSend: description: |- @@ -7835,7 +7846,7 @@ spec: x-kubernetes-map-type: atomic useFIPSSTSEndpoint: description: |- - useFIPSSTSEndpoint defines FIPS mode for AWS STS endpoint. + useFIPSSTSEndpoint defines the FIPS mode for the AWS STS endpoint. It requires Prometheus >= v2.54.0. type: boolean type: object diff --git a/bundle/manifests/monitoring.rhobs_prometheusrules.yaml b/bundle/manifests/monitoring.rhobs_prometheusrules.yaml index 667fc4242..f27c2fa3e 100644 --- a/bundle/manifests/monitoring.rhobs_prometheusrules.yaml +++ b/bundle/manifests/monitoring.rhobs_prometheusrules.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator diff --git a/bundle/manifests/monitoring.rhobs_scrapeconfigs.yaml b/bundle/manifests/monitoring.rhobs_scrapeconfigs.yaml index 749a1fcd7..10d684647 100644 --- a/bundle/manifests/monitoring.rhobs_scrapeconfigs.yaml +++ b/bundle/manifests/monitoring.rhobs_scrapeconfigs.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -1429,8 +1429,10 @@ spec: pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ type: string scheme: - description: scheme defines the HTTP Scheme default "http" + description: scheme defines the HTTP Scheme. enum: + - http + - https - HTTP - HTTPS type: string @@ -12513,10 +12515,10 @@ spec: type: object type: array scheme: - description: |- - scheme defines the protocol scheme used for requests. - If empty, Prometheus uses HTTP by default. + description: scheme defines the protocol scheme used for requests. enum: + - http + - https - HTTP - HTTPS type: string diff --git a/bundle/manifests/monitoring.rhobs_servicemonitors.yaml b/bundle/manifests/monitoring.rhobs_servicemonitors.yaml index 8b9bd273a..4b0337063 100644 --- a/bundle/manifests/monitoring.rhobs_servicemonitors.yaml +++ b/bundle/manifests/monitoring.rhobs_servicemonitors.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -854,16 +854,13 @@ spec: type: object type: array scheme: - description: |- - scheme defines the HTTP scheme to use for scraping. - - `http` and `https` are the expected values unless you rewrite the - `__scheme__` label via relabeling. - - If empty, Prometheus uses the default value `http`. + description: scheme defines the HTTP scheme to use when scraping + the metrics. enum: - http - https + - HTTP + - HTTPS type: string scrapeTimeout: description: |- diff --git a/bundle/manifests/monitoring.rhobs_thanosrulers.yaml b/bundle/manifests/monitoring.rhobs_thanosrulers.yaml index c2b1b8133..db9a3bf55 100644 --- a/bundle/manifests/monitoring.rhobs_thanosrulers.yaml +++ b/bundle/manifests/monitoring.rhobs_thanosrulers.yaml @@ -4,7 +4,7 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.19.0 observability.openshift.io/api-support: TechPreview - operator.prometheus.io/version: 0.86.2-rhobs1 + operator.prometheus.io/version: 0.87.0-rhobs1 creationTimestamp: null labels: app.kubernetes.io/part-of: observability-operator @@ -4841,11 +4841,12 @@ spec: Cannot be set at the same time as `oauth` or `sdk`. properties: clientId: - description: clientId defines defines the Azure User-assigned - Managed identity. + description: |- + clientId defines the Azure User-assigned Managed identity. + + For Prometheus >= 3.5.0 and Thanos >= 0.40.0, this field is allowed to be empty to support system-assigned managed identities. + minLength: 1 type: string - required: - - clientId type: object oauth: description: |- @@ -5022,8 +5023,11 @@ spec: - V2.0 type: string metadataConfig: - description: metadataConfig defines how to send a series metadata - to the remote storage. + description: |- + metadataConfig defines how to send a series metadata to the remote storage. + + When the field is empty, **no metadata** is sent. But when the field is + null, metadata is sent. properties: maxSamplesPerSend: description: |- @@ -5595,7 +5599,7 @@ spec: x-kubernetes-map-type: atomic useFIPSSTSEndpoint: description: |- - useFIPSSTSEndpoint defines FIPS mode for AWS STS endpoint. + useFIPSSTSEndpoint defines the FIPS mode for the AWS STS endpoint. It requires Prometheus >= v2.54.0. type: boolean type: object diff --git a/bundle/manifests/obo-prometheus-operator-admission-webhook_policy_v1_poddisruptionbudget.yaml b/bundle/manifests/obo-prometheus-operator-admission-webhook_policy_v1_poddisruptionbudget.yaml index daa326649..466bd85c4 100644 --- a/bundle/manifests/obo-prometheus-operator-admission-webhook_policy_v1_poddisruptionbudget.yaml +++ b/bundle/manifests/obo-prometheus-operator-admission-webhook_policy_v1_poddisruptionbudget.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 name: obo-prometheus-operator-admission-webhook spec: minAvailable: 1 diff --git a/bundle/manifests/obo-prometheus-operator-admission-webhook_v1_service.yaml b/bundle/manifests/obo-prometheus-operator-admission-webhook_v1_service.yaml index 2d8caaad8..eab234b8a 100644 --- a/bundle/manifests/obo-prometheus-operator-admission-webhook_v1_service.yaml +++ b/bundle/manifests/obo-prometheus-operator-admission-webhook_v1_service.yaml @@ -5,7 +5,7 @@ metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 name: obo-prometheus-operator-admission-webhook spec: ports: diff --git a/bundle/manifests/obo-prometheus-operator_v1_service.yaml b/bundle/manifests/obo-prometheus-operator_v1_service.yaml index baf691655..11cb63a44 100644 --- a/bundle/manifests/obo-prometheus-operator_v1_service.yaml +++ b/bundle/manifests/obo-prometheus-operator_v1_service.yaml @@ -6,7 +6,7 @@ metadata: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 name: obo-prometheus-operator spec: clusterIP: None diff --git a/bundle/manifests/observability-operator.clusterserviceversion.yaml b/bundle/manifests/observability-operator.clusterserviceversion.yaml index 482e0c371..f54d6aa55 100644 --- a/bundle/manifests/observability-operator.clusterserviceversion.yaml +++ b/bundle/manifests/observability-operator.clusterserviceversion.yaml @@ -42,7 +42,7 @@ metadata: categories: Monitoring certified: "false" containerImage: observability-operator:1.3.0 - createdAt: "2025-11-14T10:13:10Z" + createdAt: "2025-12-05T12:43:59Z" description: A Go based Kubernetes operator to setup and manage highly available Monitoring Stack using Prometheus, Alertmanager and Thanos Querier. operatorframework.io/cluster-monitoring: "true" @@ -80,7 +80,10 @@ spec: kind: MonitoringStack name: monitoringstacks.monitoring.rhobs version: v1alpha1 - - kind: ObservabilityInstaller + - description: Provides end-to-end observability capabilities with minimal configuration. + Simplifies deployment and management of observability components such as tracing. + displayName: Observability Installer + kind: ObservabilityInstaller name: observabilityinstallers.observability.openshift.io version: v1alpha1 - description: Perses is the Schema for the perses API @@ -203,6 +206,7 @@ spec: - probes - probes/status - prometheusrules + - prometheusrules/status verbs: - '*' - apiGroups: @@ -825,7 +829,7 @@ spec: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 name: obo-prometheus-operator spec: replicas: 1 @@ -844,7 +848,7 @@ spec: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 spec: affinity: nodeAffinity: @@ -857,14 +861,16 @@ spec: automountServiceAccountToken: true containers: - args: - - --prometheus-config-reloader=quay.io/rhobs/obo-prometheus-config-reloader:v0.86.1-rhobs1 + - --prometheus-config-reloader=quay.io/rhobs/obo-prometheus-config-reloader:v0.87.0-rhobs1 - --prometheus-instance-selector=app.kubernetes.io/managed-by=observability-operator - --alertmanager-instance-selector=app.kubernetes.io/managed-by=observability-operator - --thanos-ruler-instance-selector=app.kubernetes.io/managed-by=observability-operator + - --watch-referenced-objects-in-all-namespaces=true + - --disable-unmanaged-prometheus-configuration=true env: - name: GOGC value: "30" - image: quay.io/rhobs/obo-prometheus-operator:v0.86.1-rhobs1 + image: quay.io/rhobs/obo-prometheus-operator:v0.87.0-rhobs1 name: prometheus-operator ports: - containerPort: 8080 @@ -894,7 +900,7 @@ spec: - label: app.kubernetes.io/name: prometheus-operator-admission-webhook app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 name: obo-prometheus-operator-admission-webhook spec: replicas: 2 @@ -912,7 +918,7 @@ spec: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook app.kubernetes.io/part-of: observability-operator - app.kubernetes.io/version: 0.86.2-rhobs1 + app.kubernetes.io/version: 0.87.0-rhobs1 spec: affinity: nodeAffinity: @@ -937,7 +943,7 @@ spec: - --web.enable-tls=true - --web.cert-file=/tmp/k8s-webhook-server/serving-certs/tls.crt - --web.key-file=/tmp/k8s-webhook-server/serving-certs/tls.key - image: quay.io/rhobs/obo-admission-webhook:v0.86.2-rhobs1 + image: quay.io/rhobs/obo-admission-webhook:v0.87.0-rhobs1 name: prometheus-operator-admission-webhook ports: - containerPort: 8443 diff --git a/bundle/manifests/observability.openshift.io_uiplugins.yaml b/bundle/manifests/observability.openshift.io_uiplugins.yaml index b5958bb5d..556b3f641 100644 --- a/bundle/manifests/observability.openshift.io_uiplugins.yaml +++ b/bundle/manifests/observability.openshift.io_uiplugins.yaml @@ -132,7 +132,7 @@ spec: description: |- Schema is the schema to use for logs querying and display. - Defatults to "viaq" if not specified, "select" is used to allow users to select the schema from the UI. + Defaults to "viaq" if not specified. Use "otel" for OpenTelemetry schema, or "select" to allow users to choose the schema from the UI. enum: - viaq - otel diff --git a/deploy/crds/common/monitoring.rhobs_monitoringstacks.yaml b/deploy/crds/common/monitoring.rhobs_monitoringstacks.yaml index 7139bec53..3a199fe44 100644 --- a/deploy/crds/common/monitoring.rhobs_monitoringstacks.yaml +++ b/deploy/crds/common/monitoring.rhobs_monitoringstacks.yaml @@ -50,6 +50,12 @@ spec: default: false description: Disables the deployment of Alertmanager. type: boolean + replicas: + default: 2 + description: Number of replicas/pods to deploy for Alertmanager. + format: int32 + minimum: 0 + type: integer webTLSConfig: description: Configure TLS options for the Alertmanager web server. properties: @@ -1709,10 +1715,23 @@ spec: retention: default: 120h description: |- - Time duration to retain data for. Default is '120h', - and must match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds seconds minutes hours days weeks years). + Time duration to retain data for. Default is '120h', and the value must + match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds + seconds minutes hours days weeks years). + + When both retention and retentionSize are defined, whichever triggers + first will be applied. pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ type: string + retentionSize: + description: |- + retentionSize defines the maximum number of bytes used by the Prometheus + data. By default the size is unlimited. + + When both retention and retentionSize are defined, whichever triggers + first will be applied. + pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ + type: string tolerations: description: Define tolerations for Monitoring Stack Pods. items: diff --git a/deploy/crds/common/observability.openshift.io_uiplugins.yaml b/deploy/crds/common/observability.openshift.io_uiplugins.yaml index 991c82099..6fbc21b45 100644 --- a/deploy/crds/common/observability.openshift.io_uiplugins.yaml +++ b/deploy/crds/common/observability.openshift.io_uiplugins.yaml @@ -132,7 +132,7 @@ spec: description: |- Schema is the schema to use for logs querying and display. - Defatults to "viaq" if not specified, "select" is used to allow users to select the schema from the UI. + Defaults to "viaq" if not specified. Use "otel" for OpenTelemetry schema, or "select" to allow users to choose the schema from the UI. enum: - viaq - otel diff --git a/deploy/dependencies/kustomization.yaml b/deploy/dependencies/kustomization.yaml index c98995453..96bbf2801 100644 --- a/deploy/dependencies/kustomization.yaml +++ b/deploy/dependencies/kustomization.yaml @@ -3,25 +3,25 @@ kind: Kustomization resources: -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_alertmanagers.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_podmonitors.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_probes.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheuses.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheusrules.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_servicemonitors.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_thanosrulers.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheusagents.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_alertmanagerconfigs.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_scrapeconfigs.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/rbac/prometheus-operator/prometheus-operator-service.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/admission-webhook/deployment.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/admission-webhook/service-account.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/admission-webhook/service.yaml -- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.86.2-rhobs1/example/admission-webhook/pod-disruption-budget.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_alertmanagers.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_podmonitors.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_probes.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheuses.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheusrules.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_servicemonitors.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_thanosrulers.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_prometheusagents.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_alertmanagerconfigs.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/prometheus-operator-crd/monitoring.rhobs_scrapeconfigs.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/rbac/prometheus-operator/prometheus-operator-service.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/admission-webhook/deployment.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/admission-webhook/service-account.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/admission-webhook/service.yaml +- https://raw.githubusercontent.com/rhobs/obo-prometheus-operator/v0.87.0-rhobs1/example/admission-webhook/pod-disruption-budget.yaml # NOTE: a service although automatically created by OLM for webhooks still # requires admission-webhook/service as the port generated by OLM uses 443 # but assumes targetPort to be 443 as opposed to "https" port of webhook - 8443 @@ -30,14 +30,20 @@ resources: - admission-webhook/alertmanager-config-validating-webhook.yaml - admission-webhook/prometheus-rule-validating-webhook.yaml +images: +- name: quay.io/rhobs/obo-prometheus-operator + newTag: v0.87.0-rhobs1 +- name: quay.io/rhobs/obo-prometheus-config-reloader + newTag: v0.87.0-rhobs1 +- name: quay.io/rhobs/obo-admission-webhook + newTag: v0.87.0-rhobs1 + namespace: operators namePrefix: obo- # rely on tls-certificates injected by OLM instead of mounting empty files - - # HACK: remove the RuntimeDefault from ALL deploymens until we figure out # how to run the operator on all openshift version from 4.9-13. Currently the # webhook fails to deploy on 4.10 @@ -70,12 +76,14 @@ patches: spec: containers: - name: prometheus-operator - image: quay.io/rhobs/obo-prometheus-operator:v0.86.1-rhobs1 + image: quay.io/rhobs/obo-prometheus-operator args: - - --prometheus-config-reloader=quay.io/rhobs/obo-prometheus-config-reloader:v0.86.1-rhobs1 + - --prometheus-config-reloader=quay.io/rhobs/obo-prometheus-config-reloader:v0.87.0-rhobs1 - --prometheus-instance-selector=app.kubernetes.io/managed-by=observability-operator - --alertmanager-instance-selector=app.kubernetes.io/managed-by=observability-operator - --thanos-ruler-instance-selector=app.kubernetes.io/managed-by=observability-operator + - --watch-referenced-objects-in-all-namespaces=true + - --disable-unmanaged-prometheus-configuration=true resources: requests: cpu: 5m diff --git a/deploy/olm/bases/observability-operator.clusterserviceversion.yaml b/deploy/olm/bases/observability-operator.clusterserviceversion.yaml index 92bf4ae66..453fd7515 100644 --- a/deploy/olm/bases/observability-operator.clusterserviceversion.yaml +++ b/deploy/olm/bases/observability-operator.clusterserviceversion.yaml @@ -2,7 +2,37 @@ apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: annotations: - alm-examples: "[]" + alm-examples: |- + [ + { + "apiVersion": "observability.openshift.io/v1alpha1", + "kind": "ObservabilityInstaller", + "metadata": { + "name": "sample-observability", + "namespace": "observability" + }, + "spec": { + "capabilities": { + "tracing": { + "enabled": true, + "storage": { + "objectStorage": { + "s3": { + "bucket": "tempo", + "endpoint": "http://minio.minio.svc:9000", + "accessKeyID": "tempo", + "accessKeySecret": { + "name": "minio-secret", + "key": "access_key_secret" + } + } + } + } + } + } + } + } + ] capabilities: Basic Install categories: Monitoring certified: "false" @@ -45,6 +75,11 @@ spec: kind: MonitoringStack name: monitoringstacks.monitoring.rhobs version: v1alpha1 + - description: Provides end-to-end observability capabilities with minimal configuration. Simplifies deployment and management of observability components such as tracing. + displayName: Observability Installer + kind: ObservabilityInstaller + name: observabilityinstallers.observability.openshift.io + version: v1alpha1 - description: PodMonitor defines monitoring for a set of pods displayName: PodMonitor kind: PodMonitor diff --git a/deploy/samples/observability-installer.yaml b/deploy/samples/observability-installer.yaml new file mode 100644 index 000000000..5336832ff --- /dev/null +++ b/deploy/samples/observability-installer.yaml @@ -0,0 +1,18 @@ +apiVersion: observability.openshift.io/v1alpha1 +kind: ObservabilityInstaller +metadata: + name: sample-observability + namespace: observability +spec: + capabilities: + tracing: + enabled: true + storage: + objectStorage: + s3: + bucket: tempo + endpoint: http://minio.minio.svc:9000 + accessKeyID: tempo + accessKeySecret: + name: minio-secret + key: access_key_secret \ No newline at end of file diff --git a/docs/api.md b/docs/api.md index fad6179ef..754fb2c2a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -173,12 +173,27 @@ To disable service discovery, set to null. E.g. resourceSelector:.
retention string - Time duration to retain data for. Default is '120h', -and must match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds seconds minutes hours days weeks years).
+ Time duration to retain data for. Default is '120h', and the value must +match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds +seconds minutes hours days weeks years). + +When both retention and retentionSize are defined, whichever triggers +first will be applied.

Default: 120h
false + + retentionSize + string + + retentionSize defines the maximum number of bytes used by the Prometheus +data. By default the size is unlimited. + +When both retention and retentionSize are defined, whichever triggers +first will be applied.
+ + false tolerations []object @@ -215,6 +230,17 @@ Define Alertmanager config Default: false
false + + replicas + integer + + Number of replicas/pods to deploy for Alertmanager.
+
+ Format: int32
+ Default: 2
+ Minimum: 0
+ + false webTLSConfig object @@ -5347,7 +5373,7 @@ It always references a LokiStack in the "openshift-logging" namespace.
Schema is the schema to use for logs querying and display. -Defatults to "viaq" if not specified, "select" is used to allow users to select the schema from the UI.
+Defaults to "viaq" if not specified. Use "otel" for OpenTelemetry schema, or "select" to allow users to choose the schema from the UI.

Enum: viaq, otel, select
diff --git a/docs/user-guides/README.md b/docs/user-guides/README.md index dd5d74589..1bac9d359 100644 --- a/docs/user-guides/README.md +++ b/docs/user-guides/README.md @@ -2,4 +2,5 @@ * [Using SSA to customize Prometheus](server-side-apply.md) * [Federating OpenShift In-Cluster Prometheus](federation.md) - +* [User interface plugins](observability-ui-plugins.md) +* [Deploying ThanosQuerier for multiple MonitoringStacks](thanos_querier.md) diff --git a/docs/user-guides/observability-ui-plugins.md b/docs/user-guides/observability-ui-plugins.md index ac9e07c86..ee7af793d 100644 --- a/docs/user-guides/observability-ui-plugins.md +++ b/docs/user-guides/observability-ui-plugins.md @@ -135,6 +135,8 @@ spec: ### Monitoring +#### Overview + The plugin adds monitoring related UI features to the OpenShift web console, related to the Advance Cluster Management (ACM) perspective, incidents (cluster health analysis), and [Perses](https://github.com/perses/perses). A number of new pages and features are enabled through this plugin. Including, but not limited to: - `ACM > Observe > Alerting` - `ACM > Observe > Alerting > Silences` @@ -142,23 +144,29 @@ The plugin adds monitoring related UI features to the OpenShift web console, rel - `OCP > Observe > Dashboards (Perses)` - `OCP > Observe > Incidents` +##### ACM + To deploy ACM related features the `acm-alerting` configuration must be enabled. In the UIPlugin Custom Resource (CR) you must pass the Alertmanager and ThanosQuerier Service endpoint (e.g. `https://alertmanager.open-cluster-management-observability.svc:9095` and `https://rbac-query-proxy.open-cluster-management-observability.svc:8443`). See the example in the next section `Plugin Creation.` +##### Incident detection + To deploy the Incidents feature, the `incidents` configuration must be enabled. See the example in the next section, `Plugin Creation.` +##### Perses + To deploy the Perses dashboard feature, the `perses-dashboards` configuration must be enabled. In the UIPlugin CR, you can optionally pass the service name and namespace of your Perses instance (e.g., `serviceName: perses-api-http` and `namespace: perses`). If these fields are left blank and `spec.monitoring.perses.enabled: true`, then default values will be assigned. These default values are `serviceName: perses-api-http` and `namespace: perses`. See the example in the next section, `Plugin Creation.` Besides, when `spec.monitoring.perses.enabled: true`, Accelerator Perses dashboard and Accelerator Perses datasource are both created. -ObO/COO operator creates the following roles: -- persesdashboard-editor-role - ability to create, read, update and delete perses dashboards CRD instance presented on ObO/COO operator under PersesDashboards tab, and view perses dashboards presentation in Dashboards (Perses) -- persesdashboard-viewer-role - ability to only read/view perses dashboards CRD instance presented on ObO/COO operator under PersesDashboards tab, and view perses dashboards presentation in Dashboards (Perses) -- persesdatasource-editor-role - ability to create, read, update and delete perses datasources CRD instance presented on ObO/COO operator under PersesDatasources tab, and view perses dashboards with data being loaded from perses datasource in Dashboards (Perses) -- persesdatasource-viewer-role - ability to only read/view perses datasources CRD instance presented on ObO/COO operator under PersesDatasources tab, and view perses dashboards with data being loaded from perses datasource in Dashboards (Perses) +The Cluster Observability Operator creates the following roles: +- `persesdashboard-editor-role` - ability to create, read, update and delete `PersesDashboard` Custom Resources under the PersesDashboards tab, and view Perses dashboards presentation in Dashboards (Perses). +- `persesdashboard-viewer-role` - ability to read `PersesDashboard` Custom Resources under the PersesDashboards tab, and view Perses dashboards presentation in Dashboards (Perses). +- `persesdatasource-editor-role` - ability to create, read, update and delete `PersesDatasource` Custom Resources under the PersesDatasources tab, and view Perses dashboards with data being loaded from Perses datasource in Dashboards (Perses). +- `persesdatasource-viewer-role` - ability to read `PersesDatasource` Custom Resources under the PersesDatasources tab, and view Perses dashboards with data being loaded from Perses datasource in Dashboards (Perses). -When assigned via ClusterRoleBinding, user has access to all perses dashboards and perses datasources presented in all namespaces/projects. When assigned via RoleBinding, user has access to all perses dashboards and perses datasources presented in a given namespace/project. +When assigned via `ClusterRoleBinding`, a user has access to all Perses dashboards and datasources in all namespaces/projects. When assigned via `RoleBinding`, user has access to all Perses dashboards and datasources in the given namespace/project. Examples: -- user1 RoleBinding as persesdashboard-viewer-role and persesdatasource-viewer-role in openshift-cluster-observability-operator namespace: +- Granting `user1` the `persesdashboard-viewer-role` and `persesdatasource-viewer-role` permissions in the `openshift-cluster-observability-operator`namespace via `RoleBinding`: ```yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 @@ -189,7 +197,7 @@ roleRef: name: persesdatasource-viewer-role ``` -- user1 ClusterRoleBinding as persesdashboard-editor-role and persesdatasource-editor-role: +- Granting `user1` the `persesdashboard-editor-role` and `persesdatasource-editor-role` permissions via `ClusterRoleBinding`: ```yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 @@ -218,11 +226,11 @@ roleRef: name: persesdatasource-editor-role ``` -Other pages which are typically distributed with the monitoring-plugin, such as `Admin > Observe > Dashboards`, are only available in the monitoring-plugin when deployed through [CMO](https://github.com/openshift/cluster-monitoring-operator). +Other pages which are typically distributed by the [monitoring-plugin](https://github.com/openshift/monitoring-plugin), such as `Admin > Observe > Dashboards`, are only available when deployed through [CMO](https://github.com/openshift/cluster-monitoring-operator). #### Plugin Creation -To enable to monitoring console plugin, create a `UIPlugin` CR. The following example shows how to create a CR to enable the monitoring console plugin: +To enable to the monitoring console plugin, create a `UIPlugin` resource: ```yaml apiVersion: observability.openshift.io/v1alpha1 @@ -248,7 +256,7 @@ spec: | __Feature__ | __Description__ | __Support Level__ | | ------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------- | -| `acm-alerting` | Adds alerting UI to multi-cluster view. Configures proxies to connect with any alertmanager and thanos-querier. | Dev Preview | +| `acm-alerting` | Adds alerting UI to multi-cluster view. Configures proxies to connect with any Alertmanager and Thanos Query API. | Dev Preview | | `incidents` | Adds incidents UI to `Observe` section of OpenShift Console Platform. Deploys the [Cluster Health Analyzer](https://github.com/openshift/cluster-health-analyzer) and configures proxies in the plugin to connect with it. | General Availability | | `perses-dashboards` | Adds perses UI to `Observe` section of OpenShift Console Platform. Configures proxies to connect with a Perses instance. Installs Accelerator Perses Dashboard and Accelerator Perses Datasource. See details [here](./perses-dashboards.md) | Dev Preview | diff --git a/docs/user-guides/thanos_querier.md b/docs/user-guides/thanos_querier.md index 5ffc720fc..0f6a7dc30 100644 --- a/docs/user-guides/thanos_querier.md +++ b/docs/user-guides/thanos_querier.md @@ -27,7 +27,7 @@ We are going to create To install the example, run: ```shell -kubectl apply -f docs/user-guides/thanos-querier/install +kubectl apply -f docs/user-guides/thanos_querier/install ``` To verify the installation, run: @@ -50,7 +50,7 @@ Then open `http://localhost:10902` in your browser. To install the example dashboard (+datasource), run: ```shell -kubectl apply -f thanos_querier/dashboard/ +kubectl apply -f docs/user-guides/thanos_querier/dashboard ``` To verify the installation, run: diff --git a/go.mod b/go.mod index 46fff224b..6cd308c3b 100644 --- a/go.mod +++ b/go.mod @@ -1,47 +1,47 @@ module github.com/rhobs/observability-operator -go 1.24.4 +go 1.24.6 require ( github.com/go-jose/go-jose/v4 v4.1.2 // indirect github.com/go-logr/logr v1.4.3 - github.com/goccy/go-yaml v1.18.0 + github.com/goccy/go-yaml v1.19.0 github.com/google/go-cmp v0.7.0 github.com/grafana/tempo-operator v0.18.0 github.com/open-telemetry/opentelemetry-operator v0.135.0 github.com/openshift/api v3.9.0+incompatible // PINNED: newer versions remove console/v1alpha1 API needed for OpenShift <4.17 compatibility - github.com/operator-framework/api v0.34.0 - github.com/pkg/errors v0.9.1 - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.86.2 - github.com/prometheus/common v0.67.1 - github.com/rhobs/obo-prometheus-operator v0.86.2-rhobs1 - github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.86.2-rhobs1 - go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 - golang.org/x/mod v0.28.0 - gopkg.in/yaml.v3 v3.0.1 - gotest.tools/v3 v3.5.2 - k8s.io/api v0.34.1 - k8s.io/apiextensions-apiserver v0.34.1 - k8s.io/apimachinery v0.34.1 - k8s.io/apiserver v0.34.1 - k8s.io/client-go v0.34.1 - k8s.io/component-base v0.34.1 - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 - sigs.k8s.io/controller-runtime v0.22.3 -) - -replace github.com/openshift/api => github.com/openshift/api v0.0.0-20240404200104-96ed2d49b255 - -require ( + github.com/operator-framework/api v0.36.0 github.com/perses/perses v0.51.1 github.com/perses/plugins/prometheus v0.52.1 github.com/perses/plugins/table v0.0.0-20250709083656-34e29fed0083 github.com/perses/plugins/timeserieschart v0.9.1 + github.com/pkg/errors v0.9.1 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.0 + github.com/prometheus/common v0.67.3 + github.com/rhobs/obo-prometheus-operator v0.87.0-rhobs1 + github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.87.0-rhobs1 github.com/rhobs/observability-operator/pkg/apis v0.0.0-20251009091129-76135c924ed6 github.com/rhobs/perses v0.0.0-20250612171017-5d7686af9ae4 github.com/rhobs/perses-operator v0.1.10-0.20250612173146-78eb619430df github.com/stretchr/testify v1.11.1 + go.uber.org/zap v1.27.1 + golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 + golang.org/x/mod v0.29.0 + gopkg.in/yaml.v3 v3.0.1 + gotest.tools/v3 v3.5.2 + k8s.io/api v0.34.2 + k8s.io/apiextensions-apiserver v0.34.2 + k8s.io/apimachinery v0.34.2 + k8s.io/apiserver v0.34.2 + k8s.io/client-go v0.34.2 + k8s.io/component-base v0.34.2 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 + sigs.k8s.io/controller-runtime v0.22.4 +) + +replace ( + github.com/openshift/api => github.com/openshift/api v0.0.0-20240404200104-96ed2d49b255 + github.com/rhobs/observability-operator/pkg/apis => ./pkg/apis ) require ( @@ -92,6 +92,7 @@ require ( github.com/go-openapi/validate v0.25.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/cel-go v0.26.1 // indirect github.com/google/gnostic-models v0.7.0 // indirect @@ -123,13 +124,13 @@ require ( github.com/perses/common v0.27.1-0.20250326140707-96e439b14e0e // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus-community/prom-label-proxy v0.12.1 // indirect - github.com/prometheus/alertmanager v0.28.1 // indirect + github.com/prometheus/alertmanager v0.29.0 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/otlptranslator v0.0.2 // indirect + github.com/prometheus/otlptranslator v1.0.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect - github.com/prometheus/prometheus v0.305.1-0.20250818080900-0a40df33fb4e // indirect - github.com/rhobs/obo-prometheus-operator/pkg/client v0.86.2-rhobs1 // indirect + github.com/prometheus/prometheus v0.307.3 // indirect + github.com/rhobs/obo-prometheus-operator/pkg/client v0.87.0-rhobs1 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cobra v1.10.1 // indirect @@ -143,7 +144,7 @@ require ( github.com/zitadel/schema v1.3.1 // indirect go.mongodb.org/mongo-driver v1.17.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/collector/featuregate v1.37.0 // indirect + go.opentelemetry.io/collector/featuregate v1.42.0 // indirect go.opentelemetry.io/contrib/otelconf v0.18.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect @@ -168,16 +169,16 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.42.0 // indirect - golang.org/x/net v0.44.0 // indirect - golang.org/x/oauth2 v0.31.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.13.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251006185510-65f7160b3a87 // indirect google.golang.org/grpc v1.76.0 // indirect google.golang.org/protobuf v1.36.10 // indirect diff --git a/go.sum b/go.sum index 6f0fc0b14..8e6ff9813 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,25 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= -cloud.google.com/go/auth v0.16.2 h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4= -cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI= +cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/compute/metadata v0.8.4 h1:oXMa1VMQBVCyewMIOm3WQsnVd9FbKBtm8reqWRaXnHQ= +cloud.google.com/go/compute/metadata v0.8.4/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 h1:5YTBM8QDVIBN3sxBil89WfdAAqDZbyJTgh688DSxX5w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.12.0 h1:wL5IEG5zb7BVv1Kv0Xm92orq+5hB5Nipn3B5tn4Rqfk= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.12.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= -github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 h1:XkkQbfMyuH2jTSjQjSoihryI8GINRcs4xp8lNawg0FI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -45,36 +45,36 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go-v2 v1.37.0 h1:YtCOESR/pN4j5oA7cVHSfOwIcuh/KwHC4DOSXFbv5F0= -github.com/aws/aws-sdk-go-v2 v1.37.0/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/config v1.29.15 h1:I5XjesVMpDZXZEZonVfjI12VNMrYa38LtLnw4NtY5Ss= -github.com/aws/aws-sdk-go-v2/config v1.29.15/go.mod h1:tNIp4JIPonlsgaO5hxO372a6gjhN63aSWl2GVl5QoBQ= -github.com/aws/aws-sdk-go-v2/credentials v1.17.68 h1:cFb9yjI02/sWHBSYXAtkamjzCuRymvmeFmt0TC0MbYY= -github.com/aws/aws-sdk-go-v2/credentials v1.17.68/go.mod h1:H6E+jBzyqUu8u0vGaU6POkK3P0NylYEeRZ6ynBpMqIk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0 h1:H2iZoqW/v2Jnrh1FnU725Bq6KJ0k2uP63yH+DcY+HUI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.0/go.mod h1:L0FqLbwMXHvNC/7crWV1iIxUlOKYZUE8KuTIA+TozAI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0 h1:EDped/rNzAhFPhVY0sDGbtD16OKqksfA8OjF/kLEgw8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.0/go.mod h1:uUI335jvzpZRPpjYx6ODc/wg1qH+NnoSTK/FwVeK0C0= +github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= +github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= +github.com/aws/aws-sdk-go-v2/config v1.31.12 h1:pYM1Qgy0dKZLHX2cXslNacbcEFMkDMl+Bcj5ROuS6p8= +github.com/aws/aws-sdk-go-v2/config v1.31.12/go.mod h1:/MM0dyD7KSDPR+39p9ZNVKaHDLb9qnfDurvVS2KAhN8= +github.com/aws/aws-sdk-go-v2/credentials v1.18.16 h1:4JHirI4zp958zC026Sm+V4pSDwW4pwLefKrc0bF2lwI= +github.com/aws/aws-sdk-go-v2/credentials v1.18.16/go.mod h1:qQMtGx9OSw7ty1yLclzLxXCRbrkjWAM7JnObZjmCB7I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.237.0 h1:XHE2G+yaDQql32FZt19QmQt4WuisqQJIkMUSCxeCUl8= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.237.0/go.mod h1:t11/j/nH9i6bbsPH9xc04BJOsV2nVPUqrB67/TLDsyM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0 h1:eRhU3Sh8dGbaniI6B+I48XJMrTPRkK4DKo+vqIxziOU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.0/go.mod h1:paNLV18DZ6FnWE/bd06RIKPDIFpjuvCkGKWTG/GDBeM= -github.com/aws/aws-sdk-go-v2/service/lightsail v1.44.0 h1:QiiCqpKy0prxq+92uWfESzcb7/8Y9JAamcMOzVYLEoM= -github.com/aws/aws-sdk-go-v2/service/lightsail v1.44.0/go.mod h1:ESppxYqXQCpCY+KWl3BdkQjmsQX6zxKP39SnDtRDoU0= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.20 h1:oIaQ1e17CSKaWmUTu62MtraRWVIosn/iONMuZt0gbqc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.20/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= -github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.254.1 h1:7p9bJCZ/b3EJXXARW7JMEs2IhsnI4YFHpfXQfgMh0eg= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.254.1/go.mod h1:M8WWWIfXmxA4RgTXcI/5cSByxRqjgne32Sh0VIbrn0A= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I= +github.com/aws/aws-sdk-go-v2/service/lightsail v1.49.1 h1:J1A0VJlt5HgUX6s11Obe9zrBDECeE2uhQc7Dwhdei9o= +github.com/aws/aws-sdk-go-v2/service/lightsail v1.49.1/go.mod h1:WEOSRNyfIfvgrD9MuSIGrogKyuFahaVMziVq1pHI0NQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 h1:A1oRkiSQOWstGh61y4Wc/yQ04sqrQZr1Si/oAXj20/s= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.6/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8= +github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= +github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -105,12 +105,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.157.0 h1:ReELaS6FxXNf8gryUiVH0wmyUmZN8/NCmBX4gXd3F0o= -github.com/digitalocean/godo v1.157.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM= +github.com/digitalocean/godo v1.165.1 h1:H37+W7TaGFOVH+HpMW4ZeW/hrq3AGNxg+B/K8/dZ9mQ= +github.com/digitalocean/godo v1.165.1/go.mod h1:xQsWpVCCbkDrWisHA72hPzPlnC+4W5w/McZY5ij9uvU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.3.0+incompatible h1:ffS62aKWupCWdvcee7nBU9fhnmknOqDPaJAMtfK0ImQ= -github.com/docker/docker v28.3.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.4.0+incompatible h1:KVC7bz5zJY/4AZe/78BIvCnPsLaC9T/zh72xnlrTTOk= +github.com/docker/docker v28.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -122,8 +122,8 @@ github.com/efficientgo/core v1.0.0-rc.3/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrja github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= -github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= -github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= @@ -206,13 +206,13 @@ github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9L github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= -github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= +github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -236,19 +236,19 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= +github.com/google/pprof v0.0.0-20250923004556-9e5a51aed1e8 h1:ZI8gCoCjGzPsum4L21jHdQs8shFBIQih1TM9Rd/c+EQ= +github.com/google/pprof v0.0.0-20250923004556-9e5a51aed1e8/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= -github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw= -github.com/gophercloud/gophercloud/v2 v2.7.0 h1:o0m4kgVcPgHlcXiWAjoVxGd8QCmvM5VU+YM71pFbn0E= -github.com/gophercloud/gophercloud/v2 v2.7.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= +github.com/gophercloud/gophercloud/v2 v2.8.0 h1:of2+8tT6+FbEYHfYC8GBu8TXJNsXYSNm9KuvpX7Neqo= +github.com/gophercloud/gophercloud/v2 v2.8.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 h1:cLN4IBkmkYZNnk7EAJ0BHIethd+J6LqxFNw5mSiI2bM= @@ -259,8 +259,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnV github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/hashicorp/consul/api v1.32.0 h1:5wp5u780Gri7c4OedGEPzmlUEzi0g2KyiPphSr6zjVg= github.com/hashicorp/consul/api v1.32.0/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= -github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= -github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= +github.com/hashicorp/cronexpr v1.1.3 h1:rl5IkxXN2m681EfivTlccqIryzYJSXRGRNa0xeG7NA4= +github.com/hashicorp/cronexpr v1.1.3/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -279,12 +279,12 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= -github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/nomad/api v0.0.0-20250930071859-eaa0fe0e27af h1:ScAYf8O+9xTqTJPZH8MIlUfO+ak8cb31rW1aYJgS+jE= +github.com/hashicorp/nomad/api v0.0.0-20250930071859-eaa0fe0e27af/go.mod h1:sldFTIgs+FsUeKU3LwVjviAIuksxD8TzDOn02MYwslE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.21.1 h1:IH3liW8/cCRjfJ4cyqYvw3s1ek+KWP8dl1roa0lD8JM= -github.com/hetznercloud/hcloud-go/v2 v2.21.1/go.mod h1:XOaYycZJ3XKMVWzmqQ24/+1V7ormJHmPdck/kxrNnQA= +github.com/hetznercloud/hcloud-go/v2 v2.25.1 h1:ib86acotlvgUSnKfFG5FJl0VFeYKe/Ht8nmikdUp+po= +github.com/hetznercloud/hcloud-go/v2 v2.25.1/go.mod h1:uQdAWaW3d9TimiyOjQWY8HKShs0Nd6S4wNYqo0HjvIY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.3.4 h1:jTvGl4LOF8v8OYoEIBNVwbFoqSGAFqn6vGE7sp7/BqQ= @@ -317,8 +317,8 @@ github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcX github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= -github.com/linode/linodego v1.52.2 h1:N9ozU27To1LMSrDd8WvJZ5STSz1eGYdyLnxhAR/dIZg= -github.com/linode/linodego v1.52.2/go.mod h1:bI949fZaVchjWyKIA08hNyvAcV6BAS+PM2op3p7PAWA= +github.com/linode/linodego v1.59.0 h1:kYz6sQH9g0u21gbI1UUFjZmFLirtc39JPybygrW76Q0= +github.com/linode/linodego v1.59.0/go.mod h1:1+Bt0oTz5rBnDOJbGhccxn7LYVytXTIIfAy7QYmijDs= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -326,8 +326,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a h1:0usWxe5SGXKQovz3p+BiQ81Jy845xSMu2CWKuXsXuUM= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a/go.mod h1:3OETvrxfELvGsU2RoGGWercfeZ4bCL3+SOwzIWtJH/Q= -github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= -github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= +github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= +github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -374,8 +374,8 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/openshift/api v0.0.0-20240404200104-96ed2d49b255 h1:OPEl/rl/Bt8soLkMUex9PZu9PJB59VPFnaPh/n1Pb3I= github.com/openshift/api v0.0.0-20240404200104-96ed2d49b255/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= -github.com/operator-framework/api v0.34.0 h1:REiEaYhG1CWmDoajdcAdZqtgoljWG+ixMY59vUX5pFI= -github.com/operator-framework/api v0.34.0/go.mod h1:eGncUNIYvWtfGCCKmLzGXvoi3P0TDf3Yd/Z0Sn9E6SQ= +github.com/operator-framework/api v0.36.0 h1:6+duRhamCvB540JbvNp/1+Pot7luff7HqdAOm9bAntg= +github.com/operator-framework/api v0.36.0/go.mod h1:QSmHMx8XpGsNWvjU5CUelVZC916VLp/TZhfYvGKpghM= github.com/operator-framework/operator-lib v0.18.0 h1:6OaWemt/CuyrjFMkLyk4O8Vj4CPHxt/m1DMuMAmPwXo= github.com/operator-framework/operator-lib v0.18.0/go.mod h1:EWS6xGYBcMn04wj81j0bluAYbFHl3cJcar++poQMzqE= github.com/ovh/go-ovh v1.9.0 h1:6K8VoL3BYjVV3In9tPJUdT7qMx9h0GExN9EXx1r2kKE= @@ -403,10 +403,10 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus-community/prom-label-proxy v0.12.1 h1:vJ6tGz4NMge140Ua3T/zh3HO0CA3bmnCsfkWK/cujG0= github.com/prometheus-community/prom-label-proxy v0.12.1/go.mod h1:/tZNtOMcbPbE1VFcY8b48mPqT1bb2jVpXx2WdjjM8TY= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.86.2 h1:VRXUgbGmpmjZgFYiUnTwlC+JjfCUs5KKFsorJhI1ZKQ= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.86.2/go.mod h1:nPk0OteXBkbT0CRCa2oZQL1jRLW6RJ2fuIijHypeJdk= -github.com/prometheus/alertmanager v0.28.1 h1:BK5pCoAtaKg01BYRUJhEDV1tqJMEtYBGzPw8QdvnnvA= -github.com/prometheus/alertmanager v0.28.1/go.mod h1:0StpPUDDHi1VXeM7p2yYfeZgLVi/PPlt39vo9LQUHxM= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.0 h1:QK37j5ZUtBwbyZkF4BBAs3bQQ1gYKG8e+g1BdNZBr/M= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.0/go.mod h1:WHiLZmOWVop/MoYvRD58LfnPeyE+dcITby/jQjg83Hw= +github.com/prometheus/alertmanager v0.29.0 h1:/ET4NmAGx2Dv9kStrXIBqBgHyiSgIk4OetY+hoZRfgc= +github.com/prometheus/alertmanager v0.29.0/go.mod h1:SjI2vhrfdWg10UaRUxTz27rgdJVG3HXrhI5WFjCdBgs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -419,27 +419,25 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= -github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= -github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= -github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= +github.com/prometheus/common v0.67.3 h1:shd26MlnwTw5jksTDhC7rTQIteBxy+ZZDr3t7F2xN2Q= +github.com/prometheus/common v0.67.3/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= +github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= +github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/prometheus/prometheus v0.305.1-0.20250818080900-0a40df33fb4e h1:HcaG1Uuc0LCVkHHo+QMgJf8eXjCxEZDoYGOvmUjPU2g= -github.com/prometheus/prometheus v0.305.1-0.20250818080900-0a40df33fb4e/go.mod h1:uxFMhGI+u8QK+W7Zr/oZGvf2lkHgnjbBmAEEnoymLyg= -github.com/prometheus/sigv4 v0.2.0 h1:qDFKnHYFswJxdzGeRP63c4HlH3Vbn1Yf/Ao2zabtVXk= -github.com/prometheus/sigv4 v0.2.0/go.mod h1:D04rqmAaPPEUkjRQxGqjoxdyJuyCh6E0M18fZr0zBiE= -github.com/rhobs/obo-prometheus-operator v0.86.2-rhobs1 h1:QGR5xr9DJO4StwEvzorhbie2nnRHPcWloJMdJyTzmM8= -github.com/rhobs/obo-prometheus-operator v0.86.2-rhobs1/go.mod h1:QFDNkYTYaR2NlRr7PoM2kH8tp1xUxI3fElU4hpceQLA= -github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.86.2-rhobs1 h1:4VkQnCtdwBzrMP7x5+7KhViipa2ARmEOHip6ULVm14U= -github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.86.2-rhobs1/go.mod h1:l986kUrEUzfrbYEsqRvSAJThNbF4SUKkM5eZR+L3uf0= -github.com/rhobs/obo-prometheus-operator/pkg/client v0.86.2-rhobs1 h1:xHFPnhTfQ1JNtHfqveI3MRdk7FREgkY3s2pTjoFL3Bw= -github.com/rhobs/obo-prometheus-operator/pkg/client v0.86.2-rhobs1/go.mod h1:a2jQ6UDlAqTT573SpRc548JwIK1rvMh6RKvSI/749HA= -github.com/rhobs/observability-operator/pkg/apis v0.0.0-20251009091129-76135c924ed6 h1:f+J6l48RMDomN9YrDxd0cZVo7+L+a/TCzH6ycat5tMI= -github.com/rhobs/observability-operator/pkg/apis v0.0.0-20251009091129-76135c924ed6/go.mod h1:bNP815/mCv8ydNQ2Q3a9gqlx9b2XouWa6hws9vthq78= +github.com/prometheus/prometheus v0.307.3 h1:zGIN3EpiKacbMatcUL2i6wC26eRWXdoXfNPjoBc2l34= +github.com/prometheus/prometheus v0.307.3/go.mod h1:sPbNW+KTS7WmzFIafC3Inzb6oZVaGLnSvwqTdz2jxRQ= +github.com/prometheus/sigv4 v0.2.1 h1:hl8D3+QEzU9rRmbKIRwMKRwaFGyLkbPdH5ZerglRHY0= +github.com/prometheus/sigv4 v0.2.1/go.mod h1:ySk6TahIlsR2sxADuHy4IBFhwEjRGGsfbbLGhFYFj6Q= +github.com/rhobs/obo-prometheus-operator v0.87.0-rhobs1 h1:YpvRwXMPAWAd+3OnkNgEWqqOb9ykM0Ftx2qg1cszLwI= +github.com/rhobs/obo-prometheus-operator v0.87.0-rhobs1/go.mod h1:+RhlE9HKAlClReubMuUKszn81b1ThYqL3VklMkF/S5o= +github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.87.0-rhobs1 h1:fi67xssH0ZGK7fy/pL68je7Enmb8x7ImbKMYMH3CDQo= +github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring v0.87.0-rhobs1/go.mod h1:amf29isbT7UfgLWDCamPG6jaELHKoXyCd25Nx3DBlNY= +github.com/rhobs/obo-prometheus-operator/pkg/client v0.87.0-rhobs1 h1:/3w2Mky/kVuzNH19uT6vsSgmCuZwEFftjF0A7LuX+Mo= +github.com/rhobs/obo-prometheus-operator/pkg/client v0.87.0-rhobs1/go.mod h1:FMfzfWcCGBtflg+gT1SNchG243iywu015rJskh1U+/c= github.com/rhobs/perses v0.0.0-20250612171017-5d7686af9ae4 h1:IxpxGJ/fbnRkZZYFm17NMedFyEuOKuf4TS23g+6jMvU= github.com/rhobs/perses v0.0.0-20250612171017-5d7686af9ae4/go.mod h1:Mxs4sXawWiV50qokKG1UZCV9NJEdJWsALY71/z38NKA= github.com/rhobs/perses-operator v0.1.10-0.20250612173146-78eb619430df h1:rwtqpvrowEF6EjSiO3PPcqC6s2jo7NU3VsGU6yrpxTg= @@ -447,8 +445,8 @@ github.com/rhobs/perses-operator v0.1.10-0.20250612173146-78eb619430df/go.mod h1 github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 h1:KhF0WejiUTDbL5X55nXowP7zNopwpowa6qaMAWyIE+0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33/go.mod h1:792k1RTU+5JeMXm35/e2Wgp71qPH/DmDoZrRc+EFZDk= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.35 h1:8xfn1RzeI9yoCUuEwDy08F+No6PcKZGEDOQ6hrRyLts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.35/go.mod h1:47B1d/YXmSAxlJxUJxClzHR6b3T4M1WyCvwENPQNBWc= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= @@ -461,8 +459,8 @@ github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4 github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= -github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= +github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5wfLRrwavbnL/renOqg= +github.com/stackitcloud/stackit-sdk-go/core v0.17.3/go.mod h1:HBCXJGPgdRulplDzhrmwC+Dak9B/x0nzNtmOpu+1Ahg= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -499,8 +497,8 @@ go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFX go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/collector/featuregate v1.37.0 h1:CjsHzjktiqq/dxid4Xkhuf3yD6oB/c7yRBWhokBJqpE= -go.opentelemetry.io/collector/featuregate v1.37.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.42.0 h1:uCVwumVBVex46DsG/fvgiTGuf9f53bALra7vGyKaqFI= +go.opentelemetry.io/collector/featuregate v1.42.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= go.opentelemetry.io/contrib/otelconf v0.18.0 h1:ciF2Gf00BWs0DnexKFZXcxg9kJ8r3SUW1LOzW3CsKA8= @@ -553,8 +551,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= @@ -563,31 +561,31 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 h1:TQwNpfvNkxAVlItJf6Cr5JTsVZoC/Sj7K3OZv2Pc14A= golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= -golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= -golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -597,22 +595,22 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -621,10 +619,10 @@ gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0 gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo= -google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/api v0.250.0 h1:qvkwrf/raASj82UegU2RSDGWi/89WkLckn4LuO4lVXM= +google.golang.org/api v0.250.0/go.mod h1:Y9Uup8bDLJJtMzJyQnu+rLRJLA0wn+wTtc6vTlOvfXo= +google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4 h1:8XJ4pajGwOlasW+L13MnEGA8W4115jJySQtVfS2/IBU= +google.golang.org/genproto/googleapis/api v0.0.0-20250929231259-57b25ae835d4/go.mod h1:NnuHhy+bxcg30o7FnVAZbXsPHUDQ9qKWAQKCD7VxFtk= google.golang.org/genproto/googleapis/rpc v0.0.0-20251006185510-65f7160b3a87 h1:WgGZrMngVRRve7T3P5gbXdmedSmUpkf8uIUu1fg+biY= google.golang.org/genproto/googleapis/rpc v0.0.0-20251006185510-65f7160b3a87/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= @@ -653,26 +651,26 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= -k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= -k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= -k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= -k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= -k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= -k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= -k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= -k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= -k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= -k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= +k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY= +k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw= +k8s.io/apiextensions-apiserver v0.34.2 h1:WStKftnGeoKP4AZRz/BaAAEJvYp4mlZGN0UCv+uvsqo= +k8s.io/apiextensions-apiserver v0.34.2/go.mod h1:398CJrsgXF1wytdaanynDpJ67zG4Xq7yj91GrmYN2SE= +k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4= +k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.2 h1:2/yu8suwkmES7IzwlehAovo8dDE07cFRC7KMDb1+MAE= +k8s.io/apiserver v0.34.2/go.mod h1:gqJQy2yDOB50R3JUReHSFr+cwJnL8G1dzTA0YLEqAPI= +k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M= +k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE= +k8s.io/component-base v0.34.2 h1:HQRqK9x2sSAsd8+R4xxRirlTjowsg6fWCPwWYeSvogQ= +k8s.io/component-base v0.34.2/go.mod h1:9xw2FHJavUHBFpiGkZoKuYZ5pdtLKe97DEByaA+hHbM= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= -sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A= +sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= sigs.k8s.io/gateway-api v1.1.0 h1:DsLDXCi6jR+Xz8/xd0Z1PYl2Pn0TyaFMOPPZIj4inDM= sigs.k8s.io/gateway-api v1.1.0/go.mod h1:ZH4lHrL2sDi0FHZ9jjneb8kKnGzFWyrTya35sWUTrRs= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= diff --git a/hack/update-obo-prometheus-operator.sh b/hack/update-obo-prometheus-operator.sh new file mode 100755 index 000000000..1efb0ad41 --- /dev/null +++ b/hack/update-obo-prometheus-operator.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Usage: +# hack/update-obo-prometheus-operator.sh +# +# Example: +# hack/update-obo-prometheus-operator.sh v0.87.0-rhobs1 v0.88.0-rhobs1 +# +# This script replaces all occurrences of the given obo-prometheus-operator +# version string in source files, including: +# - kustomization files (e.g. deploy/dependencies/kustomization.yaml) +# - go.mod files +# - any other YAML/YML files under the repo, excluding generated assets +# under bundle/ and tmp/. +# +# After running this script you should typically run: +# - go mod tidy +# - make bundle + +if [[ $# -ne 2 ]]; then + echo "Usage: $0 " >&2 + exit 1 +fi + +OLD_VERSION="$1" +NEW_VERSION="$2" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +cd "${REPO_ROOT}" + +echo "Updating obo-prometheus-operator from '${OLD_VERSION}' to '${NEW_VERSION}'" +echo "Repository root: ${REPO_ROOT}" + +# Find candidate files: +# - All kustomization files +# - All go.mod files +# - All YAML/YML files +# Exclude: +# - Generated bundle content +# - Temporary / build output +mapfile -t FILES < <( + grep -Rl --null "${OLD_VERSION}" . \ + --include='kustomization.yaml' \ + --include='go.mod' \ + --include='*.yaml' \ + --include='*.yml' \ + | tr '\0' '\n' \ + | grep -v -E '^./bundle/' \ + | grep -v -E '^./tmp/' +) + +if [[ ${#FILES[@]} -eq 0 ]]; then + echo "No files found containing '${OLD_VERSION}' (nothing to do)." >&2 + exit 1 +fi + +echo "Will update the following files:" +for f in "${FILES[@]}"; do + echo " - ${f}" +done + +for f in "${FILES[@]}"; do + sed -i "s/${OLD_VERSION}/${NEW_VERSION}/g" "${f}" +done + +echo "Done." +echo "Next steps (recommended):" +echo " - go mod tidy" +echo " - make bundle" diff --git a/pkg/apis/monitoring/v1alpha1/types.go b/pkg/apis/monitoring/v1alpha1/types.go index ce7a1f303..ebb06d4f6 100644 --- a/pkg/apis/monitoring/v1alpha1/types.go +++ b/pkg/apis/monitoring/v1alpha1/types.go @@ -103,11 +103,25 @@ type MonitoringStackSpec struct { // +optional CreateClusterRoleBindings ClusterRoleBindingPolicy `json:"createClusterRoleBindings,omitempty"` - // Time duration to retain data for. Default is '120h', - // and must match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds seconds minutes hours days weeks years). + // Time duration to retain data for. Default is '120h', and the value must + // match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds + // seconds minutes hours days weeks years). + // + // When both retention and retentionSize are defined, whichever triggers + // first will be applied. + // // +kubebuilder:default="120h" Retention monv1.Duration `json:"retention,omitempty"` + // retentionSize defines the maximum number of bytes used by the Prometheus + // data. By default the size is unlimited. + // + // When both retention and retentionSize are defined, whichever triggers + // first will be applied. + // + // +optional + RetentionSize monv1.ByteSize `json:"retentionSize,omitempty"` + // Define resources requests and limits for Monitoring Stack Pods. // +optional // +kubebuilder:default={requests:{cpu: "100m", memory: "256Mi"}, limits:{memory: "512Mi", cpu: "500m"}} @@ -243,6 +257,13 @@ type AlertmanagerConfig struct { // +optional // +kubebuilder:default=false Disabled bool `json:"disabled,omitempty"` + + // Number of replicas/pods to deploy for Alertmanager. + // +optional + // +kubebuilder:default=2 + // +kubebuilder:validation:Minimum=0 + Replicas *int32 `json:"replicas,omitempty"` + // Configure TLS options for the Alertmanager web server. // +optional WebTLSConfig *WebTLSConfig `json:"webTLSConfig,omitempty"` diff --git a/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go index 68bb48e40..04bfc0e67 100644 --- a/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go @@ -30,6 +30,11 @@ import ( // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AlertmanagerConfig) DeepCopyInto(out *AlertmanagerConfig) { *out = *in + if in.Replicas != nil { + in, out := &in.Replicas, &out.Replicas + *out = new(int32) + **out = **in + } if in.WebTLSConfig != nil { in, out := &in.WebTLSConfig, &out.WebTLSConfig *out = new(WebTLSConfig) diff --git a/pkg/apis/observability/v1alpha1/types.go b/pkg/apis/observability/v1alpha1/types.go index c4957b5cb..d5ba0d737 100644 --- a/pkg/apis/observability/v1alpha1/types.go +++ b/pkg/apis/observability/v1alpha1/types.go @@ -16,6 +16,7 @@ import ( // +kubebuilder:printcolumn:name="OpenTelemetry",type="string",JSONPath=".status.opentelemetry" // +kubebuilder:printcolumn:name="Tempo",type="string",JSONPath=".status.tempo" // +operator-sdk:csv:customresourcedefinitions:displayName="Observability Installer" +// +operator-sdk:csv:customresourcedefinitions:description="Provides end-to-end observability capabilities with minimal configuration. Simplifies deployment and management of observability components such as tracing." // +kubebuilder:metadata:annotations="observability.openshift.io/api-support=TechPreview" type ObservabilityInstaller struct { metav1.TypeMeta `json:",inline"` diff --git a/pkg/apis/uiplugin/v1alpha1/types.go b/pkg/apis/uiplugin/v1alpha1/types.go index 83619b2b6..8d52603b3 100644 --- a/pkg/apis/uiplugin/v1alpha1/types.go +++ b/pkg/apis/uiplugin/v1alpha1/types.go @@ -122,7 +122,7 @@ type LoggingConfig struct { // Schema is the schema to use for logs querying and display. // - // Defatults to "viaq" if not specified, "select" is used to allow users to select the schema from the UI. + // Defaults to "viaq" if not specified. Use "otel" for OpenTelemetry schema, or "select" to allow users to choose the schema from the UI. // // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="OCP Console Logs Schema",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:ocpConsoleLogsSchema"} // +kubebuilder:validation:Optional diff --git a/pkg/controllers/monitoring/monitoring-stack/alertmanager.go b/pkg/controllers/monitoring/monitoring-stack/alertmanager.go index dd8d58f7d..3f512e468 100644 --- a/pkg/controllers/monitoring/monitoring-stack/alertmanager.go +++ b/pkg/controllers/monitoring/monitoring-stack/alertmanager.go @@ -21,7 +21,6 @@ func newAlertmanager( if resourceSelector == nil { resourceSelector = &metav1.LabelSelector{} } - replicas := int32(2) am := &monv1.Alertmanager{ TypeMeta: metav1.TypeMeta{ @@ -36,7 +35,7 @@ func newAlertmanager( PodMetadata: &monv1.EmbeddedObjectMetadata{ Labels: podLabels("alertmanager", ms.Name), }, - Replicas: &replicas, + Replicas: ms.Spec.AlertmanagerConfig.Replicas, ServiceAccountName: rbacResourceName, AlertmanagerConfigSelector: resourceSelector, NodeSelector: ms.Spec.NodeSelector, diff --git a/pkg/controllers/monitoring/monitoring-stack/components.go b/pkg/controllers/monitoring/monitoring-stack/components.go index 97cee0c3c..76514cf9b 100644 --- a/pkg/controllers/monitoring/monitoring-stack/components.go +++ b/pkg/controllers/monitoring/monitoring-stack/components.go @@ -82,7 +82,7 @@ func stackComponentReconcilers( reconciler.NewOptionalUpdater(newAlertmanager(ms, alertmanagerName, alertmanager), ms, deployAlertmanager), reconciler.NewOptionalUpdater(newAlertmanagerService(ms), ms, deployAlertmanager), - reconciler.NewOptionalUpdater(newAlertmanagerPDB(ms), ms, deployAlertmanager), + reconciler.NewOptionalUpdater(newAlertmanagerPDB(ms), ms, deployAlertmanager && *ms.Spec.AlertmanagerConfig.Replicas > 1), } } @@ -202,14 +202,10 @@ func newPrometheus( RemoteWrite: config.RemoteWrite, ExternalLabels: config.ExternalLabels, EnableRemoteWriteReceiver: config.EnableRemoteWriteReceiver, - EnableFeatures: func() []monv1.EnableFeature { - if config.EnableOtlpHttpReceiver != nil && *config.EnableOtlpHttpReceiver { - return []monv1.EnableFeature{"otlp-write-receiver"} - } - return []monv1.EnableFeature{} - }(), + EnableOTLPReceiver: config.EnableOtlpHttpReceiver, }, Retention: ms.Spec.Retention, + RetentionSize: ms.Spec.RetentionSize, RuleSelector: prometheusSelector, RuleNamespaceSelector: ms.Spec.NamespaceSelector, Thanos: &monv1.ThanosSpec{ @@ -255,7 +251,7 @@ func newPrometheus( { Name: ms.Name + "-alertmanager", Namespace: ptr.To(ms.Namespace), - Scheme: "http", + Scheme: ptr.To(monv1.Scheme("http")), Port: intstr.FromString("web"), }, }, @@ -265,7 +261,7 @@ func newPrometheus( prometheus.Spec.Secrets = append(prometheus.Spec.Secrets, caSecret.Name) - prometheus.Spec.Alerting.Alertmanagers[0].Scheme = "https" + prometheus.Spec.Alerting.Alertmanagers[0].Scheme = ptr.To(monv1.Scheme("https")) prometheus.Spec.Alerting.Alertmanagers[0].TLSConfig = &monv1.TLSConfig{ SafeTLSConfig: monv1.SafeTLSConfig{ ServerName: ptr.To(ms.Name + "-alertmanager"), diff --git a/pkg/controllers/monitoring/thanos-querier/components.go b/pkg/controllers/monitoring/thanos-querier/components.go index 160684a78..6c36cd7d2 100644 --- a/pkg/controllers/monitoring/thanos-querier/components.go +++ b/pkg/controllers/monitoring/thanos-querier/components.go @@ -252,7 +252,7 @@ func newServiceMonitor(name string, namespace string, thanos *msoapi.ThanosQueri Endpoints: []monv1.Endpoint{ { Port: "http", - Scheme: "http", + Scheme: ptr.To(monv1.Scheme("http")), }, }, Selector: metav1.LabelSelector{ @@ -263,7 +263,7 @@ func newServiceMonitor(name string, namespace string, thanos *msoapi.ThanosQueri }, } if thanos.Spec.WebTLSConfig != nil { - serviceMonitor.Spec.Endpoints[0].Scheme = "https" + serviceMonitor.Spec.Endpoints[0].Scheme = ptr.To(monv1.Scheme("https")) serviceMonitor.Spec.Endpoints[0].TLSConfig = &monv1.TLSConfig{ SafeTLSConfig: monv1.SafeTLSConfig{ CA: monv1.SecretOrConfigMap{ diff --git a/pkg/controllers/operator/components.go b/pkg/controllers/operator/components.go index 4066e0c96..f28721b91 100644 --- a/pkg/controllers/operator/components.go +++ b/pkg/controllers/operator/components.go @@ -45,7 +45,7 @@ func newServiceMonitor(namespace string) *monv1.ServiceMonitor { Endpoints: []monv1.Endpoint{ { Port: "metrics", - Scheme: "https", + Scheme: ptr.To(monv1.Scheme("https")), TLSConfig: &monv1.TLSConfig{ CAFile: "/etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt", CertFile: "/etc/prometheus/secrets/metrics-client-certs/tls.crt", diff --git a/pkg/controllers/uiplugin/components.go b/pkg/controllers/uiplugin/components.go index 7e15354da..e46aac4df 100644 --- a/pkg/controllers/uiplugin/components.go +++ b/pkg/controllers/uiplugin/components.go @@ -35,6 +35,7 @@ const ( OpenshiftLoggingNs = "openshift-logging" OpenshiftNetobservNs = "netobserv" OpenshiftTracingNs = "openshift-tracing" + monitorClusterroleName = "cluster-monitoring-view" annotationPrefix = "observability.openshift.io/ui-plugin-" ) @@ -121,7 +122,7 @@ func pluginComponentReconcilers(plugin *uiv1alpha1.UIPlugin, pluginInfo UIPlugin monitoringConfig.Incidents.Enabled && pluginInfo.HealthAnalyzerImage != "" components = append(components, - reconciler.NewOptionalUpdater(newClusterRoleBinding(namespace, serviceAccountName, "cluster-monitoring-view", plugin.Name+"cluster-monitoring-view"), plugin, incidentsEnabled), + reconciler.NewOptionalUpdater(newClusterRoleBinding(namespace, serviceAccountName, monitorClusterroleName, plugin.Name+"-"+monitorClusterroleName), plugin, incidentsEnabled), reconciler.NewOptionalUpdater(newClusterRoleBinding(namespace, serviceAccountName, "system:auth-delegator", serviceAccountName+"-system-auth-delegator"), plugin, incidentsEnabled), reconciler.NewOptionalUpdater(newAlertManagerViewRoleBinding(serviceAccountName, namespace), plugin, incidentsEnabled), reconciler.NewOptionalUpdater(newHealthAnalyzerPrometheusRole(namespace), plugin, incidentsEnabled), @@ -138,7 +139,7 @@ func pluginComponentReconcilers(plugin *uiv1alpha1.UIPlugin, pluginInfo UIPlugin reconciler.NewOptionalUpdater(newClusterRoleBinding(namespace, persesServiceAccountName, "system:auth-delegator", persesServiceAccountName+"-system-auth-delegator"), plugin, persesEnabled), reconciler.NewOptionalUpdater(newPersesClusterRole(), plugin, persesEnabled), reconciler.NewOptionalUpdater(newClusterRoleBinding(namespace, persesServiceAccountName, "perses-cr", persesServiceAccountName+"-perses-cr"), plugin, persesEnabled), - reconciler.NewOptionalUnmanagedUpdater(newPerses(namespace, pluginInfo.PersesImage), plugin, persesEnabled), + reconciler.NewOptionalUpdater(newPerses(namespace, pluginInfo.PersesImage), plugin, persesEnabled), reconciler.NewOptionalUpdater(newAcceleratorsDatasource(namespace), plugin, persesEnabled), reconciler.NewOptionalUpdater(newAcceleratorsDashboard(namespace), plugin, persesEnabled), ) diff --git a/pkg/controllers/uiplugin/controller.go b/pkg/controllers/uiplugin/controller.go index 04c0eb074..e7ade3227 100644 --- a/pkg/controllers/uiplugin/controller.go +++ b/pkg/controllers/uiplugin/controller.go @@ -142,6 +142,7 @@ func RegisterWithManager(mgr ctrl.Manager, opts Options) error { Owns(&v1.ServiceAccount{}, generationChanged). Owns(&rbacv1.Role{}, generationChanged). Owns(&rbacv1.RoleBinding{}, generationChanged). + Owns(&persesv1alpha1.Perses{}, generationChanged). Owns(&persesv1alpha1.PersesDashboard{}, generationChanged). Owns(&persesv1alpha1.PersesDatasource{}, generationChanged) diff --git a/pkg/controllers/uiplugin/health_analyzer.go b/pkg/controllers/uiplugin/health_analyzer.go index 6c497acdb..be7b818a2 100644 --- a/pkg/controllers/uiplugin/health_analyzer.go +++ b/pkg/controllers/uiplugin/health_analyzer.go @@ -197,7 +197,7 @@ func newHealthAnalyzerServiceMonitor(namespace string) *monv1.ServiceMonitor { { Interval: "30s", Port: "metrics", - Scheme: "https", + Scheme: ptr.To(monv1.Scheme("https")), TLSConfig: &monv1.TLSConfig{ SafeTLSConfig: monv1.SafeTLSConfig{ ServerName: ptr.To(name + "." + namespace + ".svc"), diff --git a/pkg/controllers/uiplugin/troubleshooting_panel.go b/pkg/controllers/uiplugin/troubleshooting_panel.go index de3dc72fb..58f6decf7 100644 --- a/pkg/controllers/uiplugin/troubleshooting_panel.go +++ b/pkg/controllers/uiplugin/troubleshooting_panel.go @@ -19,9 +19,8 @@ import ( ) const ( - korrel8rSvcName = "korrel8r" - monitorClusterroleName = "cluster-monitoring" - alertmanagerRoleName = "monitoring-alertmanager-view" + korrel8rSvcName = "korrel8r" + alertmanagerRoleName = "monitoring-alertmanager-view" ) func createTroubleshootingPanelPluginInfo(plugin *uiv1alpha1.UIPlugin, namespace, name, image string, features []string) (*UIPluginInfo, error) { @@ -40,6 +39,7 @@ func createTroubleshootingPanelPluginInfo(plugin *uiv1alpha1.UIPlugin, namespace extraArgs = append(extraArgs, fmt.Sprintf("-features=%s", strings.Join(features, ","))) } + serviceAccountName := plugin.Name + serviceAccountSuffix pluginInfo := &UIPluginInfo{ Image: image, Name: plugin.Name, @@ -101,7 +101,7 @@ func createTroubleshootingPanelPluginInfo(plugin *uiv1alpha1.UIPlugin, namespace { APIGroup: corev1.SchemeGroupVersion.Group, Kind: "ServiceAccount", - Name: plugin.Name + "-sa", + Name: serviceAccountName, Namespace: namespace, }, }, @@ -115,8 +115,8 @@ func createTroubleshootingPanelPluginInfo(plugin *uiv1alpha1.UIPlugin, namespace korrel8rClusterRole(korrel8rSvcName), }, ClusterRoleBindings: []*rbacv1.ClusterRoleBinding{ - korrel8rClusterRoleBinding(monitorClusterroleName, plugin.Name, namespace), - korrel8rClusterRoleBinding(korrel8rSvcName, plugin.Name, namespace), + newClusterRoleBinding(namespace, serviceAccountName, monitorClusterroleName, plugin.Name+"-"+monitorClusterroleName), + newClusterRoleBinding(namespace, serviceAccountName, korrel8rSvcName+"-view", plugin.Name+"-"+korrel8rSvcName), }, } @@ -237,29 +237,3 @@ func korrel8rClusterRole(name string) *rbacv1.ClusterRole { }, } } - -func korrel8rClusterRoleBinding(name string, serviceAccountName string, namespace string) *rbacv1.ClusterRoleBinding { - korrel8rClusterroleBindingName := name + "-view" - return &rbacv1.ClusterRoleBinding{ - TypeMeta: metav1.TypeMeta{ - APIVersion: rbacv1.SchemeGroupVersion.String(), - Kind: "ClusterRoleBinding", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: korrel8rClusterroleBindingName, - }, - Subjects: []rbacv1.Subject{ - { - APIGroup: corev1.SchemeGroupVersion.Group, - Kind: "ServiceAccount", - Name: serviceAccountName + "-sa", - Namespace: namespace, - }, - }, - RoleRef: rbacv1.RoleRef{ - APIGroup: rbacv1.SchemeGroupVersion.Group, - Kind: "ClusterRole", - Name: korrel8rClusterroleBindingName, - }, - } -} diff --git a/test/Dockerfile b/test/Dockerfile index 52ac20eec..06bd23c2a 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -6,6 +6,7 @@ WORKDIR ${PKG} COPY go.mod go.mod COPY go.sum go.sum +COPY pkg/apis/ pkg/apis/ # # cache deps before building and copying source so that we don't need to re-download as much # and so that source changes don't invalidate our downloaded layer diff --git a/test/e2e/framework/assertions.go b/test/e2e/framework/assertions.go index 372d0a3b9..da2e8f3fe 100644 --- a/test/e2e/framework/assertions.go +++ b/test/e2e/framework/assertions.go @@ -159,6 +159,55 @@ func (f *Framework) AssertStatefulsetReady(name, namespace string, fns ...Option } } +// AssertStatefulSetContainerHasArg asserts that a specific container in a StatefulSet's +// Pod template contains the expected command-line argument. +func (f *Framework) AssertStatefulSetContainerHasArg(t *testing.T, name, namespace, containerName, expectedArg string, fns ...OptionFn) func(t *testing.T) { + option := AssertOption{ + PollInterval: 5 * time.Second, + WaitTimeout: DefaultTestTimeout, + } + for _, fn := range fns { + fn(&option) + } + + return func(t *testing.T) { + t.Helper() + statefulSet := &appsv1.StatefulSet{} + key := types.NamespacedName{Name: name, Namespace: namespace} + + if err := wait.PollUntilContextTimeout(context.Background(), option.PollInterval, option.WaitTimeout, true, func(ctx context.Context) (bool, error) { + + if err := f.K8sClient.Get(ctx, key, statefulSet); apierrors.IsNotFound(err) { + return false, nil + } + + var container *v1.Container + for i, c := range statefulSet.Spec.Template.Spec.Containers { + if c.Name == containerName { + container = &statefulSet.Spec.Template.Spec.Containers[i] + break + } + } + + if container == nil { + return false, fmt.Errorf("container %q not found in StatefulSet template", containerName) + } + + for _, arg := range container.Args { + if arg == expectedArg { + return true, nil + } + } + + t.Logf("StatefulSet %s container %q args are missing %q. Retrying...", name, containerName, expectedArg) + return false, nil + }); wait.Interrupted(err) { + t.Fatalf("StatefulSet %s failed to contain argument %q in container %q within timeout. Final args: %v", + name, expectedArg, containerName, statefulSet.Spec.Template.Spec.Containers[0].Args) + } + } +} + // AssertDeploymentReady asserts that a deployment has the desired number of pods running func (f *Framework) AssertDeploymentReady(name, namespace string, fns ...OptionFn) func(t *testing.T) { option := AssertOption{ diff --git a/test/e2e/framework/monitoring_stack.go b/test/e2e/framework/monitoring_stack.go index a05992987..b61eb474d 100644 --- a/test/e2e/framework/monitoring_stack.go +++ b/test/e2e/framework/monitoring_stack.go @@ -32,6 +32,12 @@ func SetAlertmanagerDisabled(disabled bool) MonitoringStackConfig { } } +func SetAlertmanagerReplicas(replicas int32) MonitoringStackConfig { + return func(ms *stack.MonitoringStack) { + ms.Spec.AlertmanagerConfig.Replicas = &replicas + } +} + // UpdateWithRetry updates monitoringstack with retry func (f *Framework) UpdateWithRetry(t *testing.T, ms *stack.MonitoringStack, fns ...MonitoringStackConfig) error { err := retry.RetryOnConflict(retry.DefaultRetry, func() error { diff --git a/test/e2e/main_test.go b/test/e2e/main_test.go index 48d1d428d..e3c80f5c8 100644 --- a/test/e2e/main_test.go +++ b/test/e2e/main_test.go @@ -10,10 +10,13 @@ import ( configv1 "github.com/openshift/api/config/v1" olmv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" + "go.uber.org/zap/zapcore" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/log/zap" "github.com/rhobs/observability-operator/pkg/operator" "github.com/rhobs/observability-operator/test/e2e/framework" @@ -33,6 +36,13 @@ var ( func TestMain(m *testing.M) { flag.Parse() + // Setup controller-runtime logger to avoid warning messages + opts := zap.Options{ + Development: true, + TimeEncoder: zapcore.RFC3339TimeEncoder, + } + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + // Deferred calls are not executed on os.Exit from TestMain. // As a workaround, we call another function in which we can add deferred calls. // http://blog.englund.nu/golang,/testing/2017/03/12/using-defer-in-testmain.html diff --git a/test/e2e/monitoring_stack_controller_test.go b/test/e2e/monitoring_stack_controller_test.go index 521f84ef4..717cb5f90 100644 --- a/test/e2e/monitoring_stack_controller_test.go +++ b/test/e2e/monitoring_stack_controller_test.go @@ -66,6 +66,9 @@ func TestMonitoringStackController(t *testing.T) { }, { name: "resource selector nil propagates to Prometheus", scenario: nilResrouceSelectorPropagatesToPrometheus, + }, { + name: "prometheus with nil resource selector becomes ready", + scenario: nilResourceSelectorPrometheusBecomesReady, }, { name: "stack spec are reflected in Prometheus", scenario: reconcileStack, @@ -104,11 +107,17 @@ func TestMonitoringStackController(t *testing.T) { assertAlertmanagersAreResilientToDisruption(t, pods) }, }, { - name: "invalid Prometheus replicas numbers", + name: "invalid number of replicas for Prometheus", scenario: validatePrometheusConfig, }, { name: "Alertmanager disabled", scenario: assertAlertmanagerNotDeployed, + }, { + name: "single Alertmanager has no PDB", + scenario: singleAlertmanagerReplicaHasNoPDB, + }, { + name: "invalid number of replicas for Alertmanagers", + scenario: validateAlertmanagerConfig, }, { name: "Alertmanager deployed and removed", scenario: assertAlertmanagerDeployedAndRemoved, @@ -124,6 +133,9 @@ func TestMonitoringStackController(t *testing.T) { }, { name: "Prometheus stacks can scrape themselves behind TLS", scenario: assertPrometheusScrapesItselfTLS, + }, { + name: "Assert OTLP receiver flag is set when enabled in CR", + scenario: assertDefaultOTLPFlagIsSet, }} for _, tc := range ts { t.Run(tc.name, tc.scenario) @@ -168,6 +180,21 @@ func nilResrouceSelectorPropagatesToPrometheus(t *testing.T) { } } +func nilResourceSelectorPrometheusBecomesReady(t *testing.T) { + ms := newMonitoringStack(t, "nil-selector-ready") + ms.Spec.ResourceSelector = nil + + err := f.K8sClient.Create(context.Background(), ms) + assert.NilError(t, err, "failed to create monitoring stack with nil resourceSelector") + + // Verify Prometheus CR is created + f.AssertResourceEventuallyExists(ms.Name, ms.Namespace, &monv1.Prometheus{})(t) + + // Verify Prometheus pods become ready despite nil resourceSelector + // covers upstream issue #932 + f.AssertStatefulsetReady("prometheus-"+ms.Name, ms.Namespace, framework.WithTimeout(5*time.Minute))(t) +} + func promConfigDefaultsAreApplied(t *testing.T) { tests := []struct { name string @@ -287,7 +314,6 @@ func reconcileRevertsManualChanges(t *testing.T) { f.GetResourceWithRetry(t, ms.Name, ms.Namespace, &generated) // update the prometheus created by monitoring-stack controller - modified := generated.DeepCopy() modified.Spec.ServiceMonitorSelector = &metav1.LabelSelector{ MatchLabels: map[string]string{ @@ -342,28 +368,52 @@ func validateStackLogLevel(t *testing.T) { } func validateStackRetention(t *testing.T) { - invalidRetention := []monv1.Duration{ - "100days", - "100ducks", - "100 days", - "100 hours", - "100 h", - "100 s", - "100d ", - } - - ms := newMonitoringStack(t, "invalid-retention") - for _, v := range invalidRetention { - ms.Spec.Retention = v - err := f.K8sClient.Create(context.Background(), ms) - assert.ErrorContains(t, err, `spec.retention: Invalid value`) - } + t.Run("time-based", func(t *testing.T) { + invalidRetention := []monv1.Duration{ + "100days", + "100ducks", + "100 days", + "100 hours", + "100 h", + "100 s", + "100d ", + } - validMS := newMonitoringStack(t, "valid-retention") - validMS.Spec.Retention = "100h" + ms := newMonitoringStack(t, "invalid-retention") + for _, v := range invalidRetention { + ms.Spec.Retention = v + err := f.K8sClient.Create(context.Background(), ms) + assert.ErrorContains(t, err, `spec.retention: Invalid value`) + } - err := f.K8sClient.Create(context.Background(), validMS) - assert.NilError(t, err, `100h is a valid retention period`) + validMS := newMonitoringStack(t, "valid-retention") + validMS.Spec.Retention = "100h" + + err := f.K8sClient.Create(context.Background(), validMS) + assert.NilError(t, err, `100h is a valid retention period`) + }) + + t.Run("size-based", func(t *testing.T) { + invalidRetention := []monv1.ByteSize{ + "1gb", + "1foo", + "1 GB", + "1GB ", + } + + ms := newMonitoringStack(t, "invalid-retention-size") + for _, v := range invalidRetention { + ms.Spec.RetentionSize = v + err := f.K8sClient.Create(context.Background(), ms) + assert.ErrorContains(t, err, `spec.retentionSize: Invalid value`) + } + + validMS := newMonitoringStack(t, "valid-retention-size") + validMS.Spec.RetentionSize = "1GB" + + err := f.K8sClient.Create(context.Background(), validMS) + assert.NilError(t, err) + }) } func validatePrometheusConfig(t *testing.T) { @@ -374,11 +424,16 @@ func validatePrometheusConfig(t *testing.T) { } err := f.K8sClient.Create(context.Background(), ms) assert.ErrorContains(t, err, `invalid: spec.prometheusConfig.replicas`) +} - validN := int32(1) - ms.Spec.PrometheusConfig.Replicas = &validN - err = f.K8sClient.Create(context.Background(), ms) - assert.NilError(t, err, `1 is a valid replica count`) +func validateAlertmanagerConfig(t *testing.T) { + invalidN := int32(-1) + ms := newMonitoringStack(t, "invalid-alertmanager-config") + ms.Spec.AlertmanagerConfig = stack.AlertmanagerConfig{ + Replicas: &invalidN, + } + err := f.K8sClient.Create(context.Background(), ms) + assert.ErrorContains(t, err, `invalid: spec.alertmanagerConfig.replicas`) } func singlePrometheusReplicaHasNoPDB(t *testing.T) { @@ -404,6 +459,30 @@ func singlePrometheusReplicaHasNoPDB(t *testing.T) { f.AssertResourceAbsent(pdbName, ms.Namespace, &pdb)(t) } +func singleAlertmanagerReplicaHasNoPDB(t *testing.T) { + // asserts that no Alertmanager pdb is created for stacks with replicas set + // to 1 (otherwise upgrades are impossible). + + // Initially, ensure that pdb is created by default for the default stack. + // This should later be removed when replicas is set to 1. + ms := newMonitoringStack(t, "single-replica") + + err := f.K8sClient.Create(context.Background(), ms) + assert.NilError(t, err, "failed to create a monitoring stack") + + // ensure pdb is created for default stack. + pdb := policyv1.PodDisruptionBudget{} + pdbName := ms.Name + "-alertmanager" + f.AssertResourceEventuallyExists(pdbName, ms.Namespace, &pdb)(t) + + // Update replica count to 1 + err = f.UpdateWithRetry(t, ms, framework.SetAlertmanagerReplicas(1)) + assert.NilError(t, err, "failed to update monitoring stack") + + // ensure there is no pdb + f.AssertResourceAbsent(pdbName, ms.Namespace, &pdb)(t) +} + func assertPrometheusScrapesItselfAndWebUI(t *testing.T) { ms := newMonitoringStack(t, "self-scrape") err := f.K8sClient.Create(context.Background(), ms) @@ -934,6 +1013,18 @@ func assertPrometheusScrapesItselfTLS(t *testing.T) { } } +func assertDefaultOTLPFlagIsSet(t *testing.T) { + ms := newMonitoringStack(t, "otlp-flag-test") + ms.Spec.PrometheusConfig = &stack.PrometheusConfig{ + EnableOtlpHttpReceiver: ptr.To(true), + } + + err := f.K8sClient.Create(context.Background(), ms) + assert.NilError(t, err, "failed to create a monitoring stack") + + f.AssertStatefulSetContainerHasArg(t, "prometheus-"+ms.Name, e2eTestNamespace, "prometheus", "--web.enable-otlp-receiver")(t) +} + // Update this json when a new Prometheus field is set by MonitoringStack const oboManagedFieldsJson = ` { @@ -963,9 +1054,7 @@ const oboManagedFieldsJson = ` "f:probeNamespaceSelector": {}, "f:probeSelector": {}, "f:remoteWrite": {}, - "f:enableFeatures": { - "v:\"otlp-write-receiver\"": {} - }, + "f:enableOTLPReceiver": {}, "f:replicas": {}, "f:resources": {}, "f:retention": {}, diff --git a/test/e2e/traces_minio.yaml b/test/e2e/traces_minio.yaml index 5e3150bd7..cb74eacee 100644 --- a/test/e2e/traces_minio.yaml +++ b/test/e2e/traces_minio.yaml @@ -45,7 +45,7 @@ spec: value: tempo - name: MINIO_SECRET_KEY value: supersecret - image: minio/minio + image: quay.io/minio/minio:RELEASE.2024-10-02T17-50-41Z name: minio ports: - containerPort: 9000 diff --git a/test/e2e/traces_tempo_readiness.yaml b/test/e2e/traces_tempo_readiness.yaml index af3e6b09e..b46a8a60f 100644 --- a/test/e2e/traces_tempo_readiness.yaml +++ b/test/e2e/traces_tempo_readiness.yaml @@ -16,7 +16,7 @@ spec: restartPolicy: Never containers: - name: readiness-checker - image: curlimages/curl:latest + image: ghcr.io/grafana/tempo-operator/test-utils:main command: - /bin/sh - -c