

# Implementación mediante la estrategia de sidecar
<a name="CloudWatch-Application-Signals-ECS-Sidecar"></a>

## Paso 1: habilitar Application Signals en la cuenta
<a name="CloudWatch-Application-Signals-ECS-Grant"></a>

Primero debe habilitar Application Signals en su cuenta. Si no lo ha hecho, consulte [Habilitación de Application Signals en su cuenta](CloudWatch-Application-Signals-Enable.md).

## Paso 2: cree roles de IAM.
<a name="CloudWatch-Application-Signals-Enable-ECS-IAM"></a>

Debe crear un rol de IAM. Si ya creó este rol, es posible que deba agregarle permisos.
+ **ECS task role—** (Función de tarea de ECS) Los contenedores utilizan esta función para ejecutarse. Los permisos deben ser los que necesiten las aplicaciones, además de **CloudWatchAgentServerPolicy**. 

Para obtener más información acerca de cómo crear Roles de IAM, consulte [Creating IAM Roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) (Creación de Roles de IAM).

## Paso 3: preparar la configuración del agente de CloudWatch
<a name="CloudWatch-Application-Signals-Enable-ECS-PrepareAgent"></a>

En primer lugar, prepare la configuración del agente con Application Signals habilitada. Para ello, cree un archivo local denominado `/tmp/ecs-cwagent.json`. 

```
{
  "traces": {
    "traces_collected": {
      "application_signals": {}
    }
  },
  "logs": {
    "metrics_collected": {
      "application_signals": {}
    }
  }
}
```

Luego, cargue esta configuración en el almacén de parámetros SSM. Para ello, ejecute el siguiente comando. En el archivo, sustituya *\$1REGION* por el nombre de la región actual.

```
aws ssm put-parameter \
--name "ecs-cwagent" \
--type "String" \
--value "`cat /tmp/ecs-cwagent.json`" \
--region "$REGION"
```

## Paso 4: instrumentar la aplicación con el agente de CloudWatch
<a name="CloudWatch-Application-Signals-Enable-ECS-Instrument"></a>

El siguiente paso es configurar la aplicación para CloudWatch Application Signals.

------
#### [ Java ]

**Para instrumentar la aplicación en Amazon ECS con el agente CloudWatch**

1. En primer lugar, especifique un montaje de enlace. El volumen se utilizará para compartir archivos entre contenedores en los siguientes pasos. Usará este montaje de enlace más tarde en este procedimiento.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation"
     }
   ]
   ```

1. Añada una definición de sidecar de agente de CloudWatch. Para ello, añada un nuevo contenedor llamado `ecs-cwagent` a la definición de tareas de la aplicación. Sustituya *\$1REGION* por el nombre de la región actual. Sustituya *\$1IMAGE* por la ruta a la imagen más reciente del contenedor de CloudWatch en Amazon Elastic Container Registry. Para obtener más información, consulte [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent) en Amazon ECR.

   Si prefiere habilitar el agente de CloudWatch con una estrategia de daemon, consulte las instrucciones de [Implementación mediante la estrategia de daemon](CloudWatch-Application-Signals-ECS-Daemon.md).

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. Añada un nuevo contenedor `init` a la definición de tareas de la aplicación. Sustituya *\$1IMAGE* por la imagen más reciente del repositorio de imágenes [AWS Distro para OpenTelemetry](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-java) de Amazon ECR. 

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
       "cp",
       "/javaagent.jar",
       "/otel-auto-instrumentation/javaagent.jar"
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation",
         "containerPath": "/otel-auto-instrumentation",
         "readOnly": false
       }
     ]
   }
   ```

