Browse Source

新增hibernate拦截和zuul拦截

chenweida 6 years ago
parent
commit
a961df68e0

+ 12 - 0
admin/admin-client-starter/pom.xml

@ -43,6 +43,18 @@
            <groupId>net.sf.json-lib</groupId>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <artifactId>json-lib</artifactId>
        </dependency>
        </dependency>
        <dependency>
            <groupId>com.netflix.zuul</groupId>
            <artifactId>zuul-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>
    </dependencies>
    </dependencies>

+ 64 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HibernateFilter.java

@ -0,0 +1,64 @@
package com.yihu.admin.client.advice;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.websocket.event.SQLTimeEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
public class HibernateFilter extends EmptyInterceptor {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    private ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
    private ThreadLocal<String> sqlThreadLocal = new ThreadLocal<>();
    @Override
    public String onPrepareStatement(String sql) {
        sqlThreadLocal.set(sql);
        return sql;
    }
    @Override
    public void afterTransactionBegin(Transaction tx) {
        startTimeThreadLocal.set(new Date().getTime());
    }
    @Override
    public void afterTransactionCompletion(Transaction tx) {
        if (adminClientProperties.getHibernateSql()) {
            Long endTime = new Date().getTime();
            SQLTimeEvent event = new SQLTimeEvent();
            //用改变后的参数执行目标方法
            event.setSql(sqlThreadLocal.get());
            Long startTime = System.currentTimeMillis();
            event.setEventStartTime(startTimeThreadLocal.get());
            event.setEventEndTime(endTime);
            event.setEventName("system_sql_tracer");
            event.setExcuteTime(endTime - startTime);
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setSuccess(1);
            simpleEventSender.send(event);
        }
    }
}

+ 6 - 8
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HttpAdvice.java

