binaryseed / new_relic_absinthe

Absinthe Instrumentation for the New Relic Elixir Agent
https://hex.pm/packages/new_relic_absinthe
Apache License 2.0
19 stars 13 forks source link

Transactions segments are not displayed in New Relic #5

Closed barthez closed 4 years ago

barthez commented 5 years ago

Describe the bug Transaction segments are not displayed in New Relic. I did inspect segements in NewRelic.Transaction.Reporter.complete_transaction with:

  defp inspect_segments(segments, depth \\ 0) do
    Enum.each(segments, fn %{metric_name: metric_name, children: children} ->
      indent = (0..depth) |> Enum.map(fn _ -> "│" end) |> Enum.join()
      IO.puts("#{indent}├ #{metric_name}")
      inspect_segments(children, depth + 1)
    end)
  end

Resulting:

See output ``` │├ #PID<0.1511.0> ││├ #PID<0.1514.0> ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Types.Message.-__absinthe_type__1-fun-1- ││├ Graphql.Types.Message.-__absinthe_type__1-fun-0- ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ││├ Graphql.Resolvers.Quality.resolve ││├ Graphql.Resolvers.Ability.-build1-fun-0- ││├ Graphql.Resolvers.LocalizedDateTime.resolve ││├ Graphql.Resolvers.MessageBody.resolve ```

So it seems segments are being collected, but I cannot see them in transaction details in New Relic interface.

New Relic transactions details looks like this: image

Environment

binaryseed commented 5 years ago

Segment breakdowns are powered by metrics that the agent doesn't collect yet. The segments themselves are visible in Transaction Traces & as Span Events in Distributed Traces

barthez commented 5 years ago

So, it will show transaction breakdown if NewRelic.report_metric would be added somewhere here, am I right?

Is there anything that stops us from doing so?

binaryseed commented 5 years ago

No, this has to be done in the agent itself, it has to report "scoped" metrics for the segments

tomconroy commented 5 years ago

I'm not seeing any Transactions traces show up for absinthe queries or resolvers, not sure if I'm doing something wrong. I'm using absinthe together with phoenix, does this setup sound like it should report query resolvers as transaction traces?

  1. add instrumenters: [NewRelic.Phoenix.Instrumenter] to Endpoint config
  2. add use NewRelic.Phoenix.Transaction to App.Endpoint
  3. add NewRelic.Absinthe.Middleware to schema middleware

does use NewRelic.Transaction need to be added somewhere?

this change seems to not do anything:

  pipeline :graphql do
+   use NewRelic.Transaction
    plug :accepts, ["json"]
    plug :fetch_session
  end

  scope "/graphql", as: :graphql do
    pipe_through [:graphql]
    forward "/", Absinthe.Plug,
      schema: App.Schema,
      before_send: {AppSchema, :before_send}
  end
binaryseed commented 4 years ago

Newer versions of the agents support this, just upgrade!