fix for https://github.com/statping/statping/issues/842, additional columns for language CSV, modified cache routine to 60 seconds

pull/847/head
hunterlong 2020-10-02 12:37:20 -07:00
parent bdbaf8cbca
commit 4c6b9e6a35
3 changed files with 130 additions and 128 deletions

View File

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

View File

@ -146,7 +146,7 @@
<span class="badge badge-info float-right text-uppercase mt-1">{{notifier.logs.length}}</span>
</div>
<div class="card-body" :class="{'d-none': !expanded_logs}">
<div v-for="(log, i) in notifier.logs.reverse()" class="alert" :class="{'alert-danger': log.error, 'alert-dark': !log.success && !log.error, 'alert-success': log.success && !log.error}">
<div v-for="(log, i) in notifier.logs" class="alert" :class="{'alert-danger': log.error, 'alert-dark': !log.success && !log.error, 'alert-success': log.success && !log.error}">
<span class="d-block">
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
},
}
}
</script>

View File

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