AbsintheMetrics provides time (or counter) based metrics for your Absinthe resolvers to allow you to keep track of where your queries are spending their time.
Usage is fairly straight forward,
defmodule MyApp.Instrumenter do
use AbsintheMetrics,
adapter: AbsintheMetrics.Backend.PrometheusHistogram,
# See prometheus.ex for more examples
arguments: [buckets: {:exponential, 250, 1.5, 7}]
end
defmodule MyApp.Schema do
use Absinthe.Schema
def middleware(middlewares, field, object) do
MyApp.Instrumenter.instrument(middlewares, field, object)
end
end
# in application.ex
defmodule MyApp do
def start(_type, _args) do
# initialize all available metrics in your schema
MyApp.Instrumenter.install(MyApp.Schema)
# ...
end
endHow metrics are gathered depends on the backend, but for PrometheusHistogram the format is #{object}_#{field}_duration_microseconds or query_field_duration_microseconds for root queries.
Adding additional backends is pretty straight forward, you just need to implement the AbsintheMetrics behaviour,
defmodule LogBackend do
@behaviour AbsintheMetrics
require Logger
# Called during application start to allow you to register
# fields with your TSDB
def field(object, field, _args \\ []) do
Logger.info("install field #{object}_#{field}")
end
# Called every time a value is observed
# status can be :ok or :error
def instrument(object, field, {status, _result}, time) do
metric = "#{object}_#{field}"
case status do
:error -> Logger.warn("#{metric} failed (took: #{inspect time})")
:ok -> Logger.info("#{metric} took: #{inspect time}")
end
end
endIf available in Hex, the package can be installed
by adding absinthe_metrics to your list of dependencies in mix.exs:
def deps do
[
{:absinthe_metrics, "~> 0.9.0"}
]
endDocumentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/absinthe_metrics.