Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package dotweb
// Global define
const (
// Version current version
Version = "1.7.6"
Version = "1.7.7"
)

// Log define
Expand Down
21 changes: 21 additions & 0 deletions core/htmlx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package core

import "strings"

func CreateTableHtml(title, header, body string) string {
template := `<br><table class="bordered">
<colgroup>
<col width="40%">
<col width="60%">
</colgroup>
<caption>{{title}}</caption>
<thead>
{{header}}
</thead>
{{body}}
</table>`
html := strings.Replace(template, "{{title}}", title, -1)
html = strings.Replace(html, "{{header}}", header, -1)
html = strings.Replace(html, "{{body}}", body, -1)
return html
}
175 changes: 173 additions & 2 deletions core/state.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package core

import (
"fmt"
"net/http"
"strconv"
"strings"
Expand All @@ -19,6 +20,118 @@ const (
defaultCheckTimeMinutes = 10
)

var TableHtml = `<html>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;">

<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Dotweb</title>
<style>
.overtable {
width: 100%;
overflow: hidden;
overflow-x: auto;
}
body {
max-width: 780px;
margin:0 auto;
font-family: 'trebuchet MS', 'Lucida sans', Arial;
font-size: 1rem;
color: #444;
}
table {
font-family: 'trebuchet MS', 'Lucida sans', Arial;
*border-collapse: collapse;
/* IE7 and lower */
border-spacing: 0;
width: 100%;
border-collapse: collapse;
overflow-x: auto
}
caption {
font-family: 'Microsoft Yahei', 'trebuchet MS', 'Lucida sans', Arial;
text-align: left;
padding: .5rem;
font-weight: bold;
font-size: 110%;
color: #666;
}
tr {
border-top: 1px solid #dfe2e5
}
tr:nth-child(2n) {
background-color: #f6f8fa
}
td,
th {
border: 1px solid #dfe2e5;
padding: .6em 1em;
}
.bordered tr:hover {
background: #fbf8e9;
}
.bordered td,
.bordered th {
border: 1px solid #ccc;
padding: 10px;
text-align: left;
}
</style>
<script>

(function(doc, win) {
window.MPIXEL_RATIO = (function () {
var Mctx = document.createElement("canvas").getContext("2d"),
Mdpr = window.devicePixelRatio || 1,
Mbsr = Mctx.webkitBackingStorePixelRatio ||
Mctx.mozBackingStorePixelRatio ||
Mctx.msBackingStorePixelRatio ||
Mctx.oBackingStorePixelRatio ||
Mctx.backingStorePixelRatio || 1;

return Mdpr/Mbsr;
})();

function addEventListeners(ele,type,callback){

try{ // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
ele.addEventListener(type,callback,false);
}catch(e){
try{ // IE8.0及其以下版本
ele.attachEvent('on' + type,callback);
}catch(e){ // 早期浏览器
ele['on' + type] = callback;
}
}
}

var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
window.recalc = function() {
var clientWidth = docEl.clientWidth < 768 ? docEl.clientWidth : 768;
if (!clientWidth) return;
docEl.style.fontSize = 10 * (clientWidth / 320) * window.MPIXEL_RATIO + 'px';
};
window.recalc();

addEventListeners(win, resizeEvt, recalc);
})(document, window);

</script>
</head>
<body>
<div class="overtable">
{{tableBody}}
</div>
</body>
</html>
`

// NewServerStateInfo return ServerStateInfo which is init
func NewServerStateInfo() *ServerStateInfo {
state := &ServerStateInfo{
Expand Down Expand Up @@ -99,8 +212,8 @@ type ServerStateInfo struct {
infoPool *pool
}

// ShowHtmlData show server state data html-string format
func (state *ServerStateInfo) ShowHtmlData(version, globalUniqueId string) string {
// ShowHtmlDataRaw show server state data html-string format
func (state *ServerStateInfo) ShowHtmlDataRaw(version, globalUniqueId string) string {
data := "<html><body><div>"
data += "GlobalUniqueId : " + globalUniqueId
data += "<br>"
Expand Down Expand Up @@ -145,6 +258,64 @@ func (state *ServerStateInfo) ShowHtmlData(version, globalUniqueId string) strin
return data
}

// ShowHtmlData show server state data html-table format
func (state *ServerStateInfo) ShowHtmlTableData(version, globalUniqueId string) string {
data := "<tr><td>" + "GlobalUniqueId" + "</td><td>" + globalUniqueId + "</td></tr>"
data += "<tr><td>" + "HostInfo" + "</td><td>" + sysx.GetHostName() + "</td></tr>"
data += "<tr><td>" + "CurrentTime" + "</td><td>" + time.Now().Format("2006-01-02 15:04:05") + "</td></tr>"
data += "<tr><td>" + "ServerVersion" + "</td><td>" + version + "</td></tr>"
data += "<tr><td>" + "ServerStartTime" + "</td><td>" + state.ServerStartTime.Format(dateTimeLayout) + "</td></tr>"
data += "<tr><td>" + "TotalRequestCount" + "</td><td>" + strconv.FormatUint(state.TotalRequestCount, 10) + "</td></tr>"
data += "<tr><td>" + "CurrentRequestCount" + "</td><td>" + strconv.FormatUint(state.CurrentRequestCount, 10) + "</td></tr>"
data += "<tr><td>" + "TotalErrorCount" + "</td><td>" + strconv.FormatUint(state.TotalErrorCount, 10) + "</td></tr>"
state.IntervalErrorData.RLock()
data += "<tr><td>" + "IntervalErrorData" + "</td><td>" + jsonutil.GetJsonString(state.IntervalErrorData.GetCurrentMap()) + "</td></tr>"
state.IntervalErrorData.RUnlock()
state.DetailErrorPageData.RLock()
data += "<tr><td>" + "DetailErrorPageData" + "</td><td>" + jsonutil.GetJsonString(state.DetailErrorPageData.GetCurrentMap()) + "</td></tr>"
state.DetailErrorPageData.RUnlock()
state.DetailErrorData.RLock()
data += "<tr><td>" + "DetailErrorData" + "</td><td>" + jsonutil.GetJsonString(state.DetailErrorData.GetCurrentMap()) + "</td></tr>"
state.DetailErrorData.RUnlock()
state.DetailHTTPCodeData.RLock()
data += "<tr><td>" + "DetailHttpCodeData" + "</td><td>" + jsonutil.GetJsonString(state.DetailHTTPCodeData.GetCurrentMap()) + "</td></tr>"
state.DetailHTTPCodeData.RUnlock()
header := `<tr>
<th>Index</th>
<th>Value</th>
</tr>`
data = CreateTableHtml("Core State", header, data)

//show IntervalRequestData
intervalRequestData := ""
state.IntervalRequestData.RLock()
for k, v := range state.IntervalRequestData.GetCurrentMap() {
intervalRequestData += "<tr><td>" + k + "</td><td>" + fmt.Sprint(v) + "</td></tr>"
}
state.IntervalRequestData.RUnlock()
header = `<tr>
<th>Time</th>
<th>Value</th>
</tr>`
data += CreateTableHtml("IntervalRequestData", header, intervalRequestData)

//show DetailRequestURLData
detailRequestURLData := ""
state.DetailRequestURLData.RLock()
for k, v := range state.DetailRequestURLData.GetCurrentMap() {
detailRequestURLData += "<tr><td>" + k + "</td><td>" + fmt.Sprint(v) + "</td></tr>"
}
state.DetailRequestURLData.RUnlock()
header = `<tr>
<th>Url</th>
<th>Value</th>
</tr>`
data += CreateTableHtml("DetailRequestURLData", header, detailRequestURLData)
html := strings.Replace(TableHtml, "{{tableBody}}", data, -1)

return html
}

// QueryIntervalRequestData query request count by query time
func (state *ServerStateInfo) QueryIntervalRequestData(queryKey string) uint64 {
return state.IntervalRequestData.GetUInt64(queryKey)
Expand Down
18 changes: 13 additions & 5 deletions dotweb_sysgroup.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package dotweb

import (
"fmt"
"github.com/devfeel/dotweb/core"
jsonutil "github.com/devfeel/dotweb/framework/json"
"github.com/devfeel/dotweb/framework/stringx"
"runtime"
"runtime/debug"
"runtime/pprof"
Expand Down Expand Up @@ -50,7 +51,7 @@ func showIntervalData(ctx Context) error {

// snow server status
func showServerState(ctx Context) error {
return ctx.WriteHtml(ctx.HttpServer().StateInfo().ShowHtmlData(Version, ctx.HttpServer().DotApp.GlobalUniqueID()))
return ctx.WriteHtml(ctx.HttpServer().StateInfo().ShowHtmlTableData(Version, ctx.HttpServer().DotApp.GlobalUniqueID()))
}

// query server information
Expand All @@ -68,11 +69,18 @@ func showQuery(ctx Context) error {

func showRouters(ctx Context) error {

result := ""
data := ""
routerCount := len(ctx.HttpServer().router.GetAllRouterExpress())
for k, _ := range ctx.HttpServer().router.GetAllRouterExpress() {
method := strings.Split(k, routerExpressSplit)[0]
router := strings.Split(k, routerExpressSplit)[1]
result += stringx.CompletionRight(method, " ", 12) + router + "\r\n"
data += "<tr><td>" + method + "</td><td>" + router + "</td></tr>"
}
return ctx.WriteString(result)
header := `<tr>
<th>Method</th>
<th>Router</th>
</tr>`
html := strings.Replace(core.TableHtml, "{{tableBody}}", core.CreateTableHtml("Routers:"+fmt.Sprint(routerCount), header, data), -1)

return ctx.WriteHtml(html)
}
8 changes: 8 additions & 0 deletions version.MD
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
## dotweb版本记录:


#### Version 1.7.7
* Opt: 优化系统路由dotweb/state、dotweb/routers展现方式,以方便阅读的表格形式输出
* Feature: 新增core.TableHtml\core.CreateTableHtml()用于生成相关Html代码
* About:
- 可访问dotweb/state查看当前实例运行时信息
- 可访问dotweb/routers查看当前实例注册的所有路由信息
* 2019-11-12 18:00 at ShangHai

#### Version 1.7.6
* Fix: 修复在调用SetMethodNotAllowedHandle时修改StatusCode无效问题
* Opt: 将路由阶段设置405代码逻辑移除,相关逻辑在DefaultMethodNotAllowedHandler实现
Expand Down