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