背景
业务需要实时监控cpu、内存、TCP连接和数据库连接数,供发生问题时回溯日志,并在超过某负荷时拒绝服务并发出告警
实现
1.监控部分,使用sigar,主要包括CPU信息、TCP连接、内存等,参考Sigar;数据库部分使用Spring DBCP包,获取数据库当前连接和最大连接等
示例代码如下:
private void sampleDbConnPool()
{
double dbConnPoolOcc = 0;
double dsOcc[] = new double[dsSet.size()];
int i = 0;
/*
* Go through each data source
*/
for (BasicDataSource ds : dsSet)
{
dsOcc[i++] = (double) ds.getNumActive() / ds.getMaxActive();
}
/*
* Select max occupancy for data source
*/
dbConnPoolOcc = selectMax(dsOcc);
occSample.put(OLCConst.DB_CONN_POOL_OCC, dbConnPoolOcc);
}
2.监控采用定时器,继承TimerTask类,定时采集需要监控的信息;
3.将常用配置写到properties文件,以方便修改,如采集的间隔时间;
bean配置和固有的分级放到spring配置文件,分级类似优先级为3;80-85,2:85-90,数字越大优先级越高
示例如下:
<util:map id="occThresholdMap" map-class="java.util.HashMap"
key-type="java.lang.String" value-type="java.util.HashMap">
<entry key="cpuOcc">
<ref bean="cpuThresholdMap" />
</entry>
<entry key="dbConnOcc">
<ref bean="dbThresholdMap" />
</entry>
<entry key="ntwkOcc">
<ref bean="ntwkThresholdMap" />
</entry>
<entry key="memOcc">
<ref bean="memThresholdMap" />
</entry>
</util:map>
<util:map id="cpuThresholdMap" map-class="java.util.HashMap"
key-type="java.lang.Integer" value-type="java.lang.String">
<entry key="0" value="100-100" />
<entry key="1" value="90-99" />
<entry key="2" value="85-90" />
<entry key="3" value="80-85" />
</util:map>