Prometheus(普罗米修斯)

孤者浪人 提交于 2020-10-29 04:56:38

新型完整的监控告警工具

主要特点:

  1. 多维数据模型,时间序列数据由度量名称和键/值对标识

  2. 一种灵活的查询语言来利用这种维度

  3. 不依赖分布式存储;单个服务器节点是自治的

  4. 时间序列收集通过HTTP上的拉模型进行

  5. 通过中间网关支持时间序列的推送

  6. 通过服务发现或静态配置发现目标

  7. 多种模式的绘图和仪表板的支持


机器IP:118.190.107.96 (阿里云)

1、安装

# 下载地址
https://prometheus.io/download/#prometheus

# centos下载linux压缩包即可。
# 上传到服务器 解压
tar xf prometheus-2.17.1.linux-amd64.tar.gz

# mv文件夹名称
cd prometheus-2.17.1.linux-amd64
mv prometheus-2.17.1.linux-amd64 prometheus

# 更改配置ip
vim prometheus.yml

# 将 localhost 改成自己的ip地址 如下图
  static_configs:
   - targets: ['118.190.217.164:9090']


2、启动

./prometheus


3、web ui

登录访问:

118.190.217.164:9090

Prometheus自带有简单的UI

prometheus.yml的配置

Targets展示监控具体的监控目标

4、绘图

访问http://118.190.217.164:9090/metrics查看从exporter具体能抓到的数据,如下图所示


5、安装Grafana

普罗米修斯默认的页面可能没有那么直观,我们可以安装grafana使监控看起来更直观


wget https://dl.grafana.com/oss/release/grafana-6.1.3-1.x86_64.rpm
# 由于网速比较慢小编从csdn下载的版本

# 实用 yum安装
yum -y localinstall grafana-6.3.3-1.x86_64.rpm


Grafana的配置文件:

  • 配置文件位于/etc/grafana/grafana.ini

  • 这里暂时保持默认配置即可


设置开机启动

  • systemctl enable grafana-server

  • systemctl start grafana-server

添加数据

访问:http://118.190.217.164:3000/login,默认账号/密码:admin/admin

默认登录后,要求改密码,可以选择先跳过

添加数据源

  • 1、 点击 “Add data source”

  • 2、选择Prometheus

  • 3、设置Prometheus地址

  • 4、查看监控页面

拓展网站

  • grafana dashboard:https://grafana.com/dashboards

  • grafana plugins:https://grafana.com/plugins


系统组件

  • Prometheus

  • Alertmanager

  • *_exproter(多个)

Prometheus

prometheus是最主要的组件,负责采集数据,发出告警。

命名规则

prometheus data model


数据模型命名介绍:https://prometheus.io/docs/concepts/data_model/


metric类型

类型:

  • Counter  ----- 累计数值,只能增加或者在重启时被归零。


  • Gauge ----- 瞬时值。


  • Histogram ---(直方图)对采集的指标进行分组计数,会生成多个指标,分别带有后缀_bucket(仅histogram)、_sum_count,其中_bucket是区间内计数。


  • Summary  ----也会产生多个指标,分别带有后缀_bucket(仅histogram)、_sum_count,可以直接查询分位数:


注意:调用prometheus的sdk创建metrics的时候,必须要明确是哪一种类型的metrics


说明:Histogram和Summary都可以获取分位数。分位数本身是用来切分数据的,它们的平均数没有同样的分位效果。


Job和Instance

被监控的具体目标是instance,监控这些instances的任务叫做job


每个job负责一类任务,可以为一个job配置多个instance,job对自己的instance执行相同的动作。


隶属于job的instance可以直接在配置文件中写死。也可以让job自动从consul、kuberntes中动态获取,这个过程就是下文说的服务发现。


配置文件


# my global config

# 全局配置
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.
 # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
  - targets:
     # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
 # - "first_rules.yml"
 # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.

# 指定要监控的目标 ,每一个监控目标是一个job
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: ['118.190.217.164:9090']

relabel_config

---扩展采集能力
__address__         : 检测目标的地址
__scheme__          : http、https等
__metrics_path__    : 获取指标的路径

-----------------------------------

- job_name: "user_server_icmp_detect"
consul_sd_configs:
- server: "118.190.217.164:8500"
scheme: http
metrics_path: /probe
params:
  module: [icmp]
