Prometheus监控系统

ops/2024/9/19 11:00:52/ 标签: prometheus, grafana, nginx, mysql

1、Prometheus概述

Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到的数据会持久化到存储设备当中。

每个被监控的主机都可以通过专用的 exporter 程序提供输出监控指标数据的接口,它会在目标处收集监控数据,并暴露出一个 HTTP 接口供 Prometheus server 查询, Prometheus 通过基于 HTTP 的 pull 的方式来周期性的采集数据,默认时间是 15s 抓取一次。
抓取到的指标数据会被以时间序列的形式保存在内存中,并且定时刷到磁盘上,默认是两个小时回刷一次。并且为了防止 Prometheus 发生崩溃或重启时能够恢复数据, Prometheus 也提供了类似 MySQL 中 binlog 一样的 wal 预写日志,当 Prometheus 崩溃重启时,会读这个预写日志来恢复数据。

如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到 Alertmanager 完成告警的汇总和分发。

对于短时间执行的脚本任务或者不好直接 pull 指标数据的服务,Prometheus 提供了 Pushgateway 给这些任务将服务指标数据主动 push 到 Pushgateway 并临时存储,然后等待 Prometheus server 完成数据的采集。

任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让 Prometheus 通过服务发现的机制进行动态管理。
Prometheus 能够直接把K8S的 API Server 作为服务发现系统使用,进而动态发现和监控K8S集群中的所有可被监控的对象。

(1) TSDB时序数据库

TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景
●存储的数据量级十分庞大
●大部分时间都是写入操作
●写入操作几乎是顺序添加,大多数时候数据都以时间排序
●很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库
●删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
●基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用
●读操作是十分典型的升序或者降序的顺序读
●高并发的读操作十分常见

(2) Prometheus 的特点

多维数据模型:由度量名称和键值对标识的时间序列数据
时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器指标数据、应用程序性能监控数据、网络数据等都是时序数据

内置时间序列(Time Series)数据库:Prometheus ;外置的远端存储通常会用:InfluxDB、OpenTSDB 等

promQL:一种灵活的查询语言,可以利用多维数据完成复杂查询

基于 HTTP 的 pull(拉取)方式采集时间序列数据;同时支持 PushGateway 组件收集数据

通过静态配置或服务发现发现目标

支持作为数据源接入 Grafana    

(3) Prometheus 的生态组件

Prometheus Server 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由 Prometheus Server 所负责。
Prometheus 生态圈中包含了多个组件,其中部分组件可选:

(1)Prometheus server:服务核心组件,采用 pull 方式采集监控数据,通过 http 协议传输;存储时间序列数据;基于“告警规则”生成告警通知。
Prometheus server 由三个部分组成:Retrieval,Storage,PromQL

  • Retrieval:负责在活跃的 target 主机上抓取监控指标数据。
  • Storage:存储,主要是把采集到的数据存储到磁盘中。默认为 15 天。
  • PromQL:是 Prometheus 提供的查询语言模块。

(2)Client Library: 客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。

(3)Exporters:指标暴露器,负责收集不支持内建 Instrumentation 的应用程序或服务的性能指标数据,并通过 HTTP 接口供 Prometheus Server 获取。
换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为 Prometheus 格式的指标向外暴露。

常用的 Exporters:

●Node-Exporter:用于收集服务器节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。
指标详细介绍:https://github.com/prometheus/node_exporter

mysqld-exporter/nginx-exporter

●Kube-State-Metrics:为 Prometheus 采集 K8S 资源数据的 exporter,通过监听 APIServer 收集 kubernetes 集群内资源对象的状态指标数据,例如 pod、deployment、service 等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。
需要注意的是 kube-state-metrics 只是简单的提供一个 metrics 数据,并不会存储这些指标数据,所以可以使用 Prometheus 来抓取这些数据然后存储, 主要关注的是业务相关的一些元数据,比如 Deployment、Pod、副本状态等;调度了多少个 replicas ?现在可用的有几个?多少个 Pod 是 running/stopped/terminated 状态?Pod 重启了多少次?有多少 job 在运行中。

