Prometheus + DeepSeek:自动生成巡检脚本与告警规则配置实战
引言:自动化运维的新范式
在现代 IT 基础设施日益复杂化的背景下,监控与告警已成为保障系统稳定、高效运行的核心环节。Prometheus 作为云原生时代领先的开源监控解决方案,以其强大的数据模型、灵活的查询语言(PromQL)和高效的时序数据库,在监控领域占据了重要地位。然而,随着监控对象(主机、容器、中间件、微服务等)数量和复杂性的激增,传统的手动配置巡检脚本和告警规则方式变得愈发低效且容易出错。如何实现监控配置的自动化、智能化,成为提升运维效率的关键挑战。
DeepSeek 作为先进的人工智能大模型,在自然语言处理、代码生成、逻辑推理方面展现出卓越的能力。将 DeepSeek 与 Prometheus 相结合,可以利用 AI 的理解力和创造力,自动化生成针对特定场景的巡检脚本和告警规则配置,大幅提升运维工作的效率和准确性。
本文将深入探讨 Prometheus 与 DeepSeek 的整合实战,详细介绍如何利用 DeepSeek 的智能能力,自动生成用于 Prometheus 的巡检脚本(如 Exporter 配置检查、指标采集验证等)和告警规则配置文件(.rules 文件)。通过具体案例和代码示例,展示这一组合如何为运维工作带来革命性的效率提升。
第一部分:基础环境搭建与概念回顾
1.1 Prometheus 核心组件与工作流程
Prometheus 的架构主要包括以下几个核心组件:
- Prometheus Server: 核心服务,负责抓取(Scrape)和存储(Store)时间序列数据,提供查询(Query)接口和告警(Alerting)评估。
- Exporter: 暴露被监控对象(如 Node Exporter 暴露主机指标,MySQL Exporter 暴露数据库指标)的 HTTP 接口,供 Prometheus Server 抓取。
- Pushgateway: 允许短生命周期的任务(如批处理作业)将指标推送(Push)到此处,Prometheus 再从中抓取。
- Alertmanager: 处理 Prometheus Server 发出的告警(Alerts),进行去重、分组、静默,并通过邮件、Slack、Webhook 等方式通知。
- Service Discovery: 自动发现监控目标,支持 Kubernetes、Consul、DNS 等多种方式。
其基本工作流程如下:
- 配置:定义要抓取的监控目标(
scrape_configs)和告警规则(alerting.rules)。 - 抓取:Server 定期(根据
scrape_interval)向配置的目标(通常是 Exporter)发起 HTTP GET 请求获取指标数据。 - 存储:将获取的指标数据(键值对形式,包含时间戳)存储在本地时序数据库中。
- 查询:用户或 Dashboard 通过 PromQL 查询接口获取数据。
- 告警:Server 定期评估告警规则。如果规则条件(PromQL 表达式)满足,则生成一个告警实例并发送给 Alertmanager。
- 通知:Alertmanager 处理告警实例并发送通知。
1.2 DeepSeek 简介与适用场景
DeepSeek 是基于 Transformer 架构的大型语言模型,经过海量文本和代码数据的训练。其核心能力包括:
- 自然语言理解与生成:理解用户需求描述,生成流畅、准确的文本。
- 代码生成:根据自然语言描述或上下文,生成多种编程语言的代码片段(如 Python, YAML, Shell 等)。
- 逻辑推理:分析复杂场景,推导出合理的解决方案。
- 知识整合:结合领域知识(如 Prometheus 监控原理、Linux 系统知识)进行创作。
在 Prometheus 运维场景下,DeepSeek 可应用于:
- 自动生成 Exporter 安装与配置脚本。
- 自动生成 Prometheus Server 的
prometheus.yml配置片段(如scrape_configs)。 - 自动生成告警规则文件(
*.rules.yml),基于自然语言描述的告警条件。 - 自动生成巡检脚本,用于验证 Exporter 状态、指标采集是否正常、告警规则是否生效等。
- 生成监控报告,解读关键指标趋势。
- 辅助故障排查,根据异常指标提供可能的原因分析。
1.3 环境准备
1.3.1 Prometheus 环境搭建 (以 Linux 为例)
- 下载与安装:
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz tar xvfz prometheus-*.tar.gz cd prometheus-*/ - 配置
prometheus.yml(初始配置):global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - 启动 Prometheus:
./prometheus --config.file=prometheus.yml - 验证:访问
http://<server_ip>:9090,应能看到 Prometheus Web UI。
1.3.2 DeepSeek 环境准备
DeepSeek 可以通过其提供的 API 接口进行访问。你需要:
- 注册并获取 API Key (访问 https://www.deepseek.com)。
- 安装必要的 Python 库(如
requests)用于调用 API:pip install requests - 编写一个简单的 Python 脚本用于与 DeepSeek API 交互:
将import requests def ask_deepseek(prompt, model="deepseek-chat", api_key="YOUR_API_KEY"): url = "https://api.deepseek.com/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } data = { "model": model, "messages": [{"role": "user", "content": prompt}] } response = requests.post(url, headers=headers, json=data) response.raise_for_status() return response.json()["choices"][0]["message"]["content"] # 示例调用 if __name__ == "__main__": user_query = "请帮我生成一个用于监控 Linux 主机 CPU 使用率的 Prometheus 告警规则。" response = ask_deepseek(user_query) print(response)YOUR_API_KEY替换为你的实际 API Key。
1.3.3 安装 Node Exporter (示例 Exporter)
在需要监控的 Linux 主机上:
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xvfz node_exporter-*.tar.gz cd node_exporter-*/ ./node_exporter &在prometheus.yml的scrape_configs中添加新 job:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node-exporter' # 新增 static_configs: - targets: ['<node_exporter_host_ip>:9100'] # 替换为实际 IP重启 Prometheus 使其生效。
第二部分:DeepSeek 自动生成 Prometheus 告警规则
告警是监控系统的核心价值所在。手动编写复杂的 PromQL 表达式定义告警条件,既考验对业务的理解,也考验对 PromQL 的掌握程度。DeepSeek 可以理解自然语言描述的告警需求,自动生成准确、规范的告警规则配置。
2.1 告警规则文件结构
Prometheus 的告警规则通常定义在单独的 YAML 文件中(如node_alerts.rules.yml),并通过rule_files配置加载。一个典型的告警规则组包含:
groups: - name: node-alerts # 规则组名称 rules: - alert: HighNodeCPU # 告警名称 expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100 > 80 # PromQL 表达式 for: 5m # 持续时间 labels: severity: warning # 自定义标签 annotations: summary: "High CPU usage on {{ $labels.instance }}" # 告警摘要 description: "{{ $labels.instance }} CPU usage is above 80% for 5 minutes." # 告警详情groups: 包含多个规则组。name: 规则组标识符。rules: 组内具体的告警规则列表。alert: 告警名称(唯一标识)。expr: 触发告警的 PromQL 条件表达式。结果为true时触发。for: 表达式持续满足多长时间才触发告警(避免瞬时抖动)。labels: 附加到告警上的标签(如severity,team),用于 Alertmanager 分组和路由。annotations: 提供告警的详细描述信息,支持模板变量(如{{ $labels.instance }})。
2.2 使用 DeepSeek 生成告警规则
2.2.1 基础告警生成
用户需求描述示例:
请为 Prometheus 生成一个告警规则,当某台 Linux 主机的内存使用率超过 90% 并持续 3 分钟时,触发一个严重级别(severity: critical)的告警。告警摘要应包含主机实例名,描述应说明具体使用率。
DeepSeek 交互 Prompt:
prompt = """ 你是一个 Prometheus 告警配置专家。请根据以下要求生成一个完整的 Prometheus 告警规则 YAML 配置片段: * 告警名称 (alert): HighNodeMemory * 触发条件: Linux 主机内存使用率 > 90% * 持续时间 (for): 3分钟 * 严重级别标签 (labels.severity): critical * 告警摘要 (annotations.summary): 应包含变量 {{ $labels.instance }} * 告警详情 (annotations.description): 应说明具体使用率,使用变量 {{ $value }} 表示计算出的百分比 请使用标准的 Prometheus 告警规则 YAML 格式输出,不要包含任何解释性文字。 """ response = ask_deepseek(prompt) print(response)DeepSeek 可能生成的输出:
groups: - name: node-memory-alerts rules: - alert: HighNodeMemory expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90 for: 3m labels: severity: critical annotations: summary: "High Memory Usage on {{ $labels.instance }}" description: "Memory usage on {{ $labels.instance }} is at {{ $value }}% for 3 minutes."关键点解释:
expr: 使用了 Node Exporter 的node_memory_MemAvailable_bytes(可用内存) 和node_memory_MemTotal_bytes(总内存) 指标来计算使用率。公式为: $$ \text{Memory Usage} = \left(1 - \frac{\text{MemAvailable}}{\text{MemTotal}}\right) \times 100 $$ 该表达式计算出的值大于 90 时满足条件。for: 3m: 条件需持续 3 分钟才触发告警。annotations: 使用了模板变量{{ $labels.instance }}获取主机实例名,{{ $value }}获取expr计算出的当前值(即内存使用率百分比)。
2.2.2 进阶告警生成:复杂条件与聚合
用户需求描述示例:
请生成一个告警规则,用于监控 Kubernetes 集群中所有 Namespace 的 Pod 重启情况。如果某个 Namespace 在过去 10 分钟内,重启的 Pod 总数超过 20 次,则触发一个 warning 级别的告警。告警摘要应包含 Namespace 名称。
DeepSeek 交互 Prompt:
prompt = """ 作为 Prometheus 告警专家,请根据需求生成告警规则 YAML: * 告警名称: FrequentPodRestarts * 触发条件: 按 Namespace 统计,过去10分钟内 Pod 重启次数总和 > 20。使用指标 `kube_pod_container_status_restarts_total`。 * 持续时间 (for): 2分钟 (短暂持续即可) * 标签: severity: warning * 摘要: "Frequent Pod Restarts in namespace {{ $labels.namespace }}" * 详情: "Namespace {{ $labels.namespace }} has {{ $value }} pod restarts in the last 10 minutes." 注意:指标 `kube_pod_container_status_restarts_total` 是一个 Counter,表示容器重启次数。每个重启事件会使该 Counter 增加。 """ response = ask_deepseek(prompt) print(response)DeepSeek 可能生成的输出:
groups: - name: k8s-pod-restart-alerts rules: - alert: FrequentPodRestarts expr: sum by (namespace) (increase(kube_pod_container_status_restarts_total[10m])) > 20 for: 2m labels: severity: warning annotations: summary: "Frequent Pod Restarts in namespace {{ $labels.namespace }}" description: "Namespace {{ $labels.namespace }} has {{ $value }} pod restarts in the last 10 minutes."关键点解释:
expr: 使用了increase()函数计算 Counter 指标kube_pod_container_status_restarts_total在 10 分钟时间窗口[10m]内的增长量(即重启次数)。sum by (namespace): 按namespace标签进行分组求和,得到每个 Namespace 的总重启次数。- 表达式结果大于 20 时满足条件。
for: 2m: 考虑到重启事件可能集中发生,设置较短的持续时间。
2.2.3 生成告警规则文件与加载
将 DeepSeek 生成的 YAML 内容保存为文件,例如/etc/prometheus/rules/node_alerts.rules.yml。修改prometheus.yml加载该规则文件:
rule_files: - "rules/node_alerts.rules.yml" # - "rules/k8s_alerts.rules.yml" # 如果生成了 k8s 的重启 Prometheus Server 或发送 SIGHUP 信号 (kill -HUP <pid>) 使其重新加载配置。在 Prometheus Web UI 的 "Alerts" 页面可以看到新定义的告警及其状态。
第三部分:DeepSeek 自动生成 Prometheus 巡检脚本
除了告警,定期的系统巡检也是保障健康的必要手段。巡检脚本用于主动检查 Prometheus 自身及其监控对象的健康状态,如 Exporter 是否在线、指标是否正常采集、配置是否生效等。DeepSeek 可以生成用于执行这些检查的 Shell 或 Python 脚本。
3.1 巡检场景与目标
常见的巡检目标包括:
- Exporter 可用性:检查 Exporter 进程是否运行,端口是否开放。
- 指标采集状态:检查 Prometheus 是否成功抓取到目标(
up指标)。 - 告警规则状态:检查告警规则是否加载成功,是否处于激活状态。
- Prometheus 自身健康:检查 Prometheus Server 进程、存储、查询性能等。
- 配置有效性:模拟测试
prometheus.yml或规则文件是否有语法错误。
3.2 使用 DeepSeek 生成巡检脚本
3.2.1 生成 Exporter 状态检查脚本
用户需求描述示例:
请生成一个 Shell 脚本,用于检查指定主机上 Node Exporter 是否正在运行。脚本接受一个参数:目标主机 IP。如果 Exporter 进程 (名为
node_exporter) 存在且监听端口 9100,则输出 "OK: Node Exporter is running on [IP]"。否则输出 "ERROR: Node Exporter is NOT running on [IP]"。同时尝试通过curl访问http://[IP]:9100/metrics来验证指标端点是否可访问。
DeepSeek 交互 Prompt:
prompt = """ 你是一个 Linux 运维专家。请编写一个 Bash Shell 脚本,实现以下功能: 功能: 检查远程 Linux 主机上 Node Exporter 的运行状态。 输入: 脚本接受一个命令行参数:$1,表示目标主机的 IP 地址。 检查步骤: 1. 使用 SSH 连接到目标主机(假设已配置免密登录)。 2. 检查名为 'node_exporter' 的进程是否存在。 3. 检查端口 9100 是否被监听。 4. 尝试从本地(运行脚本的机器)使用 `curl` 访问 `http://$1:9100/metrics`,检查是否能成功获取指标数据(HTTP 状态码 200)。 输出: * 如果以上检查都通过:打印 "OK: Node Exporter is running on $1" * 如果任何一项检查失败:打印 "ERROR: Node Exporter is NOT running on $1" 并退出(exit 1) 请确保脚本具有健壮性,处理可能的 SSH 失败或 `curl` 失败情况。输出只包含结果信息。 """ response = ask_deepseek(prompt) print(response)DeepSeek 可能生成的输出:
#!/bin/bash # 检查是否提供了参数 if [ $# -ne 1 ]; then echo "Usage: $0 <target_host_ip>" exit 1 fi TARGET_IP=$1 # 检查进程是否存在 if ! ssh "$TARGET_IP" "pgrep -x node_exporter" &> /dev/null; then echo "ERROR: Node Exporter is NOT running on $TARGET_IP (Process not found)" exit 1 fi # 检查端口监听 (假设 netstat 或 ss 可用) if ! ssh "$TARGET_IP" "netstat -tuln | grep ':9100'" &> /dev/null; then echo "ERROR: Node Exporter is NOT running on $TARGET_IP (Port 9100 not listening)" exit 1 fi # 检查指标端点可访问性 CURL_OUTPUT=$(curl -s -o /dev/null -w "%{http_code}" "http://$TARGET_IP:9100/metrics") if [ "$CURL_OUTPUT" != "200" ]; then echo "ERROR: Node Exporter is NOT running on $TARGET_IP (Metrics endpoint returned HTTP $CURL_OUTPUT)" exit 1 fi echo "OK: Node Exporter is running on $TARGET_IP" exit 0关键点解释:
- 脚本接受一个参数
$1作为目标 IP。 - 使用
ssh远程执行命令检查进程 (pgrep) 和端口 (netstat)。假设 SSH 免密登录已配置。 - 使用
curl检查指标端点/metrics的 HTTP 状态码。 - 任何一步失败都会输出错误信息并退出(非零状态码)。
- 全部通过则输出成功信息。
3.2.2 生成 Prometheus 抓取目标状态检查脚本
用户需求描述示例:
请生成一个 Python 脚本,使用 Prometheus API 检查指定
job_name的所有抓取目标(target)的up状态。脚本接受两个参数:Prometheus Server 地址(如http://localhost:9090)和job_name。对于该 Job 下的每个 target,查询其up指标的最新值(1 表示健康,0 表示失败)。输出一个列表,显示每个 target 的实例地址(instance标签)和状态(UP/DOWN)。
DeepSeek 交互 Prompt:
prompt = """ 你是一个 Python 开发工程师,熟悉 Prometheus API。请编写一个 Python 脚本: 功能: 通过 Prometheus API 查询指定 `job_name` 的所有抓取目标的状态 (`up` 指标)。 输入参数 (命令行参数): 1. Prometheus Server 的地址 (如 'http://localhost:9090') 2. `job_name` (如 'node-exporter') 步骤: 1. 使用 `requests` 库调用 Prometheus API 的 `/api/v1/query` 端点。 2. 构造 PromQL 查询:`up{job="$job_name"}`。注意替换变量。 3. 解析 API 返回的 JSON 响应。 4. 遍历结果列表,对于每个结果: - 获取 `metric` 中的 `instance` 标签值。 - 获取 `value` 数组中的最新值(通常是第二个元素,一个浮点数:1.0 表示 UP, 0.0 表示 DOWN)。 5. 格式化输出:对于每个 instance,打印 "INSTANCE: [instance_address] STATUS: [UP/DOWN]"。 错误处理: * 处理可能的 API 请求失败(如连接错误)。 * 处理 API 返回错误(检查响应中的 `status` 字段)。 * 如果没有找到匹配的 target,输出提示信息。 依赖: 需要安装 `requests` 库。 请确保代码结构清晰,有必要的注释。 """ response = ask_deepseek(prompt) print(response)DeepSeek 可能生成的输出:
#!/usr/bin/env python3 import sys import requests import json def main(): if len(sys.argv) != 3: print("Usage: python check_target_status.py <prometheus_url> <job_name>") sys.exit(1) prom_url = sys.argv[1] job_name = sys.argv[2] # 构造 PromQL 查询 promql = f'up{{job="{job_name}"}}' api_endpoint = f"{prom_url}/api/v1/query" params = {'query': promql} try: response = requests.get(api_endpoint, params=params) response.raise_for_status() # 检查 HTTP 错误 data = response.json() except requests.exceptions.RequestException as e: print(f"ERROR: Failed to query Prometheus API: {e}") sys.exit(2) except json.JSONDecodeError: print("ERROR: Invalid JSON response from Prometheus") sys.exit(3) # 检查 Prometheus API 返回状态 if data.get('status') != 'success': print(f"ERROR: Prometheus API returned error: {data.get('error', 'Unknown error')}") sys.exit(4) result_data = data.get('data', {}).get('result', []) if not result_data: print(f"No targets found for job: {job_name}") sys.exit(0) print(f"Status for targets in job '{job_name}':") for result in result_data: metric = result.get('metric', {}) instance = metric.get('instance', 'unknown') # 获取最新值 (value 是一个 [timestamp, value] 列表) value_pair = result.get('value', []) if not value_pair or len(value_pair) < 2: status_str = "UNKNOWN (Invalid Value)" else: status_val = value_pair[1] status_str = "UP" if float(status_val) == 1.0 else "DOWN" print(f"INSTANCE: {instance} STATUS: {status_str}") if __name__ == "__main__": main()关键点解释:
- 脚本接受两个参数:Prometheus URL 和 job_name。
- 使用
requests库调用 Prometheus 的/api/v1/queryAPI。 - 构造 PromQL
up{job="job_name"}查询指定 job 下所有 target 的状态。 - 解析返回的 JSON:
- 检查顶层
status是否为'success'。 - 从
data.result中获取结果列表。
- 检查顶层
- 遍历每个结果:
- 从
metric对象获取instance标签。 - 从
value数组中获取第二个元素(指标值)。1.0为 UP,0.0为 DOWN。
- 从
- 格式化输出每个 instance 的状态。
- 包含基本的错误处理(参数检查、API 请求错误、JSON 解析错误、API 返回错误、无结果情况)。
3.2.3 生成告警规则加载检查脚本
用户需求描述示例:
请生成一个 Shell 脚本,用于检查 Prometheus 是否成功加载了指定的告警规则文件。脚本接受两个参数:Prometheus Server 地址和规则文件名(不含路径,如
node_alerts.rules.yml)。通过调用 Prometheus API 的/api/v1/rules端点,检查该文件名是否存在于返回的规则组列表中。如果存在且状态为 OK,则输出 "SUCCESS: Rule file [filename] is loaded"。如果不存在或状态错误,则输出 "ERROR: Rule file [filename] is not loaded or has errors"。
DeepSeek 交互 Prompt:
prompt = """ 你是一个 DevOps 工程师。编写一个 Bash Shell 脚本: 功能: 通过 Prometheus API 检查指定的告警规则文件是否已成功加载且无错误。 输入参数: 1. Prometheus Server 地址 (e.g., http://localhost:9090) 2. 规则文件名 (e.g., node_alerts.rules.yml) - 注意:Prometheus API 返回的是带路径的完整文件名,但通常我们配置的规则文件位于 `rules/` 目录下,所以 API 返回的 name 类似于 `rules/node_alerts.rules.yml`。脚本应能处理这种前缀。 步骤: 1. 调用 Prometheus API: `$prom_url/api/v1/rules` 2. 解析返回的 JSON 数据,找到 `groups` 下的规则组。 3. 检查每个规则组的 `file` 字段(它包含规则文件的路径)。 4. 判断传入的 `规则文件名` 是否出现在 `file` 字段的值中(使用字符串包含判断即可,例如 `file` 的值是 `/path/to/rules/node_alerts.rules.yml`,我们传入 `node_alerts.rules.yml`,只要文件名匹配就算找到)。 5. 对于匹配到的规则组,检查其 `health` 和 `lastError` 字段: - `health` 应为 "ok" - `lastError` 应为空字符串 6. 输出: - 如果找到文件且健康状态 OK:输出 "SUCCESS: Rule file [filename] is loaded" - 如果找到文件但有错误 (`health` != "ok" 或 `lastError` 非空):输出 "ERROR: Rule file [filename] has errors: [lastError]" - 如果未找到文件:输出 "ERROR: Rule file [filename] is not loaded" 依赖: 需要 `jq` 工具来解析 JSON。如果系统没有 `jq`,脚本应提示安装。 请确保脚本健壮,处理可能的 API 访问失败。 """ response = ask_deepseek(prompt) print(response)DeepSeek 可能生成的输出:
#!/bin/bash # 检查参数 if [ $# -ne 2 ]; then echo "Usage: $0 <prometheus_url> <rule_filename>" exit 1 fi PROM_URL="$1" RULE_FILENAME="$2" API_ENDPOINT="${PROM_URL}/api/v1/rules" # 检查 jq if ! command -v jq &> /dev/null; then echo "ERROR: 'jq' command is required but not installed. Please install jq." exit 2 fi # 调用 API response=$(curl -s "$API_ENDPOINT") if [ $? -ne 0 ]; then echo "ERROR: Failed to query Prometheus API at $API_ENDPOINT" exit 3 fi # 检查 API 状态 status=$(echo "$response" | jq -r '.status') if [ "$status" != "success" ]; then error=$(echo "$response" | jq -r '.error') echo "ERROR: Prometheus API returned error: $error" exit 4 fi # 查找规则文件 found=false has_errors=false error_message="" # 遍历规则组 groups=$(echo "$response" | jq -c '.data.groups[]') while IFS= read -r group; do file=$(echo "$group" | jq -r '.file') health=$(echo "$group" | jq -r '.health') last_error=$(echo "$group" | jq -r '.lastError') # 检查文件名是否包含用户输入的 RULE_FILENAME if [[ "$file" == *"$RULE_FILENAME"* ]]; then found=true if [ "$health" != "ok" ] || [ -n "$last_error" ]; then has_errors=true error_message="$last_error" fi fi done <<< "$groups" # 输出结果 if [ "$found" = false ]; then echo "ERROR: Rule file $RULE_FILENAME is not loaded" exit 5 elif [ "$has_errors" = true ]; then echo "ERROR: Rule file $RULE_FILENAME has errors: $error_message" exit 6 else echo "SUCCESS: Rule file $RULE_FILENAME is loaded" exit 0 fi关键点解释:
- 脚本接受两个参数:Prometheus URL 和规则文件名(如
node_alerts.rules.yml)。 - 使用
curl调用/api/v1/rulesAPI 获取当前加载的规则信息。 - 使用
jq解析返回的 JSON 数据:- 检查顶层
status。 - 遍历
data.groups[]数组。 - 对于每个 group,提取
file(规则文件路径),health(健康状况),lastError(错误信息)。
- 检查顶层
- 判断传入的
RULE_FILENAME是否是file路径的一部分(*"$RULE_FILENAME"*)。 - 如果找到文件:
- 检查
health是否为"ok"且lastError为空。 - 根据健康状况输出成功或错误信息(包含错误详情)。
- 检查
- 如果未找到文件,输出未加载错误。
- 依赖
jq进行 JSON 处理,并检查其是否存在。
第四部分:实战案例 - 自动化 K8s 集群监控配置
本节结合一个具体的 Kubernetes 集群监控场景,展示如何综合运用 DeepSeek 自动生成 Prometheus 配置、告警规则和巡检脚本。
4.1 场景描述
- 环境:一个多节点的 Kubernetes 集群(假设使用 kubeadm 部署)。
- 需求:
- 监控所有 Node 的系统指标(CPU, 内存, 磁盘, 网络)。
- 监控 Kubernetes 组件状态(API Server, Scheduler, Controller Manager, etcd, CoreDNS)。
- 监控 Pod 和容器的资源使用情况(CPU, 内存)。
- 监控 Deployment 的副本状态、Pod 重启次数。
- 配置相应的告警规则(如 Node NotReady, Pod 重启频繁, 容器 OOM 风险)。
- 生成定期巡检脚本,检查所有 Exporter 状态和关键告警规则是否生效。
4.2 使用 DeepSeek 生成配置与脚本
4.2.1 生成 Prometheus 抓取配置 (prometheus.yml)
用户需求描述:
请为监控 Kubernetes 集群生成一个
prometheus.yml的scrape_configs片段。要求包括:
- 使用
kubernetes_sd_configs自动发现 Node、Pod、Service、Endpoint 等目标。- 配置抓取 kubelet 指标(通常是
https://<node_ip>:10250/metrics,但需要跳过 TLS 验证或使用证书)。- 配置抓取 Kubernetes 组件(kube-apiserver, kube-controller-manager, kube-scheduler)。它们通常以 Pod 运行,可通过 Service 发现。
- 配置抓取 CoreDNS 指标(通过其 Service 发现)。
- 配置抓取 etcd 指标(假设 etcd 运行在非 2379 端口,且需要证书认证)。 请根据最佳实践生成配置,并添加必要的注释。
DeepSeek Prompt 与生成过程(略,生成包含多个job_name的scrape_configs,配置自动发现、relabeling、TLS 设置等)
4.2.2 生成告警规则 (k8s_alerts.rules.yml)
用户需求描述:
请生成一组针对 Kubernetes 集群的告警规则,包含以下内容:
- KubeNodeNotReady: 节点状态为 NotReady 超过 5 分钟。
- KubeDeploymentReplicasMismatch: Deployment 的
ready_replicas不等于replicas超过 10 分钟。- KubePodFrequentRestart: 单个 Pod 在过去 1 小时内重启次数超过 5 次 (使用
kube_pod_container_status_restarts_total)。- KubeContainerOOMKillingRisk: 容器内存使用量接近其 Limit (使用率 > 85%) 超过 5 分钟。
- KubeAPIHighLatency: API Server 请求延迟的 99 分位数(
apiserver_request_duration_seconds)超过 1 秒。 请生成完整的 YAML 规则文件内容,包含合理的for持续时间、severity标签和annotations。
DeepSeek Prompt 与生成过程(略,生成包含多个alert的规则组)
4.2.3 生成综合巡检脚本
用户需求描述:
请生成一个名为
k8s_monitoring_healthcheck.sh的 Shell 脚本,用于检查 Kubernetes 集群监控的健康状况。脚本执行以下检查:
- 检查 Prometheus Server 进程是否运行。
- 检查 Node Exporter 是否在每个 Worker Node 上运行(需要遍历节点列表)。
- 使用
kubectl检查 kube-state-metrics Deployment 是否可用(副本数 > 0)。- 调用 Prometheus API 检查关键告警规则文件(如
k8s_alerts.rules.yml)是否加载成功且无错误。- 调用 Prometheus API 检查关键抓取 Job(如
kubernetes-nodes,kubernetes-pods)的up状态,列出所有 DOWN 的 target。 脚本应输出汇总报告,清晰标明每项检查的结果(OK/ERROR)和详细信息。
DeepSeek Prompt 与生成过程(略,生成包含多个检查步骤、使用kubectl、curl、jq的复杂脚本)
4.3 部署与验证
- 部署配置:
- 将生成的
prometheus.yml放入 Prometheus Server 配置目录。 - 将生成的
k8s_alerts.rules.yml放入rules/目录,并在prometheus.yml中引用。 - 确保所有必要的 Exporter(Node Exporter, kube-state-metrics 等)已部署在集群内或节点上。
- 部署 Alertmanager 并配置通知渠道(邮件、Slack 等)。
- 将生成的
- 部署巡检脚本:将生成的
k8s_monitoring_healthcheck.sh脚本放在运维跳板机或定期任务服务器上。 - 启动/重启服务:启动/重启 Prometheus Server 和 Alertmanager。
- 验证:
- 访问 Prometheus Web UI -> Status -> Targets:查看所有抓取目标是否 UP。
- 访问 Prometheus Web UI -> Status -> Rules:查看告警规则是否加载,状态是否绿色 (OK)。
- 访问 Prometheus Web UI -> Alerts:查看告警是否处于非激活状态(或根据条件触发)。
- 手动运行
k8s_monitoring_healthcheck.sh脚本,观察输出是否全部为 OK。 - 模拟故障(如停掉一个 Node Exporter),观察告警是否触发,脚本是否能检测到错误。
第五部分:最佳实践、优化与未来展望
5.1 最佳实践
- 清晰的 Prompt 工程:向 DeepSeek 描述需求时,尽量具体、清晰、结构化。指定输入、输出格式、约束条件、依赖关系等。
- 模块化生成:不要试图让 DeepSeek 一次性生成一个巨大复杂的脚本或配置文件。将其分解为独立的模块(如单独的告警规则、单独的巡检步骤),分别生成后再组装。这更容易控制质量和调试。
- 代码审查与测试:始终将 DeepSeek 生成的代码或配置视为初稿。必须进行人工审查、测试和必要的调整。AI 可能遗漏边界条件或特定环境细节。
- 版本控制:将 DeepSeek 生成的配置文件和脚本纳入 Git 等版本控制系统管理,方便追踪变更和回滚。
- 结合 CI/CD:可以将 DeepSeek 集成到 CI/CD 流程中。例如,当监控需求文档更新后,自动触发 DeepSeek 生成新的规则或脚本草稿,经人工审核后自动部署。
- 安全考虑:
- 避免在 Prompt 或生成的脚本中硬编码敏感信息(密码、API Key)。使用环境变量或配置管理工具。
- 限制 DeepSeek 生成脚本的权限(如避免直接生成
rm -rf /)。 - 仔细审查涉及 SSH、API 调用、sudo 等操作的脚本。
5.2 优化方向
- 上下文学习:在连续的对话中,DeepSeek 可以学习之前的配置风格和约定(如特定的标签命名规则
severity: team-sre)。在后续的 Prompt 中提醒它参考之前的输出。 - 模板化:对于高度重复的结构(如大量类似的告警规则),可以先让 DeepSeek 生成一个模板,然后通过脚本或手动方式填充具体细节。
- 错误注入测试:生成巡检脚本后,可以进一步要求 DeepSeek 生成用于测试该脚本的"错误场景"(如模拟 Exporter 进程挂掉),验证脚本是否能正确捕获错误。
- 生成文档:让 DeepSeek 为生成的告警规则或巡检脚本自动编写说明文档,解释其工作原理和检查逻辑。
5.3 未来展望
DeepSeek 与 Prometheus 的结合代表了 AI 赋能运维(AIOps)的一个重要方向。未来可期的发展包括:
- 更智能的根因分析:DeepSeek 不仅能生成告警规则,还能在告警触发后,根据关联指标自动分析并提供可能的原因报告。
- 预测性监控:结合历史数据,DeepSeek 可生成预测未来资源瓶颈(如磁盘将满、CPU 过载)的告警规则或巡检建议。
- 自然语言查询:用户可以直接用自然语言查询监控数据(如“过去一周哪个 Namespace 的 Pod 重启最多?”),DeepSeek 将其翻译成 PromQL 并执行。
- 配置优化建议:DeepSeek 分析现有的 Prometheus 配置和抓取指标,提出优化建议(如调整
scrape_interval、合并类似规则、识别未使用的指标)。 - 闭环自动化:在检测到问题后,DeepSeek 不仅能告警,还能生成(或在安全约束下执行)修复脚本的草稿(如重启失败服务、清理磁盘空间)。
结语
Prometheus 提供了强大的监控数据采集、存储和告警能力,而 DeepSeek 则赋予了运维工作前所未有的智能化和自动化潜力。通过本文的实战演示,我们看到了如何利用 DeepSeek 的自然语言理解和代码生成能力,自动化完成 Prometheus 告警规则配置和系统巡检脚本的编写工作,将运维人员从繁琐、易错的手动配置中解放出来,使其能够更专注于高价值的架构优化和问题解决。
需要注意的是,AI 生成的输出仍需人工把关和测试。但随着 AI 模型的不断进步和我们对 Prompt 工程理解的加深,DeepSeek 与 Prometheus 的融合必将为 IT 运维领域带来更高效、更智能的未来。开始尝试将 DeepSeek 融入你的 Prometheus 运维工作流,迈出智能化运维的第一步吧!