首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Prometheus 基础入门 (一)

Prometheus 基础入门 (一)

作者头像
Kevin song
发布2023-02-09 15:00:02
发布2023-02-09 15:00:02
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

一.Prometheus?

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。

Prometheus的特点

  • 多维度数据模型。
  • 灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点是自主的。
  • 通过基于HTTP的pull方式采集时序数据。
  • 可以通过中间网关进行时序列数据推送。
  • 通过服务发现或者静态配置来发现目标服务对象。
  • 支持多种多样的图表和界面展示,比如Grafana等。

Prometheus相关组件

Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server对外提供了自定义的PromQL语言,实现对数据的查询以及分析。Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。

Exporter

Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。Exporter分为2类:

直接采集:Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。

间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。

指标(metric)、样本

所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。每一条时间序列由指标名称(Metrics Name)以及一组标签(Labels)唯一标识。举例,大括号中为标签,这个例子就可以理解为3条时间序列(虽然指标名称相同,但标签不同):

代码语言:javascript
代码运行次数:0
运行
复制
node_disk_io_now{device="dm-0",instance="localhost:9100",job="node"}
node_disk_io_now{device="sda",instance="localhost:9100",job="node"}
node_disk_io_now{device="sr0",instance="localhost:9100",job="node"}

在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:

  • 指标(metric):metric name和描述当前样本特征的label sets
  • 时间戳(timestamp):一个精确到毫秒的时间戳
  • 样本值(value):一个folat64的浮点型数据表示当前样本的值

Job和Instance

当需要采集不同的监控指标(例如:主机、MySQL、Nginx)时,只需要运行相应的监控采集程序(exporter),并且让Prometheus Server知道Exporter实例的访问地址。

在Prometheus中,每一个暴露监控样本数据的HTTP服务称为一个实例(instance),它是被监控的具体目标。监控这些instances的任务叫做job。每个job负责一类任务,可以为一个job配置多个instance,job对自己的instance执行相同的动作。隶属于job的instance可以直接在配置文件中指定。也可以让job自动从consul、kuberntes中动态获取,这个过程就是服务发现。

AlertManager

在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

PushGateway

由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。

四种Metrics类型

以node exporter为例,查看机器ip:9100/metrics页面可以查看到当前抓取的数据,TYPE字段中包含有类型。

Counter(计数器)

特点是只增不减,除非系统发生重置,常用来记录某些事件发生的次数。一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

Gauge(仪表盘)

侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。

Histogram(直方图)

用于统计和分析样本的分布情况。

Summary(摘要)

也用于统计和分析样本的分布情况。

Prometheus架构

二.prometheus部署

Prometheus官网下载:https://prometheus.io/download/

1. 下载prometheus-2.37.2

代码语言:javascript
代码运行次数:0
运行
复制
wget https://github.com/prometheus/prometheus/releases/download/v2.37.2/prometheus-2.37.2.linux-amd64.tar.gz
tar zxf prometheus-2.37.2.linux-amd64.tar.gz
mv prometheus-2.37.2.linux-amd64 prometheus
mv prometheus  /usr/local/

查看Prometheus版本信息

代码语言:javascript
代码运行次数:0
运行
复制
./prometheus  --version

2. Prometheus配置文件

配置文件路径/usr/local/prometheus/prometheus.yml

Prometheus配置文件介绍

代码语言:javascript
代码运行次数:0
运行
复制
# 全局配置
global:
  scrape_interval:     15s # 设置抓取(pull)时间间隔,默认是1m
  evaluation_interval: 15s # 设置rules评估时间间隔,默认是1m
  # scrape_timeout is set to the global default (10s).

# 告警管理配置,暂未使用,默认配置
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 加载rules,并根据设置的时间间隔定期评估,暂未使用,默认配置
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# 抓取(pull),即监控目标配置
# 默认只有主机本身的监控配置
scrape_configs:
  # 监控目标的label(这里的监控目标只是一个metric,而不是指某特定主机,可以在特定主机取多个监控目标),在抓取的每条时间序列表中都会添加此label
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    # 可覆盖全局配置设置的抓取间隔,由15秒重写成5秒。
    scrape_interval: 5s

    # 静态指定监控目标,暂不涉及使用一些服务发现机制发现目标
static_configs:
      - targets: ['localhost:9090']
        # (opentional)再添加一个label,标识了监控目标的主机
labels:
          instance: prometheus

检查prometheus.yml格式

代码语言:javascript
代码运行次数:0
运行
复制
./promtool check config prometheus.yml

3. 添加prometheus用户

添加prometheus用户,prometheus账户启动服务

代码语言:javascript
代码运行次数:0
运行
复制
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus

