Integrating AppSignal into Plug
-> Note: Support for custom namespaces was added in version 1.3.0 of the AppSignal for Elixir package.
The AppSignal for Elixir package integrates with Plug. To set up the integration, please follow our installation guide.
This page describes how to set up AppSignal in a Plug application, and how to add instrumentation for events within requests. For more information about custom instrumentation, read the Elixir instrumentation documentation.
More information can be found in the AppSignal Hex package documentation.
Table of Contents
Incoming HTTP requests
We'll start out with a small Plug app that accepts
GET requests to
returns a welcome message. To start logging HTTP requests in this app, we'll
Appsignal.Plug module to the end of our app.
defmodule AppsignalPlugExample do use Plug.Router plug :match plug :dispatch get "/" do send_resp(conn, 200, "Welcome") end use Appsignal.Plug # <-- Add this end
This will create a transaction for every HTTP request which is performed on the endpoint.
Appsignal.Plug will start transactions for you, it won't instrument
events in your app just yet. To do that, we need to add some custom
This example app looks like the one we used before, but it has a slow function
slow/0) we'd like to add instrumentation for. To do that, we need
use Appsignal.Instrumentation.Decoratorsto allow us to use AppSignal's instrumentation decorators
- Decorate the function we want to instrument with the
defmodule AppsignalPlugExample do use Plug.Router use Appsignal.Instrumentation.Decorators # <-- 1 plug :match plug :dispatch get "/" do slow() send_resp(conn, 200, "Welcome") end @decorate transaction_event() # <-- 2 defp slow do :timer.sleep(1000) end use Appsignal.Plug end
This will add an event for the
slow/0 function to the current transaction
whenever it's called. For more information about custom instrumentation, read
the Elixir instrumentation documentation.
Instrumentation for included Plugs
Exceptions in included Plugs are automatically caught by AppSignal, but performance samples need to be set up manually using the custom instrumentation helpers or decorators.
Plug instrumentation with decorators
To add instrumentation to Plugs, use the
module, and decorate your Plug's
call/2 function using the
defmodule SlowPlugWithDecorators do import Plug.Conn # use Appsignal's decorators use Appsignal.Instrumentation.Decorators def init(opts), do: opts # Decorate the call/2 function to add custom instrumentation @decorate transaction_event() def call(conn, _) do :timer.sleep(1000) conn end end
documentation for more information.
Plug instrumentation without decorators
Instead of using the decorators, you can use the
instrument/3 method to
decorate a block of code directly.
defmodule SlowPlugWithInstrumentationHelpers do import Plug.Conn # Import the instrument-function import Appsignal.Instrumentation.Helpers, only: [instrument: 3] def init(opts), do: opts def call(conn, _) do # Wrap the contents of the call/2 function in an instrumentation block instrument("timer.sleep", "Sleeping", fn() -> :timer.sleep(1000) conn end) end end
See the instrumentation helpers documentation for more information.