@@ -51,7 +51,7 @@ type Docker struct {
51
51
52
52
client Client
53
53
httpClient * http.Client
54
- engine_host string
54
+ engineHost string
55
55
serverVersion string
56
56
filtersCreated bool
57
57
labelFilter filter.Filter
@@ -122,12 +122,15 @@ var sampleConfig = `
122
122
# insecure_skip_verify = false
123
123
`
124
124
125
+ // SampleConfig returns the default Docker TOML configuration.
126
+ func (d * Docker ) SampleConfig () string { return sampleConfig }
127
+
128
+ // Description the metrics returned.
125
129
func (d * Docker ) Description () string {
126
130
return "Read metrics about docker containers"
127
131
}
128
132
129
- func (d * Docker ) SampleConfig () string { return sampleConfig }
130
-
133
+ // Gather metrics from the docker server.
131
134
func (d * Docker ) Gather (acc telegraf.Accumulator ) error {
132
135
if d .client == nil {
133
136
c , err := d .getNewClient ()
@@ -185,7 +188,11 @@ func (d *Docker) Gather(acc telegraf.Accumulator) error {
185
188
}
186
189
ctx , cancel := context .WithTimeout (context .Background (), d .Timeout .Duration )
187
190
defer cancel ()
191
+
188
192
containers , err := d .client .ContainerList (ctx , opts )
193
+ if err == context .DeadlineExceeded {
194
+ return errListTimeout
195
+ }
189
196
if err != nil {
190
197
return err
191
198
}
@@ -196,10 +203,8 @@ func (d *Docker) Gather(acc telegraf.Accumulator) error {
196
203
for _ , container := range containers {
197
204
go func (c types.Container ) {
198
205
defer wg .Done ()
199
- err := d .gatherContainer (c , acc )
200
- if err != nil {
201
- acc .AddError (fmt .Errorf ("E! Error gathering container %s stats: %s\n " ,
202
- c .Names , err .Error ()))
206
+ if err := d .gatherContainer (c , acc ); err != nil {
207
+ acc .AddError (err )
203
208
}
204
209
}(container )
205
210
}
@@ -211,7 +216,11 @@ func (d *Docker) Gather(acc telegraf.Accumulator) error {
211
216
func (d * Docker ) gatherSwarmInfo (acc telegraf.Accumulator ) error {
212
217
ctx , cancel := context .WithTimeout (context .Background (), d .Timeout .Duration )
213
218
defer cancel ()
219
+
214
220
services , err := d .client .ServiceList (ctx , types.ServiceListOptions {})
221
+ if err == context .DeadlineExceeded {
222
+ return errServiceTimeout
223
+ }
215
224
if err != nil {
216
225
return err
217
226
}
@@ -280,19 +289,24 @@ func (d *Docker) gatherInfo(acc telegraf.Accumulator) error {
280
289
dataFields := make (map [string ]interface {})
281
290
metadataFields := make (map [string ]interface {})
282
291
now := time .Now ()
292
+
283
293
// Get info from docker daemon
284
294
ctx , cancel := context .WithTimeout (context .Background (), d .Timeout .Duration )
285
295
defer cancel ()
296
+
286
297
info , err := d .client .Info (ctx )
298
+ if err == context .DeadlineExceeded {
299
+ return errInfoTimeout
300
+ }
287
301
if err != nil {
288
302
return err
289
303
}
290
304
291
- d .engine_host = info .Name
305
+ d .engineHost = info .Name
292
306
d .serverVersion = info .ServerVersion
293
307
294
308
tags := map [string ]string {
295
- "engine_host" : d .engine_host ,
309
+ "engine_host" : d .engineHost ,
296
310
"server_version" : d .serverVersion ,
297
311
}
298
312
@@ -403,7 +417,7 @@ func (d *Docker) gatherContainer(
403
417
imageName , imageVersion := parseImage (container .Image )
404
418
405
419
tags := map [string ]string {
406
- "engine_host" : d .engine_host ,
420
+ "engine_host" : d .engineHost ,
407
421
"server_version" : d .serverVersion ,
408
422
"container_name" : cname ,
409
423
"container_image" : imageName ,
@@ -412,17 +426,22 @@ func (d *Docker) gatherContainer(
412
426
413
427
ctx , cancel := context .WithTimeout (context .Background (), d .Timeout .Duration )
414
428
defer cancel ()
429
+
415
430
r , err := d .client .ContainerStats (ctx , container .ID , false )
431
+ if err == context .DeadlineExceeded {
432
+ return errStatsTimeout
433
+ }
416
434
if err != nil {
417
- return fmt .Errorf ("Error getting docker stats: %s " , err . Error () )
435
+ return fmt .Errorf ("error getting docker stats: %v " , err )
418
436
}
437
+
419
438
defer r .Body .Close ()
420
439
dec := json .NewDecoder (r .Body )
421
440
if err = dec .Decode (& v ); err != nil {
422
441
if err == io .EOF {
423
442
return nil
424
443
}
425
- return fmt .Errorf ("Error decoding: %s " , err . Error () )
444
+ return fmt .Errorf ("error decoding: %v " , err )
426
445
}
427
446
daemonOSType := r .OSType
428
447
@@ -438,19 +457,35 @@ func (d *Docker) gatherContainer(
438
457
}
439
458
}
440
459
460
+ return d .gatherContainerInspect (container , acc , tags , daemonOSType , v )
461
+ }
462
+
463
+ func (d * Docker ) gatherContainerInspect (
464
+ container types.Container ,
465
+ acc telegraf.Accumulator ,
466
+ tags map [string ]string ,
467
+ daemonOSType string ,
468
+ v * types.StatsJSON ,
469
+ ) error {
470
+ ctx , cancel := context .WithTimeout (context .Background (), d .Timeout .Duration )
471
+ defer cancel ()
472
+
441
473
info , err := d .client .ContainerInspect (ctx , container .ID )
474
+ if err == context .DeadlineExceeded {
475
+ return errInspectTimeout
476
+ }
442
477
if err != nil {
443
- return fmt .Errorf ("Error inspecting docker container: %s " , err . Error () )
478
+ return fmt .Errorf ("error inspecting docker container: %v " , err )
444
479
}
445
480
446
481
// Add whitelisted environment variables to tags
447
482
if len (d .TagEnvironment ) > 0 {
448
483
for _ , envvar := range info .Config .Env {
449
484
for _ , configvar := range d .TagEnvironment {
450
- dock_env := strings .SplitN (envvar , "=" , 2 )
485
+ dockEnv := strings .SplitN (envvar , "=" , 2 )
451
486
//check for presence of tag in whitelist
452
- if len (dock_env ) == 2 && len (strings .TrimSpace (dock_env [1 ])) != 0 && configvar == dock_env [0 ] {
453
- tags [dock_env [0 ]] = dock_env [1 ]
487
+ if len (dockEnv ) == 2 && len (strings .TrimSpace (dockEnv [1 ])) != 0 && configvar == dockEnv [0 ] {
488
+ tags [dockEnv [0 ]] = dockEnv [1 ]
454
489
}
455
490
}
456
491
}
@@ -800,7 +835,7 @@ func sliceContains(in string, sl []string) bool {
800
835
func parseSize (sizeStr string ) (int64 , error ) {
801
836
matches := sizeRegex .FindStringSubmatch (sizeStr )
802
837
if len (matches ) != 4 {
803
- return - 1 , fmt .Errorf ("invalid size: '%s' " , sizeStr )
838
+ return - 1 , fmt .Errorf ("invalid size: %s " , sizeStr )
804
839
}
805
840
806
841
size , err := strconv .ParseFloat (matches [1 ], 64 )
0 commit comments