> ## 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>;
};

Pour instrumenter les applications Rack, AppSignal fournit un middleware d'instrumentation Rack. Si vous utilisez l'un des frameworks Rack pris en charge comme [Rails], [Sinatra], [Hanami], [Grape] ou [Padrino], nous vous recommandons d'utiliser ces instrumentations à la place.

## Ajouter le middleware d'instrumentation

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

<Tip>
  Vous utilisez une gem AppSignal Ruby plus ancienne ? Suivez [notre guide
  hérité](#using-the-legacy-instrumentation-middleware).
</Tip>

Pour [intégrer AppSignal][integrate] dans une application Rack, nous devons d'abord charger, [configurer][configuration] et démarrer AppSignal.

Ensuite, instrumentez l'application Rack en ajoutant nos middlewares Rack `EventMiddleware` et `InstrumentationMiddleware` à la pile de middlewares.

Cette documentation explique comment procéder dans le fichier `config.ru` de votre application.

<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>

Assurez-vous que les middlewares `EventMiddleware` et `InstrumentationMiddleware` sont enregistrés dans la pile de middlewares de l'application aussi tôt que possible. Plus ces middlewares sont enregistrés tôt, plus l'exécution de la requête instrumentée par les middlewares sera importante. Si d'autres middlewares sont enregistrés au préalable, nos middlewares n'instrumenteront pas ces autres middlewares.

Après avoir ajouté les `EventMiddleware` et `InstrumentationMiddleware` à la pile de middlewares de votre application, [l'action](#setting-the-action-name) doit être définie pour chaque route de votre application dans AppSignal. Sans nom d'action pour regrouper les requêtes, le middleware d'événements ne signalera pas les informations de requête.

Pour plus d'informations sur le fonctionnement de votre application Rack, nous recommandons [d'ajouter une instrumentation supplémentaire][instrumentation] aux endpoints de l'application.

### Le middleware d'événements Rack

Nous recommandons d'ajouter notre middleware d'événements Rack à toutes les applications Rack. Ce middleware garantira que nous suivons
Le middleware d'événements Rack AppSignal présente les fonctionnalités suivantes :

* Instrumentation de la requête et enregistrement d'un événement `process_request.rack`.
* Signalement des exceptions qui se produisent dans l'application et le middleware.
* Suivi du code de statut de la réponse comme tag `response_status` sur l'échantillon.
* Suivi du code de statut de la réponse comme métrique `response_status`, avec les tags `namespace` et `status`.

### Le middleware d'instrumentation Rack

Nous recommandons qu'en plus du `Appsignal::Rack::EventMiddleware`, le `AppSignal::Rack::InstrumentationMiddleware` soit ajouté à l'application. Ce middleware complète l'instrumentation du middleware d'événements en ajoutant des tags pour le chemin et la méthode de requête, ainsi qu'en suivant la gestion du corps de réponse et les opérations de fermeture du corps de réponse.

Le middleware d'instrumentation présente les fonctionnalités suivantes :

* Instrumentation de la requête et enregistrement d'un événement `process_request.rack`.
* Signalement des exceptions qui se produisent dans l'application.
* Suivi du chemin et de la méthode de requête comme tags sur l'échantillon.
* Instrumentation de la gestion du corps de réponse et enregistrement d'un événement `process_response_body.rack` pour cette opération.
* Instrumentation de la fermeture du corps de réponse et enregistrement d'un événement `close_response_body.rack` pour cette opération.

## Utilisation du middleware d'instrumentation hérité

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

<Warning>
  Le middleware GenericInstrumentation a été déprécié dans la gem Ruby 3.10.0.
  Veuillez utiliser le [nouveau guide](#add-the-instrumentation-middleware) à la place.
</Warning>

Pour [intégrer AppSignal][integrate] dans une application Rack, nous devons d'abord charger, [configurer][configuration] et démarrer AppSignal.

Ensuite, instrumentez l'application Rack en ajoutant notre middleware Rack `GenericInstrumentation` à la pile de middlewares.

Cette documentation explique comment procéder dans le fichier `config.ru` de votre application.

<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>

Assurez-vous que les middlewares `EventMiddleware` et `InstrumentationMiddleware` sont enregistrés dans la pile de middlewares de l'application aussi tôt que possible. Plus ces middlewares sont enregistrés tôt, plus l'exécution de la requête instrumentée par les middlewares sera importante. Si d'autres middlewares sont enregistrés au préalable, nos middlewares n'instrumenteront pas ces autres middlewares.

Après avoir ajouté les `EventMiddleware` et `InstrumentationMiddleware` à la pile de middlewares de votre application, [l'action](#setting-the-action-name) doit être définie pour chaque route de votre application dans AppSignal. Sans nom d'action pour regrouper les requêtes, le middleware d'événements ne signalera pas les informations de requête.

Pour plus d'informations sur le fonctionnement de votre application Rack, nous recommandons [d'ajouter une instrumentation supplémentaire][instrumentation] aux endpoints de l'application.

## Définition du nom d'action

Définissez un nom d'action sur la transaction AppSignal pour une requête afin que nous puissions regrouper les endpoints dans nos incidents et métriques. Nous recommandons d'utiliser un nom d'action statique par endpoint, comme `GET /blog`, `POST /users`, `PUT /users/:id`, etc.

Pour définir un nom d'action pour une requête, appelez l'assistant `Appsignal.set_action` depuis l'application.

<Warning>
  N'utilisez pas le chemin de la requête de la route comme nom d'action si le chemin
  comporte des segments dynamiques. L'utilisation de chemins de requête réels pour les noms d'actions rompt notre regroupement de requêtes
  en créant des incidents uniques pour chaque chemin de requête possible.
</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
