Prometheus使用入门
Monitoring with Prometheus读书笔记
原书见:
https://www.safaribooksonline.com/library/view/monitoring-with-prometheus/9780988820289/
摘录了一些内容,稍微整理了下,更详细的内容可以阅读原书.
简介
Prometheus灵感来源于谷歌的borgmon.
他的设计专注于最近发生的事,而不是几个星期几个月前的,默认只保存15天的时间序列.
内置PromQL查询语言,可以方便进行metric查询和定义新的metric.
数据格式
<time series name>{<label name>=<label value>, ...}
例子:
total_website_visits{site="MegaApp", location="NJ", instance="webserver",job="web"}
安装
安装过程比较简单,官网下载之后解压即可.
windows下可以使用choco安装:
choco install prometheus
也可以使用docker运行:
docker run -p 9090:9090 prom/prometheus
解压后自带一个配置文件,启动时带上文件路径即可:
prometheus --config.file "/etc/prometheus/prometheus.yml"
(放置在了/etc/prometheus
下)
默认跑在9090端口.
监控容器和节点
节点(机器)监控可以使用node exporter.
下载node exporter 解压 复制到可执行中
wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
$ tar -xzf node_exporter-*
$ sudo cp node_exporter-*/node_exporter /usr/local/bin/
默认是9100端口,可以通过/metrics
访问.
收集的数据较多,不需要的指标可以通过--no-模块名
禁用,同时一些没有开启的模块可以通过--模块名
开启.
容器监控可以使用cadvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
监听在8080端口.
对应的Prometheus配置修改:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['138.197.26.39:9100', '138.197.30.147:9100', '138.197.30.163:9100']
- job_name: 'docker'
static_configs:
- targets: ['138.197.26.39:8080', '138.197.30.147:8080', '138.197.30.163:8080']
(ip等信息写在targets中)
Label
注意改变一个label或增加一个新的label会创建一个新的time series.
对收集的metrics的label进行操作.
可以去掉不必要的metrics和label,增加编辑label.
有两个阶段可以修改:
- relabel_configs:用来修改服务发现过来的元数据label.
- metric_relabel_configs:获得数据存储到磁盘之前操作
如图所示:
一些配置(和job_name平级):
metric_relabel_configs:
- source_labels: [__name__]
separator: ','
regex: '(container_tasks_state|container_memory_failures_total)'
action: drop
__name__
是metrics的保留label,表示这个metric的名字,这里将这些名字用,
拼起来,过滤掉符合正则的名字的metrics.
metric_relabel_configs:
- source_labels: [id]
regex: '/docker/([a-z0-9]+);'
replacement: '$1'
target_label: container_id
替换掉id符合正则的内容产生另一个名为container_id的label.
此外有一个honor_labels
的参数可以控制替换后的label和现有重名的问题,默认为false,现有的冲突会加上exported_的前缀.设置为true,会忽略该替换的label.
metric_relabel_configs:
- regex: 'kernelVersion'
action: labeldrop
移除掉现有符合正则的label.
Metrics
CPU利用率
使用node_cpu_seconds_total
如图:
计算5min为取样每秒的瞬时利用率
100 - avg (irate(node_cpu_seconds_total{job="node",mode="idle"}[5m])) by (instance) * 100
5m是range vector,表示使用记录的上一个5分钟的数据.
irate是瞬时变化率,适合变化较频繁的metric.
avg是因为有多个metrics(分别是每核的)
CPU饱和度
node_load*
后面的*有1 5 15,表示多少分钟.
该metric和核数有关,查看核数可以使用:
count by (instance)(node_cpu_seconds_total{mode="idle"})
内存使用
node_memory_*
列出空闲内存
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100
内存饱和度
监控paging in和paging out的内存
/proc/vmstat
node_vmstat_pswpin
node_vmstat_pswpout
单位是KB
1024 * sum by (instance) (
(rate(node_vmstat_pgpgin[1m])
+ rate(node_vmstat_pgpgout[1m]))
)
算出每分钟的变化量
rate是平均变化率,相比irate适合变化幅度不剧烈的数据.
磁盘使用率
node_filesystem_*
使用率:
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
可以用=~匹配正则 相对的有!~
predict_linear(node_filesystem_free_bytes{job="node"}[1h], 4*3600) < 0
通过1h的估计量 看看4h后是否会用完
exporter的可用性监控
可以使用up.
up{job="node"}
返回1表示node_exporter存活.
持久化Query
除了直接查询,query还可以在其他场合持久化使用:
- Recording rule - 通过query创建新的metrics
- Alerting rules - 生成报警
- Visualization - 可视化
设置prometheus.yml的rules_files块,增加一个新的rule:
rule_files:
- "rules/node_rules.yml"
对应的该文件内容如下:
groups:
- name: node_rule
rules:
- record: instance:node_cpu:avg_rate5m
expr: 100 - avg (irate(node_cpu_seconds_total{job="node",mode="idle"}[5m])) by (instance) * 100
配置文件修改后可以使用promtool
的对应命令,比如promtool check rules node_rules.yml
进行检查.
可以在Prometheus上通过/rules
查看:
可视化
使用grafana
centos下安装:
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.2-1.x86_64.rpm
sudo yum localinstall grafana-5.2.2-1.x86_64.rpm
配置在/etc/grafana/grafana.ini
.
通过sudo service grafana-server start
启动服务.
默认使用3000端口.
默认用户名和密码在配置文件,为admin:admin.
登陆后增加数据源选择Prometheus即可.
然后可以新增dashboard,配置对应的查询:
文中可能会有不少错误,欢迎提出.
原书的内容更为详尽和丰富,有兴趣的可以阅读原书.
参考资料:
https://prometheus.io/docs/prometheus/latest/getting_started/
https://github.com/prometheus/node_exporter
https://github.com/google/cadvisor
https://legacy.gitbook.com/book/songjiayang/prometheus/details
Prometheus使用入门的更多相关文章
- Prometheus 入门教程(一):Prometheus 快速入门
文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/ZXlBPHGcWeYh2hjBzacc3A Prometheus 是任何一个高级工程师必须要掌握的技 ...
- Prometheus快速入门
Prometheus是一个开源的,基于metrics(度量)的一个开源监控系统,它有一个简单而强大的数据模型和查询语言,让我们分析应用程序.Prometheus诞生于2012年主要是使用go语言编写的 ...
- Prometheus从入门到精通:一、部署
一.Prometheus是什么? prometheus是一个开源指标监控解决方案,指标就是指的CPU的使用率.内存使用率等数据. 二.Prometheus的架构 这里直接粘贴官网的架构图: 三.安装 ...
- 主流前沿的开源监控和报警系统Prometheus+Grafana入门之旅
Prometheus概述 定义 Prometheus 官网地址 https://prometheus.io/ Prometheus 官网文档地址 https://prometheus.io/docs/ ...
- 实战 Prometheus 搭建监控系统
实战 Prometheus 搭建监控系统 Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于 ...
- Hyperledger Explorer
简介 Hyperledger Explorer is a simple, powerful, easy-to-use, well maintained, open source utility to ...
- Prometheus监控学习笔记之Prometheus普罗米修斯监控入门
0x00 概述 视频讲解通过链接网易云课堂·IT技术快速入门学院进入,更多关于Prometheus的文章. Prometheus是最近几年开始流行的一个新兴监控告警工具,特别是kubernetes的流 ...
- Prometheus监控系统之入门篇(一)续
在上篇Prometheus监控系统之入门篇(一)中我们讲解了Prometheus的基本架构和工作流程, 并从0到1搭建了Prometheus服务,pushgateway以及告警系统. 本篇我们主要介绍 ...
- Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警
文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/56S290p4j9KROB5uGRcGkQ Prometheus UI 提供了快速验证 PromQL ...
随机推荐
- 理解go的闭包
package main import ( "fmt" ) func test(a int) { a++ fmt.Println(a) } func test2() func() ...
- C#实现视频监控客户端onvif协议一
前言 最近做的项目是监控方面的,需要对接各种摄像头,之前的方案是把各个厂家的SDK都集成到系统中,然后让用户进行切换,后来知道了Onvif (自行百度具体概念)这个东西.原来早就有人一统江湖了. on ...
- VSTO 基础随笔
1.往组合框添加条目 With Me .ComboBox1.Items .Add( "Ports" ) .Add( "Igor" ) End With 2.文本 ...
- java创建文件写入内容,并实现下载该文件
public void getText(){ response.setHeader("Content-Disposition", "attachment;filename ...
- [R]R语言的module工程化
很遗憾,这还是一个挖坑的问题,解决方案并不是很确定. 需求是,大多数的语言都提供import包或module的功能,避免全部代码写到一个文件中,方便管理与维护. 如常用的database模块,每次写R ...
- vs中 VMDebugger未能加载导致异常
,纠结了许久的一个问题,终于找到了解决 vs中 VMDebugger未能加载导致异常 错误号:80004005 搜了好多,没有一个给出完美的答案. 解决办法:工具->导入和导出设置,重置一下 ...
- redis + cookies 实现持久登入
通过登入把用户信息和token加载到redis中去, 将token和部分用户信息存储在cookie中, 下次登入时 判断cookie的token在redis中是否存在, 存在就把用户信息加载出来自动登 ...
- hanlp大辞典
hanlp加一个很大的词典时候遇到的问题: ,然后改为5g,5g,问题得到解决. 但是运行后还有一个问题是: 重新改为10g,10g,问题得到解决. 也就是给java虚拟机分配的内存大点.
- VS中自定义类模版
以下为vs2017 专业版,安装目录在D盘 安装路径: D:\Program Files (x86)\Microsoft Visual Studio\\Professional\Common7\IDE ...
- 关于vue的数据增删的一些细节
第一种情况:在vue中使用的数据必须先在data中定义数据,不然报错: 第二种情况:访问对象中不存在的值,是可以得到undefined,但是不会报错 第三种:vue只会监听data已经定义的值,后续添 ...