类的调用监控(原创)

原创 2005年05月24日 17:39:00
     系统中一些主要的类,你可能需要去监控它,需要知道在什么地方用到了它的什么方法。比如对数据库连接类的监控,可能要监控何时打开连接,何时关闭了连接等;也可以用到项目的单元测试中;log4j的日志和jdk的Logging日志也是通过监控类实现的。
有三中方法可以做到:
1、用异常的堆栈。
2、用JDK1.4中的StackTraceElement类。
3、JDK1.5在Thread类里面引入了getStackTrace()和getAllStackTraces()两个方法。可以调用Thread.getCurrentThread().getStackTrace()来获得当前线程的运行栈信息。不仅如此,只要权限允许,还可以获得其它线程的运行栈信息。

/***********类的痕迹类****************/
public class MethodTrace {
// for jdk 1.4
private StackTraceElement elements[];
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
private String trueMethodName = null;
private String methodName = null;
private String methodNameExTest = null;
private String e = null;
private int a[] = new int[2];
private int b;
private String cutStr = "test";
private int cutLength = cutStr.length();
private char[] line = null;
private StringBuffer buf = new StringBuffer();

public MethodTrace() {
}

private String cutTestStr(String str) {
if (str == null) {
return null;
}
String strLowerCase = str.toLowerCase();
int i = strLowerCase.indexOf(cutStr);
int j;
if (i != -1) {
line = str.toCharArray();
buf.setLength(str.length());
buf.append(line, 0, i);
i += cutLength;
j = i;
i = strLowerCase.indexOf(cutStr, i);
while (i != -1) {
buf.append(line, j, i - j);
i += cutLength;
j = i;
i = strLowerCase.indexOf(cutStr, i);
}
buf.append(line, j, line.length - j);
str = buf.toString();
buf.setLength(0);
}
return str;
}

/**
* 得到应用该方法的类和方法
*
* @return
*/
public String getTrueMethod() {
trueMethodName = null;
try {
b = a[4];
} catch (ArrayIndexOutOfBoundsException aioobe) {
// jdk 1.3
/*
aioobe.printStackTrace(out);
out.flush();
e = sw.toString();
try {
out.close();
sw.close();
} catch (IOException e) {
// Do nothing, this should not happen as it is StringWriter.
}
out = null;
sw = null;
boolean logError = false;
int pos = e.indexOf("at ");
for (int i = 0; i < 3; i++) {
if (pos == -1) {
logError = true;
break;
}
e = e.substring(pos + 3, e.length());
pos = e.indexOf("at ");
}
if (logError) {
trueMethodName = "UnknownClass.unknownMethod()";
} else {
trueMethodName = e.substring(0, e.indexOf('('));
}
*/

// for jdk 1.4

elements = aioobe.getStackTrace();
if (elements.length < 3) {
return "UnknownClass.unknownMethod()";
}
trueMethodName = elements[2].getClassName() + "." + elements[2].getMethodName();

}
return trueMethodName;
}

public String getMethod() {
return methodName;
}

public String getMethodExTest() {
methodNameExTest = cutTestStr(getTrueMethod());
int index = methodNameExTest.lastIndexOf('.');
methodNameExTest =
methodNameExTest.substring(0, index + 1)
+ methodNameExTest.substring(index + 1, index + 2).toLowerCase()
+ methodNameExTest.substring(index + 2, methodNameExTest.length());
return methodNameExTest;
}
}


/********测试类*************/

public class DbUtil {
static MethodTrace methodTrace = new MethodTrace();

/**
* 得到连接-oracle
*
* @param url jdbc:oracle:thin:@server:1521:oracle
* @param user
* @param password
* @return
*/
public static Connection getOracleConnection(String url, String user, String password) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
System.out.println("-----------get---"+methodTrace.getTrueMethod());
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
return DriverManager.getConnection(url, user, password);
}