1. Agregue una dependencia al contenedor de `init` para asegurarse de que este contenedor finalice antes de que se inicie el contenedor de la aplicación.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. Añada las siguientes variables de entorno al contenedor de aplicaciones. Debe utilizar la versión 1.32.2 o una posterior del [agente de autoinstrumentación de Distro para OpenTelemetry de AWS para Java](https://opentelemetry.io/docs/zero-code/java/agent/).    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. Monte el volumen `opentelemetry-auto-instrumentation` que definió en el paso 1 de este procedimiento. Si no necesita habilitar la correlación de registros con métricas y seguimientos, utilice el siguiente ejemplo para una aplicación de Java. Si desea habilitar la correlación de registros, consulte el siguiente paso en su lugar.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "JAVA_TOOL_OPTIONS",
         "value": " -javaagent:/otel-auto-instrumentation/javaagent.jar"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_PROPAGATORS",
         "value": "tracecontext,baggage,b3,xray"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation",
         "containerPath": "/otel-auto-instrumentation",
         "readOnly": false
       }
     ]
   }
   ```

------
#### [ Python ]

Antes de activar las señales de aplicación para sus aplicaciones Python, debe tener en cuenta las consideraciones siguientes.
+ En algunas aplicaciones en contenedores, la falta de una variable de entorno `PYTHONPATH` a veces puede provocar que la aplicación no se inicie. Para solucionar este problema, asegúrese de configurar la variable de entorno `PYTHONPATH` en la ubicación del directorio de trabajo de la aplicación. Esto se debe a un problema conocido con la instrumentación automática de OpenTelemetry. Para obtener más información sobre este problema, consulte [Python autoinstrumentation setting of PYTHONPATH is not compliant](https://github.com/open-telemetry/opentelemetry-operator/issues/2302).
+ Para las aplicaciones de Django, se requieren configuraciones adicionales, que se describen en la [documentación de Python de OpenTelemetry](https://opentelemetry-python.readthedocs.io/en/latest/examples/django/README.html).
  + Use el indicador `--noreload` para evitar la recarga automática.
  + Establezca la variable de entorno `DJANGO_SETTINGS_MODULE` en la ubicación del archivo `settings.py` de su aplicación Django. Esto garantiza que OpenTelemetry pueda acceder correctamente a la configuración de Django e integrarse correctamente con ella. 
+ Si utiliza un servidor WSGI para su aplicación de Python, además de los siguientes pasos de esta sección, consulte [No hay datos de Application Signals para la aplicación de Python que usa un servidor WSGI](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-Python-WSGI) para obtener información sobre cómo hacer que Application Signals funcione.

**Instrumentación de la aplicación Python en Amazon ECS con el agente de CloudWatch**

1. En primer lugar, especifique un montaje de enlace. El volumen se utilizará para compartir archivos entre contenedores en los siguientes pasos. Usará este montaje de enlace más tarde en este procedimiento.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation-python"
     }
   ]
   ```

1. Añada una definición de sidecar de agente de CloudWatch. Para ello, añada un nuevo contenedor llamado `ecs-cwagent` a la definición de tareas de la aplicación. Sustituya *\$1REGION* por el nombre de la región actual. Sustituya *\$1IMAGE* por la ruta a la imagen más reciente del contenedor de CloudWatch en Amazon Elastic Container Registry. Para obtener más información, consulte [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent) en Amazon ECR.

   Si prefiere habilitar el agente de CloudWatch con una estrategia de daemon, consulte las instrucciones de [Implementación mediante la estrategia de daemon](CloudWatch-Application-Signals-ECS-Daemon.md).

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. Añada un nuevo contenedor `init` a la definición de tareas de la aplicación. Sustituya *\$1IMAGE* por la imagen más reciente del repositorio de imágenes [AWS Distro para OpenTelemetry](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-python) de Amazon ECR.

   ```
   {
       "name": "init",
       "image": "$IMAGE",
       "essential": false,
       "command": [
           "cp",
           "-a",
           "/autoinstrumentation/.",
           "/otel-auto-instrumentation-python"
       ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation-python",
               "containerPath": "/otel-auto-instrumentation-python",
               "readOnly": false
           }
       ]
   }
   ```

