mirror of https://github.com/statping/statping
240 lines
7.4 KiB
HTML
240 lines
7.4 KiB
HTML
{{define "title"}}{{.Service.Name}} Status{{end}}
|
|
{{ define "content" }}
|
|
{{$s := .Service}}
|
|
|
|
<div class="container col-md-7 col-sm-12 mt-md-5 bg-light">
|
|
|
|
{{if Auth}}
|
|
{{template "nav"}}
|
|
{{end}}
|
|
|
|
<div class="col-12 mb-4">
|
|
|
|
{{if $s.Online }}
|
|
<span class="mt-3 mb-3 text-white d-md-none btn bg-success d-block d-md-none">ONLINE</span>
|
|
{{ else }}
|
|
<span class="mt-3 mb-3 text-white d-md-none btn bg-danger d-block d-md-none">OFFLINE</span>
|
|
{{end}}
|
|
|
|
<h4 class="mt-2">{{ $s.Name }}
|
|
{{if $s.Online }}
|
|
<span class="badge bg-success float-right d-none d-md-block">ONLINE</span>
|
|
{{ else }}
|
|
<span class="badge bg-danger float-right d-none d-md-block">OFFLINE</span>
|
|
{{end}}</h4>
|
|
|
|
<div class="row stats_area mt-5 mb-5">
|
|
|
|
<div class="col-4">
|
|
<span class="lg_number">{{$s.Online24}}%</span>
|
|
Online last 24 Hours
|
|
</div>
|
|
|
|
<div class="col-4">
|
|
<span class="lg_number">{{$s.AvgTime}}ms</span>
|
|
Average Response
|
|
</div>
|
|
|
|
<div class="col-4">
|
|
<span class="lg_number">{{$s.TotalUptime}}%</span>
|
|
Total Uptime
|
|
</div>
|
|
</div>
|
|
|
|
<div class="service-chart-container">
|
|
<canvas id="service"></canvas>
|
|
</div>
|
|
|
|
<form id="service_date_form" class="col-12 mt-2 mb-3">
|
|
<span id="start_date" class="text-muted small float-left pointer">{{FromUnix .Start}}</span>
|
|
<span id="end_date" class="text-muted small float-right pointer" style="position: absolute;right: 0;">{{FromUnix .End}}</span>
|
|
<input type="hidden" name="start" class="form-control" id="service_start" spellcheck="false">
|
|
<input type="hidden" name="end" class="form-control" id="service_end" spellcheck="false">
|
|
<button type="submit" class="btn btn-light btn-block btn-sm mt-2">Set Timeframe</button>
|
|
<div id="start_container"></div>
|
|
<div id="end_container"></div>
|
|
</form>
|
|
|
|
{{if not $s.Online}}
|
|
<div class="col-12 small text-center mt-3 text-muted">{{$s.DowntimeText}}</div>
|
|
{{end}}
|
|
|
|
{{ if $s.LimitedFailures }}
|
|
<div class="list-group mt-3 mb-4">
|
|
{{ range $s.LimitedFailures }}
|
|
<a href="#" class="list-group-item list-group-item-action flex-column align-items-start">
|
|
<div class="d-flex w-100 justify-content-between">
|
|
<h5 class="mb-1">{{.ParseError}}</h5>
|
|
<small>{{.Ago}}</small>
|
|
</div>
|
|
<p class="mb-1">{{.Issue}}</p>
|
|
</a>
|
|
{{ end }}
|
|
</div>
|
|
{{ end }}
|
|
|
|
</div>
|
|
|
|
{{if Auth}}
|
|
|
|
<div class="col-12 mt-4{{if ne $s.Type "http"}} d-none{{end}}">
|
|
<h3>Last Response</h3>
|
|
<textarea rows="8" class="form-control" readonly>{{ $s.LastResponse }}</textarea>
|
|
<div class="form-group row mt-2">
|
|
<label for="last_status_code" class="col-sm-3 col-form-label">HTTP Status Code</label>
|
|
<div class="col-sm-2">
|
|
<input type="text" id="last_status_code" class="form-control" value="{{ $s.LastStatusCode }}" readonly>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-12 mt-4">
|
|
<h3>Edit Service</h3>
|
|
{{template "form_service" $s}}
|
|
</div>
|
|
|
|
<div class="col-12 mt-4">
|
|
<h3>Service Checkin</h3>
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Checkin</th>
|
|
<th scope="col">Report Period<br>Grace Period</th>
|
|
<th scope="col">Last Seen</th>
|
|
<th scope="col">Expected</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range $s.Checkins}}
|
|
{{ $ch := . }}
|
|
<tr class="{{ if lt $ch.Expected 0}}bg-danger text-white{{else}}bg-light{{end}}">
|
|
<td>{{CoreApp.Domain}}/checkin/{{$ch.ApiKey}}</td>
|
|
<td>every {{Duration $ch.Period}}<br>after {{Duration $ch.Grace}}</td>
|
|
<td>{{Ago $ch.Last.CreatedAt}}</td>
|
|
<td>{{ if lt $ch.Expected 0}}{{Duration $ch.Expected}} ago{{else}}in {{Duration $ch.Expected}}{{end}}</td>
|
|
</tr>
|
|
{{template "form_checkin" $ch}}
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
|
|
</div>
|
|
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
{{define "extra_scripts"}}
|
|
{{if USE_CDN}}
|
|
<script src="https://assets.statup.io/pikaday.js"></script>
|
|
{{ else }}
|
|
<script src="/js/pikaday.js"></script>
|
|
{{end}}
|
|
{{$s := .Service}}
|
|
<script>
|
|
|
|
var ctx = document.getElementById("service").getContext('2d');
|
|
|
|
var chartdata = new Chart(ctx, {
|
|
type: 'line',
|
|
data: {
|
|
datasets: [{
|
|
label: 'Response Time (Milliseconds)',
|
|
data: [],
|
|
backgroundColor: [
|
|
'rgba(47, 206, 30, 0.92)'
|
|
],
|
|
borderColor: [
|
|
'rgb(47, 171, 34)'
|
|
],
|
|
borderWidth: 1
|
|
}]
|
|
},
|
|
options: {
|
|
legend: {
|
|
display: false
|
|
},
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
beginAtZero: true
|
|
},
|
|
gridLines: {
|
|
display: true
|
|
}
|
|
}],
|
|
xAxes: [{
|
|
type: 'time',
|
|
distribution: 'series',
|
|
time: {
|
|
displayFormats: {
|
|
'millisecond': 'MMM DD',
|
|
'second': 'MMM DD',
|
|
'minute': 'MMM DD',
|
|
'hour': 'MMM DD hA',
|
|
'day': 'MMM DD',
|
|
'week': 'MMM DD',
|
|
'month': 'MMM DD',
|
|
'quarter': 'MMM DD',
|
|
'year': 'MMM DD',
|
|
}
|
|
},
|
|
gridLines: {
|
|
display: true
|
|
},
|
|
ticks: {
|
|
source: 'auto'
|
|
}
|
|
}],
|
|
},
|
|
elements: {
|
|
point: {
|
|
radius: 0
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
var startPick = new Pikaday({
|
|
field: $('#service_start')[0],
|
|
bound: false,
|
|
trigger: $("#start_date"),
|
|
container: $("#start_container")[0],
|
|
maxDate: new Date(),
|
|
onSelect: function(date) {
|
|
$('#service_start')[0].value = Math.round(date.getTime() / 1000);
|
|
this.hide();
|
|
}
|
|
});
|
|
|
|
var endPick = new Pikaday({
|
|
field: $('#service_end')[0],
|
|
bound: false,
|
|
trigger: $("#end_date"),
|
|
container: $("#end_container")[0],
|
|
maxDate: new Date(),
|
|
onSelect: function(date) {
|
|
$('#service_end')[0].value = Math.round(date.getTime() / 1000);
|
|
this.hide();
|
|
}
|
|
});
|
|
|
|
startPick.setDate(new Date({{.Start}}*1000));
|
|
endPick.setDate(new Date({{.End}}*1000));
|
|
|
|
startPick.hide()
|
|
endPick.hide()
|
|
|
|
$("#start_date").click(function(e) {
|
|
startPick.show()
|
|
})
|
|
|
|
$("#end_date").click(function(e) {
|
|
endPick.show()
|
|
})
|
|
|
|
AjaxChart(chartdata,{{$s.Id}},{{.Start}},{{.End}},"hour");
|
|
|
|
</script>
|
|
{{end}}
|