Skip to content

Commit fde854f

Browse files
author
SamSyntax
committed
improving logging and adding flag to set health check interval
1 parent dd667ec commit fde854f

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

loadbalancer.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ type ServerInterface interface {
1818
}
1919

2020
type LbServer struct {
21-
addr string
22-
proxy *httputil.ReverseProxy
23-
name string
24-
weight int
25-
current int
26-
mu sync.Mutex
27-
alive bool
21+
addr string // address of the server
22+
proxy *httputil.ReverseProxy // reverse porxy used to forward requests
23+
name string // name of the server
24+
weight int // weight used for weighted round robin
25+
current int // current counter based on weight (if weight of the server is 3 - 3 requests will be sent to this server in this iteration)
26+
mu sync.Mutex // mutex to safely modify instances
27+
alive bool // status of the server (wether it's online or not)
28+
reqAmt int // amount of requests send to the server
2829
}
2930

3031
func (s *LbServer) Address() string {
@@ -37,17 +38,17 @@ func (s *LbServer) IsAlive() bool {
3738
}
3839
res, err := client.Get(s.addr)
3940
if err != nil {
40-
log.Warnf("Server %s - addr: %s is currently offline\n", s.name, s.addr)
41+
log.WithFields(log.Fields{"[Status]": "offline"}).Printf("Server %s - addr: %s\n", s.name, s.addr)
4142
s.alive = false
4243
return false
4344
}
4445
if res.StatusCode != http.StatusOK {
45-
log.Warnf("Server %s - addr: %s is currently offline\n", s.name, s.addr)
46+
log.WithFields(log.Fields{"[Status]": "offline"}).Printf("Server %s - addr: %s\n", s.name, s.addr)
4647
s.alive = false
4748
return false
4849
}
4950
s.alive = true
50-
log.Infof("Server %s - addr: %s is online\n", s.name, s.addr)
51+
log.WithFields(log.Fields{"[Status]": "online"}).Printf("Server %s - addr: %s\n", s.name, s.addr)
5152
return true
5253
}
5354

@@ -94,14 +95,15 @@ func (lb *LoadBalancer) GetNextAvailableServer() LbServer {
9495
}
9596
return *lb.getRoundRobinServer()
9697
}
97-
func (lb *LoadBalancer) getWeightedServer() *LbServer {
9898

99+
func (lb *LoadBalancer) getWeightedServer() *LbServer {
99100
totalServers := len(lb.servers)
100101
for i := 0; i < totalServers; i++ {
101102
server := lb.servers[lb.roundRobinCount%totalServers]
102103
if server.current < server.weight && server.alive {
103104
server.mu.Lock()
104105
server.current++
106+
server.reqAmt++
105107
server.mu.Unlock()
106108
return server
107109
}
@@ -111,12 +113,14 @@ func (lb *LoadBalancer) getWeightedServer() *LbServer {
111113
lb.roundRobinCount++
112114
return lb.servers[lb.roundRobinCount%totalServers]
113115
}
116+
114117
func (lb *LoadBalancer) getRoundRobinServer() *LbServer {
115118
totalServers := len(lb.servers)
116119
for i := 0; i < totalServers; i++ {
117120
server := lb.servers[lb.roundRobinCount%len(lb.servers)]
118121
if server.alive {
119122
lb.roundRobinCount++
123+
server.reqAmt++
120124
return server
121125
}
122126
lb.roundRobinCount++
@@ -131,14 +135,15 @@ func (lb *LoadBalancer) ServeProxy(w http.ResponseWriter, r *http.Request) {
131135
}
132136

133137
func (lb *LoadBalancer) HealthCheck(interval time.Duration) {
134-
for _, server := range lb.servers {
135-
go func(s *LbServer) {
136-
ticker := time.NewTicker(interval)
137-
defer ticker.Stop()
138-
for {
139-
<-ticker.C
140-
s.IsAlive()
141-
}
142-
}(server)
143-
}
138+
for _, server := range lb.servers {
139+
go func(s *LbServer) {
140+
ticker := time.NewTicker(interval)
141+
defer ticker.Stop()
142+
for {
143+
<-ticker.C
144+
log.WithFields(log.Fields{"[ReqAmt]": s.reqAmt}).Infof("Amount of requestes forwarded to %s ", server.addr)
145+
s.IsAlive()
146+
}
147+
}(server)
148+
}
144149
}

main.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package main
22

33
import (
44
"flag"
5-
"fmt"
5+
"io"
66
"net/http"
77
"os"
88
"time"
@@ -16,7 +16,6 @@ func init() {
1616
FullTimestamp: true,
1717
})
1818

19-
log.SetOutput(os.Stdout)
2019
log.SetLevel(log.TraceLevel)
2120
}
2221

@@ -29,13 +28,14 @@ func main() {
2928
Lbport := flag.String("port", "7000", "Specify port on which load balancer is launched.")
3029
LocalServerPort := flag.Int("srv-port", 8000, "Specify port on which local dev server is launched. (If there are more than 1 server to be launched port number will be incremented by 1 for every local server to be spawned ex. server 0 - :8000; sever 1 - :8001)")
3130
healthCheck := flag.Bool("healthCheck", false, "Run health check on external servers from the list")
31+
healthCheckInterval := flag.Int("hcInterval", 20, "Specify interval between running health checks on servers in the pool")
3232

3333
// parsing flags
3434
flag.Parse()
3535

3636
var lb *LoadBalancer
3737
var servers []*LbServer
38-
if *healthCheck {
38+
if *healthCheck || *path != "" {
3939
*env = "external"
4040
}
4141
switch *env {
@@ -63,7 +63,7 @@ func main() {
6363
lb.HealthCheck(1 * time.Second)
6464
os.Exit(1)
6565
}
66-
lb.HealthCheck(5 * time.Second)
66+
lb.HealthCheck(time.Duration(*healthCheckInterval) * time.Second)
6767
handleRedirect := func(w http.ResponseWriter, r *http.Request) {
6868
lb.ServeProxy(w, r)
6969
}
@@ -74,13 +74,14 @@ func main() {
7474
log.Fatalf("Error opening log file: %v", err)
7575
}
7676
defer file.Close()
77-
log.SetOutput(file)
77+
multiWriter := io.MultiWriter(os.Stdout, file)
78+
log.SetOutput(multiWriter)
7879
// Serving loadbalancer
7980
http.HandleFunc("/", handleRedirect)
80-
fmt.Printf("serving requests at localhost:%s\n", lb.port)
8181
log.WithFields(log.Fields{
8282
"port": lb.port,
83-
}).Printf("serving requests at localhost:%s\n", lb.port)
83+
"address": "127.0.0.1",
84+
}).Print("serving requests at\n")
8485
http.ListenAndServe(":"+lb.port, nil)
8586

8687
select {}

0 commit comments

Comments
 (0)