

# Instalar e configurar a coleta de métricas do Prometheus em instâncias do Amazon EC2
<a name="CloudWatch-Agent-PrometheusEC2"></a>

As seções a seguir explicam como instalar o atendente do CloudWatch com o monitoramento Prometheus em instâncias do EC2 e como configurar o atendente para extrair de outros destinos. Também fornece tutoriais para configurar workloads de amostra para usar testes com monitoramento Prometheus.

Tanto instâncias do Linux quanto do Windows são compatíveis.

Para obter informações sobre os sistemas operacionais compatíveis com o atendente do CloudWatch, consulte [Coleta de métricas, logs e rastreamentos usando o agente do CloudWatch](Install-CloudWatch-Agent.md)

**Requisitos para grupo de segurança de VPC**

Se você estiver usando uma VPC, os seguintes requisitos se aplicam.
+ As regras de entrada dos grupos de segurança para as workloads do Prometheus devem abrir as portas do Prometheus para o atendente do CloudWatch para extrair as métricas Prometheus pelo IP privado.
+ As regras de saída do grupo de segurança do atendente do CloudWatch devem permitir que o atendente do CloudWatch se conecte à porta das workloads do Prometheus por IP privado. 

**Topics**
+ [Etapa 1: Instalar o atendente do CloudWatch](#CloudWatch-Agent-PrometheusEC2-install)
+ [Etapa 2: Extrair fontes do Prometheus e importar métricas](#CloudWatch-Agent-PrometheusEC2-configure)
+ [Exemplo: configurar workloads de amostra Java/JMX para tested de métrica do Prometheus](#CloudWatch-Agent-Prometheus-Java)

## Etapa 1: Instalar o atendente do CloudWatch
<a name="CloudWatch-Agent-PrometheusEC2-install"></a>

A primeira etapa consiste em instalar o atendente do CloudWatch na instância do EC2. Para instruções, consulte [Instalação do atendente do CloudWatch](install-CloudWatch-Agent-on-EC2-Instance.md).

## Etapa 2: Extrair fontes do Prometheus e importar métricas
<a name="CloudWatch-Agent-PrometheusEC2-configure"></a>

O atendente do CloudWatch com monitoramento Prometheus precisa de duas configurações para extrair as métricas do Prometheus. Uma serve para as configurações padrão do Prometheus, conforme documentado em [<scrape\_config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) na documentação do Prometheus. A outra é para a configuração do atendente do CloudWatch.

### Configuração de extração do Prometheus
<a name="CloudWatch-Agent-PrometheusEC2-configure-scrape"></a>

O atendente do CloudWatch oferece suporte às configurações de extração padrão do Prometheus, conforme documentado em [ <scrape\_config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) na documentação do Prometheus. É possível editar essa seção para atualizar as configurações que já estão nesse arquivo e adicionar outros destinos de extração do Prometheus. Um arquivo de configuração de exemplo contém as seguintes linhas de configuração global:

```
PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml
global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
- job_name: MY_JOB
  sample_limit: 10000
  file_sd_configs:
    - files: ["C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_1.yaml", "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_2.yaml"]
```

A seção `global` especifica parâmetros que são válidos em todos os contextos de configuração. Eles também servem como padrão para outras seções de configuração. Contém os seguintes parâmetros:
+ `scrape_interval`: define a frequência da adição de destinos de extração de conteúdo.
+ `scrape_timeout`: define quanto tempo aguardar até a expiração de uma solicitação de extração de conteúdo.

A seção `scrape_configs` especifica um conjunto de destinos e parâmetros que definem como extraí-los. Contém os seguintes parâmetros:
+ `job_name`: o nome do trabalho atribuído a métricas extraídas por padrão.
+ `sample_limit`: limite por extração no número de amostras extraídas que serão aceitas.
+ `file_sd_configs`: lista de configurações de detecção de serviço de arquivo. Lê um conjunto de arquivos contendo uma lista de zero ou mais configurações estáticas. A seção `file_sd_configs` contém um parâmetro `files` que define padrões para arquivos dos quais os grupos de destino são extraídos.

O atendente do CloudWatch é compatível com os seguintes tipos de configuração de detecção de serviço.

**`static_config`** Permite especificar uma lista de destinos e um conjunto de rótulos comuns para eles. É a maneira canônica de especificar destinod estáticos em uma configuração de extração.

Veja a seguir um exemplo de configuração estática para extrair métricas do Prometheus de um host local. As métricas também poderão ser extraídas de outros servidores, se a porta Prometheus estiver aberta para o servidor onde o atendente é executado.

```
PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_sd_1.yaml
- targets:
    - 127.0.0.1:9404
  labels:
    key1: value1
    key2: value2
```

Esse exemplo contém os seguintes parâmetros:
+ `targets`: os destinos extraídos pela configuração estática.
+ `labels`: rótulos atribuídos a todas as métricas que são raspadas dos destinos.

**`ec2_sd_config`** Permite recuperar destinos de extração de instâncias do Amazon EC2. Veja a seguir uma amostra `ec2_sd_config` para extrair métricas do Prometheus de uma lista de instâncias do EC2. As portas do Prometheus dessas instâncias devem abrir para o servidor onde o atendente do CloudWatch está em execução. A função do IAM para a instância do EC2 em que o atendente do CloudWatch é executado deve incluir a permissão `ec2:DescribeInstance`. Por exemplo, você pode anexar a política gerenciada **AmazonEC2ReadOnlyAccess** à instância em que o atendente do CloudWatch está em execução.

```
PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml
global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
  - job_name: MY_JOB
    sample_limit: 10000
    ec2_sd_configs:
      - region: us-east-1
        port: 9404
        filters:
          - name: instance-id
            values:
              - i-98765432109876543
              - i-12345678901234567
```

Esse exemplo contém os seguintes parâmetros:
+ `region`: a região da AWS em que a instância do EC2 de destino está. Se estiver em branco, será usada a região dos metadados da instância.
+ `port`: a porta de onde as métricas serão extraídas.
+ `filters`: filtros opcionais a serem usados para filtrar a lista de instâncias. Este exemplo filtra com base em IDs de instância do EC2. Para obter mais critérios que você pode filtrar, consulte [DescribeInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html).

### Configuração do atendente do CloudWatch para o Prometheus
<a name="CloudWatch-Agent-PrometheusEC2-configure-agent"></a>

O arquivo de configuração do atendente do CloudWatch inclui as seções `prometheus` em `logs` e `metrics_collected`. Inclui os seguintes parâmetros.
+ **cluster\_name**: especifica o nome do cluster a ser adicionado como um rótulo no evento de log. Esse campo é opcional. 
+ **log\_group\_name**: especifica o nome do grupo de log para as métricas do Prometheus extraídas.
+ **prometheus\_config\_path**: especifica o caminho do arquivo de configuração de extração do Prometheus.
+ **emf\_processor**: especifica a configuração do processador de formato de métrica incorporado. Para obter mais informações sobre o formato de métrica incorporado, consulte [Incorporação de métricas em logs](CloudWatch_Embedded_Metric_Format.md). 

  A seção `emf_processor` pode contem estes parâmetros:
  + **metric\_declaration\_dedup**: é definida como true, a função de eliminação de duplicação para as métricas de formato de métrica incorporado está habilitada.
  + **metric\_namespace**: especifica o namespace da métrica para as métricas emitidas do CloudWatch.
  + **metric\_unit**: especifica o nome métrica: mapa de unidade da métrica. Para obter mais informações sobre as unidades de métricas compatíveis, consulte [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html).
  + **metric\_declaration**: são seções que especificam a matriz de logs com formato de métrica incorporado a ser gerada. Há seções `metric_declaration` para cada destino do Prometheus do qual o atendente do CloudWatch importa por padrão. Essas seções incluem os seguintes campos:
    + `source_labels` especifica o valor dos rótulos verificados pela linha `label_matcher`.
    + `label_matcher` é uma expressão regular que confere o valor dos rótulos listados em `source_labels`. As métricas correspondentes são disponibilizadas para inclusão no formato de métrica incorporado enviado ao CloudWatch. 
    + `metric_selectors` é uma expressão regular que especifica as métricas a serem coletadas e enviadas ao CloudWatch.
    + `dimensions` é a lista de rótulos a serem usados como dimensões do CloudWatch para cada métrica selecionada.

Veja a seguir um exemplo de configuração do atendente do CloudWatch para o Prometheus.

```
{
   "logs":{
      "metrics_collected":{
         "prometheus":{
            "cluster_name":"prometheus-cluster",
            "log_group_name":"Prometheus",
            "prometheus_config_path":"C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus.yaml",
            "emf_processor":{
               "metric_declaration_dedup":true,
               "metric_namespace":"CWAgent-Prometheus",
               "metric_unit":{
                  "jvm_threads_current": "Count",
                  "jvm_gc_collection_seconds_sum": "Milliseconds"
               },
               "metric_declaration":[
                  {
                     "source_labels":[
                        "job", "key2"
                     ],
                     "label_matcher":"MY_JOB;^value2",
                     "dimensions":[
                        [
                           "key1", "key2"
                        ],
                        [
                           "key2"
                        ]
                     ],
                     "metric_selectors":[
                        "^jvm_threads_current$",
                        "^jvm_gc_collection_seconds_sum$"
                     ]
                  }
               ]
            }
         }
      }
   }
}
```

O exemplo anterior configura uma seção de formato de métrica incorporado a ser enviada como um evento de log, se as seguintes condições forem atendidas:
+ O valor do rótulo `job` é `MY_JOB`
+ O valor do rótulo `key2` é `value2`
+ As métricas `jvm_threads_current` e `jvm_gc_collection_seconds_sum` do Prometheus contêm rótulos `job` e `key2`.

O evento de log enviado inclui a seção destacada a seguir.

```
{
    "CloudWatchMetrics": [
        {
            "Metrics": [
                {
                    "Unit": "Count",
                    "Name": "jvm_threads_current"
                },
                {
                    "Unit": "Milliseconds",
                    "Name": "jvm_gc_collection_seconds_sum"
                }
            ],
            "Dimensions": [
                [
                    "key1",
                    "key2"
                ],
                [
                    "key2"
                ]
            ],
            "Namespace": "CWAgent-Prometheus"
        }
    ],
    "ClusterName": "prometheus-cluster",
    "InstanceId": "i-0e45bd06f196096c8",
    "Timestamp": "1607966368109",
    "Version": "0",
    "host": "EC2AMAZ-PDDOIUM",
    "instance": "127.0.0.1:9404",
    "jvm_threads_current": 2,
    "jvm_gc_collection_seconds_sum": 0.006000000000000002,
    "prom_metric_type": "gauge",
    ...
}
```

## Exemplo: configurar workloads de amostra Java/JMX para tested de métrica do Prometheus
<a name="CloudWatch-Agent-Prometheus-Java"></a>

O JMX Exporter é um exportador oficial do Prometheus que pode extrair conteúdo e expor mBeans da JMX como métricas do Prometheus. Para obter mais informações, consulte [prometheus/jmx\_exporter](https://github.com/prometheus/jmx_exporter).

O atendente do CloudWatch pode coletar métricas predefinidas do Prometheus a partir da Java Virtual Machine (JVM), Hjava e Tomcat (Catalina) usando um JMX Exporter em instâncias do EC2.

### Etapa 1: Instalar o atendente do CloudWatch
<a name="CloudWatch-Agent-PrometheusJava-install"></a>

A primeira etapa consiste em instalar o atendente do CloudWatch na instância do EC2. Para instruções, consulte [Instalação do atendente do CloudWatch](install-CloudWatch-Agent-on-EC2-Instance.md).

### Etapa 2: Iniciar a workload do Java/JMX
<a name="CloudWatch-Agent-PrometheusJava-start"></a>

A próxima etapa é iniciar a workload do Java/JMX.

Primeiro, baixe o arquivo jar do JMX Exporter mais recente do seguinte local: [prometheus/jmx\_exporter](https://github.com/prometheus/jmx_exporter).

 **Use o jar para sua aplicação de amostra**

Os exemplos de comando nas seções a seguir usam `SampleJavaApplication-1.0-SNAPSHOT.jar` como o arquivo jar. Substitua essas partes dos comandos pelo jar de sua aplicação.

#### Preparar a configuração do JMX Exporter
<a name="CloudWatch-Agent-PrometheusJava-start-config"></a>

O arquivo `config.yaml` é o arquivo de configuração do JMX Exporter. Para obter mais informações, consulte [Configuration](https://github.com/prometheus/jmx_exporter#Configuration) (Configuração) na documentação do JMX Exporter.

Veja a seguir um exemplo de arquivo de configuração para Java e Tomcat.

```
---
lowercaseOutputName: true
lowercaseOutputLabelNames: true

rules:
- pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)'
  name: java_lang_OperatingSystem_$1
  type: GAUGE

- pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)'
  name: java_lang_threading_$1
  type: GAUGE

- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)'
  name: catalina_globalrequestprocessor_$3_total
  labels:
    port: "$2"
    protocol: "$1"
  help: Catalina global $3
  type: COUNTER

- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)'
  name: catalina_servlet_$3_total
  labels:
    module: "$1"
    servlet: "$2"
  help: Catalina servlet $3 total
  type: COUNTER

- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)'
  name: catalina_threadpool_$3
  labels:
    port: "$2"
    protocol: "$1"
  help: Catalina threadpool $3
  type: GAUGE

- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)'
  name: catalina_session_$3_total
  labels:
    context: "$2"
    host: "$1"
  help: Catalina session $3 total
  type: COUNTER

- pattern: ".*"
```

#### Inicie a aplicação Java com o exportador do Prometheus
<a name="CloudWatch-Agent-PrometheusJava-start-start"></a>

Inicie o exemplo de aplicação. Isso emitirá métricas do Prometheus para a porta 9404. Certifique-se de substituir o ponto de entrada `com.gubupt.sample.app.App` pela informação correta para sua aplicação Java de amostra. 

No Linux, insira o comando a seguir.

```
$ nohup java -javaagent:./jmx_prometheus_javaagent-0.14.0.jar=9404:./config.yaml -cp  ./SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App &
```

No Windows, insira o comando a seguir.

```
PS C:\> java -javaagent:.\jmx_prometheus_javaagent-0.14.0.jar=9404:.\config.yaml -cp  .\SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App
```

#### Verificar a emissão de métricas do Prometheus
<a name="CloudWatch-Agent-PrometheusJava-start-verify"></a>

Verifique se as métricas do Prometheus estão sendo emitidas. 

No Linux, insira o comando a seguir.

```
$ curl localhost:9404
```

No Windows, insira o comando a seguir.

```
PS C:\> curl  http://localhost:9404
```

Exemplo de saída no Linux:

```
StatusCode        : 200
StatusDescription : OK
Content           : # HELP jvm_classes_loaded The number of classes that are currently loaded in the JVM
                    # TYPE jvm_classes_loaded gauge
                    jvm_classes_loaded 2526.0
                    # HELP jvm_classes_loaded_total The total number of class...
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 71908
                    Content-Type: text/plain; version=0.0.4; charset=utf-8
                    Date: Fri, 18 Dec 2020 16:38:10 GMT

                    # HELP jvm_classes_loaded The number of classes that are currentl...
Forms             : {}
Headers           : {[Content-Length, 71908], [Content-Type, text/plain; version=0.0.4; charset=utf-8], [Date, Fri, 18
                    Dec 2020 16:38:10 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 71908
```

### Etapa 3: Configurar o atendente do CloudWatch para extrair métricas do Prometheus
<a name="CloudWatch-Agent-PrometheusJava-agent"></a>

Em seguida, instale a configuração de extração do Prometheus no arquivo de configuração do atendente do CloudWatch.

**Para instalar a configuração de extração do Prometheus para o exemplo de Java/JMX**

1. Instale a configuração para `file_sd_config` e `static_config`.

   No Linux, insira o comando a seguir.

   ```
   $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus.yaml
   global:
     scrape_interval: 1m
     scrape_timeout: 10s
   scrape_configs:
     - job_name: jmx
       sample_limit: 10000
       file_sd_configs:
         - files: [ "/opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml" ]
   ```

   No Windows, insira o comando a seguir.

   ```
   PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml
   global:
     scrape_interval: 1m
     scrape_timeout: 10s
   scrape_configs:
     - job_name: jmx
       sample_limit: 10000
       file_sd_configs:
         - files: [ "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_file_sd.yaml" ]
   ```

1. Defina a configuração dos destinos da extação.

   No Linux, insira o comando a seguir.

   ```
   $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml
   - targets:
     - 127.0.0.1:9404
     labels:
       application: sample_java_app
       os: linux
   ```

   No Windows, insira o comando a seguir.

   ```
   PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml
   - targets:
     - 127.0.0.1:9404
     labels:
       application: sample_java_app
       os: windows
   ```

1. Defina a configuração de extração do Prometheus como `ec2_sc_config`. Substitua {{your-ec2-instance-id}} pelo ID correto da instância do EC2.

   No Linux, insira o comando a seguir.

   ```
   $ cat .\prometheus.yaml
   global:
     scrape_interval: 1m
     scrape_timeout: 10s
   scrape_configs:
     - job_name: jmx
       sample_limit: 10000
       ec2_sd_configs:
         - region: us-east-1
           port: 9404
           filters:
             - name: instance-id
               values:
                 - {{your-ec2-instance-id}}
   ```

   No Windows, insira o comando a seguir.

   ```
   PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml
   - targets:
     - 127.0.0.1:9404
     labels:
       application: sample_java_app
       os: windows
   ```

1. Instalar a configuração do atendente do CloudWatch Primeiro, navegue até o diretório correto. No Linux, é `/opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json`. No Windows, é `C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json`.

   Veja a seguir um exemplo de configuração com métricas do Java/JHX Prometheus definidas. Substitua {{path-to-Prometheus-Scrape-Configuration-file}} pelo caminho correto.

   ```
   {
     "agent": {
       "region": "us-east-1"
     },
     "logs": {
       "metrics_collected": {
         "prometheus": {
           "cluster_name": "my-cluster",
           "log_group_name": "prometheus-test",
           "prometheus_config_path": "{{path-to-Prometheus-Scrape-Configuration-file}}",
           "emf_processor": {
             "metric_declaration_dedup": true,
             "metric_namespace": "PrometheusTest",
             "metric_unit":{
               "jvm_threads_current": "Count",
               "jvm_classes_loaded": "Count",
               "java_lang_operatingsystem_freephysicalmemorysize": "Bytes",
               "catalina_manager_activesessions": "Count",
               "jvm_gc_collection_seconds_sum": "Seconds",
               "catalina_globalrequestprocessor_bytesreceived": "Bytes",
               "jvm_memory_bytes_used": "Bytes",
               "jvm_memory_pool_bytes_used": "Bytes"
             },
             "metric_declaration": [
               {
                 "source_labels": ["job"],
                 "label_matcher": "^jmx$",
                 "dimensions": [["instance"]],
                 "metric_selectors": [
                   "^jvm_threads_current$",
                   "^jvm_classes_loaded$",
                   "^java_lang_operatingsystem_freephysicalmemorysize$",
                   "^catalina_manager_activesessions$",
                   "^jvm_gc_collection_seconds_sum$",
                   "^catalina_globalrequestprocessor_bytesreceived$"
                 ]
               },
               {
                 "source_labels": ["job"],
                 "label_matcher": "^jmx$",
                 "dimensions": [["area"]],
                 "metric_selectors": [
                   "^jvm_memory_bytes_used$"
                 ]
               },
               {
                 "source_labels": ["job"],
                 "label_matcher": "^jmx$",
                 "dimensions": [["pool"]],
                 "metric_selectors": [
                   "^jvm_memory_pool_bytes_used$"
                 ]
               }
             ]
           }
         }
       },
       "force_flush_interval": 5
     }
   }
   ```

1. Insira um dos comandos a seguir para reiniciar o atendente do CloudWatch.

   No Linux, insira o comando a seguir.

   ```
   sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json
   ```

   No Windows, insira o comando a seguir.

   ```
   & "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json
   ```

### Visualizar as métricas e logs do Prometheus
<a name="CloudWatch-Agent-PrometheusJava-view"></a>

Agora é possível visualizar as métricas do Java/JMX que estão sendo coletadas.

**Para visualizar as métricas do exemplo de workload do Java/JMX**

1. Abra o console do CloudWatch, em [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Na região da em que o cluster está em execução, escolha **Metrics** (Métricas) no painel de navegação à esquerda. Encontre o namespace **PrometheUSTEST** para ver as métricas.

1. Para visualizar os eventos do CloudWatch Logs, escolha **Log Groups** (Grupos de logs) no painel de navegação. Os eventos estão no grupo de logs **prometheus-test**.