promethues是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。
Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到的数据会持久化到存储设备当中。
每个被监控的主机都可以通过专用的 exporter 程序提供输出监控数据的接口,它会在目标处收集监控数据,并暴露出一个 HTTP 接口供 Prometheus server 查询,Prometheus 通过基于 HTTP 的 pull 的方式来周期性的采集数据。
如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到 Alertmanager 完成告警的汇总和分发。
当被监控的目标有主动推送数据的需求时,可以以 Pushgateway 组件进行接收并临时存储数据,然后等待 Prometheus server 完成数据的采集。
任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让 Prometheus 通过服务发现的机制进行动态管理。
Prometheus 能够直接把 API Server 作为服务发现系统使用,进而动态发现和监控集群中的所有可被监控的对象。
Prometheus 官网地址:https://prometheus.io
Prometheus github 地址:Prometheus · GitHub
● 多维数据模型:由度量名称和键值对标识的时间序列数据
时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器 指标数据、应用程序性能监控数据、网络数据等都是时序数据
● 内置时间序列(Time Series)数据库:Prometheus ;外置的远端存储通常会用: InfluxDB、 OpenTSDB 等
● promQL 一种灵活的查询语言,可以利用多维数据完成复杂查询
● 基于 HTTP 的 pull(拉取)方式采集时间序列数据
● 同时支持 PushGateway 组件收集数据
● 通过静态配置或服务发现发现目标
● 支持作为数据源接入 Grafana
TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景
● 存储的数据量级十分庞大
● 大部分时间都是写入操作
● 写入操作几乎是顺序添加,大多数时候数据都以时间排序
● 很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库
● 删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
● 基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用
● 读操作是十分典型的升序或者降序的顺序读
● 高并发的读操作十分常见
Prometheus 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由 Prometheus Server 所负责。Prometheus 生态圈中包含了多个组件,其中部分组件可选:

服务核心组件,采用 pull 方式采集监控数据,通过 http 协议传输;存储时间序列数据;基于“告警规则”生成告警通知。
Prometheus server 由三个部分组成:Retrieval,Storage,PromQL
客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
指标暴露器,负责收集不支持内建 Instrumentation 的应用程序或服务的性能指标数据,并通过 HTTP 接口供 Prometheus Server 获取。
换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为 Prometheus 格式的指标向外暴露。
常用的 Exporters:
服务发现,用于动态发现待监控的 Target,Prometheus 支持多种服务发现机制:文件、DNS、Consul、Kubernetes 等等。 服务发现可通过第三方提供的接口,Prometheus 查询到需要监控的 Target 列表,然后轮询这些 Target 获取监控数据。该组件目前由 Prometheus Server 内建支持
是一个独立的告警模块,从 Prometheus server 端接收到 “告警通知” 后,会进行去重、分组,并路由到相应的接收方,发出报警, 常见的接收方式有:电子邮件、钉钉、企业微信等。
Prometheus Server 仅负责生成告警指示,具体的告警行为由另一个独立的应用程序 AlertManager 负责;告警指示由 Prometheus Server 基于用户提供的告警规则周期性计算生成,Alertmanager 接收到 Prometheus Server 发来的告警指示后,基于用户定义的告警路由向告警接收人发送告警信息。
类似一个中转站,Prometheus 的 server 端只会使用 pull 方式拉取数据,但是某些节点因为某些原因只能使用 push 方式推送数据, 那么它就是用来接收 push 而来的数据并暴露给 Prometheus 的 server 拉取的中转站。
可以理解成目标主机可以上报短期任务的数据到 Pushgateway,然后 Prometheus server 统一从 Pushgateway 拉取数据。
是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
(1)Prometheus 以 Prometheus Server 为核心,用于收集和存储时间序列数据。 PrometheusServer 从监控目标中通过 pull 方式拉取指标数据,或通过 pushgateway 把 采集的数据拉取 到 Prometheus server 中。
(2)Prometheus server 把采集到的监控指标数据通过 TSDB 存储到本地 HDD/SSD 中。
(3)Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的告警通知 发送到 Alertmanager。
(4)Alertmanager 通过配置报警接收方,发送报警到邮件、钉钉或者企业微信等。
(5)Prometheus 自带的 Web UI 界面提供 PromQL 查询语言,可查询监控数据。
(6)Grafana 可接入 Prometheus 数据源,把监控数据以图形化形式展示出。
- systemctl stop firewalld
- setenforce 0
-
- cd /opt/
- tar xf prometheus-2.35.0.linux-amd64.tar.gz
- mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
-
- cat /usr/local/prometheus/prometheus.yml | grep -v "^#"
- global: #用于prometheus的全局配置,比如采集间隔,抓取超时时间等
- scrape_interval: 15s #采集目标主机监控数据的时间间隔,默认为1m
- evaluation_interval: 15s #触发告警生成alert的时间间隔,默认是1m
- # scrape_timeout is set to the global default (10s).
- scrape_timeout: 10s #数据采集超时时间,默认10s
-
- alerting: #用于alertmanager实例的配置,支持静态配置和动态服务发现的机制
- alertmanagers:
- - static_configs:
- - targets:
- # - alertmanager:9093
-
- rule_files: #用于加载告警规则相关的文件路径的配置,可以使用文件名通配机制
- # - "first_rules.yml"
- # - "second_rules.yml"
-
- scrape_configs: #用于采集时序数据源的配置
- # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- - job_name: "prometheus" #每个被监控实例的集合用job_name命名,支持静态配置(static_configs)和动态服务发现的机制(*_sd_configs)
-
- # metrics_path defaults to '/metrics'
- metrics_path: '/metrics' #指标数据采集路径,默认为 /metrics
- # scheme defaults to 'http'.
-
- static_configs: #静态目标配置,固定从某个target拉取数据
- - targets: ["localhost:9090"]

- cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
- [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=15d \
- --web.enable-lifecycle
-
- ExecReload=/bin/kill -HUP $MAINPID
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
- EOF

- systemctl start prometheus
- systemctl enable prometheus
-
- netstat -natp | grep :9090
-
- 浏览器访问:http://192.168.80.30:9090 ,访问到 Prometheus 的 Web UI 界面
- 点击页面的 Status -> Targets,如看到 Target 状态都为 UP,说明 Prometheus 能正常采集到数据
- http://192.168.80.30:9090/metrics ,可以看到 Prometheus 采集到自己的指标数据,其中 Help 字段用于解释当前指标的含义,Type 字段用于说明数据的类型



- cd /opt/
- tar xf node_exporter-1.3.1.linux-amd64.tar.gz
- mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin

- cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
- [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.tcpstat
-
- ExecReload=/bin/kill -HUP $MAINPID
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
- EOF

- systemctl start node_exporter
- systemctl enable node_exporter
-
- netstat -natp | grep :9100
-
- 浏览器访问:http://192.168.80.30:9100/metrics ,可以看到 Node Exporter 采集到的指标数据


常用的各指标:
●node_cpu_seconds_total
●node_memory_MemTotal_bytes
●node_filesystem_size_bytes{mount_point=PATH}
●node_system_unit_state{name=}
●node_vmstat_pswpin:系统每秒从磁盘读到内存的字节数
●node_vmstat_pswpout:系统每秒钟从内存写到磁盘的字节数更多指标介绍:https://github.com/prometheus/node_exporter
- vim /usr/local/prometheus/prometheus.yml
- #在尾部增加如下内容
- - job_name: "nodes"
- metrics_path: "/metrics"
- scheme: http
- static_configs:
- - targets:
- - 192.168.136.130:9100
- labels:
- from: node_exporter

想要监控其他节点,把二进制文件和启动配置文件复制到对应的节点然后启动node_exporeter,在prometheus节点yml文件里添加新的url路径(
- targets:
- 192.168.136.130:9100 ),然后重新加载prometheus即可!!!
- curl -X POST http://192.168.136.130:9090/-/reload 或 systemctl reload prometheus
- 浏览器查看 Prometheus 页面的 Status -> Targets


- cd /opt/
- tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
- mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/

- cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
- [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.cnf
-
- ExecReload=/bin/kill -HUP $MAINPID
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
- EOF

- vim /etc/my.cnf
- [client]
- ......
- host=localhost
- user=exporter
- password=abc123

- mysql -uroot -pabc123
- GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
- flush privileges;

- systemctl restart mysqld
- systemctl start mysqld_exporter
- systemctl enable mysqld_exporter
-
- netstat -natp | grep :9104

- vim /usr/local/prometheus/prometheus.yml
- #在尾部增加如下内容
- - job_name: "mysqld"
- metrics_path: "/metrics"
- scheme: http
- static_configs:
- - targets:
- - 192.168.136.160:9104
- labels:
- from: mysql_exporter

- curl -X POST http://192.168.136.130:9090/-/reload 或 systemctl reload prometheus
- 浏览器查看 Prometheus 页面的 Status -> Targets



- 下载 nginx-exporter 地址:https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
- 下载 nginx 地址:http://nginx.org/download/
- 下载 nginx 插件地址:https://github.com/vozlt/nginx-module-vts/tags
- cd /opt
- tar xf nginx-module-vts-0.1.18.tar.gz
- mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts

- yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
- useradd -M -s /sbin/nologin nginx
-
- cd /opt
- tar xf nginx-1.24.0.tar.gz
- cd nginx-1.24.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-vts
-
- make -j2 & make install

- vim /usr/local/nginx/conf/nginx.conf
- http {
- vhost_traffic_status_zone; #添加
- vhost_traffic_status_filter_by_host on; #添加,开启此功能,在 Nginx 配置有多个 server_name 的情况下,会根据不同的 server_name 进行流量的统计,否则默认会把流量全部计算到第一个 server_name 上
- ......
- server {
- ......
- }
-
- server {
- vhost_traffic_status off; #在不想统计流量的 server 区域,可禁用 vhost_traffic_status
- listen 8080;
- allow 127.0.0.1;
- allow 192.168.80.30; #设置为 prometheus 的 ip 地址
-
- location /nginx-status {
- stub_status on;
- access_log off;
- }
-
- location /status {
- vhost_traffic_status_display;
- vhost_traffic_status_display_format html;
- }
- }
- }
-
- #假如 nginx 没有规范配置 server_name 或者无需进行监控的 server 上,那么建议在此 vhost 上禁用统计监控功能。否则会出现 127.0.0.1、hostname 等的域名监控信息。
-
- ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- nginx -t
-
- cat > /lib/systemd/system/nginx.service <<'EOF'
- [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.target
- EOF
-
- systemctl start nginx
- systemctl enable nginx
-
-
- 浏览器访问:http://192.168.80.15:8080/status ,可以看到 Nginx Vhost Traffic Status 的页面信息



(4)解压 nginx-exporter,启动 nginx-exporter- cd /opt/
- tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
- mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/
-
- cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
- [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/status/format/json
-
- ExecReload=/bin/kill -HUP $MAINPID
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
- EOF
-
- systemctl start nginx-exporter
- systemctl enable nginx-exporter
-
- netstat -natp | grep :9913


- vim /usr/local/prometheus/prometheus.yml
- #在尾部增加如下内容
- - job_name: "nginx"
- metrics_path: "/metrics"
- scheme: http
- static_configs:
- - targets:
- - 192.168.136.160:9913
- labels:
- from: nginx_exporter

- curl -X POST http://192.168.80.30:9090/-/reload 或 systemctl reload prometheus
- 浏览器查看 Prometheus 页面的 Status -> Targets


- yum localinstall -y grafana-enterprise-8.5.9-1.x86_64.rpm
-
- systemctl start grafana-server
- systemctl enable grafana-server
-
- netstat -natp | grep :3000
-
- 浏览器访问:http://192.168.80.30:3000 ,默认账号和密码为 admin/admin


- Configuration -> Data Sources -> Add data source -> 选择 Prometheus
- HTTP -> URL 输入 http://192.168.80.130:9090
- 点击 Save & Test
-
- 点击 上方菜单 Dashboards,Import 所有默认模板
- Dashboards -> Manage ,选择 Prometheus 2.0 Stats 或 Prometheus Stats 即可看到 Prometheus job 实例的监控图像







- 浏览器访问:https://grafana.com/grafana/dashboards ,在页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON
-
- 在 grafana 页面中,+ Create -> Import ,输入面板 ID 号或者上传 JSON 文件,点击 Load,即可导入监控面板



