摘要:簡單監控標簽空格分隔監控作者是,原文地址是從遷移到容器是非常容易的,除了監控部分。這是一個熱身,一個概念驗證或者是一個冒煙測試用于斷言在我的監控系統,一切都是正確安裝的。目前是收集一些與容器相關的指標。
Docker 簡單監控
標簽(空格分隔): Docker 監控 Monitoring
作者是 LE JOURNAL DE CHRISTOPHE,原文地址是 Simple Monitoring for Docker (Part I)
從 VM 遷移到 Docker 容器是非常容易的,除了監控部分。一個簡單的方法,運行一個數據收集客戶端(比如 Zabbix 客戶端),絕對不是一個好的解決方案,因為它與 Docker 的每個容器中只有一個清楚明確任務的哲學相悖,并且也因為它要求使用定制的鏡像。從收集 LXC 和 Docker 容器的指標開始,我用一個基于系統的簡單腳本來收集來自于 Docker 容器的指標。
我使用 Zabbix 來匯總性能指標,因此該腳本將被設計成用在 Zabbix 客戶端的 user parameter。一個 user parameter 是一個被 Zabbix 運行并且返回某些信息的基本腳本。User parameters 不得不被定義在客戶端的配置文件中,但可能接收參數是為了單個腳本的多個信息。
主機指標這些指標在 Docker 主機級別生成,而不是容器級別。這是一個熱身,一個概念驗證或者是一個冒煙測試用于斷言在我的監控系統,一切都是正確安裝的。目前是收集一些與容器相關的指標。
正在運行的容器數量
已經定義的容器總數量
崩潰的容器數量 即多少個已經停止的容器以非 0 返回碼退出。
以下是一個簡單的 shell 實現:
#!/bin/bash function countContainers() { docker ps -q $1 | wc -l } function countCrashedContainers() { docker ps -a | grep -v -F "Exited (0)" | grep -c -F "Exited (" } TYPE=${1-all} case $TYPE in running) COUNT_FUNCTION="countContainers"; shift;; crashed) COUNT_FUNCTION="countCrashedContainers"; shift;; all) COUNT_FUNCTION="countContainers -a"; shift;; esac $COUNT_FUNCTION
然后對 Zabbix 做一些配置后,會生成看起來像這樣的圖:
因為我有 9 個容器長期運行,3 個數據容器和一個容器以定時每小時啟動一次,這是符合我期望的。
一個類似的腳本可以被寫的用于收集鏡像的指標,比如鏡像的總數量以及多少是 dangling 的。
容器指標首先我想收集每個容器的以下指標:
容器的 IP 地址
容器的狀態(running, paused, stopped, crashed)
user 和 system CPU time
容器進程的內存使用
網絡活動(in 和 out)
IP 地址和容器狀態這些可以在 docker inspect
0 -> Running
1 -> Paused
2 -> Stopped
3 -> Crashed (即以非零返回碼退出)
CPU 和 Memorycpu 和 內存可以在 /sys/fs/cgroup/docker 目錄下 cpuacct.stat 和 memory.stat 文件檢索到。
Network activity根據博客文章,目前檢索 network activity 比檢索 CPU 或 Memory 更復雜并且我不喜歡在文章中提到的方法。盡管如此,這些數據可以十分容易的從容器中檢索到的,通過在容器實例運行一個簡單的 ifconfig eth0 命令或是從 /sys 層次結構中查看。感謝 Docker 1.3 中引進的 exec 命令,運行這個命令進入一個運行著的容器是十分容易的,不需要任何定制鏡像或者在啟動容器時指定任何命令。
腳本#!/usr/bin/env python __author__ = "Christophe Labouisse" import argparse import re import os from docker import Client from docker.utils import kwargs_from_env def display_cpu(args): detail = c.inspect_container(args.container) if bool(detail["State"]["Running"]): container_id = detail["Id"] cpu_usage = {} with open("/sys/fs/cgroup/cpuacct/docker/" + container_id + "/cpuacct.stat", "r") as f: for line in f: m = re.search(r"(system|user)s+(d+)", line) if m: cpu_usage[m.group(1)] = int(m.group(2)) if args.type == "all": cpu = cpu_usage["system"] + cpu_usage["user"] else: cpu = cpu_usage[args.type] user_ticks = os.sysconf(os.sysconf_names["SC_CLK_TCK"]) print(float(cpu) / user_ticks) else: print(0) def display_ip(args): detail = c.inspect_container(args.container) print(detail["NetworkSettings"]["IPAddress"]) def display_memory(args): detail = c.inspect_container(args.container) if bool(detail["State"]["Running"]): container_id = detail["Id"] with open("/sys/fs/cgroup/memory/docker/" + container_id + "/memory.stat", "r") as f: for line in f: m = re.search(r"total_rsss+(d+)", line) if m: print(m.group(1)) return print(0) def display_network(args): detail = c.inspect_container(args.container) if bool(detail["State"]["Running"]): ifconfig = c.execute(args.container, "ifconfig eth0") m = re.search(("RX" if args.direction == "in" else "TX") + r" bytes:(d+)", str(ifconfig)) if m: print(m.group(1)) else: b = c.execute(args.container, "cat /sys/devices/virtual/net/eth0/statistics/"+("rx" if args.direction == "in" else "tx")+"_bytes") if re.match(r"s*d+s*", b): print(b) else: print(0) else: print(0) def display_status(args): detail = c.inspect_container(args.container) state = detail["State"] if bool(state["Paused"]): print(1) # Paused elif bool(state["Running"]): print(0) # Running elif int(state["ExitCode"]) == 0: print(2) # Stopped else: print(3) # Crashed parser = argparse.ArgumentParser() parser.add_argument("container", help="Container name") subparsers = parser.add_subparsers(title="Counters", description="Available counters", dest="dataType") cpu_parser = subparsers.add_parser("cpu", help="Display CPU usage") cpu_parser.add_argument("type", choices=["system", "user", "all"]) cpu_parser.set_defaults(func=display_cpu) ip_parser = subparsers.add_parser("ip", help="Display IP Address") ip_parser.set_defaults(func=display_ip) memory_parser = subparsers.add_parser("memory", help="Display memory usage") memory_parser.set_defaults(func=display_memory) network_parser = subparsers.add_parser("network", help="Display network usage") network_parser.add_argument("direction", choices=["in", "out"]) network_parser.set_defaults(func=display_network) status_parser = subparsers.add_parser("status", help="Display the container status") status_parser.set_defaults(func=display_status) c = Client(**(kwargs_from_env())) args = parser.parse_args() args.func(args)延伸
Simple Monitoring for Docker (Part II)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26345.html
摘要:在我們列舉的幾個監控的服務或平臺中,這是唯一一款國內產品。也是一款付費監控解決方案,計劃收費方案是美分小時。同樣也支持監控,還包括對容器級事件的監測停止開始等等和管理容器產生的日志。由于是一個監控方案,相對來說它的安裝和部署都比較簡單。 輕量級虛擬化容器 Docker,自發布以來便廣受業界關注,在開源界和企業界掀起了一陣風。Docker 容器相對于 VM 有以下幾個優勢:啟動速度快;資...
摘要:監控告警是運營系統最核心的功能之一,騰訊內部有一套很成熟的監控告警平臺,而且開發運維同學已經習慣這套平臺,如果我們針對容器再開發一個監控告警平臺,會花費很多精力,而且沒有太大的意義。也是一款付費監控解決方案,計劃收費方案是美分小時。 如今,越來越多的公司開始使用 Docker 了,現在來給大家看幾組數據: 2 / 3 的公司在嘗試了 Docker 后最終使用了它 也就是說 Docker...
摘要:本文轉自劉斌博文如何選擇監控方案,文中劉斌從技術的角度深入解釋了監控的數據采集原理,介紹了現有開源的監控方案,以及能夠對進行監控功能的主流服務工具。下一章,劉斌將為大家介紹監控的開原方案,主流服務,及其特點。 過去的一年中,關于 Docker 的話題從未斷過,而如今,從嘗試 Docker 到最終決定使用 Docker 的轉化率依然在逐步升高,關于 Docker 的討論更是有增無減。另一...
摘要:雖然這是監測最簡單的方法,但之后我們還會提供在容器中監控所有運行的軟件的探針版本,敬請期待。儀表盤通過標簽訂制指標在中,您可以在自定義儀表盤中基于一個或多個標簽來顯示指標。報警在定義跨越集群容器的警報是非常有用的。 Docker 是構建和部署軟件的一個新興的輕量級的平臺,也是一個減輕替代虛擬機的容器。Docker 通過給開發者提供兼容不同環境的鏡像,成為解決現代基礎設施的持續交付的一個...
摘要:由發明,適合于監控基于容器的基礎架構。有關其數據聚合的功能可以閱讀數據聚合分組新一代系統監控的核心功能。所抓取的性能指標算是較為全面,部署和展現方式都是相當簡單易懂的。 如今,越來越多的公司開始使用 Docker 了,2 / 3 的公司在嘗試了 Docker 后最終使用了它。為了能夠更精確的分配每個容器能使用的資源,我們想要實時獲取容器運行時使用資源的情況,怎樣對 Docker 上的應...
摘要:將作為最直觀的例子盡管以下大部分適用于其他容器系統,包括,我們可以將實時容器指標分為四個基本類別可以監視單個容器使用的總內存,以及高速緩存和交換內存的數量,以及表示進程使用的且未緩存或存儲在磁盤上的內存如匿名內存映射的駐留集大小或和棧。 您是否實時監控您的容器資源?如果沒有,那意味著您可能沒有對之進行有效監控。在快速變化的、動態的微服務環境中,即使是幾秒鐘以前的監視數據也可能不再可行。...
閱讀 955·2019-08-30 14:24
閱讀 987·2019-08-30 14:13
閱讀 1799·2019-08-29 17:21
閱讀 2661·2019-08-29 13:44
閱讀 1654·2019-08-29 11:04
閱讀 438·2019-08-26 10:44
閱讀 2564·2019-08-23 14:04
閱讀 908·2019-08-23 12:08