专业的编程技术博客社区

网站首页 > 博客文章 正文

Prometheus 监控告警体系详解:Prometheus+Grafana+Alertmanager

baijin 2024-08-17 10:42:20 博客文章 4 ℃ 0 评论

应用场景有哪些?

一、云原生应用的监控

  1. 像微服务架构里的每个服务,它们的性能指标比如 CPU 使用率、内存用了多少、网络流量大小,都能监控。就拿电商平台的微服务架构来说,能随时知道订单处理服务、支付服务这些的资源使用状况。
  2. 容器化应用的运行咋样,也能盯着,要是哪个容器内存占得多,超过了设定值,马上就能告警。

二、基础设施的监控

  1. 服务器的硬件指标,像磁盘读写速度、温度啥的,都能看。就说数据中心的服务器,能保证它们稳稳当当运行。
  2. 网络设备的性能,像交换机端口的流量、路由器的负载,也能监测着。

三、数据库的监控

  1. 数据库的性能数据,像查询响应得多久、有多少连接,能实时掌握。比如说大型关系型数据库,能很快发现查询性能变差的情况。
  2. 数据库的存储空间用了多少也能盯着,提前知道是不是快不够用了。

四、应用性能的管理(APM)

  1. 能深挖应用程序的性能卡点,比如哪个函数执行起来花的时间太长。
  2. 应用程序的错误率还有异常情况也能跟踪,赶紧告诉开发团队去修。

五、业务指标的监控

  1. 关键的业务指标,像订单数量、用户活跃程度,都能监测。比如在社交平台上,能实时看到每天活跃用户数量的变化。
  2. 根据业务指标的走势做预测和告警,能给业务决策帮上忙。

这3个模块都是干嘛用的?

Prometheus :是一个开源的监控系统,还带着时间序列数据库,它能把各种指标数据收集起来存好。

  • 会主动去抓被监控对象给出的指标信息。
  • 能采集好几种数据类型,像计数器、仪表盘、直方图这些都没问题。
  • 有很厉害的查询语言,方便咱去查数据、做分析。

【案例】比如说在一个 Web 应用里,Prometheus 能把服务器的 CPU 使用率、内存占了多少、请求响应要多久这些指标都采集了。

Grafana :是一个搞数据可视化和监控的开源平台。

  • 能连上好多数据源,Prometheus 也包括在内。
  • 能提供各种各样的图表和仪表盘创建功能,把数据清楚明白地展示出来。
  • 还支持自己定布局和样式,能满足咱不同的需求。

【案例】通过 Grafana ,能把 Prometheus 采来的服务器性能指标弄成折线图、柱状图啥的,让运维的人一眼就能明白系统运行得咋样。

Alertmanager :主要就是管告警通知的。

  • 能接收 Prometheus 发过来的告警信息。
  • 能给告警分组、不让多余的告警一直发(抑制)、还能让告警安静会儿(静默),免得告警太多把人弄晕。
  • 支持好多通知的办法,像电子邮件、短信、即时通讯工具这些都行。

【案例】比如说服务器的 CPU 使用率一直太高,超过设好的阈值了,Alertmanager 就会按咱配好的规则给相关的人发告警通知,好让人赶紧想办法解决问题。