●cAdvisor:用来监控容器内部使用资源的信息,比如 CPU、内存、网络I/O、磁盘I/O 。

●blackbox-exporter:监控业务容器存活性。

(4)Service Discovery:服务发现,用于动态发现待监控的 Target,Prometheus 支持多种服务发现机制:文件、DNS、Consul、Kubernetes 等等。 服务发现可通过第三方提供的接口,Prometheus 查询到需要监控的 Target 列表,然后轮询这些 Target 获取监控数据。该组件目前由 Prometheus Server 内建支持

(5)Alertmanager:是一个独立的告警模块,从 Prometheus server 端接收到 “告警通知” 后,会进行分组、去重,并路由到相应的接收方,发出报警, 常见的接收方式有:电子邮件、钉钉、企业微信等。
Prometheus Server 仅负责生成告警指示,具体的告警行为由另一个独立的应用程序 AlertManager 负责;告警指示由 Prometheus Server 基于用户提供的告警规则周期性计算生成,Alertmanager 接收到 Prometheus Server 发来的告警指示后,基于用户定义的告警路由向告警接收人发送告警信息。

(6)Pushgateway:类似一个中转站,Prometheus 的 server 端只会使用 pull 方式拉取数据,但是某些节点因为某些原因只能使用 push 方式推送数据, 那么它就是用来接收 push 而来的数据并暴露给 Prometheus 的 server 拉取的中转站。
可以理解成目标主机可以上报短期任务的数据到 Pushgateway,然后 Prometheus server 统一从 Pushgateway 拉取数据。

(7)Grafana:是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。

(4)Prometheus 的工作模式

●Prometheus Server 基于服务发现(Service Discovery)机制或静态配置获取要监视的目标(Target),并通过每个目标上的指标 exporter 来采集(Scrape)指标数据;

●Prometheus Server 内置了一个基于文件的时间序列存储来持久存储指标数据,用户可使用 PromQL 接口来检索数据,也能够按需将告警需求发往 Alertmanager 完成告警内容发送;

●一些短期运行的作业的生命周期过短,难以有效地将必要的指标数据供给到 Server 端,它们一般会采用推送(Push)方式输出指标数据, Prometheus 借助于 Pushgateway 接收这些推送的数据,进而由 Server 端进行抓取

(5)Prometheus 的工作流程

(1)Prometheus 以 Prometheus Server 为核心,用于收集和存储时间序列数据。Prometheus Server 从监控目标中通过 pull 方式拉取指标数据,或通过 pushgateway 把采集的数据拉取到 Prometheus server 中。
(2)Prometheus server 把采集到的监控指标数据通过 TSDB 存储到本地 HDD/SSD 中。
(3)Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的告警通知发送到 Alertmanager。
(4)Alertmanager 通过配置报警接收方,发送报警到邮件、钉钉或者企业微信等。
(5)Prometheus 自带的 Web UI 界面提供 PromQL 查询语言,可查询监控数据。
(6)Grafana 可接入 Prometheus 数据源,把监控数据以图形化形式展示出。

(6)Prometheus 的局限性

●Prometheus 是一款指标监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;

●Prometheus 认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;
若需要存储长期的历史数据,建议基于远端存储机制将数据保存于 InfluxDB 或 OpenTSDB 等系统中;

●Prometheus 的集群机制成熟度不高,可基于 Thanos 或 Cortex 实现 Prometheus 集群的高可用及联邦集群。

2、部署Prometheus

(1)系统初始化

(2) Prometheust Server 端安装和相关配置

上传 prometheus-2.45.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
tar xf prometheus-2.45.0.linux-amd64.tar.gz
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus
cd /usr/local/prometheus/
vim prometheus.ymlscrape_interval: 15s			#采集目标主机监控数据的时间间隔,默认为1mevaluation_interval: 15s 		#触发告警生成alert的时间间隔,默认是1m# scrape_timeout is set to the global default (10s).scrape_timeout: 10s			#数据采集超时时间,默认10s
metrics_path: '/metrics'    #指标数据采集路径,默认为 /metrics