/**
* 关闭连接-oracle
*
* @param conn
*/
public static void closeOracleConnection(Connection conn) {
System.out.println("-----------close--"+methodTrace.getTrueMethod());
System.out.println("--closeOracleConnection()");
if (conn != null) {
try {
conn.commit();
} catch (Exception e) {
System.out.println("error:db.closeOracleConnection().commit();");
}
try {
conn.close();
} catch (Exception e) {
System.out.println("error:db.closeOracleConnection().close();");
}
conn = null;
}
}
/*********测试方法*********/
public void test() {
DbUtil db = new DbUtil();
Connection conn = null;
try {
conn = db.getOracleConnection("jdbc:oracle:thin:@server:1521:oracle", "bsecp", "manager");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from t_sys_user");
while (rs.next()) {
System.out.println("---1---" + rs.getString(1));
System.out.println("---2---" + rs.getString(2));
}
rs.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.closeOracleConnection(conn);
}
}

public static void main(String[] args) {
DbUtil d = new DbUtil();
d.test();
DbUtil.getCaller();
}
}

执行 d.test()后,将可以看到谁掉用了DbUtil 的getOracleConnection()方法和closeOracleConnection()方法。

Prometheus & Kubernetes

参考 prometheus.io 用 Prometheus 来监控你的 Kubernetes 集群 Prometheus监控实践:Kubernetes集群监控 Kubernetes使用Prom...
  • chen517611641
  • chen517611641
  • 2018年01月24日 09:33
  • 91

如何监控 Tomcat?Zabbix 与 Cloud Insight 对比

JVM 监控工具有很多,像命令 jstat,jmap,jstack,jinfo 可以根据不同需求查看不同的系统信息,还有图像化界面 jconsole,都是很方便的工具。这些可以参考 JAVA自带监控工...
  • wangpeng198688
  • wangpeng198688
  • 2016年01月25日 11:57
  • 937

Prometheus 通过consul动态修改Targets接入

Prometheus 通过consul动态修改Targets接入通常Prometheus 要增加一个target,需要在配置文件中已添加一个job,例如下:- job_name: 'prometheu...
  • poorCoder_
  • poorCoder_
  • 2018年01月21日 14:37
  • 248

Prometheus 实战于源码分析之服务启动

在之前的铺垫后下面进行prometheus的源码分析,首先要看的是服务启动。在cmd/prometheus/main.go中main方法,由于太长了,所以这里分段解说一下: 先是启动本地存储 ...
  • u010278923
  • u010278923
  • 2017年04月28日 15:36
  • 10301

devops监控

参考:EAWorld:监控 前言 随着Devops、云计算、微服务、容器等理念的逐步落地和大力发展,机器越来越多,应用越来越多,服务越来越微,应用运行基础环境越来多样化,容器、虚拟机、物理机不一...
  • sokril
  • sokril
  • 2017年11月17日 16:19
  • 174

Tomcat+Servlet搭建Java Web项目

这是一篇介绍java建站的文章。简单介绍Java Web项目中服务端的基本流程,并在Eclipse中集成tomcat,利用Servlet技术搭建了一个web项目的原型。...
  • hfut_wowo
  • hfut_wowo
  • 2017年03月01日 17:30
  • 833

Prometheus采集用的exporter

在prometheus的官网上https://prometheus.io/download/ 可以下载到很多服务的exporter采集器: blackbox_exporter consul_ex...
  • felix_yujing
  • felix_yujing
  • 2017年07月20日 18:28
  • 1432

linux后台系统

[荐] 分布式跟踪系统 Zipkin Zipkin 是 Twitter 的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口。 该系统让开发者可通过一个 Web 前端...
  • fishmai
  • fishmai
  • 2016年07月04日 14:18
  • 4639

查看JMX Exporter中的日志

查看JMX Exporter中的日志原文:Viewing Logs for the JMX Exporter | Robust Perception Brian Brazil August 19, 2...
  • sinkou
  • sinkou
  • 2017年08月02日 18:01
  • 302

Prometheus监控工具初使用

之前听别人说使用Prometheus做监控,最近自己也在测试环境试用了一下。目前总的体会是安装简单方便,不需要额外的数据库服务;yaml格式的配置文件,简单易读;提供的采集用的exporter是二进制...
  • felix_yujing
  • felix_yujing
  • 2017年07月20日 18:58
  • 3252
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的调用监控(原创)
举报原因:
原因补充:

(最多只允许输入30个字)