Zabbix主动模式监控Docker状态+自动发现

Zabbix Docker 容器自动发现与资源监控完整方案

本文介绍如何基于 Zabbix 5.0+ 通过自定义脚本实现 Docker 容器自动发现,采集容器状态、CPU 和内存使用率,并自动生成监控图形和告警规则。


一、Docker 容器自动发现脚本 (docker_lld.sh)

#!/bin/bash
containers=$(docker ps --format '{{.Names}}')
echo -n '{"data":['
first=1
for name in $containers; do
    if [ $first -eq 0 ]; then echo -n ","; fi
    echo -n "{\"{#CONTAINER}\":\"$name\"}"
    first=0
done
echo "]}"

此脚本输出符合 Zabbix LLD JSON 格式,用于自动发现当前所有运行的容器名称。


二、内存单位转换脚本 (docker_mem.sh)

#!/bin/bash
container_name="$1"
mem=$(docker stats --no-stream --format "{{.MemUsage}}" "$container_name" 2>/dev/null)

val=$(echo "$mem" | awk -F '[ /]+' '{print $1}')
unit=$(echo "$val" | sed 's/[0-9.]//g')
num=$(echo "$val" | sed 's/[^0-9.]//g')

if [ "$unit" = "KiB" ]; then
  printf "%.0f\n" "$(awk "BEGIN {print $num*1024}")"
elif [ "$unit" = "MiB" ]; then
  printf "%.0f\n" "$(awk "BEGIN {print $num*1024*1024}")"
elif [ "$unit" = "GiB" ]; then
  printf "%.0f\n" "$(awk "BEGIN {print $num*1024*1024*1024}")"
else
  echo 0
fi

此脚本将 docker stats 输出的内存使用单位转换为字节数,方便 Zabbix 采集和图形化处理。


三、Zabbix Agent 配置示例 (userparameters.conf)

UserParameter=docker.discovery,/etc/zabbix/zabbix_agentd.d/docker_lld.sh
UserParameter=docker.status[*],docker inspect -f '{{.State.Status}}' "$1" 2>/dev/null || echo "not_found"
UserParameter=docker.health[*],docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}no_health_check{{end}}' "$1" 2>/dev/null || echo "not_found"
UserParameter=docker.cpu[*],docker stats --no-stream --format "{{.Name}} {{.CPUPerc}}" "$1" | awk '{gsub(/%/, "", $2); print $2}'
UserParameter=docker.mem[*],/etc/zabbix/zabbix_agentd.d/docker_mem.sh $1
UserParameter=docker.mem_pct[*],docker stats --no-stream --format "{{.Name}} {{.MemPerc}}" "$1" | awk '{gsub(/%/, "", $2); print $2}'

将脚本路径根据实际情况调整,并确保 agent 进程有权限执行 docker 命令。


四、完整 Zabbix 模板 XML 自动发现规则示例

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
  <version>5.0</version>
  <date>2025-06-20T07:47:58Z</date>

  <groups>
    <group>
      <name>Linux-OS</name>
    </group>
  </groups>

  <templates>
    <template>
      <template>Linux-docker</template>
      <name>Linux-docker</name>

      <groups>
        <group>
          <name>Linux-OS</name>
        </group>
      </groups>

      <applications>
        <application>
          <name>Docker容器监控</name>
        </application>
      </applications>

      <discovery_rules>
        <discovery_rule>
          <name>Docker 容器状态 - {#CONTAINER}</name>
          <type>ZABBIX_ACTIVE</type>
          <key>docker.discovery</key>
          <delay>60s</delay>

          <item_prototypes>
            <item_prototype>
              <name>Docker容器 CPU 使用率-{#CONTAINER}</name>
              <type>ZABBIX_ACTIVE</type>
              <key>docker.cpu[{#CONTAINER}]</key>
              <value_type>FLOAT</value_type>
              <units>%</units>
              <applications>
                <application>
                  <name>Docker容器监控</name>
                </application>
              </applications>
            </item_prototype>

            <item_prototype>
              <name>Docker容器内存使用量-{#CONTAINER}</name>
              <type>ZABBIX_ACTIVE</type>
              <key>docker.mem[{#CONTAINER}]</key>
              <units>MiB</units>
              <applications>
                <application>
                  <name>Docker容器监控</name>
                </application>
              </applications>
            </item_prototype>

            <item_prototype>
              <name>Docker容器内存使用率-{#CONTAINER}</name>
              <type>ZABBIX_ACTIVE</type>
              <key>docker.mem_pct[{#CONTAINER}]</key>
              <value_type>FLOAT</value_type>
              <units>%</units>
              <applications>
                <application>
                  <name>Docker容器监控</name>
                </application>
              </applications>
            </item_prototype>

            <item_prototype>
              <name>Docker容器状态-{#CONTAINER}</name>
              <type>ZABBIX_ACTIVE</type>
              <key>docker.status[{#CONTAINER}]</key>
              <trends>0</trends>
              <value_type>TEXT</value_type>
              <applications>
                <application>
                  <name>Docker容器监控</name>
                </application>
              </applications>
              <trigger_prototypes>
                <trigger_prototype>
                  <expression>{last()}<>"running"</expression>
                  <name>Docker容器异常停止 - {#CONTAINER}</name>
                  <priority>DISASTER</priority>
                </trigger_prototype>
              </trigger_prototypes>
            </item_prototype>
          </item_prototypes>

          <graph_prototypes>
            <graph_prototype>
              <name>Docker 资源使用 - {#CONTAINER}</name>
              <show_work_period>NO</show_work_period>
              <show_triggers>NO</show_triggers>
              <graph_items>
                <graph_item>
                  <sortorder>1</sortorder>
                  <drawtype>BOLD_LINE</drawtype>
                  <color>1A7C11</color>
                  <item>
                    <host>Linux-docker</host>
                    <key>docker.cpu[{#CONTAINER}]</key>
                  </item>
                </graph_item>
                <graph_item>
                  <sortorder>2</sortorder>
                  <drawtype>BOLD_LINE</drawtype>
                  <color>F63100</color>
                  <item>
                    <host>Linux-docker</host>
                    <key>docker.mem_pct[{#CONTAINER}]</key>
                  </item>
                </graph_item>
                <graph_item>
                  <sortorder>3</sortorder>
                  <drawtype>BOLD_LINE</drawtype>
                  <color>000000</color>
                  <yaxisside>RIGHT</yaxisside>
                  <item>
                    <host>Linux-docker</host>
                    <key>docker.mem[{#CONTAINER}]</key>
                  </item>
                </graph_item>
              </graph_items>
            </graph_prototype>
          </graph_prototypes>

          <preprocessing>
            <step>
              <type>JSONPATH</type>
              <params>$.data[*]</params>
            </step>
          </preprocessing>
        </discovery_rule>
      </discovery_rules>
    </template>
  </templates>
</zabbix_export>

五、说明

  • 请确保 Zabbix Agent 运行用户对 Docker 命令有权限(通常是加入 docker 用户组)。
  • 脚本和 UserParameter 路径请根据实际环境调整。
  • 导入该 XML 模板后,自动发现功能会定期扫描所有运行的 Docker 容器,自动生成监控项和触发器。
  • 告警触发条件为容器状态不为 running 时触发灾难级别告警。
---

六、参考资料

posted @ 2025-06-20 15:54  浒多年以后  阅读(271)  评论(0)    收藏  举报