Skip to content

Instantly share code, notes, and snippets.

@yangl
Last active January 12, 2017 03:48
Show Gist options
  • Save yangl/6247684 to your computer and use it in GitHub Desktop.
Save yangl/6247684 to your computer and use it in GitHub Desktop.
UmpLog切面,不用侵入代码一个一个的添加UMP监控。注意:如果把spring mvc的Controller 作为切入点,下边的xml配置必须和springmvc-servlet.xml放一起,不然不起作用!!!
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
default-autowire="byName">
<bean id="umpLogAspect" class="com.jd.buy.giftshop.shared.utils.aspect.UmpLogAspect">
<!-- 调用方法最大时间(毫秒),超过则记录之 -->
<property name="maxExecTime" value="1000"/>
<!-- UMP总开关 -->
<property name="enable" value="true"/>
<!-- UMP系统中注册的key,自动注册系统心跳`system`.heart及jvm监控`system`.jvm-->
<property name="system" value="gift-trade"/>
<property name="umpMaps">
<map>
<!-- 注册key组合:`system`.`value`.`methodName` -->
<entry key="com.jd.buy.giftshop.trade.web.balance.BalanceAction" value="balance"/>
<entry key="com.jd.buy.giftshop.trade.web.consignee.ConsigneeAction" value="consignee"/>
<entry key="com.jd.buy.giftshop.trade.web.coupon.CouponAction" value="coupon"/>
<entry key="com.jd.buy.giftshop.trade.web.giftcard.GiftCardAction" value="giftcard"/>
<entry key="com.jd.buy.giftshop.trade.web.invoice.InvoiceAction" value="invoice"/>
<entry key="com.jd.buy.giftshop.trade.web.order.OrderAction" value="order"/>
<entry key="com.jd.buy.giftshop.trade.web.payandship.PayAndShipAction" value="payandship"/>
</map>
</property>
<!-- 方法白名单列表,以get,set开头的方法但又想监控的就加到该列表-->
<property name="whiteMethod">
<set>
<value>getCurrentCartNew</value>
</set>
</property>
</bean>
<aop:config>
<aop:aspect ref="umpLogAspect">
<aop:pointcut id="umpLogPointcut"
expression="execution(public * com.jd.buy.giftshop.trade.web.*.*Action.*(..))"/>
<aop:around pointcut-ref="umpLogPointcut" method="execUmpLog"/>
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
package com.jd.buy.giftshop.shared.utils.aspect;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jd.buy.giftshop.shared.utils.mapper.JsonMapper;
import com.jd.ump.profiler.CallerInfo;
import com.jd.ump.profiler.proxy.Profiler;
/**
* UmpLog切面
*
* 注意:如果把spring mvc的Controller
* 作为切入点,下边的xml配置必须和springmvc-servlet.xml放一起,不然不起作用!!!
*
* @author YANGLiiN
* @date 13-8-15 上午11:11
*/
// implements InitializingBean
public class UmpLogAspect {
private static final Logger logger = LoggerFactory.getLogger(UmpLogAspect.class);
private JsonMapper jsonMapper = new JsonMapper();
private boolean enable = true;
private String system;
private int maxExecTime = 1000;
private Map<String, String> umpMaps = new HashMap<String, String>();
private Set<String> whiteMethod = new HashSet<String>();
public Object execUmpLog(ProceedingJoinPoint jp) throws Throwable {
MethodSignature ms = (MethodSignature) jp.getSignature();
String className = jp.getTarget().getClass().getName();
String methodName = ms.getName();
CallerInfo callerInfo = null;
Object rs = null;
long start;
try {
if (enable) {
if ((!methodName.startsWith("get") && !methodName.startsWith("set"))
|| whiteMethod.contains(methodName)) {
String umpLogKey = umpMaps.get(className);
if (umpLogKey != null && !"".equals(umpLogKey)) {
StringBuilder sb = new StringBuilder(system).append(".")
.append(umpLogKey)
.append(".")
.append(methodName);
String jproKey = sb.toString();
callerInfo = Profiler.registerInfo(jproKey, false, true);
}
}
}
start = System.currentTimeMillis();
rs = jp.proceed();
long time = System.currentTimeMillis() - start;
if (time > maxExecTime) {
logger.info("***调用【{}】方法执行耗时【{}ms】***", className
+ "."
+ methodName, time);
}
}
catch (Throwable e) {
if (callerInfo != null) {
Profiler.functionError(callerInfo);
}
logger.error("***参数列表【{}】,执行结果【{}】,异常堆栈【{}】***",
jsonMapper.toJson(jp.getArgs()),
jsonMapper.toJson(rs),
e);
throw e;
}
if (callerInfo != null) {
Profiler.registerInfoEnd(callerInfo);
}
return rs;
}
@PostConstruct
public void afterPropertiesSet() throws Exception {
if (enable) {
Profiler.InitHeartBeats(system + ".heart");
Profiler.registerJVMInfo(system + ".jvm");
}
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public void setMaxExecTime(int maxExecTime) {
this.maxExecTime = maxExecTime;
}
public void setSystem(String system) {
this.system = system;
}
public void setUmpMaps(Map<String, String> umpMaps) {
this.umpMaps = umpMaps;
}
public void setWhiteMethod(Set<String> whiteMethod) {
this.whiteMethod = whiteMethod;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment