服务监控方案

为服务器设置监控可以有效提高系统的稳定性和性能,以下是一些常见的监控方案:

1. Prometheus + Grafana

  • Prometheus 是一个开源的系统监控和报警工具,主要用于时间序列数据的监控。它通过拉取数据的方式收集来自应用程序和基础设施的指标。
  • Grafana 是一个开源的数据可视化工具,可以与 Prometheus 集成,提供实时的图表和仪表板,帮助用户分析和展示数据。
  • 优点:灵活性高、社区支持活跃,适合多种监控场景。
  • Prometheus 官方网站
  • Grafana 官方网站

2. ELK Stack (Elasticsearch, Logstash, Kibana)

  • Elasticsearch 是一个分布式搜索和分析引擎,适合存储和搜索日志数据。
  • Logstash 用于数据收集、处理和转发,可以将日志信息汇集到 Elasticsearch。
  • Kibana 是一个可视化工具,可以创建仪表板和图表,帮助分析存储在 Elasticsearch 中的数据。
  • 优点:强大的日志分析能力,适合需要处理大量日志信息的环境。
  • ELK Stack 官方文档

3. Zabbix

  • Zabbix 是一个开源的监控解决方案,支持对网络、服务器、虚拟机和云服务的监控。它提供了强大的报警和可视化功能。
  • 优点:配置灵活、支持多种监控方法(主动/被动),适合大规模环境。
  • Zabbix 官方网站

4. Nagios

  • Nagios 是一个传统的监控工具,支持对网络、服务器和应用程序的监控。它通过插件机制扩展功能。
  • 优点:功能强大,适合监控多种资源,具有良好的社区支持。
  • Nagios 官方网站

5. Datadog

  • Datadog 是一个商业监控服务,提供基础设施监控、应用性能监控和日志管理功能。它支持云环境、容器和微服务架构。
  • 优点:易于使用,集成丰富,适合快速部署和使用。
  • Datadog 官方网站

6. New Relic

  • New Relic 是一个云端应用性能管理(APM)工具,可以监控应用程序的性能并提供深度分析。
  • 优点:用户友好的界面,适合进行应用性能分析。
  • New Relic 官方网站

部署Prometheus

1. 创建 Docker Compose 文件

创建一个 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
version: '3.7'

services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"

2. 配置 Prometheus

在与 docker-compose.yml 同一目录下创建一个 prometheus.yml 文件,配置 Prometheus 的监控目标。

1
2
3
4
5
6
7
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']

3. 启动服务

docker-compose.yml 所在目录中,运行以下命令启动 Prometheus 和 Grafana:

1
docker-compose up -d

5. 访问 Prometheus 和 Grafana

  • Prometheus:在浏览器中访问 http://localhost:9090。默认的登录用户名和密码都是 admin

Prometheus工作原理

数据抓取

Prometheus 通过 HTTP 请求获取数据。你需要确保目标服务暴露了一个 /metrics 端点,以便 Prometheus 能够抓取相关的指标数据。

使用 Exporter

对于大多数服务和应用程序,Prometheus 使用 Exporter 以标准格式暴露指标。例如:

  • Node Exporter: 用于监控 Linux 系统。
  • MySQL Exporter: 用于监控 MySQL 数据库。

配置 Prometheus 监控 Docker

prometheus.yml 中,可以使用 Docker 容器的标签(如 dockercontainer)来定义抓取目标。例如,使用 Docker 服务发现功能:

1
2
3
4
5
6
7
8
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'docker'
metrics_path: '/metrics'
static_configs:
- targets: ['<docker_host>:<port>'] # 你的 Docker 容器的地址和端口

使用 Exporter

为 Docker 容器设置适当的 Exporter,可以收集特定服务的指标。最常见的 Exporter 包括:

  • cAdvisor: 用于监控 Docker 容器的资源使用情况和性能指标。
  • Node Exporter: 用于监控主机的系统级指标。

docker-compose.yml 中添加 cAdvisor:

