

# Implemente usando a estratégia de daemon
<a name="CloudWatch-Application-Signals-ECS-Daemon"></a>

## Etapa 1: habilitar o Application Signals em sua conta
<a name="Application-Signals-ECS-Grant-Daemon"></a>

Você deve primeiro habilitar o Application Signals na conta. Se você não tiver feito isso, consulte [Habilitar o Application Signals na conta](CloudWatch-Application-Signals-Enable.md).

## Etapa 2: criar perfis do IAM
<a name="Application-Signals-Enable-ECS-IAM-Daemon"></a>

Você precisa criar um perfil do IAM. Se você já criou esse perfil, talvez seja necessário adicionar permissões a ele.
+ **Função de tarefa do ECS**: os contêineres usam essa função para serem executados. As permissões devem ser as necessárias para as aplicações, acrescidas de **CloudWatchAgentServerPolicy**. 

Para obter mais informações sobre a criação de funções do IAM, consulte [Criar funções do IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html).

## Etapa 3: preparar a configuração do agente do CloudWatch
<a name="Application-Signals-Enable-ECS-PrepareAgent-Daemon"></a>

Primeiro, prepare a configuração do agente com o Application Signals habilitado. Para fazer isso, crie um arquivo local denominado `/tmp/ecs-cwagent.json`. 

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

Em seguida, faça o upload dessa configuração no SSM Parameter Store. Para fazer isso, insira o comando a seguir. No arquivo, substitua {{$REGION}} pelo nome real da sua região.

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

## Etapa 4: implantar o serviço de daemon do agente do CloudWatch
<a name="Application-Signals-Enable-ECS-Sidecar-Daemon"></a>

