Full stack проект на Go за неделю. День 6: Настраиваем мониторинг

Full stack проект на Go за неделю. День 6: Настраиваем мониторинг

Это шестая часть материала. Первая часть. Вторая часть. Третья часть. Четвёртая часть. Пятая часть.

Сегодня мы закончим разработку нашего приложения — настроим мониторинг службы конвертации валют и сервера, на котором она запущена и напишем документацию. Воспользуемся для мониторинга сервисом Datadog — более подробно об этом сервисе и его возможностях можно прочесть в этой статье (англ.).

Какой мониторинг мы можем добавить?

Так как наше приложение написано на Go, мы можем воспользоваться библиотекой expvar, с которой мы можем получить доступ к некоторым переменным внутри Go и предоставить доступ к ним из Datadog.

В блоге Datadog есть пост о похожем процессе, в нём описано то, что нам нужно (англ.).

Добавим следующие метрики:

  • currency_hits счётчик запросов точки /currencies — как GET, так и POST, будут считаться одинаково
  • conversion_hits счётчик запросов точки /convert
  • webhook_hits счётчик запросов (успешной) регистрации веб-хука
  • webhook_triggers счётчик количества веб-хуков, вызванных сервером
Запуск

Перейдём в /etc/dd-agent/conf.d/ и переименуем go_expvar.yaml.example в go_expvar.yaml.

Затем отредактируем этот файл:

init_config:

instances:
- expvar_url: http://localhost/debug/vars
metrics:
- path: currency_hits
- path: convert_hits
- path: webhook_hits
- path: webhook_triggers

Готово. Перезапустим агента:

service datadog-agent restart
Всё работает!

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

При настройке мониторинга в Datadog, мы добавили новые метрики из expvar:

Full stack проект на Go за неделю. День 6: Настраиваем мониторинг
И теперь Datadog позволил добавить наши метрики к стандартным способам мониторинга.

Написание документации

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

Все изменения в репозитории добавлены в документацию.

Создание библиотеки

Итак, мы добавили документацию по использованию библиотеки. Супер. А теперь добавим что-то более крутое!

Мы добавим конечную точку, которая будет Javascript библиотекой:


Идея в том, что этот скрипт произведёт нужную конвертацию в фоне, без затрагивания бэкенда.

Изменения в коде описаны в этом коммите. Генератор сценария сделан с помощью стандартной библиотеки text/template и шаблон считывается при каждом запросе — это нужно будет оптимизировать в дальнейшем.

Финальный скрипт, вызываемый скриптом конвертации, будет таким:

(function() {
var currency = {
currencies: ['HRK', 'INR', 'TRY', 'AUD', 'CNY', 'HKD', 'KRW', 'NZD', 'HUF', 'CHF', 'MXN', 'PHP', 'JPY', 'GBP', 'USD', 'RON', 'SEK', 'THB', 'BRL', 'CAD', 'ILS', 'SGD', 'EUR', 'CZK', 'PLN', 'NOK', 'RUB', 'IDR', 'ZAR', 'BGN', 'DKK', 'MYR', ],

rates: {
'HRK': 1.0010224123550462,
'INR': 9.613568488174995,
'TRY': 0.5262329485834208,
'AUD': 0.18688621626711868,
'CNY': 0.9838566470255872,
'HKD': 1.1119945112599887,
'KRW': 164.76444157451502,
'NZD': 0.19922242849839913,
'HUF': 41.477654908924585,
'CHF': 0.143097371324024,
'MXN': 2.9333817633922568,
'PHP': 7.171550030941426,
'JPY': 16.15411520972906,
'GBP': 0.11531735141388866,
'USD': 0.14327225764791346,
'RON': 0.6083757096348913,
'SEK': 1.2709930852638094,
'THB': 5.013856377969705,
'CAD': 0.18738396965049642,
'ILS': 0.5309817849167272,
'SGD': 0.2029488524766594,
'EUR': 0.13452794145343988,
'CZK': 3.6350795060133994,
'PLN': 0.5825732504641213,
'NOK': 1.1925229370140178,
'RUB': 8.336266042457018,
'IDR': 1910.1770387709528,
'ZAR': 1.8747410337127022,
'BGN': 0.2631097478946377,
'DKK': 1,
'MYR': 0.6379853095487933,
},

convert: function(amount, target) {
return this.rates[target] * amount
}
}

window.currency = currency
})();

Он создал глобальную (в window) переменную currency, в которой есть массив .currencies с наименованиями всех валют (краткими). А функция .convert(amount, target) конвертирует сумму из базовой в указанную валюту.

Это очень простой скрипт, но в нём описаны азы построения приложений с конвертацией в UI.

Всем спасибо за чтение!

Источник на английском.

Leave a Comment