1
2
3
4
5
6
7
cadvisor:
image: google/cadvisor:latest
ports:
- "8080:8080"
volumes:
- /var/run:/var/run:rw
- /:/rootfs:ro

然后在 prometheus.yml 中添加 cAdvisor 作为抓取目标:

1
2
3
4
scrape_configs:
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']

通过 Prometheus 监控自己开发的服务

在服务中创建指标

在代码中定义您希望监控的指标,例如请求次数、请求延迟等。以下是一个示例代码,它使用 Go 的 Prometheus 客户端库定义和暴露一些基本指标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package main

import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
requests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Number of HTTP requests processed, partitioned by status code and method.",
},
[]string{"code", "method"},
)
latency = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests.",
Buckets: prometheus.DefBuckets,
},
[]string{"code", "method"},
)
)

func init() {
// Register metrics with Prometheus.
prometheus.MustRegister(requests)
prometheus.MustRegister(latency)
}

func handler(w http.ResponseWriter, r *http.Request) {
// Simulate some processing and record metrics.
timer := prometheus.NewTimer(latency.WithLabelValues("200", r.Method))
defer timer.ObserveDuration()
w.WriteHeader(http.StatusOK)
requests.WithLabelValues("200", r.Method).Inc()
w.Write([]byte("Hello, Prometheus!"))
}

func main() {
http.Handle("/metrics", promhttp.Handler()) // Expose metrics endpoint
http.HandleFunc("/", handler) // Your service endpoint
http.ListenAndServe(":8080", nil)
}

在这个示例中:

  • http_requests_total 记录 HTTP 请求的总数。
  • http_request_duration_seconds 记录 HTTP 请求的延迟。
  • /metrics 端点暴露了 Prometheus 指标数据。

配置 Prometheus 采集指标

确保 Prometheus 可以访问到服务的 /metrics 端点。编辑 prometheus.yml 配置文件,添加您的服务实例:

1
2
3
4
5
6
7
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'my_service'
static_configs:
- targets: ['localhost:8080'] # 替换为您的服务地址

通过 Prometheus 监控 MySQL

通过 Prometheus 监控 MySQL,通常会使用专门的 MySQL Exporter,它能够将 MySQL 的各项性能指标导出并暴露给 Prometheus。下面是具体步骤:

1. 安装 MySQL Exporter

Prometheus 提供了官方的 MySQL Exporter,用于监控 MySQL 实例。您可以通过 Docker 快速部署:

1
2
3
4
5
docker run -d \
-p 9104:9104 \
-e DATA_SOURCE_NAME="user:password@(mysql_host:3306)/" \
--name mysql_exporter \
prom/mysqld-exporter

其中,DATA_SOURCE_NAME 是 MySQL 数据库连接字符串,格式为 username:password@protocol(address)/.

2. 配置 MySQL 权限

为了允许 MySQL Exporter 访问必要的数据库信息,您需要在 MySQL 中创建一个用户并授予适当的权限:

1
2
3
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

此用户应具有访问性能相关视图的权限。

3. 配置 Prometheus

prometheus.yml 文件中添加 MySQL Exporter 的配置,以便 Prometheus 定期从它那里抓取数据:

1
2
3
4
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104'] # 替换为 MySQL Exporter 地址

4. 常用监控指标

MySQL Exporter 会收集大量与 MySQL 性能相关的指标,包括:

  • mysql_global_status_connections:当前连接数
  • mysql_global_status_uptime:MySQL 运行时间
  • mysql_global_status_queries:总查询次数
  • mysql_global_status_slow_queries:慢查询次数

Prometheus 监控 MongoDB

要通过 Prometheus 监控 MongoDB,一般会使用 MongoDB Exporter,它将 MongoDB 的性能指标导出给 Prometheus。下面是实现步骤:

1. 安装 MongoDB Exporter

Prometheus 官方提供了 MongoDB Exporter,可以使用 Docker 快速安装:

1
2
3
4
5
docker run -d \
-p 9216:9216 \
-e MONGODB_URI="mongodb://user:password@mongodb_host:27017" \
--name mongodb_exporter \
bitnami/mongodb-exporter:latest