Crie a definição de tarefa a seguir e implante-a no cluster da aplicação. Substitua {{$REGION}} pelo nome real da sua região. Substitua {{$TASK\_ROLE\_ARN}} e {{$EXECUTION\_ROLE\_ARN}} pelos perfis do IAM você preparou em [Etapa 2: criar perfis do IAM](#Application-Signals-Enable-ECS-IAM-Daemon). Substitua {{$IMAGE}} pelo caminho da imagem de contêiner mais recente do CloudWatch no Amazon Elastic Container Registry. Para obter mais informações, consulte [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent) no Amazon ECR. 

**nota**  
O serviço de daemon expõe duas portas no host, com 4316 usadas como endpoint para receber métricas e rastreamentos e 2 mil como endpoint do amostrador de rastreamento do CloudWatch. Essa configuração permite que o agente colete e transmita dados de telemetria de todas as tarefas da aplicação em execução no host. Certifique-se de que essas portas não sejam usadas por outros serviços no host para evitar conflitos.

```
{
  "family": "ecs-cwagent-daemon",
  "taskRoleArn": "{{$TASK_ROLE_ARN}}",
  "executionRoleArn": "{{$EXECUTION_ROLE_ARN}}",
  "networkMode": "bridge",
  "containerDefinitions": [
    {
      "name": "ecs-cwagent",
      "image": "$IMAGE",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 4316,
          "hostPort": 4316
        },
        {
          "containerPort": 2000,
          "hostPort": 2000
        }
      ],
      "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"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "EC2"
  ],
  "cpu": "128",
  "memory": "64"
}
```

## Etapa 5: instrumentalizar a aplicação
<a name="Application-Signals-Enable-ECS-Instrument-Daemon"></a>

A próxima etapa corresponde à instrumentação da aplicação para o Application Signals.

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

**Como instrumentalizar a aplicação no Amazon ECS com o agente do CloudWatch**

1. Primeiro, especifique uma associação de montagem. O volume será usado para compartilhar arquivos entre contêineres nas próximas etapas. Você usará essa associação de montagem posteriormente nesse procedimento.

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

1. Anexe um novo contêiner `init` à definição de tarefa da aplicação. Substitua {{$IMAGE}} pela imagem mais recente do [repositório de imagens do AWS Distro para OpenTelemetry do Amazon ECR](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-java). 

   ```
   {
     "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. Adicione uma dependência no contêiner `init` para garantir que esse contêiner termine antes do início do contêiner da aplicação.

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

1. Adicione as variáveis ​​de ambiente apresentadas a seguir ao contêiner da aplicação. Você deverá usar a versão 1.32.2 ou posterior do [agente de instrumentação automática para Java](https://opentelemetry.io/docs/zero-code/java/agent/) do AWS Distro para OpenTelemetry.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.html)

1. Monte o volume `opentelemetry-auto-instrumentation` definido na etapa 1 deste procedimento. Se você não precisar habilitar a correlação de logs com métricas e rastreamentos, use o exemplo a seguir para uma aplicação em Java. Se quiser habilitar a correlação de logs, consulte a próxima etapa.

   ```
   {
     "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://{{CW_CONTAINER_IP}}:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://{{CW_CONTAINER_IP}}: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 habilitar o Application Signals para suas aplicações em Python, esteja ciente das considerações apresentadas a seguir.
+ Em algumas aplicações em contêineres, uma variável de ambiente `PYTHONPATH` ausente pode, às vezes, causar falhas na inicialização da aplicação. Para resolver isso, certifique-se de definir a variável de ambiente `PYTHONPATH` para o local do diretório de trabalho da sua aplicação. Isso ocorre devido a um problema conhecido com a instrumentação automática do OpenTelemetry. Para obter mais informações sobre esse problema, consulte [Python autoinstrumentation setting of PYTHONPATH is not compliant](https://github.com/open-telemetry/opentelemetry-operator/issues/2302).
+ Para aplicações em Django, existem configurações adicionais necessárias, descritas na [documentação do OpenTelemetry em Python](https://opentelemetry-python.readthedocs.io/en/latest/examples/django/README.html).
  + Use o sinalizador `--noreload` para evitar o recarregamento automático.
  + Defina a variável de ambiente `DJANGO_SETTINGS_MODULE` para o local do arquivo `settings.py` da sua aplicação em Django. Isso garante que o OpenTelemetry possa acessar e se integrar adequadamente às suas configurações do Django. 
+ Se você estiver usando um servidor WSGI para a aplicação em Python, além das etapas apresentadas a seguir nesta seção, consulte [Não há dados do Application Signals para aplicações em Python que usam um servidor WSGI](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-Python-WSGI) para obter informações sobre como fazer o Application Signals funcionar.

**Como instrumentalizar a aplicação em Python no Amazon ECS com o agente do CloudWatch**

1. Primeiro, especifique uma associação de montagem. O volume será usado para compartilhar arquivos entre contêineres nas próximas etapas. Você usará essa associação de montagem posteriormente nesse procedimento.

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

1. Anexe um novo contêiner `init` à definição de tarefa da aplicação. Substitua {{$IMAGE}} pela imagem mais recente do [repositório de imagens do AWS Distro para OpenTelemetry do Amazon ECR](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-python).

   ```
   {
       "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. Adicione uma dependência no contêiner `init` para garantir que esse contêiner termine antes do início do contêiner da aplicação.

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

1. Adicione as variáveis ​​de ambiente apresentadas a seguir ao contêiner da aplicação.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.html)

1. Monte o volume `opentelemetry-auto-instrumentation-python` definido na etapa 1 deste procedimento. Se você não precisar habilitar a correlação de logs com métricas e rastreamentos, use o exemplo a seguir para uma aplicação em Python. Se quiser habilitar a correlação de logs, consulte a próxima etapa. 

   ```
   {
     "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://{{CW_CONTAINER_IP}}: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://{{CW_CONTAINER_IP}}:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://{{CW_CONTAINER_IP}}: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"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

1. (Opcional) Para habilitar a correlação de logs, faça o seguinte antes de montar o volume. Em `OTEL_RESOURCE_ATTRIBUTES`, defina uma variável de ambiente `aws.log.group.names` adicional para os grupos de logs da sua aplicação. Ao fazer isso, será possível correlacionar os rastreamentos e métricas da sua aplicação com as entradas de log relevantes desses grupos de logs. Para essa variável, substitua {{$YOUR\_APPLICATION\_LOG\_GROUP}} pelos nomes do grupo de logs da sua aplicação. Se você tiver vários grupos de logs, é possível usar um e comercial (`&`) para separá-los, como neste exemplo: `aws.log.group.names=log-group-1&log-group-2`. Para permitir que a métrica registre a correlação em log, basta definir essa variável ambiental atual. Para obter mais informações, consulte [Habilitar a correlação entre métrica e logs](Application-Signals-MetricLogCorrelation.md). Para habilitar a correlação entre logs e rastreamento, você também precisará alterar a configuração de registro em log em sua aplicação. Para obter mais informações, consulte [Habilitar a correlação entre rastreamento e logs](Application-Signals-TraceLogCorrelation.md). 

   Veja um exemplo a seguir. Para habilitar a correlação de logs, siga este exemplo ao montar o volume `opentelemetry-auto-instrumentation-python` definido na etapa 1 deste procedimento.

   ```
   {
     "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://{{CW_CONTAINER_IP}}: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://{{CW_CONTAINER_IP}}:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://{{CW_CONTAINER_IP}}: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"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

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

**Como instrumentalizar a aplicação no Amazon ECS com o agente do CloudWatch**

1. Primeiro, especifique uma associação de montagem. O volume será usado para compartilhar arquivos entre contêineres nas próximas etapas. Você usará essa associação de montagem posteriormente nesse procedimento.

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

1. Anexe um novo contêiner `init` à definição de tarefa da aplicação. Substitua {{$IMAGE}} pela imagem mais recente do [repositório de imagens do AWS Distro para OpenTelemetry do Amazon ECR](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-dotnet). 

   Para uma instância de contêiner Linux, use o seguinte.

   ```
   {
     "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 uma instância de contêiner Windows Server, use o seguinte.

   ```
   {
     "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. Adicione uma dependência no contêiner `init` para garantir que o contêiner termine antes do início do contêiner da aplicação.

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

1. Adicione as variáveis ​​de ambiente apresentadas a seguir ao contêiner da aplicação. Você deverá usar a versão 1.1.0 ou posterior do [agente de instrumentação automática para .NET](https://opentelemetry.io/docs/zero-code/net/) do AWS Distro para OpenTelemetry.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.html)

1. Monte o volume `opentelemetry-auto-instrumentation` definido na etapa 1 deste procedimento. Para Linux, use o seguinte.

   ```
   {
       "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=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://{{CW_CONTAINER_IP}}:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://{{CW_CONTAINER_IP}}:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://{{CW_CONTAINER_IP}}: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
           }
       ],
       "dependsOn": [
           {
               "containerName": "init",
               "condition": "SUCCESS"
           }
      ]
   }
   ```

   Para Windows, use o seguinte.

   ```
   {
       "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://{{CW_CONTAINER_IP}}:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://{{CW_CONTAINER_IP}}:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://{{CW_CONTAINER_IP}}:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://{{CW_CONTAINER_IP}}: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**  
Se você estiver habilitando o Application Signals para uma aplicação do Node.js com ESM, consulte [Setting up a Node.js application with the ESM module format](#ECSDaemon-NodeJs-ESM) antes de iniciar essas etapas.

**Como instrumentalizar a aplicação no Amazon ECS com o agente do CloudWatch**

1. Primeiro, especifique uma associação de montagem. O volume será usado para compartilhar arquivos entre contêineres nas próximas etapas. Você usará essa associação de montagem posteriormente nesse procedimento.

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

1. Anexe um novo contêiner `init` à definição de tarefa da aplicação. Substitua {{$IMAGE}} pela imagem mais recente do [repositório de imagens do AWS Distro para OpenTelemetry do Amazon ECR](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-node). 

   ```
   {
     "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. Adicione uma dependência no contêiner `init` para garantir que esse contêiner termine antes do início do contêiner da aplicação.

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

1. Adicione as variáveis ​​de ambiente apresentadas a seguir ao contêiner da aplicação.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.html)

1. Monte o volume `opentelemetry-auto-instrumentation-node` definido na etapa 1 deste procedimento. Se não for necessário habilitar a correlação de logs com métricas e acompanhamentos, use o exemplo apresentado a seguir para uma aplicação em Node.js. Se quiser habilitar a correlação de logs, consulte a próxima etapa.

   Em seu Application Container, adicione uma dependência ao contêiner `init` para garantir que ele seja finalizado antes que o contêiner da sua aplicação comece.

   ```
   {
     "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://{{CW_CONTAINER_IP}}:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://{{CW_CONTAINER_IP}}:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://{{CW_CONTAINER_IP}}: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 a correlação de logs, faça o seguinte antes de montar o volume. Em `OTEL_RESOURCE_ATTRIBUTES`, defina uma variável de ambiente `aws.log.group.names` adicional para os grupos de logs da sua aplicação. Ao fazer isso, será possível correlacionar os rastreamentos e métricas da sua aplicação com as entradas de log relevantes desses grupos de logs. Para essa variável, substitua {{$YOUR\_APPLICATION\_LOG\_GROUP}} pelos nomes do grupo de logs da sua aplicação. Se você tiver vários grupos de logs, é possível usar um e comercial (`&`) para separá-los, como neste exemplo: `aws.log.group.names=log-group-1&log-group-2`. Para permitir que a métrica registre a correlação em log, basta definir essa variável ambiental atual. Para obter mais informações, consulte [Habilitar a correlação entre métrica e logs](Application-Signals-MetricLogCorrelation.md). Para habilitar a correlação entre logs e rastreamento, você também precisará alterar a configuração de registro em log em sua aplicação. Para obter mais informações, consulte [Habilitar a correlação entre rastreamento e logs](Application-Signals-TraceLogCorrelation.md). 

   Veja um exemplo a seguir. Siga este exemplo para habilitar a correlação de logs ao montar o volume `opentelemetry-auto-instrumentation` definido na etapa 1 deste procedimento.

   ```
   {
     "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://{{CW_CONTAINER_IP}}:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://{{CW_CONTAINER_IP}}:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://{{CW_CONTAINER_IP}}: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="ECSDaemon-NodeJs-ESM"></a>

**Configuração de uma aplicação do Node.js usando o formato de módulo ESM**

Fornecemos suporte limitado para aplicações do Node.js com o formato de módulo ESM. Para obter detalhes, consulte [Limitações conhecidas sobre o uso de ESM com o Node.js](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations).

No formato de módulo ESM, o uso do contêiner `init` para injetar o SDK de instrumentação do Node.js não é aplicável. Para habilitar o Application Signals para o Node.js com o ESM, ignore as etapas 1 e 2 no procedimento anterior e, em vez disso, execute as ações apresentadas a seguir.

**Para habilitar o Application Signals em uma aplicação do Node.js com o ESM**

1. Instale as dependências relevantes para a instrumentação automática na aplicação do Node.js:

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

1. Nas etapas 4 e 5 do procedimento anterior, remova a montagem do volume `opentelemetry-auto-instrumentation-node`:

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

   Substitua as opções do nó pelas opções apresentadas a seguir.

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

------

## Etapa 6: implantar a aplicação
<a name="Application-Signals-Enable-ECS-Deploy-Daemon"></a>

Crie uma nova revisão da sua definição de tarefa e implante-a no cluster da aplicação. Você deverá ver dois contêineres na tarefa recém-criada:
+ `init`: um contêiner necessário para inicializar o Application Signals
+ `{{my-app}}`: esse é o exemplo de contêiner de aplicação na nossa documentação. Nas suas workloads reais, esse contêiner específico pode não existir ou pode ser substituído por seus próprios contêineres de serviço.

## (Opcional) Etapa 7: monitorar a integridade da aplicação
<a name="CloudWatch-Application-Signals-Monitor-daemon"></a>

Depois de habilitar as aplicações no Amazon ECS, você pode monitorar a integridade da aplicação. Para obter mais informações, consulte [Monitorar a integridade operacional das suas aplicações com o Application Signals](Services.md).