package com.dianping.pigeon.remoting.provider.process.filter; import com.dianping.pigeon.remoting.common.monitor.trace.ProviderMonitorData; import com.dianping.pigeon.remoting.common.domain.InvocationRequest; import com.dianping.pigeon.remoting.common.domain.InvocationResponse; import com.dianping.pigeon.remoting.common.process.ServiceInvocationFilter; import com.dianping.pigeon.remoting.common.process.ServiceInvocationHandler; import com.dianping.pigeon.remoting.provider.domain.ProviderContext; /** * @author qi.yin * 2016/11/14 下午5:45. */ public class TraceFilter implements ServiceInvocationFilter<ProviderContext> { public TraceFilter() { } @Override public InvocationResponse invoke(ServiceInvocationHandler handler, ProviderContext invocationContext) throws Throwable { InvocationRequest request = invocationContext.getRequest(); ProviderMonitorData monitorData = (ProviderMonitorData) invocationContext.getMonitorData(); if (monitorData == null) { return handler.handle(invocationContext); } monitorData.trace(); monitorData.setCallType((byte) request.getCallType()); monitorData.setSerialize(request.getSerialize()); monitorData.setTimeout(request.getTimeout()); monitorData.add(); InvocationResponse response = null; try { response = handler.handle(invocationContext); } finally { if (invocationContext.getFrameworkError() != null) { monitorData.setIsSuccess(false); } else { monitorData.setIsSuccess(true); } monitorData.complete(); } return response; } }