其中,MONGODB_URI 是 MongoDB 的连接字符串。

2. 配置 MongoDB 用户权限

为 Exporter 配置一个有合适权限的 MongoDB 用户,以便访问数据库性能数据。使用以下命令在 MongoDB 中创建用户:

1
2
3
4
5
6
7
8
9
use admin
db.createUser({
user: "exporter",
pwd: "password",
roles: [
{ role: "clusterMonitor", db: "admin" },
{ role: "read", db: "local" }
]
})

3. 配置 Prometheus

prometheus.yml 文件中添加 MongoDB Exporter 的配置:

1
2
3
4
scrape_configs:
- job_name: 'mongodb'
static_configs:
- targets: ['localhost:9216'] # 替换为 MongoDB Exporter 地址

4. 常用监控指标

MongoDB Exporter 提供了许多实用的指标,例如:

  • mongodb_up:MongoDB 连接状态
  • mongodb_op_counters_total:各种数据库操作计数,如插入、查询、更新等
  • mongodb_memory:内存使用情况
  • mongodb_connections:当前连接数
  • mongodb_mongo_db_metrics:特定数据库的读写统计信息

使用Grafana显示数据

Prometheus原本的web界面比较简陋。

Prometheus 可以与 Grafana 集成以进行更复杂的数据可视化。你可以在 Grafana 中添加 Prometheus 作为数据源,然后创建各种仪表板以监控服务和系统状态。

Grafana和Prometheus的结合之所以受到广泛青睐,主要因为两者在数据监控、可视化、警报处理等方面互补性强,特别适合监控系统的需求。以下是主要原因:

  1. 数据源和查询灵活性:Prometheus作为一个时序数据库,非常适合收集和存储系统指标和应用性能数据。Grafana可以无缝集成Prometheus作为数据源,利用PromQL(Prometheus查询语言)灵活地查询和筛选数据,使用户能够快速构建基于Prometheus数据的可视化面板。
  2. 强大的数据可视化:Grafana提供了丰富的图表类型(如折线图、柱状图、热力图等),并支持多样化的可视化配置。这种可视化能力使得运维人员能够更直观地查看Prometheus数据中系统的性能指标和资源使用情况,方便监控和诊断。
  3. 高效的告警管理:Prometheus自带的告警管理功能可以根据指定条件触发告警,而Grafana进一步提供了基于面板的告警功能,使告警更直观。结合Grafana,用户不仅可以设置和查看告警,还可以在异常发生时直接查看相应图表和历史数据,快速定位问题。
  4. 易于扩展的插件支持:Grafana有丰富的插件生态,可以根据需要扩展功能,如增加不同数据源、支持自定义面板等。即使在Prometheus数据之上,还可以在Grafana中整合其他数据源的数据,形成统一的监控视图。
  5. 实时和历史数据的综合分析:Prometheus采集的时序数据可以通过Grafana实现实时刷新和历史回溯。这样一来,用户可以在Grafana中直观查看系统的实时状态,也可以通过历史数据来分析问题的根源,或者观察长期趋势。

总结来说,Grafana和Prometheus的结合提供了一个强大、灵活且高效的监控平台,适合用于各类应用和系统的性能监控和分析。两者的高兼容性和互补性,使得它们成为了运维监控和DevOps工具组合中的理想搭档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.7'

services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"

grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
depends_on:
- prometheus

web

Grafana:在浏览器中访问 http://localhost:3000,默认的登录用户名和密码都是 admin

6配置 Grafana 数据源

  1. 登录到 Grafana。
  2. 转到 “Configuration” > “Data Sources”。
  3. 选择 “Add data source”,然后选择 “Prometheus”。
  4. 配置 URL 为 http://prometheus:9090,然后保存。

创建仪表板

在 Grafana 中,您可以创建仪表板以可视化 Prometheus 收集的数据。

参考文章

install

grafana

官方blog

Node Exporter Dashboard 20240520