监控对象


import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; /**
* 监控对象
*
* @author solq
* */
public class Monitor {
/** 每分钟记录 */
private ConcurrentHashMap<Long, Integer> record = new ConcurrentHashMap<>();
/** 记录间隔 */
private long recordInterval;
/** 清理间隔 */
private long cleanInterval;
/** 记录名称 */
private String name;
/** 最后清理时间 */
private long lastClean = System.currentTimeMillis(); public static Monitor valueOf(String name, long recordInterval,
long cleanInterval) {
Monitor result = new Monitor();
result.name = name;
result.recordInterval = recordInterval;
result.cleanInterval = cleanInterval;
return result;
} public void record() {
final long start = System.currentTimeMillis();
// 去掉除数 达到取上一时间点效果
final long key = (start / recordInterval) * recordInterval;
if (Math.abs((start- lastClean)) > cleanInterval) {
synchronized (this) {
if (Math.abs((start- lastClean))> cleanInterval) {
printlnAndClean();
}
}
} record(key);
} void record(Long key) {
while (true) {
Integer value = record.get(key);
if (value == null) {
if (record.putIfAbsent(key, 1) == null) {
break;
}
} else {
if (record.replace(key, value, value + 1)) {
break;
}
}
}
} /**
* 打印并清理记录
* */
private void printlnAndClean() {
lastClean = System.currentTimeMillis();
Map<Long, Integer> data = new HashMap<>(record);
record.clear();
for (Entry<Long, Integer> entry : data.entrySet()) {
System.err.println(name
+ " Monitor : "
+ DateUtils.date2String(new Date(entry.getKey()),
DateUtils.PATTERN_DATE_TIME) + " : "
+ entry.getValue());
}
} }

监控使用包装

/**
* 请求监控工具
*
* @author solq
* */
public abstract class RequestMonitorUtil {
private static Monitor commandMonitor = Monitor.valueOf("命令代理", 60 * 1000,
60 * 60 * 1000);
private static Monitor sqlMonitor = Monitor.valueOf("sql代理", 60 * 1000,
60 * 60 * 1000); public static void recordSql() {
try {
commandMonitor.record();
} catch (Exception e) {
e.printStackTrace();
}
} public static void recordCommand() {
try {
sqlMonitor.record();
} catch (Exception e) {
e.printStackTrace();
}
}
}

最新文章

  1. Codeforces Round #380 (Div. 2) 总结分享
  2. session如何保存在专门的StateServer服务器中
  3. RTO &amp; RPO
  4. Openstack的error僵尸实例的解决办法
  5. 使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到
  6. ASP.NET WEB API 初探
  7. PHP session有效期session.gc_maxlifetime的设置方法
  8. [2011山东省第二届ACM大学生程序设计竞赛]——Identifiers
  9. facebook api介绍
  10. Linux操作系统-命令-vmstat
  11. Python---socketserver
  12. Linux挖矿病毒 khugepageds详细解决步骤
  13. Elasticsearch.net项目实战
  14. spring学习总结——装配Bean学习三(xml装配bean)
  15. openstack 网络更改版
  16. Linux服务器超简单安装Python3环境、Ipython、Jupyter、virtualenv、virtualenvwrapper教程全在这了
  17. Android开发中Activity状态的保存与恢复
  18. 原生WebGL绘制3个点
  19. 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)
  20. Go语言之进阶篇TCP相互通信

热门文章

  1. [No000071]C# 进制转换(二进制、十六进制、十进制互转)
  2. 规则引擎集成接口(四)SQL执行语句
  3. CardLayout布局练习(小的图片浏览器)
  4. 模拟position:fixed效果
  5. redis 的使用 ( list列表类型操作)
  6. swift 如何获取webView的内容高度
  7. Android环境的搭建
  8. swift基础一
  9. HDU 2082 找单词 --生成函数
  10. XMLHttpRequest Level2实现跨域
  11. Medium上关于git的文章
  12. Python使用xslt提取网页数据
  13. TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸
  14. Eureka 配置
  15. nodejs, 阿里oss上传下载图片
  16. emWin洗衣机简易操作界面,含uCOS-III和FreeRTOS两个版本
  17. Oracle学习笔记一
  18. python数据分析---第04章 NumPy基础:数组和矢量计算
  19. oracle配置数据库可恢复性(认证系列总结一)
  20. SQLServer&#160;2005客户端远程连接sql2008&#160;数据库服务器