Aws cloudwatch put-metric-data, создающий новые метрики каждый раз вместо замены старого - PullRequest
0 голосов
/ 22 мая 2019

Exectation: Я пытаюсь отслеживать докер-контейнеры, работающие на экземпляре EC2.Для простого случая использования, это то, что я пытался.Получение числа контейнеров, запущенных на машине, с помощью простого скрипта bash, приведенного ниже.

Я выполню этот раз, когда будет работать нормально на cronjob, так что он будет считать запущенный контейнер и отправлять данные в cloudwatch каждый раз, когда онзапустится.

result=$(docker ps --format "{{.Names}}" | wc -l)
 aws cloudwatch put-metric-data --metric-name "Container running $result/6" --unit Count --value "$result" --dimensions Total-Container=$result --namespace System/Docker

Как ведет себя Cloudwatch: Каждый раз, когда я запускаю задание, чтобы проверить количество запущенных контейнеров, он добавляет новые метрики.Теперь, как я могу отследить это на графике.

enter image description here

Это может быть ожидаемое поведение облачных часов, но как мне отследить последний вграфик.Цитата

1 Ответ

3 голосов
/ 22 мая 2019

Ваша проблема в том, что вы каждый раз публикуете другое имя метрики.Имя метрики отличается, потому что вы включаете $ result в имя метрики.

Метрика CloudWatch - упорядоченный по времени набор точек данных.Одна метрика называется / идентифицируется 3-мя вещами:

  • Пространство имен (строка)
  • Имя метрики (строка)
  • Размеры (Необязательный набор ключей -> Value String пары)

Вы можете использовать эти поля по своему усмотрению.Я бы предложил что-то вроде:

  • Пространство имен: Система / Докер
  • Имя метрики: например, NumContainersRunning
  • Размеры:
    • Может быть, нет?
    • Возможно что-то вроде Stage: Beta / Prod
    • Может быть что-то вроде Ec2InstanceId: BLA

См. https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html

Если вы хотите, чтобы метрика показывала, сколько контейнеров запущено во всех ваших экземплярах, вам нужно изменить сценарий на следующий и развернуть его на всех ваших экземплярах:

result=$(docker ps --format "{{.Names}}" | wc -l)
aws cloudwatch put-metric-data --metric-name "NumContainersRunning" --unit Count --value "$result" --namespace System/Docker

Примечание. Имя метрикибудет NumContainersRunning

Если вы хотите иметь уникальную метрику для каждого экземпляра в вашем автопарке, вам нужно будет опубликовать уникальную метрику для каждого экземпляра.Вы можете сделать это, добавив измерение в метрику, определяющую идентификатор экземпляра.Это можно сделать с помощью следующего сценария:

instanceid=$(curl http://169.254.169.254/latest/meta-data/instance-id)
result=$(docker ps --format "{{.Names}}" | wc -l)
aws cloudwatch put-metric-data --metric-name "NumContainersRunning" --unit Count --value "$result" --dimensions InstanceId=$instanceid --namespace System/Docker

Примечание. Имя метрики по-прежнему будет NumContainersRunning .Однако в CloudWatch вы увидите разные показатели, по одному на каждый экземпляр.

В другом примечании рассматривали ли вы возможность использования Elastic Container Service ?Он предоставит вам этот показатель и многое другое прямо из коробки и избавит вас от необходимости управлять контейнерами вручную.

...