Prometheus 学习笔记
Prometheus 是由 SoundCloud 开源监控告警解决方案,主要模块包含 Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。
Prometheus 核心组件有 Prometheus Server(抓取数据和存储时序数据,提供查询和 Alert Rule 配置管理),client libraries(对接 Prometheus Server, 查询和上报数据),push gateway (批量,短期的监控数据的汇总节点,业务数据汇报等), exporters (汇报机器数据的 node_exporter)以及 alertmanager (警通知管理)。
安装
二进制安装
- 下载最新源码
# wget https://github.com/prometheus/prometheus/releases/download/v2.13.0/prometheus-2.13.0.darwin-amd64.tar.gz
- 解压压缩包
# tar xvfz prometheus-*.tar.gz # cd prometheus-*
- 主服务器端运行程序
# ./prometheus --config.file=prometheus.yml
- 从服务器端下载最新 Node_Exporter 并运行(该步骤需要先前配置好 prometheus.yml)
# wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.darwin-amd64.tar.gz # tar xvfz node_exporter-*.*-amd64.tar.gz # cd node_exporter-*.*-amd64 # ./node_exporter
Docker 安装
- 主服务器端执行 Docker 命令
- 通过挂载映射配置文件运行
# docker run -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
- 通过运行参数读取配置文件运行
# docker run -p 9090:9090 -v /prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml
- 从服务器端执行 Docker 命令
docker run -d -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ --net="host" \ prom/node-exporter
配置
全局配置
- scrape_interval: 拉取 targets 的默认时间间隔。
- scrape_timeout: 拉取一个 target 的超时时间。
- evaluation_interval: 执行 rules 的时间间隔。
- external_labels: 额外的属性,会添加到拉取的数据并存到数据库中。
告警配置
- alert_relabel_configs: 动态修改 alert 属性的规则配置。
- alertmanagers: 用于动态发现 Alertmanager 的配置。
规则配置
- 主要用于配置规则文件,它支持多个文件以及文件目录。
数据拉取配置
- job_name:任务名称
- honor_labels: 用于解决拉取数据标签有冲突,当设置为 true, 以拉取数据为准,否则以服务配置为准
- params:数据拉取访问时带的请求参数
- scrape_interval: 拉取时间间隔
- scrape_timeout: 拉取超时时间
- metrics_path: 拉取节点的 metric 路径
- scheme: 拉取数据访问协议
- sample_limit: 存储的数据标签个数限制,如果超过限制,该数据将被忽略,不入存储;默认值为0,表示没有限制
- relabel_configs: 拉取数据重置标签配置
- metric_relabel_configs:metric 重置标签配置
远程可写存储
- url: 访问地址
- remote_timeout: 请求超时时间
- write_relabel_configs: 标签重置配置, 拉取到的数据,经过重置处理后,发送给远程存储
远程可读存储
- url: 访问地址
- remote_timeout: 请求超时时间
服务发现
- static_configs: 静态服务发现
- dns_sd_configs: DNS 服务发现
- file_sd_configs: 文件服务发现
- consul_sd_configs: Consul 服务发现
- serverset_sd_configs: Serverset 服务发现
- nerve_sd_configs: Nerve 服务发现
- marathon_sd_configs: Marathon 服务发现
- kubernetes_sd_configs: Kubernetes 服务发现
- gce_sd_configs: GCE 服务发现
- ec2_sd_configs: EC2 服务发现
- openstack_sd_configs: OpenStack 服务发现
- azure_sd_configs: Azure 服务发现
- triton_sd_configs: Triton 服务发现
配置实例
- 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: - altermanager:9093 #设置altermanager的地址,后文会写到安装altermanager 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' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] #这个自带的默认监控prometheus所在机器的prometheus状态 - job_name: "uat-apps-status" # 自己定义的监控的job_name static_configs: - targets: ['192.168.98.73:9091'] # 指向pushgateway. 我在每台机器上使用的是推的方式到pushgateway,所以采取了此种方式。 labels: instance: uat #新添加的标签,可以自定义 scrape_interval: 60s
- alert_rules.yml
groups: - name: example #报警规则的名字 rules: # Alert for any instance that is unreachable for >5 minutes. - alert: InstanceDown #检测job的状态,持续1分钟metrices不能访问会发给altermanager进行报警 expr: up == 0 for: 1m #持续时间 labels: serverity: page annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes." - alert: "it's has problem" #报警的名字 expr: "test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} - test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} offset 1w > 5" # 这个意思是监控该表达式查询出来的值与一周前的值进行比较,大于5且持续10m钟就发送给altermanager进行报警 for: 1m #持续时间 labels: serverity: warning annotations: summary: "{{ $labels.type }}趋势增高" description: "机器:{{ $labels.host }} tomcat_id:{{ $labels.id }} 类型:{{ $labels.type }} 与一周前的差值大于5,当前的差值为:{{ $value }}" #自定义的报警内容
数据可视化
自带 WebUI
Prometheus 自带了 Web Console, 安装成功后可以访问 http://localhost:9090/graph 页面,用它可以进行任何 PromQL 查询和调试工作。Prometheus 自带的 Web 界面比较简单,因为它的目的是为了及时查询数据,方便 PromeQL 调试。
因此在这方面,更推荐使用 Grafana。
Grafana
- 下载安装最新安装包并启动。
- 打开http://[IP_Address]:3000 配置Grafana(默认用户密码为admin/admin,第一次登陆会提示你改密码)
- 选择Prometheus为数据源,并进行配置。
- 从这里选择一个合适的模板,然后在 Grafana 中导入和即可展示数据。
- 注:也可以使用 Docker 安装 Grafana
# chmod 777 /opt/grafana-storage # docker run -d \ -p 3000:3000 \ --name=grafana \ -v /opt/grafana-storage:/var/lib/grafana \ grafana/grafana
PromQL
查询条件
Prometheus 存储的是时序数据,而它的时序是由名字和一组标签构成的,其实名字也可以写出标签的形式,例如 http_requests_total 等价于 {name=”http_requests_total”}。
一个简单的查询相当于是对各种标签的筛选,例如:
一个简单的查询相当于是对各种标签的筛选,例如:
$ http_requests_total{code="200"} // 表示查询名字为 http_requests_total,code 为 "200" 的数据
查询条件支持正则匹配,例如:
http_requests_total{code!="200"} // 表示查询 code 不为 "200" 的数据
http_requests_total{code=~"2.."} // 表示查询 code 为 "2xx" 的数据
http_requests_total{code!~"2.."} // 表示查询 code 不为 "2xx" 的数据
查询结果类型
PromQL 查询结果主要有 3 种类型:
- 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total
- 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]
- 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)
评论
发表评论