配置系统启动文件cd /usr/lib/systemd/system
vim prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention.time=15d \
--web.enable-lifecycleExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.targetsystemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep 9090

浏览器访问验证

(2)部署 Exporters监控本机

上传 node_exporter-1.3.1.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
cd /usr/local/node_exporter
mv node_exporter /usr/local/bin/配置启动文件
cd /usr/lib/systemd/system
vim node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstatExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.targetsystemctl start node_exporter.service
systemctl enable node_exporter.service
netstat -lntp | grep node_exporter

关联prometheus监控9100端口

cd /usr/local/prometheus/
vim prometheus.yml
末尾添加
- job_name: "node_exporter"scheme: httpmetrics_path: /metricsstatic_configs:- targets:- 20.0.0.80:9100labels:service: node_exportercurl -X POST http://20.0.0.80:9090/-/reload  重新载入配置

浏览器查看

(3)如何监控其他主机

cd /usr/local/bin/
scp node_exporter 20.0.0.10:`pwd`
cd /usr/lib/systemd/system
scp node_exporter.service 20.0.0.10:`pwd`将本地的配置文件和启动文件复制到需要监控的主机需监控主机操作
systemctl start node_exporter.service
systemctl enable node_exporter.service
netstat -lntp | grep 9100

20.0.0.80

20.0.0.10(被监控主机)

普罗米修斯服务器
cd /usr/local/prometheus/
vim prometheus.yml 
static_configs:- targets:- 20.0.0.80:9100- 20.0.0.10:9100       #添加需要监控的服务器labels:service: node_exportercurl -X POST http://20.0.0.80:9090/-/reload重载

(4)监控mysql数据库

准备一台mysql服务器20.0.0.60

mysql服务器
cd /opt
上传mysqld_exporter-0.14.0.linux-amd64.tar.gztar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
cd mysqld_exporter-0.14.0.linux-amd64/
mv mysqld_exporter /usr/local/bin/
mysqld_exporter --help

cd /usr/lib/systemd/system
vim mysqld_exporter.service
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnfExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target

修改 MySQL 配置文件

vim /etc/my.cnf
host=localhost
user=exporter
password=abc123

授权 exporter 用户
mysql -u root -pabc123
create user 'exporter'@'localhost' identified by 'abc123';
grant process, replication client, select on *.* to 'exporter'@'localhost';
flush privileges;
quit
systemctl restart mysqld_exporter.service
systemctl enable mysqld_exporter.service
netstat -lntp | grep 9104

普罗米修斯服务器
cd /usr/local/prometheus
vim prometheus.yml
- job_name: "mysqld_exporter"scheme: httpmetrics_path: /metricsstatic_configs:- targets:- 20.0.0.60:9104labels:service: mysqld      末尾添加systemctl reload prometheus.service 

(5)监控nginx服务器

上传nginx-1.12.0.tar.gz、nginx-module-vts-0.1.18.tar.gz、 nginx-vts-exporter-0.10.3.linux-amd64.tar.gz到20.0.0.60服务器的/opt目录useradd -M -s /sbin/nologin nginx
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
tar xf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-module-vtsmake -j2 && make install
修改 nginx 配置文件,启动 nginx
cd /usr/local/nginx/conf
vim nginx.confserver {listen 8080;vhost_traffic_status off;allow 127.0.0.1;allow 20.0.0.80;location /nginx-status {stub_status on;access_log off;}location /vts-status {vhost_traffic_status_display;vhost_traffic_status_display_format html;}}ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t

cd /usr/lib/systemd/system
vim nginx.service
[Unit]
Description=nginx
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl start nginx.service 
netstat -lntp | grep nginx

