@@ -20,6 +20,7 @@ import (
20
20
"fmt"
21
21
"time"
22
22
23
+ "github.com/aws/amazon-ecs-agent/agent/doctor"
23
24
"github.com/aws/amazon-ecs-agent/agent/eni/watcher"
24
25
"github.com/aws/aws-sdk-go/aws/awserr"
25
26
@@ -358,6 +359,15 @@ func (agent *ecsAgent) doStart(containerChangeEventStream *eventstream.EventStre
358
359
agent .saveMetadata (data .EC2InstanceIDKey , currentEC2InstanceID )
359
360
}
360
361
362
+ // now that we know the container instance ARN, we can build out the doctor
363
+ // and pass it on to ACS and TACS
364
+ doctor , doctorCreateErr := agent .newDoctorWithHealthchecks (agent .cfg .Cluster , agent .containerInstanceARN )
365
+ if doctorCreateErr != nil {
366
+ seelog .Warnf ("Error starting doctor, healthchecks won't be running: %v" , err )
367
+ } else {
368
+ seelog .Debug ("Doctor healthchecks set up properly." )
369
+ }
370
+
361
371
// Begin listening to the docker daemon and saving changes
362
372
taskEngine .SetDataClient (agent .dataClient )
363
373
imageManager .SetDataClient (agent .dataClient )
@@ -370,11 +380,11 @@ func (agent *ecsAgent) doStart(containerChangeEventStream *eventstream.EventStre
370
380
taskHandler := eventhandler .NewTaskHandler (agent .ctx , agent .dataClient , state , client )
371
381
attachmentEventHandler := eventhandler .NewAttachmentEventHandler (agent .ctx , agent .dataClient , client )
372
382
agent .startAsyncRoutines (containerChangeEventStream , credentialsManager , imageManager ,
373
- taskEngine , deregisterInstanceEventStream , client , taskHandler , attachmentEventHandler , state )
383
+ taskEngine , deregisterInstanceEventStream , client , taskHandler , attachmentEventHandler , state , doctor )
374
384
375
385
// Start the acs session, which should block doStart
376
386
return agent .startACSSession (credentialsManager , taskEngine ,
377
- deregisterInstanceEventStream , client , state , taskHandler )
387
+ deregisterInstanceEventStream , client , state , taskHandler , doctor )
378
388
}
379
389
380
390
// newTaskEngine creates a new docker task engine object. It tries to load the
@@ -447,6 +457,21 @@ func (agent *ecsAgent) initMetricsEngine() {
447
457
metrics .PublishMetrics ()
448
458
}
449
459
460
+ // newDoctorWithHealthchecks creates a new doctor and also configures
461
+ // the healthchecks that the doctor should be running
462
+ func (agent * ecsAgent ) newDoctorWithHealthchecks (cluster , containerInstanceARN string ) (* doctor.Doctor , error ) {
463
+ // configure the required healthchecks
464
+ runtimeHealthCheck := doctor .NewDockerRuntimeHealthcheck (agent .dockerClient )
465
+
466
+ // put the healthechecks in a list
467
+ healthcheckList := []doctor.Healthcheck {
468
+ runtimeHealthCheck ,
469
+ }
470
+
471
+ // set up the doctor and return it
472
+ return doctor .NewDoctor (healthcheckList , cluster , containerInstanceARN )
473
+ }
474
+
450
475
// setClusterInConfig sets the cluster name in the config object based on
451
476
// previous state. It returns an error if there's a mismatch between the
452
477
// the current cluster name with what's restored from the cluster state
@@ -648,7 +673,9 @@ func (agent *ecsAgent) startAsyncRoutines(
648
673
client api.ECSClient ,
649
674
taskHandler * eventhandler.TaskHandler ,
650
675
attachmentEventHandler * eventhandler.AttachmentEventHandler ,
651
- state dockerstate.TaskEngineState ) {
676
+ state dockerstate.TaskEngineState ,
677
+ doctor * doctor.Doctor ,
678
+ ) {
652
679
653
680
// Start of the periodic image cleanup process
654
681
if ! agent .cfg .ImageCleanupDisabled .Enabled () {
@@ -687,6 +714,7 @@ func (agent *ecsAgent) startAsyncRoutines(
687
714
ECSClient : client ,
688
715
TaskEngine : taskEngine ,
689
716
StatsEngine : statsEngine ,
717
+ Doctor : doctor ,
690
718
}
691
719
692
720
// Start metrics session in a go routine
@@ -748,21 +776,24 @@ func (agent *ecsAgent) startACSSession(
748
776
deregisterInstanceEventStream * eventstream.EventStream ,
749
777
client api.ECSClient ,
750
778
state dockerstate.TaskEngineState ,
751
- taskHandler * eventhandler.TaskHandler ) int {
779
+ taskHandler * eventhandler.TaskHandler ,
780
+ doctor * doctor.Doctor ) int {
752
781
753
782
acsSession := acshandler .NewSession (
754
783
agent .ctx ,
755
784
agent .cfg ,
756
785
deregisterInstanceEventStream ,
757
786
agent .containerInstanceARN ,
758
787
agent .credentialProvider ,
788
+ agent .dockerClient ,
759
789
client ,
760
790
state ,
761
791
agent .dataClient ,
762
792
taskEngine ,
763
793
credentialsManager ,
764
794
taskHandler ,
765
795
agent .latestSeqNumberTaskManifest ,
796
+ doctor ,
766
797
)
767
798
seelog .Info ("Beginning Polling for updates" )
768
799
err := acsSession .Start ()
0 commit comments