【prometheus】学习第一篇——prometheus

℡╲_俬逩灬. 提交于 2021-01-13 23:57:14

前言:

  说到监控方案,市面上开源的有很多,最常用的zabbix,深入使用zabbix以后,才知道zabbix设计团队有多厉害,简直是一个完美的监控告警方案。但是在针对docker的监控上还差点,需要自己写监控脚本实现。为此从去年开始调研针对docker的监控方案,如下:

  1,cadvisor+influxdb+grafana

    优点:部署方便,cadvisor监控docker主机和docker信息,influxdb记录数据,grafana展示

    缺点:1,无法获取cpu使用率,cadvisor采集到的是cpu使用时间,得到cpu使用率需要计算,grafana没有办法做复杂的运算。

      2,告警体系几乎没有,grafana有基本的告警功能,仅限于图表类型数据可以告警,并且没有告警收敛、告警分析的功能,存在告警风暴的风险。

      3,influxdb开源版本不支持集群,商业版才支持集群。这个对后续扩展是个问题。

  2,Weave Scope

    优点:简直完美的监控,界面漂亮,操作方便,自带终端堡垒机功能。

    缺点:1,他的优点也是他的缺点,权限这么大的终端(root用户),居然没有认证体系,任何人拿到ip就能对服务器做任何操作了

      2,总体感觉这个方案是给人看的,不太适合做监控系统,界面花哨,但是实际使用并不方便。

  3,influxdb+telegraf+kapacitor+chronograf

    优点:influxdb提供的全套方案,看着很完美

    缺点:我尝试了十几次,没有一次能够把全流程跑通,主要是卡在kapacitor上,这个是实时处理模块,可惜一直无法告警,不知道是不是产品的bug。

  4,自己开发的docker监控方案

    https://github.com/zhenglisai/docker-monitor

    优点:完全自己控制,什么都能够拿到,想拿什么数据拿什么数据

    缺点:agent的cpu占用率巨高。。。实际跑起来,单单监控程序就占用了45%的cpu,这个肯定不能接受,个人水平有限,python程序优化以后,也是这样,不清楚是python本身效率低的问题,还是我采集数据的方式不合理,暂时放弃了。

  5,最后prometheus方案

    优点:全套的监控,丰富的插件

    缺点:没有认证!!!prometheus官方文档也是写的,他们专注于监控,不提供用户认证体系。需要的话,需要自己在最外层包一层nginx实现反向代理认证。

背景说明

  docker监控方案来来回回折腾了半年,各个方案都试过了,没有一个特别完美的,prometheuse+grafana这个方案,也是用了放弃,放弃以后没有更好的,又拿回来用,来来回回了四五次。后来在开发trigger-action系统的时候,再一次深入调研了prometheus,才发现,原来prometheus这么强大,不愧是谷歌推荐的监控方案(在《SRE google运维解密》这本书中,多次提到prometheus,说是谷歌监控体系的开源版)。

  举一个例子来说明一下:

  比如统计和监控一个api接口的平均响应时长有没有意义?我们之前的监控系统就是监控这个指标,来判断api是不是健康。后来发现这个指标基本没什么用,有用的是响应时长分布,比如90%的请求响应时长小于30ms,1%的请求响应时长大于1s,那么这个api可以认证基本正常。但是从平均响应时长来看,可能平均100ms,这个平均值不能真实反映api的请求情况。这一点,prometheus可以做到。

正式开始:

【安装篇】

什么都不如官方文档详细,如果你的英语够好,建议直接去看官方文档就行了:https://prometheus.io/docs/introduction/overview/

1,prometheus是go语言写的,多个平台有很好的移植性,并且基本不依赖其他环境,官网下载下来直接运行就行了,不详细说了

  https://prometheus.io/download/

【配置篇】

重点说明配置,Prometheus与zabbix最大的不同,是什么都需要通过配置文件来实现,上手难度比zabbix大。

主配置文件:prometheus.yml

让我们看看这个文件有什么:

# 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: ['127.0.0.1:9093']

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

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
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: ['0.0.0.0:9090']
  - job_name: 'node'
    file_sd_configs:
      - files: ['/root/prometheus/prometheus/discovery.json']

咱们这一篇主要讲一下scrape_configs这一部分,这一部分实现添加监控主机功能。

prometheus采用pull的模式,server端从agent拉取指标,所以agent什么都不需要配置,等待server来拉取数据就行了。

Prometheus添加监控主机有两大类方式:1,写死在配置文件里,每次添加主机,都编写Prometheus.yml文件,然后kill -1 prometheus的pid重新加载配置文件,这种方案用起来很不方便,尤其是主机多了以后。2,自动发现,支持多种发现规则。这里我们采用基于file的自动发现。

static_configs:这一部分就是写死在配置文件里的主机,每次添加主机都可以添加在这里,job_name的意思其实是一个可以筛选的标签,可以认为是分组。

file_sd_configs是基于文件的自动发现,Prometheus会从/root/prometheus/prometheus/discovery.json这个文件中读取主机信息,官方文档说只要更新这个文件就行了,Prometheus会监控这个文件的变化来自动更新,但是在实际使用中,感觉不太好用,还是手动给server进程发送Kill -1信号吧。

scrape_configs:
- job_name: 'prometheus'

static_configs:
- targets: ['0.0.0.0:9090']
- job_name: 'node'
file_sd_configs:
- files: ['/root/prometheus/prometheus/discovery.json']

 

/root/prometheus/prometheus/discovery.json文件内容如下:

[
  {
    "targets": ["192.168.1.118:9100"],
    "labels": {"server_name":"promethues-agent","region":"cn-north-1"}
  },
  {
    "targets": ["192.168.1.118:8080"],
    "labels": {"server_name":"docker-agent","region":"cn-north-1"}
  }
]

可以自己写一个api程序,比如写一个python的api,调用这个api,程序会自动更新这个文件,并重启Prometheus进程,来实现更新监控主机。

在监控主机上运行node_exporter这个程序,也是不需要任何配置,直接运行就行了。

这样访问prometheus服务器的9090端口,就可以看到监控的服务器和监控指标了。

prometheus的查询语法见官方文档吧,写的比较全。

这一篇就到这里,下一篇讲一下告警的配置。

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