Introduce X-Ray integration for dual-primary

Bug: Issue 14897
Change-Id: I2aac415b0120ec6fcb37c1e6424be2c0bd95e8d1
diff --git a/dual-primary/Makefile b/dual-primary/Makefile
index 1275bbb..5d71b93 100644
--- a/dual-primary/Makefile
+++ b/dual-primary/Makefile
@@ -99,7 +99,8 @@
 					set-optional-params-multisite set-ldap-account-pattern \
 					set-optional-gerrit-ulimits set-optional-jgit-conf \
 					set-high-availability-optional-params \
-					set-optional-refs-db-params
+					set-optional-refs-db-params \
+					set-optional-x-ray
 ifdef GERRIT_PRIMARY1_INSTANCE_ID
 		$(eval PRIMARY1_SERVICE_OPTIONAL_PARAMS := $(PRIMARY1_SERVICE_OPTIONAL_PARAMS) ParameterKey=InstanceId,ParameterValue=$(GERRIT_PRIMARY1_INSTANCE_ID))
 endif
@@ -153,13 +154,15 @@
 		$(METRICS_CW_OPTIONAL_PARAMS) \
 		$(SMTP_OPTIONAL_PARAMS) \
 		$(GERRIT_ULIMITS) \
-		$(REFS_DB_OPTIONAL_PARAMS)
+		$(REFS_DB_OPTIONAL_PARAMS) \
+		$(XRAY_OPTIONAL_PARAMS)
 
 service-primary-2: set-optional-params-metrics-cloudwatch set-optional-params-smtp \
 					set-optional-params-multisite set-ldap-account-pattern \
 					set-optional-gerrit-ulimits set-optional-jgit-conf \
 					set-high-availability-optional-params \
-					set-optional-refs-db-params
+					set-optional-refs-db-params \
+					set-optional-x-ray
 ifdef GERRIT_PRIMARY2_INSTANCE_ID
 		$(eval PRIMARY2_SERVICE_OPTIONAL_PARAMS := $(PRIMARY2_SERVICE_OPTIONAL_PARAMS) ParameterKey=InstanceId,ParameterValue=$(GERRIT_PRIMARY2_INSTANCE_ID))
 endif
@@ -214,7 +217,8 @@
 		$(METRICS_CW_OPTIONAL_PARAMS) \
 		$(SMTP_OPTIONAL_PARAMS) \
 		$(GERRIT_ULIMITS) \
-		$(REFS_DB_OPTIONAL_PARAMS)
+		$(REFS_DB_OPTIONAL_PARAMS) \
+		$(XRAY_OPTIONAL_PARAMS)
 
 service-replication:
 	$(AWS_FC_COMMAND) create-stack \
@@ -237,7 +241,8 @@
 					set-optional-gerrit-ulimits \
 					set-optional-jgit-conf \
 					set-optional-params-for-replica-auto-scaling-capacity \
-					set-optional-params-for-replica-auto-scaling-policy
+					set-optional-params-for-replica-auto-scaling-policy \
+					set-optional-x-ray
 
 ifdef GERRIT_REPLICA_INSTANCE_ID
 		$(eval REPLICA_SERVICE_OPTIONAL_PARAMS := $(REPLICA_SERVICE_OPTIONAL_PARAMS) ParameterKey=InstanceId,ParameterValue=$(GERRIT_REPLICA_INSTANCE_ID))
@@ -275,7 +280,8 @@
 		$(METRICS_CW_OPTIONAL_PARAMS) \
 		$(GERRIT_ULIMITS) \
 		$(GERRIT_OPTIONAL_PARAMS_REPLICA_AUTO_SCALING_CAPACITY) \
-		$(GERRIT_OPTIONAL_PARAMS_REPLICA_AUTO_SCALING_POLICY)
+		$(GERRIT_OPTIONAL_PARAMS_REPLICA_AUTO_SCALING_POLICY) \
+		$(XRAY_OPTIONAL_PARAMS)
 
 dns-routing:
 	$(AWS_FC_COMMAND) create-stack \
diff --git a/dual-primary/cf-service-primary.yml b/dual-primary/cf-service-primary.yml
index 6bcd1f6..72d9b56 100644
--- a/dual-primary/cf-service-primary.yml
+++ b/dual-primary/cf-service-primary.yml
@@ -191,8 +191,17 @@
     Description: Interval between reindexing of all changes, accounts and groups.
     Type: String
     Default: '10m'
+  EnableXray:
+    Description: Whether to enable X-Ray tracing for Gerrit
+    Type: String
+    Default: false
+    AllowedValues: [true, false]
 
 Mappings:
+  XRay:
+    Info:
+      ContainerName: xray-daemon
+      Port: 2000
   Gerrit:
     Volume:
       Git: gerrit-git
@@ -213,6 +222,9 @@
     SSH:
       Port: 1022
 
+Conditions:
+  ShouldEnableXRay: !Equals [!Ref EnableXray, true]
+
 Resources:
     Service:
         Type: AWS::ECS::Service
