1 Prometheus简介
Prometheus 是一个开源的系统监控和报警系统,在 2012 年由 SoundCloud 公司创建,并于 2015 年正式发布。2016 年,Prometheus 正式加入 CNCF (Cloud Native Computing Foundation),成为继kubernetes之后第二个在CNCF托管的项目, 现已广泛用于在容器和微服务领域中得到了广泛的应用,当然不仅限于此Prometheus 本身基于Go语言开发的一套开源的系统监控报警框架和时序列数据库(TSDB)。
Prometheus 的监控功能很完善和全面,性能也足够支撑上万台规模的集群。
网站:Prometheus - Monitoring system & time series database
github:https://github.com/prometheus
其特点主要如下:
-
支持多维数据模型:由度量名和键值对组成的时间序列数据
-
内置时间序列数据库TSDB(Time Series Database )
-
支持PromQL(Prometheus Query Language)查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
-
支持HTTP的Pull方式采集时间序列数据
-
支持PushGateway采集瞬时任务的数据
-
支持服务发现和静态配置两种方式发现目标
-
多种可视化和仪表盘,支持第三方 dashboard, 比如:Grafana
数据特点
-
监控指标,采用独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中非常常见。
-
数据标签,支持多维度标签,每个独立的标签组合都代表一个独立的时间序列
-
数据处理,prometheus内部支持多种数据的聚合、切割、切片等功能。
-
数据存储,prometheus支持双精度浮点型数据存储,缺点就是,不能存储文本,所以无法对日志的数据采集,只不过它有替代产品软件叫loki。
适用场景
Prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监控场景,也适合于高度动态的面向服务的体系结构的监控场景。尤其是在微服务世界中,它对多维数据收集和查询的支持是一种特别的优势。
Prometheus的设计旨在提高可靠性,使其成为中断期间要使用的系统,以使您能够快速诊断问题。Prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务。当基础结构的其他部分故障时,您可以依靠它,并且无需设置广泛的基础结构即可使用它。
由于Prometheus重视可靠性。在故障情况下,我们可以查看有关系统的可用统计信息。但是如果您需要100%的准确性,则Prometheus并不是一个不错的选择,因为所收集的数据可能不会足够详细和完整。在这种情况下,最好使用其他系统来收集和分析数据以进行计费,并使用Prometheus进行其余的监视
2 Prometheus 架构
官方文档: Overview | Prometheus
Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面
主要组件:
-
prometheus :
时序数据存储、监控指标管理
-
可视化:
prometheus web UI :集群状态管理、promQL
grafana:非常全面的可视化套件
-
数据采集
exporter:为当前的客户端暴露出符合prometheus规格的数据指标
pushgateway :拉模式下数据的采集工具
-
监控目标
服务发现 :文件方式、dns方式、console方式、k8s方式
-
告警:
alertmanager
3 Prometheus 数据模型
Prometheus中存储的数据为时间序列,即基于同一度量标准或者同一时间维度的数据流。除了时间序列数据的正常存储之外,Prometheus还会基于原始数据临时生成新的时间序列数据,用于后续查询的依据或结果
每个时间序列都由metric名称和标签(可选键值对)组合成唯一标识
3.1 metric 名字
-
该名字必须有意义,用于表示 metric 的一般性功能,例如:http_requests_total, 表示 http 请求的总数
-
metric 名字由 ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式 [a-zA-Z]:[a-zAZ0-9_:]*的查询需求
-
注意:冒号是为用户定义的记录规则保留的
3.2 标签
-
标签是以键值对的样式而存在,不同的标签用于表示时间序列的不同维度标识
-
基本格式:
<metric name>{<label name>=<label value>, …}
#示例样式:
http_requests_total{method="POST",endpoint="/api/tracks"}
解析: http_requests_total{method="POST"} 表示所有 http 请求中的 POST 请求,
endpoint="/api/tracks"表示请求的url地址是/api/tracks。
当 method="GET" 时,则为新的一个 metric
-
标签中的键名由 ASCII 字符,数字,以及下划线组成,且必须满足正则表达式 [a-zA-Z: [a-zA-Z0- 9:]*。以__头的标签名称保留供内部使用
-
标签值可以包含任何Unicode字符,标签值为空的标签被认为等同于不存在的标签
查询语言允许基于这些维度进行过滤和聚合。更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列
4 Prometheus 部署
4.1 常见部署方式
-
包安装
RHEL系统: prometheus-rpm/release - Results in prometheus-rpm/release
Ubuntu和Debian可直接使用apt命令安装
-
二进制安装 Download | Prometheus
-
基于 docker 运行 Installation | Prometheus
-
基于 kubernetes operator 安装 https://github.com/coreos/kube-prometheus
4.2 docker 镜像直接启动
#安装docker
[root@master1 ~]# yum install docker -y
[root@master1 ~]# systemctl enable --now docker
#将prometheus镜像包上传到linux系统中
#导入镜像
#docker load -i prometheus.tar
[root@master1 ~]# docker run -d --name prometheus -p 9090:9090 prom/prometheus
浏览器访问:http://prometheus服务器:9090/
4.3 二进制安装 prometheus
4.3.1 下载二进制包并解压
官方下载: Download | Prometheus
[root@master1 ~]#wget https://github.com/prometheus/prometheus/releases/download/v2.35.0/prometheus-2.35.0.linux-amd64.tar.gz
[root@master1 ~]#ls -l prometheus-2.35.0.linux-amd64.tar.gz
-rw-r--r-- 1 root root 80620181 Apr 21 10:07 prometheus-2.35.0.linux-amd64.tar.gz
[root@master1 ~]#tar xf prometheus-2.35.0.linux-amd64.tar.gz
[root@master1 ~]#ln -s /root/prometheus-2.35.0.linux-amd64 /usr/local/prometheus
[root@master1 ~]#cd /usr/local/prometheus
[root@master1 /usr/local/prometheus]#ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
[root@master1 /usr/local/prometheus]#mkdir bin conf data
[root@master1 /usr/local/prometheus]#mv prometheus promtool bin/
[root@master1 /usr/local/prometheus]#mv prometheus.yml conf/
[root@master1 /usr/local/prometheus]#useradd -r -s /sbin/nologin prometheus
[root@master1 /usr/local/prometheus]#chown -R prometheus.prometheus /usr/local/prometheus/
[root@master1 /usr/local/prometheus]#cd
[root@master1 ~]#vim /etc/profile.d/prometheus.sh
export PROMETHEUS_HOME=/usr/local/prometheus
export PATH=${PROMETHEUS_HOME}/bin:$PATH
[root@master1 ~]#source /etc/profile.d/prometheus.sh
#查看配置文件,默认可不修改
[root@master1 ~]#grep -Ev "^ *#|^$" /usr/local/prometheus/conf/prometheus.yml
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
#属性解析:主要是global和 scrape_configs 两部分的配置,在这里目前我们保持默认即可
#检查配置文件是否正确
[root@master1 ~]#promtool check config /usr/local/prometheus/conf/prometheus.yml
Checking /usr/local/prometheus/conf/prometheus.yml
SUCCESS: /usr/local/prometheus/conf/prometheus.yml is valid prometheus config file syntax
4.3.2 创建service文件
[root@master1 ~]#vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
User=root
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/bin/prometheus --config.file=/usr/local/prometheus/conf/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
#配置解析:
#我们需要将定制的prometheus的配置文件和数据目录作为启动参数配置好
#其它的参数,可以基于prometheus --help 查看更多
[root@master1 ~]#systemctl daemon-reload
[root@master1 ~]#systemctl restart prometheus
[root@master1 ~]#systemctl status prometheus
[root@master1 ~]#ss -tnlp |grep prometheus
LISTEN 0 4096 *:9090 *:* users:(("prometheus",pid=6488,fd=8))
#结果显示:可以看到当前主机上可以看到一个端口9090,可通过下面地址看到prometheus的服务页面
4.3.3 测试访问
浏览器访问: http://192.168.3.21:9090/