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

# Grape

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

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

<VersionRequirements
  versions={[
{ name: "AppSignal for Ruby", version: "1.1" },
{ name: "Grape", version: "1.0" }
]}
/>

Les applications [Grape](https://www.ruby-grape.org/) sont officiellement prises en charge. L'instrumentation des applications Grape nécessite une configuration manuelle. Suivez les étapes d'installation dans AppSignal en commençant par cliquer sur « Add app » sur l'[écran des comptes](https://appsignal.com/accounts).

<Note>
  Votre application utilise-t-elle une combinaison de Rails, Grape, Hanami, Padrino ou Sinatra ? Suivez notre guide pour [instrumenter plusieurs applications Rack](/ruby/integrations/rack-libraries).
</Note>

## Installation

<Tip>
  Ce guide d'installation est destiné à la gem Ruby 3.12 et versions ultérieures. Pour les applications utilisant
  une gem AppSignal for Ruby plus ancienne, suivez notre [guide d'installation
  hérité](#legacy-installation).
</Tip>

Après avoir [installé et configuré la gem AppSignal](/ruby/installation), ajoutez l'intégration AppSignal après le chargement de l'application Grape.

L'intégration Grape est requise à partir de la gem AppSignal Ruby, et les middlewares d'événement et d'instrumentation sont ajoutés dans les exemples de code suivants.

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

  # Load the Grape integration
  Appsignal.load(:grape)

  # Add the AppSignal Rack event middleware
  # AppSignal for Ruby gem 4.7+ required
  use Appsignal::Rack::EventMiddleware

  # Require the app
  require_relative "api"

  # Start AppSignal
  Appsignal.start

  # Start the app
  run Acme::API
  ```
</CodeGroup>

L'étape suivante consiste à ajouter le middleware AppSignal à la classe API de base de l'application. Il signalera toutes les exceptions non gérées de l'application.

<CodeGroup>
  ```ruby Ruby theme={null}
  # api.rb

  module Acme
    class API < Grape::API
      # Add this line
      insert_before Grape::Middleware::Error, Appsignal::Rack::GrapeMiddleware # Include this middleware

      # ...
    end
  end
  ```
</CodeGroup>

### Installation héritée

Pour les applications utilisant la gem AppSignal for Ruby 3.11 ou plus ancienne, suivez ces étapes pour installer AppSignal dans les applications Grape.

L'intégration Grape est requise à partir de la gem AppSignal Ruby, et le gestionnaire d'événements et les middlewares d'instrumentation sont ajoutés dans les exemples de code suivants.

<CodeGroup>
  ```ruby Ruby theme={null}
  # config.ru
  require "appsignal/integrations/grape" # Add this require

  # Configure AppSignal
  Appsignal.config = Appsignal::Config.new(
    Dir.pwd,        # The root of your app
    ENV["RACK_ENV"] # The environment of your app (development/production)
  )
  # Start AppSignal
  Appsignal.start_logger # Not required in Ruby gem 3.9.3+
  Appsignal.start

  # Add the AppSignal Rack EventHandler
  # AppSignal for Ruby gem 3.8+ required
  use ::Rack::Events, [Appsignal::Rack::EventHandler.new]

  # Require the app
  require_relative "api"

  # Start the app
  run Acme::API
  ```
</CodeGroup>

L'étape suivante consiste à ajouter le middleware AppSignal à la classe API de base de l'application. Il signalera toutes les exceptions non gérées de l'application.

<CodeGroup>
  ```ruby Ruby theme={null}
  # api.rb

  module Acme
    class API < Grape::API
      # Add this line
      insert_before Grape::Middleware::Error, Appsignal::Grape::Middleware # Include this middleware

      # ...
    end
  end
  ```
</CodeGroup>

## Applications Grape montées

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

Le montage d'applications Grape sur des applications Ruby on Rails est pris en charge. La gem Ruby doit être dans une version récente pour instrumenter correctement les requêtes pour les applications Grape montées.

## Ignorer des erreurs

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

Pour ignorer une erreur Grape spécifique, définissez l'indicateur `grape.skip_appsignal_error` dans l'environnement de la requête. Régler cet indicateur sur `true` indiquera à AppSignal de ne signaler aucune erreur pendant la requête.

N'utilisez cet indicateur que si vous devez ignorer dynamiquement les erreurs d'une application Grape. Spécifiez les classes d'erreurs dans l'[option `ignore_errors`](/guides/filter-data/ignore-errors) pour les ignorer pour l'ensemble de l'application. Pour plus d'informations sur la désactivation des notifications pour des erreurs spécifiques, consultez notre [documentation sur les paramètres de notification](/application/notification-settings).

<CodeGroup>
  ```ruby Ruby theme={null}
  get "/" do
    env["grape.skip_appsignal_error"] = true # Add this line to an endpoint or callback
    raise "uh oh" # Example error, don't copy this
  end
  ```
</CodeGroup>

## Signalement des erreurs depuis `rescue_from`

Si une erreur est récupérée dans l'application à l'aide de `rescue_from`, AppSignal ne la recevra pas et ne la suivra pas. Pour signaler tout de même l'erreur, appelez `Appsignal.report_error` dans le bloc `rescue_from`. (Utilisez l'assistant `Appsignal.set_error` lorsque vous utilisez la gem Ruby version 3 ou antérieure.)

<CodeGroup>
  ```ruby Ruby theme={null}
  class Api < ::Grape::API
    insert_before Grape::Middleware::Error, Appsignal::Grape::Middleware

    format :json

    rescue_from :all do |error|
      Appsignal.report_error(error)
      error!({ :error => "error message" }.to_json, 500)
    end
  end
  ```
</CodeGroup>