@@ -257,6 +269,12 @@
                   Essential: true
                   Image: !Sub '${DockerRegistryUrl}/${DockerImage}'
                   Environment:
+                    - Name: XRAY_ENABLED
+                      Value: !Ref EnableXray
+                    - Name: AWS_XRAY_TRACING_NAME
+                      Value: !Ref InstanceId
+                    - Name: AWS_XRAY_DAEMON_ADDRESS
+                      Value: !Join [':', [!FindInMap ['XRay', 'Info', 'ContainerName'], !FindInMap ['XRay', 'Info', 'Port']]]
                     - Name: CANONICAL_WEB_URL
                       Value: !Sub 'https://${HttpPrimariesGerritSubdomain}.${HostedZoneName}'
                     - Name: SSHD_ADVERTISED_ADDRESS
@@ -383,6 +401,20 @@
                         awslogs-group: !Ref ClusterStackName
                         awslogs-region: !Ref AWS::Region
                         awslogs-stream-prefix: !Ref EnvironmentName
+                  Links:
+                    - !FindInMap ['XRay', 'Info', 'ContainerName']
+                - Fn::If:
+                    - ShouldEnableXRay
+                    - Name: !FindInMap ['XRay', 'Info', 'ContainerName']
+                      Essential: false
+                      Image: "amazon/aws-xray-daemon"
+                      Cpu: 32
+                      MemoryReservation: 256
+                      PortMappings:
+                        - HostPort: 2000
+                          ContainerPort: 2000
+                          Protocol: "udp"
+                    - AWS::NoValue
             Volumes:
               - Name: !FindInMap ['Gerrit', 'Volume', 'Git']
                 Host:
diff --git a/dual-primary/cf-service-replica.yml b/dual-primary/cf-service-replica.yml
index 85eab10..77eedf1 100644
--- a/dual-primary/cf-service-replica.yml
+++ b/dual-primary/cf-service-replica.yml
@@ -213,6 +213,20 @@
     Type: Number
     Description: Aggregate CPU utilization target for auto-scaling
     Default: 75.0
+  EnableXray:
+    Description: Whether to enable X-Ray tracing for the replica
+    Type: String
+    Default: false
+    AllowedValues: [true, false]
+
+Mappings:
+  XRay:
+    Info:
+      ContainerName: xray-daemon
+      Port: 2000
+
+Conditions:
+  ShouldEnableXRay: !Equals [!Ref EnableXray, true]
 
 Resources:
     GerritService:
@@ -260,6 +274,12 @@
                   Essential: true
                   Image: !Sub '${DockerRegistryUrl}/${GerritDockerImage}'
                   Environment:
+                    - Name: XRAY_ENABLED
+                      Value: !Ref EnableXray
+                    - Name: AWS_XRAY_TRACING_NAME
+                      Value: !Ref InstanceId
+                    - Name: AWS_XRAY_DAEMON_ADDRESS
+                      Value: !Join [':', [!FindInMap ['XRay', 'Info', 'ContainerName'], !FindInMap ['XRay', 'Info', 'Port']]]
                     - Name: CANONICAL_WEB_URL
                       Value: !Sub 'https://${HttpSubdomain}.${HostedZoneName}'
                     - Name: SSHD_ADVERTISED_ADDRESS
@@ -334,6 +354,8 @@
                         awslogs-group: !Ref ClusterStackName
                         awslogs-region: !Ref AWS::Region
                         awslogs-stream-prefix: !Ref EnvironmentName
+                  Links:
+                    - !FindInMap ['XRay', 'Info', 'ContainerName']
                 - Name: !Ref GitDaemonServiceName
                   Essential: true
                   Image: !Sub '${DockerRegistryUrl}/${GitDaemonDockerImage}'
@@ -379,6 +401,18 @@
                         awslogs-group: !Ref ClusterStackName
                         awslogs-region: !Ref AWS::Region
                         awslogs-stream-prefix: !Ref EnvironmentName
+                - Fn::If:
+                    - ShouldEnableXRay
+                    - Name: !FindInMap ['XRay', 'Info', 'ContainerName']
+                      Essential: false
+                      Image: "amazon/aws-xray-daemon"
+                      Cpu: 32
+                      MemoryReservation: 256
+                      PortMappings:
+                        - HostPort: 2000
+                          ContainerPort: 2000
+                          Protocol: "udp"
+                    - AWS::NoValue
             Volumes:
               - Name: !Ref 'GerritDbVolume'
                 DockerVolumeConfiguration:
diff --git a/dual-primary/setup.env.template b/dual-primary/setup.env.template
index 663e9e1..52212bd 100644
--- a/dual-primary/setup.env.template
+++ b/dual-primary/setup.env.template
@@ -106,4 +106,6 @@
 
 DYNAMODB_LOCKS_TABLE_NAME=$(AWS_PREFIX)-locksTable
 DYNAMODB_REFS_TABLE_NAME=$(AWS_PREFIX)-refsDb
-CREATE_REFS_DB_TABLES=false
\ No newline at end of file
+CREATE_REFS_DB_TABLES=false
+
+XRAY_ENABLED=false
\ No newline at end of file