• 【prometheus】学习第一篇——prometheus


    前言:

      说到监控方案,市面上开源的有很多,最常用的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的查询语法见官方文档吧,写的比较全。

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

  • 相关阅读:
    java中Switch的实现原理浅谈
    漫谈计算机编码:从ASCII码到UTF8
    从斐波那契数列看java方法的调用过程
    Java中的位运算及简单的算法应用介绍
    在powserdesigner中,如何将Name(中文注释)导入到sqlserver的字段说明中?
    关于ArcMap的符号库和字体
    ORACLE CHAR,VARCHAR,VARCHAR2,NVARCHAR类型的区别与使用
    在window 2008 上安装arcgisserver93,报arcgissom 密码不符合安全策略
    Power Designer反向数据库时遇到sqlstate=37000错误,解决方案!
    解决PowerDesigner 反向工程没有注释且如何将注释转换成PDM的name
  • 原文地址:https://www.cnblogs.com/zhenglisai/p/9178375.html
Copyright © 2020-2023  润新知