Zabbix-(五)监控Docker容器与自定义jvm监控项

一.前言

前文中讲述了Zabbix对服务器硬件方面的监控功能,本文将讲述利用Zabbix监控Docker容器中的Java Web服务,并通过自定义监控项,监控JVM老年代使用情况以及GC信息。Zabbix其实提供了JMX监控,自带了JMX模板能够直接监控JVM信息,本文主要侧重于自定义参数与自定义监控项,关于JMX会在之后的文章中介绍。

准备

  • Zabbix Server (Zabbix 4.4) (ip:192.168.152.140)
  • 运行Java应用的主机 以下简称Server-A (已被Zabbix监控) (ip:192.168.152.142)


二.开启agent用户自定义参数配置

  1. 修改配置

    使用自定义参数时,首先需要修改Server-A的agent配置

    # vim /etc/zabbix/zabbix_agentd.conf

    修改配置 UnsafeUserParameters=1

    UnsafeUserParameters=1
  2. 重启zabbix-agent

    # systemctl restart zabbix-agent


三.运行tomcat容器

在Server-A运行tomcat容器

# docker run --name tomcat -p 8080:8080 -dit tomcat:jdk8-adoptopenjdk-hotspot

将zabbix账号添加到docker组。参考部署问题

# sudo gpasswd  -a zabbix docker

外部访问测试一下


四.创建自定义Docker模板

我们可以定义一个比较通用的Docker模板,有服务需要被监控时,直接链接该模板即可。

  1. 创建群组

    点击【配置】-【主机群组】-【创建主机群组】

    定义一个组名 Docker Group

    配置项
    * 组名 Docker Group

  2. 创建模板

    创建一个自定义模板,模板名称Docker Template,选择上步骤创建的Docker Group群组

    配置项
    * 模板名称 Docker Template
    * 群组 Docker Group


五.编写脚本与自定义监控参数

