

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Guide détaillé de la découverte automatique sur les clusters Amazon ECS
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs"></a>

Prometheus fournit des dizaines de mécanismes dynamiques de découverte de service, comme décrit dans [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config). Toutefois, il n'y a pas de découverte de service intégrée pour Amazon ECS. L' CloudWatch agent ajoute ce mécanisme.

Lorsque la découverte du service Amazon ECS Prometheus est activée, CloudWatch l'agent effectue régulièrement les appels d'API suivants aux frontends Amazon ECS et Amazon EC2 pour récupérer les métadonnées des tâches ECS en cours d'exécution dans le cluster ECS cible. 

```
EC2:DescribeInstances
ECS:ListTasks
ECS:ListServices
ECS:DescribeContainerInstances
ECS:DescribeServices
ECS:DescribeTasks
ECS:DescribeTaskDefinition
```

Les métadonnées sont utilisées par l' CloudWatch agent pour scanner les cibles Prometheus au sein du cluster ECS. L' CloudWatch agent prend en charge trois modes de découverte de services :
+ découverte de service basée sur l'étiquette docker du conteneur ;
+ découverte de service basée sur l'expression régulière ARN de la tâche ECS ;
+ découverte de service basée sur l'expression régulière du nom du service ECS.

Tous les modes peuvent être utilisés ensemble. CloudWatch l'agent déduplique les cibles découvertes en fonction de :. `{private_ip}:{port}/{metrics_path}`

Toutes les cibles découvertes sont écrites dans un fichier de résultats spécifié par le champ `sd_result_file` de configuration du conteneur de l' CloudWatch agent. Voici un exemple de fichier de résultats : 

```
- targets:
  - 10.6.1.95:32785
  labels:
    __metrics_path__: /metrics
    ECS_PROMETHEUS_EXPORTER_PORT: "9406"
    ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic
    ECS_PROMETHEUS_METRICS_PATH: /metrics
    InstanceType: t3.medium
    LaunchType: EC2
    SubnetId: subnet-123456789012
    TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port
    TaskGroup: family:demo-jar-ec2-bridge-dynamic-port
    TaskRevision: "7"
    VpcId: vpc-01234567890
    container_name: demo-jar-ec2-bridge-dynamic-port
    job: demo-jar-ec2-bridge-dynamic
- targets:
  - 10.6.3.193:9404
  labels:
    __metrics_path__: /metrics
    ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404"
    ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port
    ECS_PROMETHEUS_METRICS_PATH: /metrics
    InstanceType: t3.medium
    LaunchType: EC2
    SubnetId: subnet-123456789012
    TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port
    TaskGroup: family:demo-jar-tomcat-bridge-mapped-port
    TaskRevision: "12"
    VpcId: vpc-01234567890
    container_name: demo-tomcat-ec2-bridge-mapped-port
    job: demo-tomcat-ec2-bridge-mapped-port
```

Vous pouvez directement intégrer ce fichier de résultats à la découverte de services basés sur des fichiers de Prometheus. Pour plus d'informations sur la découverte de services basée sur des fichiers de Prometheus, consultez [<file\$1sd\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config).

 Supposons que le fichier de résultat soit écrit dans `/tmp/cwagent_ecs_auto_sd.yaml`. La configuration de récupération Prometheus suivante la consommera.

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
  - job_name: cwagent-ecs-file-sd-config
    sample_limit: 10000
    file_sd_configs:
      - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]