relabel_configs:
- action: keep
  source_labels: [__meta_consul_tags]        #如果__meta_consul_tags匹配正则,则保留该目标
  regex: '.*,icmp,.*'
- source_labels: [__meta_consul_service]
  regex: '(.+)@(.+)@(.+)'
  replacement: ${2}
  target_label: type
- source_labels: [__meta_consul_service]
  regex: '(.+)@(.+)@(.+)'
  replacement: ${1}
  target_label: user
- source_labels: [__address__]
  regex: (.+):(.+)
  replacement: ${1}
  target_label: __param_target
- target_label: __address__
  replacement:  10.10.199.154:9115
- source_labels: [__param_target]
  target_label: instance


查询语句

查询语句直接就是指标的名称:

go_memstats_other_sys_bytes

但是可以通过标签筛选:

go_memstats_other_sys_bytes{instance="118.190.217.164"}

标签属性可以使用4个操作符:

=: Select labels that are exactly equal to the provided string.
!=: Select labels that are not equal to the provided string.
=~: Select labels that regex-match the provided string (or substring).
!~: Select labels that do not regex-match the provided string (or substring).

并且可以使用多个标签属性,用“,”间隔,彼此直接是与的关系,下面是prometheus文档中的一个例子:

http_requests_total{environment=~"staging|testing|development",method!="GET"}

甚至只有标签:

{instance="118.190.217.164"}

对查询出来的结果进行运算也是可以的:

# 时间范围截取,Range Vector Selectors
http_requests_total{job="prometheus"}[5m]

# 时间偏移
http_requests_total offset 5m

# 时间段内数值累加
sum(http_requests_total{method="GET"} offset 5m)

还可以进行多元运算:Operators,以及使用函数:Functions

告警规则配置

alert rules在单独的文件中定义,然后在prometheus.yml中引用:

rule_files:
 - "first_rules.yml"
 # - "second_rules.yml"

rules文件格式如下:

$ cat first_rules.yml
groups:
- name: rule1-http_requst_total
 rules:
 - alert:  HTTP_REQUEST_TOTAL
   expr: http_requests_total > 100
   for: 1m
   labels:
     severity: page
   annotations:
     summary: Http request total reach limit

需要注意,还要在prometheus.yml中配置alertmanager的地址:

# Alertmanager configuration
alerting:
 alertmanagers:
 - static_configs:
   - targets:
     - 118.190.217.164:9093

重新加载配置文件后,可以在prometheus的rule页面看到告警规则,在alert页面看到触发的告警,

现在alertmanager还没有部署,在下一节部署了alertmanager之后,告警可以在alertmanager中看到。


Alertmanager

用来接收prometheus发出的告警,然后按照配置文件的要求,将告警用对应的方式发送出去。

部署启动

wget https://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz

tar -xvf alertmanager-0.15.2.linux-amd64.tar.gz


解压得到:
alertmanager alertmanager.yml amtool LICENSE NOTICE


启动:
./alertmanager

打开服务:
http://IP地址:9093/#/alerts

配置文件

global:
resolve_timeout: 5m

route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://118.190.217.164:5001/'
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']


告警方式

email_config
hipchat_config
pagerduty_config
pushover_config
slack_config
opsgenie_config
victorops_config
webhook_config   ---- 将邮件发送到这个url
wechat_config

邮件通知

这里给出一个用邮件通知告警的例子,发件邮箱用的是网易邮箱:

global:
 resolve_timeout: 5m
route:
 group_by: ['alertname']
 group_wait: 10s
 group_interval: 10s
 repeat_interval: 1h
 receiver: 'mail'
receivers:
- name: 'web.hook'
 webhook_configs:
 - url: 'http://118.190.217.164:5001/'
- name: 'mail'
 email_configs:
 - to: 接收告警用的邮箱
   from: 你的发件用的网易邮箱
   smarthost:  smtp.163.com:25
   auth_username: 网易邮箱账号
   auth_password: 网易邮箱密码
   # auth_secret:
   # auth_identity:
inhibit_rules:
 - source_match:
     severity: 'critical'
   target_match:
     severity: 'warning'
   equal: ['alertname', 'dev', 'instance']

注意这里有web.hookmail两个reciver,使用哪个receive是在上面的router中配置的:

route:
 group_by: ['alertname']
 group_wait: 10s
 group_interval: 10s
 repeat_interval: 1h
 receiver: 'mail'

重新加载配置后,就可以收到告警邮件了。

