1,安装部署。
1,环境准备。
软件包下载地址:https://prometheus.io/download/
地址 | 规划/软件包 |
192.168.0.10 | Prometheus Server |
192.168.0.10 | node_exporter |
2,部署Prometheus Server。
1,下载安装包。
$ cd /usr/local/src/
$ wget https://github.com/prometheus/prometheus/releases/download/v2.19.1/prometheus-2.19.1.linux-amd64.tar.gz
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
2.安装 Prometheus
创建prometheus用户
$ groupadd prometheus
$ useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus
解压安装包。
$ tar xf prometheus-2.19.1.linux-amd64.tar.gz -C /usr/local/ && cd /usr/local/
$ ln -s /usr/local/prometheus-2.19.1.linux-amd64/ prometheus
Prometheus命令参数详解:
usage: prometheus [<flags>]
The Prometheus monitoring server
Flags:
-h, --help 查看命令帮助
--version 查看版本信息
--config.file="prometheus.yml"
Prometheus配置文件路径
--web.listen-address="0.0.0.0:9090"
监听地址
--web.read-timeout=5m 超时读取请求并关闭空闲连接之前的最大持续时间
--web.max-connections=512 最大同时连接数
--web.external-url=<URL> 可从外部访问Prometheus的URL,(例如,如果Prometheus是通过反向代理提供的)。
用来生成返回到Prometheus本身的相对和绝对路径。如果该网址包含路径部分,它将是
用于为Prometheus服务的所有HTTP端点添加前缀。 如果省略,将导出相关的URL组件
自动。
--web.route-prefix=<path> Web端点内部路由的前缀。 默认为--web.external-url的路径。
--web.user-assets=<path> 静态资源目录位于:/user.
--web.enable-lifecycle 启用关机并通过HTTP请求重新加载.
--web.enable-admin-api 为管理员控制操作启用API端点.
--web.console.templates="consoles"
控制台模板目录的路径位于:/consoles.
--web.console.libraries="console_libraries"
控制台库目录的路径.
--web.page-title="Prometheus Time Series Collection and Processing Server"
Prometheus实例的文档标题.
--web.cors.origin=".*" 用于CORS来源的正则表达式:'https?://(domain1|domain2)\.com'
--storage.tsdb.path="data/"
指标存储的基本路径.
--storage.tsdb.retention.time=STORAGE.TSDB.RETENTION.TIME
将样品保存多长时间。 设置此标志后,它将覆盖“ storage.tsdb.retention”。 如果未设置此标志,“ storage.tsdb.retention”或“ storage.tsdb.retention.size”,则保留时间默认为15d。 支持的单位:y,w,d,h,m,s,ms。
--storage.tsdb.retention.size=STORAGE.TSDB.RETENTION.SIZE
EXPERIMENTAL]可以为块存储的最大字节数。 需要一个单位,受支持的单位:B,KB,MB,GB,TB,PB,EB。 例如:“ 512MB”。 该标志是试验性的,可以在将来的版本中进行更改。
--storage.tsdb.no-lockfile
不要在数据目录中创建锁文件。
--storage.tsdb.allow-overlapping-blocks
[EXPERIMENTAL]允许重叠的块,从而启用垂直压缩和垂直查询合并。
--storage.tsdb.wal-compression
压缩tsdb WAL。
--storage.remote.flush-deadline=<duration>
关闭或配置重新加载时等待冲洗样品的时间
--storage.remote.read-sample-limit=5e7
在单个查询中要通过远程读取接口返回的最大样本总数。 0表示没有限制。 对于流式响应类型,将忽略此限制。
--storage.remote.read-concurrent-limit=10
并发远程读取调用的最大数目。 0表示没有限制。
--storage.remote.read-max-bytes-in-frame=1048576
编组之前用于流式传输远程读取响应类型的单个帧中的最大字节数。 请注意,客户端也可能会限制帧大小。 默认为protobuf建议的1MB。
--rules.alert.for-outage-tolerance=1h
容忍普罗米修斯中断以恢复警报“ for”状态的最大时间。
--rules.alert.for-grace-period=10m
警报和恢复的“ for”状态之间的最短持续时间。 仅对于配置的“ for”时间大于宽限期的警报,才保持此状态。
--rules.alert.resend-delay=1m
重新发送警报到Alertmanager之前等待的最短时间
--alertmanager.notification-queue-capacity=10000
等待的Alertmanager通知的队列容量。
--alertmanager.timeout=10s
向Alertmanager发送警报的超时。
--query.lookback-delta=5m 在表达式评估和联合期间用于检索指标的最大回溯持续时间。
--query.timeout=2m 查询中止之前可能要花费的最长时间。
--query.max-concurrency=20
并发执行的最大查询数。
--query.max-samples=50000000
单个查询可以加载到内存中的最大样本数。 请注意,如果查询尝试将更多的样本加载到内存中,则查询将失败,因此这也限制了查询可以返回的样本数。
--log.level=info 仅记录具有给定严重性或更高严重性的消息。 下列之一:[调试,信息,警告,错误]
--log.format=logfmt 日志消息的输出格式。 下列之一:[logfmt,json]
创建systemd启动脚本
$ vim /etc/systemd/system/prometheus.service
添加如下内容:
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention.time=10d --log.level=info
Restart=on-failure
[Install]
WantedBy=multi-user.target
–storage.tsdb.path 修改本地数据存储的路径
–log.level 日志等级
–storage.tsdb.retention.time 保存时间
在运行时热加载Prometheus的配置信息
romtheus的时序数据库在存储了大量的数据后,每次重启Prometheus进程的时间会越来越慢。 而在日常运维工作中会经常调整Prometheus的配置信息,实际上Prometheus提供了在运行时热加载配置信息的功能。
Prometheus配置的热加载
Prometheus配置信息的热加载有两种方式:
第一种热加载方式:查看Prometheus的进程id,发送SIGHUP信号:
kill -HUP <pid>
第二种热加载方式:发送一个POST请求到/-/reload,需要在启动时给定–web.enable-lifecycle选项:
curl -X POST http://localhost:9090/-/reload
如果配置热加载成功,Prometheus会打印出下面的log:
... msg="Loading configuration file" filename=prometheus.yml ...
我们使用的是第一种热加载方式,systemd unit文件如下:
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus/prometheus \
--config.file==/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/home/prometheus/data \
--storage.tsdb.retention=365d \
--web.listen-address=:9090 \
--web.external-url=https://prometheus.frognew.com
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
在仅需要重新加载配置,而不需重启进程时,只需要运行systemctl reload prometheus即可。
2.1 使用容器安装
对于Docker用户,直接使用Prometheus的镜像即可启动Prometheus Server
docker run -itd -p 9090:9090 --user root --privileged --name prometheus -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
启动完成后,可以通过http://localhost:9090访问Prometheus的UI界面:
3,安装 node_exporter
在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的CPU使用率,我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址(通常是/metrics)拉取监控样本数据.
从上面的描述中可以看出Exporter可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向Prometheus提供标准格式的监控样本数据即可。
在 Prometheus 本节点或者另一台节点上分别安装 node_exporter
$ tar xf node_exporter-1.0.1.linux-amd64.tar.gz -C /usr/local/ && cd /usr/local/
$ ln -s /usr/local/node_exporter-1.0.1.linux-amd64/ node_exporter
$ chown -R prometheus:prometheus /usr/local/node_exporter-1.0.1.linux-amd64/
node_exporter常用命令参数:
用法:node_exporter [<flags>]
标志:
-h,--help显示上下文相关的帮助(也可以尝试--help-long和--help-man)。
--collector.cpu.info启用指标cpu_info
--collector.diskstats.ignored-devices =“ ^(ram | loop | fd |(h | s | v | xv)d [a-z] | nvme \\ d + n \\ d + p)\\ d + $”
设备的正则表达式,忽略diskstats。
--collector.filesystem.ignored-mount-points =“ ^ /(dev | proc | sys | var / lib / docker /.+)($ | /)”
对于文件系统收集器,要忽略的安装点正则表达式。
--collector.filesystem.ignored-fs-types =“ ^(autofs | binfmt_misc | bpf | cgroup2?| configfs | debugfs | devpts | devtmpfs | fusectl | hugetlbfs | iso9660 | mqueue | nsfs | overlay | proc | procfs | pstore | rpc_pipefs | securityfs | selinuxfs | squashfs | sysfs | tracefs)$“
文件系统收集器忽略的文件系统类型的正则表达式。
--collector.netclass.ignored-devices =“ ^ $”
Netclass收集器忽略的网络设备的正则表达式。
--collector.netdev.device-blacklist = COLLECTOR.NETDEV.DEVICE-BLACKLIST
净设备正则表达式到黑名单(相互排斥于设备白名单)。
--collector.netdev.device-whitelist = COLLECTOR.NETDEV.DEVICE-WHITELIST
将网络设备的正则表达式添加到白名单(相互排斥于设备黑名单)。
--collector.netstat.fields =“ ^(。* _(InErrors | InErrs)| Ip_Forwarding | Ip(6 | Ext)_(InOctets | OutOctets)| Icmp6?__(InMsgs | OutMsgs)| TcpExt_(Listen。* | Syncookies。* | TCPSynRetrans)| Tcp_(ActiveOpens | InSegs | OutSegs | PassiveOpens | RetransSegs | CurrEstab)| Udp6?_(InDatagrams | OutDatagrams | NoPorts | RcvbufErrors | SndbufErrors))$“
Regexp字段返回以返回netstat收集器。
--collector.ntp.server =“ 127.0.0.1”
用于ntp收集器的NTP服务器
--collector.ntp.protocol-version = 4
NTP协议版本
--collector.ntp.server-is-local
确认collector.ntp.server地址不是公共ntp服务器
--collector.ntp.ip-ttl = 1发送NTP查询时要使用的IP TTL
--collector.ntp.max-distance = 3.46608s
到根的最大累积距离
--collector.ntp.local-offset-tolerance = 1ms
本地时钟和本地ntpd时间之间的偏差可以容忍
--path.procfs =“ / proc”挂载点。
--path.sysfs =“ / sys” sysfs挂载点。
--path.rootfs =“ /” rootfs安装点。
--collector.perf.cpus =“”应该从中收集性能指标的CPU列表
--collector.perf.tracepoint = COLLECTOR.PERF.TRACEPOINT ...
应收集的性能跟踪点
--collector.powersupply.ignored-supplies =“ ^ $”
电源正则表达式对于powersupplyclass收集器将被忽略。
--collector.qdisc.fixtures =“”
用于qdisc收集器端到端测试的测试夹具
--collector.runit.servicedir =“ / etc / service”
Runit服务目录的路径。
--collector.supervisord.url =“ http:// localhost:9001 / RPC2”
XML RPC端点。
--collector.systemd.unit-whitelist =“。+”
将系统单位的正则表达式列入白名单。单元必须同时与白名单匹配,并且与黑名单不匹配。
--collector.systemd.unit-blacklist =“。+ \\。(自动安装|设备|安装|范围|切片)”
将系统单位的正则表达式列入黑名单。单元必须同时与白名单匹配,并且与黑名单不匹配。
--collector.systemd.enable-task-metrics
启用服务单元任务指标unit_tasks_current和unit_tasks_max
--collector.systemd.enable-restarts-metrics
启用服务单位指标service_restart_total
--collector.systemd.enable-start-time-metrics
启用服务单位指标unit_start_time_seconds
--collector.textfile.directory =“”
用于读取带有度量标准的文本文件的目录。
--collector.vmstat.fields =“ ^(oom_kill | pgpg | pswp | pg。* fault)。*”
用于vmstat收集器返回的字段的正则表达式。
--collector.wifi.fixtures =“”
测试装置以用于wifi收集器指标
--collector.arp启用arp收集器(默认值:启用)。
--collector.bcache启用bcache收集器(默认值:启用)。
--collector.bonding启用绑定收集器(默认值:启用)。
--collector.btrfs启用btrfs收集器(默认值:启用)。
--collector.buddyinfo启用buddyinfo收集器(默认值:禁用)
--collector.conntrack启用conntrack收集器(默认值:启用)。
--collector.cpu启用cpu收集器(默认值:启用)。
--collector.cpufreq启用cpufreq收集器(默认值:启用)。
--collector.diskstats启用diskstats收集器(默认值:启用)。
--collector.drbd启用drbd收集器(默认值:禁用)。
--collector.edac启用edac收集器(默认值:启用)。
--collector.entropy启用熵收集器(默认值:启用)。
--collector.filefd启用filefd收集器(默认值:启用)。
--collector.filesystem启用文件系统收集器(默认值:启用)。
--collector.hwmon启用hwmon收集器(默认值:启用)。
--collector.infiniband启用infiniband收集器(默认值:启用)。
--collector.interrupts启用中断收集器(默认值:禁用)。
--collector.ipvs启用ipvs收集器(默认值:启用)。
--collector.ksmd启用ksmd收集器(默认值:禁用)。
--collector.loadavg启用loadavg收集器(默认值:启用)。
--collector.logind启用登录的收集器(默认值:禁用)。
--collector.mdadm启用mdadm收集器(默认值:启用)。
--collector.meminfo启用meminfo收集器(默认值:启用)。
--collector.meminfo_numa启用meminfo_numa收集器(默认值:禁用)。
--collector.mountstats启用mountstats收集器(默认值:禁用)。
--collector.netclass启用netclass收集器(默认值:启用)。
--collector.netdev启用netdev收集器(默认值:启用)。
--collector.netstat启用netstat收集器(默认值:启用)。
--collector.nfs启用nfs收集器(默认值:启用)。
--collector.nfsd启用nfsd收集器(默认值:启用)。
--collector.ntp启用ntp收集器(默认值:禁用)。
--collector.perf启用性能收集器(默认值:禁用)。
--collector.powersupplyclass
启用powersupplyclass收集器(默认值:启用)。
--collector.pressure启用压力收集器(默认值:启用)。
--collector.processes启用进程收集器(默认值:禁用)。
--collector.qdisc启用qdisc收集器(默认值:禁用)。
--collector.rapl启用rapl收集器(默认值:启用)。
--collector.runit启用runit收集器(默认值:禁用)。
--collector.schedstat启用schedstat收集器(默认值:启用)。
--collector.sockstat启用sockstat收集器(默认值:启用)。
--collector.softnet启用softnet收集器(默认值:启用)。
--collector.stat启用统计信息收集器(默认值:启用)。
--collector.supervisord启用受监管的收集器(默认值:禁用)。
--collector.systemd启用systemd收集器(默认值:禁用)。
--collector.tcpstat启用tcpstat收集器(默认值:禁用)。
--collector.textfile启用文本文件收集器(默认值:启用)。
--collector.thermal_zone启用thermal_zone收集器(默认值:启用)。
--collector.time启用时间收集器(默认值:启用)。
--collector.timex启用timex收集器(默认值:启用)。
--collector.udp_queues启用udp_queues收集器(默认值:启用)。
--collector.uname启用uname收集器(默认值:启用)。
--collector.vmstat启用vmstat收集器(默认值:启用)。
--collector.wifi启用wifi收集器(默认值:禁用)。
--collector.xfs启用xfs收集器(默认值:启用)。
--collector.zfs启用zfs收集器(默认值:启用)。
--web.listen-address =“:9100”
公开指标和Web界面的地址。
--web.telemetry-path =“ / metrics”
公开指标的路径。
--web.disable-exporter-metrics
排除有关导出器本身的指标(promhttp _ *,process _ *,go_ *)。
--web.max-requests = 40并行抓取请求的最大数量。使用0禁用。
--collector.disable-defaults
将所有收集器默认设置为禁用。
--web.config =“” [EXPERIMENTAL]可以启用TLS或身份验证的配置yaml文件的路径。
--log.level = info仅记录具有给定严重性或更高严重性的消息。下列之一:[调试,信息,警告,错误]
--log.format = logfmt日志消息的输出格式。下列之一:[logfmt,json]
--version 查看版本信息
创建 node_exporter 启动脚本
$ vim /etc/systemd/system/node_exporter.service
添加如下内容:
[Unit]
Description=node_export
Documentation=https://github.com/prometheus/node_exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
注意:node_exporter 的运行用户也是 prometheus 用户需要在每台节点上都创建该用户。
启动 node_exporter 服务:
$ systemctl enable node_exporter.service
$ systemctl start node_exporter.service
$ systemctl status node_exporter.service
$ ss -tnl | grep 9100
#访问http://localhost:9100/
curl http://localhost:9100/
访问http://localhost:9100/metrics,可以看到当前node exporter获取到的当前主机的所有监控数据,如下所示:
每一个监控指标之前都会有一段类似于如下形式的信息:
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125
其中HELP用于解释当前指标的含义,TYPE则说明当前指标的数据类型。在上面的例子中node_cpu的注释表明当前指标是cpu0上idle进程占用CPU的总时间,CPU占用时间是一个只增不减的度量指标,从类型中也可以看出node_cpu的数据类型是计数器(counter),与该指标的实际含义一致。又例如node_load1该指标反映了当前主机在最近一分钟以内的负载情况,系统的负载情况会随系统资源的使用而变化,因此node_load1反映的是当前状态,数据可能增加也可能减少,从注释中可以看出当前指标类型为仪表盘(gauge),与指标反映的实际含义一致。
除了这些以外,在当前页面中根据物理主机系统的不同,你还可能看到如下监控指标:
- node_boot_time:系统启动时间
- node_cpu:系统CPU使用量
- nodedisk*:磁盘IO
- nodefilesystem*:文件系统用量
- node_load1:系统负载
- nodememeory*:内存使用量
- nodenetwork*:网络带宽
- node_time:当前系统时间
- go_*:node exporter中go相关指标
- process_*:node exporter自身进程相关运行指标
2,配置 Prometheus 添加监控目标,从Node Exporter收集监控数据
$ cd /usr/local/prometheus
$ vim prometheus.yml
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
# 搜集node exporter监控数据
static_configs:
- targets: ['localhost:9090','localhost:9100'] # 对本机node_exporter 监控
举例新添加的对其它node节点抓取数据
- job_name: '0.11'
#重写了全局抓取间隔时间,由15秒重写成5秒。
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.11:9100']
启动 Prometheus 服务:
$ chown -R prometheus:prometheus /usr/local/prometheus-2.19.1.linux-amd64/
$ systemctl enable prometheus.service
$ systemctl start prometheus.service
$ systemctl status prometheus.service
注意:要留意启动之前的目录权限更改,否则可能会在启动的时候报错Feb 11 16:08:41 localhost alertmanager: level=error ts=2019-02-11T08:08:41.419390133Z caller=main.go:179 msg="Unable to create data directory" err="mkdir data/: permission denied"。
访问 Prometheus WEB 查看我们定义的目标主机:http://192.168.0.10:9090/targets
其中“1”表示正常,反之“0”则为异常。
使用PromQL查询监控数据
Prometheus UI是Prometheus内置的一个可视化管理界面,通过Prometheus UI用户能够轻松的了解Prometheus当前的配置,监控任务运行状态等。 通过Graph面板,用户还能直接使用PromQL实时查询监控数据:
切换到Graph面板,用户可以使用PromQL表达式查询特定监控指标的监控数据。如下所示,查询主机负载变化情况,可以使用关键字node_load1可以查询出Prometheus采集到的主机负载的样本数据,这些样本数据按照时间先后顺序展示,形成了主机负载随时间变化的趋势图表:
PromQL是Prometheus自定义的一套强大的数据查询语言,除了使用监控指标作为查询关键字以外,还内置了大量的函数,帮助用户进一步对时序数据进行处理。例如使用rate()函数,可以计算在单位时间内样本数据的变化情况即增长率,因此通过该函数我们可以近似的通过CPU使用时间计算CPU的利用率:
rate(process_cpu_seconds_total[2m])
这时如果要忽略那一个CPU的,只需要使用without表达式,将标签CPU去除后聚合数据即可:
avg without(cpu) (rate(process_cpu_seconds_total[2m]))
查询每台服务器每1分钟的CPU负载是多少,则需要使用如下的查询语句进行查询:
(1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) /(sum(increase(node_cpu_seconds_total[1m])) by (instance)))) * 100
通过PromQL我们可以非常方便的对数据进行查询,过滤,以及聚合,计算等操作。通过这些丰富的表达书语句,监控指标不再是一个单独存在的个体,而是一个个能够表达出正式业务含义的语言。