1. Agregue una dependencia al contenedor de `init` para asegurarse de que este contenedor finalice antes de que se inicie el contenedor de la aplicación.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. Añada las siguientes variables de entorno al contenedor de aplicaciones.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. Monte el volumen `opentelemetry-auto-instrumentation-python` que definió en el paso 1 de este procedimiento. Si no necesita habilitar la correlación de registros con métricas y seguimientos, utilice el siguiente ejemplo para una aplicación de Python. Si desea habilitar la correlación de registros, consulte el siguiente paso en su lugar. 

   ```
   {
     "name": "my-app",
     ...
     "environment": [
       {
         "name": "PYTHONPATH",
         "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_PYTHON_DISTRO",
         "value": "aws_distro"
       },
       {
         "name": "OTEL_PYTHON_CONFIGURATOR",
         "value": "aws_configurator"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "DJANGO_SETTINGS_MODULE",
         "value": "$PATH_TO_SETTINGS.settings"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

1. (Opcional) Para habilitar la correlación de registros, haga lo siguiente antes de montar el volumen. En `OTEL_RESOURCE_ATTRIBUTES`, defina una variable de entorno adicional `aws.log.group.names` para los grupos de registro de su aplicación. De este modo, los seguimientos y métricas de su aplicación se pueden correlacionar con las entradas de registro correspondientes de estos grupos de registro. En esta variable, sustituya *\$1YOUR\$1APPLICATION\$1LOG\$1GROUP* con los nombres de los grupos de registro de su aplicación. Si tiene varios grupos de registro, puede usar el signo `&` para separarlos, como en este ejemplo: `aws.log.group.names=log-group-1&log-group-2`. Para habilitar la correlación entre métricas y registros, basta con establecer esta variable de entorno actual. Para obtener más información, consulte [Habilitación de la correlación entre métricas y registros](Application-Signals-MetricLogCorrelation.md). Para habilitar la correlación entre seguimientos y registros, también debe cambiar la configuración de registro de su aplicación. Para obtener más información, consulte [Habilitación de la correlación entre seguimientos y registros](Application-Signals-TraceLogCorrelation.md). 

   A continuación se muestra un ejemplo. Para habilitar la correlación de registros, utilice este ejemplo cuando monte el volumen `opentelemetry-auto-instrumentation-python` que definió en el paso 1 de este procedimiento.

   ```
   {
     "name": "my-app",
     ...
     "environment": [
       {
         "name": "PYTHONPATH",
         "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_PYTHON_DISTRO",
         "value": "aws_distro"
       },
       {
         "name": "OTEL_PYTHON_CONFIGURATOR",
         "value": "aws_configurator"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=$SVC_NAME"
       },
       {
         "name": "DJANGO_SETTINGS_MODULE",
         "value": "$PATH_TO_SETTINGS.settings"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

------
#### [ .NET ]

**Para instrumentar la aplicación en Amazon ECS con el agente CloudWatch**

1. En primer lugar, especifique un montaje de enlace. El volumen se utilizará para compartir archivos entre contenedores en los siguientes pasos. Usará este montaje de enlace más tarde en este procedimiento.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation"
     }
   ]
   ```

1. Añada una definición de sidecar de agente de CloudWatch. Para ello, añada un nuevo contenedor llamado `ecs-cwagent` a la definición de tareas de la aplicación. Sustituya *\$1REGION* por el nombre de la región actual. Sustituya *\$1IMAGE* por la ruta a la imagen más reciente del contenedor de CloudWatch en Amazon Elastic Container Registry. Para obtener más información, consulte [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent) en Amazon ECR.

   Si prefiere habilitar el agente de CloudWatch con una estrategia de daemon, consulte las instrucciones de [Implementación mediante la estrategia de daemon](CloudWatch-Application-Signals-ECS-Daemon.md).

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. Añada un nuevo contenedor `init` a la definición de tareas de la aplicación. Sustituya *\$1IMAGE* por la imagen más reciente del repositorio de imágenes [AWS Distro para OpenTelemetry](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-dotnet) de Amazon ECR. 

   Para una instancia de contenedor de Linux, utilice lo siguiente.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
         "cp",
         "-a",
         "autoinstrumentation/.",
         "/otel-auto-instrumentation"
     ],
     "mountPoints": [
         {
             "sourceVolume": "opentelemetry-auto-instrumentation",
             "containerPath": "/otel-auto-instrumentation",
             "readOnly": false
         }
     ]
   }
   ```

   Para una instancia de contenedor de Windows Server, utilice lo siguiente.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
         "CMD",
         "/c",
         "xcopy",
         "/e",
         "C:\\autoinstrumentation\\*",
         "C:\\otel-auto-instrumentation",
         "&&",
         "icacls",
         "C:\\otel-auto-instrumentation",
         "/grant",
         "*S-1-1-0:R",
         "/T"
     ],
     "mountPoints": [
         {
             "sourceVolume": "opentelemetry-auto-instrumentation",
             "containerPath": "C:\\otel-auto-instrumentation",
             "readOnly": false
         }
     ]
   }
   ```

1. Agregue una dependencia al contenedor de `init` para asegurarse de que este contenedor finalice antes de que se inicie el contenedor de la aplicación.

   ```
   "dependsOn": [
       {
           "containerName": "init",
           "condition": "SUCCESS"
       }
   ]
   ```

1. Añada las siguientes variables de entorno al contenedor de aplicaciones. Debe utilizar la versión 1.1.0 o una posterior del [agente de autoinstrumentación de Distro para OpenTelemetry de AWS para .NET](https://opentelemetry.io/docs/zero-code/net/).    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. Monte el volumen `opentelemetry-auto-instrumentation` que definió en el paso 1 de este procedimiento. En Linux, utilice lo que se indica a continuación.

   ```
   {
       "name": "my-app",
      ...
       "environment": [
           {
              "name": "OTEL_RESOURCE_ATTRIBUTES",
              "value": "service.name=$SVC_NAME"
          },
           {
               "name": "CORECLR_ENABLE_PROFILING",
               "value": "1"
           },
           {
               "name": "CORECLR_PROFILER",
               "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}"
           },
           {
               "name": "CORECLR_PROFILER_PATH",
               "value": "/otel-auto-instrumentation/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so"
           },
           {
               "name": "DOTNET_ADDITIONAL_DEPS",
               "value": "/otel-auto-instrumentation/AdditionalDeps"
           },
           {
               "name": "DOTNET_SHARED_STORE",
               "value": "/otel-auto-instrumentation/store"
           },
           {
               "name": "DOTNET_STARTUP_HOOKS",
               "value": "/otel-auto-instrumentation/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll"
           },
           {
               "name": "OTEL_DOTNET_AUTO_HOME",
               "value": "/otel-auto-instrumentation"
           },
           {
               "name": "OTEL_DOTNET_AUTO_PLUGINS",
               "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation"
           },
           {
               "name": "OTEL_RESOURCE_ATTRIBUTES",
               "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=aws-dotnet-service-name"
           },
           {
               "name": "OTEL_LOGS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_METRICS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
               "value": "http/protobuf"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
               "value": "true"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
               "value": "http://localhost:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://localhost:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://localhost:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://localhost:2000"
          },
           {
               "name": "OTEL_PROPAGATORS",
               "value": "tracecontext,baggage,b3,xray"
           }
       ],
       "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation",
               "containerPath": "/otel-auto-instrumentation",
               "readOnly": false
           }
       ]
   }
   ```

   En Windows, utilice lo que se indica a continuación.

   ```
   {
       "name": "my-app",
      ...
       "environment": [
          {
              "name": "OTEL_RESOURCE_ATTRIBUTES",
              "value": "service.name=$SVC_NAME"
          },
           {
               "name": "CORECLR_ENABLE_PROFILING",
               "value": "1"
           },
           {
               "name": "CORECLR_PROFILER",
               "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}"
           },
           {
               "name": "CORECLR_PROFILER_PATH",
               "value": "C:\\otel-auto-instrumentation\\win-x64\\OpenTelemetry.AutoInstrumentation.Native.dll"
           },
           {
               "name": "DOTNET_ADDITIONAL_DEPS",
               "value": "C:\\otel-auto-instrumentation\\AdditionalDeps"
           },
           {
               "name": "DOTNET_SHARED_STORE",
               "value": "C:\\otel-auto-instrumentation\\store"
           },
           {
               "name": "DOTNET_STARTUP_HOOKS",
               "value": "C:\\otel-auto-instrumentation\\net\\OpenTelemetry.AutoInstrumentation.StartupHook.dll"
           },
           {
               "name": "OTEL_DOTNET_AUTO_HOME",
               "value": "C:\\otel-auto-instrumentation"
           },
           {
               "name": "OTEL_DOTNET_AUTO_PLUGINS",
               "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation"
           },
           {
               "name": "OTEL_RESOURCE_ATTRIBUTES",
               "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=dotnet-service-name"
           },
           {
               "name": "OTEL_LOGS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_METRICS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
               "value": "http/protobuf"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
               "value": "true"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
               "value": "http://localhost:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://localhost:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://localhost:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://localhost:2000"
          },
           {
               "name": "OTEL_PROPAGATORS",
               "value": "tracecontext,baggage,b3,xray"
           }
       ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation",
               "containerPath": "C:\\otel-auto-instrumentation",
               "readOnly": false
           }
       ],
       "dependsOn": [
           {
               "containerName": "init",
               "condition": "SUCCESS"
           }
      ]
   }
   ```

------
#### [ Node.js ]

**nota**  
Si desea habilitar Application Signals para una aplicación Node.js con ESM, consulte [Setting up a Node.js application with the ESM module format](#ECS-NodeJs-ESM) antes de seguir estos pasos.

**Para instrumentar la aplicación en Amazon ECS con el agente CloudWatch**

1. En primer lugar, especifique un montaje de enlace. El volumen se utilizará para compartir archivos entre contenedores en los siguientes pasos. Usará este montaje de enlace más tarde en este procedimiento.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation-node"
     }
   ]
   ```