```

L' CloudWatch agent ajoute également les étiquettes supplémentaires suivantes pour les cibles découvertes.
+ `container_name`
+ `TaskDefinitionFamily`
+ `TaskRevision`
+ `TaskGroup`
+ `StartedBy`
+ `LaunchType`
+ `job`
+ `__metrics_path__`
+ Étiquettes Docker

Lorsque le cluster comporte le type de lancement EC2, les trois étiquettes suivantes sont ajoutées.
+ `InstanceType`
+ `VpcId`
+ `SubnetId`

**Note**  
Les étiquettes Docker qui ne correspondent pas à l'expression régulière `[a-zA-Z_][a-zA-Z0-9_]*` sont filtrés. Cela correspond aux conventions Prometheus répertoriées dans `label_name` de [Fichier de configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#labelname), compris dans la documentation Prometheus.

## Exemples de configuration de la découverte de service ECS
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs-examples"></a>

Cette section contient des exemples qui illustrent la découverte de services ECS.

**Exemple 1**

```
"ecs_service_discovery": {
  "sd_frequency": "1m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
  }
}
```

Cet exemple montre comment activer la découverte de service basée sur les étiquettes docker. L' CloudWatch agent interrogera les métadonnées des tâches ECS une fois par minute et inscrira les cibles découvertes dans le `/tmp/cwagent_ecs_auto_sd.yaml` fichier du conteneur de l' CloudWatch agent.

La valeur par défaut de `sd_port_label` dans la section `docker_label` est `ECS_PROMETHEUS_EXPORTER_PORT`. Si un conteneur en cours d'exécution dans les tâches ECS possède une étiquette `ECS_PROMETHEUS_EXPORTER_PORT` docker, l' CloudWatchagent utilise sa valeur as `container port` pour scanner tous les ports exposés du conteneur. En cas de correspondance, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour construire la cible de l'exportateur Prometheus au format suivant : `private_ip:host_port`. 

La valeur par défaut de `sd_metrics_path_label` dans la section `docker_label` est `ECS_PROMETHEUS_METRICS_PATH`. Si le conteneur possède cette étiquette docker, sa valeur sera utilisée comme `__metrics_path__`. Si le conteneur ne possède pas cette étiquette, la valeur par défaut `/metrics` est utilisée.

La valeur par défaut de `sd_job_name_label` dans la section `docker_label` est `job`. Si le conteneur possède cette étiquette docker, sa valeur sera ajoutée comme l'une des étiquettes de la cible pour remplacer le nom de tâche par défaut spécifié dans la configuration Prometheus. La valeur de cette étiquette Docker est utilisée comme nom du flux de journaux dans le groupe de CloudWatch journaux Logs. 

**Exemple 2**

```
"ecs_service_discovery": {
  "sd_frequency": "15s",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
    "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A",
    "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME"  
  }
}
```

Cet exemple permet la découverte de services basée sur des étiquettes docker. THe CloudWatch l'agent interrogera les métadonnées des tâches ECS toutes les 15 secondes et écrira les cibles découvertes dans le `/tmp/cwagent_ecs_auto_sd.yaml` fichier du conteneur de l' CloudWatch agent. Les conteneurs possédant une étiquette docker `ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A` seront analysés. La valeur de l'étiquette docker `ECS_PROMETHEUS_JOB_NAME` est utilisée comme nom de tâche.

**Exemple 3**

```
"ecs_service_discovery": {
  "sd_frequency": "5m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "task_definition_list": [
    {
      "sd_job_name": "java-prometheus",
      "sd_metrics_path": "/metrics",
      "sd_metrics_ports": "9404; 9406",
      "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+"
    },
    {
      "sd_job_name": "envoy-prometheus",
      "sd_metrics_path": "/stats/prometheus",
      "sd_container_name_pattern": "^envoy$", 
      "sd_metrics_ports": "9901",
      "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23"
    }
  ]
}
```

Cet exemple montre comment activer la découverte de service basée sur l'expression régulière ARN de la tâche ECS. L' CloudWatch agent interroge les métadonnées des tâches ECS toutes les cinq minutes et écrit les cibles découvertes dans le `/tmp/cwagent_ecs_auto_sd.yaml` fichier du conteneur de l' CloudWatch agent.

Deux sections d'expressions régulières ARN de définition de tâche sont définies :
+  Pour la première section, les tâches ECS avec `javajmx` dans leur ARN de définition de tâche ECS sont filtrées pour l'analyse des ports de conteneur. Si les conteneurs de ces tâches ECS exposent le port de conteneur sur 9404 ou 9406, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour créer les cibles d'exportation Prometheus. La valeur de `sd_metrics_path` définit `__metrics_path__` sur `/metrics`. L' CloudWatch agent extraira donc les métriques Prometheus, qui seront envoyées au flux `private_ip:host_port/metrics` CloudWatch de journaux dans Logs `java-prometheus` du groupe de journaux. `/aws/ecs/containerinsights/cluster_name/prometheus` 
+  Pour la deuxième section, les tâches ECS avec `appmesh` dans leur ARN de définition de tâche ECS et avec la `version` `:23` sont filtrées pour l'analyse des ports de conteneur. Pour les conteneurs dont le nom est `envoy` qui exposent le port de conteneur sur `9901`, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour créer les cibles d'exportation Prometheus. La valeur de ces tâches ECS expose le port de conteneur sur 9404 ou 9406, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour créer les cibles d'exportation Prometheus. La valeur de `sd_metrics_path` définit `__metrics_path__` sur `/stats/prometheus`. L' CloudWatch agent extraira donc les métriques Prometheus et les enverra au flux `private_ip:host_port/stats/prometheus` CloudWatch de journaux dans Logs `envoy-prometheus` du groupe de journaux. `/aws/ecs/containerinsights/cluster_name/prometheus` 

**Exemple 4**

```
"ecs_service_discovery": {
  "sd_frequency": "5m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "service_name_list_for_tasks": [
    {
      "sd_job_name": "nginx-prometheus",
      "sd_metrics_path": "/metrics",
      "sd_metrics_ports": "9113",
      "sd_service_name_pattern": "^nginx-.*"
    },
    {
      "sd_job_name": "haproxy-prometheus",
      "sd_metrics_path": "/stats/metrics",
      "sd_container_name_pattern": "^haproxy$",
      "sd_metrics_ports": "8404",
      "sd_service_name_pattern": ".*haproxy-service.*"
    }
  ]
}
```

Cet exemple montre comment activer la découverte de service basée sur l'expression régulière du nom du service ECS. L' CloudWatch agent interroge les métadonnées des services ECS toutes les cinq minutes et écrit les cibles découvertes dans le `/tmp/cwagent_ecs_auto_sd.yaml` fichier du conteneur de l' CloudWatch agent.

Deux sections d'expressions régulières de nom de service sont définies :
+  Dans la première section, les tâches ECS associées aux services ECS dont les noms correspondent à l'expression régulière `^nginx-.*` sont filtrées pour l'analyse du port du conteneur. Si les conteneurs de ces tâches ECS exposent le port de conteneur sur 9113, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour créer les cibles d'exportation Prometheus. La valeur de `sd_metrics_path` définit `__metrics_path__` sur `/metrics`. L' CloudWatch agent extraira donc les métriques Prometheus, et les métriques `private_ip:host_port/metrics` supprimées seront envoyées au flux CloudWatch de journaux dans Logs `nginx-prometheus` du groupe de journaux. `/aws/ecs/containerinsights/cluster_name/prometheus` 
+  ou la seconde section, les tâches ECS associées aux services ECS dont les noms correspondent à l'expression régulière `.*haproxy-service.*` sont filtrées pour l'analyse du port du conteneur. Pour les conteneurs dont le nom est `haproxy` qui exposent le port de conteneur sur 8404, le port hôte mappé ainsi que l'adresse IP privée du conteneur sont utilisés pour créer les cibles d'exportation Prometheus. La valeur de `sd_metrics_path` définit `__metrics_path__` sur `/stats/metrics`. L' CloudWatchagent extraira donc les métriques Prometheus, et les métriques `private_ip:host_port/stats/metrics` supprimées seront envoyées au flux CloudWatch de journaux dans Logs `haproxy-prometheus` du groupe de journaux. `/aws/ecs/containerinsights/cluster_name/prometheus` 

**Exemple 5**

```
"ecs_service_discovery": {
  "sd_frequency": "1m30s",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
    "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL",
    "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL",
    "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL"  
  }
  "task_definition_list": [
    {
      "sd_metrics_ports": "9150",
      "sd_task_definition_arn_pattern": "*memcached.*"
    }
  ]
}
```

Cet exemple montre comment activer les deux modes de découverte de service ECS. L' CloudWatch agent interroge les métadonnées des tâches ECS toutes les 90 secondes et écrit les cibles découvertes dans le `/tmp/cwagent_ecs_auto_sd.yaml` fichier du conteneur de l' CloudWatch agent. 

Pour la configuration de découverte de service basée sur Docker :
+ Les tâches ECS avec l'étiquette docker `MY_PROMETHEUS_EXPORTER_PORT_LABEL` seront filtrées pour l'analyse du port Prometheus. Le port de conteneur Prometheus cible est spécifié par la valeur de l'étiquette `MY_PROMETHEUS_EXPORTER_PORT_LABEL`. 
+ La valeur de l'étiquette docker `MY_PROMETHEUS_EXPORTER_PORT_LABEL` est utilisée pour `__metrics_path__`. Si le conteneur ne possède pas cette étiquette docker, la valeur par défaut `/metrics` est utilisée. 
+ La valeur de l'étiquette docker `MY_PROMETHEUS_EXPORTER_PORT_LABEL` est utilisée comme étiquette de tâche. Si le conteneur n'a pas cette étiquette docker, le nom de tâche défini dans la configuration Prometheus est utilisé.

Pour la configuration de la découverte de service basée sur l'expression régulière ARN de la tâche ECS :
+ Les tâches ECS avec `memcached` dans l'ARN de définition de tâche ECS sont filtrées pour l'analyse des ports de conteneur. Le port de conteneur Prometheus cible est 9150 tel que défini par `sd_metrics_ports`. Le chemin d'accès aux métriques par défaut `/metrics` est utilisé. Le nom de tâche défini dans la configuration Prometheus est utilisé.