

# El raspado de fuentes de Prometheus adicionales y la importación de tales métricas
<a name="ContainerInsights-Prometheus-Setup-configure"></a>

El agente CloudWatch con supervisión de Prometheus necesita dos configuraciones para raspar las métricas de Prometheus. Una de ellas es para las configuraciones estándar de Prometheus que como se documenta en [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) en la documentación de Prometheus. La otra es para la configuración del agente de CloudWatch.

Para los clústeres de Amazon EKS, las configuraciones se definen en `prometheus-eks.yaml` (para el tipo de lanzamiento de EC2) o en `prometheus-eks-fargate.yaml` (para el tipo de lanzamiento de Fargate) como dos mapas de configuración:
+ La sección `name: prometheus-config` contiene la configuración de extracción de Prometheus,
+ La sección `name: prometheus-cwagentconfig` contiene la configuración del agente de CloudWatch. Puede utilizar esta sección para definir cómo CloudWatch va a recopilar las métricas de Prometheus. Por ejemplo, puede especificar las métricas que se van a importar en CloudWatch y definir las dimensiones. 

Para los clústeres de Kubernetes que se ejecutan en las instancias de Amazon EC2, las configuraciones se definen en el archivo YAML `prometheus-k8s.yaml` como dos mapas de configuración:
+ La sección `name: prometheus-config` contiene la configuración de extracción de Prometheus,
+ La sección `name: prometheus-cwagentconfig` contiene la configuración del agente de CloudWatch. 

Para raspar las fuentes de las métricas de Prometheus adicionales e importarlas a CloudWatch, debe modifique tanto la configuración de raspado de Prometheus como la configuración del agente de CloudWatch y, a continuación, volver a implementar el agente con la configuración actualizada.

**Requisitos del grupo de seguridad de la VPC**

Las reglas de entrada de los grupos de seguridad para las cargas de trabajo de Prometheus deben abrir los puertos de Prometheus al agente de CloudWatch para raspar las métricas de Prometheus por la IP privada.

Las reglas de salida del grupo de seguridad para el agente de CloudWatch deben permitir que el agente de CloudWatch se conecte al puerto de cargas de trabajo de Prometheus mediante la IP privada. 

## Configuración de raspado de Prometheus
<a name="ContainerInsights-Prometheus-Setup-config-global"></a>

El agente de CloudWatch es compatible con la configuración de raspado estándar de Prometheus como se describe en [ <scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) en la documentación de Prometheus. Se puede editar esta sección para actualizar las configuraciones que ya están en este archivo y agregar destinos adicionales de raspado de Prometheus. De forma predeterminada, el archivo de configuración de muestra contiene las siguientes líneas de configuración global:

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
```
+ **scrape\$1interval**: define la frecuencia con la que se deben raspar los destinos.
+ **scrape\$1timeout**: define cuánto tiempo debe esperar antes de que se agote el tiempo de espera de una petición de raspado.

También puede definir valores diferentes para estos parámetros en el nivel de trabajo, para anular las configuraciones globales.

### Trabajos de raspado de Prometheus
<a name="ContainerInsights-Prometheus-Setup-config-scrape"></a>

Los archivos YAML del agente de CloudWatch ya tienen algunos trabajos de raspado configurados de forma predeterminada. Por ejemplo, en `prometheus-eks.yaml`, los trabajos de raspado predeterminados se configuran en las líneas `job_name` en la sección `scrape_configs`. En este archivo, en la siguiente sección predeterminada `kubernetes-pod-jmx` se raspan las métricas de JMX exporter.

```
   - job_name: 'kubernetes-pod-jmx'
      sample_limit: 10000
      metrics_path: /metrics
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__address__]
        action: keep
        regex: '.*:9404$'
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: Namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_name
        target_label: pod_controller_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_kind
        target_label: pod_controller_kind
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_phase
        target_label: pod_phase