目录赋权

代码语言:javascript
代码运行次数:0
运行
复制
chown -R prometheus:prometheus /usr/local/prometheus/

创建prometheus 本地TSDB数据存储目录

代码语言:javascript
代码运行次数:0
运行
复制
mkdir -p /var/lib/prometheus
chown -R prometheus:prometheus /var/lib/prometheus/

4. systemctl 管理prometheus

vim /usr/lib/systemd/system/prometheus.service

代码语言:javascript
代码运行次数:0
运行
复制
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target

[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=prometheus
# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus

ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

修改文件属主属组

代码语言:javascript
代码运行次数:0
运行
复制
chown prometheus:prometheus /usr/lib/systemd/system/prometheus.service

设置开机启动

代码语言:javascript
代码运行次数:0
运行
复制
systemctl enable Prometheus && systemctl start prometheus

通过Prometheus的restful接口热加载配置

代码语言:javascript
代码运行次数:0
运行
复制
curl  -X POST http://127.0.0.1:9090/-/reload

请求接口后返回 Lifecycle API is not enabled. prometheus启动没有开启热更新配置,需要在启动的命令行增加参数:--web.enable-lifecycle

代码语言:javascript
代码运行次数:0
运行
复制
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.enable-lifecycle

5. 启动服务并访问Web UI

(1)查看prometheus服务状态

代码语言:javascript
代码运行次数:0
运行
复制
systemctl  status prometheus

(2)Web UI

Prometheus自带有简单的UI,http://localhost:9090

在Status菜单下,Configuration,Rule,Targets等,Status-->Configuration展示prometheus.yml的配置。

三.部署node_exporter

Node_exporter收集机器的系统数据,采用prometheus官方提供的exporter,除node_exporter外,官方还提供consul,memcached,haproxy,mysqld等exporter,具体可查看官网.

1. 下载&部署

代码语言:javascript
代码运行次数:0
运行
复制
wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
tar -zvxf node_exporter-1.4.0.linux-amd64.tar.gz   -C /usr/local/

2. 添加prometheus用户

代码语言:javascript
代码运行次数:0
运行
复制
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus

修改文件的属主属组

代码语言:javascript
代码运行次数:0
运行
复制
chown -R prometheus:prometheus /usr/local/ node_exporter/

3. systemctl 管理node_exporter

vim /usr/lib/systemd/system/node_exporter.service

代码语言:javascript
代码运行次数:0
运行
复制
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

设置开机启动

代码语言:javascript
代码运行次数:0
运行
复制
systemctl enable node_exporter && systemctl start node_exporter

4. prometheus Server添加node节点监控

prometheus Server 配置文件中添加node_exporter监控

vim /usr/local/prometheus/prometheus.yml

代码语言:javascript
代码运行次数:0
运行
复制
- job_name: "kylin-prometheus"
    scrape_interval: 10s
    static_configs:
      - targets: ['192.168.100.167:9100']
        labels:
          instance: kylin-prometheus002

5.检查prometheus.yml格式

代码语言:javascript
代码运行次数:0
运行
复制
./promtool check config prometheus.yml

6.重启prometheus

代码语言:javascript
代码运行次数:0
运行
复制
systemctl  restart prometheus

7.访问prometheus UI,查看node 节点已经被监控

8. 查看http metrics 采集指标

http://192.168.100.167:9100/metrics,查看从exporter具体能抓到的数据

四.prometheus node_exporter 查询语句

1,获取系统信息

node_uname_info

2,获取系统uptime 时间

sum(time() - node_boot_time_seconds)by(instance)

3,系统启动时间

node_boot_time_seconds

4,系统当前时间

time()

5,CPU核数

count(node_cpu_seconds_total{mode='system'}) by (instance)

6,计算 CPU 使用率

(1 - sum(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) ) * 100

7,计算内存使用率

(1- (node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100

8,查看节点总内存

node_memory_MemTotal_bytes/1024/1024/1024

9,计算磁盘使用率

(1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} /

node_filesystem_size_bytes{fstype=~"ext4|xfs"}) * 100

10,磁盘IO

磁盘读 IO 使用

sum by (instance) (rate(node_disk_reads_completed_total[5m]))

磁盘写 IO 使用

sum by (instance) (rate(node_disk_writes_completed_total[5m]))

11,网络带宽

下行带宽

sum by(instance) (irate(node_network_receive_bytes_total{device!~"bond.*?|lo"}[5m]))

上行带宽

sum by(instance) (irate(node_network_transmit_bytes_total{device!~"bond.*?|lo"}[5m]))

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源搬运工宋师傅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档