cra / npl-dataeng-demo

materials for npl talk at newprolab's data engineering program

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Микросервис на go, в докере и с метриками

Что внутри: простая PoC штука: веб-страничка, которая шлёт эвенты в nsq и консьюмер на golang, который это потребляет, записывая метрики в прометей. Всё в какой-то момент засовывается в докер и спокойно там живёт. Туториал подразумевает, что по нему можно пройти в порядке того как названы директории (они неявно обозначают шаги).

Troubleshooting

Для всего туториала и отдельных шагов надо знать следующие вещи:

Как поставить пакет через npm:

$ npm install nsqjs

Запустить код на nodejs:

$ node server.js

Как запустить код на nodejs:

$ node server.js

Как запустить код на golang:

$ 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, дальше три это прометей, последнее это клиент для кафки.

Как работать с докер-контейнерами в compose

Тут надо быть в папке где лежит 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)

Когда мы запускаем 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.

Steps

Кратко о том, что в каждой директории:

00_presentation

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

10_nsq

Поднимаем всё что нужно для того чтобы работать с nsq. Подразумевается, что nsq уже установлена в системе. В Makefile прописаны все необходимые для быстрого старта команды, можно просто запустить их последовательно в разных терминалах на одной машине и посмотреть на результат.

11_nsq_docker

Наигравшись локально, кладём всё это в докер. Заодно учимся/вспоминаем, как использовать docker-compose

20_basic_website

Представляем, что мы наркоманы front-end разработчики и почему-то нас заставили написать сервер. Пишем его "конечно же" на nodejs

21_website_events

Пришёл менеджер и попросил добавить в сервер информацию о том, с какого браузера (для начала хватит только useragent) и когда заходили на сайт. Вспоминаем, что у нас уже есть nsq и пишем эвенты в неё

22_website_docker

Приходит девопс и засовывает наш сервис в докер

30_composed

Приходит другой девопс (ну ладно, у вас просто много шляп или расстойство личности) и засовывает ваш сервис туда же рядом с nsq. В реальной практике так никто, конечно, делать не будет, но мы живём в мире моих фантазий, а тут возможно всё

40_consume_golang_single

Внезапно выяснилось, что теперь в nsq приходят эвенты о том, что пользователи что-то там делают на нашем сайте. Хорошо бы их научиться потреблять и учитывать. Пока попробуем просто потреблять, заодно вспомним golang

41_consume_golang_unmarshall

Осознав, что к нам приходит json, мы его нормально распаковываем в соответствующую golang-структуру. У нас есть пример сообщения поэтому мы открываем конвертер и добавляем пару строк в наш код. Закончив, радостно оформляем pull-request и идём пить кофе.

42_golang_refactor

Наш PR не приняли и мы теперь переписали код так, чтобы он соответствовал внутренним договорённостям. Мы всё ещё захардкодили путь к nsq-ноде, но этого никто не заметил.

50_golang_metrics

Мы решили что надо бы следить за работой нашего сервиса и добавили к нему метрики для прометея.

60_composed

Пришёл девопс, радостно поцокал языком и завернул всё в один набор контейнеров. Мы радостно можем теперь смотреть за тем, как оно работает в наш общий прометей или даже поднять его у себя локально. Если нам захочется, мы можем даже потом добавить сюда grafana, но пока и так норм. Это хороший момент чтобы вернуться к первому шагу и посмотреть что там предлагают в качестве последующих заданий

70_kafka

Здесь лежит пример кода который читает из кафки сообщения и просто выводит их на консоль. Надо пройти тот же путь по unmarshall и метрикам

About

materials for npl talk at newprolab's data engineering program


Languages

Language:Go 58.2%Language:JavaScript 29.1%Language:Makefile 8.3%Language:Dockerfile 4.4%