```

Se realiza el raspado de cada uno de estos destinos predeterminados y las métricas se envían a CloudWatch en eventos de registro mediante el formato de métrica integrada. Para obtener más información, consulte [Incrustar métricas en los registros](CloudWatch_Embedded_Metric_Format.md).

Los eventos de registro de los clústeres de Amazon EKS y de Kubernetes se almacenan en el grupo de registro **//aws/containerinsights/*cluster\$1name*/prometheus** en CloudWatch Logs. Los eventos de registro de los clústeres de Amazon ECS se almacenan en el grupo de registro **/aws/ecs/containerinsights/*cluster\$1name*/prometheus**.

Cada trabajo de extracción está contenido en un flujo de registros diferente en este grupo de registros. Por ejemplo, el trabajo de raspado de Prometheus `kubernetes-pod-appmesh-envoy` se define para App Mesh. Todas las métricas de Prometheus de App Mesh de los clústeres de Amazon EKS y de Kubernetes se envían al flujo de registros denominado **/aws/containerinsights/*cluster\$1name*>prometheus/kubernetes-pod-appmesh-envoy/**.

Para agregar un nuevo destino de extracción, agregue una nueva sección `job_name` a la sección `scrape_configs` del archivo YAML y reinicie el agente. Para obtener un ejemplo de este proceso, consulte [Tutorial para agregar un destino de raspado nuevo de Prometheus: métricas del servidor de la API de Prometheus](#ContainerInsights-Prometheus-Setup-new-exporters).

## Configuración del agente de CloudWatch para Prometheus
<a name="ContainerInsights-Prometheus-Setup-cw-agent-config2"></a>

El archivo de configuración del agente de CloudWatch cuenta con una sección `prometheus` en `metrics_collected` para la configuración de raspado de Prometheus. Incluye las siguientes opciones de configuración:
+ **nombre\$1clúster**: especifica el nombre del clúster que se va a agregar como etiqueta en el evento de registro. Este campo es opcional. Si lo omite, el agente puede detectar el nombre del clúster de Amazon EKS o de Kubernetes.
+ **log\$1group\$1name**: especifica el nombre del grupo de registros para las métricas Prometheus raspadas. Este campo es opcional. Si lo omite, CloudWatch utiliza **/aws/containerinsights/*cluster\$1name*/prometheus** para los registros de los clústeres de Amazon EKS y de Kubernetes.
+ **prometheus\$1config\$1path**: especifica la ruta del archivo de configuración de raspado de Prometheus. Si el valor de este campo comienza con `env:`, el contenido del archivo de configuración de raspado de Prometheus se recuperará de la variable de entorno del contenedor. No cambie este campo.
+ **ecs\$1service\$1discovery**: es la sección en la que se especifica la configuración para la detección de servicios de Prometheus de Amazon ECS. Para obtener más información, consulte [Guía detallada para la detección automática en clústeres de Amazon ECS](ContainerInsights-Prometheus-Setup-autodiscovery-ecs.md).

  La sección `ecs_service_discovery` puede incluir los siguientes campos:
  + `sd_frequency` es la frecuencia para detectar a los exportadores de Prometheus. Especifique un número y un sufijo de unidad. Por ejemplo, `1m` para una vez por minuto o `30s` para una vez cada 30 segundos. Los sufijos de unidad válidos son `ns`, `us`, `ms`, `s`, `m` y `h`.

    Este campo es opcional. El valor predeterminado es 60 segundos (1 minuto).
  + `sd_target_cluster` es el nombre de clúster de Amazon ECS de destino para la detección automática. Este campo es opcional. El valor predeterminado es el nombre del clúster de Amazon ECS donde está instalado el agente de CloudWatch. 
  + `sd_cluster_region` es la Región del clúster de Amazon ECS de destino. Este campo es opcional. El valor predeterminado es la Región del clúster de Amazon ECS donde está instalado el agente de CloudWatch.
  + `sd_result_file` es la ruta del archivo YAML para los resultados de destino de Prometheus. La configuración de raspado de Prometheus hará referencia a este archivo.
  + `docker_label` es una sección opcional que se puede utilizar para especificar la configuración para la detección de servicios basada en etiquetas docker. Si omite esta sección, no se utiliza la detección basada en etiquetas docker. Esta sección puede incluir los siguientes campos:
    + `sd_port_label` es el nombre de etiqueta docker del contenedor que especifica el puerto del contenedor para las métricas de Prometheus. El valor predeterminado es `ECS_PROMETHEUS_EXPORTER_PORT`. Si el contenedor no tiene esta etiqueta docker, el agente de CloudWatch lo omitirá.
    + `sd_metrics_path_label` es el nombre de etiqueta docker del contenedor que especifica la ruta de métricas de Prometheus. El valor predeterminado es `ECS_PROMETHEUS_METRICS_PATH`. Si el contenedor no tiene esta etiqueta docker, el agente asume la ruta predeterminada `/metrics`.
    + `sd_job_name_label` es el nombre de etiqueta docker del contenedor que especifica el nombre del trabajo de raspado de Prometheus. El valor predeterminado es `job`. Si el contenedor no tiene esta etiqueta docker, el agente de CloudWatch utiliza el nombre del trabajo en la configuración de raspado de Prometheus.
  + `task_definition_list` es una sección opcional que se puede utilizar para especificar la configuración de la detección de servicios basada en definiciones de tareas. Si omite esta sección, no se utiliza la detección basada en definiciones de tareas. Esta sección puede incluir los siguientes campos:
    + `sd_task_definition_arn_pattern` es el patrón que se utiliza para especificar las definiciones de tareas de Amazon ECS que se van a detectar. Esta es una expresión regular.
    + `sd_metrics_ports` enumera el containerPort para las métricas de Prometheus. Separe los containerPorts con punto y coma.
    + `sd_container_name_pattern` especifica los nombres de contenedor de tareas de Amazon ECS. Esta es una expresión regular.
    + `sd_metrics_path` especifica la ruta de la métrica de Prometheus. Si omite esto, el agente asume la ruta de acceso predeterminada de las `/metrics`
    + `sd_job_name` especifica el nombre del trabajo de raspado de Prometheus. Si omite este campo, el agente de CloudWatch utilizará el nombre de trabajo en la configuración de raspado de Prometheus.
+ **metric\$1declaration**: son secciones que especifican la matriz de registros con formato de métrica integrada que se van a generar. Hay secciones `metric_declaration` para cada fuente de Prometheus desde las que el agente de CloudWatch importa de forma predeterminada. Cada una de estas secciones incluye los siguientes campos:
  + `label_matcher` es una expresión regular que verifica el valor de las etiquetas que aparecen en `source_labels`. Las métricas que concuerdan se pueden incorporar al formato de métrica integrada que se envía a CloudWatch. 

    Si tiene varias etiquetas especificadas en `source_labels`, se recomienda que evite el uso de los caracteres `^` o `$` en la expresión regular para `label_matcher`.
  + `source_labels` especifica el valor de las etiquetas que se comprueban con `label_matcher`.
  + `label_separator` especifica el separador que se utilizará en la línea ` label_matcher` si se especifican múltiples `source_labels`. El valor predeterminado es `;`. Puede ver este valor predeterminado utilizado en la línea `label_matcher` en el siguiente ejemplo.
  + `metric_selectors` es una expresión regular que especifica las métricas que se van a recopilar y enviar a CloudWatch.
  + `dimensions` es la lista de etiquetas que se van a utilizar como dimensiones de CloudWatch en cada métrica seleccionada.

Consulte el siguiente ejemplo, `metric_declaration`.

```
"metric_declaration": [
  {
     "source_labels":[ "Service", "Namespace"],
     "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system",
     "dimensions":[
        ["Service", "Namespace"]
     ],
     "metric_selectors":[
        "^coredns_dns_request_type_count_total$"
     ]
  }
]
```

En este ejemplo se configura una sección de formato de métricas integradas para que se envíe como evento de registro si se cumplen las condiciones siguientes:
+ El valor de `Service` contiene `node-exporter` o `kube-dns`.
+ El valor de `Namespace` es `kube-system`.
+ La métrica de Prometheus `coredns_dns_request_type_count_total` contiene ambas etiquetas, `Service` y `Namespace`.

El evento de registro que se envía incluye la siguiente sección resaltada:

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"coredns_dns_request_type_count_total"
            }
         ],
         "Dimensions":[
            [
               "Namespace",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "Namespace":"kube-system",
   "Service":"kube-dns",
   "coredns_dns_request_type_count_total":2562,
   "eks_amazonaws_com_component":"kube-dns",
   "instance":"192.168.61.254:9153",
   "job":"kubernetes-service-endpoints",
   ...
}
```

## Tutorial para agregar un destino de raspado nuevo de Prometheus: métricas del servidor de la API de Prometheus
<a name="ContainerInsights-Prometheus-Setup-new-exporters"></a>

El servidor de la API de Kubernetes expone métricas de Prometheus en los puntos de enlace de forma predeterminada. El ejemplo oficial de la configuración de extracción del servidor de la API de Kubernetes está disponible en [Github](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus-kubernetes.yml).

El siguiente tutorial muestra cómo se realizan los siguientes pasos para comenzar a importar métricas del servidor de la API de Kubernetes a CloudWatch:
+ Agregue la configuración de raspado de Prometheus para el servidor de la API de Kubernetes al archivo YAML del agente de CloudWatch.
+ Configuración de las definiciones de métricas del formato de métrica integrada en el archivo YAML del agente de CloudWatch.
+ (Opcional) Creación de un panel de CloudWatch para las métricas del servidor de la API de Kubernetes.

**nota**  
El servidor de la API de Kubernetes expone métricas de medidor, contador, histograma y resumen. En esta versión de compatibilidad con métricas de Prometheus, CloudWatch importa solo las métricas con tipos de medidor, contador y de resumen.

**Para comenzar a recopilar métricas del servidor de la API de Kubernetes de Prometheus en CloudWatch**

1. Descargue la última versión del archivo `prometheus-eks.yaml`, `prometheus-eks-fargate.yaml` o `prometheus-k8s.yaml` con uno de los siguientes comandos.

   En el caso de un clúster de Amazon EKS con el tipo de lanzamiento de EC2, ingrese el siguiente comando:

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   En el caso de un clúster de Amazon EKS con el tipo de lanzamiento de Fargate, ingrese el siguiente comando:

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml
   ```

   En los clústeres de Kubernetes que se ejecuten en una instancia de Amazon EC2, ingrese el siguiente comando:

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
   ```

1. Abra el archivo con un editor de texto, busque la sección `prometheus-config` y agregue la siguiente sección dentro de esa sección. Para guardar los cambios:

   ```
       # Scrape config for API servers
       - job_name: 'kubernetes-apiservers'
         kubernetes_sd_configs:
           - role: endpoints
             namespaces:
               names:
                 - default
         scheme: https
         tls_config:
           ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
           insecure_skip_verify: true
         bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
         relabel_configs:
         - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
           action: keep
           regex: kubernetes;https
         - action: replace
           source_labels:
           - __meta_kubernetes_namespace
           target_label: Namespace
         - action: replace
           source_labels:
           - __meta_kubernetes_service_name
           target_label: Service
   ```

1. Con el archivo YAML abierto en el editor de texto, busque la sección `cwagentconfig.json`. Agregue la subsección siguiente y guarde los cambios. Esta sección coloca las métricas de servicio de la API en la lista de permitidos del agente de CloudWatch. Se agregan tres tipos de métricas de servidor de la API a la lista de permitidos:
   + Recuentos de objetos etcd
   + Métricas del controlador de registro del servidor de la API
   + Métricas de solicitud del servidor de la API

   ```
   {"source_labels": ["job", "resource"],
     "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)",
     "dimensions": [["ClusterName","Service","resource"]],
     "metric_selectors": [
     "^etcd_object_counts$"
     ]
   },
   {"source_labels": ["job", "name"],
      "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$",
      "dimensions": [["ClusterName","Service","name"]],
      "metric_selectors": [
      "^workqueue_depth$",
      "^workqueue_adds_total$",
      "^workqueue_retries_total$"
     ]
   },
   {"source_labels": ["job","code"],
     "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$",
     "dimensions": [["ClusterName","Service","code"]],
     "metric_selectors": [
      "^apiserver_request_total$"
     ]
   },
   {"source_labels": ["job"],
     "label_matcher": "^kubernetes-apiservers",
     "dimensions": [["ClusterName","Service"]],
     "metric_selectors": [
     "^apiserver_request_total$"
     ]
   },
   ```

