> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rack

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

Om Rack-applicaties te instrumenteren, biedt AppSignal een Rack-instrumentatie-middleware. Als u een van de ondersteunde Rack-frameworks gebruikt, zoals [Rails], [Sinatra], [Hanami], [Grape], of [Padrino], raden we aan om in plaats daarvan die instrumentaties te gebruiken.

## De instrumentatie-middleware toevoegen

<Compatibility versions={[{ name: "AppSignal for Ruby", version: "4.7.0" }]} />

<Tip>
  Gebruikt u een oudere AppSignal Ruby-gem? Volg [onze legacy
  handleiding](#using-the-legacy-instrumentation-middleware).
</Tip>

Om [AppSignal te integreren][integrate] in een Rack-applicatie, moeten we eerst AppSignal laden, [configureren][configuration] en starten.

Vervolgens instrumenteert u de Rack-app door onze Rack `EventMiddleware` en `InstrumentationMiddleware` aan de middleware-stack toe te voegen.

In deze documentatie wordt uitgelegd hoe u dit doet in het `config.ru`-bestand van uw applicatie.

<CodeGroup>
  ```ruby Ruby theme={null}
  # config.ru
  require "appsignal"                           # Load AppSignal

  Appsignal.start                               # Start the AppSignal integration

  # Add the Rack EventMiddleware first
  use Appsignal::Rack::EventMiddleware
  # Add the Rack InstrumentationMiddleware
  use Appsignal::Rack::InstrumentationMiddleware

  # Load your app with a require statement here, like
  require_relative "app"

  # Add other middleware here if needed

  # Finally, run the app
  use MyApp.run
  ```
</CodeGroup>

Zorg ervoor dat de `EventMiddleware` en `InstrumentationMiddleware` zo vroeg mogelijk in de middleware-stack van de applicatie worden geregistreerd. Hoe eerder deze middleware wordt geregistreerd, hoe meer request-runtime de middleware zal instrumenteren. Als er eerder andere middleware wordt geregistreerd, instrumenteert onze middleware deze andere middleware niet.

Nadat u de `EventMiddleware` en `InstrumentationMiddleware` aan de middleware-stack van uw app heeft toegevoegd, moet [de actie](#setting-the-action-name) voor elke route in uw app worden ingesteld in AppSignal. Zonder actienaam om requests te groeperen, rapporteert de event-middleware geen request-informatie.

Voor meer inzicht in de werking van uw Rack-applicatie raden we aan [aanvullende instrumentatie toe te voegen][instrumentation] aan de endpoints van de applicatie.

### De Rack-event-middleware

We raden aan om onze Rack-event-middleware aan alle Rack-applicaties toe te voegen. Deze middleware zorgt ervoor dat we het volgende bijhouden:
De AppSignal Rack-event-middleware heeft de volgende functies:

* Instrumentatie van de request en het registreren van een `process_request.rack`-event.
* Rapporteren van excepties die in de app en middleware optreden.
* Bijhouden van de response-statuscode als de `response_status`-tag op het sample.
* Bijhouden van de response-statuscode als de `response_status`-metriek, met de tags `namespace` en `status`.

### De Rack-instrumentatie-middleware

We raden aan om naast de `Appsignal::Rack::EventMiddleware` ook de `AppSignal::Rack::InstrumentationMiddleware` aan de app toe te voegen. Deze middleware vult de instrumentatie van de event-middleware aan door tags toe te voegen voor het request-pad en de request-methode, en door responsbody-afhandeling en het sluiten van de responsbody bij te houden.

De instrumentatie-middleware heeft de volgende functies:

* Instrumentatie van de request en het registreren van een `process_request.rack`-event.
* Rapporteren van excepties die in de app optreden.
* Bijhouden van het request-pad en de request-methode als tags op het sample.
* Instrumentatie van de responsbody-afhandeling en het registreren van een `process_response_body.rack`-event voor deze operatie.
* Instrumentatie van het sluiten van de responsbody en het registreren van een `close_response_body.rack`-event voor deze operatie.

## De legacy instrumentatie-middleware gebruiken

<Compatibility versions={[{ name: "AppSignal for Ruby", version: "v1.1.6" }]} />

<Warning>
  De GenericInstrumentation-middleware is verouderd verklaard in Ruby-gem
  3.10.0. Gebruik in plaats daarvan de [nieuwe handleiding](#add-the-instrumentation-middleware).
</Warning>

Om [AppSignal te integreren][integrate] in een Rack-applicatie, moeten we eerst AppSignal laden, [configureren][configuration] en starten.

Vervolgens instrumenteert u de Rack-app door onze Rack `GenericInstrumentation`-middleware aan de middleware-stack toe te voegen.

In deze documentatie wordt uitgelegd hoe u dit doet in het `config.ru`-bestand van uw applicatie.

<CodeGroup>
  ```ruby Ruby theme={null}
  # config.ru
  # Load and configure AppSignal
  require "appsignal"                           # Load AppSignal

  Appsignal.config = Appsignal::Config.new(
    File.expand_path("../", __FILE__),          # Application root path
    ENV["RACK_ENV"],                            # Application environment
  )
  Appsignal.start                               # Start the AppSignal integration
  Appsignal.start_logger                        # Start logger

  # Load your app with a require statement here, like
  require_relative "app"

  # Add the GenericInstrumentation middleware
  use Appsignal::Rack::GenericInstrumentation

  # Add other middleware here if needed

  # Finally, run the app
  use MyApp.run
  ```
</CodeGroup>

Zorg ervoor dat de `EventMiddleware` en `InstrumentationMiddleware` zo vroeg mogelijk in de middleware-stack van de applicatie worden geregistreerd. Hoe eerder deze middleware wordt geregistreerd, hoe meer request-runtime de middleware zal instrumenteren. Als er eerder andere middleware wordt geregistreerd, instrumenteert onze middleware deze andere middleware niet.

Nadat u de `EventMiddleware` en `InstrumentationMiddleware` aan de middleware-stack van uw app heeft toegevoegd, moet [de actie](#setting-the-action-name) voor elke route in uw app worden ingesteld in AppSignal. Zonder actienaam om requests te groeperen, rapporteert de event-middleware geen request-informatie.

Voor meer inzicht in de werking van uw Rack-applicatie raden we aan [aanvullende instrumentatie toe te voegen][instrumentation] aan de endpoints van de applicatie.

## De actienaam instellen

Stel een actienaam in op de AppSignal-transactie voor een request, zodat we endpoints kunnen groeperen in onze issues en metrieken. We raden aan om per endpoint een statische actienaam te gebruiken, zoals `GET /blog`, `POST /users`, `PUT /users/:id`, etc.

Om een actienaam voor een request in te stellen, roept u de `Appsignal.set_action`-helper aan vanuit de app.

<Warning>
  Gebruik het request-pad van de route niet als actienaam als het pad
  dynamische segmenten bevat. Het gebruik van echte request-paden voor
  actienamen verstoort onze request-groepering door unieke issues voor elk
  mogelijk request-pad aan te maken.
</Warning>

<CodeGroup>
  ```ruby Ruby theme={null}
  # app.rb
  require "rack"

  # Example pure-Rack app
  class MyApp
    def call(env)
      case [env["REQUEST_METHOD"], env["PATH_INFO"]]
      when ["GET", "/"]
        Appsignal.set_action("GET /") # Action name set here
        body = <<~BODY
          <h1>Rack example app</h1>

          <ul>
            <li><a href="/slow">Slow request</a></li>
            <li><a href="/error">Error request</a></li>
          </ul>
        BODY
        [200, {"Content-Type" => "text/html"}, [body]]
      when ["GET", "/slow"]
        Appsignal.set_action("GET /slow") # Action name set here
        sleep 1
        [200, {"Content-Type" => "text/plain"}, ["Slow response"]]
      when ["GET", "/error"]
        Appsignal.set_action("GET /error") # Action name set here
        raise "uh oh"
      else
        Appsignal.set_action("NotFound") # Action name set here
        [404, {"Content-Type" => "text/plain"}, ["Page not found"]]
      end
    end
  end
  ```
</CodeGroup>

[configuration]: /ruby/configuration

[integrate]: /ruby/instrumentation/integrating-appsignal.html

[instrumentation]: /ruby/instrumentation/instrumentation.html

[Rails]: /ruby/integrations/rails.html

[Sinatra]: /ruby/integrations/sinatra.html

[Hanami]: /ruby/integrations/hanami.html

[Grape]: /ruby/integrations/grape.html

[Padrino]: /ruby/integrations/padrino.html
