prometheus – yet-another-cloudwatch-exporter збір метрик з AWS CloudWatch

Для збору метрик в prometheus з AWS CloudWatch можна використовувати yet-another-cloudwatch-exporter.

Його переваги:

  • Вміє працювати з різними регіонами.
  • Збирає данні з декількох облікових записів AWS з використанням перехресних IAM Roles.
  • Написаний на go.
  • Для збирання метрик використовує запит GetMetricsData який дозволяє отримати до 500 метрик при виконанні одного запиту.
  • Підтримує теги, тобто теги з AWS ресурсів будуть доступні в експортері.

Перейдемо до налаштування та встановлення.

Для роботи експортера потрібно наступне:

  • IAM user з ACCESS_KEY and SECRET_KEY, для цього потрібно створити окремого користувача.
  • Використати AWS instance profile, що є кращим варіантом. За замовчуванням Експортер автоматично для доступу використовує саме AWS EC2 Instance profile.

Оскільки profile вже створений та підключений до сервера, перейдемо до створення політики, яка дозволить експортеру робити необхідні йому виклики.

AWS Console –> IAM –> Policies –> Create Policy створимо політику з назвою cloudwatch-exporter-policy. Далі створену політику потрібно буде додати до AWS EC2 Instance profile який використовує сервер де запущений експортер:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatchExporterPolicy",
            "Effect": "Allow",
            "Action": [
                "tag:GetResources",
                "cloudwatch:ListTagsForResource",
                "cloudwatch:GetMetricData",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}

Описуємо елементарний конфігураційний файл для сервісу AWS ElastiCache, назвемо файл yet-cloudwatch-exporter.conf:

discovery:
  jobs:
  #################
  ## ElastiCache ##
  #################
  - type: ec
    regions:
      - eu-central-1
    metrics:
      # REDIS
      - name: CPUUtilization
        statistics:
        - Sum
        period: 60
        length: 600
      - name: EngineCPUUtilization
        statistics:
        - Sum
        period: 60
        length: 600 
      - name: CPUCreditBalance
        statistics:
        - Sum
        period: 60
        length: 600
      - name: CPUCreditUsage
        statistics:
        - Sum
        period: 60
        length: 600     
      - name: CurrConnections
        statistics:
        - Sum
        period: 60
        length: 600

Також варто згадати цікаві параметри експортера про які варто написати:

  • exportedTagsOnMetricsобмежує список тегів які будуть отримуватись разом з метриками, тобто ми можемо вказати які теги хочемо отримувати.
  • SeacrhTagsобмежує список ресурсів з яких потрібно збирати метрики.

Далі створюємо файл prom-exporters.yaml:

version: '3.9'

services:
  yet-another-cloudwatch-exporter:
    image: ghcr.io/nerdswords/yet-another-cloudwatch-exporter:v0.38.0-alpha
    container_name: yet-cloudwatch-exporter
    ports:
      - 5000:5000
    volumes:
      - /opt/prom-exporters/yet-cloudwatch-exporter.conf:/tmp/config.yml:ro

Запускаємо компоуз:

docker-compose -f prom-exporters-compose.yml up -d
[+] Running 1/1
 ⠿ Container yet-cloudwatch-exporter  Started

Якщо compose не підходить можна відразу запустити скориставшись docker:

# з використанням AWS Access and Secret Key
docker run -d --rm -v $PWD/.aws/credentials:/exporter/.aws/credentials -v /opt/prom-exporters/yet-another-exporter-config.yml:/tmp/config.yml \
-p 5000:5000 --name yace ghcr.io/nerdswords/yet-another-cloudwatch-exporter:v0.38.0-alpha

# з використанням IAM instance profile
docker run -d --rm -v /opt/prom-exporters/yet-another-exporter-config.yml:/tmp/config.yml \
-p 5000:5000 --name yace ghcr.io/nerdswords/yet-another-cloudwatch-exporter:v0.38.0-alpha

Перевіряємо доступність метрик:

curl localhost:5000/metrics
# HELP aws_alb_active_connection_count_sum Help is not implemented yet.
# TYPE aws_alb_active_connection_count_sum gauge
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} NaN
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} 131
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} 67
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} 109
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} NaN
aws_alb_active_connection_count_sum{account_id="****",dimension_LoadBalancer="app/tf-***/***",name="arn:aws:elasticloadbalancing:eu-central-1:***:loadbalancer/app/tf-***/***",region="eu-central-1"} NaN

Підключаємо до prometheus. Редагуємо конфігураційний файл prometheus.yml, після внесення змін перезапускаємо prometheus:

- job_name: yet-another-cloudwatch-exporter
  scrape_interval: 5s
  metrics_path: '/metrics'
  static_configs:
  - targets:
    - "<IP_or_Hostname_server_when_run_exporter>:5000"

Перевіримо доступність метрик в prometheus:

відповідно й метрики з тегами:

Посилання на тему

Click to rate this post!
[Total: 0 Average: 0]