使用 Prometheus 监控 Docker 容器

本文的原做者是 johannes-fish-ziemke,原文地址是 http://5pi.de/2015/01/26/monitor-docker-containers-with-prometheus/node

该文中介绍的 Prometheus 的项目地址是 https://prometheus.github.io/git

监控 Docker

在容器中运行你全部的服务使得获取深度资源和运行特性成为可能,由于每一个容器运行在它们本身的 cgroup 中而且 Linux 内核给咱们提供了各类各样的指标(metrics)。github

尽管有一些其余的 Docker 监控工具,我将给大家展现我为何认为 SoundCloud 最新发布的 Prometheus 是最适合监控基于容器的基础架构。web

Prometheus 特色是高维度数据模型,时间序列是经过一个度量值名字和一套键值对识别。灵活的查询语言容许查询和绘制数据。它采用了先进的度量标准类型像汇总(summaries),从指定时间跨度的总数构建比率或者是在任何异常的时候报警而且没有任何依赖,中断期间使它成为一个可靠的系统进行调试。正则表达式

我会集中讲为何该数据模型和查询语言如此贴合容器式和动态基础设施,对于这些基础设施,你应该想着整个服务集群而不是单个服务器实例,把服务器想成牛群中的牛而不是各家自营养散开的宠物。docker

传统方法

好比说你想监控你容器的内存使用率。不支持维度数据,这样一个名为 webapp123 的容器的指标,可能被称为 container_memory_usage_bytes_webapp123服务器

可是若是你想展现全部你的 webapp123 容器的内存利用率?更先进的监控解决方案像 graphite 支持这样。它的特性是层次,树状数据模型,这样的指标可能被称为 container.memory_usage_bytes.webapp123。如今你能够使用正则表达式像 container.memory_usage_bytes.webapp* 来绘制全部你的 ‘webapp’ 容器的内存使用率。Graphite 也支持函数像 sum() 来经过使用一个表达式像 sum(container.memory_usage_bytes.webapp*) 聚合你全部服务器上的应用的内存使用率。架构

这是很是伟大而且有用的,可是有限制性。若是你不想聚合一个给定名字的全部容器而是一个给定镜像的?或者你想把部署你的 canary 同在你生产环境的服务器对比?app

能够为每一个用例想出一个层次结构,可是没有一个支持它们。现实状况显示,你预先每每不知道哪一个问题须要重新回答一次而且你开始研究。webapp

Prometheus

Prometheus 支持维度数据,你能够拥有全局和简单的指标名像 container_memory_usage_bytes ,使用多个维度来标识你服务的指定实例。

我已经建立了一个简单的 container-exporter 来收集 Docker 容器的指标以及输出给 Prometheus 来消费。这个输出器使用容器的名字,id 和 镜像做为维度。额外的 per-exporter 维度能够在 prometheus.conf 中设置。

若是你使用指标名字直接做为一个查询表达式,它将返回有这个使用这个指标名字做为标签的全部时间序列。

container_memory_usage_bytes{env="prod",id="23f731ee29ae12fef1ef6726e2fce60e5e37342ee9e35cb47e3c7a24422f9e88",instance="http://1.2.3.4:9088/metrics",job="container-exporter",name="haproxy-exporter-int",image="prom/haproxy-exporter:latest"}    11468800.000000  
container_memory_usage_bytes{env="prod",id="57690ddfd3bb954d59b2d9dcd7379b308fbe999bce057951aa3d45211c0b5f8c",instance="http://1.2.3.5:9088/metrics",job="container-exporter",name="haproxy-exporter",image="prom/haproxy-exporter:latest"}    16809984.000000  
container_memory_usage_bytes{env="prod",id="907ac267ebb3299af08a276e4ea6fd7bf3cb26632889d9394900adc832a302b4",instance="http://1.2.3.2:9088/metrics",job="container-exporter",name="node-exporter",image="prom/container-exporter:latest"}  
...
...

若是你运行了许多容器,这个看起来像这样
此处输入图片的描述

为了帮助你使得这数据更有意义,你能够过滤(filter) and/or 聚合(aggregate) 这些指标。

切片 & 切块(Slice & Dice)

使用 Prometheus 的查询语言,你能够对你想的任何维度的数据切片和切块。若是你对一个给定名字的全部容器感兴趣,你能够使用一个表达式像 container_memory_usage_bytes{name="consul-server"},这个将仅仅显示 name == "consul-server" 的时间序列。

Prometheus 也支持正则表达式,所以匹配完整的脚本你能够这样作 container_memory_usage_bytes{name=~"^consul"},这将展现起来像这样:

此处输入图片的描述

你也使用使用任何维度过滤,所以你能够获取在一个给定主机,给定环境和给定区域上全部容器的指标。

聚合(Aggregation)

和 Graphite 相似,Prometheus 支持聚合函数可是它的维度更加丰富。使用 sum(container_memory_usage_bytes{name=~"^consul"}) 按预期汇总你全部 "consul-*" 的内存使用率。

如今好比说你想看你的 'consul' 和 'consul-server' 容器平均内存使用率的不一样,这能够经过提供维度保存这聚合结果像 avg(container_memory_usage_bytes{name=~"^consul"}) by (name) 来实现:

此处输入图片的描述

若是你在多个区域有服务而且配置了区域名做为一个额外的标签对,你也能够保存维度来展现每一个名字和区域的内存使用率,经过使用一个像这样的表达式 avg(container_memory_usage_bytes{name=~"^consul"}) by (name,zone)

使用 Prometheus + Container-Exporter

正如你所知,我喜欢在容器中运行一切,包括 container-exporter 和 Prometheus,运行 container-exporter 应该是很是容易的:

docker run -p 8080:8080 -v /sys/fs/cgroup:/cgroup \  
           -v /var/run/docker.sock:/var/run/docker.sock prom/container-exporter

如今你须要安装 Prometheus。关于这个参考官方文档。为了使得 Prometheus 从 container-exporter 拉取指标,你须要把它做为目标添加到配置。好比:

job: {  
  name: "container-exporter"
  scrape_interval: "1m"
  target_group: {
      labels: {
        label: {
            name: "zone"
            value: "us-east-1"
        }
        label: {
            name: "env"
            value: "prod"
        }
    }
    target: "http://1.2.3.4:8080/metrics"
  }
}

如今重新构建你的镜像如文档中描述的那样并启动它。Prometheus 如今应该每 60s 轮询你的 container-exporter。

总结

由于 Prometheus 的灵活性,它的性能和最小化依赖,它是我选择的监控系统。这就是为何从去年起我介绍了 Prometheus 做为咱们监控 Docker 的主要监控系统。

相关文章
相关标签/搜索