@ -46,17 +46,16 @@ public class HttpAdvice {
    private String spanrName;
    private String spanrName;
    private Logger logger = LoggerFactory.getLogger(HttpAdvice.class);
    private Logger logger = LoggerFactory.getLogger(HttpAdvice.class);
    private final String eventName = "sqlMonitor;";
    private List<RequestToMethodItem> getURL = new ArrayList<>();
    private List<RequestToMethodItem> postURL = new ArrayList<>();
    private List<RequestToMethodItem> putURL = new ArrayList<>();
    private List<RequestToMethodItem> deleteURL = new ArrayList<>();
    private static List<RequestToMethodItem> getURL = new ArrayList<>();
    private static List<RequestToMethodItem> postURL = new ArrayList<>();
    private static List<RequestToMethodItem> putURL = new ArrayList<>();
    private static List<RequestToMethodItem> deleteURL = new ArrayList<>();
    @Autowired
    @Autowired
    private SpringUtil springUtill;
    private SpringUtil springUtill;
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
    private static AntPathMatcher antPathMatcher = new AntPathMatcher();
    /**
    /**
     * 初始化路径
     * 初始化路径
@ -112,7 +111,6 @@ public class HttpAdvice {
        }
        }
        HttpEvent event = new HttpEvent();
        HttpEvent event = new HttpEvent();
        event.setSpanName(spanrName);
        event.setSpanName(spanrName);
        event.setEventName(eventName);
        HttpServletRequest request = null;
        HttpServletRequest request = null;
        if (RequestContextHolder.getRequestAttributes() != null) {
        if (RequestContextHolder.getRequestAttributes() != null) {
            request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -173,7 +171,7 @@ public class HttpAdvice {
    }
    }
    private String matchURI(HttpServletRequest request) {
    public static String matchURI(HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        String requestURI = request.getRequestURI();
        String method = request.getMethod();
        String method = request.getMethod();
        List<RequestToMethodItem> urls = null;
        List<RequestToMethodItem> urls = null;

+ 93 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/ZuulPostFilter.java

@ -0,0 +1,93 @@
package com.yihu.admin.client.advice;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.util.NetworkUtil;
import com.yihu.admin.client.websocket.event.HttpEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
public class ZuulPostFilter extends ZuulFilter {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "post";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        return adminClientProperties.getZuulPost();
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            HttpEvent event = new HttpEvent();
            Long startTime = System.currentTimeMillis();
            String ip = NetworkUtil.getIpAddress(request);
            JSONObject headerObj = new JSONObject();
            Enumeration<String> headers = request.getHeaderNames();
            while (headers.hasMoreElements()) {
                String value = headers.nextElement();
                headerObj.put(value, request.getHeader(value));
            }
            event.setHeader(headerObj.toString());
            event.setEventStartTime(startTime);
            event.setEventEndTime(startTime);
            event.setExcuteTime(0L);
            event.setHeader(headerObj.toString());
            event.setEventName("system_http_tracer");
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
            event.setSuccess(1);
            event.setUri(HttpAdvice.matchURI(request));
            event.setIp(ip);
            event.setMethod(request.getMethod());
            simpleEventSender.send(event);
        } catch (Exception e) {
        }
        HttpServletResponse response = ctx.getResponse();
        return response;
    }
}

+ 93 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/ZuulPreFilter.java

@ -0,0 +1,93 @@
package com.yihu.admin.client.advice;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.util.NetworkUtil;
import com.yihu.admin.client.websocket.event.HttpEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
public class ZuulPreFilter extends ZuulFilter {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "pre";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        return adminClientProperties.getZuulPre();
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            HttpEvent event = new HttpEvent();
            Long startTime = System.currentTimeMillis();
            String ip = NetworkUtil.getIpAddress(request);
            JSONObject headerObj = new JSONObject();
            Enumeration<String> headers = request.getHeaderNames();
            while (headers.hasMoreElements()) {
                String value = headers.nextElement();
                headerObj.put(value, request.getHeader(value));
            }
            event.setHeader(headerObj.toString());
            event.setEventStartTime(startTime);
            event.setEventEndTime(startTime);
            event.setExcuteTime(0L);
            event.setHeader(headerObj.toString());
            event.setEventName("system_http_tracer");
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
            event.setSuccess(1);
            event.setUri(HttpAdvice.matchURI(request));
            event.setIp(ip);
            event.setMethod(request.getMethod());
            simpleEventSender.send(event);
        } catch (Exception e) {
        }
        HttpServletResponse response = ctx.getResponse();
        return response;
    }
}

+ 48 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/HibernateAutoConfig.java

@ -0,0 +1,48 @@
package com.yihu.admin.client.config;
import com.yihu.admin.client.advice.HibernateFilter;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.jta.JtaTransactionManager;
import javax.sql.DataSource;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Configuration
//@ConditionalOnClass(
//        value = {
//                javax.sql.DataSource.class,
//                org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.class,
//                org.springframework.transaction.jta.JtaTransactionManager.class,
//                org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers.class
//        }
//)
@ConditionalOnProperty(name = "yihu.admin.client.advice.hibernateSql", havingValue = "true")
public class HibernateAutoConfig extends HibernateJpaAutoConfiguration {
    public HibernateAutoConfig(
            DataSource dataSource,
            JpaProperties jpaProperties,
            ObjectProvider<JtaTransactionManager> jtaTransactionManager,
            ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
        super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers);
    }
    @Autowired
    private HibernateFilter hibernateFilter;
    @Override
    protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
        vendorProperties.put("hibernate.ejb.interceptor", hibernateFilter);
        super.customizeVendorProperties(vendorProperties);
    }
}

+ 15 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/WebsocketConfig.java

@ -1,11 +1,23 @@
package com.yihu.admin.client.config;
package com.yihu.admin.client.config;
import com.yihu.admin.client.advice.HibernateFilter;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.websocket.SocketClient;
import com.yihu.admin.client.websocket.SocketClient;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.hibernate.EmptyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import javax.sql.DataSource;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
/**
 * Created by chenweida on 2018/5/22 0022.1
 * Created by chenweida on 2018/5/22 0022.1
@ -20,9 +32,12 @@ import org.springframework.context.annotation.Configuration;
public class WebsocketConfig {
public class WebsocketConfig {
    @Autowired
    @Autowired
    SocketClient socketClient;
    SocketClient socketClient;
    @Autowired
    private HibernateFilter hibernateFilter;
    @Bean
    @Bean
    public SimpleEventSender simpleEventSender() {
    public SimpleEventSender simpleEventSender() {
        return new SimpleEventSender(socketClient.getCurrentClient());
        return new SimpleEventSender(socketClient.getCurrentClient());
    }
    }
}
}

+ 30 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/properties/AdminClientProperties.java

@ -14,6 +14,12 @@ public class AdminClientProperties {
    private Integer port;//port
    private Integer port;//port
    @Value("${yihu.admin.client.advice.sql:false}")
    @Value("${yihu.admin.client.advice.sql:false}")
    private Boolean sql;//port
    private Boolean sql;//port
    @Value("${yihu.admin.client.advice.hibernateSql:false}")
    private Boolean hibernateSql;//port
    @Value("${yihu.admin.client.advice.zuul.pre:false}")
    private Boolean zuulPre;//port
    @Value("${yihu.admin.client.advice.zuul.post:false}")
    private Boolean zuulPost;//port
    @Value("${yihu.admin.client.advice.http:true}")
    @Value("${yihu.admin.client.advice.http:true}")
    private Boolean http;//port
    private Boolean http;//port
@ -48,4 +54,28 @@ public class AdminClientProperties {
    public void setHttp(Boolean http) {
    public void setHttp(Boolean http) {
        this.http = http;
        this.http = http;
    }
    }
    public Boolean getZuulPre() {
        return zuulPre;
    }
    public void setZuulPre(Boolean zuulPre) {
        this.zuulPre = zuulPre;
    }
    public Boolean getZuulPost() {
        return zuulPost;
    }
    public void setZuulPost(Boolean zuulPost) {
        this.zuulPost = zuulPost;
    }
    public Boolean getHibernateSql() {
        return hibernateSql;
    }
    public void setHibernateSql(Boolean hibernateSql) {
        this.hibernateSql = hibernateSql;
    }
}
}

+ 6 - 2
demo/demo-socket-client/src/main/resources/application.yml

@ -15,8 +15,12 @@ yihu:
  admin:
  admin:
    client:
    client:
      advice:
      advice:
        sql: true
        http: true
        sql: true #默认false
        http: true #默认true
        hibernateSql: true #默认false
        zuul:
          pre: true #默认false
          post: true #默认false
      server:
      server:
        ip: 192.168.131.102
        ip: 192.168.131.102
        port: 8082
        port: 8082