- PVSM.RU - https://www.pvsm.ru -
12 июля 2018 года увидел свет первый коммит [1] проекта :telemetry. Автор коммита — Аркадий Гил [2], но README утверждает, что авторское право принадлежит © 2018 Chris McCord and Erlang Solutions, а последний коммит по состоянию на сегодня был сделан Жозе Валимом.

Библиотека представляется следующим образом:
Telemetry — это динамическая библиотека диспетчеризации метрик и инструментария. Она легковесная, небольшого размера, и может быть использована в любом проекте эрланга иди эликсира.
Главным преимуществом библиотеки является то, что она действительно очень проста. Вы просто регистрируете событие, которое «состоит из числового значения и прикрепленных метаданных», и просто посылаете соответствующее сообщение всякий раз, когда это необходимо. Сообщение будет доставлено в обработчик, который может делать все, что угодно; обычно это запись в журнал или что-то типа того. Разделение бизнес-логики и метрик в лучшем виде.
Главным недостатком :telemetry же является то, что она требует огромного количества шаблонного кода, копируемого из проекта в проект, да еще и требующего сопровождения в нескольких мало связанных между собой кусках кода. Рефакторинг проекта с интенсивным использованием телеметрии может стать катастрофой. Для изменения названия события необходимо изменить код в трех разных местах: регистрация события, запуск события, обработка события. Если кто-то забывает зарегистрировать вновь созданное событие, запуск его будет радостно отработает, но обработчик никогда не вызовется и оно просто отправится на кладбище недоставленных и непрочитанных сообщений.
Чувства мои были противоречивы. Я люблю, чтобы метрики были встроены везде, но я не могу согласиться, что grep -r telemetry.execute ./{lib,test}/**/*.ex* это то, что я хочу добавить в свой конвейер сборки. Поэтому я придумал удобную обертку для :telemetry, и назвал ее Telemetría. Я преследовал следующие цели:
:telemetry к функциям и выражениям;:telemetry_poller;Проект сейчас только-только отправился в детский сад, но он уже полностью пригоден для использования. Все, что вам нужно, чтобы внедрить его в какой-нибудь проект (и, следовательно, запрыгнуть в наш поезд едущих в светлое будущее с ветерком и метриками), — это изменить mix.exs, включив :telemetria, и обеспечить минимальную конфигурацию.
# mix.exs
def project do
[
...
# needed for autogeneration of events
compilers: [:telemetria | Mix.compilers()]
]
end
def deps do
[
...
{:telemetria, "~> 0.5"}
]
end
Полный список поддерживаемых параметров всегда можно найти в документации [3], единственным обязательным является :otp_app.
config :telemetria,
otp_app: :my_app,
polling: [enabled: true]
С этими настройками, метрики виртуальной машины и системы будут каждые пять секунд доставляться обработчику по умолчанию, который выплюнет их в журнал с уровнем :info.
Интерфейс у Telemetría также очень прост. Он предоставляет три макрокоманды и одну аннотацию для обработки :telemetry событий. Макросы deft/2, defpt/2, и t/2 — для обертки функции, приватных функций и любых пользовательских выражений, добавив к ним события :telemetry. Проще говоря, все три — ничто иное, как аспекты [4], которые разворачиваются в получить метрики → выполнить обернутые инструкции → снова получить метрики и отослать ивент. Аннотация @telemetria true по существу совпадает с изменением аннотированного вызова на deft/2 / defp/2. Давайте рассмотрим следующий пример.
defmodule Geom do
import Telemetria
@spec circle_area(float()) :: float()
deft circle_area(radius),
do: 2 * 3.14 * radius
end
После компиляции этот код выплюнет событие с именем [:geom, :circle_area] при каждом вызове Geom.circle_are/1:
iex|1> Geom.circle_area 2.0
14:59:49.686 [info] [event: [:geom, :circle_area],
measurements: %{consumed: 3162, reference: "#Reference<0.12.34.56>",
system_time: [system: 1590843589680306588,
monotonic: -576460720784457,
utc: ~U[2020-05-30 12:59:49.681885Z]]},
metadata: %{context: [], env: #Macro.Env<aliases: [], context: nil, ...},
config: #PID<0.314.0>]
#⇒ 12.56
defmodule Geom do
use Telemetria
@telemetria true
@spec circle_area(float()) :: float()
def circle_area(radius),
do: 2 * 3.14 * radius
end
Этот код делает в точности то же самое, что и приведенный выше.
Это не обязательно, но работать с Telemetría будет заметно проще, если добавить пользовательский компилятор в список компиляторов в вашем mix.exs
def project do
[
...
compilers: [:telemetria | Mix.compilers()]
]
end
Компилятор собирает добавленные / удаленные события, за кулисами поддерживает файл манифеста, чтобы всегда иметь актуальный список событий, и предоставляет диагностику основному компилятору Elixir.
Он также создает и предоставляет конфигурацию JSON, которая может быть найдена в папке config локально и может использоваться в качестве конфигурации JSON в релизах. Telemetría умеет читать конфиги в формате JSON.
Конфигурация позволяет:
:telemetry;Полный список настроек доступен в соответствуюшем разделе документации [3].
Глубокое погружение в детали реализации, безусловно, выходит за рамки этой рекламной заметки, но несколько слов все-таки нужно сказать и о том, как оно устроено изнутри.
Если вы хотите легко перейти к добавлению метрик в свое приложение, пожалуйста, прекратите читать прямо сейчас и обратитесь к сниппетам из главки, озаглавленной «В общем и целом».
Если же, наоборот, вас интересуют какие-то хитрости и тонкости, то вот список того, что может оказаться интересным и даже познавательным.
nimble_options [6];@on_definition и @before_compile хуков времени компиляции [9];Application.start_phase/3 [11], чтобы обеспечить полную доступность :telemetry в момент запуска основного приложения;Удачных всем метрик!
Автор: Aleksei Matiushkin
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/353529
Ссылки в тексте:
[1] первый коммит: https://github.com/beam-telemetry/telemetry/commit/8e553556fd683c17f4f97f72972332a4fefd355b
[2] Аркадий Гил: https://github.com/arkgil
[3] документации: https://hexdocs.pm/telemetria/Telemetria.html#module-options
[4] аспекты: https://en.wikipedia.org/wiki/Aspect-oriented_programming
[5] ★★★: https://github.com/am-kantox/telemetria/blob/master/lib/options.ex
[6] nimble_options: https://hexdocs.pm/nimble_options
[7] ★★★: https://github.com/am-kantox/telemetria/blob/master/lib/telemetria.ex#L110-L111
[8] аннотаций: https://github.com/am-kantox/telemetria/blob/master/lib/telemetria/module_hooks.ex
[9] хуков времени компиляции: https://hexdocs.pm/elixir/Module.html#module-compile-callbacks
[10] ★★★: https://github.com/am-kantox/telemetria/blob/master/lib/telemetria/application.ex#L24-L26
[11] Application.start_phase/3: https://hexdocs.pm/elixir/Application.html?#c:start_phase/3
[12] ★★★: https://github.com/am-kantox/telemetria/blob/master/lib/mix/tasks/compile/telemetria.ex
[13] Источник: https://habr.com/ru/post/504602/?utm_source=habrahabr&utm_medium=rss&utm_campaign=504602
Нажмите здесь для печати.