【监控】使用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自身进程相关运行指标
相关推荐
七夜zippoe1 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥1 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
Fcy6483 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满3 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠3 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥3 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9033 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技4 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀5 小时前
Linux环境变量
linux·运维·服务器
zzzsde5 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器