Current section

Files

Jump to
google_ads lib google_ads telemetry query_resource_consumption.ex
Raw

lib/google_ads/telemetry/query_resource_consumption.ex

defmodule GoogleAds.Telemetry.QueryResourceConsumption do
@moduledoc """
Telemetry handler for computing the query resource consumption spent on Google Ads API requests.
"""
@spec setup() :: :ok | {:error, :already_exists}
def setup do
:telemetry.attach(
{__MODULE__, :tesla_request_stop},
[:tesla, :request, :stop],
&__MODULE__.handle_event/4,
nil
)
end
@spec handle_event(list(), measurements :: map(), metadata :: map(), config :: any()) :: :ok
def handle_event([:tesla, :request, :stop], _measurements, metadata, _config) do
case metadata do
%{provider: :google_ads, env: env, customer_id: customer_id} ->
handle_google_ads_request(env, customer_id)
_metadata ->
:ok
end
end
defp handle_google_ads_request(env, customer_id) do
if measurable?(env) do
consumption = Map.fetch!(env.body, "queryResourceConsumption")
:telemetry.execute(
[:google_ads, :query_resource],
%{
consumption: String.to_integer(consumption)
},
%{
customer_id: customer_id
}
)
else
:ok
end
end
defp measurable?(env) do
env.status == 200 && String.contains?(env.url, "googleAds:search") &&
Map.has_key?(env.body, "queryResourceConsumption")
end
end