本文的原做者是 johannes-fish-ziemke,原文地址是 http://5pi.de/2015/01/26/monitor-docker-containers-with-prometheus/node
該文中介紹的 Prometheus 的項目地址是 https://prometheus.github.io/git
在容器中運行你全部的服務使得獲取深度資源和運行特性成爲可能,由於每一個容器運行在它們本身的 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 支持維度數據,你能夠擁有全局和簡單的指標名像 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) 這些指標。
使用 Prometheus 的查詢語言,你能夠對你想的任何維度的數據切片和切塊。若是你對一個給定名字的全部容器感興趣,你能夠使用一個表達式像 container_memory_usage_bytes{name="consul-server"}
,這個將僅僅顯示 name == "consul-server"
的時間序列。
Prometheus 也支持正則表達式,所以匹配完整的腳本你能夠這樣作 container_memory_usage_bytes{name=~"^consul"}
,這將展現起來像這樣:
你也使用使用任何維度過濾,所以你能夠獲取在一個給定主機,給定環境和給定區域上全部容器的指標。
和 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)
。
正如你所知,我喜歡在容器中運行一切,包括 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 的主要監控系統。