From b75043cb459d2ed4819c1f895c8340fc46f6fda8 Mon Sep 17 00:00:00 2001 From: panxiao81 Date: Fri, 25 Sep 2026 19:36:30 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E8=AF=81=E4=B9=A6=E3=80=81?= =?UTF-8?q?=E7=A7=98=E5=AF=86=E5=90=8C=E6=AD=A5=E3=80=81GitOps=20=E4=B8=8E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9C=8D=E5=8A=A1=E7=9B=91=E6=8E=A7=20(#160)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: panxiao81 --- .../kube-state-metrics-helmrelease.yaml | 194 ++++++++++++++++++ .../observability/metrics/kustomization.yaml | 5 + .../metrics/rules/data-services.yaml | 148 +++++++++++++ .../metrics/rules/platform-controllers.yaml | 161 +++++++++++++++ .../observability/metrics/scrapes/cnpg.yaml | 22 ++ .../metrics/scrapes/platform-controllers.yaml | 57 +++++ .../metrics/scrapes/seaweedfs.yaml | 25 +++ .../metrics/tests/check-rules.sh | 6 +- .../metrics/tests/platform.test.yaml | 176 ++++++++++++++++ 9 files changed, 791 insertions(+), 3 deletions(-) create mode 100644 platform/observability/metrics/rules/data-services.yaml create mode 100644 platform/observability/metrics/rules/platform-controllers.yaml create mode 100644 platform/observability/metrics/scrapes/cnpg.yaml create mode 100644 platform/observability/metrics/scrapes/platform-controllers.yaml create mode 100644 platform/observability/metrics/scrapes/seaweedfs.yaml create mode 100644 platform/observability/metrics/tests/platform.test.yaml diff --git a/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml b/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml index ccab68e..af906ec 100644 --- a/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml +++ b/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml @@ -58,3 +58,197 @@ spec: honorLabels: true selfMonitor: enabled: true + rbac: + extraRules: + - apiGroups: + - kustomize.toolkit.fluxcd.io + resources: + - kustomizations + verbs: + - list + - watch + - apiGroups: + - helm.toolkit.fluxcd.io + resources: + - helmreleases + verbs: + - list + - watch + - apiGroups: + - source.toolkit.fluxcd.io + resources: + - gitrepositories + - helmrepositories + - helmcharts + - ocirepositories + verbs: + - list + - watch + customResourceState: + enabled: true + config: + kind: CustomResourceStateMetrics + spec: + resources: + - groupVersionKind: + group: kustomize.toolkit.fluxcd.io + version: v1 + kind: Kustomization + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status + - groupVersionKind: + group: helm.toolkit.fluxcd.io + version: v2 + kind: HelmRelease + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status + - groupVersionKind: + group: source.toolkit.fluxcd.io + version: v1 + kind: GitRepository + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status + - groupVersionKind: + group: source.toolkit.fluxcd.io + version: v1 + kind: HelmRepository + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status + - groupVersionKind: + group: source.toolkit.fluxcd.io + version: v1 + kind: HelmChart + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status + - groupVersionKind: + group: source.toolkit.fluxcd.io + version: v1 + kind: OCIRepository + metricNamePrefix: gotk + metrics: + - name: resource_info + help: The current state of a GitOps Toolkit resource. + each: + type: Info + info: + labelsFromPath: + name: + - metadata + - name + labelsFromPath: + resource_namespace: + - metadata + - namespace + suspended: + - spec + - suspend + ready: + - status + - conditions + - '[type=Ready]' + - status diff --git a/platform/observability/metrics/kustomization.yaml b/platform/observability/metrics/kustomization.yaml index af1c18e..c0a5970 100644 --- a/platform/observability/metrics/kustomization.yaml +++ b/platform/observability/metrics/kustomization.yaml @@ -21,3 +21,8 @@ resources: - rules/kubernetes-health.yaml - rules/host-health.yaml - rules/monitoring-delivery.yaml + - scrapes/platform-controllers.yaml + - rules/platform-controllers.yaml + - scrapes/cnpg.yaml + - scrapes/seaweedfs.yaml + - rules/data-services.yaml diff --git a/platform/observability/metrics/rules/data-services.yaml b/platform/observability/metrics/rules/data-services.yaml new file mode 100644 index 0000000..a8d2696 --- /dev/null +++ b/platform/observability/metrics/rules/data-services.yaml @@ -0,0 +1,148 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: data-services + namespace: monitoring +spec: + groups: + - name: data-services + interval: 30s + rules: + - alert: DataServiceMetricsUnavailable + expr: up{job="cnpg"} == 0 or absent(up{job="cnpg"}) + for: 5m + labels: + severity: critical + job: cnpg + annotations: + summary: 数据服务 {{ $labels.job }} 指标不可用 + description: 检查监控对象、Pod 与 exporter;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: DataServiceMetricsUnavailable + expr: up{job="seaweedfs-master"} == 0 or absent(up{job="seaweedfs-master"}) + for: 5m + labels: + severity: critical + job: seaweedfs-master + annotations: + summary: 数据服务 {{ $labels.job }} 指标不可用 + description: 检查监控对象、Pod 与 exporter;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: DataServiceMetricsUnavailable + expr: up{job="seaweedfs-volume"} == 0 or absent(up{job="seaweedfs-volume"}) + for: 5m + labels: + severity: critical + job: seaweedfs-volume + annotations: + summary: 数据服务 {{ $labels.job }} 指标不可用 + description: 检查监控对象、Pod 与 exporter;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: DataServiceMetricsUnavailable + expr: up{job="seaweedfs-filer"} == 0 or absent(up{job="seaweedfs-filer"}) + for: 5m + labels: + severity: critical + job: seaweedfs-filer + annotations: + summary: 数据服务 {{ $labels.job }} 指标不可用 + description: 检查监控对象、Pod 与 exporter;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: CnpgPostgresDown + expr: cnpg_collector_up{job="cnpg"} == 0 + for: 2m + labels: + severity: critical + annotations: + summary: CNPG {{ $labels.pod }} PostgreSQL 不可用 + description: 检查数据库 Pod 状态、实例日志和存储;exporter up 不代表数据库可用。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: CnpgMetricsCollectionFailed + expr: cnpg_collector_last_collection_error{job="cnpg"} == 1 + for: 5m + labels: + severity: warning + annotations: + summary: CNPG {{ $labels.pod }} SQL 指标采集失败 + description: 检查内置 exporter 日志、数据库连接与查询兼容性。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: CnpgConnectionsHigh + expr: sum by (job,namespace,pod) (cnpg_backends_total{job="cnpg"}) / on(job,namespace,pod) + max by(job,namespace,pod) (cnpg_pg_settings_setting{job="cnpg",name="max_connections"}) + > 0.8 + for: 10m + labels: + severity: warning + annotations: + summary: CNPG {{ $labels.pod }} 连接使用率超过 80% + description: 检查连接池、空闲连接和连接泄漏,不直接提高 max_connections。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: CnpgLongTransaction + expr: cnpg_backends_max_tx_duration_seconds{job="cnpg",state!="idle"} > 300 + for: 5m + labels: + severity: warning + annotations: + summary: CNPG {{ $labels.pod }} 存在长事务 + description: 事务持续超过五分钟并维持五分钟,检查阻塞与 idle in transaction;先确认业务再处理。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: NatsJetStreamStorageHigh + expr: nats_varz_jetstream_stats_storage{job="nats/nats"} / nats_varz_jetstream_config_max_storage{job="nats/nats"} + > 0.8 + for: 10m + labels: + severity: warning + annotations: + summary: NATS JetStream 文件容量超过 80% + description: 检查服务端配额与消息保留策略;该指标不代表单个 Account 或 stream 配额。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: NatsJetStreamMemoryHigh + expr: nats_varz_jetstream_stats_memory{job="nats/nats"} / nats_varz_jetstream_config_max_memory{job="nats/nats"} + > 0.8 + for: 10m + labels: + severity: warning + annotations: + summary: NATS JetStream 内存容量超过 80% + description: 检查 memory store 消息保留与服务端内存配额。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: NatsSlowConsumers + expr: increase(nats_varz_slow_consumers{job="nats/nats"}[10m]) > 0 + for: 5m + labels: + severity: warning + annotations: + summary: NATS 检测到慢消费者 + description: 检查消费者处理速率与网络;此规则不能代替 JetStream consumer 积压监控。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: SeaweedVolumeDiskLow + expr: SeaweedFS_volumeServer_resource{job="seaweedfs-volume",type="avail"} / + ignoring(type) SeaweedFS_volumeServer_resource{job="seaweedfs-volume",type="all"} + < 0.1 + for: 10m + labels: + severity: warning + annotations: + summary: SeaweedFS {{ $labels.name }} 可用空间不足 10% + description: 检查 volume 文件系统容量、保留策略与底层 ZFS;不要直接删除卷文件。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: SeaweedVolumeDiskReadOnly + expr: SeaweedFS_volumeServer_read_only_volumes{job="seaweedfs-volume",type="isDiskSpaceLow"} + > 0 + for: 5m + labels: + severity: critical + annotations: + summary: SeaweedFS 因磁盘空间不足限制卷写入 + description: 检查磁盘容量和 volume 日志;主动只读或满卷切换不按此故障处理。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md + - alert: SeaweedVolumeWriteFailures + expr: increase(SeaweedFS_volumeServer_file_write_failures{job="seaweedfs-volume"}[5m]) + > 0 + for: 2m + labels: + severity: warning + annotations: + summary: SeaweedFS 卷写入失败 + description: 检查 volume 日志、磁盘状态及上游请求;不代表已经验证 S3 端到端可用。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md diff --git a/platform/observability/metrics/rules/platform-controllers.yaml b/platform/observability/metrics/rules/platform-controllers.yaml new file mode 100644 index 0000000..1985ba5 --- /dev/null +++ b/platform/observability/metrics/rules/platform-controllers.yaml @@ -0,0 +1,161 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: platform-controllers + namespace: monitoring +spec: + groups: + - name: platform-controllers + interval: 30s + rules: + - alert: PlatformControllerMetricsUnavailable + expr: up{job="cert-manager"} == 0 or absent(up{job="cert-manager"}) + for: 5m + labels: + severity: warning + job: cert-manager + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="external-secrets"} == 0 or absent(up{job="external-secrets"}) + for: 5m + labels: + severity: warning + job: external-secrets + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="external-secrets-cert-controller"} == 0 or absent(up{job="external-secrets-cert-controller"}) + for: 5m + labels: + severity: warning + job: external-secrets-cert-controller + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="external-secrets-webhook"} == 0 or absent(up{job="external-secrets-webhook"}) + for: 5m + labels: + severity: warning + job: external-secrets-webhook + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="helm-controller"} == 0 or absent(up{job="helm-controller"}) + for: 5m + labels: + severity: warning + job: helm-controller + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="kustomize-controller"} == 0 or absent(up{job="kustomize-controller"}) + for: 5m + labels: + severity: warning + job: kustomize-controller + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="source-controller"} == 0 or absent(up{job="source-controller"}) + for: 5m + labels: + severity: warning + job: source-controller + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: PlatformControllerMetricsUnavailable + expr: up{job="notification-controller"} == 0 or absent(up{job="notification-controller"}) + for: 5m + labels: + severity: warning + job: notification-controller + annotations: + summary: 控制器 {{ $labels.job }} 指标不可用 + description: 检查对应 Pod、监控 CR 转换与 targets;目标消失同样触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: CertificateNotReady + expr: certmanager_certificate_ready_status{job="cert-manager",condition="True"} + == 0 + for: 15m + labels: + severity: warning + annotations: + summary: 证书 {{ $labels.namespace }}/{{ $labels.name }} 未就绪 + description: 检查 Certificate、CertificateRequest、Issuer、Order 与 Challenge;允许短暂签发过程。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: CertificateExpiringSoon + expr: (certmanager_certificate_expiration_timestamp_seconds{job="cert-manager"} + - time() < 7 * 86400) and (certmanager_certificate_expiration_timestamp_seconds{job="cert-manager"} + - time() >= 86400) + for: 15m + labels: + severity: warning + annotations: + summary: 证书 {{ $labels.namespace }}/{{ $labels.name }} 将在七天内到期 + description: 检查自动续期链路及实际入口证书;一天内到期由 critical 规则接替。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: CertificateExpiryCritical + expr: certmanager_certificate_expiration_timestamp_seconds{job="cert-manager"} + - time() < 86400 + for: 5m + labels: + severity: critical + annotations: + summary: 证书 {{ $labels.namespace }}/{{ $labels.name }} 即将到期或已过期 + description: 不足一天或已经过期;立即检查续期与入口证书。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: ExternalSecretNotReady + expr: externalsecret_status_condition{job="external-secrets",condition="Ready",status="True"} + == 0 + for: 10m + labels: + severity: warning + annotations: + summary: Secret 同步 {{ $labels.namespace }}/{{ $labels.name }} 未就绪 + description: 检查 ExternalSecret 状态及 provider 权限、网络;不要输出 Secret 内容。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: ClusterSecretStoreNotReady + expr: clustersecretstore_status_condition{job="external-secrets",condition="Ready",status="True"} + == 0 + for: 5m + labels: + severity: critical + annotations: + summary: ClusterSecretStore {{ $labels.name }} 未就绪 + description: 检查 OpenBao 可达性与 ESO 身份鉴权;可能影响多个命名空间。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: FluxResourceNotReady + expr: gotk_resource_info{job="kube-state-metrics",ready!="True",suspended!="true"} + == 1 + for: 15m + labels: + severity: warning + annotations: + summary: Flux {{ $labels.customresource_kind }} {{ $labels.resource_namespace + }}/{{ $labels.name }} 未就绪 + description: 检查对象 conditions、依赖和 controller 日志;主动 suspend 不触发,不自动解除暂停。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md + - alert: FluxStateMetricsMissing + expr: absent(gotk_resource_info{job="kube-state-metrics",customresource_kind="Kustomization",resource_namespace="flux-system",name="flux-system"}) + for: 5m + labels: + severity: warning + annotations: + summary: Flux 对象状态指标缺失 + description: 检查 kube-state-metrics 自定义资源配置、RBAC 与采集;不能把空结果当作健康。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md diff --git a/platform/observability/metrics/scrapes/cnpg.yaml b/platform/observability/metrics/scrapes/cnpg.yaml new file mode 100644 index 0000000..1c5e5a9 --- /dev/null +++ b/platform/observability/metrics/scrapes/cnpg.yaml @@ -0,0 +1,22 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: cnpg + namespace: monitoring +spec: + namespaceSelector: + matchNames: + - shared-db + selector: + matchLabels: + cnpg.io/cluster: shared-postgresql + cnpg.io/podRole: instance + podTargetLabels: + - cnpg.io/cluster + podMetricsEndpoints: + - port: metrics + interval: 30s + honorLabels: true + relabelings: + - targetLabel: job + replacement: cnpg diff --git a/platform/observability/metrics/scrapes/platform-controllers.yaml b/platform/observability/metrics/scrapes/platform-controllers.yaml new file mode 100644 index 0000000..d3b3c3b --- /dev/null +++ b/platform/observability/metrics/scrapes/platform-controllers.yaml @@ -0,0 +1,57 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: cert-manager + namespace: monitoring +spec: + namespaceSelector: + matchNames: + - cert-manager + selector: + matchLabels: + app.kubernetes.io/name: cert-manager + app.kubernetes.io/component: controller + jobLabel: app.kubernetes.io/name + endpoints: + - port: http-metrics + interval: 30s + scrapeTimeout: 10s + honorLabels: true +--- +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: external-secrets + namespace: monitoring +spec: + namespaceSelector: + matchNames: + - external-secrets + selector: + matchLabels: + app.kubernetes.io/instance: external-secrets + jobLabel: app.kubernetes.io/name + podMetricsEndpoints: + - port: metrics + interval: 30s + scrapeTimeout: 10s + honorLabels: true +--- +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: flux-controllers + namespace: monitoring +spec: + namespaceSelector: + matchNames: + - flux-system + selector: + matchLabels: + app.kubernetes.io/part-of: flux + jobLabel: app + podMetricsEndpoints: + - port: http-prom + interval: 30s + scrapeTimeout: 10s + honorLabels: true diff --git a/platform/observability/metrics/scrapes/seaweedfs.yaml b/platform/observability/metrics/scrapes/seaweedfs.yaml new file mode 100644 index 0000000..fe37836 --- /dev/null +++ b/platform/observability/metrics/scrapes/seaweedfs.yaml @@ -0,0 +1,25 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: seaweedfs + namespace: monitoring +spec: + namespaceSelector: + matchNames: + - seaweedfs + selector: + matchLabels: + app.kubernetes.io/name: seaweedfs + app.kubernetes.io/instance: seaweedfs + endpoints: + - port: metrics + interval: 30s + honorLabels: true + relabelings: + - sourceLabels: + - __meta_kubernetes_service_name + regex: seaweedfs-(master|volume|filer) + action: keep + - sourceLabels: + - __meta_kubernetes_service_name + targetLabel: job diff --git a/platform/observability/metrics/tests/check-rules.sh b/platform/observability/metrics/tests/check-rules.sh index b36be38..8bac009 100644 --- a/platform/observability/metrics/tests/check-rules.sh +++ b/platform/observability/metrics/tests/check-rules.sh @@ -10,11 +10,11 @@ import sys import yaml groups = [] -for name in ("kubernetes-health", "host-health", "monitoring-delivery"): +for name in ("kubernetes-health", "host-health", "monitoring-delivery", "platform-controllers", "data-services"): path = pathlib.Path(sys.argv[1]) / f"{name}.yaml" groups.extend(yaml.safe_load(path.read_text())["spec"]["groups"]) pathlib.Path(sys.argv[2]).write_text(yaml.safe_dump({"groups": groups}, allow_unicode=True)) PY -cp "$test_dir/foundation.test.yaml" "$check_dir/foundation.test.yaml" +cp "$test_dir/"*.test.yaml "$check_dir/" promtool check rules "$check_dir/rules.yaml" -promtool test rules "$check_dir/foundation.test.yaml" +promtool test rules "$check_dir/"*.test.yaml diff --git a/platform/observability/metrics/tests/platform.test.yaml b/platform/observability/metrics/tests/platform.test.yaml new file mode 100644 index 0000000..31b32f4 --- /dev/null +++ b/platform/observability/metrics/tests/platform.test.yaml @@ -0,0 +1,176 @@ +rule_files: +- rules.yaml +evaluation_interval: 1m +tests: +- name: Flux 暂停的失败对象不报警 + interval: 1m + input_series: + - series: gotk_resource_info{job="kube-state-metrics",ready="False",suspended="true",customresource_kind="HelmRelease",resource_namespace="app",name="paused"} + values: 1x30 + alert_rule_test: + - eval_time: 20m + alertname: FluxResourceNotReady + exp_alerts: [] +- name: Flux 缺省 suspend 仍检测失败 + interval: 1m + input_series: + - series: gotk_resource_info{job="kube-state-metrics",ready="False",customresource_kind="HelmRelease",resource_namespace="app",name="broken"} + values: 1x30 + alert_rule_test: + - eval_time: 10m + alertname: FluxResourceNotReady + exp_alerts: [] + - eval_time: 16m + alertname: FluxResourceNotReady + exp_alerts: + - exp_labels: + job: kube-state-metrics + ready: 'False' + customresource_kind: HelmRelease + resource_namespace: app + name: broken + severity: warning + exp_annotations: + summary: Flux HelmRelease app/broken 未就绪 + description: 检查对象 conditions、依赖和 controller 日志;主动 suspend 不触发,不自动解除暂停。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md +- name: 证书一天内到期只由 critical 接替 + interval: 1m + input_series: + - series: certmanager_certificate_expiration_timestamp_seconds{job="cert-manager",namespace="app",name="tls"} + values: 3600x30 + alert_rule_test: + - eval_time: 20m + alertname: CertificateExpiringSoon + exp_alerts: [] +- name: 过期证书仍持续 critical + interval: 1m + input_series: + - series: certmanager_certificate_expiration_timestamp_seconds{job="cert-manager",namespace="app",name="tls"} + values: '0x30' + alert_rule_test: + - eval_time: 4m + alertname: CertificateExpiryCritical + exp_alerts: [] + - eval_time: 6m + alertname: CertificateExpiryCritical + exp_alerts: + - exp_labels: + job: cert-manager + namespace: app + name: tls + severity: critical + exp_annotations: + summary: 证书 app/tls 即将到期或已过期 + description: 不足一天或已经过期;立即检查续期与入口证书。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md +- name: ESO False 零值不能导致健康对象误报 + interval: 1m + input_series: + - series: externalsecret_status_condition{job="external-secrets",condition="Ready",status="False",namespace="app",name="credentials"} + values: '0x30' + - series: externalsecret_status_condition{job="external-secrets",condition="Ready",status="True",namespace="app",name="credentials"} + values: 1x30 + alert_rule_test: + - eval_time: 20m + alertname: ExternalSecretNotReady + exp_alerts: [] +- name: ESO 失败持续十分钟报警 + interval: 1m + input_series: + - series: externalsecret_status_condition{job="external-secrets",condition="Ready",status="True",namespace="app",name="credentials"} + values: '0x30' + alert_rule_test: + - eval_time: 9m + alertname: ExternalSecretNotReady + exp_alerts: [] + - eval_time: 11m + alertname: ExternalSecretNotReady + exp_alerts: + - exp_labels: + job: external-secrets + condition: Ready + status: 'True' + namespace: app + name: credentials + severity: warning + exp_annotations: + summary: Secret 同步 app/credentials 未就绪 + description: 检查 ExternalSecret 状态及 provider 权限、网络;不要输出 Secret 内容。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md +- name: CNPG 聚合数据库连接并对齐实例限额 + interval: 1m + input_series: + - series: cnpg_backends_total{job="cnpg",namespace="db",pod="pg-1",datname="a"} + values: 50x30 + - series: cnpg_backends_total{job="cnpg",namespace="db",pod="pg-1",datname="b"} + values: 40x30 + - series: cnpg_pg_settings_setting{job="cnpg",namespace="db",pod="pg-1",name="max_connections"} + values: 100x30 + alert_rule_test: + - eval_time: 9m + alertname: CnpgConnectionsHigh + exp_alerts: [] + - eval_time: 11m + alertname: CnpgConnectionsHigh + exp_alerts: + - exp_labels: + job: cnpg + namespace: db + pod: pg-1 + severity: warning + exp_annotations: + summary: CNPG pg-1 连接使用率超过 80% + description: 检查连接池、空闲连接和连接泄漏,不直接提高 max_connections。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md +- name: SeaweedFS 磁盘分母忽略 type 标签 + interval: 1m + input_series: + - series: SeaweedFS_volumeServer_resource{job="seaweedfs-volume",name="/data",type="avail"} + values: 5x30 + - series: SeaweedFS_volumeServer_resource{job="seaweedfs-volume",name="/data",type="all"} + values: 100x30 + alert_rule_test: + - eval_time: 9m + alertname: SeaweedVolumeDiskLow + exp_alerts: [] + - eval_time: 11m + alertname: SeaweedVolumeDiskLow + exp_alerts: + - exp_labels: + job: seaweedfs-volume + name: /data + severity: warning + exp_annotations: + summary: SeaweedFS /data 可用空间不足 10% + description: 检查 volume 文件系统容量、保留策略与底层 ZFS;不要直接删除卷文件。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-data-services.md +- name: NATS 历史慢消费者计数不持续报警 + interval: 1m + input_series: + - series: nats_varz_slow_consumers{job="nats/nats"} + values: 10x30 + alert_rule_test: + - eval_time: 20m + alertname: NatsSlowConsumers + exp_alerts: [] +- name: Flux 根对象状态指标缺失报警 + interval: 1m + input_series: [] + alert_rule_test: + - eval_time: 4m + alertname: FluxStateMetricsMissing + exp_alerts: [] + - eval_time: 6m + alertname: FluxStateMetricsMissing + exp_alerts: + - exp_labels: + job: kube-state-metrics + customresource_kind: Kustomization + resource_namespace: flux-system + name: flux-system + severity: warning + exp_annotations: + summary: Flux 对象状态指标缺失 + description: 检查 kube-state-metrics 自定义资源配置、RBAC 与采集;不能把空结果当作健康。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-controllers.md