阿里云自定义监控tomcat进程数
http://www.iyunv.com/thread-261360-1-1.html
阿里云提供自定义监控SDK,这有助于我们定制化的根据自身业务来做监控,下面我就根据业务需求来介绍一个简单的自定义监控配置。
本文使用shell版本做演示
这里说下我的简单需求,我们需要监控ECS服务器中tomcat的进程是否存在,如果小于1,就说明tomcat进程关闭,然后根据设定的报警规则报警。
首先我们需要在阿里云自定义监控页面建立一个自定义监控,如下图:
1、添加自定义监控
脚本post方法说明
post方法中传入4个参数,分别为 aliuid,监控项名称,监控项值,字段信息(以下脚本中传入参数)。
最后按照第4部分的说明,添加定时任务即可。
再次强调这些参数的意义,参见云监控控制台自定义监控自定义监控项管理
a.命名空间中的数字串,即是用户的aliuid
b. 监控项名称,即是用户创建监控项时填写的名称
c. 监控项值,是用户上报到云监控的业务数据
d. 字段信息,结合监控项,表示具体业务字段的实际意义。
例如字段信息是 machineIp,监控项名称是 cpuutilization,若当前cpu利用率80%,那么在上面的示例中传入的 参数分别是 1359099605207770 ,cpuutilization,0.8,machineIp=192.168.1.1
2、定制脚本
我制作的调用自定义SDK的脚本内容如下:
vi tomcat_process_check.sh
#!/bin/bash
## This is a monitor shell script for aliyun ecs
## It is mainly used to monitor the presence of the Tomcat process
## Created in 2015.07.25
## Written by Edison
## Version 1.0
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export VAUL=$(ps --user tomcat |grep java |wc -l)
export HOSTS=$(hostname)
#新版监控脚本位置自定义
/usr/local/aegis/script/cms_post.sh 1359099605207770 tomcat $VAUL java=$HOSTS-tomcat-stop
给予脚本执行权限
chmod +x cms_post.sh tomcat_process_check.sh
3、配置调度任务
3-2新版监控(cloudmonitor进程):
将脚本放置到任意位置中:
/usr/local/aegis/script/
3-2旧版监控:如果是利用阿里云监控自带的调度任务,那么我们需要将脚本放置到制定位置:
/usr/local/aegis/aegis_quartz/libexec/user
然后添加调度任务,执行此命令必须使用绝对路径
/usr/local/aegis/aegis_quartz/aegis_quartz -e "AddTask [0 0/5 * * * ?] /usr/local/aegis/aegis_quartz/libexec/user/tomcat_process_check.sh"
##删除
/usr/local/aegis/aegis_quartz/aegis_quartz -e "RemoveTask [0 0/5 * * * ?] /usr/local/aegis/aegis_quartz/libexec/user/tomcat_process_check.sh"
##查看任务
/usr/local/aegis/aegis_quartz/aegis_quartz -e "GetTasks"
##aegis_quartz 帮助
[root@server07 ~]# /usr/local/aegis/aegis_quartz/aegis_quartz -h
Usage:/usr/local/aegis/aegis_quartz/aegis_quartz
-f configFile (default:conf/aegis_quartz.conf)
-c configFile (only check configFile)
-e "opType value" (get or set some inner info)
-v (show agent version)
-h (show help)
about opType and value:
SetLogLevel [error|warn|info|debug] (set agent log level)
GetLogLevel (show agent log level)
GetConfig (show config)
GetTasks (show tasks)
GetTasksJson (show tasks)
GetTaskStatus (show task status)
AddTask "xxx" (add task)
RemoveTask "xxx" (remove task)
RemoveAllTasks (remove all tasks)
需要用户注意的一些事情:
I. aegis_quartz 进程请匆停止,系统的监控数据采集是通过 aegis_quartz 完成
II. aegis_quartz 程序的调用请使用绝对路径,如 linux 环境下
/usr/local/aegis/aegis_quartz/aegis_quartz
III. aegis_quartz libexec/default 下面的脚本是内置的监控数据采集脚本,请用户匆
修改
IV. 用户的监控数据程序只能放在 libexec/user 目录下面;上面添加任务与删除任务
的示例中,脚本程序的路径写的即是相对路径。因此,用户在命令行中的脚本路径
只需要填写成 user/xxx 即可(其中 xxx,是用户的脚本)
V. 关于任务的执行频率,是基于标准的 quartz 表达式,用户按照规范填写即可。脚
本的监控数据上报频率请与云监控控制台中设置监控项【上报频率】保持一致(控
制台支持的频率是 1 分钟,5 分钟,15 分钟),若修改上报频率请保持控制台与
脚本一致,否则监控数据处理会不准确
如果你发现不能上报数据,可以使用
/usr/local/aegis/aegis_quartz/aegis_quartz -e "SetLogLevel debug"
设置日志级别,来查看日志排查问题。更多选项请查看 aegis_quartz -h
日志目录 /usr/local/aegis/aegis_quartz/log
4、配置报警
然后我们设置报警规则,在报警管理如图: 这里需要注意,字段的值一定要与脚本中字段的值一致,否则即使监控的值触发了你的报警规则,状态依然是正常的。
下面就是我收到阿里云的短信报警信息,上报频率5分钟
【阿里云】您监控tomcat的f45966d***e60d在11:10发生报警,实例:(server07-tomcat-stop),值为0个,请登录云监控平台查看
【阿里云】您监控tomcat的f45966d***e60d在11:15发生报警,实例:(server07-tomcat-stop),值为0个,请登录云监控平台查看
参数说明
- userid,是用户的账号ID。
- 监控项名称:创建监控项时填写的“监控项名称”。
- 监控项值:监控项对应的监控数据。
- 字段信息:创建监控项时填写的“字段信息”和它的值。这个参数用于对数据区分维度。
使用步骤
-
下载SDK
a.自定义监控SDK(python版) :cms_post.py
b. 自定义监控SDK(bash版) :cms_post.sh
-
编写脚本。
a. 在用户的脚本中,import cms_post,调用cms_post的post方法推送数据到云监控。
b. post方法中传入4个参数,分别为userid, 监控项名称,监控项值,字段信息,您只需添加定时任务即可。
-
定时调度脚本,按创建监控项时定义的上报周期上报数据。Linux环境可以使用Crontab,Windows环境可以使用quartz.net。
-
补充说明:请在您的脚本开始处添加对应的解释器,一般默认#!/usr/bin/python,在test.py中,import cms_post,然后调用cms_post.post()上报您的监控数据。请将您的test.py文件和cms_post.py文件放在同一文件夹下,避免import时发生错误。
脚本示例(Python+linux环境)
#!/usr/bin/python
import cms_post
def get_mem_usage_percent():
try:
f = open('/proc/meminfo', 'r')
for line in f:
if line.startswith('MemTotal:'):
mem_total = int(line.split()[1])
elif line.startswith('MemFree:'):
mem_free = int(line.split()[1])
elif line.startswith('Buffers:'):
mem_buffer = int(line.split()[1])
elif line.startswith('Cached:'):
mem_cache = int(line.split()[1])
elif line.startswith('SwapTotal:'):
vmem_total = int(line.split()[1])
elif line.startswith('SwapFree:'):
vmem_free = int(line.split()[1])
else:
continue
f.close()
except:
return None
physical_percent = usage_percent(mem_total - (mem_free + mem_buffer + mem_cache), mem_total)
virtual_percent = 0
if vmem_total > 0:
virtual_percent = usage_percent((vmem_total - vmem_free), vmem_total)
return physical_percent
def usage_percent(use, total):
try:
ret = (float(use) / total) * 100
except ZeroDivisionError:
raise Exception("ERROR - zero division error")
return ret
MEMS_usage=get_mem_usage_percent()
if __name__ == '__main__':
cms_post.post("1058019241820815","MEMS_usage",MEMS_usage,"Percent","ecsinstanceId=i-28zdkoobp")
API上报数据
用户可以使用云监控接口 http://open.cms.aliyun.com/metrics/put 上报监控数据。
参数说明
- metricName:创建监控项时填写的“监控项名称”。
- unit:创建监控项时填写的“单位”。
- dimensions:创建监控项时填写的“字段信息”,允许多个,使用半角逗号分隔。
- namespace:格式为“ACS/CUSTOM/userId”,将userid替换为您的账号ID。
- userId:即您的账号ID。
- timestamp:数据上传的时间,支持两种表示方式:一种方式取时间的长整型表示方式1395556197448,另一种方式按照 ISO8601 标准表示,并使用 UTC 时间,例如 2014-9-11T10:00:00Z,注意它对应的北京时间是 2014-09-11 18:00:00。
Post方式
用户可以一次提交多条统计数据,统计数据放在消息体中,遵循 JSON 格式。如消息体内容:
userId=123456&namespace=acs/custom/123456&metrics =
[{"metricName":"vm.cpu","timestamp":"1395556197448","value":80.0,"unit":"Percen
t","dimensions":{"instanceId":"vm_001"}}]
GET方式
用户可以一次提交多条统计数据,统计数据存放在 metrics 字段中,遵循 JSON 格式。
http://open.cms.aliyun.com
/metrics/put?userId=123456&namespace=acs/custom/123456&metrics=[{"metricName":
"vm.cpu","timestamp":"1395556197448","value":80.0,"unit":"Percent","dimensions"
:{"instanceId":"vm_001"}},{"metricName":"vm.mem","timestamp":"1395556197448","v
alue":1280.0,"unit":"Megabytes","dimensions":{"instanceId":"vm_002"}}]
响应消息
云监控收到HTTP请求后,若处理成功则直接返回状态码为200的HTTP响应,消息体中不携带内容,用户也不需要处理响应消息。若处理失败,返回 JSON 格式的消息体,同时HTTP响应的状态码不为200。
错误 |
错误描述 |
HTTP Status Code |
InternalServerError |
由于内部错误或不确定的异常导致的请求失败 |
500 |
InvalidParameterCombination |
参数组合错误 |
400 |
InvalidParameterValue |
参数无效或超出范围 |
400 |
MissingRequiredParameter |
缺少必须的参数 |
400 |
例如:
{"code":"InvalidParameterValue","msg":"the metricName is empty."}
相关笔记:Shell脚本查看Nginx并发连接数、进程数和常驻内存占用情况(含python脚本示例)
posted on 2017-03-30 15:09
思月行云 阅读(419)
评论(0) 编辑 收藏 引用 所属分类:
服务器\Ops