【监控】使用Prometheus+Grafana搭建服务器运维监控面板(含带BearerToken的Exporter配置)

【监控】使用Prometheus+Grafana搭建服务器运维监控面板(含带BearerToken的Exporter配置)

文章目录

    • [1、Grafana 数据可视化面板](#1、Grafana 数据可视化面板)
    • [2、Prometheus - 收集和存储指标数据](#2、Prometheus - 收集和存储指标数据)
    • [3、Exporter - 采集和上报指标数据](#3、Exporter - 采集和上报指标数据)

1、Grafana 数据可视化面板

Grafana 是一个开源的可视化平台,专门设计用于可视化各种数据源中的指标。它提供了丰富的图表和仪表板功能,可以帮助用户直观展示监控数据。

重要特性包括:

  • 多数据源支持:支持各种数据源(包括 Prometheus、InfluxDB、Graphite 等)。
  • 美观的可视化:提供多种图表类型,可以自定义仪表板。
  • 告警功能:可以设置警报规则并通过多种渠道进行通知。

github-67k
官方文档
官方下载地址


sh 复制代码
# 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官方下载地址

sh 复制代码
# 下载
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

sh 复制代码
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
sh 复制代码
# 部署配置

[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 字段来实现。
yaml 复制代码
scrape_configs:
  - job_name: 'h200-metrics'
    static_configs:
      - targets: ['ip-aaa:8080', 'ip-bbb:8080']
    authorization:
      type: Bearer
      credentials: 'xxx'

查询监控数据

sh 复制代码
up
# 可以看到 Element 处有几条记录,其中 instance 值为 localhost:8080 的记录,value 是 1,这代表对应应用是存活状态。
# up{group="production",instance="localhost:8080",job="node"}	1

node_memory_active_bytes/(1024*1024*1024)
# 查看我们所运行 NodeExporter 节点所在机器的内存使用情况

node_load1
# 查看 NodeExporter 节点所在机器 CPU 1 分钟的负载情况

PromQL介绍 1

  • PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。
  • PromQL 支持户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。
sh 复制代码
# 查看请求信息
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使用率。
go 复制代码
// 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 main

import (
	"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)
	}

	// 创建查询API
	v1api := 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

sh 复制代码
# 下载
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指标数据

txt 复制代码
node_boot_time:系统启动时间
node_cpu:系统CPU使用量
nodedisk*:磁盘IO
nodefilesystem*:文件系统用量
node_load1:系统负载
nodememeory*:内存使用量
nodenetwork*:网络带宽
node_time:当前系统时间
go_*:node exporter中go相关指标
process_*:node exporter自身进程相关运行指标
相关推荐
迁就却不将就3 分钟前
Linux总结
linux·运维·服务器
沧浪之水!12 分钟前
Linux:文件系统的初步认识
linux·运维·服务器
m0_748257461 小时前
Linux系统编程:深入理解计算机软硬件体系和架构
linux·运维·架构
SuperGodK1 小时前
在linux上部署kubesphere
运维·服务器
Kevin__471 小时前
Ubuntu录屏--OBS
linux·运维·ubuntu
筑梦之路3 小时前
CentOS 7 aarch64上制作kernel rpm二进制包 —— 筑梦之路
linux·运维·centos
炬火初现3 小时前
仿mudou库one thread oneloop式并发服务器
服务器·c++·muduo
pitt19973 小时前
企业日常工作中常用的 Linux 操作系统命令整理
linux·运维·操作系统命令
赔罪3 小时前
Python 面向对象高级编程-定制类
服务器·开发语言·前端·python
鸿即为江边鸟3 小时前
Java TCP 通信:实现简单的 Echo 服务器与客户端
java·服务器·tcp/ip