Skip to content

Commit

Permalink
Add application
Browse files Browse the repository at this point in the history
  • Loading branch information
gianlucaborello committed Oct 6, 2016
1 parent 743a8cd commit 9dc5c92
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 1 deletion.
8 changes: 8 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM golang:latest
MAINTAINER Gianluca Borello <[email protected]>

COPY healthchecker /go/src/github.com/gianlucaborello/healthchecker-kubernetes/healthchecker
RUN go get -d -v github.com/gianlucaborello/healthchecker-kubernetes/healthchecker
RUN go install -v github.com/gianlucaborello/healthchecker-kubernetes/healthchecker

ENTRYPOINT ["/go/bin/healthchecker"]
91 changes: 91 additions & 0 deletions healthchecker/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package main

import "fmt"
import "bufio"
import "net"
import "time"
import "os"
import "flag"
import "gopkg.in/redis.v4"

func resolveTarget(target string) (ip net.IP, err error) {
ips, err := net.LookupIP(target)
if err != nil {
return nil, err
}

for _, i := range ips {
if i.To4() != nil {
ip = i
break
}
}

return ip, nil
}

func doHealthCheck(ip net.IP) (respTime int, err error) {
fmt.Printf("Pinging service... ")

t1 := time.Now()

conn, err := net.DialTimeout("tcp", ip.String() + ":80", 1 * time.Second)
if err != nil {
return 0, err
}

fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
return 0, err
}

t2 := time.Now()
respTime = int((t2.Sub(t1)) / time.Microsecond)

fmt.Printf("service returned %v bytes in %v us\n", len(status), respTime)
return respTime, nil
}

func storeInRedis(redisClient *redis.Client, target string, respTime interface{}) (err error) {
redisClient.Set("response_times:"+target, respTime, 0)
return nil
}

func main() {

target := flag.String("target", "", "Target host for health check")
interval := flag.Int("interval", 1, "Interval in seconds for health check")
redisHost := flag.String("redis", "", "Redis server for stat storing")

flag.Parse()

redisClient := redis.NewClient(&redis.Options{
Addr: *redisHost + ":6379",
})

_, err := redisClient.Ping().Result()
if err != nil {
fmt.Printf("Error: %s\n", err)
os.Exit(1)
}

ip, err := resolveTarget(*target)
if err != nil {
fmt.Printf("Error: %s\n", err)
os.Exit(1)
}

for {
time.Sleep(time.Duration(*interval) * time.Second)

respTime, err := doHealthCheck(ip)
if err != nil {
fmt.Printf("Error during health check\n")
storeInRedis(redisClient, *target, "error")
continue
}

storeInRedis(redisClient, *target, respTime)
}
}
2 changes: 1 addition & 1 deletion manifests/backend.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ metadata:
app: critical-app
role: backend
spec:
clusterIP: None
# clusterIP: None
ports:
- port: 80
selector:
Expand Down
15 changes: 15 additions & 0 deletions manifests/healthchecker.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: healthchecker
namespace: critical-app
spec:
template:
metadata:
labels:
app: critical-app
role: healthchecker
spec:
containers:
- name: healthchecker
image: healthchecker

0 comments on commit 9dc5c92

Please sign in to comment.