解压 nginx-exporter,启动 nginx-exporter
cd /opt
tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
cd nginx-vts-exporter-0.10.3.linux-amd64/
mv nginx-vts-exporter /usr/local/bin/
cd /usr/lib/systemd/system
vim nginx_vts_exporter.service
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/vts-status/format/jsonExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.targetsystemctl start nginx_vts_exporter.service
systemctl enable nginx_vts_exporter.servicenginx-vts-exporter --help
netstat -lntp | grep 9913

普罗米修斯服务器
vim prometheus.yml 
- job_name: "nginx_vts_exporter"scheme: httpmetrics_path: /metricsstatic_configs:- targets:- 20.0.0.60:9913labels:service: nginx
最后添加

3、部署 Grafana 进行展示 

普罗米修斯服务器
上传grafana-7.4.0-1.x86_64.rpm
rpm -ivh grafana-7.4.0-1.x86_64.rpmsystemctl start grafana-server.service
systemctl enable grafana-server.service 
netstat -lntp | grep 3000

浏览器访问

如何查看其他nodeport节点数据

导入 grafana 监控面板
浏览器访问:https://grafana.com/grafana/dashboards ,在页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON


http://www.ppmy.cn/ops/96980.html

相关文章

C++ fill fill_n 函数

fill 函数和 fill_n 函数在c 被称为写入元素算法 在大多数情况下,fill 函数的效率通常比 for 循环更高,尤其是在处理大规模数据时。这是因为 fill 函数通常是用更底层的、高效的方式实现的,可以减少循环开销。 解决memset函数不能对 数组 进…

C#中异常处理机制

在C#中,异常处理是一种重要的错误处理机制,它允许开发者捕获和处理运行时可能出现的错误。以下是关于C#中的异常处理机制的详细解释: 1. try-catch-finally语句的使用 try-catch-finally语句用于捕获和处理异常。其基本结构如下&#xff1a…

通过域名和HTTPS上线MSF

使用受信任证书的Meterpreter载荷 现在大多数安全解决方案还会通过分析进出目标机器的流量来进行网络入侵检测。在这种情况下,很可能即使使用编码器绕过了防病毒软件,但有效载荷也会在尝试连接到我们的侦听器时被捕获和拦截。 # 准备工作 首先需要准备…

springboot+html宠物医院系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证闲鱼玩家,服务很多代码文档,百分百好评,战绩可查!!入职于互联网大厂,可以交流,共同进步。有保障的售后 代码参考数据…

ultralytics实例分割mask读取

在前面学习YOLOv8的实例分割过程中,需要使用实例分割的数据集,其标签的标注格式如下: 实例分割勾勒轮廓 其中,第一个数字代表的是类别编号,后面的数据代表的是标注的坐标(转换到0-1之间)每两个…

【区块链+商贸零售】NOCO 企业数字化社区 | FISCO BCOS应用案例

NOCO企业数字化社区是链动时代基于零代码搭建工具和FISCO BCOS区块链技术,设计开发的分布式企业数字 化服务社区解决方案,零代码搭建工具提供高效的应用开发,区块链提供弱信任环境下的沟通机制以提升沟通效 率。以上海某进出口贸易行业合作伙…

wordpress二次开发 在Woocommerce相关产品中显示产品变体的方法

在Woocommerce中,相关产品的展示是一个很好的促销策略。但有时候,你可能希望在这些相关产品中显示产品的不同变体,以提供更多选择给客户。本文将指导你如何在相关产品中显示产品变体。 首先,你需要登录到你的WordPress管理后台。…

简易版PHP软文发稿开源系统

软文发稿系统源码(软文发布系统)基于旧版本的媒介软文项目基础上整理出一套简易版,以满足不同客户群体。虽然是简易版 但麻雀虽小五脏俱全,基本能满足小众群体需求 具体功能如下: 大模块功能: 1、媒体发布 …

AXI DMA IP的DRE对性能产生的影响

