Переглянути джерело

添加 Nginx 日志可视化页面

reghao 2 роки тому
батько
коміт
e0290c3fa7

+ 203 - 0
manager/src/main/resources/templates/app/stat/nginxlog.html

@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <style>
+        a{
+            color: #005980;
+        }
+        .widget-small{
+            background-color: #FFFFFF;
+            overflow: hidden;
+            text-align: center;
+            border-radius: 2px;
+            box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);
+        }
+        .widget-small .fa{
+            float: left;
+            width: 40%;
+            line-height: 80px;
+            color: #FFFFFF;
+        }
+        .widget-user .fa{
+            background-color: #029789;
+        }
+        .widget-visit .fa{
+            background-color: #17a2b8;
+        }
+        .widget-message .fa{
+            background-color: #fbad4c;
+        }
+        .widget-like .fa{
+            background-color: #ff646d;
+        }
+        .widget-small-info{
+            float: left;
+            text-align: left;
+            width: 40%;
+            margin-left: 20px;
+            margin-top: 18px;
+            line-height: 24px;
+        }
+        .widget-small-info h4{
+            font-size: 18px;
+        }
+        .widget-small-info span{
+            font-size: 16px;
+        }
+        .project-introduce{
+            min-height: 466px;
+        }
+        .project-introduce h4{
+            font-weight: bold;
+            margin-top: 12px;
+            margin-bottom: 8px;
+        }
+        .project-introduce li{
+            list-style: decimal;
+            margin-left: 28px;
+        }
+        .alert {
+            padding: 15px;
+            margin-bottom: 10px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+        }
+        .alert-info {
+            color: #31708f;
+            background-color: #d9edf7;
+            border-color: #bce8f1;
+        }
+    </style>
+</head>
+
+<body class="timo-layout-page">
+<div class="layui-row layui-col-space15">
+    <div class="layui-card">
+        <div id="chart1" class="layui-card-body" style="height:500px;"></div>
+    </div>
+</div>
+
+<script th:src="@{/js/plugins/jquery-3.4.1.min.js}" charset="utf-8"></script>
+<script th:src="@{/lib/echarts-4.7.0/echarts.js}" charset="utf-8"></script>
+<script type="text/javascript" th:inline="javascript">
+    var myChart = echarts.init(document.getElementById('chart1'));
+    var xData = []
+    var yData = []
+    var option = {
+        title: {
+            text: 'Nginx Log'
+        },
+        tooltip: {},
+        toolbox: {
+            feature: {
+                dataZoom: {
+                    yAxisIndex: 'none'
+                },
+                restore: {},
+                saveAsImage: {}
+            }
+        },
+        legend: {
+            data:['reqs/s']
+        },
+        xAxis: {
+            type: 'category',
+            data: xData
+        },
+        yAxis: {},
+        series: [{
+            name: 'reqs/s',
+            type: 'line',
+            smooth:true,
+            data: yData
+        }],
+        dataZoom: [{//这个是设置滚动条的,可以拉动这个滚动条来改变你的图形的显示比例
+            type: 'slider',
+            show: true, //flase直接隐藏图形
+            xAxisIndex: [0],
+            left: '9%', //滚动条靠左侧的百分比
+            bottom: -5,
+            start: 0,//滚动条的起始位置
+            end: 50 //滚动条的截止位置(按比例分割你的柱状图x轴长度)
+        }]
+    };
+    myChart.setOption(option)
+    $.get("/api/log/nginx/chart", function (result) {
+        var data = result.data
+        for (const x of data[0]) {
+            xData.push(x)
+        }
+        for (const y of data[1]) {
+            yData.push(y)
+        }
+
+        myChart.setOption({
+            xAxis: {
+                data: xData
+            },
+            series: [{
+                data: yData
+            }],
+        })
+    })
+
+    var connected = false
+    var ws
+    function initWebSocket() {
+        if ("WebSocket" in window) {
+            var token = '0123456789'
+            var app = 'admin-service'
+            var host = '172.16.90.200'
+            var params = 'token=' + token + '&app=' + app + '&host=' + host;
+            var url = "wss://devops.reghao.cn/ws/log/pull?" + params
+            ws = new WebSocket(url);
+            ws.onopen = function() {
+                connected = true
+                // Web Socket 已连接上,使用 send() 方法发送数据
+                console.log("websocket connected...");
+            };
+            ws.onclose = function() {
+                connected = false
+                console.log("websocket connection closed...");
+                reconnect()
+            };
+            ws.onerror = function () {
+                connected = false
+                console.log("websocket connection error...");
+                reconnect()
+            };
+            ws.onmessage = function (evt) {
+                /*var data = JSON.parse(evt.data)
+                for (const x of data[0]) {
+                    xData.push(x)
+                }
+                for (const y of data[1]) {
+                    yData.push(y)
+                }
+
+                myChart.setOption({
+                    xAxis: {
+                        data: xData
+                    },
+                    series: [{
+                        data: yData
+                    }],
+                })*/
+            }
+        } else {
+            // 浏览器不支持 WebSocket
+            alert("您的浏览器不支持 WebSocket!");
+        }
+    }
+    function reconnect() {
+        if (connected) return
+
+        setTimeout(function () {
+            console.log('websocket reconnecting...')
+            initWebSocket()
+        }, 5000)
+    }
+    // initWebSocket()
+</script>
+</body>
+</html>