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

# Hanami

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

<VersionRequirements
  versions={[
{ name: "AppSignal for Ruby", version: "3.3.0" },
{ name: "Hanami", version: "2" }
]}
/>

[Hanami](https://hanamirb.org/) wird offiziell unterstützt. Die Instrumentierung von Hanami-Anwendungen erfordert manuelles Setup. Folgen Sie den Installationsschritten in AppSignal, beginnend mit einem Klick auf „Add app" auf dem [Accounts-Bildschirm](https://appsignal.com/accounts).

<Note>
  Verwendet Ihre Anwendung eine Kombination aus Rails, Grape, Hanami, Padrino oder Sinatra? Folgen Sie unserem Leitfaden zum [Instrumentieren mehrerer Rack-Anwendungen](/ruby/integrations/rack-libraries).
</Note>

<Tip>
  Diese Seite beschreibt die Integration für das Hanami-Framework, das über
  das Gem „hanami" installiert wird. Das Framework Hanami::API (aus dem Gem „hanami-api")
  wird nicht unterstützt.
</Tip>

## Installation

Nachdem Sie das AppSignal-Gem installiert haben, fügen Sie die AppSignal-Integration nach dem Require von `hanami/boot` in der `config.ru`-Datei hinzu.

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

  # Load the Hanami integration
  Appsignal.load(:hanami)
  # Start AppSignal
  Appsignal.start

  run Hanami.app

  # For Ruby gem 3.11 and older
  require "appsignal/integrations/hanami" # Add this line
  ```
</CodeGroup>

## Exception-Handling

Hanami verfügt standardmäßig über kein Exception-Handling. Der Webserver (etwa Puma oder Unicorn) zeigt eine einfache „internal server error"-Seite an, wenn in der App ein Fehler auftritt. Diese unbehandelten Ausnahmen werden automatisch an AppSignal gemeldet.

Der [Hanami-Leitfaden zum Exception-Handling](https://guides.hanamirb.org/v2.1/actions/exception-handling/) erklärt, wie benutzerdefiniertes Exception-Handling zu Hanami-Anwendungen hinzugefügt werden kann, um eigene Fehlerseiten zu rendern. Behandelte Ausnahmen werden nicht automatisch an AppSignal gemeldet.

Wir empfehlen, den folgenden Code zur Basis-Action-Klasse der Anwendung in `app/action.rb` hinzuzufügen, um Exception-Handling für `StandardError` zu ergänzen. Auf diese Weise ist es nicht nötig, jeder Action-Klasse Exception-Handling hinzuzufügen.

Rufen Sie in der Methode `handle_standard_error`, die mit `handle_exception` konfiguriert wird, den Helper `Appsignal.report_error` auf, um die Ausnahme an AppSignal zu melden und keine Fehler zu verpassen, die von Ihrer App gemeldet werden. (Verwenden Sie den Helper `Appsignal.set_error`, wenn Sie Ruby-Gem-Version 3 oder älter verwenden.)

<CodeGroup>
  ```ruby Ruby theme={null}
  # app/action.rb
  # auto_register: false
  # frozen_string_literal: true

  require "hanami/action"

  module MyHanamiApp
    class Action < Hanami::Action
      handle_exception StandardError => :handle_standard_error

      private

      def handle_standard_error(request, response, exception)
        # Report the error to AppSignal
        Appsignal.report_error(exception)

        # Render custom error page
        response.status = 500
        response.body = "Sorry, something went wrong handling your request"
      end
    end
  end
  ```
</CodeGroup>

Nachdem Sie die Methode `Appsignal.report_error` zu den Hanami-Ausnahmen hinzugefügt haben, die Sie melden möchten, meldet AppSignal diese Fehler, sobald sie auftreten.