集群模式

什么是集群模式?

即多个alaertmanager一起运行,彼此之间通过gossip协议获知告警的处理状态,防止告警重复发出。


如何配置:

  • 使用gossip协议

  • 启动时指定一个或者多个 alertmanager的地址


--cluster.peer=118.190.217.164:9094


*__exporter

exporter 是一组程序,作用:

  • 采集物理机

  • 中间件的信息

  • rometheus官方 支持

  • 也有第三方支持的

系统指标

Databases
   Aerospike exporter
   ClickHouse exporter
   Consul exporter (official)
   CouchDB exporter
   ElasticSearch exporter
   EventStore exporter
...
Hardware related
   apcupsd exporter
   Collins exporter
   IoT Edison exporter
...
Messaging systems
   Beanstalkd exporter
   Gearman exporter
   Kafka exporter
...
Storage

   Ceph exporter
   Ceph RADOSGW exporter
...
HTTP

   Apache exporter
   HAProxy exporter (official)
...
APIs
   AWS ECS exporter
   AWS Health exporter
   AWS SQS exporter
Logging

   Fluentd exporter
   Google's mtail log data extractor
...
Other monitoring systems
   Akamai Cloudmonitor exporter
   AWS CloudWatch exporter (official)
   Cloud Foundry Firehose exporter
   Collectd exporter (official)
...
Miscellaneous

   ACT Fibernet Exporter
   Bamboo exporter
   BIG-IP exporter
...

blackbox_exporter

主要作用于探测url、domain等联通、响应情况的exporter。

部署启动

#下载压缩包
https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbox_exporter-0.12.0.linux-amd64.tar.gz

# 解压
tar xf blackbox_exporter-0.12.0.linux-amd64.tar.gz

# 直接运行,默认监听地址是:9115

配置文件


modules:
http_2xx:
  prober: http
  http:
http_post_2xx:
  prober: http
  http:
    method: POST
tcp_connect:
  prober: tcp
pop3s_banner:
  prober: tcp
  tcp:
    query_response:
    - expect: "^+OK"
    tls: true
    tls_config:
      insecure_skip_verify: false
ssh_banner:
  prober: tcp
  tcp:
    query_response:
    - expect: "^SSH-2.0-"
irc_banner:
  prober: tcp
  tcp:
    query_response:
    - send: "NICK prober"
    - send: "USER prober prober prober :prober"
    - expect: "PING :([^ ]+)"
      send: "PONG ${1}"
    - expect: "^:[^ ]+ 001"
icmp:
  prober: icmp

案例获取百度指标

例如要获取域名www.baidu.com的指标,要用http_2xx模块,传入参数www.baidu.com

小编尝试 失败应该是 阿里云端口限制的问题。

http://118.190.217.164:9115/probe?module=http_2xx&target=http%3A%2F%2Fwww.baidu.com%2F

其他配置

运算[Operators:https://prometheus.io/docs/prometheus/latest/querying/operators/

# 容器CPU负载告警
# container_cpu_load_average_10s, container_spec_cpu_quota, container_spec_cpu_shares, container_spec_cpu_quota
# 容器CPU limit: container_spec_cpu_quota / container_spec_cpu_period
# 计算空间的CPU使用率:sum(rate(container_cpu_usage_seconds_total{namespace=~".+"}[1m])) by (namespace) * 100
# 计算容器CPU使用率:sum(rate(container_cpu_usage_seconds_total{name=~".+"}[1m])) by (name) * 100
# rate(container_cpu_usage_seconds_total{name=~".+"}[1m])

计算容器的内存使用率:

container_memory_usage_bytes{container_name!="", pod_name!=""} / container_spec_memory_limit_bytes{container_name!="", pod_name!=""}

container_memory_usage_bytes{instance="prod-k8s-node-155-171",container_name!="", pod_name!=""} / container_spec_memory_limit_bytes{instance="prod-k8s-node-155-171",container_name!="", pod_name!=""}

container_memory_usage_bytes{container_name!="", pod_name!=""} / container_spec_memory_limit_bytes{container_name!="", pod_name!=""} > 0.98

container_memory_rss{container_name!="", pod_name!=""}/container_spec_memory_limit_bytes{container_name!="", pod_name!=""} >0.98

期待您的进步


在看和转发

都是一种支持

本文分享自微信公众号 - DataScience(DataScienceTeam)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!