AXI DMA IP的DRE(Data Re-Alignment,数据重对齐)对齐功能在提供数据传输灵活性的同时,确实可能对性能产生一定的影响。在编程时,是否启用此功能需要综合考虑多个因素。以下是对这一问题的详细分析: DRE对齐…

代码设计:设计模式:桥接模式

文章目录 定义类结构代码实例总结 定义 从原有类中抽取出独立功能的抽象类/接口,通过组合的方式建立原有类和抽取类之间的联系 类结构 原有类 持有一个抽取的接口/抽象类对象 抽取相关类 从原有类中抽取出独立功能的类, 抽象类/接口 定义独立功…

vue3响应式工具 toRefs() 和 toRef()

前言 直接解构响应式对象的属性进行赋值给新的变量&#xff0c;会导致新变量失去响应式。 当修改新变量的值时&#xff0c;不会触发原始响应式对象的更新&#xff0c;从而在模板中也不会有相应的视图更新。 示例&#xff1a; <template><div><p>姓名: {{ …

设计模式-工厂方法

“对象创建”模式 通过“对象创建”模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract Factory…

jvm 调优篇

一 jvm调优篇 1.1 查看新生代和老年代的比例 输入命令&#xff1a; jinfo -flag NewRatio 17480 1.2 查看新生代&#xff0c;survivor和Eden区比例 1.3 查看jvm调优参数 二 调优参数 2.1 oom异常 通过visual vm查看 2.java dump 大对象 2.2 mat工具进行分析 栈的信息

Hadoop大数据分析案例

目录 案例概述环境搭建1. Hadoop单机环境2. Hadoop集群环境 数据集数据预处理 MapReduce作业编写提交作业 数据可视化可能遇到的问题及解决方法结论 案例概述 本案例将详细介绍如何在单机和集群环境下使用Hadoop进行大数据分析&#xff0c;最后利用Python进行数据的可视化展示…

stable-fast-3d的部署,在服务器Ubuntu22.04系统下——点动科技

在服务器Ubuntu22.04系统下&#xff0c;stable-fast-3d的部署 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安…

Windows禁止应用联网

转自两种方法阻止电脑上的软件彻底联网&#xff01; - 知乎 (zhihu.com) 但为了稳妥&#xff0c;自己还是稍微记录一下 1、创建bat脚本文件 创建文本-将下面的代码填入-保存为.bat文件 Echo Off SetLocal:beginecho: echo ****** 禁止文件夹联网 ****** echo:set /p folder…

iPhone如何全选删除照片:一步到位的清理指南

随着时间的推移&#xff0c;iPhone中的照片会迅速累积&#xff0c;最终可能占据大量的存储空间。无论是为了释放空间&#xff0c;还是整理照片库&#xff0c;iPhone如何全选删除照片成为许多用户的需求。然而&#xff0c;iPhone原生的“照片”应用并没有直接提供“全选删除”功…

西北乱跑娃 -- linux使用笔记

1.后台运行每天一个日志文件 nohup python3.8 manage.py >> $(date %Y-%m-%d).log 2>&1 &2.目录操作&#xff1a; ls&#xff1a;列出目录内容。cd&#xff1a;改变当前工作目录。pwd&#xff1a;显示当前工作目录的路径。mkdir&#xff1a;创建新目录。rmd…

Oracle常用操作

Oracle 数据库中常用的操作&#xff0c;包括增删改查、同义词创建、合并更新、建表、建索引、聚合查询和多表查询。通过这些操作&#xff0c;可以有效地管理和查询 Oracle 数据库中的数据&#xff0c;日常工作中也会事半功倍。 增删改查 插入数据&#xff08;INSERT&#xff…

【C语言】字符函数与字符串函数(上)

字符函数与字符串函数&#xff08;上&#xff09; 文章目录 字符函数与字符串函数&#xff08;上&#xff09;1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现3.1使用示例&#xff1a;3.2模拟实现 4.strcpy的使用和模拟实现4.1使用示例:4.2模拟实现 5.strcat的使用和模拟…