-
Notifications
You must be signed in to change notification settings - Fork 7
/
pinger.go
84 lines (68 loc) · 1.96 KB
/
pinger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2019 Aporeto Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bahamut
import (
"sync"
"time"
"go.uber.org/zap"
)
const (
// PingStatusOK represents the status "ok"
PingStatusOK = "ok"
// PingStatusTimeout represents the status "timeout"
PingStatusTimeout = "timeout"
// PingStatusError represents the status "error"
PingStatusError = "error"
)
// A Pinger is an interface for objects that implements a Ping method
type Pinger interface {
Ping(timeout time.Duration) error
}
// RetrieveHealthStatus returns the status for each Pinger.
func RetrieveHealthStatus(timeout time.Duration, pingers map[string]Pinger) error {
var firstError error
var wg sync.WaitGroup
wg.Add(len(pingers))
m := &sync.Mutex{}
for name, pinger := range pingers {
go func(name string, pinger Pinger) {
defer wg.Done()
start := time.Now()
err := pinger.Ping(timeout)
status := stringifyStatus(err)
duration := time.Since(start)
zap.L().Info("Ping",
zap.String("service", name),
zap.String("status", status),
zap.String("duration", duration.String()),
zap.Error(err),
)
m.Lock()
if err != nil && firstError == nil {
firstError = err
}
m.Unlock()
}(name, pinger)
}
wg.Wait()
return firstError
}
// stringify status output
func stringifyStatus(err error) string {
if err == nil {
return PingStatusOK
}
errMsg := err.Error()
if errMsg == PingStatusTimeout {
return PingStatusTimeout
}
return PingStatusError
}