Мониторинг раннеров GitHub Actions может потребоваться при отладке сборки ваших приложений, например когда билд стабильно падает из-за нехватки ресурсов, а наблюдать динамику их утилизации в реальном времени не представляется возможным.
Мониторинг раннеров GitHub Actions
GitHub Actions по умолчанию предоставляет до 20 раннеров единовременно для публичных проектов. Каждый раннер создается перед выполнением задачи и существует пока она активна.
Сразу после завершения задачи раннер уничтожается. Раннеры не переиспользуются и каждый раз создаются с нуля. В процессе выполнения задачи бывает важно контролировать происходящее – отслеживать метрики как аппаратные, так и программные.
Проблема
GitHub не предоставляет инструментов мониторинга раннеров. Отсутствует какая-либо информация даже о примитивных аппаратных метриках, таких как CPU load, RAM, free disk space.
Решение
Дополнить список предустановленного на раннерах софта не получится, но вполне возможно самостоятельно установить необходимое вам программное обеспечение (например node_exporter), либо запустить его в контейнерах. Последний вариант даже быстрее и проще, благо Docker уже установлен по умолчанию.
Метрики node_exporter доступны на 9100 порту, но опросить его снаружи не получится.
Prometheus создан для работы по pull-модели, когда он сам опрашивает целевые хосты, на которых развернуты экспортеры. Но отправлять метрики по push-модели также возможно, для этого есть Pushgateway 1. У него весьма ограниченная область применения и в общих случаях его использование не рекомендуется. Однако наш сценарий подходит идеально.
Локально опросить метрики сможет даже самый обычный curl, его и возьмем.
Запускать node_exporter в контейнере вполне возможно и в нашем случае даже оправдано, но вот что делать с curl? Я предлагаю запускать в контейнере в том числе и его и вот почему:
- Если ваш пайплайн выполняется в докер-контейнере, то управлять процессами хоста не так-то просто. При том сделать docker run для контейнера с курлом – элементарная задача. К тому же docker.sock по умолчанию уже проброшен в основной контейнер
- Отслеживать логи curl намного удобнее командой docker logs, чем грепать /var/log и искать по pid (если будет запущено несколько таких экземпляров)
Остается сделать так, чтобы curl снимал метрики раз в 15 секунд и отправлял их на Pushgateway. Попробуем это реализовать.
Реализация
Небольшая инструкция по запуску node_exporter в контейнере есть в официальном репозитории 2 на GitHub:
1 2 3 4 5 6 |
docker run -d --name node_exporter \ --net="host" \ --pid="host" \ --volume="/:/host:ro,rslave" \ quay.io/prometheus/node-exporter:v1.3.1 \ --path.rootfs=/host |
Теперь переходим к curl. Если вы настаиваете на варианте его запуска прямо на хостовой ОС, то однострочник ниже вам идеально подойдет:
1 2 3 4 5 6 7 |
while true; \ do \ curl localhost:9100/metrics |\ curl -u <username>:<password> \ --data-binary @- https://<pushgateway_host>/metrics/job/pushgateway/instance/${GITHUB_RUN_ID}-${HOSTNAME}/service/github ;\ sleep 15; \ done & |
Второй curl в пайпе предназначен для отправки данных на ваш Pushgateway. На вход он принимает имя пользователя и пароль (<username>:<password>) и публично доступный адрес хоста (<pushgateway_host>). ${GITHUB_RUN_ID} и ${HOSTNAME}${HOSTNAME} – встроенные переменные GitHub Actions.
Но, как мы и обсуждали ранее, лучше запускать curl в контейнере:
1 2 3 4 5 6 |
docker run \ -d --name curl-node \ --net="host" \ --entrypoint=/bin/sh \ curlimages/curl:7.84.0 \ "-c" "while true; do curl localhost:9100/metrics | curl -u <username>:<password> --data-binary @- https://<pushgateway_host>/metrics/job/pushgateway/instance/${GITHUB_RUN_ID}-${HOSTNAME}/service/github ; sleep 15; done" |
На этом все! Понимаю, что статья получилась больше теоретическая, чем практическая, но описываемое техническое решение очень сильно зависит от вашей инфраструктуры. Тем не менее теперь вы знаете, что настроить мониторинг даже на github-hosted агентах вполне реально. Однако если не хочется разбираться с CI/CD самостоятельно, вы всегда может обратиться ко мне. А вот про pushgateway поговорим уже как-нибудь потом. Успехов!
Notes: