Что внутри: простая PoC штука: веб-страничка, которая шлёт эвенты в nsq и консьюмер на golang, который это потребляет, записывая метрики в прометей. Всё в какой-то момент засовывается в докер и спокойно там живёт. Туториал подразумевает, что по нему можно пройти в порядке того как названы директории (они неявно обозначают шаги).
Для всего туториала и отдельных шагов надо знать следующие вещи:
$ npm install nsqjs
Запустить код на nodejs:
$ node server.js
$ node server.js
$ cd /path/to/code
$ go run main.go
Если каких-то пакетов нет в системе, поставить их можно с помощью go get
:
$ go get github.com/bitly/go-nsq
$ go get github.com/prometheus/client_golang/prometheus
$ go get github.com/prometheus/client_golang/prometheus/promauto
$ go get github.com/prometheus/client_golang/prometheus/promhttp
$ go get github.com/Shopify/sarama
Первое это клиентская библиотека к nsq, дальше три это прометей, последнее это клиент для кафки.
Тут надо быть в папке где лежит docker-compose.yml
или задавать путь к нему всегда через -f /path/to/docker-compose.yml
.
$ cd /path/to/code
$ docker-compose up
При первом запуске нужные базовые контейнеры подтянутся, а локальные соберутся. Чтобы пересобрать только какой-то компонент:
$ docker-compose build web
Посмотреть статус контейнеров
$ docker-compose ps
Чтобы потом завершить, можно в другом терминале набрать:
$ docker-compose stop # остановить контейнеры
$ docker-compose down # остановить и удалить контейнеры
Когда мы запускаем nsq без маппинга портов, надо иметь это в виду и, возможно, попроавить соответствующие записи в server.js или main.go (всех их можно найти по подстроке 127.0.0.1 или выводу ошибок интерпретатора)
Если всё надоело, можно удалить всё одним запросом к докеру:
$ docker system prune -a
Это может освободить пару гигабайт, которые docker отжал
Для запуска прометея, надо поставить его в систему и запустить его веб-морду:
$ prometheus --config-file ./60_composed/prometheus/prometheus.yml
Он ждёт что при этом все контейнеры, описанные внутри ./60_composed
поднято. Прометей по умолчанию доступен по адресу localhost:9090
.
Кратко о том, что в каждой директории:
Тут собственно краткая презентация, скорее всего сами по себе слайды не представляют ценности. Однако, предпоследний слайд предлагает дополнительные упражнения, которые можно выполнить после прохождения туториола чтобы узнать побольше про использованные системы
Поднимаем всё что нужно для того чтобы работать с nsq. Подразумевается, что nsq уже установлена в системе. В Makefile прописаны все необходимые для быстрого старта команды, можно просто запустить их последовательно в разных терминалах на одной машине и посмотреть на результат.
Наигравшись локально, кладём всё это в докер. Заодно учимся/вспоминаем, как использовать docker-compose
Представляем, что мы наркоманы front-end разработчики и почему-то нас заставили написать сервер. Пишем его "конечно же" на nodejs
Пришёл менеджер и попросил добавить в сервер информацию о том, с какого браузера (для начала хватит только useragent) и когда заходили на сайт. Вспоминаем, что у нас уже есть nsq и пишем эвенты в неё
Приходит девопс и засовывает наш сервис в докер
Приходит другой девопс (ну ладно, у вас просто много шляп или расстойство личности) и засовывает ваш сервис туда же рядом с nsq. В реальной практике так никто, конечно, делать не будет, но мы живём в мире моих фантазий, а тут возможно всё
Внезапно выяснилось, что теперь в nsq приходят эвенты о том, что пользователи что-то там делают на нашем сайте. Хорошо бы их научиться потреблять и учитывать. Пока попробуем просто потреблять, заодно вспомним golang
Осознав, что к нам приходит json, мы его нормально распаковываем в соответствующую golang-структуру. У нас есть пример сообщения поэтому мы открываем конвертер и добавляем пару строк в наш код. Закончив, радостно оформляем pull-request и идём пить кофе.
Наш PR не приняли и мы теперь переписали код так, чтобы он соответствовал внутренним договорённостям. Мы всё ещё захардкодили путь к nsq-ноде, но этого никто не заметил.
Мы решили что надо бы следить за работой нашего сервиса и добавили к нему метрики для прометея.
Пришёл девопс, радостно поцокал языком и завернул всё в один набор контейнеров. Мы радостно можем теперь смотреть за тем, как оно работает в наш общий прометей или даже поднять его у себя локально. Если нам захочется, мы можем даже потом добавить сюда grafana, но пока и так норм. Это хороший момент чтобы вернуться к первому шагу и посмотреть что там предлагают в качестве последующих заданий
Здесь лежит пример кода который читает из кафки сообщения и просто выводит их на консоль. Надо пройти тот же путь по unmarshall и метрикам