Zabbix-(五)监控Docker容器与自定义jvm监控项
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用户自定义参数配置
修改配置
使用自定义参数时,首先需要修改Server-A的agent配置
# vim /etc/zabbix/zabbix_agentd.conf
修改配置 UnsafeUserParameters=1
UnsafeUserParameters=1
重启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模板,有服务需要被监控时,直接链接该模板即可。
创建群组
点击【配置】-【主机群组】-【创建主机群组】
定义一个组名 Docker Group
配置项 值 * 组名 Docker Group - 创建模板
创建一个自定义模板,模板名称Docker Template,选择上步骤创建的Docker Group群组
配置项 值 * 模板名称 Docker Template * 群组 Docker Group
五.编写脚本与自定义监控参数
我们需要编写一个脚本,用于发现当前正在运行的docker容器(这里使用容器名称)。
在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"
}
]
}
- 在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
在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'
- 在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自定义参数
在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数据。
创建自动发现规则
点击【配置】-【模板】-【Docker Template】
点击【自动发现规则】-【创建发现规则】
先配置【自动发现规则】
配置项 值 * 名称 发现正在运行的Docker容器规则 类型 Zabbix 客户端 * 键值 docker.container (这是我们上述步骤中自定义的键值) 其他配置 根据需要配置 键值配置项是之前自定义的监控键值
再配置【过滤器】
宏则配置自定义脚本返回json数据中的key值
配置项 值 宏 {#CONTAINERNAME} 添加监控项原型
点击新建的自动发现规则的【监控项原型】-【创建监控项原型】
输入参数
配置项 值 * 名称 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监控项的更多相关文章
- Prometheus入门到放弃(4)之cadvisor监控docker容器
Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行. 1.下载镜像 [root@prometheus-server ...
- 6. 使用cadvisor监控docker容器
Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行.这里我们可以服务端和客户端都使用cadvisor 客户端 1.下 ...
- 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 ...
- zabbix监控docker容器
1.环境说明 由于最近zabbix进行过一次迁移,所以zabbix-server系列采用docker方式安装,参考zabbix官网:https://github.com/zabbix/zabbix-d ...
- Zabbix 监控 Docker容器
我们可以通过Python提供的模块docker来取各个docker容器的监控参数.参考文档:http://docker-py.readthedocs.io/en/stable/containers.h ...
- (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址
作者:雨水,日期:2016-04-09 CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...
- 【原创】大叔经验分享(71)docker容器中使用jvm工具
java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...
- Docker系列-第五篇Docker容器数据卷
1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data V ...
- zabbix监控docker容器状态
前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,za ...
随机推荐
- Oracle数据库提权(低权限提升至dba)
0x01 Oracle存储过程”缺陷” 在 Oracle 的存储过程中,有一个有趣的特点:运行权限.运行权限分为两种,definer 和 invoker. definer 为函数创建者的权限,而 in ...
- PHP ksort
1.例子一: <?php /** * 根据 c1 对元素排序 */ $arrays = [ 'b' => [ 'c1' => 10, 'c2' => 5, ], 'a' =&g ...
- Halcon一日一练:图像设备介绍
Halcon在设计之初就提供了完整的图像采集方案,适应了多种图像设备采集图像,以及各种不同环境的采集方案. 通常情况下,图像的采集应该是所有机器视觉项目首要解决的任务,不幸的是,需要解决图像采集的问题 ...
- epoll--IO多路复用
理解 epoll 过程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- python- = 与 ==的区别
一个等号代表的含义是赋值,将某一数值赋给某个变量,比如a=3,将3这个数值赋予给a. 两个等号是判断是否相等,返回True或False,比如1==1.他们是相等的,那么就返回true.1==2,他们是 ...
- 使用zepto中animate报错“Uncaught TypeError: this.bind is not a function”的解决办法
在使用zepto时,我先引入zepto.min.js,然后引入fx.js,但是在使用animate函数时,控制台却报如下错误: Uncaught TypeError: this.bind is not ...
- os模块/sys模块/json/pickle模块/logging模块(day16整理)
目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...
- AI Conference 2018人工智能大会 参会总结
主 题:AI Conference 2018人工智能大会 时 间:2018.04.11-4.13 地 点:北京国际饭店会议中心 发起人:O'Reilly 和 Intel 参与部门:研发设计部 参会人员 ...
- 在SpringBoot中使用flyway进行数据库版本管理
本文大纲 flyway是什么 能帮助我们解决什么问题 springboot环境下使用flyway flyway的工作原理 一.flyway是什么 Flyway是一个开源的数据库版本管理工具,并且极力主 ...
- 如何获取比 dism.log 更详细的日志
正文 在工作中,曾经遇到过一个问题. 有一个 component,名字叫做 Oxford Adaptive Learning Dictionary,是一款牛津词典的应用.这个 component,需要 ...