diff --git a/charts/kubezero-metrics/Chart.yaml b/charts/kubezero-metrics/Chart.yaml index ed80c31f..a9a1eace 100644 --- a/charts/kubezero-metrics/Chart.yaml +++ b/charts/kubezero-metrics/Chart.yaml @@ -19,7 +19,7 @@ dependencies: version: ">= 0.1.6" repository: https://cdn.zero-downtime.net/charts/ - name: kube-prometheus-stack - version: 48.6.0 + version: 54.2.2 repository: https://prometheus-community.github.io/helm-charts - name: prometheus-adapter version: 4.9.0 diff --git a/charts/kubezero-metrics/README.md b/charts/kubezero-metrics/README.md index f65c6448..6351d021 100644 --- a/charts/kubezero-metrics/README.md +++ b/charts/kubezero-metrics/README.md @@ -1,6 +1,6 @@ # kubezero-metrics -![Version: 0.9.2](https://img.shields.io/badge/Version-0.9.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) +![Version: 0.9.5](https://img.shields.io/badge/Version-0.9.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) KubeZero Umbrella Chart for Prometheus, Grafana and Alertmanager as well as all Kubernetes integrations. @@ -14,14 +14,14 @@ KubeZero Umbrella Chart for Prometheus, Grafana and Alertmanager as well as all ## Requirements -Kubernetes: `>= 1.25.0` +Kubernetes: `>= 1.26.0` | Repository | Name | Version | |------------|------|---------| -| | kube-prometheus-stack | 45.27.2 | | https://cdn.zero-downtime.net/charts/ | kubezero-lib | >= 0.1.6 | -| https://prometheus-community.github.io/helm-charts | prometheus-adapter | 4.1.1 | -| https://prometheus-community.github.io/helm-charts | prometheus-pushgateway | 2.1.3 | +| https://prometheus-community.github.io/helm-charts | kube-prometheus-stack | 54.2.2 | +| https://prometheus-community.github.io/helm-charts | prometheus-adapter | 4.9.0 | +| https://prometheus-community.github.io/helm-charts | prometheus-pushgateway | 2.4.2 | ## Values @@ -31,16 +31,19 @@ Kubernetes: `>= 1.25.0` | istio.alertmanager.enabled | bool | `false` | | | istio.alertmanager.gateway | string | `"istio-ingress/ingressgateway"` | | | istio.alertmanager.ipBlocks | list | `[]` | | +| istio.alertmanager.port | int | `9093` | | | istio.alertmanager.url | string | `""` | | | istio.grafana.destination | string | `"metrics-grafana"` | | | istio.grafana.enabled | bool | `false` | | | istio.grafana.gateway | string | `"istio-ingress/ingressgateway"` | | | istio.grafana.ipBlocks | list | `[]` | | +| istio.grafana.port | int | `80` | | | istio.grafana.url | string | `""` | | | istio.prometheus.destination | string | `"metrics-kube-prometheus-st-prometheus"` | | | istio.prometheus.enabled | bool | `false` | | | istio.prometheus.gateway | string | `"istio-ingress/ingressgateway"` | | | istio.prometheus.ipBlocks | list | `[]` | | +| istio.prometheus.port | int | `9090` | | | istio.prometheus.url | string | `""` | | | kube-prometheus-stack.alertmanager.alertmanagerSpec.containers[0].env[0].name | string | `"SNS_FORWARDER_ARN_PREFIX"` | | | kube-prometheus-stack.alertmanager.alertmanagerSpec.containers[0].env[0].valueFrom.fieldRef.fieldPath | string | `"metadata.annotations['kubezero.com/sns_forwarder_ARN_PREFIX']"` | | @@ -162,7 +165,7 @@ Kubernetes: `>= 1.25.0` | kube-prometheus-stack.prometheus.prometheusSpec.portName | string | `"http-prometheus"` | | | kube-prometheus-stack.prometheus.prometheusSpec.resources.limits.memory | string | `"4Gi"` | | | kube-prometheus-stack.prometheus.prometheusSpec.resources.requests.cpu | string | `"500m"` | | -| kube-prometheus-stack.prometheus.prometheusSpec.resources.requests.memory | string | `"512Mi"` | | +| kube-prometheus-stack.prometheus.prometheusSpec.resources.requests.memory | string | `"2Gi"` | | | kube-prometheus-stack.prometheus.prometheusSpec.retention | string | `"8d"` | | | kube-prometheus-stack.prometheus.prometheusSpec.ruleSelectorNilUsesHelmValues | bool | `false` | | | kube-prometheus-stack.prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues | bool | `false` | | diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/Chart.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/Chart.yaml index b41d05da..0c5f9a47 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/Chart.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/Chart.yaml @@ -7,7 +7,7 @@ annotations: url: https://github.com/prometheus-operator/kube-prometheus artifacthub.io/operator: "true" apiVersion: v2 -appVersion: v0.66.0 +appVersion: v0.69.1 dependencies: - condition: crds.enabled name: crds @@ -16,15 +16,15 @@ dependencies: - condition: kubeStateMetrics.enabled name: kube-state-metrics repository: https://prometheus-community.github.io/helm-charts - version: 5.10.* + version: 5.15.* - condition: nodeExporter.enabled name: prometheus-node-exporter repository: https://prometheus-community.github.io/helm-charts - version: 4.21.* + version: 4.24.* - condition: grafana.enabled name: grafana repository: https://grafana.github.io/helm-charts - version: 6.58.* + version: 7.0.* - condition: windowsMonitoring.enabled name: prometheus-windows-exporter repository: https://prometheus-community.github.io/helm-charts @@ -39,7 +39,7 @@ keywords: - operator - prometheus - kube-prometheus -kubeVersion: '>=1.16.0-0' +kubeVersion: '>=1.19.0-0' maintainers: - email: andrew@quadcorps.co.uk name: andrewgkew @@ -60,4 +60,4 @@ sources: - https://github.com/prometheus-community/helm-charts - https://github.com/prometheus-operator/kube-prometheus type: application -version: 48.3.3 +version: 54.2.2 diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/README.md b/charts/kubezero-metrics/charts/kube-prometheus-stack/README.md index 6bf66386..853b3d8f 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/README.md +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/README.md @@ -8,7 +8,7 @@ _Note: This chart was formerly named `prometheus-operator` chart, now renamed to ## Prerequisites -- Kubernetes 1.16+ +- Kubernetes 1.19+ - Helm 3+ ## Get Helm Repository Info @@ -82,6 +82,144 @@ _See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documen A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an incompatible breaking change needing manual actions. +### From 53.x to 54.x + +Grafana Helm Chart has bumped to version 7 + +Please note Grafana Helm Chart [changelog](https://github.com/grafana/helm-charts/tree/main/charts/grafana#to-700). + +### From 52.x to 53.x + +This version upgrades Prometheus-Operator to v0.69.1, Prometheus to 2.47.2 + +Run these commands to update the CRDs before applying the upgrade. + +```console +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +``` + +### From 51.x to 52.x + +This includes the ability to select between using existing secrets or create new secret objects for various thanos config. The defaults have not changed but if you were setting: + +- `thanosRuler.thanosRulerSpec.alertmanagersConfig` or +- `thanosRuler.thanosRulerSpec.objectStorageConfig` or +- `thanosRuler.thanosRulerSpec.queryConfig` or +- `prometheus.prometheusSpec.thanos.objectStorageConfig` + +you will have to need to set `existingSecret` or `secret` based on your requirement + +For instance, the `thanosRuler.thanosRulerSpec.alertmanagersConfig` used to be configured as follow: + +```yaml +thanosRuler: + thanosRulerSpec: + alertmanagersConfig: + alertmanagers: + - api_version: v2 + http_config: + basic_auth: + username: some_user + password: some_pass + static_configs: + - alertmanager.thanos.io + scheme: http + timeout: 10s +``` + +But it now moved to: + +```yaml +thanosRuler: + thanosRulerSpec: + alertmanagersConfig: + secret: + alertmanagers: + - api_version: v2 + http_config: + basic_auth: + username: some_user + password: some_pass + static_configs: + - alertmanager.thanos.io + scheme: http + timeout: 10s +``` + +or the `thanosRuler.thanosRulerSpec.objectStorageConfig` used to be configured as follow: + +```yaml +thanosRuler: + thanosRulerSpec: + objectStorageConfig: + name: existing-secret-not-created-by-this-chart + key: object-storage-configs.yaml +``` + +But it now moved to: + +```yaml +thanosRuler: + thanosRulerSpec: + objectStorageConfig: + existingSecret: + name: existing-secret-not-created-by-this-chart + key: object-storage-configs.yaml +``` + +### From 50.x to 51.x + +This version upgrades Prometheus-Operator to v0.68.0, Prometheus to 2.47.0 and Thanos to v0.32.2 + +Run these commands to update the CRDs before applying the upgrade. + +```console +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.68.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +``` + +### From 49.x to 50.x + +This version requires Kubernetes 1.19+. + +We do not expect any breaking changes in this version. + +### From 48.x to 49.x + +This version upgrades Prometheus-Operator to v0.67.1, 0, Alertmanager to v0.26.0, Prometheus to 2.46.0 and Thanos to v0.32.0 + +Run these commands to update the CRDs before applying the upgrade. + +```console +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +kubectl apply --server-side -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.67.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +``` + ### From 47.x to 48.x This version moved all CRDs into a dedicated sub-chart. No new CRDs are introduced in this version. diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml index 1adb2cf9..66e08f52 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: alertmanagerconfigs.monitoring.coreos.com @@ -24,8 +25,8 @@ spec: - name: v1alpha1 schema: openAPIV3Schema: - description: AlertmanagerConfig defines a namespaced AlertmanagerConfig to - be aggregated across multiple namespaces configuring one Alertmanager cluster. + description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying + how alerts should be grouped, inhibited and notified to external systems. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -213,6 +214,394 @@ spec: items: description: Receiver defines one or more notification integrations. properties: + discordConfigs: + description: List of Discord configurations. + items: + description: DiscordConfig configures notifications via Discord. + See https://prometheus.io/docs/alerting/latest/configuration/#discord_config + properties: + apiURL: + description: The secret's key that contains the Discord + webhook URL. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: The template of the message's body. + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + title: + description: The template of the message's title. + type: string + required: + - apiURL + type: object + type: array emailConfigs: description: List of Email configurations. items: @@ -443,6 +832,392 @@ spec: type: string type: object type: array + msteamsConfigs: + description: List of MSTeams configurations. It requires Alertmanager + >= 0.26.0. + items: + description: MSTeamsConfig configures notifications via Microsoft + Teams. It requires Alertmanager >= 0.26.0. + properties: + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + sendResolved: + description: Whether to notify about resolved alerts. + type: boolean + text: + description: Message body template. + type: string + title: + description: Message title template. + type: string + webhookUrl: + description: MSTeams webhook URL. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + required: + - webhookUrl + type: object + type: array name: description: Name of the receiver. Must be unique across all items from the list. @@ -518,8 +1293,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -540,8 +1316,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -964,8 +1741,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -986,8 +1764,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -1420,8 +2199,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -1442,8 +2222,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -1783,7 +2564,7 @@ spec: application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus - Operator. + Operator. Either `token` or `tokenFile` is required. properties: key: description: The key of the secret to select from. Must @@ -1801,6 +2582,12 @@ spec: required: - key type: object + tokenFile: + description: The token file that contains the registered + application's API token, see https://pushover.net/apps. + Either `token` or `tokenFile` is required. It requires + Alertmanager >= v0.26.0. + type: string url: description: A supplementary URL shown alongside the message. type: string @@ -1812,7 +2599,8 @@ spec: description: The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. + by the Prometheus Operator. Either `userKey` or `userKeyFile` + is required. properties: key: description: The key of the secret to select from. Must @@ -1830,6 +2618,11 @@ spec: required: - key type: object + userKeyFile: + description: The user key file that contains the recipient + user's user key. Either `userKey` or `userKeyFile` is + required. It requires Alertmanager >= v0.26.0. + type: string type: object type: array slackConfigs: @@ -1954,8 +2747,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -1976,8 +2770,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -2346,8 +3141,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -2368,8 +3164,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -2783,9 +3580,11 @@ spec: If not specified, default API URL will be used. type: string botToken: - description: Telegram bot token The secret needs to be - in the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. + description: "Telegram bot token. It is mutually exclusive + with `botTokenFile`. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. \n Either `botToken` or + `botTokenFile` is required." properties: key: description: The key of the secret to select from. Must @@ -2803,6 +3602,12 @@ spec: required: - key type: object + botTokenFile: + description: "File to read the Telegram bot token from. + It is mutually exclusive with `botToken`. Either `botToken` + or `botTokenFile` is required. \n It requires Alertmanager + >= v0.26.0." + type: string chatID: description: The Telegram chat ID. format: int64 @@ -2820,8 +3625,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -2842,8 +3648,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -3231,8 +4038,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -3253,8 +4061,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -3586,14 +4395,21 @@ spec: type: string type: object type: array - webhookConfigs: - description: List of webhook configurations. + webexConfigs: + description: List of Webex configurations. items: - description: WebhookConfig configures notifications via a - generic receiver supporting the webhook payload. See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config + description: WebexConfig configures notification via Cisco + Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config properties: + apiURL: + description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages + Provide if different from the default API URL. + pattern: ^https?://.+$ + type: string httpConfig: - description: HTTP client configuration. + description: The HTTP client's configuration. You must + supply the bot token via the `httpConfig.authorization` + field. properties: authorization: description: Authorization header configuration for @@ -3602,8 +4418,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -3624,8 +4441,377 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: Message template + type: string + roomID: + description: ID of the Webex Teams room where to send + the messages. + minLength: 1 + type: string + sendResolved: + description: Whether to notify about resolved alerts. + type: boolean + required: + - roomID + type: object + type: array + webhookConfigs: + description: List of webhook configurations. + items: + description: WebhookConfig configures notifications via a + generic receiver supporting the webhook payload. See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config + properties: + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -4023,8 +5209,9 @@ spec: v0.22+. properties: credentials: - description: The secret's key that contains the - credentials of the request + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -4045,8 +5232,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml index b2d2e600..77cc1487 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: alertmanagers.monitoring.coreos.com @@ -1029,8 +1030,8 @@ spec: is only available starting from Alertmanager v0.22+. properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -1051,8 +1052,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults - to Bearer, Basic will cause an error + description: "Defines the authentication type. The + value is case-insensitive. \n \"Basic\" is not a + supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -1425,6 +1427,88 @@ spec: - key type: object x-kubernetes-map-type: atomic + smtp: + description: Configures global SMTP parameters. + properties: + authIdentity: + description: SMTP Auth using PLAIN + type: string + authPassword: + description: SMTP Auth using LOGIN and PLAIN. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + authSecret: + description: SMTP Auth using CRAM-MD5. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + authUsername: + description: SMTP Auth using CRAM-MD5, LOGIN and PLAIN. + If empty, Alertmanager doesn't authenticate to the SMTP + server. + type: string + from: + description: The default SMTP From header field. + type: string + hello: + description: The default hostname to identify to the SMTP + server. + type: string + requireTLS: + description: The default SMTP TLS requirement. Note that + Go does not support unencrypted connections to remote + SMTP endpoints. + type: boolean + smartHost: + description: The default SMTP smarthost used for sending + emails. + properties: + host: + description: Defines the host's address, it can be + a DNS name or a literal IP address. + minLength: 1 + type: string + port: + description: Defines the host's port, it can be a + literal port number or a port name. + minLength: 1 + type: string + required: + - host + - port + type: object + type: object type: object name: description: The name of the AlertmanagerConfig resource which @@ -2362,6 +2446,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2483,8 +2586,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2517,16 +2620,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3705,6 +3804,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3826,8 +3944,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3860,16 +3978,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4188,8 +4302,15 @@ spec: objects are not goint to be performed, except for delete actions. type: boolean podMetadata: - description: PodMetadata configures Labels and Annotations which are - propagated to the alertmanager pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Alertmanager pods. \n The following items + are reserved and cannot be overridden: * \"alertmanager\" label, + set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" + label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"alertmanager\". * \"app.kubernetes.io/version\" + label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"alertmanager\"." properties: annotations: additionalProperties: @@ -4387,7 +4508,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4451,14 +4573,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5046,6 +5165,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5053,19 +5217,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5120,13 +5296,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml index bcc33c80..2488e4f2 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: podmonitors.monitoring.coreos.com @@ -54,6 +55,12 @@ spec: jobLabel: description: The label to use to retrieve the job name from. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. @@ -95,8 +102,8 @@ spec: description: Authorization section for this endpoint properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -115,8 +122,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -213,16 +221,16 @@ spec: description: MetricRelabelConfigs to apply to samples before ingestion. items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -248,28 +256,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -278,9 +287,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -397,16 +407,16 @@ spec: is available via the `__tmp_prometheus_job_name` label. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -432,28 +442,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -462,9 +473,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml index fda3c219..aa4d6095 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: probes.monitoring.coreos.com @@ -46,8 +47,8 @@ spec: description: Authorization section for this endpoint properties: credentials: - description: The secret's key that contains the credentials of - the request + description: Selects a key of a Secret in the namespace that contains + the credentials for authentication. properties: key: description: The key of the secret to select from. Must be @@ -66,8 +67,8 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value is case-insensitive. + \n \"Basic\" is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -143,6 +144,12 @@ spec: jobName: description: The job name assigned to scraped metrics by default. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. @@ -163,15 +170,16 @@ spec: metricRelabelings: description: MetricRelabelConfigs to apply to samples before ingestion. items: - description: 'RelabelConfig allows dynamic rewriting of the label - set, being applied to samples before ingestion. It defines ``-section - of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. Default - is 'replace'. uppercase and lowercase actions require Prometheus - >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -197,28 +205,26 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source label - values. + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex capture - groups are available. Default is '$1' + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." type: string separator: - description: Separator placed between concatenated source label - values. default is ';'. + description: Separator is the string between concatenated SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. - Their content is concatenated using the configured separator - and matched against the configured regular expression for - the replace, keep, and drop actions. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as well as underscores. @@ -226,9 +232,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written in - a replace action. It is mandatory for replace actions. Regex - capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." type: string type: object type: array @@ -393,16 +400,16 @@ spec: scrape job''s name is available via the `__tmp_prometheus_job_name` label. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' items: - description: 'RelabelConfig allows dynamic rewriting of - the label set, being applied to samples before ingestion. - It defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of + the label set for targets, alerts, scraped samples and + remote write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -428,28 +435,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex - replace is performed if the regular expression matches. - Regex capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, @@ -458,9 +466,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is + written in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -526,16 +535,16 @@ spec: description: 'RelabelConfigs to apply to the label set of the targets before it gets scraped. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' items: - description: 'RelabelConfig allows dynamic rewriting of - the label set, being applied to samples before ingestion. - It defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of + the label set for targets, alerts, scraped samples and + remote write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -561,28 +570,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex - replace is performed if the regular expression matches. - Regex capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, @@ -591,9 +601,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is + written in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml index 39c2d3ff..aaaacee0 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheusagents.monitoring.coreos.com @@ -957,11 +958,12 @@ spec: and use the Pod''s CA certificate and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/.' properties: authorization: - description: Authorization section for accessing apiserver + description: "Authorization section for the API server. \n Cannot + be set at the same time as `basicAuth`, `bearerToken`, or `bearerTokenFile`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace that + contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -981,16 +983,18 @@ spec: x-kubernetes-map-type: atomic credentialsFile: description: File to read a secret from, mutually exclusive - with Credentials (from SafeAuthorization) + with `credentials`. type: string type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value is + case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: - description: BasicAuth allow an endpoint to authenticate over - basic authentication + description: "BasicAuth configuration for the API server. \n Cannot + be set at the same time as `authorization`, `bearerToken`, or + `bearerTokenFile`." properties: password: description: The secret in the service monitor namespace that @@ -1034,17 +1038,22 @@ spec: x-kubernetes-map-type: atomic type: object bearerToken: - description: Bearer token for accessing apiserver. + description: "*Warning: this field shouldn't be used because the + token value appears in clear-text. Prefer using `authorization`.* + \n *Deprecated: this will be removed in a future release.*" type: string bearerTokenFile: - description: File to read bearer token for accessing apiserver. + description: "File to read bearer token for accessing apiserver. + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `bearerToken`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string host: - description: Host of apiserver. A valid string consisting of a - hostname or IP followed by an optional port number + description: Kubernetes API address consisting of a hostname or + IP address followed by an optional port number. type: string tlsConfig: - description: TLS Config to use for accessing apiserver. + description: TLS Config to use for the API server. properties: ca: description: Certificate authority used when verifying server @@ -1190,6 +1199,11 @@ spec: deny: type: boolean type: object + bodySizeLimit: + description: BodySizeLimit defines per-scrape on response body size. + Only valid in Prometheus versions 2.45.0 and newer. + pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ + type: string configMaps: description: ConfigMaps is a list of ConfigMaps in the same namespace as the Prometheus object, which shall be mounted into the Prometheus @@ -2035,6 +2049,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2156,8 +2189,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2190,16 +2223,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2504,6 +2533,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -2592,6 +2630,7 @@ spec: - servicemonitors - podmonitors - probes + - scrapeconfigs type: string required: - namespace @@ -2645,7 +2684,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3517,6 +3556,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3638,8 +3696,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3672,16 +3730,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3960,6 +4014,29 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer + labelLimit: + description: Per-scrape limit on number of labels that will be accepted + for a sample. Only valid in Prometheus versions 2.45.0 and newer. + format: int64 + type: integer + labelNameLengthLimit: + description: Per-scrape limit on length of labels name that will be + accepted for a sample. Only valid in Prometheus versions 2.45.0 + and newer. + format: int64 + type: integer + labelValueLengthLimit: + description: Per-scrape limit on length of labels value that will + be accepted for a sample. Only valid in Prometheus versions 2.45.0 + and newer. + format: int64 + type: integer listenLocal: description: When true, the Prometheus server listens on the loopback address instead of the Pod IP's address. @@ -4011,8 +4088,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -4271,11 +4357,11 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -4295,16 +4381,44 @@ spec: x-kubernetes-map-type: atomic credentialsFile: description: File to read a secret from, mutually exclusive - with Credentials (from SafeAuthorization) + with `credentials`. type: string type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -4348,8 +4462,8 @@ spec: x-kubernetes-map-type: atomic type: object bearerToken: - description: "*Warning: this field shouldn't used because the - token value appears in clear-text. Prefer using `authorization`.* + description: "*Warning: this field shouldn't be used because + the token value appears in clear-text. Prefer using `authorization`.* \n *Deprecated: this will be removed in a future release.*" type: string bearerTokenFile: @@ -4370,12 +4484,12 @@ spec: metadata to the remote storage. properties: send: - description: Whether metric metadata is sent to the remote - storage or not. + description: Defines whether metric metadata is sent to + the remote storage or not. type: boolean sendInterval: - description: How frequently metric metadata is sent to the - remote storage. + description: Defines how frequently metric metadata is sent + to the remote storage. 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 type: object @@ -4388,7 +4502,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -4535,8 +4649,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -4726,16 +4840,16 @@ spec: writeRelabelConfigs: description: The list of remote write relabel configurations. items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -4761,28 +4875,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -4791,9 +4906,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -4868,6 +4984,12 @@ spec: is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`." type: string + sampleLimit: + description: SampleLimit defines per-scrape limit on number of scraped + samples that will be accepted. Only valid in Prometheus versions + 2.45.0 and newer. + format: int64 + type: integer scrapeConfigNamespaceSelector: description: Namespaces to match for ScrapeConfig discovery. An empty label selector matches all namespaces. A null label selector matches @@ -5076,7 +5198,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -5140,14 +5263,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5842,6 +5962,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5849,19 +6014,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5916,16 +6093,15 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object + targetLimit: + description: TargetLimit defines a limit on the number of scraped + targets that will be accepted. Only valid in Prometheus versions + 2.45.0 and newer. + format: int64 + type: integer tolerations: description: Defines the Pods' tolerations if specified. items: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml index 093143bf..009f5dfd 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheuses.monitoring.coreos.com @@ -1012,7 +1013,7 @@ spec: against. items: description: AlertmanagerEndpoints defines a selection of a - single Endpoints object containing alertmanager IPs to fire + single Endpoints object containing Alertmanager IPs to fire alerts against. properties: apiVersion: @@ -1020,12 +1021,13 @@ spec: uses to send alerts. It can be "v1" or "v2". type: string authorization: - description: Authorization section for this alertmanager - endpoint + description: "Authorization section for Alertmanager. \n + Cannot be set at the same time as `basicAuth`, `bearerTokenFile` + or `sigv4`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -1045,13 +1047,15 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to - Bearer, Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported + value. \n Default: \"Bearer\"" type: string type: object basicAuth: - description: BasicAuth allow an endpoint to authenticate - over basic authentication + description: "BasicAuth configuration for Alertmanager. + \n Cannot be set at the same time as `bearerTokenFile`, + `authorization` or `sigv4`." properties: password: description: The secret in the service monitor namespace @@ -1097,17 +1101,19 @@ spec: x-kubernetes-map-type: atomic type: object bearerTokenFile: - description: BearerTokenFile to read from filesystem to - use when authenticating to Alertmanager. + description: "File to read bearer token for Alertmanager. + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `sigv4`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string enableHttp2: description: Whether to enable HTTP2. type: boolean name: - description: Name of Endpoints object in Namespace. + description: Name of the Endpoints object in the namespace. type: string namespace: - description: Namespace of Endpoints object. + description: Namespace of the Endpoints object. type: string pathPrefix: description: Prefix for the HTTP path alerts are pushed @@ -1117,18 +1123,80 @@ spec: anyOf: - type: integer - type: string - description: Port the Alertmanager API is exposed on. + description: Port on which the Alertmanager API is exposed. x-kubernetes-int-or-string: true scheme: description: Scheme to use when firing alerts. type: string + sigv4: + description: "Sigv4 allows to configures AWS's Signature + Verification 4 for the URL. \n It requires Prometheus + >= v2.48.0. \n Cannot be set at the same time as `basicAuth`, + `bearerTokenFile` or `authorization`." + properties: + accessKey: + description: AccessKey is the AWS API key. If not specified, + the environment variable `AWS_ACCESS_KEY_ID` is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used to + authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used to + authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object timeout: description: Timeout is a per-target Alertmanager timeout when pushing alerts. 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 tlsConfig: - description: TLS Config to use for alertmanager connection. + description: TLS Config to use for Alertmanager. properties: ca: description: Certificate authority used when verifying @@ -1288,11 +1356,12 @@ spec: and use the Pod''s CA certificate and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/.' properties: authorization: - description: Authorization section for accessing apiserver + description: "Authorization section for the API server. \n Cannot + be set at the same time as `basicAuth`, `bearerToken`, or `bearerTokenFile`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace that + contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -1312,16 +1381,18 @@ spec: x-kubernetes-map-type: atomic credentialsFile: description: File to read a secret from, mutually exclusive - with Credentials (from SafeAuthorization) + with `credentials`. type: string type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value is + case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: - description: BasicAuth allow an endpoint to authenticate over - basic authentication + description: "BasicAuth configuration for the API server. \n Cannot + be set at the same time as `authorization`, `bearerToken`, or + `bearerTokenFile`." properties: password: description: The secret in the service monitor namespace that @@ -1365,17 +1436,22 @@ spec: x-kubernetes-map-type: atomic type: object bearerToken: - description: Bearer token for accessing apiserver. + description: "*Warning: this field shouldn't be used because the + token value appears in clear-text. Prefer using `authorization`.* + \n *Deprecated: this will be removed in a future release.*" type: string bearerTokenFile: - description: File to read bearer token for accessing apiserver. + description: "File to read bearer token for accessing apiserver. + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `bearerToken`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string host: - description: Host of apiserver. A valid string consisting of a - hostname or IP followed by an optional port number + description: Kubernetes API address consisting of a hostname or + IP address followed by an optional port number. type: string tlsConfig: - description: TLS Config to use for accessing apiserver. + description: TLS Config to use for the API server. properties: ca: description: Certificate authority used when verifying server @@ -1524,6 +1600,11 @@ spec: baseImage: description: '*Deprecated: use ''spec.image'' instead.*' type: string + bodySizeLimit: + description: BodySizeLimit defines per-scrape on response body size. + Only valid in Prometheus versions 2.45.0 and newer. + pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ + type: string configMaps: description: ConfigMaps is a list of ConfigMaps in the same namespace as the Prometheus object, which shall be mounted into the Prometheus @@ -2369,6 +2450,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2490,8 +2590,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2524,16 +2624,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2849,6 +2945,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -2942,6 +3047,7 @@ spec: - servicemonitors - podmonitors - probes + - scrapeconfigs type: string required: - namespace @@ -2954,9 +3060,11 @@ spec: effective. properties: maxSize: - description: Maximum number of exemplars stored in memory for - all series. If not set, Prometheus uses its default value. A - value of zero or less than zero disables the storage. + description: "Maximum number of exemplars stored in memory for + all series. \n exemplar-storage itself must be enabled using + the `spec.enableFeature` option for exemplars to be scraped + in the first place. \n If not set, Prometheus uses its default + value. A value of zero or less than zero disables the storage." format: int64 type: integer type: object @@ -3007,7 +3115,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3879,6 +3987,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -4000,8 +4127,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4034,16 +4161,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4322,6 +4445,29 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer + labelLimit: + description: Per-scrape limit on number of labels that will be accepted + for a sample. Only valid in Prometheus versions 2.45.0 and newer. + format: int64 + type: integer + labelNameLengthLimit: + description: Per-scrape limit on length of labels name that will be + accepted for a sample. Only valid in Prometheus versions 2.45.0 + and newer. + format: int64 + type: integer + labelValueLengthLimit: + description: Per-scrape limit on length of labels value that will + be accepted for a sample. Only valid in Prometheus versions 2.45.0 + and newer. + format: int64 + type: integer listenLocal: description: When true, the Prometheus server listens on the loopback address instead of the Pod IP's address. @@ -4373,8 +4519,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -4693,8 +4848,8 @@ spec: `basicAuth`, or `oauth2`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -4714,11 +4869,12 @@ spec: x-kubernetes-map-type: atomic credentialsFile: description: File to read a secret from, mutually exclusive - with Credentials (from SafeAuthorization) + with `credentials`. type: string type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -4767,13 +4923,13 @@ spec: x-kubernetes-map-type: atomic type: object bearerToken: - description: "*Warning: this field shouldn't used because the - token value appears in clear-text. Prefer using `authorization`.* + description: "*Warning: this field shouldn't be used because + the token value appears in clear-text. Prefer using `authorization`.* \n *Deprecated: this will be removed in a future release.*" type: string bearerTokenFile: - description: "File from which to read bearer token for the URL. - \n *Deprecated: this will be removed in a future release. + description: "File from which to read the bearer token for the + URL. \n *Deprecated: this will be removed in a future release. Prefer using `authorization`.*" type: string filterExternalLabels: @@ -5051,11 +5207,11 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -5075,16 +5231,44 @@ spec: x-kubernetes-map-type: atomic credentialsFile: description: File to read a secret from, mutually exclusive - with Credentials (from SafeAuthorization) + with `credentials`. type: string type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -5128,8 +5312,8 @@ spec: x-kubernetes-map-type: atomic type: object bearerToken: - description: "*Warning: this field shouldn't used because the - token value appears in clear-text. Prefer using `authorization`.* + description: "*Warning: this field shouldn't be used because + the token value appears in clear-text. Prefer using `authorization`.* \n *Deprecated: this will be removed in a future release.*" type: string bearerTokenFile: @@ -5150,12 +5334,12 @@ spec: metadata to the remote storage. properties: send: - description: Whether metric metadata is sent to the remote - storage or not. + description: Defines whether metric metadata is sent to + the remote storage or not. type: boolean sendInterval: - description: How frequently metric metadata is sent to the - remote storage. + description: Defines how frequently metric metadata is sent + to the remote storage. 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 type: object @@ -5168,7 +5352,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -5315,8 +5499,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -5506,16 +5690,16 @@ spec: writeRelabelConfigs: description: The list of remote write relabel configurations. items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -5541,28 +5725,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -5571,9 +5756,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -5755,12 +5941,14 @@ spec: description: Defines the configuration of the Prometheus rules' engine. properties: alert: - description: /--rules.alert.*/ command-line arguments + description: "Defines the parameters of the Prometheus rules' + engine. \n Any update to these parameters trigger a restart + of the pods." properties: forGracePeriod: - description: Minimum duration between alert and restored 'for' - state. This is maintained only for alerts with configured - 'for' time greater than grace period. + description: "Minimum duration between alert and restored + 'for' state. \n This is maintained only for alerts with + a configured 'for' time greater than the grace period." type: string forOutageTolerance: description: Max time to tolerate prometheus outage for restoring @@ -5772,6 +5960,12 @@ spec: type: string type: object type: object + sampleLimit: + description: SampleLimit defines per-scrape limit on number of scraped + samples that will be accepted. Only valid in Prometheus versions + 2.45.0 and newer. + format: int64 + type: integer scrapeConfigNamespaceSelector: description: Namespaces to match for ScrapeConfig discovery. An empty label selector matches all namespaces. A null label selector matches @@ -5980,7 +6174,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -6044,14 +6239,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -6750,6 +6942,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -6757,19 +6994,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -6824,13 +7073,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object @@ -6838,6 +7080,12 @@ spec: description: '*Deprecated: use ''spec.image'' instead. The image''s tag can be specified as part of the image name.*' type: string + targetLimit: + description: TargetLimit defines a limit on the number of scraped + targets that will be accepted. Only valid in Prometheus versions + 2.45.0 and newer. + format: int64 + type: integer thanos: description: "Defines the configuration of the optional Thanos sidecar. \n This section is experimental, it may change significantly without @@ -7635,12 +7883,12 @@ spec: database (TSDB). properties: outOfOrderTimeWindow: - description: Configures how old an out-of-order/out-of-bounds - sample can be w.r.t. the TSDB max time. An out-of-order/out-of-bounds + description: "Configures how old an out-of-order/out-of-bounds + sample can be with respect to the TSDB max time. \n An out-of-order/out-of-bounds sample is ingested into the TSDB as long as the timestamp of - the sample is >= (TSDB.MaxTime - outOfOrderTimeWindow). Out - of order ingestion is an experimental feature and requires Prometheus - >= v2.39.0. + the sample is >= (TSDB.MaxTime - outOfOrderTimeWindow). \n Out + of order ingestion is an experimental feature. \n It requires + Prometheus >= v2.39.0." 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 type: object diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml index 20da04f5..6148aea9 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheusrules.monitoring.coreos.com diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml index e0804f6d..097f665f 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: scrapeconfigs.monitoring.coreos.com @@ -47,8 +48,8 @@ spec: description: Authorization header to use on every scrape request. properties: credentials: - description: The secret's key that contains the credentials of - the request + description: Selects a key of a Secret in the namespace that contains + the credentials for authentication. properties: key: description: The key of the secret to select from. Must be @@ -67,8 +68,8 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value is case-insensitive. + \n \"Basic\" is not a supported value. \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -115,6 +116,540 @@ spec: type: object x-kubernetes-map-type: atomic type: object + consulSDConfigs: + description: ConsulSDConfigs defines a list of Consul service discovery + configurations. + items: + description: ConsulSDConfig defines a Consul service discovery configuration + See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config + properties: + allow_stale: + description: Allow stale Consul results (see https://www.consul.io/api/features/consistency.html). + Will reduce load on Consul. If unset, Prometheus uses its + default value. + type: boolean + authorization: + description: Authorization header configuration to authenticate + against the Consul Server. + properties: + credentials: + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: 'BasicAuth information to authenticate against + the Consul Server. More info: https://prometheus.io/docs/operating/configuration/#endpoints' + properties: + password: + description: The secret in the service monitor namespace + that contains the password for authentication. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor namespace + that contains the username for authentication. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + datacenter: + description: Consul Datacenter name, if not provided it will + use the local Consul Agent Datacenter. + type: string + enable_http2: + description: Whether to enable HTTP2. If unset, Prometheus uses + its default value. + type: boolean + follow_redirects: + description: Configure whether HTTP requests follow HTTP 3xx + redirects. If unset, Prometheus uses its default value. + type: boolean + namespace: + description: Namespaces are only supported in Consul Enterprise. + type: string + no_proxy: + description: Comma-separated string that can contain IPs, CIDR + notation, domain names that should be excluded from proxying. + IP and domain names can contain port numbers. + type: string + node_meta: + additionalProperties: + type: string + description: Node metadata key/value pairs to filter nodes for + a given service. + type: object + x-kubernetes-map-type: atomic + oauth2: + description: Optional OAuth 2.0 configuration. + properties: + clientId: + description: The secret or configmap containing the OAuth2 + client id + properties: + configMap: + description: ConfigMap containing data to use for the + targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 client secret + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token URL + type: object + scopes: + description: OAuth2 scopes used for the token request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + partition: + description: Admin Partitions are only supported in Consul Enterprise. + type: string + proxy_connect_header: + additionalProperties: + description: SecretKeySelector selects a key of a Secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + description: Specifies headers to send to proxies during CONNECT + requests. + type: object + x-kubernetes-map-type: atomic + proxy_from_environment: + description: Use proxy URL indicated by environment variables + (HTTP_PROXY, https_proxy, HTTPs_PROXY, https_proxy, and no_proxy) + If unset, Prometheus uses its default value. + type: boolean + proxy_url: + description: Optional proxy URL. + type: string + refresh_interval: + description: The time after which the provided names are refreshed. + On large setup it might be a good idea to increase this value + because the catalog will change all the time. If unset, Prometheus + uses its default value. + 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: HTTP Scheme default "http" + enum: + - HTTP + - HTTPS + type: string + server: + description: A valid string consisting of a hostname or IP followed + by an optional port number. + minLength: 1 + type: string + services: + description: A list of services for which targets are retrieved. + If omitted, all services are scraped. + items: + type: string + type: array + x-kubernetes-list-type: atomic + tag_separator: + description: The string by which Consul tags are joined into + the tag label. If unset, Prometheus uses its default value. + type: string + tags: + description: An optional list of tags used to filter nodes for + a given service. Services must contain all tags in the list. + items: + type: string + type: array + x-kubernetes-list-type: atomic + tlsConfig: + description: TLS Config + properties: + ca: + description: Certificate authority used when verifying server + certificates. + properties: + configMap: + description: ConfigMap containing data to use for the + targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to use for the + targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key file for the + targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the targets. + type: string + type: object + tokenRef: + description: Consul ACL TokenRef, if not provided it will use + the ACL from the local Consul Agent. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + required: + - server + type: object + type: array + dnsSDConfigs: + description: DNSSDConfigs defines a list of DNS service discovery + configurations. + items: + description: DNSSDConfig allows specifying a set of DNS domain names + which are periodically queried to discover a list of targets. + The DNS servers to be contacted are read from /etc/resolv.conf. + See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config + properties: + names: + description: A list of DNS domain names to be queried. + items: + type: string + minItems: 1 + type: array + port: + description: The port number used if the query type is not SRV + Ignored for SRV records + type: integer + refreshInterval: + description: RefreshInterval configures the time after which + the provided names are refreshed. If not set, Prometheus uses + its default value. + 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 + type: + description: The type of DNS query to perform. One of SRV, A, + AAAA or MX. If not set, Prometheus uses its default value. + enum: + - SRV + - A + - AAAA + - MX + type: string + required: + - names + type: object + type: array + ec2SDConfigs: + description: EC2SDConfigs defines a list of EC2 service discovery + configurations. + items: + description: EC2SDConfig allow retrieving scrape targets from AWS + EC2 instances. The private IP address is used by default, but + may be changed to the public IP address with relabeling. The IAM + credentials used must have the ec2:DescribeInstances permission + to discover scrape targets See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config + properties: + accessKey: + description: AccessKey is the AWS API key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + filters: + description: 'Filters can be used optionally to filter the instance + list by other criteria. Available filter criteria can be found + here: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html' + items: + description: EC2Filter is the configuration for filtering + EC2 instances. + properties: + name: + type: string + values: + items: + type: string + type: array + required: + - name + - values + type: object + type: array + port: + description: The port to scrape metrics from. If using the public + IP address, this must instead be specified in the relabeling + rule. + type: integer + refreshInterval: + description: RefreshInterval configures the refresh interval + at which Prometheus will re-read the instance list. + 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 + region: + description: The AWS region + type: string + roleARN: + description: AWS Role ARN, an alternative to using AWS API keys. + type: string + secretKey: + description: SecretKey is the AWS API secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + type: object + type: array fileSDConfigs: description: FileSDConfigs defines a list of file service discovery configurations. @@ -163,8 +698,8 @@ spec: against the target HTTP endpoint. properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -183,8 +718,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -238,6 +774,125 @@ spec: target list. 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 + tlsConfig: + description: TLS configuration applying to the target HTTP endpoint. + properties: + ca: + description: Certificate authority used when verifying server + certificates. + properties: + configMap: + description: ConfigMap containing data to use for the + targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to use for the + targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key file for the + targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the targets. + type: string + type: object url: description: URL from which the targets are fetched. minLength: 1 @@ -247,26 +902,83 @@ spec: - url type: object type: array - metricsPath: - description: MetricsPath HTTP path to scrape for metrics. If empty, - Prometheus uses the default value (e.g. /metrics). - type: string - relabelings: - description: 'RelabelConfigs defines how to rewrite the target''s - labels before scraping. Prometheus Operator automatically adds relabelings - for a few standard Kubernetes fields. The original scrape job''s - name is available via the `__tmp_prometheus_job_name` label. More - info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer + kubernetesSDConfigs: + description: KubernetesSDConfigs defines a list of Kubernetes service + discovery configurations. items: - description: 'RelabelConfig allows dynamic rewriting of the label - set, being applied to samples before ingestion. It defines ``-section - of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: KubernetesSDConfig allows retrieving scrape targets + from Kubernetes' REST API. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config + properties: + role: + description: Role of the Kubernetes entities that should be + discovered. + enum: + - Node + - node + type: string + selectors: + description: Selector to select objects. + items: + description: K8SSelectorConfig is Kubernetes Selector Config + properties: + field: + type: string + label: + type: string + role: + description: K8SRole is role of the service in Kubernetes. + Currently the only supported role is "Node". + enum: + - Node + - node + type: string + required: + - role + type: object + type: array + x-kubernetes-list-map-keys: + - role + x-kubernetes-list-type: map + required: + - role + type: object + type: array + labelLimit: + description: Per-scrape limit on number of labels that will be accepted + for a sample. Only valid in Prometheus versions 2.27.0 and newer. + format: int64 + type: integer + labelNameLengthLimit: + description: Per-scrape limit on length of labels name that will be + accepted for a sample. Only valid in Prometheus versions 2.27.0 + and newer. + format: int64 + type: integer + labelValueLengthLimit: + description: Per-scrape limit on length of labels value that will + be accepted for a sample. Only valid in Prometheus versions 2.27.0 + and newer. + format: int64 + type: integer + metricRelabelings: + description: MetricRelabelConfigs to apply to samples before ingestion. + items: + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. Default - is 'replace'. uppercase and lowercase actions require Prometheus - >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -292,28 +1004,26 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source label - values. + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex capture - groups are available. Default is '$1' + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." type: string separator: - description: Separator placed between concatenated source label - values. default is ';'. + description: Separator is the string between concatenated SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. - Their content is concatenated using the configured separator - and matched against the configured regular expression for - the replace, keep, and drop actions. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as well as underscores. @@ -321,12 +1031,122 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written in - a replace action. It is mandatory for replace actions. Regex - capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." type: string type: object type: array + metricsPath: + description: MetricsPath HTTP path to scrape for metrics. If empty, + Prometheus uses the default value (e.g. /metrics). + type: string + params: + additionalProperties: + items: + type: string + type: array + description: Optional HTTP URL parameters + type: object + x-kubernetes-map-type: atomic + relabelings: + description: 'RelabelConfigs defines how to rewrite the target''s + labels before scraping. Prometheus Operator automatically adds relabelings + for a few standard Kubernetes fields. The original scrape job''s + name is available via the `__tmp_prometheus_job_name` label. More + info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' + items: + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" + properties: + action: + default: replace + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" + enum: + - replace + - Replace + - keep + - Keep + - drop + - Drop + - hashmod + - HashMod + - labelmap + - LabelMap + - labeldrop + - LabelDrop + - labelkeep + - LabelKeep + - lowercase + - Lowercase + - uppercase + - Uppercase + - keepequal + - KeepEqual + - dropequal + - DropEqual + type: string + modulus: + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." + format: int64 + type: integer + regex: + description: Regular expression against which the extracted + value is matched. + type: string + replacement: + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." + type: string + separator: + description: Separator is the string between concatenated SourceLabels. + type: string + sourceLabels: + description: The source labels select values from existing labels. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. + items: + description: LabelName is a valid Prometheus label name which + may only contain ASCII letters, numbers, as well as underscores. + pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ + type: string + type: array + targetLabel: + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." + type: string + type: object + type: array + sampleLimit: + description: SampleLimit defines per-scrape limit on number of scraped + samples that will be accepted. + format: int64 + type: integer + scheme: + description: Configures the protocol scheme used for requests. If + empty, Prometheus uses HTTP by default. + enum: + - HTTP + - HTTPS + type: string + scrapeInterval: + description: ScrapeInterval is the interval between consecutive scrapes. + 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 + scrapeTimeout: + description: ScrapeTimeout is the number of seconds to wait until + a scrape request times out. + 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 staticConfigs: description: StaticConfigs defines a list of static targets with a common label set. @@ -350,6 +1170,123 @@ spec: type: array type: object type: array + targetLimit: + description: TargetLimit defines a limit on the number of scraped + targets that will be accepted. + format: int64 + type: integer + tlsConfig: + description: TLS configuration to use on every scrape request + properties: + ca: + description: Certificate authority used when verifying server + certificates. + properties: + configMap: + description: ConfigMap containing data to use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key file for the targets. + properties: + key: + description: The key of the secret to select from. Must be + a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be + defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the targets. + type: string + type: object type: object required: - spec diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml index daa1a620..90736762 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: servicemonitors.monitoring.coreos.com @@ -61,8 +62,8 @@ spec: description: Authorization section for this endpoint properties: credentials: - description: The secret's key that contains the credentials - of the request + description: Selects a key of a Secret in the namespace + that contains the credentials for authentication. properties: key: description: The key of the secret to select from. Must @@ -81,8 +82,9 @@ spec: type: object x-kubernetes-map-type: atomic type: - description: Set the authentication type. Defaults to Bearer, - Basic will cause an error + description: "Defines the authentication type. The value + is case-insensitive. \n \"Basic\" is not a supported value. + \n Default: \"Bearer\"" type: string type: object basicAuth: @@ -182,16 +184,16 @@ spec: description: MetricRelabelConfigs to apply to samples before ingestion. items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -217,28 +219,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -247,9 +250,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -366,16 +370,16 @@ spec: is available via the `__tmp_prometheus_job_name` label. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' items: - description: 'RelabelConfig allows dynamic rewriting of the - label set, being applied to samples before ingestion. It - defines ``-section of Prometheus - configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs' + description: "RelabelConfig allows dynamic rewriting of the + label set for targets, alerts, scraped samples and remote + write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" properties: action: default: replace - description: Action to perform based on regex matching. - Default is 'replace'. uppercase and lowercase actions - require Prometheus >= 2.36. + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require + Prometheus >= v2.41.0. \n Default: \"Replace\"" enum: - replace - Replace @@ -401,28 +405,29 @@ spec: - DropEqual type: string modulus: - description: Modulus to take of the hash of the source - label values. + description: "Modulus to take of the hash of the source + label values. \n Only applicable when the action is + `HashMod`." format: int64 type: integer regex: description: Regular expression against which the extracted - value is matched. Default is '(.*)' + value is matched. type: string replacement: - description: Replacement value against which a regex replace - is performed if the regular expression matches. Regex - capture groups are available. Default is '$1' + description: "Replacement value against which a Replace + action is performed if the regular expression matches. + \n Regex capture groups are available." type: string separator: - description: Separator placed between concatenated source - label values. default is ';'. + description: Separator is the string between concatenated + SourceLabels. type: string sourceLabels: description: The source labels select values from existing labels. Their content is concatenated using the configured - separator and matched against the configured regular - expression for the replace, keep, and drop actions. + Separator and matched against the configured regular + expression. items: description: LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as @@ -431,9 +436,10 @@ spec: type: string type: array targetLabel: - description: Label to which the resulting value is written - in a replace action. It is mandatory for replace actions. - Regex capture groups are available. + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, + `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and + `DropEqual` actions. \n Regex capture groups are available." type: string type: object type: array @@ -602,6 +608,12 @@ spec: the given Service, the `job` label of the metrics defaults to the name of the Kubernetes Service." type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml index d48a63c2..b87152f3 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml @@ -1,10 +1,11 @@ -# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.66.0/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +# https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.69.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: thanosrulers.monitoring.coreos.com @@ -1823,6 +1824,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -1944,8 +1964,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -1978,16 +1998,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2306,6 +2322,7 @@ spec: - servicemonitors - podmonitors - probes + - scrapeconfigs type: string required: - namespace @@ -3327,6 +3344,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3448,8 +3484,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3482,16 +3518,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3841,8 +3873,14 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata contains Labels and Annotations gets propagated - to the thanos ruler pods. + description: "PodMetadata configures labels and annotations which + are propagated to the ThanosRuler pods. \n The following items are + reserved and cannot be overridden: * \"app.kubernetes.io/name\" + label, set to \"thanos-ruler\". * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/instance\" + label, set to the name of the ThanosRuler instance. * \"thanos-ruler\" + label, set to the name of the ThanosRuler instance. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"thanos-ruler\"." properties: annotations: additionalProperties: @@ -4168,7 +4206,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4232,14 +4271,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4819,6 +4855,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -4826,19 +4907,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -4893,13 +4986,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/Chart.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/Chart.yaml index 06a1e311..0d5e69cd 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/Chart.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/Chart.yaml @@ -6,7 +6,7 @@ annotations: - name: Upstream Project url: https://github.com/grafana/grafana apiVersion: v2 -appVersion: 10.0.3 +appVersion: 10.1.5 description: The leading tool for querying and visualizing time series and metrics. home: https://grafana.net icon: https://raw.githubusercontent.com/grafana/grafana/master/public/img/logo_transparent_400x.png @@ -30,4 +30,4 @@ sources: - https://github.com/grafana/grafana - https://github.com/grafana/helm-charts type: application -version: 6.58.9 +version: 7.0.8 diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/README.md b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/README.md index f13d2e32..81e5360b 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/README.md +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/README.md @@ -46,6 +46,13 @@ You have to add --force to your helm upgrade command as the labels of the chart This version requires Helm >= 3.1.0. +### To 7.0.0 + +For consistency with other Helm charts, the `global.image.registry` parameter was renamed +to `global.imageRegistry`. If you were not previously setting `global.image.registry`, no action +is required on upgrade. If you were previously setting `global.image.registry`, you will +need to instead set `global.imageRegistry`. + ## Configuration | Parameter | Description | Default | @@ -53,11 +60,13 @@ This version requires Helm >= 3.1.0. | `replicas` | Number of nodes | `1` | | `podDisruptionBudget.minAvailable` | Pod disruption minimum available | `nil` | | `podDisruptionBudget.maxUnavailable` | Pod disruption maximum unavailable | `nil` | +| `podDisruptionBudget.apiVersion` | Pod disruption apiVersion | `nil` | | `deploymentStrategy` | Deployment strategy | `{ "type": "RollingUpdate" }` | | `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` | | `readinessProbe` | Readiness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`| | `securityContext` | Deployment securityContext | `{"runAsUser": 472, "runAsGroup": 472, "fsGroup": 472}` | | `priorityClassName` | Name of Priority Class to assign pods | `nil` | +| `image.registry` | Image registry | `docker.io` | | `image.repository` | Image repository | `grafana/grafana` | | `image.tag` | Overrides the Grafana image tag whose default is the chart appVersion (`Must be >= 5.0.0`) | `` | | `image.sha` | Image sha (optional) | `` | @@ -76,6 +85,7 @@ This version requires Helm >= 3.1.0. | `service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `nil` | | `service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to lb (if supported) | `[]` | | `service.externalIPs` | service external IP addresses | `[]` | +| `service.externalTrafficPolicy` | change the default externalTrafficPolicy | `nil` | | `headlessService` | Create a headless service | `false` | | `extraExposePorts` | Additional service ports for sidecar containers| `[]` | | `hostAliases` | adds rules to the pod's /etc/hosts | `[]` | @@ -85,7 +95,7 @@ This version requires Helm >= 3.1.0. | `ingress.path` | Ingress accepted path | `/` | | `ingress.pathType` | Ingress type of path | `Prefix` | | `ingress.hosts` | Ingress accepted hostnames | `["chart-example.local"]` | -| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions). Requires `ingress.hosts` to have one or more host entries. | `[]` | +| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/ingress/annotations/#actions). Requires `ingress.hosts` to have one or more host entries. | `[]` | | `ingress.tls` | Ingress TLS configuration | `[]` | | `ingress.ingressClassName` | Ingress Class Name. MAY be required for Kubernetes versions >= 1.18 | `""` | | `resources` | CPU/Memory resource requests/limits | `{}` | @@ -110,6 +120,7 @@ This version requires Helm >= 3.1.0. | `persistence.inMemory.enabled` | If persistence is not enabled, whether to mount the local storage in-memory to improve performance | `false` | | `persistence.inMemory.sizeLimit` | SizeLimit for the in-memory local storage | `nil` | | `initChownData.enabled` | If false, don't reset data ownership at startup | true | +| `initChownData.image.registry` | init-chown-data container image registry | `docker.io` | | `initChownData.image.repository` | init-chown-data container image repository | `busybox` | | `initChownData.image.tag` | init-chown-data container image tag | `1.31.1` | | `initChownData.image.sha` | init-chown-data container image sha (optional)| `""` | @@ -136,6 +147,7 @@ This version requires Helm >= 3.1.0. | `dashboards` | Dashboards to import | `{}` | | `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | | `grafana.ini` | Grafana's primary configuration | `{}` | +| `global.imageRegistry` | Global image pull registry for all images. | `null` | | `global.imagePullSecrets` | Global image pull secrets (can be templated). Allows either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). | `[]` | | `ldap.enabled` | Enable LDAP authentication | `false` | | `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | @@ -146,7 +158,8 @@ This version requires Helm >= 3.1.0. | `podLabels` | Pod labels | `{}` | | `podPortName` | Name of the grafana port on the pod | `grafana` | | `lifecycleHooks` | Lifecycle hooks for podStart and preStop [Example](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/#define-poststart-and-prestop-handlers) | `{}` | -| `sidecar.image.repository` | Sidecar image repository | `quay.io/kiwigrid/k8s-sidecar` | +| `sidecar.image.registry` | Sidecar image registry | `quay.io` | +| `sidecar.image.repository` | Sidecar image repository | `kiwigrid/k8s-sidecar` | | `sidecar.image.tag` | Sidecar image tag | `1.24.6` | | `sidecar.image.sha` | Sidecar image sha (optional) | `""` | | `sidecar.imagePullPolicy` | Sidecar image pull policy | `IfNotPresent` | @@ -161,7 +174,7 @@ This version requires Helm >= 3.1.0. | `sidecar.alerts.resource` | Should the sidecar looks into secrets, configmaps or both. | `both` | | `sidecar.alerts.reloadURL` | Full url of datasource configuration reload API endpoint, to invoke after a config-map change | `"http://localhost:3000/api/admin/provisioning/alerting/reload"` | | `sidecar.alerts.skipReload` | Enabling this omits defining the REQ_URL and REQ_METHOD environment variables | `false` | -| `sidecar.alerts.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer in addition to a container. This is needed if skipReload is true, to load any alerts defined at startup time. | `false` | +| `sidecar.alerts.initDatasources` | Set to true to deploy the datasource sidecar as an initContainer. This is needed if skipReload is true, to load any alerts defined at startup time. | `false` | | `sidecar.alerts.extraMounts` | Additional alerts sidecar volume mounts. | `[]` | | `sidecar.dashboards.enabled` | Enables the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | | `sidecar.dashboards.SCProvider` | Enables creation of sidecar provider | `true` | @@ -225,14 +238,16 @@ This version requires Helm >= 3.1.0. | `command` | Define command to be executed by grafana container at startup | `nil` | | `args` | Define additional args if command is used | `nil` | | `testFramework.enabled` | Whether to create test-related resources | `true` | -| `testFramework.image` | `test-framework` image repository. | `bats/bats` | -| `testFramework.tag` | `test-framework` image tag. | `v1.4.1` | +| `testFramework.image.registry` | `test-framework` image registry. | `docker.io` | +| `testFramework.image.repository` | `test-framework` image repository. | `bats/bats` | +| `testFramework.image.tag` | `test-framework` image tag. | `v1.4.1` | | `testFramework.imagePullPolicy` | `test-framework` image pull policy. | `IfNotPresent` | | `testFramework.securityContext` | `test-framework` securityContext | `{}` | | `downloadDashboards.env` | Environment variables to be passed to the `download-dashboards` container | `{}` | | `downloadDashboards.envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` | | `downloadDashboards.resources` | Resources of `download-dashboards` container | `{}` | -| `downloadDashboardsImage.repository` | Curl docker image repo | `curlimages/curl` | +| `downloadDashboardsImage.registry` | Curl docker image registry | `docker.io` | +| `downloadDashboardsImage.repository` | Curl docker image repository | `curlimages/curl` | | `downloadDashboardsImage.tag` | Curl docker image tag | `7.73.0` | | `downloadDashboardsImage.sha` | Curl docker image sha (optional) | `""` | | `downloadDashboardsImage.pullPolicy` | Curl docker image pull policy | `IfNotPresent` | @@ -249,6 +264,7 @@ This version requires Helm >= 3.1.0. | `serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion. | `[]` | | `revisionHistoryLimit` | Number of old ReplicaSets to retain | `10` | | `imageRenderer.enabled` | Enable the image-renderer deployment & service | `false` | +| `imageRenderer.image.registry` | image-renderer Image registry | `docker.io` | | `imageRenderer.image.repository` | image-renderer Image repository | `grafana/grafana-image-renderer` | | `imageRenderer.image.tag` | image-renderer Image tag | `latest` | | `imageRenderer.image.sha` | image-renderer Image sha (optional) | `""` | @@ -257,6 +273,7 @@ This version requires Helm >= 3.1.0. | `imageRenderer.envValueFrom` | Environment variables for image-renderer from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. Can be templated | `{}` | | `imageRenderer.serviceAccountName` | image-renderer deployment serviceAccountName | `""` | | `imageRenderer.securityContext` | image-renderer deployment securityContext | `{}` | +| `imageRenderer.podAnnotations ` | image-renderer image-renderer pod annotation | `{}` | | `imageRenderer.hostAliases` | image-renderer deployment Host Aliases | `[]` | | `imageRenderer.priorityClassName` | image-renderer deployment priority class | `''` | | `imageRenderer.service.enabled` | Enable the image-renderer service | `true` | diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_helpers.tpl b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_helpers.tpl index 8307e10a..ead2449e 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_helpers.tpl +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_helpers.tpl @@ -158,7 +158,9 @@ Return the appropriate apiVersion for Horizontal Pod Autoscaler. Return the appropriate apiVersion for podDisruptionBudget. */}} {{- define "grafana.podDisruptionBudget.apiVersion" -}} -{{- if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} +{{- if $.Values.podDisruptionBudget.apiVersion }} +{{- print $.Values.podDisruptionBudget.apiVersion }} +{{- else if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }} {{- print "policy/v1" }} {{- else }} {{- print "policy/v1beta1" }} @@ -199,3 +201,27 @@ Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific {{- end }} {{- end }} {{- end }} + + +{{/* + Checks whether or not the configSecret secret has to be created + */}} +{{- define "grafana.shouldCreateConfigSecret" -}} +{{- $secretFound := false -}} +{{- range $key, $value := .Values.datasources }} + {{- if hasKey $value "secret" }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- range $key, $value := .Values.notifiers }} + {{- if hasKey $value "secret" }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- range $key, $value := .Values.alerting }} + {{- if (or (hasKey $value "secret") (hasKey $value "secretFile")) }} + {{- $secretFound = true}} + {{- end }} +{{- end }} +{{- $secretFound}} +{{- end -}} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_pod.tpl b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_pod.tpl index 23be2ca6..be5cc021 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_pod.tpl +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/_pod.tpl @@ -17,15 +17,16 @@ hostAliases: {{- with .Values.priorityClassName }} priorityClassName: {{ . }} {{- end }} -{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.extraInitContainers (and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources) (and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers)) }} +{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.extraInitContainers (and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts) (and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources) (and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers)) }} initContainers: {{- end }} {{- if ( and .Values.persistence.enabled .Values.initChownData.enabled ) }} - name: init-chown-data + {{- $registry := .Values.global.imageRegistry | default .Values.initChownData.image.registry -}} {{- if .Values.initChownData.image.sha }} - image: "{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}" + image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}" {{- else }} - image: "{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}" + image: "{{ $registry }}/{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.initChownData.image.pullPolicy }} {{- with .Values.initChownData.securityContext }} @@ -50,10 +51,11 @@ initContainers: {{- end }} {{- if .Values.dashboards }} - name: download-dashboards + {{- $registry := .Values.global.imageRegistry | default .Values.downloadDashboardsImage.registry -}} {{- if .Values.downloadDashboardsImage.sha }} - image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}" + image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}" {{- else }} - image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" + image: "{{ $registry }}/{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" {{- end }} imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} command: ["/bin/sh"] @@ -96,12 +98,86 @@ initContainers: readOnly: {{ .readOnly }} {{- end }} {{- end }} +{{- if and .Values.sidecar.alerts.enabled .Values.sidecar.alerts.initAlerts }} + - name: {{ include "grafana.name" . }}-init-sc-alerts + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} + {{- if .Values.sidecar.image.sha }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + {{- else }} + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + {{- end }} + imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} + env: + {{- range $key, $value := .Values.sidecar.alerts.env }} + - name: "{{ $key }}" + value: "{{ $value }}" + {{- end }} + {{- if .Values.sidecar.alerts.ignoreAlreadyProcessed }} + - name: IGNORE_ALREADY_PROCESSED + value: "true" + {{- end }} + - name: METHOD + value: "LIST" + - name: LABEL + value: "{{ .Values.sidecar.alerts.label }}" + {{- with .Values.sidecar.alerts.labelValue }} + - name: LABEL_VALUE + value: {{ quote . }} + {{- end }} + {{- if or .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + - name: LOG_LEVEL + value: {{ default .Values.sidecar.logLevel .Values.sidecar.alerts.logLevel }} + {{- end }} + - name: FOLDER + value: "/etc/grafana/provisioning/alerting" + - name: RESOURCE + value: {{ quote .Values.sidecar.alerts.resource }} + {{- with .Values.sidecar.enableUniqueFilenames }} + - name: UNIQUE_FILENAMES + value: "{{ . }}" + {{- end }} + {{- with .Values.sidecar.alerts.searchNamespace }} + - name: NAMESPACE + value: {{ . | join "," | quote }} + {{- end }} + {{- with .Values.sidecar.alerts.skipTlsVerify }} + - name: SKIP_TLS_VERIFY + value: {{ quote . }} + {{- end }} + {{- with .Values.sidecar.alerts.script }} + - name: SCRIPT + value: {{ quote . }} + {{- end }} + {{- with .Values.sidecar.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with .Values.sidecar.securityContext }} + securityContext: + {{- toYaml . | nindent 6 }} + {{- end }} + volumeMounts: + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + {{- with .Values.sidecar.alerts.extraMounts }} + {{- toYaml . | trim | nindent 6 }} + {{- end }} +{{- end }} {{- if and .Values.sidecar.datasources.enabled .Values.sidecar.datasources.initDatasources }} - name: {{ include "grafana.name" . }}-init-sc-datasources + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -155,10 +231,11 @@ initContainers: {{- end }} {{- if and .Values.sidecar.notifiers.enabled .Values.sidecar.notifiers.initNotifiers }} - name: {{ include "grafana.name" . }}-init-sc-notifiers + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -229,12 +306,13 @@ imagePullSecrets: enableServiceLinks: {{ .Values.enableServiceLinks }} {{- end }} containers: -{{- if .Values.sidecar.alerts.enabled }} +{{- if and .Values.sidecar.alerts.enabled (not .Values.sidecar.alerts.initAlerts) }} - name: {{ include "grafana.name" . }}-sc-alerts + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -337,10 +415,11 @@ containers: {{- end}} {{- if .Values.sidecar.dashboards.enabled }} - name: {{ include "grafana.name" . }}-sc-dashboard + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -445,12 +524,13 @@ containers: {{- toYaml . | trim | nindent 6 }} {{- end }} {{- end}} -{{- if .Values.sidecar.datasources.enabled }} +{{- if and .Values.sidecar.datasources.enabled (not .Values.sidecar.datasources.initDatasources) }} - name: {{ include "grafana.name" . }}-sc-datasources + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -550,10 +630,11 @@ containers: {{- end}} {{- if .Values.sidecar.notifiers.enabled }} - name: {{ include "grafana.name" . }}-sc-notifiers + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -653,10 +734,11 @@ containers: {{- end}} {{- if .Values.sidecar.plugins.enabled }} - name: {{ include "grafana.name" . }}-sc-plugins + {{- $registry := .Values.global.imageRegistry | default .Values.sidecar.image.registry -}} {{- if .Values.sidecar.image.sha }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}" {{- else }} - image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" + image: "{{ $registry }}/{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} env: @@ -755,10 +837,11 @@ containers: mountPath: "/etc/grafana/provisioning/plugins" {{- end}} - name: {{ .Chart.Name }} + {{- $registry := .Values.global.imageRegistry | default .Values.image.registry -}} {{- if .Values.image.sha }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.image.sha }}" + image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}@sha256:{{ .Values.image.sha }}" {{- else }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + image: "{{ $registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" {{- end }} imagePullPolicy: {{ .Values.image.pullPolicy }} {{- if .Values.command }} @@ -1137,17 +1220,20 @@ volumes: {{- toYaml .csi | nindent 6 }} {{- end }} {{- end }} - {{- range .Values.extraVolumeMounts }} + {{- range .Values.extraVolumes }} - name: {{ .name }} {{- if .existingClaim }} persistentVolumeClaim: claimName: {{ .existingClaim }} {{- else if .hostPath }} hostPath: - path: {{ .hostPath }} + {{ toYaml .hostPath | nindent 6 }} {{- else if .csi }} csi: {{- toYaml .data | nindent 6 }} + {{- else if .configMap }} + configMap: + {{- toYaml .configMap | nindent 6 }} {{- else }} emptyDir: {} {{- end }} @@ -1160,3 +1246,4 @@ volumes: {{- tpl (toYaml .) $root | nindent 2 }} {{- end }} {{- end }} + diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrole.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrole.yaml index 2c9a1801..3af4b62b 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrole.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrole.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) (not .Values.rbac.useExistingRole) }} +{{- if and .Values.rbac.create (or (not .Values.rbac.namespaced) .Values.rbac.extraClusterRoleRules) (not .Values.rbac.useExistingClusterRole) }} kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrolebinding.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrolebinding.yaml index b848e8c1..bda9431a 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrolebinding.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/clusterrolebinding.yaml @@ -15,8 +15,8 @@ subjects: namespace: {{ include "grafana.namespace" . }} roleRef: kind: ClusterRole - {{- if .Values.rbac.useExistingRole }} - name: {{ .Values.rbac.useExistingRole }} + {{- if .Values.rbac.useExistingClusterRole }} + name: {{ .Values.rbac.useExistingClusterRole }} {{- else }} name: {{ include "grafana.fullname" . }}-clusterrole {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configSecret.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configSecret.yaml new file mode 100644 index 00000000..f8937ccc --- /dev/null +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configSecret.yaml @@ -0,0 +1,43 @@ +{{- $createConfigSecret := eq (include "grafana.shouldCreateConfigSecret" .) "true" -}} +{{- if and .Values.createConfigmap $createConfigSecret }} +{{- $files := .Files }} +{{- $root := . -}} +apiVersion: v1 +kind: Secret +metadata: + name: "{{ include "grafana.fullname" . }}-config-secret" + namespace: {{ include "grafana.namespace" . }} + labels: + {{- include "grafana.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +data: +{{- range $key, $value := .Values.alerting }} + {{- if (hasKey $value "secretFile") }} + {{- $key | nindent 2 }}: + {{- toYaml ( $files.Get $value.secretFile ) | b64enc | nindent 4}} + {{/* as of https://helm.sh/docs/chart_template_guide/accessing_files/ this will only work if you fork this chart and add files to it*/}} + {{- end }} +{{- end }} +stringData: +{{- range $key, $value := .Values.datasources }} +{{- if (hasKey $value "secret") }} +{{- $key | nindent 2 }}: | + {{- tpl (toYaml $value | nindent 4) $root }} +{{- end }} +{{- end }} +{{- range $key, $value := .Values.notifiers }} +{{- if (hasKey $value "secret") }} +{{- $key | nindent 2 }}: | + {{- tpl (toYaml $value | nindent 4) $root }} +{{- end }} +{{- end }} +{{- range $key, $value := .Values.alerting }} +{{ if (hasKey $value "secret") }} + {{- $key | nindent 2 }}: | + {{- tpl (toYaml $value.secret | nindent 4) $root }} + {{- end }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configmap.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configmap.yaml index b5f21e88..7b837d90 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configmap.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/configmap.yaml @@ -44,19 +44,25 @@ data: {{- end }} {{- range $key, $value := .Values.datasources }} + {{- if not (hasKey $value "secret") }} {{- $key | nindent 2 }}: | {{- tpl (toYaml $value | nindent 4) $root }} {{- end }} + {{- end }} {{- range $key, $value := .Values.notifiers }} + {{- if not (hasKey $value "secret") }} {{- $key | nindent 2 }}: | {{- toYaml $value | nindent 4 }} {{- end }} + {{- end }} {{- range $key, $value := .Values.alerting }} {{- if (hasKey $value "file") }} {{- $key | nindent 2 }}: {{- toYaml ( $files.Get $value.file ) | nindent 4}} + {{- else if (or (hasKey $value "secret") (hasKey $value "secretFile"))}} + {{/* will be stored inside secret generated by "configSecret.yaml"*/}} {{- else }} {{- $key | nindent 2 }}: | {{- tpl (toYaml $value | nindent 4) $root }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/dashboards-json-configmap.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/dashboards-json-configmap.yaml index df0ed0d8..b96ce720 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/dashboards-json-configmap.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/dashboards-json-configmap.yaml @@ -9,6 +9,9 @@ metadata: labels: {{- include "grafana.labels" $ | nindent 4 }} dashboard-provider: {{ $provider }} + {{- if $.Values.sidecar.dashboards.enabled }} + {{ $.Values.sidecar.dashboards.label }}: {{ $.Values.sidecar.dashboards.labelValue | quote }} + {{- end }} {{- if $dashboards }} data: {{- $dashboardFound := false }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/image-renderer-deployment.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/image-renderer-deployment.yaml index 93d20e8e..ea97969c 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/image-renderer-deployment.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/image-renderer-deployment.yaml @@ -65,10 +65,11 @@ spec: {{- end }} containers: - name: {{ .Chart.Name }}-image-renderer + {{- $registry := .Values.global.imageRegistry | default .Values.imageRenderer.image.registry -}} {{- if .Values.imageRenderer.image.sha }} - image: "{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}" + image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}" {{- else }} - image: "{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}" + image: "{{ $registry }}/{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}" {{- end }} imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }} {{- if .Values.imageRenderer.command }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/networkpolicy.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/networkpolicy.yaml index ea4578be..4cd3ed69 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/networkpolicy.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/networkpolicy.yaml @@ -27,8 +27,17 @@ spec: {{- if .Values.networkPolicy.egress.enabled }} egress: + {{- if not .Values.networkPolicy.egress.blockDNSResolution }} + - ports: + - port: 53 + protocol: UDP + {{- end }} - ports: {{ .Values.networkPolicy.egress.ports | toJson }} + {{- with .Values.networkPolicy.egress.to }} + to: + {{- toYaml . | nindent 12 }} + {{- end }} {{- end }} {{- if .Values.networkPolicy.ingress }} ingress: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/role.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/role.yaml index df8ac9a7..4b5edd97 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/role.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/role.yaml @@ -1,5 +1,5 @@ {{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}} -apiVersion: {{ include "grafana.rbac.apiVersion" . }} +apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: {{ include "grafana.fullname" . }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/rolebinding.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/rolebinding.yaml index cc07bd9a..58f77c6b 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/rolebinding.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/rolebinding.yaml @@ -1,5 +1,5 @@ {{- if .Values.rbac.create }} -apiVersion: {{ include "grafana.rbac.apiVersion" . }} +apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: {{ include "grafana.fullname" . }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/service.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/service.yaml index 43d360b5..9102c1ee 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/service.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/service.yaml @@ -36,6 +36,9 @@ spec: externalIPs: {{- toYaml . | nindent 4 }} {{- end }} + {{- with .Values.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ . }} + {{- end }} ports: - name: {{ .Values.service.portName }} port: {{ .Values.service.port }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/tests/test.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/tests/test.yaml index 9fb88426..15067ae3 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/tests/test.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/templates/tests/test.yaml @@ -34,7 +34,7 @@ spec: {{- end }} containers: - name: {{ .Release.Name }}-test - image: "{{ .Values.testFramework.image}}:{{ .Values.testFramework.tag }}" + image: "{{ .Values.global.imageRegistry | default .Values.testFramework.image.registry }}/{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}" command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"] volumeMounts: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/values.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/values.yaml index 017650eb..07502cc5 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/values.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/grafana/values.yaml @@ -1,4 +1,7 @@ global: + # -- Overrides the Docker registry globally for all images + imageRegistry: null + # To help compatibility with other charts which use global.imagePullSecrets. # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). # Can be tempalted. @@ -16,7 +19,8 @@ global: rbac: create: true ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true) - # useExistingRole: name-of-some-(cluster)role + # useExistingRole: name-of-some-role + # useExistingClusterRole: name-of-some-clusterRole pspEnabled: false pspUseAppArmor: false namespaced: false @@ -57,6 +61,7 @@ autoscaling: ## See `kubectl explain poddisruptionbudget.spec` for more ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ podDisruptionBudget: {} +# apiVersion: "" # minAvailable: 1 # maxUnavailable: 1 @@ -84,7 +89,10 @@ livenessProbe: # schedulerName: "default-scheduler" image: - repository: docker.io/grafana/grafana + # -- The Docker registry + registry: docker.io + # -- Docker image repository + repository: grafana/grafana # Overrides the Grafana image tag whose default is the chart appVersion tag: "" sha: "" @@ -100,8 +108,11 @@ image: testFramework: enabled: true - image: docker.io/bats/bats - tag: "v1.4.1" + image: + # -- The Docker registry + registry: docker.io + repository: bats/bats + tag: "v1.4.1" imagePullPolicy: IfNotPresent securityContext: {} @@ -144,7 +155,9 @@ extraLabels: {} # priorityClassName: downloadDashboardsImage: - repository: docker.io/curlimages/curl + # -- The Docker registry + registry: docker.io + repository: curlimages/curl tag: 7.85.0 sha: "" pullPolicy: IfNotPresent @@ -202,7 +215,7 @@ serviceMonitor: path: /metrics # namespace: monitoring (defaults to use the namespace this chart is deployed to) labels: {} - interval: 1m + interval: 30s scheme: http tlsConfig: {} scrapeTimeout: 30s @@ -214,7 +227,6 @@ extraExposePorts: [] # - name: keycloak # port: 8080 # targetPort: 8080 - # type: ClusterIP # overrides pod.spec.hostAliases in the grafana deployment's pods hostAliases: [] @@ -360,7 +372,9 @@ initChownData: ## initChownData container image ## image: - repository: docker.io/library/busybox + # -- The Docker registry + registry: docker.io + repository: library/busybox tag: "1.31.1" sha: "" pullPolicy: IfNotPresent @@ -617,21 +631,22 @@ alerting: {} # labels: # team: sre_team_1 # contactpoints.yaml: - # apiVersion: 1 - # contactPoints: - # - orgId: 1 - # name: cp_1 - # receivers: - # - uid: first_uid - # type: pagerduty - # settings: - # integrationKey: XXX - # severity: critical - # class: ping failure - # component: Grafana - # group: app-stack - # summary: | - # {{ `{{ include "default.message" . }}` }} + # secret: + # apiVersion: 1 + # contactPoints: + # - orgId: 1 + # name: cp_1 + # receivers: + # - uid: first_uid + # type: pagerduty + # settings: + # integrationKey: XXX + # severity: critical + # class: ping failure + # component: Grafana + # group: app-stack + # summary: | + # {{ `{{ include "default.message" . }}` }} ## Configure notifiers ## ref: http://docs.grafana.org/administration/provisioning/#alert-notification-channels @@ -793,8 +808,10 @@ smtp: ## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards sidecar: image: - repository: quay.io/kiwigrid/k8s-sidecar - tag: 1.24.6 + # -- The Docker registry + registry: quay.io + repository: kiwigrid/k8s-sidecar + tag: 1.25.2 sha: "" imagePullPolicy: IfNotPresent resources: {} @@ -853,7 +870,9 @@ sidecar: # Absolute path to shell script to execute after a alert got reloaded script: null skipReload: false - # Deploy the alert sidecar as an initContainer in addition to a container. + # This is needed if skipReload is true, to load any alerts defined at startup time. + # Deploy the alert sidecar as an initContainer. + initAlerts: false # Additional alert sidecar volume mounts extraMounts: [] # Sets the size limit of the alert sidecar emptyDir volume @@ -1064,8 +1083,10 @@ imageRenderer: targetMemory: "" behavior: {} image: + # -- The Docker registry + registry: docker.io # image-renderer Image repository - repository: docker.io/grafana/grafana-image-renderer + repository: grafana/grafana-image-renderer # image-renderer Image tag tag: latest # image-renderer Image sha (optional) @@ -1105,6 +1126,8 @@ imageRenderer: drop: ['ALL'] allowPrivilegeEscalation: false readOnlyRootFilesystem: true + ## image-renderer pod annotation + podAnnotations: {} # image-renderer deployment Host Aliases hostAliases: [] # image-renderer deployment priority class @@ -1218,14 +1241,25 @@ networkPolicy: ## created allowing grafana to connect to external data sources from kubernetes cluster. enabled: false ## + ## @param networkPolicy.egress.blockDNSResolution When enabled, DNS resolution will be blocked + ## for all pods in the grafana namespace. + blockDNSResolution: false + ## ## @param networkPolicy.egress.ports Add individual ports to be allowed by the egress ports: [] ## Add ports to the egress by specifying - port: ## E.X. - ## ports: - ## - port: 80 - ## - port: 443 - ## + ## - port: 80 + ## - port: 443 + ## + ## @param networkPolicy.egress.to Allow egress traffic to specific destinations + to: [] + ## Add destinations to the egress by specifying - ipBlock: + ## E.X. + ## to: + ## - namespaceSelector: + ## matchExpressions: + ## - {key: role, operator: In, values: [grafana]} ## ## ## diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/Chart.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/Chart.yaml index 4361a8af..4342ac86 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/Chart.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/Chart.yaml @@ -4,7 +4,7 @@ annotations: - name: Chart Source url: https://github.com/prometheus-community/helm-charts apiVersion: v2 -appVersion: 2.9.2 +appVersion: 2.10.1 description: Install kube-state-metrics to generate and expose cluster-level metrics home: https://github.com/kubernetes/kube-state-metrics/ keywords: @@ -23,4 +23,4 @@ name: kube-state-metrics sources: - https://github.com/kubernetes/kube-state-metrics/ type: application -version: 5.10.1 +version: 5.15.2 diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/crs-configmap.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/crs-configmap.yaml index 72986a60..d38a75a5 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/crs-configmap.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/crs-configmap.yaml @@ -3,6 +3,13 @@ apiVersion: v1 kind: ConfigMap metadata: name: {{ template "kube-state-metrics.fullname" . }}-customresourcestate-config + namespace: {{ template "kube-state-metrics.namespace" . }} + labels: + {{- include "kube-state-metrics.labels" . | indent 4 }} + {{- if .Values.annotations }} + annotations: + {{ toYaml .Values.annotations | nindent 4 }} + {{- end }} data: config.yaml: | {{- toYaml .Values.customResourceState.config | nindent 4 }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/deployment.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/deployment.yaml index 1ee76bd5..2aedc920 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/deployment.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/deployment.yaml @@ -18,6 +18,11 @@ spec: matchLabels: {{- include "kube-state-metrics.selectorLabels" . | indent 6 }} replicas: {{ .Values.replicas }} + {{- if not .Values.autosharding.enabled }} + strategy: + type: {{ .Values.updateStrategy | default "RollingUpdate" }} + {{- end }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} {{- if .Values.autosharding.enabled }} serviceName: {{ template "kube-state-metrics.fullname" . }} volumeClaimTemplates: [] @@ -39,6 +44,10 @@ spec: {{- if .Values.priorityClassName }} priorityClassName: {{ .Values.priorityClassName }} {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- toYaml . | nindent 6 }} + {{- end }} containers: {{- $httpPort := ternary 9090 (.Values.service.port | default 8080) .Values.kubeRBACProxy.enabled}} {{- $telemetryPort := ternary 9091 (.Values.selfMonitor.telemetryPort | default 8081) .Values.kubeRBACProxy.enabled}} @@ -235,6 +244,9 @@ spec: {{- end }} {{- end }} {{- end }} + {{- with .Values.containers }} + {{- toYaml . | nindent 6 }} + {{- end }} {{- if or .Values.imagePullSecrets .Values.global.imagePullSecrets }} imagePullSecrets: {{- include "kube-state-metrics.imagePullSecrets" (dict "Values" .Values "imagePullSecrets" .Values.imagePullSecrets) | indent 8 }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/rbac-configmap.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/rbac-configmap.yaml index b0a511e9..671dc9d6 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/rbac-configmap.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/rbac-configmap.yaml @@ -4,6 +4,12 @@ kind: ConfigMap metadata: name: {{ template "kube-state-metrics.fullname" . }}-rbac-config namespace: {{ template "kube-state-metrics.namespace" . }} + labels: + {{- include "kube-state-metrics.labels" . | indent 4 }} + {{- if .Values.annotations }} + annotations: + {{ toYaml .Values.annotations | nindent 4 }} + {{- end }} data: config-file.yaml: |+ authorization: @@ -13,4 +19,4 @@ data: resource: services subresource: {{ template "kube-state-metrics.fullname" . }} name: {{ template "kube-state-metrics.fullname" . }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/servicemonitor.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/servicemonitor.yaml index f98b3f36..e2cde649 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/servicemonitor.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/templates/servicemonitor.yaml @@ -7,11 +7,11 @@ metadata: labels: {{- include "kube-state-metrics.labels" . | indent 4 }} {{- with .Values.prometheus.monitor.additionalLabels }} - {{- toYaml . | nindent 4 }} + {{- tpl (toYaml . | nindent 4) $ }} {{- end }} {{- with .Values.prometheus.monitor.annotations }} annotations: - {{- toYaml . | nindent 4 }} + {{- tpl (toYaml . | nindent 4) $ }} {{- end }} spec: jobLabel: {{ default "app.kubernetes.io/name" .Values.prometheus.monitor.jobLabel }} @@ -24,6 +24,13 @@ spec: {{- toYaml . | trim | nindent 4 }} {{- end }} {{- include "servicemonitor.scrapeLimits" .Values.prometheus.monitor | indent 2 }} + {{- if .Values.prometheus.monitor.namespaceSelector }} + namespaceSelector: + matchNames: + {{- with .Values.prometheus.monitor.namespaceSelector }} + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} selector: matchLabels: {{- with .Values.prometheus.monitor.selectorOverride }} @@ -42,6 +49,9 @@ spec: {{- if .Values.prometheus.monitor.proxyUrl }} proxyUrl: {{ .Values.prometheus.monitor.proxyUrl}} {{- end }} + {{- if .Values.prometheus.monitor.enableHttp2 }} + enableHttp2: {{ .Values.prometheus.monitor.enableHttp2}} + {{- end }} {{- if .Values.prometheus.monitor.honorLabels }} honorLabels: true {{- end }} @@ -78,6 +88,9 @@ spec: {{- if .Values.prometheus.monitor.proxyUrl }} proxyUrl: {{ .Values.prometheus.monitor.proxyUrl}} {{- end }} + {{- if .Values.prometheus.monitor.enableHttp2 }} + enableHttp2: {{ .Values.prometheus.monitor.enableHttp2}} + {{- end }} {{- if .Values.prometheus.monitor.honorLabels }} honorLabels: true {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/values.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/values.yaml index 011f14c0..ee6e1a9f 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/values.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/kube-state-metrics/values.yaml @@ -37,6 +37,13 @@ autosharding: replicas: 1 +# Change the deployment strategy when autosharding is disabled +# updateStrategy: Recreate + +# Number of old history to retain to allow rollback +# Default Kubernetes value is set to 10 +revisionHistoryLimit: 10 + # List of additional cli arguments to configure kube-state-metrics # for example: --enable-gzip-encoding, --log-file, etc. # all the possible args can be found here: https://github.com/kubernetes/kube-state-metrics/blob/master/docs/cli-arguments.md @@ -142,6 +149,7 @@ prometheus: annotations: {} additionalLabels: {} namespace: "" + namespaceSelector: [] jobLabel: "" targetLabels: [] podTargetLabels: [] @@ -167,6 +175,8 @@ prometheus: labelValueLengthLimit: 0 scrapeTimeout: "" proxyUrl: "" + ## Whether to enable HTTP2 for servicemonitor + # enableHttp2: false selectorOverride: {} honorLabels: false metricRelabelings: [] @@ -434,3 +444,13 @@ extraManifests: [] # name: prometheus-extra # data: # extra-data: "value" + +## Containers allows injecting additional containers. +containers: [] + # - name: crd-init + # image: kiwigrid/k8s-sidecar:latest + +## InitContainers allows injecting additional initContainers. +initContainers: [] + # - name: crd-sidecar + # image: kiwigrid/k8s-sidecar:latest diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/Chart.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/Chart.yaml index 9825e857..ae934c9f 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/Chart.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/Chart.yaml @@ -4,7 +4,7 @@ annotations: - name: Chart Source url: https://github.com/prometheus-community/helm-charts apiVersion: v2 -appVersion: 1.6.0 +appVersion: 1.7.0 description: A Helm chart for prometheus node-exporter home: https://github.com/prometheus/node_exporter/ keywords: @@ -22,4 +22,4 @@ name: prometheus-node-exporter sources: - https://github.com/prometheus/node_exporter/ type: application -version: 4.21.0 +version: 4.24.0 diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/README.md b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/README.md index 5dbfa328..ef838441 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/README.md +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/README.md @@ -1,18 +1,18 @@ -# Prometheus `Node Exporter` +# Prometheus Node Exporter Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written in Go with pluggable metric collectors. -This chart bootstraps a prometheus [`Node Exporter`](http://github.com/prometheus/node_exporter) daemonset on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. +This chart bootstraps a Prometheus [Node Exporter](http://github.com/prometheus/node_exporter) daemonset on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. ## Get Repository Info - + ```console helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update ``` -_See [`helm repo`](https://helm.sh/docs/helm/helm_repo/) for command documentation._ - +_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ + ## Install Chart ```console @@ -36,15 +36,11 @@ _See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command doc ## Upgrading Chart ```console -helm upgrade [RELEASE_NAME] [CHART] --install +helm upgrade [RELEASE_NAME] prometheus-community/prometheus-node-exporter --install ``` _See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ -### 4.16 to 4.17+ - -`containerSecurityContext.readOnlyRootFilesystem` is set to `true` by default. - ### 3.x to 4.x Starting from version 4.0.0, the `node exporter` chart is using the [Kubernetes recommended labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). Therefore you have to delete the daemonset before you upgrade. diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/clusterrole.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/clusterrole.yaml index 1fd91150..c256dba7 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/clusterrole.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/clusterrole.yaml @@ -3,7 +3,6 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: {{ include "prometheus-node-exporter.fullname" . }} - namespace: {{ include "prometheus-node-exporter.namespace" . }} labels: {{- include "prometheus-node-exporter.labels" . | nindent 4 }} rules: diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/daemonset.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/daemonset.yaml index c8a71add..a5116a89 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/daemonset.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/daemonset.yaml @@ -13,6 +13,7 @@ spec: selector: matchLabels: {{- include "prometheus-node-exporter.selectorLabels" . | nindent 6 }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} {{- with .Values.updateStrategy }} updateStrategy: {{- toYaml . | nindent 4 }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/extra-manifests.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/extra-manifests.yaml index 567f7bf3..2b21b710 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/extra-manifests.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/extra-manifests.yaml @@ -1,4 +1,4 @@ {{ range .Values.extraManifests }} --- -{{ tpl (toYaml .) $ }} +{{ tpl . $ }} {{ end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/service.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/service.yaml index 068a6bc7..a065e46e 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/service.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/templates/service.yaml @@ -1,3 +1,4 @@ +{{- if .Values.service.enabled }} apiVersion: v1 kind: Service metadata: @@ -25,3 +26,4 @@ spec: name: {{ .Values.service.portName }} selector: {{- include "prometheus-node-exporter.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/values.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/values.yaml index 35271214..6e4665c1 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/values.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-node-exporter/values.yaml @@ -14,6 +14,10 @@ imagePullSecrets: [] nameOverride: "" fullnameOverride: "" +# Number of old history to retain to allow rollback +# Default Kubernetes value is set to 10 +revisionHistoryLimit: 10 + global: # To help compatibility with other charts which use global.imagePullSecrets. # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style). @@ -38,7 +42,7 @@ kubeRBACProxy: image: registry: quay.io repository: brancz/kube-rbac-proxy - tag: v0.14.0 + tag: v0.15.0 sha: "" pullPolicy: IfNotPresent @@ -65,6 +69,7 @@ kubeRBACProxy: # memory: 32Mi service: + enabled: true type: ClusterIP port: 9100 targetPort: 9100 @@ -466,7 +471,8 @@ verticalPodAutoscaler: # Extra manifests to deploy as an array extraManifests: [] - # - apiVersion: v1 + # - | + # apiVersion: v1 # kind: ConfigMap # metadata: # name: prometheus-extra diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/Chart.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/Chart.yaml index bba168f7..f9976cfb 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/Chart.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/Chart.yaml @@ -14,4 +14,4 @@ name: prometheus-windows-exporter sources: - https://github.com/prometheus-community/windows_exporter/ type: application -version: 0.1.1 +version: 0.1.2 diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/values.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/values.yaml index 17cb0d15..4dc17711 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/values.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/charts/prometheus-windows-exporter/values.yaml @@ -12,7 +12,7 @@ image: config: |- collectors: - enabled: '[defaults],container' + enabled: '[defaults],memory,container' imagePullSecrets: [] # - name: "image-pull-secret" diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/alertmanager.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/alertmanager.yaml index 7c2a298b..52b49fc7 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/alertmanager.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/alertmanager.yaml @@ -179,4 +179,10 @@ spec: {{- if .Values.alertmanager.alertmanagerSpec.minReadySeconds }} minReadySeconds: {{ .Values.alertmanager.alertmanagerSpec.minReadySeconds }} {{- end }} +{{- with .Values.alertmanager.alertmanagerSpec.additionalConfig }} + {{- tpl (toYaml .) $ | nindent 2 }} +{{- end }} +{{- with .Values.alertmanager.alertmanagerSpec.additionalConfigString }} + {{- tpl . $ | nindent 2 }} +{{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/service.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/service.yaml index 1905c6e9..f772ec62 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/service.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/service.yaml @@ -1,3 +1,4 @@ +{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} {{- if .Values.alertmanager.enabled }} apiVersion: v1 kind: Service @@ -44,6 +45,9 @@ spec: targetPort: {{ .Values.alertmanager.service.targetPort }} protocol: TCP - name: reloader-web + {{- if semverCompare ">=1.20.0-0" $kubeTargetVersion }} + appProtocol: http + {{- end }} port: 8080 targetPort: reloader-web {{- if .Values.alertmanager.service.additionalPorts }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/servicemonitor.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/servicemonitor.yaml index 8d507ba5..99387cab 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/servicemonitor.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/alertmanager/servicemonitor.yaml @@ -36,17 +36,15 @@ spec: bearerTokenFile: {{ .Values.alertmanager.serviceMonitor.bearerTokenFile }} {{- end }} {{- if .Values.alertmanager.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.alertmanager.serviceMonitor.tlsConfig | nindent 6 }} + tlsConfig: {{- toYaml .Values.alertmanager.serviceMonitor.tlsConfig | nindent 6 }} {{- end }} path: "{{ trimSuffix "/" .Values.alertmanager.alertmanagerSpec.routePrefix }}/metrics" -{{- if .Values.alertmanager.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.alertmanager.serviceMonitor.metricRelabelings | indent 6) . }} -{{- end }} -{{- if .Values.alertmanager.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.alertmanager.serviceMonitor.relabelings | indent 6 }} -{{- end }} + {{- if .Values.alertmanager.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- tpl (toYaml .Values.alertmanager.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.alertmanager.serviceMonitor.relabelings }} + relabelings: {{- toYaml .Values.alertmanager.serviceMonitor.relabelings | nindent 6 }} + {{- end }} - port: reloader-web {{- if .Values.alertmanager.serviceMonitor.interval }} interval: {{ .Values.alertmanager.serviceMonitor.interval }} @@ -54,22 +52,37 @@ spec: {{- if .Values.alertmanager.serviceMonitor.proxyUrl }} proxyUrl: {{ .Values.alertmanager.serviceMonitor.proxyUrl}} {{- end }} - {{- if .Values.alertmanager.serviceMonitor.scheme }} - scheme: {{ .Values.alertmanager.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.alertmanager.serviceMonitor.bearerTokenFile }} - {{- end }} - {{- if .Values.alertmanager.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.alertmanager.serviceMonitor.tlsConfig | nindent 6 }} - {{- end }} + scheme: http path: "/metrics" -{{- if .Values.alertmanager.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.alertmanager.serviceMonitor.metricRelabelings | indent 6) . }} -{{- end }} -{{- if .Values.alertmanager.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.alertmanager.serviceMonitor.relabelings | indent 6 }} -{{- end }} + {{- if .Values.alertmanager.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- tpl (toYaml .Values.alertmanager.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.alertmanager.serviceMonitor.relabelings }} + relabelings: {{- toYaml .Values.alertmanager.serviceMonitor.relabelings | nindent 6 }} + {{- end }} + {{- range .Values.alertmanager.serviceMonitor.additionalEndpoints }} + - port: {{ .port }} + {{- if or $.Values.alertmanager.serviceMonitor.interval .interval }} + interval: {{ default $.Values.alertmanager.serviceMonitor.interval .interval }} + {{- end }} + {{- if or $.Values.alertmanager.serviceMonitor.proxyUrl .proxyUrl }} + proxyUrl: {{ default $.Values.alertmanager.serviceMonitor.proxyUrl .proxyUrl }} + {{- end }} + {{- if or $.Values.alertmanager.serviceMonitor.scheme .scheme }} + scheme: {{ default $.Values.alertmanager.serviceMonitor.scheme .scheme }} + {{- end }} + {{- if or $.Values.alertmanager.serviceMonitor.bearerTokenFile .bearerTokenFile }} + bearerTokenFile: {{ default $.Values.alertmanager.serviceMonitor.bearerTokenFile .bearerTokenFile }} + {{- end }} + {{- if or $.Values.alertmanager.serviceMonitor.tlsConfig .tlsConfig }} + tlsConfig: {{- default $.Values.alertmanager.serviceMonitor.tlsConfig .tlsConfig | toYaml | nindent 6 }} + {{- end }} + path: {{ .path }} + {{- if or $.Values.alertmanager.serviceMonitor.metricRelabelings .metricRelabelings }} + metricRelabelings: {{- tpl (default $.Values.alertmanager.serviceMonitor.metricRelabelings .metricRelabelings | toYaml | nindent 6) . }} + {{- end }} + {{- if or $.Values.alertmanager.serviceMonitor.relabelings .relabelings }} + relabelings: {{- default $.Values.alertmanager.serviceMonitor.relabelings .relabelings | toYaml | nindent 6 }} + {{- end }} + {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml index 10de3395..001e8fb1 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml @@ -12,6 +12,10 @@ metadata: {{- include "kube-prometheus-stack.labels" . | indent 4 }} spec: {{- include "servicemonitor.scrapeLimits" .Values.kubelet.serviceMonitor | nindent 2 }} + {{- with .Values.kubelet.serviceMonitor.attachMetadata }} + attachMetadata: + {{- toYaml . | nindent 4 }} + {{- end }} endpoints: {{- if .Values.kubelet.serviceMonitor.https }} - port: https-metrics @@ -29,7 +33,8 @@ spec: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} {{- if .Values.kubelet.serviceMonitor.metricRelabelings }} metricRelabelings: {{ tpl (toYaml .Values.kubelet.serviceMonitor.metricRelabelings | indent 4) . }} @@ -51,7 +56,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true @@ -78,7 +84,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true @@ -105,7 +112,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true @@ -130,7 +138,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} {{- if .Values.kubelet.serviceMonitor.metricRelabelings }} metricRelabelings: {{ tpl (toYaml .Values.kubelet.serviceMonitor.metricRelabelings | indent 4) . }} @@ -151,7 +160,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} {{- if .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings }} metricRelabelings: {{ tpl (toYaml .Values.kubelet.serviceMonitor.cAdvisorMetricRelabelings | indent 4) . }} @@ -172,7 +182,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} {{- if .Values.kubelet.serviceMonitor.probesMetricRelabelings }} metricRelabelings: {{ tpl (toYaml .Values.kubelet.serviceMonitor.probesMetricRelabelings | indent 4) . }} @@ -194,7 +205,8 @@ spec: {{- if .Values.kubelet.serviceMonitor.scrapeTimeout }} scrapeTimeout: {{ .Values.kubelet.serviceMonitor.scrapeTimeout }} {{- end }} - honorLabels: true + honorLabels: {{ .Values.kubelet.serviceMonitor.honorLabels }} + honorTimestamps: {{ .Values.kubelet.serviceMonitor.honorTimestamps }} {{- if .Values.kubelet.serviceMonitor.resourceMetricRelabelings }} metricRelabelings: {{ tpl (toYaml .Values.kubelet.serviceMonitor.resourceMetricRelabelings | indent 4) . }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/grafana/configmaps-datasources.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/grafana/configmaps-datasources.yaml index dc4dc20f..3d4f3b17 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/grafana/configmaps-datasources.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/grafana/configmaps-datasources.yaml @@ -55,8 +55,8 @@ data: timeInterval: {{ $scrapeInterval }} {{- if $.Values.grafana.sidecar.datasources.exemplarTraceIdDestinations }} exemplarTraceIdDestinations: - - datasourceUid: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.datasourceUid }} - name: {{ .Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.traceIdLabelName }} + - datasourceUid: {{ $.Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.datasourceUid }} + name: {{ $.Values.grafana.sidecar.datasources.exemplarTraceIdDestinations.traceIdLabelName }} {{- end }} {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml index fff236f1..c4517b6b 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/admission-webhooks/job-patch/ciliumnetworkpolicy-createSecret.yaml @@ -6,7 +6,7 @@ metadata: name: {{ template "kube-prometheus-stack.fullname" . }}-admission-create namespace: {{ template "kube-prometheus-stack.namespace" . }} annotations: - helm.sh/hook: post-install,post-upgrade + helm.sh/hook: pre-install,pre-upgrade helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded ## Ensure this is run before the job helm.sh/hook-weight: "-5" diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/ciliumnetworkpolicy.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/ciliumnetworkpolicy.yaml index af0fa57f..b75dcfd9 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/ciliumnetworkpolicy.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/ciliumnetworkpolicy.yaml @@ -32,8 +32,10 @@ spec: - port: "8080" {{- end }} protocol: "TCP" + {{- if not .Values.prometheusOperator.tls.enabled }} rules: http: - method: "GET" path: "/metrics" + {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/clusterrole.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/clusterrole.yaml index 32272055..623d1b3c 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/clusterrole.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/clusterrole.yaml @@ -84,6 +84,12 @@ rules: - get - list - watch +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get {{- if .Capabilities.APIVersions.Has "discovery.k8s.io/v1/EndpointSlice" }} - apiGroups: - discovery.k8s.io diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/deployment.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/deployment.yaml index 1017a00b..67d0024d 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/deployment.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus-operator/deployment.yaml @@ -91,10 +91,10 @@ spec: {{- else }} - --prometheus-config-reloader={{ $configReloaderRegistry }}/{{ .Values.prometheusOperator.prometheusConfigReloader.image.repository }}:{{ .Values.prometheusOperator.prometheusConfigReloader.image.tag | default .Chart.AppVersion }} {{- end }} - - --config-reloader-cpu-request={{ .Values.prometheusOperator.prometheusConfigReloader.resources.requests.cpu }} - - --config-reloader-cpu-limit={{ .Values.prometheusOperator.prometheusConfigReloader.resources.limits.cpu }} - - --config-reloader-memory-request={{ .Values.prometheusOperator.prometheusConfigReloader.resources.requests.memory }} - - --config-reloader-memory-limit={{ .Values.prometheusOperator.prometheusConfigReloader.resources.limits.memory }} + - --config-reloader-cpu-request={{ (((.Values.prometheusOperator.prometheusConfigReloader.resources).requests).cpu) | default 0 }} + - --config-reloader-cpu-limit={{ (((.Values.prometheusOperator.prometheusConfigReloader.resources).limits).cpu) | default 0 }} + - --config-reloader-memory-request={{ (((.Values.prometheusOperator.prometheusConfigReloader.resources).requests).memory) | default 0 }} + - --config-reloader-memory-limit={{ (((.Values.prometheusOperator.prometheusConfigReloader.resources).limits).memory) | default 0 }} {{- if .Values.prometheusOperator.prometheusConfigReloader.enableProbe }} - --enable-config-reloader-probes=true {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/_rules.tpl b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/_rules.tpl index e8baf98e..5fe564f3 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/_rules.tpl +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/_rules.tpl @@ -8,7 +8,13 @@ rules: - "config-reloaders" - "etcd" - "general.rules" - - "k8s.rules" + - "k8s.rules.container_cpu_usage_seconds_total" + - "k8s.rules.container_memory_cache" + - "k8s.rules.container_memory_rss" + - "k8s.rules.container_memory_swap" + - "k8s.rules.container_memory_working_set_bytes" + - "k8s.rules.container_resource" + - "k8s.rules.pod_owner" - "kube-apiserver-availability.rules" - "kube-apiserver-burnrate.rules" - "kube-apiserver-histogram.rules" @@ -33,4 +39,6 @@ rules: - "node-network" - "prometheus-operator" - "prometheus" + - "windows.node.rules" + - "windows.pod.rules" {{- end }} \ No newline at end of file diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/ingressThanosSidecar.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/ingressThanosSidecar.yaml index 10623cb4..a3da99fa 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/ingressThanosSidecar.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/ingressThanosSidecar.yaml @@ -1,6 +1,6 @@ {{- if and .Values.prometheus.enabled .Values.prometheus.thanosIngress.enabled }} {{- $pathType := .Values.prometheus.thanosIngress.pathType | default "" }} -{{- $serviceName := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "prometheus" }} +{{- $serviceName := printf "%s-%s" (include "kube-prometheus-stack.fullname" .) "thanos-discovery" }} {{- $thanosPort := .Values.prometheus.thanosIngress.servicePort -}} {{- $routePrefix := list .Values.prometheus.prometheusSpec.routePrefix }} {{- $paths := .Values.prometheus.thanosIngress.paths | default $routePrefix -}} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml index 6c092005..238bc6e3 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml @@ -356,7 +356,18 @@ spec: {{- if not .Values.prometheus.agentMode }} {{- if .Values.prometheus.prometheusSpec.thanos }} thanos: -{{ toYaml .Values.prometheus.prometheusSpec.thanos | indent 4 }} +{{- with (omit .Values.prometheus.prometheusSpec.thanos "objectStorageConfig")}} +{{ toYaml . | indent 4 }} +{{- end }} +{{- if .Values.prometheus.prometheusSpec.thanos.objectStorageConfig.existingSecret }} + objectStorageConfig: + key: "{{.Values.prometheus.prometheusSpec.thanos.objectStorageConfig.existingSecret.key }}" + name: "{{.Values.prometheus.prometheusSpec.thanos.objectStorageConfig.existingSecret.name }}" +{{- else if .Values.prometheus.prometheusSpec.thanos.objectStorageConfig.secret}} + objectStorageConfig: + key: object-storage-configs.yaml + name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus +{{- end }} {{- end }} {{- if .Values.prometheus.prometheusSpec.disableCompaction }} disableCompaction: {{ .Values.prometheus.prometheusSpec.disableCompaction }} @@ -441,4 +452,10 @@ spec: tracingConfig: {{ toYaml .Values.prometheus.prometheusSpec.tracingConfig | indent 4 }} {{- end }} +{{- with .Values.prometheus.prometheusSpec.additionalConfig }} + {{- tpl (toYaml .) $ | nindent 2 }} +{{- end }} +{{- with .Values.prometheus.prometheusSpec.additionalConfigString }} + {{- tpl . $ | nindent 2 }} +{{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/secret.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/secret.yaml new file mode 100644 index 00000000..e88d6977 --- /dev/null +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/secret.yaml @@ -0,0 +1,17 @@ +{{- if .Values.prometheus.enabled }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "kube-prometheus-stack.fullname" . }}-prometheus + namespace: {{ template "kube-prometheus-stack.namespace" . }} + labels: + app: {{ template "kube-prometheus-stack.name" . }}-prometheus + app.kubernetes.io/component: prometheus +{{ include "kube-prometheus-stack.labels" . | indent 4 }} +data: + {{- with .Values.prometheus.prometheusSpec.thanos.objectStorageConfig }} + {{- if and .secret (not .existingSecret) }} + object-storage-configs.yaml: {{ toYaml .secret | b64enc | quote }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/service.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/service.yaml index ec9110d6..7834dedd 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/service.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/service.yaml @@ -1,3 +1,4 @@ +{{- $kubeTargetVersion := default .Capabilities.KubeVersion.GitVersion .Values.kubeTargetVersionOverride }} {{- if .Values.prometheus.enabled }} apiVersion: v1 kind: Service @@ -43,6 +44,9 @@ spec: port: {{ .Values.prometheus.service.port }} targetPort: {{ .Values.prometheus.service.targetPort }} - name: reloader-web + {{- if semverCompare "> 1.20.0-0" $kubeTargetVersion }} + appProtocol: http + {{- end }} port: 8080 targetPort: reloader-web {{- if .Values.prometheus.thanosIngress.enabled }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitor.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitor.yaml index 12f66b80..e05f6c11 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitor.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitor.yaml @@ -29,40 +29,53 @@ spec: scheme: {{ .Values.prometheus.serviceMonitor.scheme }} {{- end }} {{- if .Values.prometheus.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.prometheus.serviceMonitor.tlsConfig | nindent 6 }} + tlsConfig: {{- toYaml .Values.prometheus.serviceMonitor.tlsConfig | nindent 6 }} {{- end }} {{- if .Values.prometheus.serviceMonitor.bearerTokenFile }} bearerTokenFile: {{ .Values.prometheus.serviceMonitor.bearerTokenFile }} {{- end }} path: "{{ trimSuffix "/" .Values.prometheus.prometheusSpec.routePrefix }}/metrics" -{{- if .Values.prometheus.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.prometheus.serviceMonitor.metricRelabelings | indent 6) . }} -{{- end }} -{{- if .Values.prometheus.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.prometheus.serviceMonitor.relabelings | indent 6 }} -{{- end }} + {{- if .Values.prometheus.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- tpl (toYaml .Values.prometheus.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.prometheus.serviceMonitor.relabelings }} + relabelings: {{- toYaml .Values.prometheus.serviceMonitor.relabelings | nindent 6 }} + {{- end }} - port: reloader-web {{- if .Values.prometheus.serviceMonitor.interval }} interval: {{ .Values.prometheus.serviceMonitor.interval }} {{- end }} - {{- if .Values.prometheus.serviceMonitor.scheme }} - scheme: {{ .Values.prometheus.serviceMonitor.scheme }} - {{- end }} - {{- if .Values.prometheus.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.prometheus.serviceMonitor.tlsConfig | nindent 6 }} - {{- end }} - {{- if .Values.prometheus.serviceMonitor.bearerTokenFile }} - bearerTokenFile: {{ .Values.prometheus.serviceMonitor.bearerTokenFile }} - {{- end }} + scheme: http path: "/metrics" -{{- if .Values.prometheus.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.prometheus.serviceMonitor.metricRelabelings | indent 6) . }} -{{- end }} -{{- if .Values.prometheus.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.prometheus.serviceMonitor.relabelings | indent 6 }} -{{- end }} + {{- if .Values.prometheus.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- tpl (toYaml .Values.prometheus.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.prometheus.serviceMonitor.relabelings }} + relabelings: {{- toYaml .Values.prometheus.serviceMonitor.relabelings | nindent 6 }} + {{- end }} + {{- range .Values.prometheus.serviceMonitor.additionalEndpoints }} + - port: {{ .port }} + {{- if or $.Values.prometheus.serviceMonitor.interval .interval }} + interval: {{ default $.Values.prometheus.serviceMonitor.interval .interval }} + {{- end }} + {{- if or $.Values.prometheus.serviceMonitor.proxyUrl .proxyUrl }} + proxyUrl: {{ default $.Values.prometheus.serviceMonitor.proxyUrl .proxyUrl }} + {{- end }} + {{- if or $.Values.prometheus.serviceMonitor.scheme .scheme }} + scheme: {{ default $.Values.prometheus.serviceMonitor.scheme .scheme }} + {{- end }} + {{- if or $.Values.prometheus.serviceMonitor.bearerTokenFile .bearerTokenFile }} + bearerTokenFile: {{ default $.Values.prometheus.serviceMonitor.bearerTokenFile .bearerTokenFile }} + {{- end }} + {{- if or $.Values.prometheus.serviceMonitor.tlsConfig .tlsConfig }} + tlsConfig: {{- default $.Values.prometheus.serviceMonitor.tlsConfig .tlsConfig | toYaml | nindent 6 }} + {{- end }} + path: {{ .path }} + {{- if or $.Values.prometheus.serviceMonitor.metricRelabelings .metricRelabelings }} + metricRelabelings: {{- tpl (default $.Values.prometheus.serviceMonitor.metricRelabelings .metricRelabelings | toYaml | nindent 6) . }} + {{- end }} + {{- if or $.Values.prometheus.serviceMonitor.relabelings .relabelings }} + relabelings: {{- default $.Values.prometheus.serviceMonitor.relabelings .relabelings | toYaml | nindent 6 }} + {{- end }} + {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitors.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitors.yaml index 92a54123..a7a301ba 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitors.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/prometheus/servicemonitors.yaml @@ -35,5 +35,13 @@ items: podTargetLabels: {{ toYaml .podTargetLabels | indent 8 }} {{- end }} + {{- if .metricRelabelings }} + metricRelabelings: +{{ toYaml .metricRelabelings | indent 8 }} + {{- end }} + {{- if .relabelings }} + relabelings: +{{ toYaml .relabelings | indent 8 }} + {{- end }} {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/ruler.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/ruler.yaml index 505d68b0..ab2f9f74 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/ruler.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/ruler.yaml @@ -71,17 +71,27 @@ spec: alertmanagersUrl: {{ toYaml .Values.thanosRuler.thanosRulerSpec.alertmanagersUrl | indent 4 }} {{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig }} +{{- if .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig.existingSecret }} alertmanagersConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig | indent 4 }} + key: "{{.Values.thanosRuler.thanosRulerSpec.alertmanagersConfig.existingSecret.key }}" + name: "{{.Values.thanosRuler.thanosRulerSpec.alertmanagersConfig.existingSecret.name }}" +{{- else if .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig.secret }} + alertmanagersConfig: + key: alertmanager-configs.yaml + name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} {{- end }} {{- if .Values.thanosRuler.thanosRulerSpec.queryEndpoints }} queryEndpoints: {{ toYaml .Values.thanosRuler.thanosRulerSpec.queryEndpoints | indent 4 }} {{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.queryConfig }} +{{- if .Values.thanosRuler.thanosRulerSpec.queryConfig.existingSecret }} queryConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.queryConfig | indent 4 }} + key: "{{.Values.thanosRuler.thanosRulerSpec.queryConfig.existingSecret.key }}" + name: "{{.Values.thanosRuler.thanosRulerSpec.queryConfig.existingSecret.name }}" +{{- else if .Values.thanosRuler.thanosRulerSpec.queryConfig.secret }} + queryConfig: + key: query-configs.yaml + name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} {{- end }} {{- if .Values.thanosRuler.thanosRulerSpec.resources }} resources: @@ -98,17 +108,19 @@ spec: storage: {{ toYaml .Values.thanosRuler.thanosRulerSpec.storage | indent 4 }} {{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.objectStorageConfig }} +{{- if .Values.thanosRuler.thanosRulerSpec.objectStorageConfig.existingSecret }} objectStorageConfig: -{{ toYaml .Values.thanosRuler.thanosRulerSpec.objectStorageConfig | indent 4 }} + key: "{{.Values.thanosRuler.thanosRulerSpec.objectStorageConfig.existingSecret.key }}" + name: "{{.Values.thanosRuler.thanosRulerSpec.objectStorageConfig.existingSecret.name }}" +{{- else if .Values.thanosRuler.thanosRulerSpec.objectStorageConfig.secret }} + objectStorageConfig: + key: object-storage-configs.yaml + name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} {{- end }} {{- if .Values.thanosRuler.thanosRulerSpec.labels }} labels: {{ toYaml .Values.thanosRuler.thanosRulerSpec.labels | indent 4 }} {{- end }} -{{- if .Values.thanosRuler.thanosRulerSpec.objectStorageConfigFile }} - objectStorageConfigFile: {{ .Values.thanosRuler.thanosRulerSpec.objectStorageConfigFile }} -{{- end }} {{- if .Values.thanosRuler.thanosRulerSpec.podMetadata }} podMetadata: {{ toYaml .Values.thanosRuler.thanosRulerSpec.podMetadata | indent 4 }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/secret.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/secret.yaml new file mode 100644 index 00000000..acab7fd9 --- /dev/null +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/secret.yaml @@ -0,0 +1,26 @@ +{{- if .Values.thanosRuler.enabled }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "kube-prometheus-stack.thanosRuler.name" . }} + namespace: {{ template "kube-prometheus-stack.namespace" . }} + labels: + app: {{ include "kube-prometheus-stack.thanosRuler.name" . }} +{{ include "kube-prometheus-stack.labels" . | indent 4 }} +data: + {{- with .Values.thanosRuler.thanosRulerSpec.alertmanagersConfig }} + {{- if and .secret (not .existingSecret) }} + alertmanager-configs.yaml: {{ toYaml .secret | b64enc | quote }} + {{- end }} + {{- end }} + {{- with .Values.thanosRuler.thanosRulerSpec.objectStorageConfig }} + {{- if and .secret (not .existingSecret) }} + object-storage-configs.yaml: {{ toYaml .secret | b64enc | quote }} + {{- end }} + {{- end }} + {{- with .Values.thanosRuler.thanosRulerSpec.queryConfig }} + {{- if and .secret (not .existingSecret) }} + query-configs.yaml: {{ toYaml .secret | b64enc | quote }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/servicemonitor.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/servicemonitor.yaml index 7f72688a..83bd8ba2 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/servicemonitor.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/templates/thanos-ruler/servicemonitor.yaml @@ -35,15 +35,38 @@ spec: bearerTokenFile: {{ .Values.thanosRuler.serviceMonitor.bearerTokenFile }} {{- end }} {{- if .Values.thanosRuler.serviceMonitor.tlsConfig }} - tlsConfig: {{ toYaml .Values.thanosRuler.serviceMonitor.tlsConfig | nindent 6 }} + tlsConfig: {{- toYaml .Values.thanosRuler.serviceMonitor.tlsConfig | nindent 6 }} {{- end }} path: "{{ trimSuffix "/" .Values.thanosRuler.thanosRulerSpec.routePrefix }}/metrics" -{{- if .Values.thanosRuler.serviceMonitor.metricRelabelings }} - metricRelabelings: -{{ tpl (toYaml .Values.thanosRuler.serviceMonitor.metricRelabelings | indent 6) . }} -{{- end }} -{{- if .Values.thanosRuler.serviceMonitor.relabelings }} - relabelings: -{{ toYaml .Values.thanosRuler.serviceMonitor.relabelings | indent 6 }} -{{- end }} + {{- if .Values.thanosRuler.serviceMonitor.metricRelabelings }} + metricRelabelings: {{- tpl (toYaml .Values.thanosRuler.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.thanosRuler.serviceMonitor.relabelings }} + relabelings: {{- toYaml .Values.thanosRuler.serviceMonitor.relabelings | nindent 6 }} + {{- end }} + {{- range .Values.thanosRuler.serviceMonitor.additionalEndpoints }} + - port: {{ .port }} + {{- if or $.Values.thanosRuler.serviceMonitor.interval .interval }} + interval: {{ default $.Values.thanosRuler.serviceMonitor.interval .interval }} + {{- end }} + {{- if or $.Values.thanosRuler.serviceMonitor.proxyUrl .proxyUrl }} + proxyUrl: {{ default $.Values.thanosRuler.serviceMonitor.proxyUrl .proxyUrl }} + {{- end }} + {{- if or $.Values.thanosRuler.serviceMonitor.scheme .scheme }} + scheme: {{ default $.Values.thanosRuler.serviceMonitor.scheme .scheme }} + {{- end }} + {{- if or $.Values.thanosRuler.serviceMonitor.bearerTokenFile .bearerTokenFile }} + bearerTokenFile: {{ default $.Values.thanosRuler.serviceMonitor.bearerTokenFile .bearerTokenFile }} + {{- end }} + {{- if or $.Values.thanosRuler.serviceMonitor.tlsConfig .tlsConfig }} + tlsConfig: {{- default $.Values.thanosRuler.serviceMonitor.tlsConfig .tlsConfig | toYaml | nindent 6 }} + {{- end }} + path: {{ .path }} + {{- if or $.Values.thanosRuler.serviceMonitor.metricRelabelings .metricRelabelings }} + metricRelabelings: {{- tpl (default $.Values.thanosRuler.serviceMonitor.metricRelabelings .metricRelabelings | toYaml | nindent 6) . }} + {{- end }} + {{- if or $.Values.thanosRuler.serviceMonitor.relabelings .relabelings }} + relabelings: {{- default $.Values.thanosRuler.serviceMonitor.relabelings .relabelings | toYaml | nindent 6 }} + {{- end }} + {{- end }} {{- end }} diff --git a/charts/kubezero-metrics/charts/kube-prometheus-stack/values.yaml b/charts/kubezero-metrics/charts/kube-prometheus-stack/values.yaml index d6406bac..e1c62d87 100644 --- a/charts/kubezero-metrics/charts/kube-prometheus-stack/values.yaml +++ b/charts/kubezero-metrics/charts/kube-prometheus-stack/values.yaml @@ -10,7 +10,7 @@ nameOverride: "" ## namespaceOverride: "" -## Provide a k8s version to auto dashboard import script example: kubeTargetVersionOverride: 1.16.6 +## Provide a k8s version to auto dashboard import script example: kubeTargetVersionOverride: 1.26.6 ## kubeTargetVersionOverride: "" @@ -42,7 +42,12 @@ defaultRules: etcd: true configReloaders: true general: true - k8s: true + k8sContainerCpuUsageSecondsTotal: true + k8sContainerMemoryCache: true + k8sContainerMemoryRss: true + k8sContainerMemorySwap: true + k8sContainerResource: true + k8sPodOwner: true kubeApiserverAvailability: true kubeApiserverBurnrate: true kubeApiserverHistogram: true @@ -70,6 +75,9 @@ defaultRules: ## Reduce app namespace alert scope appNamespacesTarget: ".*" + ## Set keep_firing_for for all alerts + keepFiringFor: "" + ## Labels for default rules labels: {} ## Annotations for default rules @@ -87,7 +95,12 @@ defaultRules: etcd: {} configReloaders: {} general: {} - k8s: {} + k8sContainerCpuUsageSecondsTotal: {} + k8sContainerMemoryCache: {} + k8sContainerMemoryRss: {} + k8sContainerMemorySwap: {} + k8sContainerResource: {} + k8sPodOwner: {} kubeApiserverAvailability: {} kubeApiserverBurnrate: {} kubeApiserverHistogram: {} @@ -117,7 +130,12 @@ defaultRules: etcd: {} configReloaders: {} general: {} - k8s: {} + k8sContainerCpuUsageSecondsTotal: {} + k8sContainerMemoryCache: {} + k8sContainerMemoryRss: {} + k8sContainerMemorySwap: {} + k8sContainerResource: {} + k8sPodOwner: {} kubeApiserverAvailability: {} kubeApiserverBurnrate: {} kubeApiserverHistogram: {} @@ -141,6 +159,8 @@ defaultRules: prometheus: {} prometheusOperator: {} + additionalAggregationLabels: [] + ## Prefix for runbook URLs. Use this to override the first part of the runbookURLs that is common to all rules. runbookUrl: "https://runbooks.prometheus-operator.dev/runbooks" @@ -201,10 +221,30 @@ global: # - "image-pull-secret" windowsMonitoring: - ## Deploys the windows-exporter and Windows-specific dashboards and rules + ## Deploys the windows-exporter and Windows-specific dashboards and rules (job name must be 'windows-exporter') enabled: false - ## Job must match jobLabel in the PodMonitor/ServiceMonitor and is used for the rules - job: prometheus-windows-exporter + +## Configuration for prometheus-windows-exporter +## ref: https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-windows-exporter +## +prometheus-windows-exporter: + ## Enable ServiceMonitor and set Kubernetes label to use as a job label + ## + prometheus: + monitor: + enabled: true + jobLabel: jobLabel + + ## Set job label to 'windows-exporter' as required by the default Prometheus rules and Grafana dashboards + ## + podLabels: + jobLabel: windows-exporter + + ## Enable memory and container metrics as required by the default Prometheus rules and Grafana dashboards + ## + config: |- + collectors: + enabled: '[defaults],memory,container' ## Configuration for alertmanager ## ref: https://prometheus.io/docs/alerting/alertmanager/ @@ -440,11 +480,14 @@ alertmanager: ## ## Additional ports to open for Alertmanager service + ## additionalPorts: [] - # additionalPorts: - # - name: authenticated + # - name: oauth-proxy # port: 8081 # targetPort: 8081 + # - name: oauth-metrics + # port: 8082 + # targetPort: 8082 externalIPs: [] loadBalancerIP: "" @@ -561,6 +604,12 @@ alertmanager: # replacement: $1 # action: replace + ## Additional Endpoints + ## + additionalEndpoints: [] + # - port: oauth-metrics + # path: /metrics + ## Settings affecting alertmanagerSpec ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#alertmanagerspec ## @@ -575,7 +624,7 @@ alertmanager: image: registry: quay.io repository: prometheus/alertmanager - tag: v0.25.0 + tag: v0.26.0 sha: "" ## If true then the user will be responsible to provide a secret with alertmanager configuration @@ -783,15 +832,19 @@ alertmanager: containers: [] # containers: # - name: oauth-proxy - # image: quay.io/oauth2-proxy/oauth2-proxy:v7.3.0 + # image: quay.io/oauth2-proxy/oauth2-proxy:v7.5.1 # args: # - --upstream=http://127.0.0.1:9093 # - --http-address=0.0.0.0:8081 + # - --metrics-address=0.0.0.0:8082 # - ... # ports: # - containerPort: 8081 # name: oauth-proxy # protocol: TCP + # - containerPort: 8082 + # name: oauth-metrics + # protocol: TCP # resources: {} # Additional volumes on the output StatefulSet definition. @@ -840,6 +893,14 @@ alertmanager: ## be considered available. Defaults to 0 (pod will be considered available as soon as it is ready). minReadySeconds: 0 + ## Additional configuration which is not covered by the properties above. (passed through tpl) + additionalConfig: {} + + ## Additional configuration which is not covered by the properties above. + ## Useful, if you need advanced templating inside alertmanagerSpec. + ## Otherwise, use alertmanager.alertmanagerSpec.additionalConfig (passed through tpl) + additionalConfigString: "" + ## ExtraSecret can be used to store various data in an extra secret ## (use it for example to store hashed basic auth credentials) extraSecret: @@ -1130,10 +1191,23 @@ kubelet: namespace: kube-system serviceMonitor: + ## Attach metadata to discovered targets. Requires Prometheus v2.45 for endpoints created by the operator. + ## + attachMetadata: + node: false + ## Scrape interval. If not set, the Prometheus default scrape interval is used. ## interval: "" + ## If true, Prometheus use (respect) labels provided by exporter. + ## + honorLabels: true + + ## If true, Prometheus ingests metrics with timestamp provided by exporter. If false, Prometheus ingests metrics with timestamp of scrape. + ## + honorTimestamps: true + ## SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. ## sampleLimit: 0 @@ -1881,6 +1955,11 @@ kube-state-metrics: ## nodeExporter: enabled: true + operatingSystems: + linux: + enabled: true + darwin: + enabled: true ## Configuration for prometheus-node-exporter subchart ## @@ -2099,7 +2178,7 @@ prometheusOperator: ## match labels used in selector # matchLabels: {} - ## Service account for Alertmanager to use. + ## Service account for Prometheus Operator to use. ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ ## serviceAccount: @@ -2120,7 +2199,7 @@ prometheusOperator: nodePortTls: 30443 - ## Additional ports to open for Prometheus service + ## Additional ports to open for Prometheus operator service ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services ## additionalPorts: [] @@ -2372,20 +2451,20 @@ prometheusOperator: enableProbe: false # resource config for prometheusConfigReloader - resources: - requests: - cpu: 200m - memory: 50Mi - limits: - cpu: 200m - memory: 50Mi + resources: {} + # requests: + # cpu: 200m + # memory: 50Mi + # limits: + # cpu: 200m + # memory: 50Mi ## Thanos side-car image when configured ## thanosImage: registry: quay.io repository: thanos/thanos - tag: v0.31.0 + tag: v0.32.5 sha: "" ## Set a Label Selector to filter watched prometheus and prometheusAgent @@ -2580,12 +2659,16 @@ prometheus: ## type: ClusterIP - ## Additional port to define in the Service + ## Additional ports to open for Prometheus service + ## additionalPorts: [] # additionalPorts: - # - name: authenticated + # - name: oauth-proxy # port: 8081 # targetPort: 8081 + # - name: oauth-metrics + # port: 8082 + # targetPort: 8082 ## Consider that all endpoints are considered "ready" even if the Pods themselves are not ## Ref: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/#ServiceSpec @@ -2828,6 +2911,12 @@ prometheus: # replacement: $1 # action: replace + ## Additional Endpoints + ## + additionalEndpoints: [] + # - port: oauth-metrics + # path: /metrics + ## Settings affecting prometheusSpec ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#prometheusspec ## @@ -2894,7 +2983,7 @@ prometheus: image: registry: quay.io repository: prometheus/prometheus - tag: v2.45.0 + tag: v2.48.0 sha: "" ## Tolerations for use with node taints @@ -3374,22 +3463,42 @@ prometheus: # secrets: | # - resourceName: "projects/$PROJECT_ID/secrets/testsecret/versions/latest" # fileName: "objstore.yaml" - # objectStorageConfigFile: /var/secrets/object-store.yaml + ## ObjectStorageConfig configures object storage in Thanos. + # objectStorageConfig: + # # use existing secret, if configured, objectStorageConfig.secret will not be used + # existingSecret: {} + # # name: "" + # # key: "" + # # will render objectStorageConfig secret data and configure it to be used by Thanos custom resource, + # # ignored when prometheusspec.thanos.objectStorageConfig.existingSecret is set + # # https://thanos.io/tip/thanos/storage.md/#s3 + # secret: {} + # # type: S3 + # # config: + # # bucket: "" + # # endpoint: "" + # # region: "" + # # access_key: "" + # # secret_key: "" ## Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to a Prometheus pod. ## if using proxy extraContainer update targetPort with proxy container port containers: [] # containers: # - name: oauth-proxy - # image: quay.io/oauth2-proxy/oauth2-proxy:v7.3.0 + # image: quay.io/oauth2-proxy/oauth2-proxy:v7.5.1 # args: - # - --upstream=http://127.0.0.1:9093 + # - --upstream=http://127.0.0.1:9090 # - --http-address=0.0.0.0:8081 + # - --metrics-address=0.0.0.0:8082 # - ... # ports: # - containerPort: 8081 # name: oauth-proxy # protocol: TCP + # - containerPort: 8082 + # name: oauth-metrics + # protocol: TCP # resources: {} ## InitContainers allows injecting additional initContainers. This is meant to allow doing some changes @@ -3490,6 +3599,14 @@ prometheus: ## See https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#prometheustracingconfig tracingConfig: {} + ## Additional configuration which is not covered by the properties above. (passed through tpl) + additionalConfig: {} + + ## Additional configuration which is not covered by the properties above. + ## Useful, if you need advanced templating inside alertmanagerSpec. + ## Otherwise, use prometheus.prometheusSpec.additionalConfig (passed through tpl) + additionalConfigString: "" + additionalRulesForClusterRole: [] # - apiGroups: [ "" ] # resources: @@ -3585,6 +3702,25 @@ prometheus: ## # serverName: "" + ## MetricRelabelConfigs to apply to samples after scraping, but before ingestion. + ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig + ## + # metricRelabelings: [] + # - action: keep + # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' + # sourceLabels: [__name__] + + ## RelabelConfigs to apply to samples before scraping + ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig + ## + # relabelings: [] + # - sourceLabels: [__meta_kubernetes_pod_node_name] + # separator: ; + # regex: ^(.*)$ + # targetLabel: nodename + # replacement: $1 + # action: replace + additionalPodMonitors: [] ## Name of the PodMonitor to create ## @@ -3792,6 +3928,12 @@ thanosRuler: # replacement: $1 # action: replace + ## Additional Endpoints + ## + additionalEndpoints: [] + # - port: oauth-metrics + # path: /metrics + ## Settings affecting thanosRulerpec ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#thanosrulerspec ## @@ -3806,7 +3948,7 @@ thanosRuler: image: registry: quay.io repository: thanos/thanos - tag: v0.31.0 + tag: v0.32.5 sha: "" ## Namespaces to be selected for PrometheusRules discovery. @@ -3876,16 +4018,24 @@ thanosRuler: ## AlertmanagerConfig define configuration for connecting to alertmanager. ## Only available with Thanos v0.10.0 and higher. Maps to the alertmanagers.config Thanos Ruler arg. - alertmanagersConfig: {} - # - api_version: v2 - # http_config: - # basic_auth: - # username: some_user - # password: some_pass - # static_configs: - # - alertmanager.thanos.io - # scheme: http - # timeout: 10s + alertmanagersConfig: + # use existing secret, if configured, alertmanagersConfig.secret will not be used + existingSecret: {} + # name: "" + # key: "" + # will render render alertmanagersConfig secret data and configure it to be used by Thanos Ruler custom resource, ignored when alertmanagersConfig.existingSecret is set + # https://thanos.io/tip/components/rule.md/#alertmanager + secret: {} + # alertmanagers: + # - api_version: v2 + # http_config: + # basic_auth: + # username: some_user + # password: some_pass + # static_configs: + # - alertmanager.thanos.io + # scheme: http + # timeout: 10s ## DEPRECATED. Define URLs to send alerts to Alertmanager. For Thanos v0.10.0 and higher, alertmanagersConfig should be used instead. ## Note: this field will be ignored if alertmanagersConfig is specified. Maps to the alertmanagers.url Thanos Ruler arg. @@ -3900,13 +4050,22 @@ thanosRuler: ## routePrefix: / - ## ObjectStorageConfig configures object storage in Thanos. Alternative to - ## ObjectStorageConfigFile, and lower order priority. - objectStorageConfig: {} - - ## ObjectStorageConfigFile specifies the path of the object storage configuration file. - ## When used alongside with ObjectStorageConfig, ObjectStorageConfigFile takes precedence. - objectStorageConfigFile: "" + ## ObjectStorageConfig configures object storage in Thanos + objectStorageConfig: + # use existing secret, if configured, objectStorageConfig.secret will not be used + existingSecret: {} + # name: "" + # key: "" + # will render objectStorageConfig secret data and configure it to be used by Thanos Ruler custom resource, ignored when objectStorageConfig.existingSecret is set + # https://thanos.io/tip/thanos/storage.md/#s3 + secret: {} + # type: S3 + # config: + # bucket: "" + # endpoint: "" + # region: "" + # access_key: "" + # secret_key: "" ## QueryEndpoints defines Thanos querier endpoints from which to query metrics. ## Maps to the --query flag of thanos ruler. @@ -3914,7 +4073,22 @@ thanosRuler: ## Define configuration for connecting to thanos query instances. If this is defined, the queryEndpoints field will be ignored. ## Maps to the query.config CLI argument. Only available with thanos v0.11.0 and higher. - queryConfig: {} + queryConfig: + # use existing secret, if configured, queryConfig.secret will not be used + existingSecret: {} + # name: "" + # key: "" + # render queryConfig secret data and configure it to be used by Thanos Ruler custom resource, ignored when queryConfig.existingSecret is set + # https://thanos.io/tip/components/rule.md/#query-api + secret: {} + # - http_config: + # basic_auth: + # username: some_user + # password: some_pass + # static_configs: + # - URL + # scheme: http + # timeout: 10s ## Labels configure the external label pairs to ThanosRuler. A default replica ## label `thanos_ruler_replica` will be always added as a label with the value diff --git a/charts/kubezero-metrics/jsonnet/dashboards/apiserver.json b/charts/kubezero-metrics/jsonnet/dashboards/apiserver.json index 946d237d..be3207d6 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/apiserver.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/apiserver.json @@ -528,7 +528,7 @@ "steppedLine": false, "targets": [ { - "expr": "cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile{verb=\"read\", cluster=\"$cluster\"}", + "expr": "cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile{verb=\"read\", cluster=\"$cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{ resource }}", @@ -893,7 +893,7 @@ "steppedLine": false, "targets": [ { - "expr": "cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile{verb=\"write\", cluster=\"$cluster\"}", + "expr": "cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile{verb=\"write\", cluster=\"$cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{ resource }}", @@ -1473,6 +1473,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/cluster-total.json b/charts/kubezero-metrics/jsonnet/dashboards/cluster-total.json index fabcbd27..055e1efe 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/cluster-total.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/cluster-total.json @@ -1615,6 +1615,7 @@ }, { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/controller-manager.json b/charts/kubezero-metrics/jsonnet/dashboards/controller-manager.json index 56bffc9e..10ba5c21 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/controller-manager.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/controller-manager.json @@ -943,6 +943,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-cluster.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-cluster.json index 58c74e05..5a996221 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-cluster.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-cluster.json @@ -52,7 +52,6 @@ "expr": "cluster:node_cpu:ratio_rate5m{cluster=\"$cluster\"}", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -131,7 +130,6 @@ "expr": "sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"cpu\",cluster=\"$cluster\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -210,7 +208,6 @@ "expr": "sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"cpu\",cluster=\"$cluster\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -289,7 +286,6 @@ "expr": "1 - sum(:node_memory_MemAvailable_bytes:sum{cluster=\"$cluster\"}) / sum(node_memory_MemTotal_bytes{job=\"node-exporter\",cluster=\"$cluster\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -368,7 +364,6 @@ "expr": "sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"memory\",cluster=\"$cluster\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -447,7 +442,6 @@ "expr": "sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable{job=\"kube-state-metrics\",resource=\"memory\",cluster=\"$cluster\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -536,7 +530,6 @@ { "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -766,7 +759,6 @@ "expr": "sum(kube_pod_owner{job=\"kube-state-metrics\", cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -774,7 +766,6 @@ "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -782,7 +773,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -790,7 +780,6 @@ "expr": "sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -798,7 +787,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace) / sum(namespace_cpu:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -806,7 +794,6 @@ "expr": "sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" }, @@ -814,7 +801,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\"}) by (namespace) / sum(namespace_cpu:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "G" } @@ -905,7 +891,6 @@ { "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", container!=\"\"}) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1135,7 +1120,6 @@ "expr": "sum(kube_pod_owner{job=\"kube-state-metrics\", cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -1143,7 +1127,6 @@ "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1151,7 +1134,6 @@ "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", container!=\"\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1159,7 +1141,6 @@ "expr": "sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1167,7 +1148,6 @@ "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(namespace_memory:kube_pod_container_resource_requests:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1175,7 +1155,6 @@ "expr": "sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" }, @@ -1183,7 +1162,6 @@ "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(namespace_memory:kube_pod_container_resource_limits:sum{cluster=\"$cluster\"}) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "G" } @@ -1399,7 +1377,6 @@ "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -1407,7 +1384,6 @@ "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1415,7 +1391,6 @@ "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1423,7 +1398,6 @@ "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1431,7 +1405,6 @@ "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1439,7 +1412,6 @@ "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -1530,7 +1502,6 @@ { "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1608,7 +1579,6 @@ { "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1698,7 +1668,6 @@ { "expr": "avg(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1776,7 +1745,6 @@ { "expr": "avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1866,7 +1834,6 @@ { "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -1944,7 +1911,6 @@ { "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -2034,7 +2000,6 @@ { "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -2112,7 +2077,6 @@ { "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -2203,7 +2167,6 @@ { "expr": "ceil(sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval])))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -2281,7 +2244,6 @@ { "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{namespace}}", "legendLink": null } @@ -2383,7 +2345,7 @@ "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2391,14 +2353,14 @@ "pattern": "Value #A", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2406,14 +2368,14 @@ "pattern": "Value #B", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Reads + Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2421,7 +2383,7 @@ "pattern": "Value #C", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "Throughput(Read)", @@ -2500,7 +2462,6 @@ "expr": "sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -2508,7 +2469,6 @@ "expr": "sum by(namespace) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -2516,7 +2476,6 @@ "expr": "sum by(namespace) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -2524,7 +2483,6 @@ "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -2532,7 +2490,6 @@ "expr": "sum by(namespace) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -2540,7 +2497,6 @@ "expr": "sum by(namespace) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace!=\"\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-namespace.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-namespace.json index f417c063..a8ee0440 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-namespace.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-namespace.json @@ -52,7 +52,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -131,7 +130,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -210,7 +208,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -289,7 +286,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"})", "format": "time_series", "instant": true, - "intervalFactor": 2, "refId": "A" } ], @@ -401,21 +397,18 @@ { "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.cpu\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - requests", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.cpu\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - limits", "legendLink": null } @@ -615,7 +608,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -623,7 +615,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -631,7 +622,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -639,7 +629,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -647,7 +636,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" } @@ -761,21 +749,18 @@ { "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.memory\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - requests", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.memory\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - limits", "legendLink": null } @@ -1020,7 +1005,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -1028,7 +1012,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1036,7 +1019,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1044,7 +1026,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1052,7 +1033,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1060,7 +1040,6 @@ "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" }, @@ -1068,7 +1047,6 @@ "expr": "sum(container_memory_cache{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "G" }, @@ -1076,7 +1054,6 @@ "expr": "sum(container_memory_swap{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "H" } @@ -1292,7 +1269,6 @@ "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -1300,7 +1276,6 @@ "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1308,7 +1283,6 @@ "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1316,7 +1290,6 @@ "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1324,7 +1297,6 @@ "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1332,7 +1304,6 @@ "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -1423,7 +1394,6 @@ { "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1501,7 +1471,6 @@ { "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1591,7 +1560,6 @@ { "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1669,7 +1637,6 @@ { "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1759,7 +1726,6 @@ { "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1837,7 +1803,6 @@ { "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1928,7 +1893,6 @@ { "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_total{container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -2006,7 +1970,6 @@ { "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{container!=\"\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -2108,7 +2071,7 @@ "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2116,14 +2079,14 @@ "pattern": "Value #A", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2131,14 +2094,14 @@ "pattern": "Value #B", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Reads + Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -2146,7 +2109,7 @@ "pattern": "Value #C", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "Throughput(Read)", @@ -2225,7 +2188,6 @@ "expr": "sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -2233,7 +2195,6 @@ "expr": "sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -2241,7 +2202,6 @@ "expr": "sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -2249,7 +2209,6 @@ "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -2257,7 +2216,6 @@ "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -2265,7 +2223,6 @@ "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-node.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-node.json index 8348d11e..c1ed9104 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-node.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-node.json @@ -62,14 +62,12 @@ { "expr": "sum(kube_node_status_capacity{cluster=\"$cluster\", node=~\"$node\", resource=\"cpu\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "max capacity", "legendLink": null }, { "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -269,7 +267,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -277,7 +274,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -285,7 +281,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -293,7 +288,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -301,7 +295,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", node=~\"$node\"}) by (pod) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" } @@ -404,14 +397,12 @@ { "expr": "sum(kube_node_status_capacity{cluster=\"$cluster\", node=~\"$node\", resource=\"memory\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "max capacity", "legendLink": null }, { "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\", container!=\"\"}) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -656,7 +647,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -664,7 +654,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -672,7 +661,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -680,7 +668,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -688,7 +675,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_working_set_bytes{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", node=~\"$node\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -696,7 +682,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_rss{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" }, @@ -704,7 +689,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_cache{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "G" }, @@ -712,7 +696,6 @@ "expr": "sum(node_namespace_pod_container:container_memory_swap{cluster=\"$cluster\", node=~\"$node\",container!=\"\"}) by (pod)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "H" } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-pod.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-pod.json index 9733f2ac..72366969 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-pod.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-pod.json @@ -69,21 +69,18 @@ { "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}) by (container)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{container}}", "legendLink": null }, { "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\n)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "requests", "legendLink": null }, { "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"cpu\"}\n)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "limits", "legendLink": null } @@ -173,7 +170,6 @@ { "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container) /sum(increase(container_cpu_cfs_periods_total{job=\"kubelet\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{container}}", "legendLink": null } @@ -382,7 +378,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -390,7 +385,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -398,7 +392,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -406,7 +399,6 @@ "expr": "sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -414,7 +406,6 @@ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" } @@ -526,21 +517,18 @@ { "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{container}}", "legendLink": null }, { "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\n)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "requests", "legendLink": null }, { "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", resource=\"memory\"}\n)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "limits", "legendLink": null } @@ -785,7 +773,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -793,7 +780,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -801,7 +787,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -809,7 +794,6 @@ "expr": "sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -817,7 +801,6 @@ "expr": "sum(container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\", image!=\"\"}) by (container) / sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_limits{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -825,7 +808,6 @@ "expr": "sum(container_memory_rss{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" }, @@ -833,7 +815,6 @@ "expr": "sum(container_memory_cache{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "G" }, @@ -841,7 +822,6 @@ "expr": "sum(container_memory_swap{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "H" } @@ -932,7 +912,6 @@ { "expr": "sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1010,7 +989,6 @@ { "expr": "sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1100,7 +1078,6 @@ { "expr": "sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1178,7 +1155,6 @@ { "expr": "sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1268,7 +1244,6 @@ { "expr": "sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1346,7 +1321,6 @@ { "expr": "sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])) by (pod)", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1437,14 +1411,12 @@ { "expr": "ceil(sum by(pod) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "Reads", "legendLink": null }, { "expr": "ceil(sum by(pod) (rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\",namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval])))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "Writes", "legendLink": null } @@ -1522,14 +1494,12 @@ { "expr": "sum by(pod) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval]))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "Reads", "legendLink": null }, { "expr": "sum by(pod) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$pod\"}[$__rate_interval]))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "Writes", "legendLink": null } @@ -1620,7 +1590,6 @@ { "expr": "ceil(sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval])))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{container}}", "legendLink": null } @@ -1698,7 +1667,6 @@ { "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{container}}", "legendLink": null } @@ -1800,7 +1768,7 @@ "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -1808,14 +1776,14 @@ "pattern": "Value #A", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -1823,14 +1791,14 @@ "pattern": "Value #B", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "IOPS(Reads + Writes)", "colorMode": null, "colors": [ ], "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": -1, + "decimals": 3, "link": false, "linkTargetBlank": false, "linkTooltip": "Drill down", @@ -1838,7 +1806,7 @@ "pattern": "Value #C", "thresholds": [ ], "type": "number", - "unit": "short" + "unit": "iops" }, { "alias": "Throughput(Read)", @@ -1917,7 +1885,6 @@ "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -1925,7 +1892,6 @@ "expr": "sum by(container) (rate(container_fs_writes_total{job=\"kubelet\",device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1933,7 +1899,6 @@ "expr": "sum by(container) (rate(container_fs_reads_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1941,7 +1906,6 @@ "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1949,7 +1913,6 @@ "expr": "sum by(container) (rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1957,7 +1920,6 @@ "expr": "sum by(container) (rate(container_fs_reads_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]) + rate(container_fs_writes_bytes_total{job=\"kubelet\", device=~\"(/dev.+)|mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+\", container!=\"\", cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}[$__rate_interval]))", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workload.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workload.json index 9a9823c8..54bd3683 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workload.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workload.json @@ -50,7 +50,6 @@ { "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -250,7 +249,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -258,7 +256,6 @@ "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -266,7 +263,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -274,7 +270,6 @@ "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -282,7 +277,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" } @@ -373,7 +367,6 @@ { "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -573,7 +566,6 @@ "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -581,7 +573,6 @@ "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -589,7 +580,6 @@ "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -597,7 +587,6 @@ "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -605,7 +594,6 @@ "expr": "sum(\n container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=\"$workload\", workload_type=~\"$type\"}\n) by (pod)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" } @@ -821,7 +809,6 @@ "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -829,7 +816,6 @@ "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -837,7 +823,6 @@ "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -845,7 +830,6 @@ "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -853,7 +837,6 @@ "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -861,7 +844,6 @@ "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -952,7 +934,6 @@ { "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1030,7 +1011,6 @@ { "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1120,7 +1100,6 @@ { "expr": "(avg(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1198,7 +1177,6 @@ { "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1288,7 +1266,6 @@ { "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1366,7 +1343,6 @@ { "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1456,7 +1432,6 @@ { "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } @@ -1534,7 +1509,6 @@ { "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\"$workload\", workload_type=~\"$type\"}) by (pod))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{pod}}", "legendLink": null } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workloads-namespace.json b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workloads-namespace.json index eb707938..b660d1f2 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workloads-namespace.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/k8s-resources-workloads-namespace.json @@ -73,21 +73,18 @@ { "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}} - {{workload_type}}", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.cpu\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - requests", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.cpu\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - limits", "legendLink": null } @@ -317,7 +314,6 @@ "expr": "count(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload, workload_type)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -325,7 +321,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -333,7 +328,6 @@ "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -341,7 +335,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -349,7 +342,6 @@ "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -357,7 +349,6 @@ "expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=\"$cluster\", namespace=\"$namespace\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"cpu\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -471,21 +462,18 @@ { "expr": "sum(\n container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}} - {{workload_type}}", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.memory\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - requests", "legendLink": null }, { "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.memory\"})", "format": "time_series", - "intervalFactor": 2, "legendFormat": "quota - limits", "legendLink": null } @@ -715,7 +703,6 @@ "expr": "count(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload, workload_type)", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -723,7 +710,6 @@ "expr": "sum(\n container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -731,7 +717,6 @@ "expr": "sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -739,7 +724,6 @@ "expr": "sum(\n container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_requests{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -747,7 +731,6 @@ "expr": "sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -755,7 +738,6 @@ "expr": "sum(\n container_memory_working_set_bytes{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n/sum(\n kube_pod_container_resource_limits{job=\"kube-state-metrics\", cluster=\"$cluster\", namespace=\"$namespace\", resource=\"memory\"}\n* on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}\n) by (workload, workload_type)\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -986,7 +968,6 @@ "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "A" }, @@ -994,7 +975,6 @@ "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "B" }, @@ -1002,7 +982,6 @@ "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "C" }, @@ -1010,7 +989,6 @@ "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "D" }, @@ -1018,7 +996,6 @@ "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "E" }, @@ -1026,7 +1003,6 @@ "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload_type=~\"$type\"}) by (workload))\n", "format": "table", "instant": true, - "intervalFactor": 2, "legendFormat": "", "refId": "F" } @@ -1117,7 +1093,6 @@ { "expr": "(sum(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1195,7 +1170,6 @@ { "expr": "(sum(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1285,7 +1259,6 @@ { "expr": "(avg(irate(container_network_receive_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1363,7 +1336,6 @@ { "expr": "(avg(irate(container_network_transmit_bytes_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1453,7 +1425,6 @@ { "expr": "(sum(irate(container_network_receive_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1531,7 +1502,6 @@ { "expr": "(sum(irate(container_network_transmit_packets_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1621,7 +1591,6 @@ { "expr": "(sum(irate(container_network_receive_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } @@ -1699,7 +1668,6 @@ { "expr": "(sum(irate(container_network_transmit_packets_dropped_total{job=\"kubelet\", cluster=\"$cluster\", namespace=\"$namespace\"}[$__rate_interval])\n* on (namespace,pod)\ngroup_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\", namespace=\"$namespace\", workload=~\".+\", workload_type=~\"$type\"}) by (workload))\n", "format": "time_series", - "intervalFactor": 2, "legendFormat": "{{workload}}", "legendLink": null } diff --git a/charts/kubezero-metrics/jsonnet/dashboards/kubelet.json b/charts/kubezero-metrics/jsonnet/dashboards/kubelet.json index f0e9b1f1..b7f73e0a 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/kubelet.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/kubelet.json @@ -1889,6 +1889,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-pod.json b/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-pod.json index 0c6b4786..28a6afae 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-pod.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-pod.json @@ -1133,6 +1133,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-workload.json b/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-workload.json index b0a3385a..4eb9ea95 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-workload.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/namespace-by-workload.json @@ -1345,6 +1345,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/persistentvolumesusage.json b/charts/kubezero-metrics/jsonnet/dashboards/persistentvolumesusage.json index cf722b5e..79886900 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/persistentvolumesusage.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/persistentvolumesusage.json @@ -394,6 +394,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/pod-total.json b/charts/kubezero-metrics/jsonnet/dashboards/pod-total.json index 4cb3003b..e36cc05c 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/pod-total.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/pod-total.json @@ -899,6 +899,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/proxy.json b/charts/kubezero-metrics/jsonnet/dashboards/proxy.json index d7ad8acc..4683238d 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/proxy.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/proxy.json @@ -1012,6 +1012,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/scheduler.json b/charts/kubezero-metrics/jsonnet/dashboards/scheduler.json index b480c682..ff3d3225 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/scheduler.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/scheduler.json @@ -877,6 +877,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/dashboards/workload-total.json b/charts/kubezero-metrics/jsonnet/dashboards/workload-total.json index a7813a12..3fad9193 100644 --- a/charts/kubezero-metrics/jsonnet/dashboards/workload-total.json +++ b/charts/kubezero-metrics/jsonnet/dashboards/workload-total.json @@ -1057,6 +1057,7 @@ "list": [ { "current": { + "selected": true, "text": "default", "value": "default" }, diff --git a/charts/kubezero-metrics/jsonnet/jsonnetfile.lock.json b/charts/kubezero-metrics/jsonnet/jsonnetfile.lock.json index f8482252..7b317234 100644 --- a/charts/kubezero-metrics/jsonnet/jsonnetfile.lock.json +++ b/charts/kubezero-metrics/jsonnet/jsonnetfile.lock.json @@ -18,8 +18,8 @@ "subdir": "contrib/mixin" } }, - "version": "5a54fe6dd1740d32ac90cb0623970464fb582214", - "sum": "GdePvMDfLQcVhwzk/Ephi/jC27ywGObLB5t0eC0lXd4=" + "version": "62b772c3214c9ee75f75fa783646c5694c42f69f", + "sum": "xuUBd2vqF7asyVDe5CE08uPT/RxAdy8O75EjFJoMXXU=" }, { "source": { @@ -51,6 +51,16 @@ "version": "a1d61cce1da59c71409b99b5c7568511fec661ea", "sum": "gCtR9s/4D5fxU9aKXg0Bru+/njZhA0YjLjPiASc61FM=" }, + { + "source": { + "git": { + "remote": "https://github.com/grafana/grafonnet.git", + "subdir": "gen/grafonnet-v10.0.0" + } + }, + "version": "bb2afaffbcefeae1035cd691ab06a486e0022002", + "sum": "gj/20VIGucG2vDGjG7YdHLC4yUUfrpuaneUYaRmymOM=" + }, { "source": { "git": { @@ -58,8 +68,28 @@ "subdir": "grafana-builder" } }, - "version": "62aec8403a5c38d5dc97ba596703753289b1c33b", - "sum": "xEFMv4+ObwP5L1Wu0XK5agWci4AJzNApys6iKAQxLlQ=" + "version": "32685d75e4ae753e06ab3bea13df9d59bb5da46a", + "sum": "VmOxvg9FuY9UYr3lN6ZJe2HhuIErJoWimPybQr3S3yQ=" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/docsonnet.git", + "subdir": "doc-util" + } + }, + "version": "503e5c8fe96d6b55775037713ac10b184709ad93", + "sum": "BY4u0kLF3Qf/4IB4HnX9S5kEQIpHb4MUrppp6WLDtlU=" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/xtd.git", + "subdir": "" + } + }, + "version": "c1a315a7dbead0335a5e0486acc5583395b22a24", + "sum": "UVdL+uuFI8BSQgLfMJEJk2WDKsQXNT3dRHcr2Ti9rLI=" }, { "source": { @@ -68,8 +98,8 @@ "subdir": "" } }, - "version": "a10227e04218679b5e0e1d50784a4251bf3bdaf3", - "sum": "bpHFTDHKyY6ESLCtRqpzEQTWDZw3AiYC8fyuZX+KDWE=" + "version": "2dbe4f9625a811b8b89f0495e74509c74779da82", + "sum": "Fe7bN9E6qeKNUdENjQvYttgf4S1DDqXRVB80wdmQgHQ=" }, { "source": { @@ -78,7 +108,7 @@ "subdir": "jsonnet/kube-state-metrics" } }, - "version": "e8272ced472cb99ef1e2e2dc0e9ff481ae381fdb", + "version": "98b38ba9bbfdff27b359c58adecab30cc1311a78", "sum": "+dOzAK+fwsFf97uZpjcjTcEJEC1H8hh/j8f5uIQK/5g=" }, { @@ -88,7 +118,7 @@ "subdir": "jsonnet/kube-state-metrics-mixin" } }, - "version": "e8272ced472cb99ef1e2e2dc0e9ff481ae381fdb", + "version": "98b38ba9bbfdff27b359c58adecab30cc1311a78", "sum": "qclI7LwucTjBef3PkGBkKxF0mfZPbHnn4rlNWKGtR4c=" }, { @@ -98,8 +128,8 @@ "subdir": "jsonnet/kube-prometheus" } }, - "version": "4b5b94347dd71b3649fef612ab3b8cf237ac48b9", - "sum": "8AeC579AWxP6VzLTxQ/ccIrwOY0G782ZceLlWmOL5/o=" + "version": "80ab54b66a88cd40fc935d17abbd7b50b12cc3f7", + "sum": "w35hpzjA5b+xr9dXnpudKRsdTheO9YO1SESoG4oyyL8=" }, { "source": { @@ -108,7 +138,7 @@ "subdir": "jsonnet/mixin" } }, - "version": "f7edae17a94c25be7ef70cee32d94d5a23f1c8b0", + "version": "1d0006317b0d4ac5753ee4c189a36918de7c872b", "sum": "n3flMIzlADeyygb0uipZ4KPp2uNSjdtkrwgHjTC7Ca4=", "name": "prometheus-operator-mixin" }, @@ -119,8 +149,8 @@ "subdir": "jsonnet/prometheus-operator" } }, - "version": "f7edae17a94c25be7ef70cee32d94d5a23f1c8b0", - "sum": "LLGbS2uangsA5enNpZKxwdCAPZnO1Bj+W+o8Esk0QLw=" + "version": "1d0006317b0d4ac5753ee4c189a36918de7c872b", + "sum": "IGuHwz77oTKx9Vi1dnTng/RBV/QQ2YfAdB+WPqK/w5g=" }, { "source": { @@ -129,8 +159,8 @@ "subdir": "doc/alertmanager-mixin" } }, - "version": "6fe1a24df07eed6f6818abd500708040beee7d7b", - "sum": "1d7ZKYArJKacAWXLUz0bRC1uOkozee/PPw97/W5zGhc=", + "version": "4494abfce419d1bbd3cb1a2c0b6584da88ac9b64", + "sum": "IpF46ZXsm+0wJJAPtAre8+yxTNZA57mBqGpBP/r7/kw=", "name": "alertmanager" }, { @@ -140,8 +170,8 @@ "subdir": "docs/node-mixin" } }, - "version": "381f32b1c5943afb35940b88c45c3fa4bf5fc1de", - "sum": "By6n6U10hYDogUsyhsaKZehbhzxBZZobJloiKyKadgM=" + "version": "12f1744e799e04373c7a29b42bf8b8a332c82790", + "sum": "QZwFBpulndqo799gkR5rP2/WdcQKQkNnaBwhaOI8Jeg=" }, { "source": { @@ -150,8 +180,8 @@ "subdir": "documentation/prometheus-mixin" } }, - "version": "c579144f66b73de12f06981c99288bf03538d3ce", - "sum": "8OngT76gVXOUROOOeP9yTe6E/dn+2D2J34Dn690QCG0=", + "version": "965e603fa792bca0900ac76eb45ae84c81af1cdf", + "sum": "rNvddVTMNfaguOGzEGoeKjUsfhlXJBUImC+SIFNNCiM=", "name": "prometheus" }, { @@ -161,8 +191,9 @@ "subdir": "config/crd/bases" } }, - "version": "40a9909aba5daff05e36f7c7230c5b588773dcdf", - "sum": "L3lljFFoFB+nhXnyo8Yl1hKqe60nhHXY0IZCO3H2iVk=" + "version": "551856d42dff02ec38c5b0ea6a2d99c4cb127e82", + "sum": "bY/Pcrrbynguq8/HaI88cQ3B2hLv/xc+76QILY7IL+g=", + "name": "pyrra" }, { "source": { @@ -171,8 +202,8 @@ "subdir": "mixin" } }, - "version": "8fcd30ffcedf9e2728518dc2970d070d4c301302", - "sum": "WhheqsiX0maUXByZFsb9xhCEsGXK2955bPmPPf1x+Cs=", + "version": "9d6f82e55d13c162c00620045f109dbff5cb9344", + "sum": "HhSSbGGCNHCMy1ee5jElYDm0yS9Vesa7QB2/SHKdjsY=", "name": "thanos-mixin" } ], diff --git a/charts/kubezero-metrics/jsonnet/rules/alertmanager-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/alertmanager-prometheusRule index b4f76248..28a1afd9 100644 --- a/charts/kubezero-metrics/jsonnet/rules/alertmanager-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/alertmanager-prometheusRule @@ -7,7 +7,7 @@ "app.kubernetes.io/instance": "main", "app.kubernetes.io/name": "alertmanager", "app.kubernetes.io/part-of": "kube-prometheus", - "app.kubernetes.io/version": "0.25.0", + "app.kubernetes.io/version": "0.26.0", "prometheus": "k8s", "role": "alert-rules" }, @@ -52,7 +52,7 @@ "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerfailedtosendalerts", "summary": "An Alertmanager instance failed to send notifications." }, - "expr": "(\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n)\n> 0.01\n", + "expr": "(\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n)\n> 0.01\n", "for": "5m", "labels": { "severity": "warning" @@ -65,7 +65,7 @@ "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts", "summary": "All Alertmanager instances in a cluster failed to send notifications to a critical integration." }, - "expr": "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n)\n> 0.01\n", + "expr": "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n)\n> 0.01\n", "for": "5m", "labels": { "severity": "critical" @@ -78,7 +78,7 @@ "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts", "summary": "All Alertmanager instances in a cluster failed to send notifications to a non-critical integration." }, - "expr": "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n)\n> 0.01\n", + "expr": "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n)\n> 0.01\n", "for": "5m", "labels": { "severity": "warning" diff --git a/charts/kubezero-metrics/jsonnet/rules/etcd-mixin-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/etcd-mixin-prometheusRule index af7b8c61..dafcc7d9 100644 --- a/charts/kubezero-metrics/jsonnet/rules/etcd-mixin-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/etcd-mixin-prometheusRule @@ -139,7 +139,7 @@ "description": "etcd cluster \"{{ $labels.job }}\": database size exceeds the defined quota on etcd instance {{ $labels.instance }}, please defrag or increase the quota as the writes to etcd will be disabled when it is full.", "summary": "etcd cluster database is running full." }, - "expr": "(last_over_time(etcd_mvcc_db_total_size_in_bytes[5m]) / last_over_time(etcd_server_quota_backend_bytes[5m]))*100 > 95\n", + "expr": "(last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~\".*etcd.*\"}[5m]) / last_over_time(etcd_server_quota_backend_bytes{job=~\".*etcd.*\"}[5m]))*100 > 95\n", "for": "10m", "labels": { "severity": "critical" @@ -151,7 +151,7 @@ "description": "etcd cluster \"{{ $labels.job }}\": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance {{ $labels.instance }}, please check as it might be disruptive.", "summary": "etcd cluster database growing very fast." }, - "expr": "predict_linear(etcd_mvcc_db_total_size_in_bytes[4h], 4*60*60) > etcd_server_quota_backend_bytes\n", + "expr": "predict_linear(etcd_mvcc_db_total_size_in_bytes{job=~\".*etcd.*\"}[4h], 4*60*60) > etcd_server_quota_backend_bytes{job=~\".*etcd.*\"}\n", "for": "10m", "labels": { "severity": "warning" @@ -164,7 +164,7 @@ "runbook_url": "https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation", "summary": "etcd database size in use is less than 50% of the actual allocated storage." }, - "expr": "(last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes > 104857600\n", + "expr": "(last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes{job=~\".*etcd.*\"}[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~\".*etcd.*\"}[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes{job=~\".*etcd.*\"} > 104857600\n", "for": "10m", "labels": { "severity": "warning" diff --git a/charts/kubezero-metrics/jsonnet/rules/kubernetes-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/kubernetes-prometheusRule index 3713bedf..c6dd9d77 100644 --- a/charts/kubezero-metrics/jsonnet/rules/kubernetes-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/kubernetes-prometheusRule @@ -326,7 +326,7 @@ "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/kubernetes/cputhrottlinghigh", "summary": "Processes experience elevated CPU throttling." }, - "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{container!=\"\", }[5m])) by (container, pod, namespace)\n /\nsum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace)\n > ( 25 / 100 )\n", + "expr": "sum(increase(container_cpu_cfs_throttled_periods_total{container!=\"\", }[5m])) by (cluster, container, pod, namespace)\n /\nsum(increase(container_cpu_cfs_periods_total{}[5m])) by (cluster, container, pod, namespace)\n > ( 25 / 100 )\n", "for": "15m", "labels": { "severity": "info" @@ -792,98 +792,98 @@ "name": "kube-apiserver-burnrate.rules", "rules": [ { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1d]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1d]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1d]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1d]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate1d" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1h]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate1h" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[2h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[2h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[2h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[2h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[2h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[2h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[2h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[2h]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate2h" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[30m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[30m]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[30m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[30m]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[30m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[30m]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[30m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[30m]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate30m" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[3d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[3d]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[3d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[3d]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[3d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[3d]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[3d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[3d]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate3d" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[5m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[5m]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[5m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[5m]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[5m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[5m]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[5m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[5m]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate5m" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[6h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[6h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[6h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[6h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[6h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[6h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[6h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[6h]))\n", "labels": { "verb": "read" }, "record": "apiserver_request:burnrate6h" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1d]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1d]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate1d" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1h]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate1h" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[2h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[2h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[2h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[2h]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate2h" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[30m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[30m]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[30m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[30m]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate30m" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[3d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[3d]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[3d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[3d]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate3d" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[5m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[5m]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[5m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[5m]))\n", "labels": { "verb": "write" }, "record": "apiserver_request:burnrate5m" }, { - "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[6h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[6h]))\n", + "expr": "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[6h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[6h]))\n", "labels": { "verb": "write" }, @@ -895,20 +895,20 @@ "name": "kube-apiserver-histogram.rules", "rules": [ { - "expr": "histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))) > 0\n", + "expr": "histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))) > 0\n", "labels": { "quantile": "0.99", "verb": "read" }, - "record": "cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile" + "record": "cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile" }, { - "expr": "histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))) > 0\n", + "expr": "histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))) > 0\n", "labels": { "quantile": "0.99", "verb": "write" }, - "record": "cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile" + "record": "cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile" } ] }, @@ -935,37 +935,37 @@ "record": "code:apiserver_request_total:increase30d" }, { - "expr": "sum by (cluster, verb, scope) (increase(apiserver_request_slo_duration_seconds_count{job=\"apiserver\"}[1h]))\n", - "record": "cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h" + "expr": "sum by (cluster, verb, scope) (increase(apiserver_request_sli_duration_seconds_count{job=\"apiserver\"}[1h]))\n", + "record": "cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase1h" }, { - "expr": "sum by (cluster, verb, scope) (avg_over_time(cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h[30d]) * 24 * 30)\n", - "record": "cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d" + "expr": "sum by (cluster, verb, scope) (avg_over_time(cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase1h[30d]) * 24 * 30)\n", + "record": "cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d" }, { - "expr": "sum by (cluster, verb, scope, le) (increase(apiserver_request_slo_duration_seconds_bucket[1h]))\n", - "record": "cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h" + "expr": "sum by (cluster, verb, scope, le) (increase(apiserver_request_sli_duration_seconds_bucket[1h]))\n", + "record": "cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase1h" }, { - "expr": "sum by (cluster, verb, scope, le) (avg_over_time(cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h[30d]) * 24 * 30)\n", - "record": "cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d" + "expr": "sum by (cluster, verb, scope, le) (avg_over_time(cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase1h[30d]) * 24 * 30)\n", + "record": "cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d" }, { - "expr": "1 - (\n (\n # write too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n ) +\n (\n # read too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n ) +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d)\n", + "expr": "1 - (\n (\n # write too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n ) +\n (\n # read too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n ) +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d)\n", "labels": { "verb": "all" }, "record": "apiserver_request:availability30d" }, { - "expr": "1 - (\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n # too slow\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\"})\n", + "expr": "1 - (\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n # too slow\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\"})\n", "labels": { "verb": "read" }, "record": "apiserver_request:availability30d" }, { - "expr": "1 - (\n (\n # too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\"})\n", + "expr": "1 - (\n (\n # too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\"})\n", "labels": { "verb": "write" }, @@ -1004,28 +1004,53 @@ ] }, { - "name": "k8s.rules", + "name": "k8s.rules.container_cpu_usage_seconds_total", "rules": [ { "expr": "sum by (cluster, namespace, pod, container) (\n irate(container_cpu_usage_seconds_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}[5m])\n) * on (cluster, namespace, pod) group_left(node) topk by (cluster, namespace, pod) (\n 1, max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n", "record": "node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate" - }, + } + ] + }, + { + "name": "k8s.rules.container_memory_working_set_bytes", + "rules": [ { "expr": "container_memory_working_set_bytes{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n", "record": "node_namespace_pod_container:container_memory_working_set_bytes" - }, + } + ] + }, + { + "name": "k8s.rules.container_memory_rss", + "rules": [ { "expr": "container_memory_rss{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n", "record": "node_namespace_pod_container:container_memory_rss" - }, + } + ] + }, + { + "name": "k8s.rules.container_memory_cache", + "rules": [ { "expr": "container_memory_cache{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n", "record": "node_namespace_pod_container:container_memory_cache" - }, + } + ] + }, + { + "name": "k8s.rules.container_memory_swap", + "rules": [ { "expr": "container_memory_swap{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n", "record": "node_namespace_pod_container:container_memory_swap" - }, + } + ] + }, + { + "name": "k8s.rules.container_resource", + "rules": [ { "expr": "kube_pod_container_resource_requests{resource=\"memory\",job=\"kube-state-metrics\"} * on (namespace, pod, cluster)\ngroup_left() max by (namespace, pod, cluster) (\n (kube_pod_status_phase{phase=~\"Pending|Running\"} == 1)\n)\n", "record": "cluster:namespace:pod_memory:active:kube_pod_container_resource_requests" @@ -1057,7 +1082,12 @@ { "expr": "sum by (namespace, cluster) (\n sum by (namespace, pod, cluster) (\n max by (namespace, pod, container, cluster) (\n kube_pod_container_resource_limits{resource=\"cpu\",job=\"kube-state-metrics\"}\n ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) (\n kube_pod_status_phase{phase=~\"Pending|Running\"} == 1\n )\n )\n)\n", "record": "namespace_cpu:kube_pod_container_resource_limits:sum" - }, + } + ] + }, + { + "name": "k8s.rules.pod_owner", + "rules": [ { "expr": "max by (cluster, namespace, workload, pod) (\n label_replace(\n label_replace(\n kube_pod_owner{job=\"kube-state-metrics\", owner_kind=\"ReplicaSet\"},\n \"replicaset\", \"$1\", \"owner_name\", \"(.*)\"\n ) * on(replicaset, namespace) group_left(owner_name) topk by(replicaset, namespace) (\n 1, max by (replicaset, namespace, owner_name) (\n kube_replicaset_owner{job=\"kube-state-metrics\"}\n )\n ),\n \"workload\", \"$1\", \"owner_name\", \"(.*)\"\n )\n)\n", "labels": { diff --git a/charts/kubezero-metrics/jsonnet/rules/node-exporter-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/node-exporter-prometheusRule index ca215ef6..8f2c9837 100644 --- a/charts/kubezero-metrics/jsonnet/rules/node-exporter-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/node-exporter-prometheusRule @@ -6,7 +6,7 @@ "app.kubernetes.io/component": "exporter", "app.kubernetes.io/name": "node-exporter", "app.kubernetes.io/part-of": "kube-prometheus", - "app.kubernetes.io/version": "1.6.1", + "app.kubernetes.io/version": "1.7.0", "prometheus": "k8s", "role": "alert-rules" }, @@ -326,6 +326,19 @@ "labels": { "severity": "warning" } + }, + { + "alert": "NodeBondingDegraded", + "annotations": { + "description": "Bonding interface {{ $labels.master }} on {{ $labels.instance }} is in degraded state due to one or more slave failures.", + "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/node/nodebondingdegraded", + "summary": "Bonding interface is degraded" + }, + "expr": "(node_bonding_slaves - node_bonding_active) != 0\n", + "for": "5m", + "labels": { + "severity": "warning" + } } ] }, diff --git a/charts/kubezero-metrics/jsonnet/rules/prometheus-operator-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/prometheus-operator-prometheusRule index cd238f7e..a8edcc36 100644 --- a/charts/kubezero-metrics/jsonnet/rules/prometheus-operator-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/prometheus-operator-prometheusRule @@ -6,7 +6,7 @@ "app.kubernetes.io/component": "controller", "app.kubernetes.io/name": "prometheus-operator", "app.kubernetes.io/part-of": "kube-prometheus", - "app.kubernetes.io/version": "0.67.1", + "app.kubernetes.io/version": "0.69.1", "prometheus": "k8s", "role": "alert-rules" }, diff --git a/charts/kubezero-metrics/jsonnet/rules/prometheus-prometheusRule b/charts/kubezero-metrics/jsonnet/rules/prometheus-prometheusRule index e390ff1f..670f2221 100644 --- a/charts/kubezero-metrics/jsonnet/rules/prometheus-prometheusRule +++ b/charts/kubezero-metrics/jsonnet/rules/prometheus-prometheusRule @@ -7,7 +7,7 @@ "app.kubernetes.io/instance": "k8s", "app.kubernetes.io/name": "prometheus", "app.kubernetes.io/part-of": "kube-prometheus", - "app.kubernetes.io/version": "2.46.0", + "app.kubernetes.io/version": "2.48.0", "prometheus": "k8s", "role": "alert-rules" }, diff --git a/charts/kubezero-metrics/kube-prometheus-stack.patch b/charts/kubezero-metrics/kube-prometheus-stack.patch index 18f8978e..9122b391 100644 --- a/charts/kubezero-metrics/kube-prometheus-stack.patch +++ b/charts/kubezero-metrics/kube-prometheus-stack.patch @@ -2,10 +2,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs index 78c65ad..1adb2cf 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagerconfigs.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: alertmanagerconfigs.monitoring.coreos.com @@ -14,10 +14,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml index 8456cc4..b2d2e60 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-alertmanagers.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: alertmanagers.monitoring.coreos.com @@ -26,10 +26,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml ch index 84816da..bcc33c8 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: podmonitors.monitoring.coreos.com @@ -38,10 +38,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml charts/ index ee137b3..fda3c21 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-probes.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: probes.monitoring.coreos.com @@ -50,10 +50,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.ya index 6a63596..39c2d3f 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusagents.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheusagents.monitoring.coreos.com @@ -62,10 +62,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml c index 72f900d..093143b 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-prometheuses.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheuses.monitoring.coreos.com @@ -74,10 +74,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yam index 9d9f85d..20da04f 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-prometheusrules.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: prometheusrules.monitoring.coreos.com @@ -86,10 +86,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml index 95f0711..e0804f6 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-scrapeconfigs.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: scrapeconfigs.monitoring.coreos.com @@ -98,10 +98,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yam index 5f52dc6..daa1a62 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: servicemonitors.monitoring.coreos.com @@ -110,10 +110,10 @@ diff --git charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml c index 949bba7..d48a63c 100644 --- charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml +++ charts/kube-prometheus-stack/charts/crds/crds/crd-thanosrulers.yaml -@@ -5,6 +5,7 @@ kind: CustomResourceDefinition - metadata: +@@ -6,6 +6,7 @@ kind: CustomResourceDefinition annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 + argocd.argoproj.io/sync-options: ServerSideApply=true creationTimestamp: null name: thanosrulers.monitoring.coreos.com diff --git a/charts/kubezero-metrics/templates/grafana-dashboards-k8s.yaml b/charts/kubezero-metrics/templates/grafana-dashboards-k8s.yaml index fd2628cf..2fff60e2 100644 --- a/charts/kubezero-metrics/templates/grafana-dashboards-k8s.yaml +++ b/charts/kubezero-metrics/templates/grafana-dashboards-k8s.yaml @@ -16,36 +16,36 @@ binaryData: node.json.gz: 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 apiserver.json.gz: - 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 cluster-total.json.gz: - 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 controller-manager.json.gz: - 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 k8s-resources-cluster.json.gz: - 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 k8s-resources-namespace.json.gz: - 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 k8s-resources-node.json.gz: - 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 k8s-resources-pod.json.gz: - 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 k8s-resources-workload.json.gz: - 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 k8s-resources-workloads-namespace.json.gz: - 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 kubelet.json.gz: - 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 namespace-by-pod.json.gz: - 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 namespace-by-workload.json.gz: - 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 persistentvolumesusage.json.gz: - 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 pod-total.json.gz: - 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 proxy.json.gz: - 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 scheduler.json.gz: - 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 workload-total.json.gz: - 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 diff --git a/charts/kubezero-metrics/templates/rules/alertmanager.yaml b/charts/kubezero-metrics/templates/rules/alertmanager.yaml index da5d6b8c..c287d309 100644 --- a/charts/kubezero-metrics/templates/rules/alertmanager.yaml +++ b/charts/kubezero-metrics/templates/rules/alertmanager.yaml @@ -38,7 +38,7 @@ spec: description: Alertmanager {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod{{`}}`}} failed to send {{`{{`}} $value | humanizePercentage {{`}}`}} of notifications to {{`{{`}} $labels.integration {{`}}`}}. runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerfailedtosendalerts summary: An Alertmanager instance failed to send notifications. - expr: "(\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n)\n> 0.01\n" + expr: "(\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\"}[5m])\n)\n> 0.01\n" for: 5m labels: severity: warning @@ -47,7 +47,7 @@ spec: description: The minimum notification failure rate to {{`{{`}} $labels.integration {{`}}`}} sent from any instance in the {{`{{`}}$labels.job{{`}}`}} cluster is {{`{{`}} $value | humanizePercentage {{`}}`}}. runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts summary: All Alertmanager instances in a cluster failed to send notifications to a critical integration. - expr: "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n)\n> 0.01\n" + expr: "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration=~`.*`}[5m])\n)\n> 0.01\n" for: 5m labels: severity: critical @@ -56,7 +56,7 @@ spec: description: The minimum notification failure rate to {{`{{`}} $labels.integration {{`}}`}} sent from any instance in the {{`{{`}}$labels.job{{`}}`}} cluster is {{`{{`}} $value | humanizePercentage {{`}}`}}. runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts summary: All Alertmanager instances in a cluster failed to send notifications to a non-critical integration. - expr: "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n/\n rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n)\n> 0.01\n" + expr: "min by (namespace,service, integration) (\n rate(alertmanager_notifications_failed_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n/\n ignoring (reason) group_left rate(alertmanager_notifications_total{job=\"alertmanager-main\",namespace=\"monitoring\", integration!~`.*`}[5m])\n)\n> 0.01\n" for: 5m labels: severity: warning diff --git a/charts/kubezero-metrics/templates/rules/etcd-mixin.yaml b/charts/kubezero-metrics/templates/rules/etcd-mixin.yaml index fc6b717e..fbe2ece6 100644 --- a/charts/kubezero-metrics/templates/rules/etcd-mixin.yaml +++ b/charts/kubezero-metrics/templates/rules/etcd-mixin.yaml @@ -121,7 +121,7 @@ spec: annotations: description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": database size exceeds the defined quota on etcd instance {{`{{`}} $labels.instance {{`}}`}}, please defrag or increase the quota as the writes to etcd will be disabled when it is full.' summary: etcd cluster database is running full. - expr: '(last_over_time(etcd_mvcc_db_total_size_in_bytes[5m]) / last_over_time(etcd_server_quota_backend_bytes[5m]))*100 > 95 + expr: '(last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_server_quota_backend_bytes{job=~".*etcd.*"}[5m]))*100 > 95 ' for: 10m @@ -131,7 +131,7 @@ spec: annotations: description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance {{`{{`}} $labels.instance {{`}}`}}, please check as it might be disruptive.' summary: etcd cluster database growing very fast. - expr: 'predict_linear(etcd_mvcc_db_total_size_in_bytes[4h], 4*60*60) > etcd_server_quota_backend_bytes + expr: 'predict_linear(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[4h], 4*60*60) > etcd_server_quota_backend_bytes{job=~".*etcd.*"} ' for: 10m @@ -142,7 +142,7 @@ spec: description: 'etcd cluster "{{`{{`}} $labels.job {{`}}`}}": database size in use on instance {{`{{`}} $labels.instance {{`}}`}} is {{`{{`}} $value | humanizePercentage {{`}}`}} of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.' runbook_url: https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation summary: etcd database size in use is less than 50% of the actual allocated storage. - expr: '(last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes > 104857600 + expr: '(last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"} > 104857600 ' for: 10m diff --git a/charts/kubezero-metrics/templates/rules/kubernetes.yaml b/charts/kubezero-metrics/templates/rules/kubernetes.yaml index 4fe14785..1606edc7 100644 --- a/charts/kubezero-metrics/templates/rules/kubernetes.yaml +++ b/charts/kubezero-metrics/templates/rules/kubernetes.yaml @@ -246,7 +246,7 @@ spec: description: '{{`{{`}} $value | humanizePercentage {{`}}`}} throttling of CPU in namespace {{`{{`}} $labels.namespace {{`}}`}} for container {{`{{`}} $labels.container {{`}}`}} in pod {{`{{`}} $labels.pod {{`}}`}}.' runbook_url: https://runbooks.prometheus-operator.dev/runbooks/kubernetes/cputhrottlinghigh summary: Processes experience elevated CPU throttling. - expr: "sum(increase(container_cpu_cfs_throttled_periods_total{container!=\"\", }[5m])) by (container, pod, namespace)\n /\nsum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace)\n > ( 25 / 100 )\n" + expr: "sum(increase(container_cpu_cfs_throttled_periods_total{container!=\"\", }[5m])) by (cluster, container, pod, namespace)\n /\nsum(increase(container_cpu_cfs_periods_total{}[5m])) by (cluster, container, pod, namespace)\n > ( 25 / 100 )\n" for: 15m labels: severity: info @@ -625,85 +625,85 @@ spec: severity: critical - name: kube-apiserver-burnrate.rules rules: - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1d]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1d]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1d]))\n" labels: verb: read record: apiserver_request:burnrate1d - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[1h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[1h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[1h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[1h]))\n" labels: verb: read record: apiserver_request:burnrate1h - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[2h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[2h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[2h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[2h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[2h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[2h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[2h]))\n" labels: verb: read record: apiserver_request:burnrate2h - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[30m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[30m]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[30m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[30m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[30m]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[30m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"\ ,code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[30m]))\n" labels: verb: read record: apiserver_request:burnrate30m - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[3d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[3d]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[3d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[3d]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[3d]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[3d]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[3d]))\n" labels: verb: read record: apiserver_request:burnrate3d - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[5m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[5m]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[5m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[5m]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[5m]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[5m]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[5m]))\n" labels: verb: read record: apiserver_request:burnrate5m - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[6h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[6h]))\n +\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[6h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n (\n (\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=~\"resource|\",le=\"1\"}[6h]))\n or\n vector(0)\n )\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"namespace\",le=\"5\"}[6h]))\n +\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"LIST|GET\",subresource!~\"proxy|attach|log|exec|portforward\",scope=\"cluster\",le=\"30\"}[6h]))\n )\n )\n +\n # errors\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\",code=~\"\ 5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"LIST|GET\"}[6h]))\n" labels: verb: read record: apiserver_request:burnrate6h - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1d]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1d]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1d]))\n" labels: verb: write record: apiserver_request:burnrate1d - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1h]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[1h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[1h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[1h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[1h]))\n" labels: verb: write record: apiserver_request:burnrate1h - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[2h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[2h]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[2h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[2h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[2h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[2h]))\n" labels: verb: write record: apiserver_request:burnrate2h - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[30m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[30m]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[30m]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[30m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[30m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[30m]))\n" labels: verb: write record: apiserver_request:burnrate30m - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[3d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[3d]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[3d]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[3d]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[3d]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[3d]))\n" labels: verb: write record: apiserver_request:burnrate3d - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[5m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[5m]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[5m]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[5m]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[5m]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[5m]))\n" labels: verb: write record: apiserver_request:burnrate5m - - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n sum by (cluster) (rate(apiserver_request_slo_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[6h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[6h]))\n" + - expr: "(\n (\n # too slow\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_count{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\"}[6h]))\n -\n sum by (cluster) (rate(apiserver_request_sli_duration_seconds_bucket{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",subresource!~\"proxy|attach|log|exec|portforward\",le=\"1\"}[6h]))\n )\n +\n sum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\",code=~\"5..\"}[6h]))\n)\n/\nsum by (cluster) (rate(apiserver_request_total{job=\"apiserver\",verb=~\"POST|PUT|PATCH|DELETE\"}[6h]))\n" labels: verb: write record: apiserver_request:burnrate6h - name: kube-apiserver-histogram.rules rules: - - expr: 'histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_slo_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 + - expr: 'histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_sli_duration_seconds_bucket{job="apiserver",verb=~"LIST|GET",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 ' labels: quantile: '0.99' verb: read - record: cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile - - expr: 'histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_slo_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 + record: cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile + - expr: 'histogram_quantile(0.99, sum by (cluster, le, resource) (rate(apiserver_request_sli_duration_seconds_bucket{job="apiserver",verb=~"POST|PUT|PATCH|DELETE",subresource!~"proxy|attach|log|exec|portforward"}[5m]))) > 0 ' labels: quantile: '0.99' verb: write - record: cluster_quantile:apiserver_request_slo_duration_seconds:histogram_quantile + record: cluster_quantile:apiserver_request_sli_duration_seconds:histogram_quantile - interval: 3m name: kube-apiserver-availability.rules rules: @@ -723,32 +723,32 @@ spec: labels: verb: write record: code:apiserver_request_total:increase30d - - expr: 'sum by (cluster, verb, scope) (increase(apiserver_request_slo_duration_seconds_count{job="apiserver"}[1h])) + - expr: 'sum by (cluster, verb, scope) (increase(apiserver_request_sli_duration_seconds_count{job="apiserver"}[1h])) ' - record: cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h - - expr: 'sum by (cluster, verb, scope) (avg_over_time(cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase1h[30d]) * 24 * 30) + record: cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase1h + - expr: 'sum by (cluster, verb, scope) (avg_over_time(cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase1h[30d]) * 24 * 30) ' - record: cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d - - expr: 'sum by (cluster, verb, scope, le) (increase(apiserver_request_slo_duration_seconds_bucket[1h])) + record: cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d + - expr: 'sum by (cluster, verb, scope, le) (increase(apiserver_request_sli_duration_seconds_bucket[1h])) ' - record: cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h - - expr: 'sum by (cluster, verb, scope, le) (avg_over_time(cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase1h[30d]) * 24 * 30) + record: cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase1h + - expr: 'sum by (cluster, verb, scope, le) (avg_over_time(cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase1h[30d]) * 24 * 30) ' - record: cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d - - expr: "1 - (\n (\n # write too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n ) +\n (\n # read too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"\ + record: cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d + - expr: "1 - (\n (\n # write too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n ) +\n (\n # read too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"\ cluster\",le=\"30\"})\n )\n ) +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d)\n" labels: verb: all record: apiserver_request:availability30d - - expr: "1 - (\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n # too slow\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\"})\n" + - expr: "1 - (\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"LIST|GET\"})\n -\n (\n # too slow\n (\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=~\"resource|\",le=\"1\"})\n or\n vector(0)\n )\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"namespace\",le=\"5\"})\n +\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"LIST|GET\",scope=\"cluster\",le=\"30\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"read\"})\n" labels: verb: read record: apiserver_request:availability30d - - expr: "1 - (\n (\n # too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_slo_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_slo_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\"})\n" + - expr: "1 - (\n (\n # too slow\n sum by (cluster) (cluster_verb_scope:apiserver_request_sli_duration_seconds_count:increase30d{verb=~\"POST|PUT|PATCH|DELETE\"})\n -\n sum by (cluster) (cluster_verb_scope_le:apiserver_request_sli_duration_seconds_bucket:increase30d{verb=~\"POST|PUT|PATCH|DELETE\",le=\"1\"})\n )\n +\n # errors\n sum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\",code=~\"5..\"} or vector(0))\n)\n/\nsum by (cluster) (code:apiserver_request_total:increase30d{verb=\"write\"})\n" labels: verb: write record: apiserver_request:availability30d @@ -780,18 +780,28 @@ spec: ' record: code_verb:apiserver_request_total:increase1h - - name: k8s.rules + - name: k8s.rules.container_cpu_usage_seconds_total rules: - expr: "sum by (cluster, namespace, pod, container) (\n irate(container_cpu_usage_seconds_total{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}[5m])\n) * on (cluster, namespace, pod) group_left(node) topk by (cluster, namespace, pod) (\n 1, max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n" record: node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate + - name: k8s.rules.container_memory_working_set_bytes + rules: - expr: "container_memory_working_set_bytes{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n" record: node_namespace_pod_container:container_memory_working_set_bytes + - name: k8s.rules.container_memory_rss + rules: - expr: "container_memory_rss{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n" record: node_namespace_pod_container:container_memory_rss + - name: k8s.rules.container_memory_cache + rules: - expr: "container_memory_cache{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n" record: node_namespace_pod_container:container_memory_cache + - name: k8s.rules.container_memory_swap + rules: - expr: "container_memory_swap{job=\"kubelet\", metrics_path=\"/metrics/cadvisor\", image!=\"\"}\n* on (cluster, namespace, pod) group_left(node) topk by(cluster, namespace, pod) (1,\n max by(cluster, namespace, pod, node) (kube_pod_info{node!=\"\"})\n)\n" record: node_namespace_pod_container:container_memory_swap + - name: k8s.rules.container_resource + rules: - expr: "kube_pod_container_resource_requests{resource=\"memory\",job=\"kube-state-metrics\"} * on (namespace, pod, cluster)\ngroup_left() max by (namespace, pod, cluster) (\n (kube_pod_status_phase{phase=~\"Pending|Running\"} == 1)\n)\n" record: cluster:namespace:pod_memory:active:kube_pod_container_resource_requests - expr: "sum by (namespace, cluster) (\n sum by (namespace, pod, cluster) (\n max by (namespace, pod, container, cluster) (\n kube_pod_container_resource_requests{resource=\"memory\",job=\"kube-state-metrics\"}\n ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) (\n kube_pod_status_phase{phase=~\"Pending|Running\"} == 1\n )\n )\n)\n" @@ -808,6 +818,8 @@ spec: record: cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits - expr: "sum by (namespace, cluster) (\n sum by (namespace, pod, cluster) (\n max by (namespace, pod, container, cluster) (\n kube_pod_container_resource_limits{resource=\"cpu\",job=\"kube-state-metrics\"}\n ) * on(namespace, pod, cluster) group_left() max by (namespace, pod, cluster) (\n kube_pod_status_phase{phase=~\"Pending|Running\"} == 1\n )\n )\n)\n" record: namespace_cpu:kube_pod_container_resource_limits:sum + - name: k8s.rules.pod_owner + rules: - expr: "max by (cluster, namespace, workload, pod) (\n label_replace(\n label_replace(\n kube_pod_owner{job=\"kube-state-metrics\", owner_kind=\"ReplicaSet\"},\n \"replicaset\", \"$1\", \"owner_name\", \"(.*)\"\n ) * on(replicaset, namespace) group_left(owner_name) topk by(replicaset, namespace) (\n 1, max by (replicaset, namespace, owner_name) (\n kube_replicaset_owner{job=\"kube-state-metrics\"}\n )\n ),\n \"workload\", \"$1\", \"owner_name\", \"(.*)\"\n )\n)\n" labels: workload_type: deployment diff --git a/charts/kubezero-metrics/templates/rules/node-exporter.yaml b/charts/kubezero-metrics/templates/rules/node-exporter.yaml index 1361e0b8..617dcff6 100644 --- a/charts/kubezero-metrics/templates/rules/node-exporter.yaml +++ b/charts/kubezero-metrics/templates/rules/node-exporter.yaml @@ -270,6 +270,17 @@ spec: for: 5m labels: severity: warning + - alert: NodeBondingDegraded + annotations: + description: Bonding interface {{`{{`}} $labels.master {{`}}`}} on {{`{{`}} $labels.instance {{`}}`}} is in degraded state due to one or more slave failures. + runbook_url: https://runbooks.prometheus-operator.dev/runbooks/node/nodebondingdegraded + summary: Bonding interface is degraded + expr: '(node_bonding_slaves - node_bonding_active) != 0 + + ' + for: 5m + labels: + severity: warning - name: node-exporter.rules rules: - expr: "count without (cpu, mode) (\n node_cpu_seconds_total{job=\"node-exporter\",mode=\"idle\"}\n)\n" diff --git a/charts/kubezero-metrics/update.sh b/charts/kubezero-metrics/update.sh index 3dbf6523..505bb94c 100755 --- a/charts/kubezero-metrics/update.sh +++ b/charts/kubezero-metrics/update.sh @@ -20,3 +20,5 @@ cd - # Delete not used upstream dashboards or rules rm -rf charts/kube-prometheus-stack/templates/grafana/dashboards-1.14 charts/kube-prometheus-stack/templates/prometheus/rules-1.14 + +update_docs diff --git a/charts/kubezero/values.yaml b/charts/kubezero/values.yaml index 8dccbe37..84d26740 100644 --- a/charts/kubezero/values.yaml +++ b/charts/kubezero/values.yaml @@ -95,7 +95,7 @@ operators: metrics: enabled: false namespace: monitoring - targetRevision: 0.9.4 + targetRevision: 0.9.5 istio: grafana: {} prometheus: {}