Prober Server probe your services deploy in kubernetes as a sidecar.
$ export PROBER_SERVER_PORT="9078"
$ export PROBER_DURATION="5s"
$ export PROBER_RETRY="5"
$ export PROBER_TYPE="HTTP"
$ export PROBER_HTTP_URL="http://example.com/healthcheck"
$ go run main.go
2020/10/23 14:34:56 Env `PROBER_HTTP_TIMEOUT` is not set, using default value 30
2020/10/23 14:34:56 Prober server running in `HTTP` type; Probe Duration: 5s
2020/10/23 14:34:56 HTTP URL: http://example.com:5000/healthcheck; HTTP Timeout: 30
2020/10/23 14:35:26 STATUS: RETRYING - 2020-10-23 06:35:26.304173 +0000 UTC
2020/10/23 14:36:01 STATUS: RETRYING - 2020-10-23 06:36:01.312028 +0000 UTC
2020/10/23 14:36:36 STATUS: RETRYING - 2020-10-23 06:36:36.31496 +0000 UTC
2020/10/23 14:37:11 STATUS: FAILED - 2020-10-23 06:37:11.320504 +0000 UTC
Then you can get the status by HTTP API:
$ curl http://localhost:9078
{"code":0,"status":"SUCCESS","last_status":"PENDING","message":"","retry_time":0,"last_updated":"2020-10-23T06:32:49.779909Z"}
$ curl http://localhost:9078
{"code":1,"status":"RETRYING","last_status":"SUCCESS","message":"Get \"http://example.com:5000/healthcheck\": dial tcp 93.184.216.34:5000: i/o timeout","retry_time":1,"last_updated":"2020-10-23T06:35:26.304172Z"}
$ curl http://localhost:9078
{"code":2,"status":"FAILED","last_status":"RETRYING","message":"Get \"http://example.com:5000/healthcheck\": dial tcp 93.184.216.34:5000: i/o timeout","retry_time":4,"last_updated":"2020-10-23T06:39:17.679375Z"}
$ docker build --tag prober-server:latest .
$ docker run -tid --name prober-server -p 9078:9078 \
-e PROBER_TYPE=http \
-e PROBER_DURATION=5s \
-e PROBER_RETRY=5 \
-e PROBER_HTTP_URL="http://example.com/healthcheck" \
prober-server:latest
You can also probe TCP service by set PROBER_TYPE
environment variables:
$ export PROBER_SERVER_PORT="9078"
$ export PROBER_DURATION="5s"
$ export PROBER_RETRY="5"
$ export PROBER_TYPE="TCP" # this changed
$ export PROBER_TCP_HOST="example.com"
$ export PROBER_TCP_PORT="8080"
$ go run main.go
And UDP service by:
$ export PROBER_SERVER_PORT="9078"
$ export PROBER_DURATION="5s"
$ export PROBER_RETRY="5"
$ export PROBER_TYPE="UDP" # this changed
$ export PROBER_UDP_HOST="example.com"
$ export PROBER_UDP_PORT="4093"
$ go run main.go
You can setup webhook URL for recieving result of prober. To achieve webhook
just setup PROBER_NAME
and PROBER_WEBHOOK
environment variables.
NOTE: PROBER_NAME
is set for identity your service.
$ export PROBER_NAME="YOUR_SERVER"
$ export PROBER_WEBHOOK="http://your-webhook.com"
Then you will recieve a POST Request with following payload:
{
"code": 1,
"last_updated": "2020-10-23T10:21:05.312644Z",
"message": "Get \"http://localhost:80\": dial tcp [::1]:80: connect: connection refused",
"name": "NGINX",
"retry_times": 1,
"status": "RETRYING",
"last_status": "PENDING"
}
By setting PROBER_CONFIG
, you can setup custom headers and body
$ cat << EOF > /tmp/config.yaml
version: "1"
headers:
Content-Type: application/json;charset=utf-8
User-Agent: My-Prober
body:
template: |
{
"text": "{{ .Name }} change to {{ .Status }} from {{ .LastStatus }}at {{ .LastUpdated }}"
}
EOF
$ export PROBER_CONFIG=/tmp/config.yaml
$ go run main.go
Then you will recieve a HTTP POST Request like:
POST / HTTP/1.1
Host: example.com:8080
User-Agent: My-Prober
Content-Length: 73
Content-Type: application/json;charset=utf-7
Accept-Encoding: gzip
{
"text": "SomeService change to RETRYING from PENDING at 2021-02-20 09:39:12.002609 +0000 UTC"
}
Set PROBER_TRIGGER_ON_STATUS_CHANGE
to be "true"
may make prober-server
POST to webhook only when status changed.