Prometheus 详解


原文链接: Prometheus 详解

git@github.com:roman-vynar/pmm.docker.git
prometheus中文文档
Metrics类型 - prometheus-book
PromQL操作符

采用prometheus取代传统的zabbix监控方案,虽不完善,但麻雀虽小,五脏俱全,胜在简单

此套架构中所涉及的服务如下:

prometheus:监控工具,本质是一个时序数据库,以http方式输出数据指标
cadvisor:google出品,监控容器内部指标的工具
node-exporter:获取主机自身指标,如cpu,men,disk,net,filesystem等,有替代方案,镜像需重构
mysqld-exporter:探测mysql数据库内部指标的工具,数据库授权用户方法,docker hub搜寻相应镜像即可
blackbox-exporter:探测网络协议,如http,icmp,dns等,本文实现简单的web检测,复杂的可以自行研究
grafana:监控方案,前端ui工具使界面更加直接美观
alert-manager:实现监控方案报警的工具,可以集成email,webhooks,钉钉等工具
其他内的监控插件,如监控redis,rabbitmq,mongodb,haproxy等,可以自行到dockerhub上获取
注:所需镜像采用企业内部私服镜像,可以到docker hub上找到所需镜像,docker search 关键字
config/prometheus/rules目录下为prometheus报警规则文件

prometheus缺点

  1. 单机缺点,单机下存储量有限,根据你的监控量局限你的存储时间。
  2. 内存占用率大,prometheus集成了leveldb,一个能高效插入数据的数据库,在ssd盘下io占用比较高。同时可能会有大量数据堆积内

docker运行prometheus

uid=65534(nobody) gid=65534(nogroup)
chown -R 65534:65534 /docker/prometheus/data

docker run --restart=always -d --name prometheus -p 9090:9090  -v /etc/localtime:/etc/localtime -v /docker/prometheus/etc/:/etc/prometheus/ -v /docker/prometheus/data/:/prometheus/  prom/prometheus
  1. 访问web界面 http://192.168.99.100:9090/graph
    计算实例,指标可以从 http://192.168.99.100:9090/metrics 中找
    prometheus_target_interval_length_seconds{quantile="0.99"}
    或者
    count(prometheus_target_interval_length_seconds)


怎么使用prometheus监控容器

prometheus监控不同的目标服务需要实现不同的exporter插件,早期的时候,官方出了container-exporter项目,但是现在项目已经停止。推荐使用谷歌的cAdvisor项目作为prometheus的exporter。cAdvisor作为一个监控单机容器的项目,数据较为全面,但是也有很大的问题,例如io等数据没有等等。结合prometheus后就能在整个集群监控查询容器。举个例子,你有一个项目有3个容器分布在三台机器,你怎么监控整个项目的流量,内存量,负载量的实时数据。这就是prometheus的多维度查询解决的问题,数据从3台机器的cadvisor得到每个容器的数据,它的多维度查询语法就能让你得到你想要的数据。

这里假设你有10台机器部署了容器需要监控,你在10台机器上分别部署cAdvisor容器

sudo docker run

--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

找一台机器部署prometheus服务,这里依然使用容器部署:

docker run --name prometheus -p 9090:9090 --log-driver none -v /docker/prometheus/etc/:/etc/prometheus/ -v /docker/prometheus/data/:/prometheus/ -v /etc/localtime:/etc/localtime prom/prometheus

创建/hdd1/prometheus/etc/prometheus.yml配置文件

my global config

  global:
    scrape_interval:     15s # By default, scrape targets every 15 seconds.
    evaluation_interval: 15s # By default, scrape targets every 15 seconds.
    # scrape_timeout is set to the global default (10s).
    # Attach these labels to any time series or alerts when communicating with
    # external systems (federation, remote storage, Alertmanager).
    external_labels:
        monitor: 'container-monitor'
  # Load and evaluate rules in this file every 'evaluation_interval' seconds.
  rule_files:
     - "/etc/prometheus/rules/common.rules"
  # 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: 'container'
      static_configs:
      - targets: ['10.12.1.129:9090','10.12.1.130:9090','10.50.1.92:9090','10.50.1.93:9090','10.50.1.119:9090']

配置文件中 -targets中的端点填写你的实际cadvisor所在的ip和暴露的端口.正确启动后访问ip:9090就能查询数据了哦

##
global:
scrape_interval: 60s
evaluation_interval: 60s

scrape_configs:

  • job_name: prometheus
    static_configs:

    • targets: ['localhost:9090']
      labels:
      instance: prometheus

  • job_name: linux
    static_configs:

    • targets: ['47.93.26.124:9100']
      labels:
      instance: db1

  • job_name: mysql
    static_configs:

    • targets: ['47.93.26.124:9104']
      labels:
      instance: db1
`