ソースを参照

Merge branch 'dev' of chenweida/jkzl-starter into dev

chenweida 6 年 前
コミット
db552dad51

+ 37 - 7
admin/admin-server-starter/src/main/java/com/yihu/admin/server/log/LogEndPoint.java

@ -69,16 +69,18 @@ public class LogEndPoint {
            @RequestParam(value = "spanname", required = false) String spanname,
            @RequestParam(value = "time", required = false) Integer time,  // GET POST DELETE PUT
            @RequestParam(value = "eventname", required = false) String eventname,
            @RequestParam(value = "uri", required = false) String uri
            @RequestParam(value = "method", required = false) String method,
            @RequestParam(value = "uri", required = false) String uri,
            @RequestParam(value = "sort", required = false) String sort
    ) {
        if (!StringUtils.isEmpty(spanname)) {
            spanname = spanname.toLowerCase();
        }
        List<LogModel> logs = new ArrayList<>();
        StringBuffer sql = new StringBuffer("SELECT * FROM " + adminServerProperties.getDefaultIndexName());
        StringBuffer whereSQL = initWhere(traceId, spanname, eventname, time, uri);
        StringBuffer whereSQL = initWhere(traceId, spanname, eventname, time, uri, method);
        StringBuffer groupBY = new StringBuffer("order by eventstarttime asc");
        StringBuffer groupBY = new StringBuffer("order by eventstarttime "+sort);
        String finalSQL = sql.append(whereSQL).append(groupBY).toString();
@ -139,7 +141,7 @@ public class LogEndPoint {
        return logs;
    }
    private StringBuffer initWhere(String traceId, String spanname, String eventname, Integer time, String uri) {
    private StringBuffer initWhere(String traceId, String spanname, String eventname, Integer time, String uri, String method) {
        StringBuffer whereSQL = new StringBuffer();
        Map<String, Object> params = new HashMap<>();
        if (!StringUtils.isEmpty(traceId)) {
@ -154,6 +156,9 @@ public class LogEndPoint {
        if (!StringUtils.isEmpty(uri)) {
            params.put("uri", uri);
        }
        if (!StringUtils.isEmpty(method)) {
            params.put("method", method);
        }
        if (time != null && time > 0) {
            params.put("time", time);
        }
@ -173,8 +178,8 @@ public class LogEndPoint {
        return whereSQL;
    }
    @GetMapping("spanNamelist")
    public List<QuotaModel> spanNamelist(
    @GetMapping("spanNameHttplist")
    public List<QuotaModel> spanNameHttplist(
            @RequestParam(value = "spanname", required = true) String spanname) {
        spanname = spanname.toLowerCase();
        List<QuotaModel> logs = new ArrayList<>();
@ -194,11 +199,36 @@ public class LogEndPoint {
                    quotaModel.setAvgtime(Double.valueOf(one.get("avgtime").toString()));
                    quotaModel.setMaxtime(Double.valueOf(one.get("maxtime").toString()).intValue());
                    BeanUtils.copyProperties(one, quotaModel);
                    logs.add(quotaModel);
                }
            }
        }
        return logs;
    }
    @GetMapping("spanNameSQLlist")
    public List<QuotaSQLModel> spanNameSQLlist(
            @RequestParam(value = "spanname", required = true) String spanname) {
        spanname = spanname.toLowerCase();
        List<QuotaSQLModel> logs = new ArrayList<>();
        StringBuffer sql = new StringBuffer("SELECT sql,excutetime,eventstarttime FROM  " + adminServerProperties.getDefaultIndexName() + " " +
                " where spanname ='" + spanname + "' and eventname='system_sql_tracer' and eventtime>1500 ");
        List<Map<String, Object>> traceidList = elastricSearchHelper.excuceSQL(sql.toString());
        if (traceidList.size() > 0) {
            for (Map<String, Object> one : traceidList) {
                if (one.size() > 0) {
                    QuotaSQLModel quotaSQLModel = new QuotaSQLModel();
                    quotaSQLModel.setSql(one.get("sql").toString());
                    quotaSQLModel.setExcutetime(Double.valueOf(one.get("excutetime").toString()).intValue());
                    if (one.containsKey("eventstarttime") && one.get("eventstarttime") != null) {
                        Long startTime = (Long) one.get("eventstarttime");
                        quotaSQLModel.setEventstarttime(startTime);
                        quotaSQLModel.setEventstarttimestr(DateUtil.dateToStr(new Date(startTime), DateUtil.YYYY_MM_DD_HH_MM_SS_SSS));
                    }
                    logs.add(quotaSQLModel);
                }
            }
        }
        return logs;
    }
}

+ 44 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/log/QuotaSQLModel.java

@ -0,0 +1,44 @@
package com.yihu.admin.server.log;
/**
 * Created by chenweida on 2018/5/24 0024.1
 */
public class QuotaSQLModel {
    private String sql;
    private Integer excutetime;
    private Long eventstarttime;
    private String eventstarttimestr;
    public String getSql() {
        return sql;
    }
    public void setSql(String sql) {
        this.sql = sql;
    }
    public Integer getExcutetime() {
        return excutetime;
    }
    public void setExcutetime(Integer excutetime) {
        this.excutetime = excutetime;
    }
    public Long getEventstarttime() {
        return eventstarttime;
    }
    public void setEventstarttime(Long eventstarttime) {
        this.eventstarttime = eventstarttime;
    }
    public String getEventstarttimestr() {
        return eventstarttimestr;
    }
    public void setEventstarttimestr(String eventstarttimestr) {
        this.eventstarttimestr = eventstarttimestr;
    }
}

+ 8 - 0
admin/admin-server-ui-starter/src/main/resources/admin/index/index.html

@ -74,6 +74,14 @@
                                </li>
                            </ul>
                        </li>
                        <li>
                            <a href="#">微服务SQL统计分析 <span class="fa arrow"></span></a>
                            <ul class="nav nav-third-level">
                                <li v-for="log in logs">
                                    <a class="J_menuItem" :href="'../log/html/spanSQLQuota.html?appName='+log.appName" >{{log.appName}}</a>
                                </li>
                            </ul>
                        </li>
                        <li>
                            <a class="J_menuItem" href="../log/html/distributedLog.html" >分布式链路追踪</a>
                        </li>

+ 32 - 8
admin/admin-server-ui-starter/src/main/resources/admin/log/html/distributedLogDetail.html

@ -27,20 +27,44 @@
        <div id="vertical-timeline" class="vertical-container light-timeline"
             v-for="message in messages">
            <div class="vertical-timeline-block" onclick="closeOrOpen(this)">
                <div class="vertical-timeline-icon navy-bg">
                    <i class="fa fa-briefcase"></i>
                </div>
            <div class="vertical-timeline-block">
                <template v-if="message.method != null && message.method === 'GET'" >
                    <div class="vertical-timeline-icon blue-bg" onclick="closeOrOpen(this)">
                        <i class="fa fa-briefcase"></i>
                    </div>
                </template>
                <template v-if="message.method != null && message.method === 'POST'">
                    <div class="vertical-timeline-icon lazur-bg"  onclick="closeOrOpen(this)">
                        <i class="fa fa-briefcase"></i>
                    </div>
                </template>
                <template v-if="message.method != null && message.method === 'PUT'">
                    <div class="vertical-timeline-icon yellow-bg" onclick="closeOrOpen(this)">
                        <i class="fa fa-briefcase"></i>
                    </div>
                </template>
                <template v-if="message.method != null && message.method === 'DELETE'">
                    <div class="vertical-timeline-icon red-bg" onclick="closeOrOpen(this)">
                        <i class="fa fa-briefcase"></i>
                    </div>
                </template>
                <template v-if="message.method == null ">
                    <div class="vertical-timeline-icon gray-bg" onclick="closeOrOpen(this)">
                        <i class="fa fa-briefcase"></i>
                    </div>
                </template>
                <div class="vertical-timeline-content">
                    <h2>微服务名称:{{message.spanname}}</h2>
                    <p>事件名称:{{message.eventname}}</p>
                    <div    style="display: none">                                                                                                                                                                                                                                                                                                W  id="close_or_open"  style="display: none">
                    <div style="display: none">
                        <p>流程ID:{{message.traceid}}</p>
                        <p>模块ID:{{message.spanid}}</p>
                        <p>事件开始时间:{{message.eventstartstr}}</p>
                        <p>事件结束时间:{{message.eventendstr}}</p>
                        <p>事件开始时间:{{message.eventstarttimestr}}</p>
                        <p>事件结束时间:{{message.eventendtimestr}}</p>
                        <p>事件执行时间:{{message.excutetime}} ms</p>
                        <template v-if="message.eventname === 'system_http_tracer'">
                            <p>请求用户IP地址:{{message.ip}}</p>
@ -50,7 +74,7 @@
                            <p>请求参数:{{message.requestparams}}</p>
                            <p>返回参数:{{message.responseparams}}</p>
                        </template>
                        <template v-if="message.eventname === 'system_sql_tracer'">
                        <template v-else-if="message.eventname === 'system_sql_tracer'">
                            <p>sql语句:{{message.sql}}</p>
                        </template>
                    </div>

+ 35 - 6
admin/admin-server-ui-starter/src/main/resources/admin/log/html/spanLog.html

@ -50,6 +50,18 @@
                                <label class="control-label col-sm-2">时间:</label>
                                <input type="text" placeholder="耗费时间大于(?)毫秒" id="spanLog_time_search" class="form-control col-sm-2">
                            </div>
                            <!--<div class="form-group col-sm-4 ">-->
                                <!--<label class="control-label col-sm-2">请求方式:</label>-->
                                <!--<div class="input-group">-->
                                    <!--<select data-placeholder="请求方式..." class="chosen-select  col-sm-2" style="width:350px;" tabindex="2">-->
                                        <!--<option value="">请求方式</option>-->
                                        <!--<option value="GET" hassubinfo="true">GET</option>-->
                                        <!--<option value="POST" hassubinfo="true">POST</option>-->
                                        <!--<option value="DELETE" hassubinfo="true">DELETE</option>-->
                                        <!--<option value="PUT" hassubinfo="true">PUT</option>-->
                                    <!--</select>-->
                                <!--</div>-->
                            <!--</div>-->
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4 col-sm-offset-2">
@ -67,15 +79,33 @@
        <div class="" id="ibox-content-log-detail">
            <div id="vertical-timeline" class="vertical-container light-timeline" v-for="message in messages">
                <div class="vertical-timeline-block" onclick="closeOrOpen(this)">
                    <div class="vertical-timeline-icon navy-bg">
                        <i class="fa fa-briefcase"></i>
                    </div>
                    <template v-if="message.method === 'GET'">
                        <div class="vertical-timeline-icon blue-bg" onclick="closeOrOpen(this)">
                            <i class="fa fa-briefcase"></i>
                        </div>
                    </template>
                    <template v-if="message.method === 'POST'">
                        <div class="vertical-timeline-icon lazur-bg" onclick="closeOrOpen(this)">
                            <i class="fa fa-briefcase"></i>
                        </div>
                    </template>
                    <template v-if="message.method === 'PUT'">
                        <div class="vertical-timeline-icon yellow-bg"onclick="closeOrOpen(this)">
                            <i class="fa fa-briefcase"></i>
                        </div>
                    </template>
                    <template v-if="message.method === 'DELETE'">
                        <div class="vertical-timeline-icon red-bg"onclick="closeOrOpen(this)">
                            <i class="fa fa-briefcase"></i>
                        </div>
                    </template>
                    <div class="vertical-timeline-content">
                        <h2>请求路径:{{message.uri}}</h2>
                        <div   style="display: none">
                        <p>事件开始时间:{{message.eventstarttimestr}}</p>
                        <div style="display: none">
                            <p>请求用户IP地址:   {{message.ip}}</p>
                            <p>请求方式:   {{message.method}}</p>
                            <p>请求头信息:   {{message.header}}</p>
@ -90,7 +120,6 @@
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

+ 48 - 0
admin/admin-server-ui-starter/src/main/resources/admin/log/html/spanSQLQuota.html

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="../../common/css/bootstrap/bootstrap.min.css?v=3.4.0" rel="stylesheet">
    <link href="../../common/css/bootstrap/font-awesome.min.css?v=4.3.0" rel="stylesheet">
    <link href="../../common/css/bootstrap/animate.min.css" rel="stylesheet">
    <link href="../../common/css/bootstrap/style.min.css?v=3.0.0" rel="stylesheet">
    <!-- Data Tables -->
    <link href="../../common/css/bootstrap/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet">
    <link href="../../common/css/jw.css" rel="stylesheet">
</head>
<body class="gray-bg">
<div class="ibox-content">
    <div class="" id="ibox-content-jqGrid_wrapper">
        <div class="jqGrid_wrapper">
            <table id="table_list_1"></table>
            <!--<div id="pager_list_1"></div>-->
        </div>
    </div>
</div>
<!-- 全局js -->
<script type="text/javascript" src="../../common/js/jquery/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="../../common/js/bootstrap/bootstrap.min.js"></script>
<script  type="text/javascript"src="../../common/js/content.min.js?v=1.0.0"></script>
<script type="text/javascript" src="../../common/js/layer/layer.min.js"></script>
<script type="text/javascript" src="../../common/js/plugins/iCheck/icheck.min.js"></script>
<script type="text/javascript" src="../../common/js/vue/vue.min.js"></script>
<script type="text/javascript" src="../../common/js/util/util.js"></script>
<script type="text/javascript" src="../../common/js/common.js"></script>
<script src="../../common/js/plugins/jqgrid/i18n/grid.locale-cn.js_0820"></script>
<script src="../../common/js/plugins/jqgrid/jquery.jqGrid.min.js_0820"></script>
<script type="text/javascript" src="../js/spanSQLQuota.js"></script>
</body>
</html>

+ 4 - 2
admin/admin-server-ui-starter/src/main/resources/admin/log/js/distributedLogDetail.js

@ -1,4 +1,5 @@
var traceId = GetRequest().traceId.replace("?v","");
var sort="asc"
var contentLogDetail = new Vue({
    el: '#ibox-content-log-detail',
    data: {
@ -8,7 +9,8 @@ var contentLogDetail = new Vue({
do_get(
    server + "admin_log/tracelist",
    {
        traceId: traceId
        traceId: traceId,
        sort:sort
    },
    function (data) {
        contentLogDetail.messages = data
@ -18,6 +20,6 @@ do_get(
    }
)
function closeOrOpen(div){
    var childDiv= $($($(div).children("div")[1]).children("div")[0]);
    var childDiv= $($($($(div).parent()).children("div")[1]).children("div")[0]);
    childDiv.toggle(1000);
}

+ 5 - 2
admin/admin-server-ui-starter/src/main/resources/admin/log/js/spanLog.js

@ -1,6 +1,7 @@
var appName = GetRequest().appName.replace("?v","");
var page = 0
var pageSize = 20
var sort="desc"
var contentLogDetail = new Vue({
    el: '#ibox-content-log-detail',
    data: {
@ -11,7 +12,8 @@ do_get(
    server + "admin_log/tracelist",
    {
        spanname: appName,
        eventname:"system_http_tracer"
        eventname:"system_http_tracer",
        sort:sort
    },
    function (data) {
        contentLogDetail.messages = data
@ -27,6 +29,7 @@ function searchSpanLog() {
            page: page,
            pageSize: pageSize,
            spanname: appName,
            sort:sort,
            eventname:"system_http_tracer",
            uri: $("#spanLog_search_url").val()?$("#spanLog_search_url").val():"",
            time:$("#spanLog_time_search").val()?$("#spanLog_time_search").val():0
@ -46,6 +49,6 @@ function clearSpanLog() {
}
function closeOrOpen(div){
    var childDiv= $($($(div).children("div")[1]).children("div")[0]);
    var childDiv= $($($($(div).parent()).children("div")[1]).children("div")[0]);
    childDiv.toggle(1000);
}

+ 1 - 1
admin/admin-server-ui-starter/src/main/resources/admin/log/js/spanQuota.js

@ -3,7 +3,7 @@ var appName = GetRequest().appName.replace("?v", "");
$.jgrid.defaults.styleUI = "Bootstrap";
//SELECT sum(success) success,sum(fail) fail,avg(excutetime) avgtime ,max(excutetime) maxtime ,count(*) allcount FROM  admin_log where spanname ="demo-socket-client" group by  uri
$("#table_list_1").jqGrid({
    url:server + "admin_log/spanNamelist?spanname="+appName,
    url:server + "admin_log/spanNameHttplist?spanname="+appName,
    datatype: "json",
    mtype: "GET",
    height: "100%",

+ 25 - 0
admin/admin-server-ui-starter/src/main/resources/admin/log/js/spanSQLQuota.js

@ -0,0 +1,25 @@
var appName = GetRequest().appName.replace("?v", "");
$.jgrid.defaults.styleUI = "Bootstrap";
//SELECT sum(success) success,sum(fail) fail,avg(excutetime) avgtime ,max(excutetime) maxtime ,count(*) allcount FROM  admin_log where spanname ="demo-socket-client" group by  uri
$("#table_list_1").jqGrid({
    url:server + "admin_log/spanNameSQLlist?spanname="+appName,
    datatype: "json",
    mtype: "GET",
    height: "100%",
    autowidth: true,
    shrinkToFit: true,
    //colNames: ["序号", "接口路径", "请求总次数", "成功次数", "失败次数", "请求平均时间(ms)", "最长请求时间(ms)"],
    colModel: [
        //{label:"序号",name: "id",width: 30, sorttype: "int", align: "center" },
        {label:"sql语句",name: "sql",width: "80%",align: "left"},
        {label:"请求时间(ms)",name: "excutetime",width: "10%",align: "right", sorttype: "int"},
        {label:"执行时间",name: "eventstarttimestr",width: "10%",align: "right", sorttype: "int"},
    ],
    loadonce: true,
    // pager: "#pager_list_1",
    viewrecords: true,
    caption: "接口统计分析",
    hidegrid: false
});

+ 32 - 2
demo/demo-socket-client/src/main/java/com/yihu/client/controller/DemoController.java

@ -17,7 +17,37 @@ public class DemoController {
    private JdbcTemplate jdbcTemplate;
    @RequestMapping(value = "/testSQL", method = RequestMethod.GET)
    public String loginfo(
    public String loginfoGET(
            String sql
    ) {
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        return "成功";
    }
    @RequestMapping(value = "/testSQL", method = RequestMethod.DELETE)
    public String loginfoDELETE(
            String sql
    ) {
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        return "成功";
    }
    @RequestMapping(value = "/testSQL", method = RequestMethod.PUT)
    public String loginfoPUT(
            String sql
    ) {
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        jdbcTemplate.queryForList(sql);
        return "成功";
    }
    @RequestMapping(value = "/testSQL", method = RequestMethod.POST)
    public String loginfoPOST(
            String sql
    ) {
        jdbcTemplate.queryForList(sql);
@ -28,7 +58,7 @@ public class DemoController {
    @RequestMapping(value = "/testSQL/{value}", method = RequestMethod.GET)
    public String loginfoValue(
            @PathVariable(value = "value")String value
            @PathVariable(value = "value") String value
    ) {
        jdbcTemplate.queryForList(value);
        jdbcTemplate.queryForList(value);