Skip to content

Commit 6ec1a6f

Browse files
committed
Add the ability to configure agent logging
Adds the ability to specify the logging driver and options for the runner (agent), gc, and watchtower containers.
1 parent 8b5720e commit 6ec1a6f

File tree

4 files changed

+112
-58
lines changed

4 files changed

+112
-58
lines changed

config/config.go

+27-21
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,32 @@ type (
4949
}
5050

5151
Agent struct {
52-
Token string
53-
Image string `default:"drone/drone-runner-docker:1"`
54-
Concurrency int `default:"2"`
55-
OS string `default:"linux"`
56-
Arch string `default:"amd64"`
57-
Version string
58-
Kernel string
59-
EnvironFile string `envconfig:"DRONE_AGENT_ENV_FILE"`
60-
Environ []string
61-
Volumes []string
62-
Labels map[string]string `envconfig:"DRONE_AGENT_LABELS"`
52+
Token string
53+
Image string `default:"drone/drone-runner-docker:1"`
54+
Concurrency int `default:"2"`
55+
OS string `default:"linux"`
56+
Arch string `default:"amd64"`
57+
Version string
58+
Kernel string
59+
EnvironFile string `envconfig:"DRONE_AGENT_ENV_FILE"`
60+
Environ []string
61+
Volumes []string
62+
Labels map[string]string `envconfig:"DRONE_AGENT_LABELS"`
63+
LoggingDriver string `envconfig:"DRONE_AGENT_LOGGING_DRIVER"`
64+
LoggingOptions map[string]string `envconfig:"DRONE_AGENT_LOGGING_OPTIONS"`
6365
}
6466

6567
Runner Runner
6668

6769
GC struct {
68-
Enabled bool `envconfig:"DRONE_GC_ENABLED"`
69-
Image string `envconfig:"DRONE_GC_IMAGE" default:"drone/gc"`
70-
Debug bool `envconfig:"DRONE_GC_DEBUG"`
71-
Images []string `envconfig:"DRONE_GC_IGNORE_IMAGES"`
72-
Interval time.Duration `envconfig:"DRONE_GC_INTERVAL" default:"30m"`
73-
Cache string `envconfig:"DRONE_GC_CACHE" default:"10gb"`
70+
Enabled bool `envconfig:"DRONE_GC_ENABLED"`
71+
Image string `envconfig:"DRONE_GC_IMAGE" default:"drone/gc"`
72+
Debug bool `envconfig:"DRONE_GC_DEBUG"`
73+
Images []string `envconfig:"DRONE_GC_IGNORE_IMAGES"`
74+
Interval time.Duration `envconfig:"DRONE_GC_INTERVAL" default:"30m"`
75+
Cache string `envconfig:"DRONE_GC_CACHE" default:"10gb"`
76+
LoggingDriver string `envconfig:"DRONE_GC_LOGGING_DRIVER"`
77+
LoggingOptions map[string]string `envconfig:"DRONE_GC_LOGGING_OPTIONS"`
7478
}
7579