整个工作流程是怎样的?

  1. 指标采集(Prometheus
  • Prometheus 按照咱提前设好的规矩,通过 HTTP 协议主动从被监控的那些东西(像服务器、应用程序、数据库啥的)去拉指标数据。这些指标数据一般都是用特定的格式露出来的。
  1. 数据存储(Prometheus
  • Prometheus 把采集来的指标数据按时间顺序存在它自己里面的数据库里。
  1. 查询和分析(Prometheus
  • 咱们能用 Prometheus 给的厉害的查询语言 PromQL 去查存起来的数据,分析分析,好拿到咱想要的监控信息。
  1. 数据可视化(Grafana
  • Grafana 从 Prometheus 那里拿数据,然后通过弄各种图表、仪表盘这些可视化的东西,把数据清楚好看地展示给咱们。咱们能按照自己的需要弄不一样的视图和监控面板。
  1. 告警触发(Prometheus
  • 按照设好的告警规则,要是 Prometheus 发现指标数据超过了定好的阈值或者有不正常的情况,就会给 Alertmanager 发告警信息。
  1. 告警处理(Alertmanager
  • Alertmanager 收到 Prometheus 的告警后,按照咱设好的策略处理,比如说给告警分分组、不让重复的告警一直发、设个安静的时间啥的。
  1. 通知发送(Alertmanager
  • Alertmanager 按照咱设好的通知办法(像电子邮件、短信、即时通讯工具这些)把告警信息发给相关的人,让人家能赶紧想办法解决问题。

【案例】比如说在一个电商网站里:

  • Prometheus 会定期从服务器采集订单处理的数量、页面响应的时间这些指标。
  • 要是订单处理量短时间里掉得厉害或者页面响应时间超过设好的阈值,Prometheus 就给 Alertmanager 发告警。
  • Alertmanager 把告警分分组处理好后,通过电子邮件给运维团队发通知。
  • 运维的人通过 Grafana 能直接看到相关指标的变化趋势,好去分析问题出在哪。

常见部署方法

方法一:使用 Docker 部署

  1. 安装 Docker 和 Docker Compose
  • 您可以根据您的操作系统,按照官方文档的说明进行安装。docker安装可参考docker安装
  1. 创建 `docker-compose.yml` 文件
version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      -./prometheus.yml:/etc/prometheus/prometheus.yml
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
  alertmanager:
    image: prom/alertmanager
    ports:
      - "9093:9093"
    volumes:
      -./alertmanager.yml:/etc/alertmanager/alertmanager.yml
  1. 创建 Prometheus 配置文件 `prometheus.yml`
scrape_configs:
  - job_name: 'example'
    static_configs:
      - targets: ['localhost:8080']
  1. 创建 Alertmanager 配置文件 `alertmanager.yml`
route:
  receiver: 'default'
receivers:
  - name: 'default'
    email_configs:
      - to: 'your_email@example.com'
  1. 启动服务
  • 在包含上述文件的目录中,运行 `docker-compose up -d`

方法二:使用 Kubernetes 部署

  1. 准备 Kubernetes 集群
  • 您可以使用云提供商提供的 Kubernetes 服务,或者自行搭建。可参考k8s集群部署
  1. 创建 Prometheus 配置、部署和服务
  • 配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    scrape_configs:
      - job_name: 'example'
        static_configs:
          - targets: ['localhost:8080']
  • 部署和服务文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          volumeMounts:
            - name: prometheus-config
              mountPath: /etc/prometheus
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
  selector:
    app: prometheus
  1. 创建 Grafana 部署和服务
  • 部署和服务文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
        - name: grafana
          image: grafana/grafana
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  type: NodePort
  ports:
    - port: 3000
      targetPort: 3000
  selector:
    app: grafana
  1. 创建 Alertmanager 配置、部署和服务
  • 配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-config
data:
  alertmanager.yml: |
    route:
      receiver: 'default'
    receivers:
      - name: 'default'
        email_configs:
          - to: 'your_email@example.com'
  • 部署和服务文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: alertmanager
    spec:
      containers:
        - name: alertmanager
          image: prom/alertmanager
          volumeMounts:
            - name: alertmanager-config
              mountPath: /etc/alertmanager
      volumes:
        - name: alertmanager-config
          configMap:
            name: alertmanager-config
---
apiVersion: v1
kind: Service
metadata:
  name: alertmanager
spec:
  type: NodePort
  ports:
    - port: 9093
      targetPort: 9093
  selector:
    app: alertmanager
  1. 启动服务
kubectl apply -f <文件名>
  1. 检查部署状态
kubectl get pods
  1. 平台访问
获取地址消息:kubectl get svc <服务名称>
prometheus:http://<节点 IP>:9090
grafana:http://<节点 IP>:3000, admin/admin
alertmanager:http://<节点 IP>:9093

如何配置监控目标和告警规则?

配置监控目标

  1. 在 `prometheus.yml` 文件的 `scrape_configs` 部分添加监控目标的信息。

【案例1】如果要监控一个运行在 `192.168.0.100` 端口为 `8080` 的服务,可以这样配置:

scrape_configs:
  - job_name: 'my_service'
    static_configs:
      - targets: ['192.168.0.100:8080']

【案例2】如果要监控多个目标,可以以列表的形式添加:

scrape_configs:
  - job_name: 'my_service'
    static_configs:
      - targets: ['192.168.0.100:8080', '192.168.0.101:8080', '192.168.0.102:8080']
  1. 有些服务可能需要通过服务发现机制来自动发现监控目标。

【案例】如果使用 Kubernetes 环境,可以使用 `kubernetes_sd_configs` 来自动发现 Pod 和服务。

配置告警规则

  1. 创建一个新的 YAML 文件,例如 `alerts.yml` ,用于定义告警规则。

【案例】以下是一个简单的 CPU 使用率告警规则示例:

# 如果节点的 CPU 系统使用率在 5 分钟内持续超过 80%,则触发告警。
groups:
  - name: example_alerts
    rules:
      - alert: HighCPUUsage
        expr: node_cpu_seconds_total{mode="system"} / node_cpu_seconds_total > 0.8
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage detected"
          description: "The CPU usage on {{ $labels.instance }} has been above 80% for 5 minutes."
  1. 在 `prometheus.yml` 文件中通过 `rule_files` 字段引入告警规则文件:
rule_files:
  - "alerts.yml"
  1. 您可以根据具体的监控指标和业务需求,定义更多复杂的告警规则,例如内存使用率、请求错误率等。

【案例】对于一个 Web 应用,您可以定义当每秒错误请求数超过一定数量时触发告警:

groups:
  - name: web_app_alerts
    rules:
      - alert: HighErrorRateInWebApp
        expr: sum(rate(http_requests_total{status_code!~"2.."}[5m])) > 10
        for: 3m
        labels:
          severity: critical
        annotations:
          summary: "High error rate in web app"
          description: "The error rate in the web app has exceeded 10 per second for 3 minutes."

如何配置 Grafana 数据源和仪表盘?

  1. 登录 Grafana
  2. 添加数据源
  • 点击左侧菜单栏的“Configuration”(配置),选择“Data Sources”(数据源)。
  • 点击“Add data source”(添加数据源),在列表中选择“Prometheus”。
  • 输入 Prometheus 的服务地址和相关配置信息,如 URL 等。通常,如果 Prometheus 和 Grafana 在同一网络环境中,URL 可以是 `http://prometheus:9090` 。
  1. 创建仪表盘
  • 点击左侧菜单栏的“+”号,选择“Dashboard”(仪表盘)。
  • 选择“Add a new panel”(添加新面板)。
  1. 配置面板
  • 在“Metrics”(指标)选项卡中,使用 PromQL 语言编写查询来获取您想要展示的数据。例如,如果要展示 CPU 使用率,可以输入 `node_cpu_seconds_total{mode="system"} / node_cpu_seconds_total` 。
  • 在“Visualization”(可视化)选项卡中,选择您喜欢的数据展示方式,如折线图、柱状图、仪表盘等。
  • 在“Panel Title”(面板标题)中,为您的面板设置一个有意义的名称。
  1. 调整面板设置
  • 您可以根据需要调整时间范围、坐标轴、颜色、标题等设置,以使图表更符合您的需求。
  1. 保存仪表盘
  • 完成配置后,点击“Save”(保存)按钮。

【案例】如果您想展示服务器的内存使用情况,您可以这样配置:

  • 在“Metrics”中输入 `node_memory_MemUsed_bytes / node_memory_MemTotal_bytes` 来获取内存使用率。
  • 在“Visualization”中选择折线图,并设置合适的颜色和线条样式。

在 Alertmanager 中配置告警通知的一般方法

  1. 配置接收者
  • 在 Alertmanager 的配置文件 `alertmanager.yml` 中,定义接收者信息。
  • Alertmanager 支持以下常见的告警接收方式:
1. Email:将告警通过电子邮件发送。
2. Webhook:可以将告警发送到自定义的 Web 服务端点,以便与其他系统集成。
3. Slack:将告警发送到 Slack 频道。
4. PagerDuty:与 PagerDuty 服务集成,进行告警通知和处理。
5. Telegram:发送告警到 Telegram 聊天群组或个人。

配置参考:

# 配置电子邮件接收者
receivers:
  - name: 'email-receiver'
    email_configs:
      - to: 'your_email@example.com'

# 配置 Slack 接收告警
receivers:
  - name: 'slack-receiver'
    slack_configs:
      api_url: 'https://hooks.slack.com/services/XXXXXXXXX'
      channel: '#alerts'
      username: 'AlertManager'

# 配置 Webhook 接收告警
receivers:
  - name: 'webhook-receiver'
    webhook_configs:
      - url: 'http://your-webhook-url'

# 多个接收人方式:
# `receiver1` 和 `receiver2` 是通过电子邮件接收告警,而 `receiver3` 是通过 Slack 接收告警。
receivers:
  - name: 'receiver1'
    email_configs:
      - to: 'receiver1@example.com'
  - name: 'receiver2'
    email_configs:
      - to: 'receiver2@example.com'
  - name: 'receiver3'
    slack_configs:
      api_url: 'https://hooks.slack.com/services/XXXXXXXXX'
      channel: '#channel_name'
  1. 配置路由规则
  • 定义告警如何路由到不同的接收者。
route:
  receiver: 'email-receiver'
  routes:
    - match:
        severity: critical
      receiver: 'critical-email-receiver'
  1. 配置抑制规则(可选)
  • 如果您希望在某些情况下抑制告警,可以配置抑制规则。
  • 在 Alertmanager 的配置文件中,可以通过 `inhibit_rules` 部分来配置抑制规则。抑制规则用于在特定条件下阻止某些告警的发送。
# 一个简单的抑制规则示例:
# 如果同时存在具有相同 `alertname` 和 `instance` 的 `warning` 级别的告警和 `critical` 级别的告警,
# 则抑制 `warning` 级别的告警发送。
inhibit_rules:
  - source_match:
      severity: 'warning'
    target_match:
      severity: 'critical'
    equal: ['alertname', 'instance']
  1. 配置静默规则(可选)
  • 可以设置在特定时间段内静默某些告警。
  • 通过在 Alertmanager 的 Web UI 或者使用 API 来设置静默规则。例如,在 Web UI 中,可以指定一个时间段和匹配的告警标签,使在该时间段内符合标签的告警被静默。
  1. 配置通知模板(可选)
  • 自定义告警通知的内容和格式。
  • 通知模板用于自定义告警通知的内容。在 Alertmanager 的配置文件中,可以通过 `templates` 部分指定模板文件的路径。模板文件可以使用 Go 模板语法来定义通知的格式和内容。
## 常见的告警通知模板示例:
# 电子邮件通知模板
<!DOCTYPE html>
<html>
<head>
    <title>告警通知</title>
</head>
<body>
    <h2>告警通知</h2>
    <p>告警名称: {{.Alerts.Firing[0].Labels.alertname }}</p>
    <p>告警级别: {{.Alerts.Firing[0].Labels.severity }}</p>
    <p>告警详情: {{.Alerts.Firing[0].Annotations.description }}</p>
    <p>触发时间: {{.Alerts.Firing[0].StartsAt }}</p>
    <p>监控指标值: {{.Alerts.Firing[0].Labels.value }}</p>
    <p>相关实例: {{.Alerts.Firing[0].Labels.instance }}</p>
</body>
</html>

# Slack 通知模板
告警名称: {{.Alerts.Firing[0].Labels.alertname }}
告警级别: {{.Alerts.Firing[0].Labels.severity }}
告警详情: {{.Alerts.Firing[0].Annotations.description }}
触发时间: {{.Alerts.Firing[0].StartsAt }}
监控指标值: {{.Alerts.Firing[0].Labels.value }}
相关实例: {{.Alerts.Firing[0].Labels.instance }}

# Webhook 通知模板(JSON 格式)
{
    "alertname": "{{.Alerts.Firing[0].Labels.alertname }}",
    "severity": "{{.Alerts.Firing[0].Labels.severity }}",
    "description": "{{.Alerts.Firing[0].Annotations.description }}",
    "start_time": "{{.Alerts.Firing[0].StartsAt }}",
    "metric_value": "{{.Alerts.Firing[0].Labels.value }}",
    "instance": "{{.Alerts.Firing[0].Labels.instance }}"
}

【案例】如果您希望根据告警的严重程度发送到不同的电子邮件地址,可以这样配置:

receivers:
  - name: 'low-severity-email'
    email_configs:
      - to: 'low_severity@example.com'
  - name: 'high-severity-email'
    email_configs:
      - to: 'high_severity@example.com'

route:
  receiver: 'default'
  routes:
    - match:
        severity: low
      receiver: 'low-severity-email'
    - match:
        severity: high
      receiver: 'high-severity-email'
  1. 重启服务
  • 配置完成后,重新启动 Alertmanager 以使配置生效。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表