资讯专栏INFORMATION COLUMN

Docker 简单监控

fizz / 2510人阅读

摘要:简单监控标签空格分隔监控作者是,原文地址是从迁移到容器是非常容易的,除了监控部分。这是一个热身,一个概念验证或者是一个冒烟测试用于断言在我的监控系统,一切都是正确安装的。目前是收集一些与容器相关的指标。

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 发现。IP 地址被发现在 NetworkSettings.IPAddress 以及我从以下获取到的 State 计算状态:

0 -> Running

1 -> Paused

2 -> Stopped

3 -> Crashed (即以非零返回码退出)

CPU 和 Memory

cpu 和 内存可以在 /sys/fs/cgroup/docker 目录下 cpuacct.statmemory.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)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26345.html

相关文章

  • 几种 Docker 监控工具对比

    摘要:在我们列举的几个监控的服务或平台中,这是唯一一款国内产品。也是一款付费监控解决方案,计划收费方案是美分小时。同样也支持监控,还包括对容器级事件的监测停止开始等等和管理容器产生的日志。由于是一个监控方案,相对来说它的安装和部署都比较简单。 轻量级虚拟化容器 Docker,自发布以来便广受业界关注,在开源界和企业界掀起了一阵风。Docker 容器相对于 VM 有以下几个优势:启动速度快;资...

    张春雷 评论0 收藏0
  • Docker 监控实战

    摘要:监控告警是运营系统最核心的功能之一,腾讯内部有一套很成熟的监控告警平台,而且开发运维同学已经习惯这套平台,如果我们针对容器再开发一个监控告警平台,会花费很多精力,而且没有太大的意义。也是一款付费监控解决方案,计划收费方案是美分小时。 如今,越来越多的公司开始使用 Docker 了,现在来给大家看几组数据: 2 / 3 的公司在尝试了 Docker 后最终使用了它 也就是说 Docker...

    william 评论0 收藏0
  • 斌哥的 Docker 进阶指南—监控方案的实现

    摘要:本文转自刘斌博文如何选择监控方案,文中刘斌从技术的角度深入解释了监控的数据采集原理,介绍了现有开源的监控方案,以及能够对进行监控功能的主流服务工具。下一章,刘斌将为大家介绍监控的开原方案,主流服务,及其特点。 过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减。另一...

    X_AirDu 评论0 收藏0
  • 用 OneAPM Cloud Insight 监控 Docker 性能

    摘要:虽然这是监测最简单的方法,但之后我们还会提供在容器中监控所有运行的软件的探针版本,敬请期待。仪表盘通过标签订制指标在中,您可以在自定义仪表盘中基于一个或多个标签来显示指标。报警在定义跨越集群容器的警报是非常有用的。 Docker 是构建和部署软件的一个新兴的轻量级的平台,也是一个减轻替代虚拟机的容器。Docker 通过给开发者提供兼容不同环境的镜像,成为解决现代基础设施的持续交付的一个...

    leon 评论0 收藏0
  • Docker 监控- Prometheus VS Cloud Insight

    摘要:由发明,适合于监控基于容器的基础架构。有关其数据聚合的功能可以阅读数据聚合分组新一代系统监控的核心功能。所抓取的性能指标算是较为全面,部署和展现方式都是相当简单易懂的。 如今,越来越多的公司开始使用 Docker 了,2 / 3 的公司在尝试了 Docker 后最终使用了它。为了能够更精确的分配每个容器能使用的资源,我们想要实时获取容器运行时使用资源的情况,怎样对 Docker 上的应...

    liuyix 评论0 收藏0
  • 容器和实时资源监控的必知要素

    摘要:将作为最直观的例子尽管以下大部分适用于其他容器系统,包括,我们可以将实时容器指标分为四个基本类别可以监视单个容器使用的总内存,以及高速缓存和交换内存的数量,以及表示进程使用的且未缓存或存储在磁盘上的内存如匿名内存映射的驻留集大小或和栈。 您是否实时监控您的容器资源?如果没有,那意味着您可能没有对之进行有效监控。在快速变化的、动态的微服务环境中,即使是几秒钟以前的监视数据也可能不再可行。...

    frank_fun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<