@@ -2,6 +2,7 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "flag"
5
6
"math"
6
7
"os"
7
8
"os/exec"
@@ -14,14 +15,17 @@ import (
14
15
"github.com/go-kit/kit/log"
15
16
"github.com/go-kit/kit/log/level"
16
17
"github.com/oklog/run"
18
+ "kubesphere.io/fluentbit-operator/pkg/filenotify"
17
19
)
18
20
19
21
const (
20
- binPath = "/fluent-bit/bin/fluent-bit"
21
- cfgPath = "/fluent-bit/etc/fluent-bit.conf"
22
- watchDir = "/fluent-bit/config"
23
- MaxDelayTime = time .Minute * 5
24
- ResetTime = time .Minute * 10
22
+ defaultBinPath = "/fluent-bit/bin/fluent-bit"
23
+ defaultCfgPath = "/fluent-bit/etc/fluent-bit.conf"
24
+ defaultWatchDir = "/fluent-bit/config"
25
+ defaultPollInterval = 1 * time .Second
26
+
27
+ MaxDelayTime = 5 * time .Minute
28
+ ResetTime = 10 * time .Minute
25
29
)
26
30
27
31
var (
33
37
timerCancel context.CancelFunc
34
38
)
35
39
40
+ var configPath string
41
+ var binPath string
42
+ var watchPath string
43
+ var poll bool
44
+ var pollInterval time.Duration
45
+
36
46
func main () {
47
+
48
+ flag .StringVar (& binPath , "b" , defaultBinPath , "The fluent bit binary path." )
49
+ flag .StringVar (& configPath , "c" , defaultCfgPath , "The config file path." )
50
+ flag .StringVar (& watchPath , "watch-path" , defaultWatchDir , "The path to watch." )
51
+ flag .BoolVar (& poll , "poll" , false , "Use poll watcher instead of ionotify." )
52
+ flag .DurationVar (& pollInterval , "poll-interval" , defaultPollInterval , "Poll interval if using poll watcher." )
53
+
54
+ flag .Parse ()
55
+
37
56
logger = log .NewLogfmtLogger (os .Stdout )
38
57
39
58
timerCtx , timerCancel = context .WithCancel (context .Background ())
@@ -77,14 +96,14 @@ func main() {
77
96
}
78
97
{
79
98
// Watch the config file, if the config file changed, stop Fluent bit.
80
- watcher , err := fsnotify . NewWatcher ( )
99
+ watcher , err := newWatcher ( poll , pollInterval )
81
100
if err != nil {
82
101
_ = level .Error (logger ).Log ("err" , err )
83
102
return
84
103
}
85
104
86
105
// Start watcher.
87
- err = watcher .Add (watchDir )
106
+ err = watcher .Add (watchPath )
88
107
if err != nil {
89
108
_ = level .Error (logger ).Log ("err" , err )
90
109
return
@@ -98,7 +117,7 @@ func main() {
98
117
select {
99
118
case <- cancel :
100
119
return nil
101
- case event := <- watcher .Events :
120
+ case event := <- watcher .Events () :
102
121
if ! isValidEvent (event ) {
103
122
continue
104
123
}
@@ -110,7 +129,7 @@ func main() {
110
129
stop ()
111
130
resetTimer ()
112
131
_ = level .Info (logger ).Log ("msg" , "Config file changed, stopped Fluent Bit" )
113
- case <- watcher .Errors :
132
+ case <- watcher .Errors () :
114
133
_ = level .Error (logger ).Log ("msg" , "Watcher stopped" )
115
134
return nil
116
135
}
@@ -130,9 +149,26 @@ func main() {
130
149
_ = level .Info (logger ).Log ("msg" , "See you next time!" )
131
150
}
132
151
152
+ func newWatcher (poll bool , interval time.Duration ) (filenotify.FileWatcher , error ) {
153
+ var err error
154
+ var watcher filenotify.FileWatcher
155
+
156
+ if poll {
157
+ watcher = filenotify .NewPollingWatcher (interval )
158
+ } else {
159
+ watcher , err = filenotify .New (interval )
160
+ }
161
+
162
+ if err != nil {
163
+ return nil , err
164
+ }
165
+
166
+ return watcher , nil
167
+ }
168
+
133
169
// Inspired by https://github.com/jimmidyson/configmap-reload
134
170
func isValidEvent (event fsnotify.Event ) bool {
135
- return event .Op & fsnotify .Create == fsnotify .Create
171
+ return event .Op == fsnotify .Create || event . Op == fsnotify .Write
136
172
}
137
173
138
174
func start () {
@@ -144,7 +180,7 @@ func start() {
144
180
return
145
181
}
146
182
147
- cmd = exec .Command (binPath , "-c" , cfgPath )
183
+ cmd = exec .Command (binPath , "-c" , configPath )
148
184
cmd .Stdout = os .Stdout
149
185
cmd .Stderr = os .Stderr
150
186
if err := cmd .Start (); err != nil {
0 commit comments