7680
Reaper struct {
@@ -79,10 +83,12 @@ type (
7983
}
8084

8185
Watchtower struct {
82-
Enabled bool `envconfig:"DRONE_WATCHTOWER_ENABLED"`
83-
Image string `envconfig:"DRONE_WATCHTOWER_IMAGE" default:"webhippie/watchtower"`
84-
Interval int `envconfig:"DRONE_WATCHTOWER_INTERVAL" default:"300"`
85-
Timeout time.Duration `envconfig:"DRONE_WATCHTOWER_TIMEOUT" default:"120m"`
86+
Enabled bool `envconfig:"DRONE_WATCHTOWER_ENABLED"`
87+
Image string `envconfig:"DRONE_WATCHTOWER_IMAGE" default:"webhippie/watchtower"`
88+
Interval int `envconfig:"DRONE_WATCHTOWER_INTERVAL" default:"300"`
89+
Timeout time.Duration `envconfig:"DRONE_WATCHTOWER_TIMEOUT" default:"120m"`
90+
LoggingDriver string `envconfig:"DRONE_WATCHTOWER_LOGGING_DRIVER"`
91+
LoggingOptions map[string]string `envconfig:"DRONE_WATCHTOWER_LOGGING_OPTIONS"`
8692
}
8793

8894
HTTP struct {

engine/docker.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/drone/autoscaler"
1616
)
1717

18-
// clientFunc defines a builder funciton used to build and return
18+
// clientFunc defines a builder function used to build and return
1919
// the docker client from a Server. This is primarily used for
2020
// mock unit testing.
2121
type clientFunc func(*autoscaler.Server) (docker.APIClient, io.Closer, error)

engine/engine.go

+31-25
Original file line numberDiff line numberDiff line change
@@ -58,31 +58,37 @@ func New(
5858
client: newDockerClient,
5959
},
6060
installer: &installer{
61-
metrics: metrics,
62-
servers: servers,
63-
os: config.Agent.OS,
64-
arch: config.Agent.Arch,
65-
image: config.Agent.Image,
66-
secret: config.Agent.Token,
67-
envs: config.Agent.Environ,
68-
volumes: config.Agent.Volumes,
69-
labels: config.Agent.Labels,
70-
proto: config.Server.Proto,
71-
host: config.Server.Host,
72-
client: newDockerClient,
73-
runner: config.Runner,
74-
checkInterval: config.Check.Interval,
75-
checkDeadline: config.Check.Deadline,
76-
gcEnabled: config.GC.Enabled,
77-
gcDebug: config.GC.Debug,
78-
gcImage: config.GC.Image,
79-
gcIgnore: config.GC.Images,
80-
gcInterval: config.GC.Interval,
81-
gcCache: config.GC.Cache,
82-
watchtowerEnabled: config.Watchtower.Enabled,
83-
watchtowerImage: config.Watchtower.Image,
84-
watchtowerTimeout: config.Watchtower.Timeout,
85-
watchtowerInterval: config.Watchtower.Interval,
61+
metrics: metrics,
62+
servers: servers,
63+
os: config.Agent.OS,
64+
arch: config.Agent.Arch,
65+
image: config.Agent.Image,
66+
secret: config.Agent.Token,
67+
envs: config.Agent.Environ,
68+
volumes: config.Agent.Volumes,
69+
labels: config.Agent.Labels,
70+
loggingDriver: config.Agent.LoggingDriver,
71+
loggingOptions: config.Agent.LoggingOptions,
72+
proto: config.Server.Proto,
73+
host: config.Server.Host,
74+
client: newDockerClient,
75+
runner: config.Runner,
76+
checkInterval: config.Check.Interval,
77+
checkDeadline: config.Check.Deadline,
78+
gcEnabled: config.GC.Enabled,
79+
gcDebug: config.GC.Debug,
80+
gcImage: config.GC.Image,
81+
gcIgnore: config.GC.Images,
82+
gcInterval: config.GC.Interval,
83+
gcCache: config.GC.Cache,
84+
gcLoggingDriver: config.GC.LoggingDriver,
85+
gcLoggingOptions: config.GC.LoggingOptions,
86+
watchtowerEnabled: config.Watchtower.Enabled,
87+
watchtowerImage: config.Watchtower.Image,
88+
watchtowerTimeout: config.Watchtower.Timeout,
89+
watchtowerInterval: config.Watchtower.Interval,
90+
watchtowerLoggingDriver: config.Watchtower.LoggingDriver,
91+
watchtowerLoggingOptions: config.Watchtower.LoggingOptions,
8692
},
8793
pinger: &pinger{
8894
servers: servers,

engine/install.go

+53-11
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,27 @@ type installer struct {
4040
keepaliveTimeout time.Duration
4141
runner config.Runner
4242
labels map[string]string
43+
loggingDriver string
44+
loggingOptions map[string]string
4345

4446
checkInterval time.Duration
4547
checkDeadline time.Duration
4648

47-
gcEnabled bool
48-
gcDebug bool
49-
gcImage string
50-
gcIgnore []string
51-
gcInterval time.Duration
52-
gcCache string
53-
54-
watchtowerEnabled bool
55-
watchtowerImage string
56-
watchtowerInterval int
57-
watchtowerTimeout time.Duration
49+
gcEnabled bool
50+
gcDebug bool
51+
gcImage string
52+
gcIgnore []string
53+
gcInterval time.Duration
54+
gcCache string
55+
gcLoggingDriver string
56+
gcLoggingOptions map[string]string
57+
58+
watchtowerEnabled bool
59+
watchtowerImage string
60+
watchtowerInterval int
61+
watchtowerTimeout time.Duration
62+
watchtowerLoggingDriver string
63+
watchtowerLoggingOptions map[string]string
5864

5965
servers autoscaler.ServerStore
6066
metrics metrics.Collector
@@ -216,6 +222,10 @@ poller:
216222
mounts = nil
217223
}
218224

225+
if i.loggingDriver == "" {
226+
i.loggingDriver = i.getDaemonLoggingDriver(ctx, client)
227+
}
228+
219229
res, err := client.ContainerCreate(ctx,
220230
&container.Config{
221231
Image: i.image,
@@ -239,6 +249,10 @@ poller:
239249
RestartPolicy: container.RestartPolicy{
240250
Name: "always",
241251
},
252+
LogConfig: container.LogConfig{
253+
Type: i.loggingDriver,
254+
Config: i.loggingOptions,
255+
},
242256
}, nil, "agent")
243257

244258
if err != nil {
@@ -303,6 +317,11 @@ poller:
303317

304318
func (i *installer) setupWatchtower(ctx context.Context, client docker.APIClient) error {
305319
vols := []string{"/var/run/docker.sock:/var/run/docker.sock"}
320+
321+
if i.watchtowerLoggingDriver == "" {
322+
i.watchtowerLoggingDriver = i.getDaemonLoggingDriver(ctx, client)
323+
}
324+
306325
res, err := client.ContainerCreate(ctx,
307326
&container.Config{
308327
Image: i.watchtowerImage,
@@ -321,6 +340,10 @@ func (i *installer) setupWatchtower(ctx context.Context, client docker.APIClient
321340
RestartPolicy: container.RestartPolicy{
322341
Name: "always",
323342
},
343+
LogConfig: container.LogConfig{
344+
Type: i.watchtowerLoggingDriver,
345+
Config: i.watchtowerLoggingOptions,
346+
},
324347
}, nil, "watchtower")
325348
if err != nil {
326349
return err
@@ -355,6 +378,10 @@ func (i *installer) setupGarbageCollector(ctx context.Context, client docker.API
355378
io.Copy(ioutil.Discard, rc)
356379
rc.Close()
357380

381+
if i.gcLoggingDriver == "" {
382+
i.gcLoggingDriver = i.getDaemonLoggingDriver(ctx, client)
383+
}
384+
358385
res, err := client.ContainerCreate(ctx,
359386
&container.Config{
360387
Image: i.gcImage,
@@ -371,13 +398,28 @@ func (i *installer) setupGarbageCollector(ctx context.Context, client docker.API
371398
RestartPolicy: container.RestartPolicy{
372399
Name: "always",
373400
},
401+
LogConfig: container.LogConfig{
402+
Type: i.gcLoggingDriver,
403+
Config: i.gcLoggingOptions,
404+
},
374405
}, nil, "drone-gc")
375406
if err != nil {
376407
return err
377408
}
378409
return client.ContainerStart(ctx, res.ID, types.ContainerStartOptions{})
379410
}
380411

412+
func (i *installer) getDaemonLoggingDriver(ctx context.Context, client docker.APIClient) string {
413+
info, err := client.Info(ctx)
414+
if err != nil {
415+
logger.FromContext(ctx).
416+
WithError(err).
417+
Warnln("cannot acquire logging driver, using 'json-file'")
418+
return "json-file"
419+
}
420+
return info.LoggingDriver
421+
}
422+
381423
func (i *installer) errorUpdate(ctx context.Context, server *autoscaler.Server, err error) error {
382424
if err != nil {
383425
server.State = autoscaler.StateError

0 commit comments

Comments
 (0)