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

# Puma

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.0.7" },
{ name: "Puma", version: "3.11.4" }
]}
/>

[Puma](http://puma.io/) wurde für Geschwindigkeit und Parallelität entwickelt. Puma ist eine kleine Bibliothek, die einen schnellen und nebenläufigen HTTP-1.1-Server für Ruby-Webanwendungen bereitstellt.

Das AppSignal-Ruby-Gem fügt automatisch einen Listener in den Puma-Server ein; manuelles Setup ist nicht erforderlich.

## Puma-Metriken-Plugin

Das AppSignal-Puma-Plugin [erfasst Metriken über die Funktionsweise von Puma](#metrics). Wenn AppSignal Puma-Metriken erkennt, wird ein [Magic Dashboard](#magic-dashboard) erstellt, mit dem Sie zentrale Metriken visuell überwachen können.

Um die Metrikerfassung zu aktivieren, fügen Sie das AppSignal-Plugin zu Ihrer Puma-Konfiguration hinzu:

<CodeGroup>
  ```ruby Ruby theme={null}
  # puma.rb (or config/puma.rb)
  plugin :appsignal
  ```
</CodeGroup>

<Tip>
  Der mit dem AppSignal-Agent ausgelieferte StatsD-Server muss aktiv sein, damit
  das Puma-Metriken-Plugin funktioniert. Stellen Sie sicher, dass [die
  Konfigurationsoption `enable_statsd`](/ruby/configuration/options#option-enable_statsd) nicht auf
  `false` gesetzt ist.
</Tip>

Puma benötigt möglicherweise zusätzliche Konfiguration, um die [Secrets](#configuration-secrets) Ihrer Anwendung zu laden, was für den Start von AppSignal erforderlich sein kann.

## Verwendung mit `prune_bundler`

Wenn Ihre `puma.rb`-Datei `prune_bundler` enthält, müssen Sie AppSignal als Runtime-Abhängigkeit hinzufügen.

<Tip>
  Um Puma mit `prune_bundler` zu verwenden, ist Puma Version 4.2.0 oder höher erforderlich.
</Tip>

<CodeGroup>
  ```ruby Ruby theme={null}
  # puma.rb (or config/puma.rb)
  prune_bundler

  plugin :appsignal
  extra_runtime_dependencies ["appsignal"]
  ```
</CodeGroup>

## Verwendung mit `preload_app!`

Wenn Ihre `puma.rb`-Datei `preload_app!` enthält, ist eine bestimmte Konfiguration erforderlich, um Metriken aus [Minutely-Probes](/ruby/instrumentation/minutely-probes) korrekt zu melden. Wenn `preload_app!` auf true gesetzt ist, laufen die Minutely-Probes im Puma-Primärprozess. Im Primärprozess können die Probes nicht auf dieselben Daten zugreifen wie die App, die in den Puma-Workern läuft, wodurch ungenaue oder gar keine Daten gemeldet werden.

Stoppen Sie in der Puma-Konfigurationsdatei `puma.rb` die AppSignal-Minutely-Probes im `before_fork`-Callback, um die Minutely-Probes im Puma-Hauptprozess zu beenden. Starten Sie die Minutely-Probes dann im Worker-Prozess aus dem `on_worker_boot`-Callback heraus.

<CodeGroup>
  ```ruby Ruby theme={null}
  # puma.rb or config/puma.rb

  # When preload_app! is set
  preload_app!


  # Add this before_fork callback to stop the minutely probes in the Puma main process
  before_fork do
    Appsignal::Probes.stop
  end

  # Add this on_worker_boot callback to start the minutely probes in the Puma worker processes
  on_worker_boot do
    Appsignal::Probes.start
  end
  ```
</CodeGroup>

## Secrets

Wenn Sie eine Bibliothek wie [Rails](https://guides.rubyonrails.org/security.html#custom-credentials) oder [dotenv](https://github.com/bkeepers/dotenv) verwenden, um die Secrets Ihrer App zu verwalten und AppSignal zu konfigurieren, müssen Sie diese in Ihrer Puma-Konfiguration laden.

AppSignal führt einen Hintergrundprozess in Pumas Hauptprozess aus, wenn das Puma-Plugin verwendet wird. Der Rest Ihrer App wird standardmäßig nicht im Hauptprozess von Puma geladen (es sei denn, Sie verwenden `preload_app!`, was für Ihre App möglicherweise nicht geeignet ist). Ohne zusätzliche Konfiguration kann die AppSignal-Konfiguration nicht geladen werden und AppSignal startet nicht.

In Puma ist kein „on boot"-Hook verfügbar, um zusätzliche Konfiguration im Hauptprozess zu laden. Um Ihre Konfiguration zu laden, fügen Sie sie wie im folgenden Beispiel an den Anfang Ihrer `puma.rb`-Konfigurationsdatei.

<CodeGroup>
  ```ruby Ruby theme={null}
  # puma.rb (or config/puma.rb)
  plugin :appsignal # Add this plugin

  # Rails secrets
  # Add this line when using Rails secrets in your `config/appsignal.rb` or `config/appsignal.yml` file.
  require "rails"

  # Add this section when using dotenv for secrets management
  require "dotenv"
  Dotenv.load
  # or for Rails apps:
  require "dotenv/load"
  Dotenv.load


  # Rest of your Puma config...
  ```
</CodeGroup>

### Hostname {/* id: minutely-probe-configuration-hostname */}

Diese Probe liest die [Konfigurationsoption `APPSIGNAL_HOSTNAME` aus der Umgebungsvariable](/ruby/configuration/options#option-hostname) für das Hostname-Tag, das allen Metriken hinzugefügt wird. Wenn keine gesetzt ist, versucht sie, ihn automatisch zu erkennen.
Verwenden Sie die Systemumgebungsvariable `APPSIGNAL_HOSTNAME`, um den Hostnamen zu setzen, wenn Sie den erkannten Hostnamen ändern möchten.

### StatsD-Port

Diese Probe liest die [Konfigurationsoption `APPSIGNAL_STATSD_PORT` aus der Umgebungsvariable](/ruby/configuration/options#option-statsd_port) für die Konfiguration nicht standardmäßiger StatsD-Ports. Wenn die Umgebungsvariable nicht gesetzt ist, wird standardmäßig 8125 verwendet. Für den Puma-Hauptprozess ist die Verwendung der Umgebungsvariable erforderlich; die AppSignal-Dateikonfiguration wird nicht gelesen.

## Phased Restart {/* id: minutely-probe-phased-restart */}

Die [Phased Restarts](https://github.com/puma/puma/blob/master/docs/restart.md) von Puma
starten den Puma-Hauptprozess nicht neu, was bedeutet, dass auch der AppSignal-Hintergrundprozess
bei einem Phased Restart nicht neu gestartet wird. Wenn Sie Änderungen an der
AppSignal-Konfiguration vorgenommen haben, müssen Sie Ihre Puma-App anschließend vollständig neu starten,
damit die Konfigurationsänderung wirksam wird.

<CodeGroup>
  ```sh Shell theme={null}
  # After changing the AppSignal config, restart using:
  pumactl restart
  # instead of: pumactl phased-restart
  ```
</CodeGroup>

## Magic Dashboard

Wenn AppSignal Puma-Metriken empfängt, wird ein Puma Magic Dashboard erstellt, das im Dashboard-Bereich der AppSignal-App verfügbar ist.

Das Puma Magic Dashboard enthält die folgenden Graphen:

| Graph                                           | Metriken                  | Tags                                            |
| ----------------------------------------------- | ------------------------- | ----------------------------------------------- |
| [Connection Backlog](#connection-backlog-graph) | `puma_connection_backlog` | `hostname`                                      |
| [Pool-Kapazität](#pool-capacity-graph)          | `puma_pool_capacity`      | `hostname`                                      |
| [Threads](#threads-graph)                       | `puma_threads`            | <li>`max`</li><li>`running`</li>                |
| [Worker-Info](#worker-info-graph)               | `puma_workers`            | <li>`booted`</li><li>`count`</li><li>`old`</li> |

Tags geben Ihnen eine kontextbezogene Aufschlüsselung der Active-Job-Performance-Informationen. AppSignal meldet die folgenden Tags für Active-Job-Jobs:

| Name       | Beschreibung                                                                                                                                                   |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `booted`   | Gesamtzahl der aktuell gestarteten Worker für diesen Server.                                                                                                   |
| `count`    | Anzahl der aktuell laufenden Threads für diesen Server.                                                                                                        |
| `hostname` | Name des Hosts, von dem die Metrik gemeldet wurde.                                                                                                             |
| `max`      | Maximale Anzahl konfigurierter Threads für diesen Server.                                                                                                      |
| `old`      | Anzahl der Worker, die zum jeweiligen Zeitpunkt die vorherige Konfiguration/den vorherigen Code des Servers ausführen. Puma phast diese mit neuen Workern aus. |
| `running`  | Anzahl der aktuell laufenden Threads für diesen Server                                                                                                         |

Graphen ermöglichen es Ihnen, die Metriken Ihrer Anwendung visuell zu überwachen. Sie können Graphen Marker hinzufügen und auf einen beliebigen Datenpunkt klicken, um Einblicke in den Zustand Ihrer Anwendung zu diesem Zeitpunkt zu erhalten.

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/puma/dashboard-graphs.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=b9c868a34aedc2a6ee3f1e870c0e97c8" alt="Example Puma magic dashboard" width="1432" height="672" data-path="assets/images/screenshots/ruby/integrations/puma/dashboard-graphs.png" />

### Connection-Backlog-Graph

Der Connection-Backlog-Graph zeigt die Anzahl der eingehenden Verbindungen zum Server, die in der Backlog-Warteschlange des Servers darauf warten, bearbeitet zu werden.

Sie können den Connection-Backlog-Graphen verwenden, um zu überwachen, wie viele Anfragen auf ihre Bearbeitung warten, und Puma-Engpässe zu erkennen.

### Pool-Kapazität-Graph

Der Pool-Kapazität-Graph zeigt die Anzahl der Puma-Threads, die zum Empfangen von Anfragen verfügbar sind, einschließlich Puma-Threads, die noch gestartet werden müssen.

Sie können den Pool-Kapazität-Graphen verwenden, um die Verfügbarkeit von Puma-Threads zu überwachen und Worker zu optimieren.

### Threads-Graph

Der Threads-Graph zeigt Informationen über die von Puma zur Bedienung von Web-Anfragen gestarteten Threads, aggregiert über alle Puma-Worker. Um Web-Anfragen zu bedienen, startet Puma bei Bedarf weitere Threads. Der Graph zeigt Ihnen die Anzahl der laufenden Threads im Verhältnis zur maximal verfügbaren Anzahl an Threads.

Sie können den Threads-Graphen verwenden, um Nachfrage und Angebot der Puma-Threads zu überwachen und Worker zu optimieren.

### Worker-Info-Graph

Der Worker-Info-Graph zeigt, wie viele Puma-Worker arbeiten und welche Version Ihrer Website sie verwenden. Die Count-Linie zeigt, wie viele Worker insgesamt arbeiten, während die Booted- und Old-Linien zeigen, wie viele Worker die neue Version und wie viele die alte Version Ihrer Anwendung verwenden.

Sie können den Worker-Info-Graphen verwenden, um den Status und die Performance Ihrer Puma-Worker zu überwachen und zu sehen, wie viele Worker mit einer veralteten Konfiguration Ihrer Anwendung laufen.

[thread pool]: https://github.com/puma/puma/#thread-pool

[clustered mode]: https://github.com/puma/puma/#clustered-mode