1. Si el agente de CloudWatch compatible con Prometheus ya está implementado en el clúster, debe eliminarlo con el siguiente comando:

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   ```

1. Implemente el agente de CloudWatch con la configuración actualizada mediante uno de los siguientes comandos. Para un clúster de Amazon EKS con el tipo de lanzamiento de EC2, ingrese:

   ```
   kubectl apply -f prometheus-eks.yaml
   ```

   Para un clúster de Amazon EKS con el tipo de lanzamiento de Fargate, ingrese el siguiente comando. Reemplace *MyCluster* y *Región* con valores que concuerden con la implementación.

   ```
   cat prometheus-eks-fargate.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

   En los clústeres de Kubernetes, ingrese el siguiente comando: Reemplace *MyCluster* y *Región* con valores que concuerden con la implementación.

   ```
   cat prometheus-k8s.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

Una vez hecho esto, debería ver un nuevo flujo de registros denominado **kubernetes-apiservers** en el grupo de registros **/aws/containerinsights/*nombre\$1clúster*/prometheus**. Esta secuencia de registros debe incluir eventos de registro con una definición de formato de métricas integradas como la siguiente:

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"apiserver_request_total"
            }
         ],
         "Dimensions":[
            [
               "ClusterName",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "ClusterName":"my-cluster-name",
   "Namespace":"default",
   "Service":"kubernetes",
   "Timestamp":"1592267020339",
   "Version":"0",
   "apiserver_request_count":0,
   "apiserver_request_total":0,
   "code":"0",
   "component":"apiserver",
   "contentType":"application/json",
   "instance":"192.0.2.0:443",
   "job":"kubernetes-apiservers",
   "prom_metric_type":"counter",
   "resource":"pods",
   "scope":"namespace",
   "verb":"WATCH",
   "version":"v1"
}
```

Puede visualizar las métricas en la consola de CloudWatch, en el espacio de nombres **ContainerInsights/Prometheus**. También tiene la opción de crear un panel de CloudWatch para las métricas del servidor de la API de Kubernetes de Prometheus.

### (Opcional) Creación de un panel para las métricas del servidor de la API de Kubernetes.
<a name="ContainerInsights-Prometheus-Setup-KPI-dashboard"></a>

Para ver las métricas del servidor de la API de Kubernetes en el panel, primero debe haber completado los pasos de las secciones anteriores para comenzar a recopilar estas métricas en CloudWatch.

**Para crear un panel para las métricas del servidor de la API de Kubernetes**

1. Abra la consola de CloudWatch en [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Asegúrese de tener seleccionada la región de AWS correcta.

1. En el panel de navegación, seleccione **Paneles**.

1. Elija **Crear un panel**. Escriba el nombre del nuevo panel y elija **Crear un panel**.

1. En **Añadir a este panel**, elija **Cancelar**.

1. Elija **Actions (Acciones)**, **View/edit source (Ver/editar código fuente)**.

1. Descargue el siguiente archivo JSON: [Kubernetes API Dashboard source](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/kubernetes_api_server/cw_dashboard_kubernetes_api_server.json).

1. Abra el archivo JSON que descargó con un editor de texto y realice los siguientes cambios:
   + Reemplace todas las cadenas `{{YOUR_CLUSTER_NAME}}` por el nombre exacto del clúster. Tenga cuidado de no agregar espacios en blanco antes o después del texto.
   + Reemplace todas las cadenas `{{YOUR_AWS_REGION}}` por el nombre de la región donde se recopilan las métricas. Por ejemplo: . `us-west-2`. Asegúrese de no agregar espacios en blanco antes o después del texto.

1. Copie todo el blob JSON y péguelo en el cuadro de texto de la consola de CloudWatch de modo que sustituya lo que ya se encuentra en el cuadro.

1. Elija **Actualizar** y **Guardar el panel**.