http timeout in DB - tcp checker - ui updates

pull/33/head
Hunter Long 2018-07-18 16:01:24 -07:00
parent edc2d9b7d0
commit ab7e2040e7
14 changed files with 96 additions and 27 deletions

View File

@ -59,7 +59,7 @@ func ServiceTCPCheck(s *types.Service) *types.Service {
if s.Port != 0 {
domain = fmt.Sprintf("%v:%v", s.Domain, s.Port)
}
conn, err := net.Dial("tcp", domain)
conn, err := net.DialTimeout("tcp", domain, time.Duration(s.Timeout)*time.Second)
if err != nil {
RecordFailure(s, fmt.Sprintf("TCP Dial Error %v", err))
return s
@ -93,8 +93,9 @@ func ServiceHTTPCheck(s *types.Service) *types.Service {
}
s.DnsLookup = dnsLookup
t1 := time.Now()
timeout := time.Duration(s.Timeout)
client := http.Client{
Timeout: 30 * time.Second,
Timeout: timeout * time.Second,
}
var response *http.Response
@ -154,6 +155,7 @@ func RecordSuccess(s *types.Service) {
data := HitData{
Latency: s.Latency,
}
utils.Log(1, fmt.Sprintf("Service %v Successful: %0.2f ms", s.Name, data.Latency*1000))
CreateServiceHit(s, data)
OnSuccess(s)
}

View File

@ -25,27 +25,27 @@ func LoadSampleData() error {
Domain: "https://google.com",
ExpectedStatus: 200,
Interval: 10,
Port: 0,
Type: "http",
Method: "GET",
Timeout: 10,
}
s2 := &types.Service{
Name: "Statup Github",
Domain: "https://github.com/hunterlong/statup",
ExpectedStatus: 200,
Interval: 30,
Port: 0,
Type: "http",
Method: "GET",
Timeout: 20,
}
s3 := &types.Service{
Name: "JSON Users Test",
Domain: "https://jsonplaceholder.typicode.com/users",
ExpectedStatus: 200,
Interval: 60,
Port: 443,
Type: "http",
Method: "GET",
Timeout: 30,
}
s4 := &types.Service{
Name: "JSON API Tester",
@ -56,6 +56,15 @@ func LoadSampleData() error {
Type: "http",
Method: "POST",
PostData: `{ "title": "statup", "body": "bar", "userId": 19999 }`,
Timeout: 30,
}
s5 := &types.Service{
Name: "Postgres TCP Check",
Domain: "0.0.0.0",
Interval: 20,
Type: "tcp",
Port: 5432,
Timeout: 120,
}
id, err := CreateService(s1)
if err != nil {
@ -73,6 +82,10 @@ func LoadSampleData() error {
if err != nil {
utils.Log(3, fmt.Sprintf("Error creating Service %v: %v", id, err))
}
id, err = CreateService(s5)
if err != nil {
utils.Log(3, fmt.Sprintf("Error creating TCP Service %v: %v", id, err))
}
//checkin := &Checkin{
// Service: s2.Id,

View File

@ -38,6 +38,7 @@ func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
port, _ := strconv.Atoi(r.PostForm.Get("port"))
timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
checkType := r.PostForm.Get("check_type")
postData := r.PostForm.Get("post_data")
@ -51,6 +52,7 @@ func CreateServiceHandler(w http.ResponseWriter, r *http.Request) {
Type: checkType,
Port: port,
PostData: postData,
Timeout: timeout,
}
_, err := core.CreateService(service)
if err != nil {
@ -78,9 +80,6 @@ func ServicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
func ServicesViewHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
serv := core.SelectService(utils.StringInt(vars["id"]))
fmt.Println(serv.ToService())
ExecuteResponse(w, r, "service.html", serv)
}
@ -116,6 +115,7 @@ func ServicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
port, _ := strconv.Atoi(r.PostForm.Get("port"))
timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
checkType := r.PostForm.Get("check_type")
postData := r.PostForm.Get("post_data")
serviceUpdate := &types.Service{
@ -129,6 +129,7 @@ func ServicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
Type: checkType,
Port: port,
PostData: postData,
Timeout: timeout,
}
service = core.UpdateService(serviceUpdate)
ExecuteResponse(w, r, "service.html", service)

View File

@ -249,7 +249,7 @@ func RunSelectAllMysqlServices(t *testing.T) {
var err error
services, err := core.SelectAllServices()
assert.Nil(t, err)
assert.Equal(t, 4, len(services))
assert.Equal(t, 5, len(services))
}
func RunSelectAllMysqlCommunications(t *testing.T) {
@ -320,7 +320,7 @@ func RunSelectAllServices(t *testing.T) {
var err error
services, err := core.SelectAllServices()
assert.Nil(t, err)
assert.Equal(t, 4, len(services))
assert.Equal(t, 5, len(services))
}
func RunOneService_Check(t *testing.T) {
@ -339,10 +339,11 @@ func RunService_Create(t *testing.T) {
Port: 0,
Type: "http",
Method: "GET",
Timeout: 30,
}
id, err := core.CreateService(service)
assert.Nil(t, err)
assert.Equal(t, int64(5), id)
assert.Equal(t, int64(6), id)
t.Log(service)
}
@ -379,10 +380,11 @@ func RunBadService_Create(t *testing.T) {
Port: 0,
Type: "http",
Method: "GET",
Timeout: 30,
}
id, err := core.CreateService(service)
assert.Nil(t, err)
assert.Equal(t, int64(6), id)
assert.Equal(t, int64(7), id)
}
func RunBadService_Check(t *testing.T) {
@ -405,7 +407,12 @@ func RunCreateService_Hits(t *testing.T) {
assert.NotNil(t, services)
for i := 0; i <= 10; i++ {
for _, s := range services {
service := core.ServiceCheck(s.ToService())
var service *types.Service
if s.ToService().Type == "http" {
service = core.ServiceHTTPCheck(s.ToService())
} else {
service = core.ServiceTCPCheck(s.ToService())
}
assert.NotNil(t, service)
}
}
@ -459,7 +466,7 @@ func RunPrometheusHandler(t *testing.T) {
rr := httptest.NewRecorder()
route.ServeHTTP(rr, req)
t.Log(rr.Body.String())
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 5"))
assert.True(t, strings.Contains(rr.Body.String(), "statup_total_services 6"))
}
func RunFailingPrometheusHandler(t *testing.T) {

View File

@ -10,6 +10,26 @@ $('form').submit(function() {
$(this).find("button[type='submit']").prop('disabled',true);
});
$('select#service_type').on('change', function() {
var selected = $('#service_type option:selected').val();
if (selected == "tcp") {
$("#service_port").parent().parent().removeClass("d-none");
$("#service_check_type").parent().parent().addClass("d-none");
$("#post_data").parent().parent().addClass("d-none");
$("#service_response").parent().parent().addClass("d-none");
$("#service_response_code").parent().parent().addClass("d-none");
} else {
$("#post_data").parent().parent().removeClass("d-none");
$("#service_response").parent().parent().removeClass("d-none");
$("#service_response_code").parent().parent().removeClass("d-none");
$("#service_check_type").parent().parent().removeClass("d-none");
$("#service_port").parent().parent().addClass("d-none");
}
});
$(".confirm-btn").on('click', function() {
var r = confirm("Are you sure you want to delete?");

View File

@ -34,8 +34,9 @@ CREATE TABLE services (
expected_status INT(6),
check_interval int(11),
post_data text,
order_id integer,
order_id integer default 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
timeout INT(6) DEFAULT 30,
INDEX (id)
);
CREATE TABLE hits (

View File

@ -1,3 +1,6 @@
=========================================== 1531891670
ALTER TABLE services ALTER COLUMN order_id SET DEFAULT 0;
ALTER TABLE services ADD COLUMN timeout integer DEFAULT 30;
=========================================== 1530841150
ALTER TABLE core ADD COLUMN use_cdn BOOL NOT NULL DEFAULT '0';
=========================================== 1

View File

@ -34,7 +34,8 @@ CREATE TABLE services (
expected_status integer,
check_interval integer,
post_data text,
order_id integer,
order_id integer default 0,
timeout integer default 30,
created_at TIMESTAMP
);

View File

@ -1,3 +1,6 @@
=========================================== 1531891670
ALTER TABLE services ALTER COLUMN order_id SET DEFAULT 0;
ALTER TABLE services ADD COLUMN timeout integer DEFAULT 30;
=========================================== 1530841150
ALTER TABLE core ADD COLUMN use_cdn bool DEFAULT FALSE;
=========================================== 1

View File

@ -35,7 +35,8 @@ CREATE TABLE services (
expected_status integer,
check_interval integer,
post_data text,
order_id integer,
order_id integer default 0,
timeout integer default 30,
created_at DATETIME
);

View File

@ -1,3 +1,6 @@
=========================================== 1531891670
ALTER TABLE services ALTER COLUMN order_id SET DEFAULT 0;
ALTER TABLE services ADD COLUMN timeout integer DEFAULT 30;
=========================================== 1530841150
ALTER TABLE core ADD COLUMN use_cdn bool DEFAULT FALSE;
=========================================== 1

View File

@ -104,7 +104,7 @@
<input type="text" name="domain" class="form-control" id="service_url" value="{{$s.Domain}}" placeholder="https://google.com" required>
</div>
</div>
<div class="form-group row">
<div class="form-group row{{if eq $s.Type "tcp"}} d-none{{end}}">
<label for="service_check_type" class="col-sm-4 col-form-label">Service Check Type</label>
<div class="col-sm-8">
<select name="method" class="form-control" id="service_check_type" value="{{$s.Method}}">
@ -113,25 +113,25 @@
</select>
</div>
</div>
<div class="form-group row">
<label for="post_data" class="col-sm-4 col-form-label">Post Data (JSON)</label>
<div class="form-group row{{if eq $s.Type "tcp"}} d-none{{end}}">
<label for="post_data" class="col-sm-4 col-form-label">Optional Post Data (JSON)</label>
<div class="col-sm-8">
<textarea name="post_data" class="form-control" id="post_data" rows="3">{{$s.PostData}}</textarea>
</div>
</div>
<div class="form-group row">
<div class="form-group row{{if eq $s.Type "tcp"}} d-none{{end}}">
<label for="service_response" class="col-sm-4 col-form-label">Expected Response (Regex)</label>
<div class="col-sm-8">
<textarea name="expected" class="form-control" id="service_response" rows="3">{{$s.Expected}}</textarea>
</div>
</div>
<div class="form-group row">
<div class="form-group row{{if eq $s.Type "tcp"}} d-none{{end}}">
<label for="service_response_code" class="col-sm-4 col-form-label">Expected Status Code</label>
<div class="col-sm-8">
<input type="number" name="expected_status" class="form-control" value="{{$s.ExpectedStatus}}" id="service_response_code">
</div>
</div>
<div class="form-group row">
<div class="form-group row{{if eq $s.Type "http"}} d-none{{end}}">
<label for="service_port" class="col-sm-4 col-form-label">TCP Port</label>
<div class="col-sm-8">
<input type="number" name="port" class="form-control" value="{{$s.Port}}" id="service_port" placeholder="8080">
@ -143,6 +143,12 @@
<input type="number" name="interval" class="form-control" value="{{$s.Interval}}" id="service_interval" required>
</div>
</div>
<div class="form-group row">
<label for="service_timeout" class="col-sm-4 col-form-label">Timeout in Seconds</label>
<div class="col-sm-8">
<input type="number" name="timeout" class="form-control" value="{{$s.Timeout}}" id="service_timeout" placeholder="30">
</div>
</div>
<div class="form-group row">
<div class="col-6">
<button type="submit" class="btn btn-success btn-block">Update Service</button>
@ -155,7 +161,7 @@
</div>
<div class="col-12 mt-4">
<div class="col-12 mt-4{{if eq $s.Type "tcp"}} d-none{{end}}">
<h3>Last Response</h3>
<textarea rows="8" class="form-control" readonly>{{ $s.LastResponse }}</textarea>
<div class="form-group row mt-2">
@ -168,7 +174,7 @@
</div>
<div class="col-12 mt-4">
<div class="col-12 mt-4{{if eq $s.Type "tcp"}} d-none{{end}}">
<h3>Service Checkins</h3>
{{ range $s.Checkins }}
<h5>Check #{{.Id}} <span class="badge online_badge float-right">Checked in {{.Ago}}</span></h5>

View File

@ -97,10 +97,10 @@
<div class="form-group row">
<label for="service_response_code" class="col-sm-4 col-form-label">Expected Status Code</label>
<div class="col-sm-8">
<input type="number" name="expected_status" class="form-control" id="service_response_code" value="200">
<input type="number" name="expected_status" class="form-control" id="service_response_code" placeholder="200">
</div>
</div>
<div class="form-group row">
<div class="form-group row d-none">
<label for="service_port" class="col-sm-4 col-form-label">TCP Port</label>
<div class="col-sm-8">
<input type="number" name="port" class="form-control" id="service_port" placeholder="8080">
@ -112,6 +112,12 @@
<input type="number" name="interval" class="form-control" id="service_interval" value="60" required>
</div>
</div>
<div class="form-group row">
<label for="service_timeout" class="col-sm-4 col-form-label">Timeout in Seconds</label>
<div class="col-sm-8">
<input type="number" name="timeout" class="form-control" id="service_timeout" placeholder="30">
</div>
</div>
<div class="form-group row">
<div class="col-sm-12">
<button type="submit" class="btn btn-success btn-block">Create Service</button>

View File

@ -79,6 +79,8 @@ type Service struct {
PostData string `db:"post_data" json:"post_data"`
Port int `db:"port" json:"port"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
Timeout int `db:"timeout" json:"timeout"`
Order int `db:"order_id" json:"order_id"`
Online bool `json:"online"`
Latency float64 `json:"latency"`
Online24Hours float32 `json:"24_hours_online"`