我们需要编写一个脚本,用于发现当前正在运行的docker容器(这里使用容器名称)。

  1. 在Server-A编写发现运行容器的python脚本

    创建脚本

    # cd /data/zabbix
    # touch find_container.py
    # chmod a+x find_container.py
    # vim find_container.py

    脚本内容:

    #!/usr/bin/env python
    import os
    import json # 查看当前运行的docker容器
    t=os.popen(""" docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
    container_name = []
    for container in t.readlines():
    r = os.path.basename(container.strip())
    container_name += [{'{#CONTAINERNAME}':r}]
    # 转换成json数据
    print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))
    运行脚本,查看一下json数据格式:
    {
    "data":[
    {
    "{#CONTAINERNAME}":"tomcat"
    }
    ]
    }
  2. 在Server-A自定义容器发现参数

    我们需要自定义一个键值对的配置类型,以便Zabbix可以通过键读取到值。

    增加自定义参数

    # cd /etc/zabbix/zabbix_agentd.d
    # vim userparameter_find_container.conf
    docker.container /data/zabbix/find_container.py (脚本的运行结果)
    UserParameter=docker.container,/data/zabbix/find_container.py
  3. 在Server-A创建查看容器JVM GC情况的脚本

    我们可以使用jstat -gcutil 命令查看GC情况



    创建python脚本

    # cd /data/zabbix
    # touch monitor_gc.py
    # chmod a+x monitor_gc.py
    # vim monitor_gc.py

    脚本内容

    #!/usr/bin/python
    import sys
    import os def monitor_gc(container_name, keyword):
    cmd = ''' docker exec %s bash -c "jstat -gcutil 1" | grep -v S0 | awk '{print $%s}' ''' %(container_name, keyword)
    value = os.popen(cmd).read().replace("\n","")
    print value if __name__ == '__main__':
    # 参数1:容器的名称
    # 参数2:查看第几列(例如 Eden区在第3列传入3,Full GC次数在第9列传入9)
    container_name, keyword = sys.argv[1], sys.argv[2]
    monitor_gc(container_name, keyword)

    测试脚本,查看当前tomcat容器Full GC次数

    # /data/zabbix/monitor_gc.py 'tomcat' '9'



  4. 在Server-A自定义Zabbix JVM GC参数

    同样,增加一个conf文件,表示自定义参数

    # cd /etc/zabbix/zabbix_agentd.d
    # touch userparameter_gc_status.conf
    # vim userparameter_gc_status.conf
    jvm.gc.status[*] /data/zabbix/monitor_gc.py $1 $2
    UserParameter=jvm.gc.status[*], /data/zabbix/monitor_gc.py $1 $2

    jvm.gc.status[*] 表示可以使用参数。其中$1表示参数1,即容器名称;$2表示参数2,需要查看哪项GC信息,$1 $2都是通过Zabbix配置时传递的。Zabbix自定义参数

  5. 在Zabbix server上测试自定义参数

    为zabbix sever安装zabbix-get

    # yum install -y zabbix-get

    测试自定义参数,如果有权限问题,可以参考部署问题

    # zabbix_get -s 192.168.152.142 -p 10050 -k docker.container
    # zabbix_get -s 192.168.152.142 -p 10050 -k "jvm.gc.status['tomcat', 9]"


六.Zabbix模板增加自动发现规则

上述配置中,已经可以通过脚本获取到已运行的容器信息,此步骤将通过Zabbix配置界面,在模板中添加自动发现规则,以发现被监控主机中正在运行的docker容器,并利用这些获取的数据进一步监控容器中jvm数据。

  1. 创建自动发现规则

    点击【配置】-【模板】-【Docker Template】

    点击【自动发现规则】-【创建发现规则】

    先配置【自动发现规则】

    配置项
    * 名称 发现正在运行的Docker容器规则
    类型 Zabbix 客户端
    * 键值 docker.container (这是我们上述步骤中自定义的键值)
    其他配置 根据需要配置

    键值配置项是之前自定义的监控键值

    再配置【过滤器】

    则配置自定义脚本返回json数据中的key值

    配置项
    {#CONTAINERNAME}

  2. 添加监控项原型

    点击新建的自动发现规则的【监控项原型】-【创建监控项原型】


    输入参数

    配置项
    * 名称 Tomcat Full GC次数监控项
    类型 Zabbix 客户端
    * 键值 jvm.gc.status[{#CONTAINERNAME} , 9]
    其他配置项 根据需要填写

    键值是自定义jvm gc参数步骤中定义的参数,{#CONTAINERNAME} 是jvm.gc.status的参数1,使用了自动发现规则,发现到的docker容器名称(本文中即是 tomcat);参数2 9 则是表示需要查看FullGC次数,FGC列(第9列)

    除此之外,还可以添加Old老年代(对应第4列),Full GC时间(对应第10列)等监控项,这里就不一一添加了,和上述过程基本一致,只需修改参数2即可(也可以利用刚新建的监控项原型进行【克隆】)。


七.链接模板

将上述自定义的模板链接到Server-A主机

八.DashBoard添加可视化图形

回到Zabbix首页可以为新增的自定义监控项,增加图形(添加图形步骤可以参考Zabbix-(三)监控主机CPU、磁盘、内存并创建监控图形

九.其他

部署问题

  • zabbix在执行脚本时,是使用的zabbix账户,因此可能要注意要给zabbix账号赋予权限。

    例如,zabbix账户无法使用docker命令,将zabbix添加到docker组

    # sudo gpasswd -a zabbix docker
  • zabbix server无法执行agent自定义参数中的脚本

    为agent主机设置

    # setenforce 0

Zabbix-(五)监控Docker容器与自定义jvm监控项的更多相关文章

  1. Prometheus入门到放弃(4)之cadvisor监控docker容器

    Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行. 1.下载镜像 [root@prometheus-server ...

  2. 6. 使用cadvisor监控docker容器

    Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行.这里我们可以服务端和客户端都使用cadvisor 客户端 1.下 ...

  3. docker-compose 快速部署Prometheus,监控docker 容器, 宿主机,ceph -- cluster集群

    话不多说上菜: 现在环境是这样: ceph 4台: 192.168.100.21  ceph-node1 192.168.100.22  ceph-node2 192.168.100.23  ceph ...

  4. zabbix监控docker容器

    1.环境说明 由于最近zabbix进行过一次迁移,所以zabbix-server系列采用docker方式安装,参考zabbix官网:https://github.com/zabbix/zabbix-d ...

  5. Zabbix 监控 Docker容器

    我们可以通过Python提供的模块docker来取各个docker容器的监控参数.参考文档:http://docker-py.readthedocs.io/en/stable/containers.h ...

  6. (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址

    作者:雨水,日期:2016-04-09  CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...

  7. 【原创】大叔经验分享(71)docker容器中使用jvm工具

    java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...

  8. Docker系列-第五篇Docker容器数据卷

    1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data V ...

  9. zabbix监控docker容器状态

    前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,za ...

随机推荐

  1. PHP 插入排序 -- 折半查找

    1. 折半查找  -- Binary Insertion Sort 时间复杂度 : O(n^2) 适用条件 : 相对直接插入排序,减少了数值的比较次数.适用于需要排序的数码比较少的情况. <?p ...

  2. Linux::mysql-connector-c++

    .安装好boost. .从官网下载mysql connector c++版本. .解压,复制 include/jdbc/cppconn 文件夹复制,到/usr/local/include/cppcon ...

  3. 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...

  4. Spring Boot项目中使用Mockito

    本文首发于个人网站:Spring Boot项目中使用Mockito Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试 ...

  5. [洛谷P3613]睡觉困难综合症

    写码30min,调码3h的题.. 好在最后查出来了 , , n, x, y, z); 改成了 , , n, mark[x], y, z); 然后$40\rightarrow 100$ #include ...

  6. 百万年薪python之路 -- 函数初始练习

    1.整理函数相关知识点 2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def func(lst): lst = lst[1::2] return l ...

  7. .NET Core3.0 日志 logging

    多年的经验,日志记录是软件开发的重要组成部分.没有日志记录机制的系统不是完善的系统.在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用. ...

  8. LHH的acm奋斗史,至强的精神(转载)

    还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章.写完后,她哭了,我笑了.然后,她走了,我哭了.2年后,我又找到她,这次,我没有让她走掉,她成了我的新娘. 不知道什么时候,开始知道ACM:也不知 ...

  9. vue 父子组件通信详解

    这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...

  10. kali2019里安装Burp Suite安装破解版加汉化版

    Burpsuite是一个强大web漏洞挖掘工具,截断代理,解码和编码,Fuzzy进行各种注入和暴力破解 插件扩展,有多个模块 Burp Suite没有中文版的,我英语又不好,我虽然精通Burp Sui ...