Skip to content

Commit 1afc5e2

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 98c1f93 commit 1afc5e2

File tree

4 files changed

+115
-61
lines changed

4 files changed

+115
-61
lines changed

config/config.go

+29-23
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,34 @@ 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-
Ports []string `envconfig:"DRONE_AGENT_PUBLISHED_PORTS"`
63-
Labels map[string]string `envconfig:"DRONE_AGENT_LABELS"`
64-
NamePrefix string `envconfig:"DRONE_AGENT_NAME_PREFIX" default:"agent-"`
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+
Ports []string `envconfig:"DRONE_AGENT_PUBLISHED_PORTS"`
63+
Labels map[string]string `envconfig:"DRONE_AGENT_LABELS"`
64+
NamePrefix string `envconfig:"DRONE_AGENT_NAME_PREFIX" default:"agent-"`
65+
LoggingDriver string `envconfig:"DRONE_AGENT_LOGGING_DRIVER"`
66+
LoggingOptions map[string]string `envconfig:"DRONE_AGENT_LOGGING_OPTIONS"`
6567
}
6668

6769
Runner Runner
6870

6971
GC struct {
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"`
72+
Enabled bool `envconfig:"DRONE_GC_ENABLED"`
73+
Image string `envconfig:"DRONE_GC_IMAGE" default:"drone/gc"`
74+
Debug bool `envconfig:"DRONE_GC_DEBUG"`
75+
Images []string `envconfig:"DRONE_GC_IGNORE_IMAGES"`
76+
Interval time.Duration `envconfig:"DRONE_GC_INTERVAL" default:"30m"`
77+
Cache string `envconfig:"DRONE_GC_CACHE" default:"10gb"`
78+
LoggingDriver string `envconfig:"DRONE_GC_LOGGING_DRIVER"`
79+
LoggingOptions map[string]string `envconfig:"DRONE_GC_LOGGING_OPTIONS"`
7680
}
7781