1. Añada una definición de sidecar de agente de CloudWatch. Para ello, añada un nuevo contenedor llamado `ecs-cwagent` a la definición de tareas de la aplicación. Sustituya *\$1REGION* por el nombre de la región actual. Sustituya *\$1IMAGE* por la ruta a la imagen más reciente del contenedor de CloudWatch en Amazon Elastic Container Registry. Para obtener más información, consulte [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent) en Amazon ECR.

   Si prefiere habilitar el agente de CloudWatch con una estrategia de daemon, consulte las instrucciones de [Implementación mediante la estrategia de daemon](CloudWatch-Application-Signals-ECS-Daemon.md).

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. Añada un nuevo contenedor `init` a la definición de tareas de la aplicación. Sustituya *\$1IMAGE* por la imagen más reciente del repositorio de imágenes [AWS Distro para OpenTelemetry](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-node) de Amazon ECR. 

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
       "cp",
       "-a",
       "/autoinstrumentation/.",
       "/otel-auto-instrumentation-node"
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
   }
   ```

1. Agregue una dependencia al contenedor de `init` para asegurarse de que este contenedor finalice antes de que se inicie el contenedor de la aplicación.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. Añada las siguientes variables de entorno al contenedor de aplicaciones.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. Monte el volumen `opentelemetry-auto-instrumentation` que definió en el paso 1 de este procedimiento. Si no necesita habilitar la correlación de registros con métricas y seguimientos, utilice el siguiente ejemplo para una aplicación de Node.js. Si desea habilitar la correlación de registros, consulte el siguiente paso en su lugar.

   Para el contenedor de aplicaciones, agregue una dependencia al contenedor de `init` para asegurarse de que el contenedor finalice antes de que se inicie el contenedor de la aplicación.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "NODE_OPTIONS",
         "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js"
       }
       ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ]
   }
   ```

