Current section

Files

Jump to
elixir_structure_manager priv templates config metrics custom_telemetry.ex
Raw

priv/templates/config/metrics/custom_telemetry.ex

defmodule {app}.Utils.CustomTelemetry do
alias {app}.Utils.DataTypeUtils
alias {app}.Utils.CustomTelemetry
import Telemetry.Metrics
@service_name Application.compile_env!(:{app_snake}, :custom_metrics_prefix_name)
@moduledoc """
Provides functions for custom telemetry events
"""
def custom_telemetry_events() do
:telemetry.attach("{app_snake}-plug-stop", [:{app_snake}, :plug, :stop], &CustomTelemetry.handle_custom_event/4, nil)
:telemetry.attach("{app_snake}-vm-memory", [:vm, :memory], &CustomTelemetry.handle_custom_event/4, nil)
:telemetry.attach("vm-total_run_queue_lengths", [:vm, :total_run_queue_lengths], &CustomTelemetry.handle_custom_event/4, nil)
end
def execute_custom_event(metric, value, metadata \\ %{})
def execute_custom_event(metric, value, metadata) when is_list(metric) do
metadata = Map.put(metadata, :service, @service_name)
:telemetry.execute([:elixir | metric], %{duration: value}, metadata)
end
def execute_custom_event(metric, value, metadata) when is_atom(metric) do
execute_custom_event([metric], value, metadata)
end
def handle_custom_event([:{app_snake}, :plug, :stop], measures, metadata, _) do
:telemetry.execute(
[:elixir, :http_request_duration_milliseconds],
%{duration: DataTypeUtils.monotonic_time_to_milliseconds(measures.duration)},
%{request_path: metadata.conn.request_path, service: @service_name}
)
end
def handle_custom_event(metric, measures, metadata, _) do
metadata = Map.put(metadata, :service, @service_name)
:telemetry.execute([:elixir | metric], measures, metadata)
end
def metrics do
[
#Plug Metrics
counter("elixir.http_request_duration_milliseconds.count", tags: [:request_path, :service]),
sum("elixir.http_request_duration_milliseconds.duration", tags: [:request_path, :service]),
# VM Metrics
last_value("elixir.vm.memory.total", unit: {:byte, :kilobyte}, tags: [:service]),
sum("elixir.vm.total_run_queue_lengths.total", tags: [:service]),
sum("elixir.vm.total_run_queue_lengths.cpu", tags: [:service]),
sum("elixir.vm.total_run_queue_lengths.io", tags: [:service]),
]
end
end