From c60ebd1bae910ccf6b2b3d91f37643bca3913c2c Mon Sep 17 00:00:00 2001 From: naiba Date: Sat, 17 Sep 2022 10:30:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=BB=B6=E8=BF=9F=E6=8A=A5?= =?UTF-8?q?=E8=AD=A6=20[no=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dashboard/controller/member_api.go | 6 +++ model/monitor.go | 4 ++ resource/l10n/zh-CN.toml | 15 ++++++ resource/static/main.js | 51 +++++++++++-------- resource/template/common/footer.html | 2 +- resource/template/component/monitor.html | 14 +++++ .../template/dashboard-default/monitor.html | 4 +- service/singleton/servicesentinel.go | 20 ++++++-- 8 files changed, 90 insertions(+), 26 deletions(-) diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index e707262..aa52b01 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -393,6 +393,9 @@ type monitorForm struct { NotificationTag string SkipServersRaw string Duration uint64 + MinLatency float32 + MaxLatency float32 + LatencyNotify string } func (ma *memberAPI) addOrEditMonitor(c *gin.Context) { @@ -409,6 +412,9 @@ func (ma *memberAPI) addOrEditMonitor(c *gin.Context) { m.Notify = mf.Notify == "on" m.NotificationTag = mf.NotificationTag m.Duration = mf.Duration + m.LatencyNotify = mf.LatencyNotify == "on" + m.MinLatency = mf.MinLatency + m.MaxLatency = mf.MaxLatency err = m.InitSkipServers() } if err == nil { diff --git a/model/monitor.go b/model/monitor.go index 5eadc12..f019c92 100644 --- a/model/monitor.go +++ b/model/monitor.go @@ -48,6 +48,10 @@ type Monitor struct { NotificationTag string // 当前服务监控所属的通知组 Cover uint8 + MinLatency float32 + MaxLatency float32 + LatencyNotify bool + SkipServers map[uint64]bool `gorm:"-" json:"-"` CronJobID cron.EntryID `gorm:"-" json:"-"` } diff --git a/resource/l10n/zh-CN.toml b/resource/l10n/zh-CN.toml index 3018106..64c628f 100644 --- a/resource/l10n/zh-CN.toml +++ b/resource/l10n/zh-CN.toml @@ -130,6 +130,21 @@ other = "秒" [EnableFailureNotification] other = "启用故障通知" +[FailureNotification] +other = "故障通知" + +[MaxLatency] +other = "最大延迟(ms)" + +[MinLatency] +other = "最小延迟(ms)" + +[EnableLatencyNotification] +other = "启用延迟通知" + +[LatencyNotification] +other = "延迟通知" + [IntroductionOfMonitor] other = """ 类型为 HTTP-GET 时输入URL(带 http/https, HTTPS协议的会顺带监控SSL证书);
diff --git a/resource/static/main.js b/resource/static/main.js index bc15d25..a008a23 100644 --- a/resource/static/main.js +++ b/resource/static/main.js @@ -77,6 +77,8 @@ function showFormModal(modelSelector, formID, URL, getData) { item.name === "Duration" ) { obj[item.name] = parseInt(item.value); + } else if (item.name.endsWith("Latency")) { + obj[item.name] = parseFloat(item.value); } else { obj[item.name] = item.value; } @@ -94,9 +96,9 @@ function showFormModal(modelSelector, formID, URL, getData) { if (item.name.endsWith("TasksRaw")) { if (item.value.length > 2) { obj[item.name] = JSON.stringify( - [...item.value.matchAll(/\d+/gm)].map((k) => - parseInt(k[0]) - ) + [...item.value.matchAll(/\d+/gm)].map((k) => + parseInt(k[0]) + ) ); } } @@ -163,29 +165,29 @@ function addOrEditAlertRule(rule) { const node2 = modal.find("i.dropdown.icon.2"); for (let i = 0; i < failTriggerTasksList.length; i++) { node1.after( - 'ID:' + - failTriggerTasksList[i] + - '' + 'ID:' + + failTriggerTasksList[i] + + '' ); } for (let i = 0; i < recoverTriggerTasksList.length; i++) { node2.after( - 'ID:' + - recoverTriggerTasksList[i] + - '' + 'ID:' + + recoverTriggerTasksList[i] + + '' ); } } modal - .find("input[name=FailTriggerTasksRaw]") - .val(rule ? "[]," + failTriggerTasks.substr(1, failTriggerTasks.length - 2) : "[]"); + .find("input[name=FailTriggerTasksRaw]") + .val(rule ? "[]," + failTriggerTasks.substr(1, failTriggerTasks.length - 2) : "[]"); modal - .find("input[name=RecoverTriggerTasksRaw]") - .val(rule ? "[]," + recoverTriggerTasks.substr(1, recoverTriggerTasks.length - 2) : "[]"); + .find("input[name=RecoverTriggerTasksRaw]") + .val(rule ? "[]," + recoverTriggerTasks.substr(1, recoverTriggerTasks.length - 2) : "[]"); showFormModal(".rule.modal", "#ruleForm", "/api/alert-rule"); } @@ -257,10 +259,10 @@ function issueNewApiToken(apiToken) { const modal = $(".api.modal"); modal.children(".header").text((apiToken ? LANG.Edit : LANG.Add) + ' ' + "API Token"); modal - .find(".nezha-primary-btn.button") - .html( - apiToken ? LANG.Edit + '' : LANG.Add + '' - ); + .find(".nezha-primary-btn.button") + .html( + apiToken ? LANG.Edit + '' : LANG.Add + '' + ); modal.find("textarea[name=Note]").val(apiToken ? apiToken.Note : null); showFormModal(".api.modal", "#apiForm", "/api/token"); } @@ -313,6 +315,13 @@ function addOrEditMonitor(monitor) { } else { modal.find(".ui.nb-notify.checkbox").checkbox("set unchecked"); } + modal.find("input[name=MaxLatency]").val(monitor ? monitor.MaxLatency : null); + modal.find("input[name=MinLatency]").val(monitor ? monitor.MinLatency : null); + if (monitor && monitor.LatencyNotify) { + modal.find(".ui.nb-lt-notify.checkbox").checkbox("set checked"); + } else { + modal.find(".ui.nb-lt-notify.checkbox").checkbox("set unchecked"); + } modal.find("a.ui.label.visible").each((i, el) => { el.remove(); }); diff --git a/resource/template/common/footer.html b/resource/template/common/footer.html index a2b9984..f92d1b7 100644 --- a/resource/template/common/footer.html +++ b/resource/template/common/footer.html @@ -10,7 +10,7 @@ - +