1. (Opcional) Para habilitar la correlación de registros, haga lo siguiente antes de montar el volumen. En `OTEL_RESOURCE_ATTRIBUTES`, defina una variable de entorno adicional `aws.log.group.names` para los grupos de registro de su aplicación. De este modo, los seguimientos y métricas de su aplicación se pueden correlacionar con las entradas de registro correspondientes de estos grupos de registro. En esta variable, sustituya *\$1YOUR\$1APPLICATION\$1LOG\$1GROUP* con los nombres de los grupos de registro de su aplicación. Si tiene varios grupos de registro, puede usar el signo `&` para separarlos, como en este ejemplo: `aws.log.group.names=log-group-1&log-group-2`. Para habilitar la correlación entre métricas y registros, basta con establecer esta variable de entorno actual. Para obtener más información, consulte [Habilitación de la correlación entre métricas y registros](Application-Signals-MetricLogCorrelation.md). Para habilitar la correlación entre seguimientos y registros, también debe cambiar la configuración de registro de su aplicación. Para obtener más información, consulte [Habilitación de la correlación entre seguimientos y registros](Application-Signals-TraceLogCorrelation.md). 

   A continuación se muestra un ejemplo. Utilice este ejemplo para habilitar la correlación de registros cuando monte el volumen `opentelemetry-auto-instrumentation` que definió en el paso 1 de este procedimiento.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "NODE_OPTIONS",
         "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js"
       }
       ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ]
   }
   ```<a name="ECS-NodeJs-ESM"></a>

**Configuración de una aplicación Node.js con el formato de módulo ESM**

La compatibilidad ofrecida para las aplicaciones Node.js con el formato de módulo ESM es limitada. Para obtener más información, consulte [Limitaciones conocidas de Node.js con ESM](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations).

Para el formato de módulo ESM, no hay que usar el contenedor `init` para inyectar el SDK de instrumentación de Node.js. Para habilitar Application Signals para Node.js con ESM, omita los pasos 1 y 3 del procedimiento anterior y en su lugar haga lo siguiente:

**Para habilitar Application Signals para una aplicación Node.js con ESM**

1. Instale en su aplicación Node.js las dependencias pertinentes para la autoinstrumentación:

   ```
   npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation
   npm install @opentelemetry/instrumentation@0.54.0
   ```

1. En los pasos 5 y 6 del procedimiento anterior, retire el montaje del volumen `opentelemetry-auto-instrumentation-node`:

   ```
    "mountPoints": [
       {
           "sourceVolume": "opentelemetry-auto-instrumentation-node",
           "containerPath": "/otel-auto-instrumentation-node",
           "readOnly": false
       }
    ]
   ```

   Reemplace las opciones de nodo con las siguientes opciones.

   ```
   {
       "name": "NODE_OPTIONS",
       "value": "--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs"
   }
   ```

------

## Paso 5: implementar la aplicación
<a name="CloudWatch-Application-Signals-Enable-ECS-Deploy"></a>

Cree una nueva revisión de la definición de la tarea e impleméntela en el clúster de aplicaciones. Debería ver tres contenedores en la tarea recién creada:
+ `init`: contenedor necesario para inicializar Application Signals.
+ `ecs-cwagent`: contenedor que ejecuta el agente de CloudWatch.
+ `my-app`: este es el ejemplo de contenedor de aplicaciones de nuestra documentación. En las cargas de trabajo reales, es posible que no exista este contenedor específico, o que se sustituya por sus propios contenedores de servicio.

## (Opcional) Paso 6: supervisar el estado de su aplicación
<a name="CloudWatch-Application-Signals-Monitor-sidecar"></a>

Una vez que haya habilitado sus aplicaciones en Amazon ECS, podrá supervisar el estado de las mismas. Para obtener más información, consulte [Monitoreo del estado operativo de sus aplicaciones con Application Signals](Services.md).