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 @@
-
+