7882
Reaper struct {
@@ -86,10 +90,12 @@ type (
8690
}
8791

8892
Watchtower struct {
89-
Enabled bool `envconfig:"DRONE_WATCHTOWER_ENABLED"`
90-
Image string `envconfig:"DRONE_WATCHTOWER_IMAGE" default:"webhippie/watchtower"`
91-
Interval int `envconfig:"DRONE_WATCHTOWER_INTERVAL" default:"300"`
92-
Timeout time.Duration `envconfig:"DRONE_WATCHTOWER_TIMEOUT" default:"120m"`
93+
Enabled bool `envconfig:"DRONE_WATCHTOWER_ENABLED"`
94+
Image string `envconfig:"DRONE_WATCHTOWER_IMAGE" default:"webhippie/watchtower"`
95+
Interval int `envconfig:"DRONE_WATCHTOWER_INTERVAL" default:"300"`
96+
Timeout time.Duration `envconfig:"DRONE_WATCHTOWER_TIMEOUT" default:"120m"`
97+
LoggingDriver string `envconfig:"DRONE_WATCHTOWER_LOGGING_DRIVER"`
98+
LoggingOptions map[string]string `envconfig:"DRONE_WATCHTOWER_LOGGING_OPTIONS"`
9399
}
94100

95101
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

+32-26
Original file line numberDiff line numberDiff line change
@@ -58,32 +58,38 @@ 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-
ports: config.Agent.Ports,
70-
labels: config.Agent.Labels,
71-
proto: config.Server.Proto,
72-
host: config.Server.Host,
73-
client: newDockerClient,
74-
runner: config.Runner,
75-
checkInterval: config.Check.Interval,
76-
checkDeadline: config.Check.Deadline,
77-
gcEnabled: config.GC.Enabled,
78-
gcDebug: config.GC.Debug,
79-
gcImage: config.GC.Image,
80-
gcIgnore: config.GC.Images,
81-
gcInterval: config.GC.Interval,
82-
gcCache: config.GC.Cache,
83-
watchtowerEnabled: config.Watchtower.Enabled,
84-
watchtowerImage: config.Watchtower.Image,
85-
watchtowerTimeout: config.Watchtower.Timeout,
86-
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+
ports: config.Agent.Ports,
70+
labels: config.Agent.Labels,
71+
loggingDriver: config.Agent.LoggingDriver,
72+
loggingOptions: config.Agent.LoggingOptions,
73+
proto: config.Server.Proto,
74+
host: config.Server.Host,
75+
client: newDockerClient,
76+
runner: config.Runner,
77+
checkInterval: config.Check.Interval,
78+
checkDeadline: config.Check.Deadline,
79+
gcEnabled: config.GC.Enabled,
80+
gcDebug: config.GC.Debug,
81+
gcImage: config.GC.Image,
82+
gcIgnore: config.GC.Images,
83+
gcInterval: config.GC.Interval,
84+
gcCache: config.GC.Cache,
85+
gcLoggingDriver: config.GC.LoggingDriver,
86+
gcLoggingOptions: config.GC.LoggingOptions,
87+
watchtowerEnabled: config.Watchtower.Enabled,
88+
watchtowerImage: config.Watchtower.Image,
89+
watchtowerTimeout: config.Watchtower.Timeout,
90+
watchtowerInterval: config.Watchtower.Interval,
91+
watchtowerLoggingDriver: config.Watchtower.LoggingDriver,
92+
watchtowerLoggingOptions: config.Watchtower.LoggingOptions,
8793
},
8894
pinger: &pinger{
8995
servers: servers,

engine/install.go

+53-11
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,27 @@ type installer struct {
4242
keepaliveTimeout time.Duration
4343
runner config.Runner
4444
labels map[string]string
45+
loggingDriver string
46+
loggingOptions map[string]string
4547

4648
checkInterval time.Duration
4749
checkDeadline time.Duration
4850

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

6167
servers autoscaler.ServerStore
6268
metrics metrics.Collector
@@ -225,6 +231,10 @@ poller:
225231
return i.errorUpdate(ctx, instance, err)
226232
}
227233

234+
if i.loggingDriver == "" {
235+
i.loggingDriver = i.getDaemonLoggingDriver(ctx, client)
236+
}
237+
228238
res, err := client.ContainerCreate(ctx,
229239
&container.Config{
230240
Image: i.image,
@@ -250,6 +260,10 @@ poller:
250260
RestartPolicy: container.RestartPolicy{
251261
Name: "always",
252262
},
263+
LogConfig: container.LogConfig{
264+
Type: i.loggingDriver,
265+
Config: i.loggingOptions,
266+
},
253267
}, nil, "agent")
254268

255269
if err != nil {
@@ -314,6 +328,11 @@ poller:
314328

315329
func (i *installer) setupWatchtower(ctx context.Context, client docker.APIClient) error {
316330
vols := []string{"/var/run/docker.sock:/var/run/docker.sock"}
331+
332+
if i.watchtowerLoggingDriver == "" {
333+
i.watchtowerLoggingDriver = i.getDaemonLoggingDriver(ctx, client)
334+
}
335+
317336
res, err := client.ContainerCreate(ctx,
318337
&container.Config{
319338
Image: i.watchtowerImage,
@@ -332,6 +351,10 @@ func (i *installer) setupWatchtower(ctx context.Context, client docker.APIClient
332351
RestartPolicy: container.RestartPolicy{
333352
Name: "always",
334353
},
354+
LogConfig: container.LogConfig{
355+
Type: i.watchtowerLoggingDriver,
356+
Config: i.watchtowerLoggingOptions,
357+
},
335358
}, nil, "watchtower")
336359
if err != nil {
337360
return err
@@ -366,6 +389,10 @@ func (i *installer) setupGarbageCollector(ctx context.Context, client docker.API
366389
io.Copy(ioutil.Discard, rc)
367390
rc.Close()
368391

392+
if i.gcLoggingDriver == "" {
393+
i.gcLoggingDriver = i.getDaemonLoggingDriver(ctx, client)
394+
}
395+
369396
res, err := client.ContainerCreate(ctx,
370397
&container.Config{
371398
Image: i.gcImage,
@@ -382,13 +409,28 @@ func (i *installer) setupGarbageCollector(ctx context.Context, client docker.API
382409
RestartPolicy: container.RestartPolicy{
383410
Name: "always",
384411
},
412+
LogConfig: container.LogConfig{
413+
Type: i.gcLoggingDriver,
414+
Config: i.gcLoggingOptions,
415+
},
385416
}, nil, "drone-gc")
386417
if err != nil {
387418
return err
388419
}
389420
return client.ContainerStart(ctx, res.ID, types.ContainerStartOptions{})
390421
}
391422

423+
func (i *installer) getDaemonLoggingDriver(ctx context.Context, client docker.APIClient) string {
424+
info, err := client.Info(ctx)
425+
if err != nil {
426+
logger.FromContext(ctx).
427+
WithError(err).
428+
Warnln("cannot acquire logging driver, using 'json-file'")
429+
return "json-file"
430+
}
431+
return info.LoggingDriver
432+
}
433+
392434
func (i *installer) errorUpdate(ctx context.Context, server *autoscaler.Server, err error) error {
393435
if err != nil {
394436
server.State = autoscaler.StateError

0 commit comments

Comments
 (0)