telemetry_metrics icon indicating copy to clipboard operation
telemetry_metrics copied to clipboard

Confusion around Counter

Open yordis opened this issue 8 months ago • 2 comments

Hey there, currently I have the following module,

defmodule MyAppWeb.SafeResolverMiddleware do
  # ...
  @impl Absinthe.Middleware
  def call(resolution, resolver) do
    op = Enum.find(resolution.path, &current_operation?/1)

    span_nometa(
      [:safe_resolver_middleware],
      %{operation_name: operation_name(op), operation_type: operation_type(op)},
      fn -> Resolution.call(resolution, resolver) end
    )
  rescue
    exception ->
      # ....
  end

  # ... in another module
  def span_nometa(event, start_and_stop_metadata, fun) do
    # more and less what we have today
    :telemetry.span([:myapp] ++ event, start_and_stop_metadata, fn ->
      {fun.(), start_and_stop_metadata}
    end)
  end
end

Which I would like to have a counter around the exception,

counter(
  "myapp.safe_resolver_middleware.exception.duration",
  tags: [:operation_name, :operation_type]
)

Readind the following, https://github.com/beam-telemetry/telemetry_metrics/blob/ab8616480cc78bd2377c390f07261da6f37a7401/lib/telemetry_metrics.ex#L15-L18

You could define a counter metric, which counts how many HTTP requests were completed:

Telemetry.Metrics.counter("http.request.stop.duration")

The metrics mention that it is counting how many, but it is using duration measurement, which is confusing to me. Counting "duration" sounds odd.

I tried to change the measurement to .count, but that doesn't exist in the measurement of the metrics so that it would fail.

measurement = %{monotonic_time: -576460706732624847, duration: 4314}
metadata = %{reason: %RuntimeError{message: "hello, world"}, stacktrace: [], kind: :error, operation_name: "listUsers", operation_type: :query, telemetry_span_context: #Reference<0.3696372234.2707161091.20455>}

I understand that I can avoid using the convention from https://github.com/beam-telemetry/telemetry_metrics/blob/ab8616480cc78bd2377c390f07261da6f37a7401/lib/telemetry_metrics.ex#L47-L48 and I could have more control over the metrics.

Also, I could pass :count as a measurement by using :telemetry.execute/3 but :telemetry.span/3 does not allow me to pass the measurement, and it is probably more common to use :telemetry.span/3 than :telemetry.execute/3 I found.

So, I am confused about how to focus on just counting +1.

yordis avatar Jun 23 '24 05:06 yordis