From 4c6b9e6a3521ba54b2174ecbcf70eb56f9aa2837 Mon Sep 17 00:00:00 2001 From: hunterlong Date: Fri, 2 Oct 2020 12:37:20 -0700 Subject: [PATCH] fix for https://github.com/statping/statping/issues/842, additional columns for language CSV, modified cache routine to 60 seconds --- CHANGELOG.md | 2 + frontend/src/forms/Notifier.vue | 250 ++++++++++++++++---------------- handlers/cache.go | 6 +- 3 files changed, 130 insertions(+), 128 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff2cb083..8ffefde4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ - Merged PR #806 - Enhance GRPC Monitoring - Merged PR #692 - When login fields are autofilled the sign in button should be enabled - Modified multiple Vue forms to use number models for integer inputs +- Fixed page freeze issue for incidents https://github.com/statping/statping/issues/842 +- Modified cache routine from 5 seconds to 60 seconds # 0.90.69 (09-18-2020) - Fixed issue with service view not loading. #808 #811 #800 diff --git a/frontend/src/forms/Notifier.vue b/frontend/src/forms/Notifier.vue index 464fb656..ebbf0ff3 100644 --- a/frontend/src/forms/Notifier.vue +++ b/frontend/src/forms/Notifier.vue @@ -146,7 +146,7 @@ {{notifier.logs.length}}
-
+
Service {{log.service}} {{log.success ? "Success Triggered" : "Failure Triggered"}} @@ -187,49 +187,47 @@ import '../codemirror_json' const beautify = require('js-beautify').js export default { - name: 'Notifier', + name: 'Notifier', components: { codemirror }, - props: { - notifier: { - type: Object, - required: true - } - }, - watch: { - + props: { + notifier: { + type: Object, + required: true + } + }, + watch: {}, + data() { + return { + loading: false, + loadingTest: false, + error: null, + response: null, + request: null, + success: false, + saved: false, + expanded: false, + expanded_logs: false, + success_data: null, + failure_data: null, + form: {}, + cmOptions: { + height: 700, + tabSize: 2, + lineNumbers: true, + line: true, + class: "json-field", + theme: 'neat', + mode: "mymode", + lineWrapping: true, + json: this.notifier.data_type === "json", + autoRefresh: true, + mime: this.notifier.data_type === "json" ? "application/json" : "text/plain" + }, + beautifySettings: {indent_size: 2, space_in_empty_paren: true}, + } }, - data() { - return { - loading: false, - loadingTest: false, - error: null, - response: null, - request: null, - success: false, - saved: false, - expanded: false, - expanded_logs: false, - success_data: null, - failure_data: null, - form: {}, - cmOptions: { - height: 700, - tabSize: 2, - lineNumbers: true, - line: true, - class: "json-field", - theme: 'neat', - mode: "mymode", - lineWrapping: true, - json: this.notifier.data_type === "json", - autoRefresh: true, - mime: this.notifier.data_type === "json" ? "application/json" : "text/plain" - }, - beautifySettings: { indent_size: 2, space_in_empty_paren: true }, - } - }, computed: { core() { return this.$store.getters.core @@ -239,92 +237,92 @@ export default { return "https://chart.googleapis.com/chart?chs=500x500&cht=qr&chl=" + encodeURIComponent(u) } }, - methods: { - formVisible(want, form) { - return !!want.includes(form.type); - }, - visible(isVisible, entry) { - if (isVisible) { - this.$refs.cmfailure.codemirror.refresh() - this.$refs.cmsuccess.codemirror.refresh() - } - }, - onCmSuccessReady(cm) { - this.success_data = this.notifier.success_data - if (this.notifier.data_type === "json") { - this.success_data = beautify(this.notifier.success_data, this.beautifySettings) - } - setTimeout(function() { - cm.refresh(); - },1); - }, - onCmFailureReady(cm) { - this.failure_data = this.notifier.failure_data - if (this.notifier.data_type === "json") { - this.failure_data = beautify(this.notifier.failure_data, this.beautifySettings) - } - setTimeout(function() { - cm.refresh(); - },1); - }, - async enableToggle() { - this.notifier.enabled = !!this.notifier.enabled - const form = { - enabled: !this.notifier.enabled, - method: this.notifier.method, - } - await Api.notifier_save(form) - }, - async saveNotifier() { - this.loading = true - this.form.enabled = this.notifier.enabled - this.form.limits = parseInt(this.notifier.limits) - this.form.method = this.notifier.method - if (this.notifier.form) { - this.notifier.form.forEach((f) => { - let field = f.field.toLowerCase() - let val = this.notifier[field] - if (this.isNumeric(val)) { - val = parseInt(val) - } - this.form[field] = val - }); - } - this.form.success_data = this.success_data - this.form.failure_data = this.failure_data - await Api.notifier_save(this.form) - const notifiers = await Api.notifiers() - await this.$store.commit('setNotifiers', notifiers) - this.saved = true - this.loading = false - }, - async testNotifier(method="success") { - this.success = false - this.loadingTest = true - this.form.method = this.notifier.method - if (this.notifier.form) { - this.notifier.form.forEach((f) => { - let field = f.field.toLowerCase() - let val = this.notifier[field] - if (this.isNumeric(val)) { - val = parseInt(val) - } - this.form[field] = val - }); + methods: { + formVisible(want, form) { + return !!want.includes(form.type); + }, + visible(isVisible, entry) { + if (isVisible) { + this.$refs.cmfailure.codemirror.refresh() + this.$refs.cmsuccess.codemirror.refresh() + } + }, + onCmSuccessReady(cm) { + this.success_data = this.notifier.success_data + if (this.notifier.data_type === "json") { + this.success_data = beautify(this.notifier.success_data, this.beautifySettings) + } + setTimeout(function () { + cm.refresh(); + }, 1); + }, + onCmFailureReady(cm) { + this.failure_data = this.notifier.failure_data + if (this.notifier.data_type === "json") { + this.failure_data = beautify(this.notifier.failure_data, this.beautifySettings) + } + setTimeout(function () { + cm.refresh(); + }, 1); + }, + async enableToggle() { + this.notifier.enabled = !!this.notifier.enabled + const form = { + enabled: !this.notifier.enabled, + method: this.notifier.method, + } + await Api.notifier_save(form) + }, + async saveNotifier() { + this.loading = true + this.form.enabled = this.notifier.enabled + this.form.limits = parseInt(this.notifier.limits) + this.form.method = this.notifier.method + if (this.notifier.form) { + this.notifier.form.forEach((f) => { + let field = f.field.toLowerCase() + let val = this.notifier[field] + if (this.isNumeric(val)) { + val = parseInt(val) } - let req = { - notifier: this.form, - method: method, - } - const tested = await Api.notifier_test(req, this.notifier.method) - if (tested.success) { - this.success = true - } else { - this.error = tested.error - } - this.response = tested.response - this.loadingTest = false - }, - } + this.form[field] = val + }); + } + this.form.success_data = this.success_data + this.form.failure_data = this.failure_data + await Api.notifier_save(this.form) + const notifiers = await Api.notifiers() + await this.$store.commit('setNotifiers', notifiers) + this.saved = true + this.loading = false + }, + async testNotifier(method = "success") { + this.success = false + this.loadingTest = true + this.form.method = this.notifier.method + if (this.notifier.form) { + this.notifier.form.forEach((f) => { + let field = f.field.toLowerCase() + let val = this.notifier[field] + if (this.isNumeric(val)) { + val = parseInt(val) + } + this.form[field] = val + }); + } + let req = { + notifier: this.form, + method: method, + } + const tested = await Api.notifier_test(req, this.notifier.method) + if (tested.success) { + this.success = true + } else { + this.error = tested.error + } + this.response = tested.response + this.loadingTest = false + }, + } } diff --git a/handlers/cache.go b/handlers/cache.go index bc0e7b97..5a77d58b 100644 --- a/handlers/cache.go +++ b/handlers/cache.go @@ -27,7 +27,7 @@ type Item struct { // cleanRoutine is a go routine to automatically remove expired caches that haven't been hit recently func cleanRoutine(s *Storage) { - duration := 5 * time.Second + duration := 60 * time.Second CacheRoutine: for { @@ -40,7 +40,7 @@ CacheRoutine: s.Delete(k) } } - duration = 5 * time.Second + duration = 60 * time.Second } } } @@ -89,6 +89,8 @@ func (s Storage) List() map[string]Item { //Get a cached content by key func (s Storage) Get(key string) []byte { + s.mu.Lock() + defer s.mu.Unlock() item := s.items[key] if item.Expired() { CacheStorage.Delete(key)