@@ -6,23 +6,28 @@ import (
6
6
"log"
7
7
"os"
8
8
"os/exec"
9
- "strconv"
10
9
"time"
11
10
12
11
"github.com/hashicorp/consul/api"
13
12
)
14
13
15
- func processWatcher (pid int , checkName string , frequency int , client * api.Client ) {
16
- channel := time .Tick (time . Duration ( frequency ) * time . Second )
14
+ func processWatcher (pid int , checkName string , frequency time. Duration , client * api.Client ) {
15
+ channel := time .Tick (frequency )
17
16
for range channel {
18
17
_ , err := os .FindProcess (pid )
19
18
if err != nil {
20
- fmt .Println ("Process is not running" )
21
- client .Agent ().FailTTL (checkName , "Process is not running" )
19
+ log .Println ("[ConsulWrapper] Process is not running" )
20
+ err := client .Agent ().FailTTL (checkName , "Process is not running" )
21
+ if err != nil {
22
+ log .Println ("[ConsulWrapper] Failed to send FAIL health check" , err )
23
+ }
22
24
break
23
25
}
24
- fmt .Println ("Process is running" )
25
- client .Agent ().PassTTL (checkName , "Process is running" )
26
+ log .Println ("[ConsulWrapper] Process is running" )
27
+ err = client .Agent ().PassTTL (checkName , "Process is running" )
28
+ if err != nil {
29
+ log .Println ("[ConsulWrapper] Failed to send PASSING health check" , err )
30
+ }
26
31
}
27
32
}
28
33
@@ -37,50 +42,70 @@ func getConsulClient(httpAddr string, token string) *api.Client {
37
42
return consulClient
38
43
}
39
44
40
- func registerConsulService (name string , frequency int , client * api.Client ) {
41
- fmt .Printf ("Registering '%s' in consul\n " , name )
42
- client .Agent ().ServiceRegister (& api.AgentServiceRegistration {
45
+ func registerConsulService (name string , frequency time. Duration , client * api.Client ) {
46
+ log .Printf ("[ConsulWrapper] Registering '%s' in consul\n " , name )
47
+ err := client .Agent ().ServiceRegister (& api.AgentServiceRegistration {
43
48
ID : name ,
44
49
Name : name ,
45
50
Check : & api.AgentServiceCheck {
46
51
CheckID : name ,
47
52
Name : name ,
48
- DeregisterCriticalServiceAfter : strconv . Itoa ( 2 * frequency ) + "s" ,
49
- TTL : strconv . Itoa ( 3 * frequency ) + "s" ,
53
+ DeregisterCriticalServiceAfter : fmt . Sprintf ( "%d" , int64 ( 2.1 * frequency . Seconds ()) ) + "s" ,
54
+ TTL : fmt . Sprintf ( "%d" , int64 ( 3.1 * frequency . Seconds ()) ) + "s" ,
50
55
},
51
56
})
57
+ if err != nil {
58
+ log .Fatal (err )
59
+ }
52
60
}
53
61
54
62
func deregisterConsulService (name string , client * api.Client ) {
55
- fmt .Printf ("Deregister '%s' from consul\n " , name )
56
- client .Agent ().ServiceDeregister (name )
63
+ log .Printf ("[ConsulWrapper] Deregistering '%s' from consul\n " , name )
64
+ err := client .Agent ().ServiceDeregister (name )
65
+ if err != nil {
66
+ log .Fatal (err )
67
+ }
68
+ }
69
+
70
+ func usage () {
71
+ fmt .Fprintf (os .Stderr , "Usage of %s:\n \n " , os .Args [0 ])
72
+ fmt .Fprintf (os .Stderr , "\t %s [options] -service <ServiceName> <Command> [Args]\n \n " , os .Args [0 ])
73
+ flag .PrintDefaults ()
57
74
}
58
75
59
76
func main () {
60
77
tokenPrt := flag .String ("token" , "" , "Consul token used for registration" )
61
78
servicePtr := flag .String ("service" , "" , "Consul Service Name" )
62
- checkFrequencyPtr := flag .Int ("frequency" , 30 , "Health Check Frequency (in seconds)" )
63
- commandPtr := flag .String ("command" , "" , "Command to run" )
64
- argumentsPtr := flag .String ("args" , "" , "String with all arguments" )
79
+ checkFrequencyPtr := flag .Duration ("frequency" , time .Duration (30 ), "Health Check Frequency (in seconds)" )
80
+
65
81
flag .Parse ()
82
+ if * servicePtr == "" {
83
+ usage ()
84
+ os .Exit (1 )
85
+ }
86
+ arguments := flag .Args ()
87
+
88
+ consulClient := getConsulClient ("localhost:8500" , * tokenPrt )
89
+ registerConsulService (* servicePtr , * checkFrequencyPtr , consulClient )
66
90
67
- cmd := exec .Command (* commandPtr , * argumentsPtr )
91
+ cmd := exec .Command (arguments [0 ], arguments [1 :]... )
92
+ cmd .Stdout = os .Stdout
93
+ cmd .Stderr = os .Stderr
68
94
if err := cmd .Start (); err != nil {
69
- fmt .Println ("Failed to start: " , err )
95
+ log .Println ("[ConsulWrapper] Failed to start: " , err )
70
96
return
71
97
}
72
98
73
- consulClient := getConsulClient ("localhost:8500" , * tokenPrt )
74
- registerConsulService (* servicePtr , * checkFrequencyPtr , consulClient )
75
99
go processWatcher (cmd .Process .Pid , * servicePtr , * checkFrequencyPtr , consulClient )
76
100
77
101
if err := cmd .Wait (); err != nil {
78
102
exitCode := cmd .ProcessState .ExitCode ()
79
- fmt .Printf ("Process stopped running. Error: '%s' Exit code: %d\n " , err .Error (), exitCode )
103
+ log .Println ("[ConsulWrapper] Error: " , err .Error ())
104
+ log .Println ("[ConsulWrapper] Process stopped running. Exit code: " , exitCode )
80
105
deregisterConsulService (* servicePtr , consulClient )
81
106
os .Exit (exitCode )
82
107
}
83
108
84
- fmt .Println ("Process exited. Exit code: " , cmd .ProcessState .ExitCode ())
109
+ log .Println ("[ConsulWrapper] Process exited. Exit code: " , cmd .ProcessState .ExitCode ())
85
110
deregisterConsulService (* servicePtr , consulClient )
86
111
}
0 commit comments