【监控】使用Prometheus+Grafana搭建服务器运维监控面板(含带BearerToken的Exporter配置)
文章目录
- 1、Grafana 数据可视化面板
- 2、Prometheus - 收集和存储指标数据
- 3、Exporter - 采集和上报指标数据
1、Grafana 数据可视化面板
Grafana 是一个开源的可视化平台,专门设计用于可视化各种数据源中的指标。它提供了丰富的图表和仪表板功能,可以帮助用户直观展示监控数据。
重要特性包括:
- 多数据源支持:支持各种数据源(包括 Prometheus、InfluxDB、Graphite 等)。
- 美观的可视化:提供多种图表类型,可以自定义仪表板。
- 告警功能:可以设置警报规则并通过多种渠道进行通知。
github-67k
官方文档
官方下载地址
# Red Hat、CentOS、RHEL 和 Fedora (64 位, SHA256:84e2a5b915965521b64c275da1c5b1661409c452a219c35f87454f2e8578f9d8
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.5.2-1.x86_64.rpm# 要启动该服务,请运行以下命令:
sudo systemctl daemon-reload
sudo systemctl start grafana-server# 要验证服务是否正在运行,请运行以下命令:
sudo systemctl status grafana-server# 运行以后访问
# http://host:3000/
# 默认账号admin,默认密码admin
2、Prometheus - 收集和存储指标数据
Prometheus 是一个开源的监控系统和时间序列数据库,主要用于收集和存储指标数据。
它使用一种强大的查询语言(PromQL)来提取和分析数据,适用于云原生应用和微服务架构。
其主要特性包括:
- 多维数据模型:使用标签(labels)来标识数据,可以对数据进行灵活的查询。
- 实时监控:支持数据采集和查询,可以实时监控系统状态。
- 强大的报警功能:可以设置各种条件以触发告警,并与报警管理工具集成(如 Alertmanager)。
github-60k
Prometheus官方下载地址
# 下载
wget https://github.com/prometheus/prometheus/releases/download/v3.2.1/prometheus-3.2.1.linux-amd64.tar.gz
tar -xzf prometheus-3.2.1.linux-amd64.tar.gz# 运行
./prometheus --config.file=prometheus.yml# 访问
# 直接打开 http://hostip:9090
在本地使用 systemd 部署 Prometheus
sudo vi /etc/systemd/system/prometheus.service# 重新加载服务配置:
systemctl reload prometheus
# 启动服务:
systemctl start prometheus
# 重启服务(重载配置):
systemctl restart prometheus
# 启用服务(开机启动):
systemctl enable prometheus
# 查看服务状态:
systemctl status prometheus
# 重新加载配置文件:
systemctl daemon-reload
# 查看更多报错信息:
journalctl -u prometheus.service -b# 每次修改prometheus.yml配置后
sudo systemctl daemon-reload
sudo systemctl reload prometheus
# 部署配置[Unit]
Description=prometheus
After=network.target[Service]
ExecStart=/root/prometheus-3.2.1.linux-amd64/prometheus --config.file=/root/prometheus-3.2.1.linux-amd64/prometheus.yml
Restart=always
User=root
Group=root[Install]
WantedBy=multi-user.target
修改target配置(采集器地址)
- 带有 Bearer Token 鉴权的抓取目标,可以通过在 scrape_configs 中的 authorization 字段来实现。
scrape_configs:- job_name: 'h200-metrics'static_configs:- targets: ['ip-aaa:8080', 'ip-bbb:8080']authorization:type: Bearercredentials: 'xxx'
查询监控数据
- 【运维prometheus教程】使用Prometheus+Grafana打造可视化监控利器
- Prometheus UI 是 Prometheus 内置的一个可视化管理界面,我们通过 localhost:9090 就可以访问到该页面。
- 通过 Prometheus UI 可以查询 Prometheus 收集到的数据,而 Prometheus 定义了 PromQL 语言来作为查询监控数据的语言,其余 SQL 类似。
up
# 可以看到 Element 处有几条记录,其中 instance 值为 localhost:8080 的记录,value 是 1,这代表对应应用是存活状态。
# up{group="production",instance="localhost:8080",job="node"} 1node_memory_active_bytes/(1024*1024*1024)
# 查看我们所运行 NodeExporter 节点所在机器的内存使用情况node_load1
# 查看 NodeExporter 节点所在机器 CPU 1 分钟的负载情况
PromQL介绍 1
- PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。
- PromQL 支持户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。
# 查看请求信息
prometheus_http_requests_total# 1、完全匹配
# PromQL 支持使用 = 和 != 两种完全匹配模式。
# 等于。通过使用 label=value 可以选择那些标签满足表达式定义的时间序列。
# 不等于。通过使用 label!=value 则可以根据标签匹配排除时间序列。
# 我们希望只查看错误的请求,即过滤掉所有 code 标签不是 200 的数据。
prometheus_http_requests_total{code!="200"}# 2、正则匹配
# PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。
# 正向匹配。使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列。
# 反向匹配。使用 label!~regx 进行排除。
# 例如我想查询指标 prometheus_http_requests_total 中,所有 handler 标签以 /api/v1 开头的记录,那么我的表达式为:
prometheus_http_requests_total{handler=~"/api/v1/.*"}# 3、范围查询
# 查询时间序列时,同一个指标同一标签只会返回一条数据。这样的表达式我们称之为瞬间向量表达式,而返回的结果称之为瞬间向量。
# 而如果我们想查询一段时间范围内的样本数据,那么我们就需要用到区间向量表达式,其查询出来的结果称之为区间向量。
# 时间范围通过时间范围选择器 [] 进行定义。例如,通过以下表达式可以选择最近5分钟内的所有样本数据:
prometheus_http_requests_total{}[5m]
# 瞬时向量表达式,选择当前最新的数据
prometheus_http_requests_total{}
# 区间向量表达式,选择以当前时间为基准,5分钟内的数据
prometheus_http_requests_total{}[5m]
# 查询 5 分钟前的最新数据
http_request_total{} offset 5m
# 往前移动 1 天,查询 1 天前的数据
# 例如现在是 2020-10-07 00:00:00
# 那么这个表达式查询的数据是:2020-10-05 至 2020-10-06 的数据
http_request_total{}[1d] offset 1d
- Prometheus 还提供了聚合操作符,这些操作符作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。目前支持的聚合函数有:
sum (求和)
min (最小值)
max (最大值)
avg (平均值)
stddev (标准差)
stdvar (标准方差)
count (计数)
count_values (对value进行计数)
bottomk (后n条时序)
topk (前n条时序)
quantile (分位数)
go语言使用sdk访问Prometheus通过Node Exporter采集的机器监控数据,并且完成数据分析的简单例子
- 创建Prometheus客户端:使用指定的Prometheus服务器地址创建一个新客户端。
- 构造查询:使用Prometheus的PromQL查询来获取CPU使用情况的平均值。
- 上下文管理:设置一个上下文以控制查询的超时。
- 查询执行:调用Query方法来与Prometheus交互并检索数据。
- 输出结果:解析查询结果并打印CPU使用率。
// mkdir prometheus-example
// cd prometheus-example
// go mod init prometheus-example
// go get github.com/prometheus/client_golang/api
// go get github.com/prometheus/common/model
package mainimport ("context""fmt""log""time""github.com/prometheus/client_golang/api""github.com/prometheus/common/model"
)func main() {// 创建Prometheus客户端client, err := api.NewClient(api.Config{Address: "http://<prometheus_server_ip>:9090",})if err != nil {log.Fatalf("Error creating Prometheus client: %v", err)}// 创建查询APIv1api := api.NewAPI(client)// 上下文设置ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()// 发送查询请求,获取CPU使用率数据query := `avg(rate(node_cpu_seconds_total[5m])) by (mode)`result, warnings, err := v1api.Query(ctx, query, time.Now())if err != nil {log.Fatalf("Error querying Prometheus: %v", err)}if len(warnings) > 0 {for _, warning := range warnings {fmt.Printf("Warning: %s\n", warning)}}// 打印结果switch result.Type() {case model.ValVector:vector := result.(model.Vector)for _, sample := range vector {fmt.Printf("Mode: %s, Value: %f\n", sample.Metric["mode"], sample.Value)}default:fmt.Println("Unexpected result type")}
}
3、Exporter - 采集和上报指标数据
广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。
而Exporter的一个实例称为target, prometheus通过轮询的方式定期从这些target中获取样本数据
从Exporter的来源上来讲,主要分为两类:1
- 社区提供的
Prometheus社区提供了丰富的Exporter实现,涵盖了从基础设施,中间件以及网络等各个方面的监控功能。这些Exporter可以实现大部分通用的监控需求。 - 用户自定义的
除了直接使用社区提供的Exporter程序以外,用户还可以基于Prometheus提供的Client Library创建自己的Exporter程序。
目前Promthues社区官方提供了对以下编程语言的支持:Go、Java/Scala、Python、Ruby。同时还有第三方实现的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。
从Exporter的运行方式上来讲,又可以分为:
- 独立使用的
以我们已经使用过的Node Exporter为例,由于操作系统本身并不直接支持Prometheus,同时用户也无法通过直接从操作系统层面上提供对Prometheus的支持。
因此,用户只能通过独立运行一个程序的方式,通过操作系统提供的相关接口,将系统的运行状态数据转换为可供Prometheus读取的监控数据。
除了Node Exporter以外,比如MySQL Exporter、Redis Exporter等都是通过这种方式实现的。 这些Exporter程序扮演了一个中间代理人的角色。 - 集成到应用中的
为了能够更好的监控系统的内部运行状态,有些开源项目如Kubernetes,ETCD等直接在代码中使用了Prometheus的Client Library,提供了对Prometheus的直接支持。
这种方式打破的监控的界限,让应用程序可以直接将内部的运行状态暴露给Prometheus,适合于一些需要更多自定义监控指标需求的项目。
以node_exporter采集机器信息为例 1
github-12k
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.0/node_exporter-1.9.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.9.0.linux-amd64.tar.gz# 运行
./node_exporter --web.listen-address 127.0.0.1:8080# 访问exporter
curl hostip:8080/metrics --header "Authorization: Bearer xxx"# 部署
sudo vi /etc/systemd/system/node-exporter.service[Unit]
Description=node-exporter
After=network.target[Service]
ExecStart=/root/node_exporter-1.9.0.linux-amd64/node_exporter --web.listen-address xxx:8080
Restart=always
User=root
Group=root[Install]
WantedBy=multi-user.target
Node Exporter指标数据
node_boot_time:系统启动时间
node_cpu:系统CPU使用量
nodedisk*:磁盘IO
nodefilesystem*:文件系统用量
node_load1:系统负载
nodememeory*:内存使用量
nodenetwork*:网络带宽
node_time:当前系统时间
go_*:node exporter中go相关指标
process_*:node exporter自身进程相关运行指标