grafana + prometheus + cadvisor 监控 docker

前不久考虑找个靠谱的 openjdk,具体可以看这遍:https://www.kpromise.top/openjdk-what-flavour-to-choose/,当时提到了所谓的性能,为什么用所谓这个词呢,因为我真不觉得各个发行版的 openjdk 在性能上能有什么大的差别。但是,好奇嘛,最主要的是国庆 西湖人山人海,西溪湿地 估计也不例外,就连 拱墅区的 运河广场 都不少人,与其跑出去看人,还不如在家陪孩子,孩子睡着了,我也玩玩自己的,所以有了本文。

如欲评测各个发行版 openjdk 的性能,那么首先应该考虑如何 监控docker 的各项指数,比如内存,cpu等,毕竟如果裸机玩,系统被侵入的过多,事后可能不好清理,我习惯了 docker,事后直接 rm -f 即可,扯远了,我们继续今天的主题 监控 docker 的 内存、cpu 占用。

最简单的办法我想你已经想到 docker stats ,但是他不会保存数据,也没有趋势图,所以还是用 grafana 吧,接下来需要的就是 选个数据来源,比如:Prometheus、Graphite、OpenTSDB、InfluxDB 、Elasticsearch、mysql 等,但是这个数据来源必须提供 docker 的运行信息,而能监控 docker 的第三方开源项目 可能只有 cadvisor 可以选择了,最终数据库我选择了 Prometheus,对于它,我并不熟悉,选择它纯属巧合,下面我们开始部署。

这个监控系统的架构应该是 这样的,cadvisor 获取 docker 的运行情况(cpu、内存、磁盘),然后 Prometheus 将这些数据持久化,最后,grafana 从 Prometheus 获取数据并展示。换句话说,grafana 必须要能访问到 cadvisor,grafana 必须要能访问到 Prometheus,如果将来监控别的信息,比如 mysql、redis 等,那么 Prometheus 还需要能访问这些容器,于是,我想,还不如建个 网络,将他们放在一起,并把 ip 固定死,至于如何 固定死 docker container 的 ip 可以看这篇:https://www.kpromise.top/docker-static-ip-address/  然后我们就可以监控 docker 容器了,下面是具体的步骤。

1、创建一个网络,指定 ip 范围和名称

docker network create --subnet=172.27.0.0/16 grafanaNetWork

2、启动 cadvisor 容器

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

3、创建 volume 名字为 prometheus

docker volume create prometheus

4、启动 prometheus

docker run -p 6200:9090 --name prometheus \
  -v prometheus:/etc/prometheus \
  --network grafanaNetWork --ip 172.27.2.10 \
  -itd prom/prometheus --config.file=/etc/prometheus/prometheus.yml

5、启动 grafana

docker run -d --name=grafana -p 6300:3000 --network grafanaNetWork --ip 172.27.3.10 -itd grafana/grafana

现在,基本搞定,没错,就这么简单,你现在可以 分别打开:http://localhost:6100、http://localhost:6200 以及 http://localhost:6300 验证下 是否OK,如果不行,欢迎留言。另外,6300 端口映射的是 grafana 他需要登录,默认的用户名密码都是 admin,登录后会要求先修改密码,之后进入主页,选择 添加数据,接着选择 Prometheus ,新页面 url 填写 http://172.27.2.10:9090 然后点击 save and test,接着,我们导入一个 dashboard,点击左侧 + 号,选择 import,新页面(http://localhost:6300/dashboard/import) 里 填入 179(对应的页面是 https://grafana.com/grafana/dashboards/179),然后在 最下面 Prometheus 里选择 Prometheus 数据库即可。

现在,grafana 和 Prometheus 是建立了联系,但是 Prometheus 和 cadvisor 还没有呢,所以在 dashboard 上你啥也看不到的。现在,我们让 Prometheus 存储 cadvisor 里的数据。

1、先查看 prometheus volume 的具体位置

docker volume inspect prometheus

我看到的是:

[
    {
        "CreatedAt": "2019-10-03T16:02:55+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/home/android/docker/volumes/prometheus/_data",
        "Name": "prometheus",
        "Options": {},
        "Scope": "local"
    }
]

现在,我们打开 Mountpoint 指向的文件夹,我这里是 /home/android/docker/volumes/prometheus/_data,你可能是 /var/lib/docker/volumes/prometheus/_data ,该文件夹需要 root 权限哦,在里面找到 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:
      # - 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.
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']

2、现在你可以在浏览器打开: http://localhost:6200/targets ,你会看到类似 Endpoint http://localhost:9090/metrics state UP 的信息,我们现在在这个配置文件的末尾加入如下几行,注意缩进哦:

- job_name: cadvisor
  scrape_interval: 5s
  static_configs:
    - targets: ['172.27.1.10:8080']

这里,172.27.1.10 是 cadvisor 的 ip,8080 是 它的内部端口。然后重启 prometheus:docker restart prometheus ,之后再刷新 http://localhost:6200/targets 页面,会发现 Endpoint 里多了一个 cadvisor ,现在,我们打开 http://localhost:6300 ,dashboard 列表里点击 docker-and-host-monitoring-w-prometheus ,然后你会发现,有数据了,有图表了,至于 各个 版本 openjdk 的性能比较,请关注本博吧。我将尽早更新,不过,先放张图,剧透下:

openjdk 各个发行版 性能比较

openjdk 各个发行版 性能比较

本博客若无特殊说明则由 full-stack-trip 原创发布
转载请点名出处:编程生涯 > grafana + prometheus + cadvisor 监控 docker
本文地址:https://www.kpromise.top/grafana-prometheus-cadvisor-docker/

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注