> ## 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/) a été conçu pour la vitesse et le parallélisme. Puma est une petite bibliothèque qui fournit un serveur HTTP 1.1 rapide et concurrent pour les applications web Ruby.

La gem AppSignal Ruby insère automatiquement un listener dans le serveur Puma ; aucune configuration manuelle n'est requise.

## Plugin de métriques Puma

Le plugin AppSignal pour Puma [collectera des métriques sur le fonctionnement de Puma](#metrics). Lorsqu'AppSignal détecte des métriques Puma, il créera un [Magic Dashboard](#magic-dashboard) vous permettant de surveiller visuellement les métriques principales.

Pour activer la collecte de métriques, ajoutez le plugin AppSignal à votre configuration Puma :

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

<Tip>
  Le serveur StatsD intégré à l'agent AppSignal doit être actif pour que le
  plugin de métriques Puma fonctionne. Assurez-vous que [l'option de
  configuration `enable_statsd`](/ruby/configuration/options#option-enable_statsd)
  n'est pas définie sur `false`.
</Tip>

Puma peut nécessiter une configuration supplémentaire pour charger les [secrets](#configuration-secrets) de votre application, ce qui peut être nécessaire pour qu'AppSignal démarre.

## Utilisation avec `prune_bundler`

Si votre fichier `puma.rb` inclut `prune_bundler`, vous devez ajouter AppSignal comme dépendance d'exécution.

<Tip>
  Pour utiliser Puma avec `prune_bundler`, Puma version 4.2.0 ou supérieure est requise.
</Tip>

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

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

## Utilisation avec `preload_app!`

Si votre fichier `puma.rb` inclut `preload_app!`, une certaine configuration est requise pour rapporter correctement les métriques des [sondes minute par minute](/ruby/instrumentation/minutely-probes). Lorsque `preload_app!` est défini sur true, les sondes minute par minute s'exécutent dans le processus principal de Puma. Dans le processus principal, les sondes ne peuvent pas accéder aux mêmes données que l'application s'exécutant dans les workers Puma, ce qui entraîne le signalement de données inexactes ou aucune donnée.

Dans le fichier de configuration `puma.rb`, arrêtez les sondes minute par minute AppSignal dans le callback `before_fork` pour arrêter les sondes dans le processus principal Puma. Démarrez ensuite les sondes minute par minute dans le processus worker à partir du callback `on_worker_boot`.

<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

Si vous utilisez une bibliothèque telle que [Rails](https://guides.rubyonrails.org/security.html#custom-credentials) ou [dotenv](https://github.com/bkeepers/dotenv) pour gérer les secrets de votre application et configurer AppSignal, vous devrez les charger dans votre configuration Puma.

AppSignal exécute un processus en arrière-plan dans le processus principal de Puma lors de l'utilisation du plugin Puma. Le reste de votre application n'est pas chargé par défaut dans le processus principal de Puma (sauf si vous utilisez `preload_app!`, ce qui peut ne pas convenir à votre application). Sans configuration supplémentaire, la configuration AppSignal ne se chargera pas et AppSignal ne démarrera pas.

Aucun hook « on boot » n'est disponible dans Puma pour charger votre configuration supplémentaire dans le processus principal. Pour charger votre configuration, ajoutez-la à la racine de votre fichier de configuration `puma.rb`, comme dans l'exemple ci-dessous.

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

### Nom d'hôte {/* id: minutely-probe-configuration-hostname */}

Cette sonde écoute l'[option de configuration `APPSIGNAL_HOSTNAME` provenant de la variable
d'environnement](/ruby/configuration/options#option-hostname) pour le tag hostname
ajouté à toutes ses métriques. Si aucune n'est définie, elle tentera de la détecter automatiquement.
Utilisez la variable d'environnement système `APPSIGNAL_HOSTNAME` pour définir le nom d'hôte si vous
souhaitez modifier le nom d'hôte détecté.

### Port StatsD

Cette sonde écoute l'[option de configuration `APPSIGNAL_STATSD_PORT` provenant de la variable d'environnement](/ruby/configuration/options#option-statsd_port) pour la configuration des ports StatsD non par défaut. Si la variable d'environnement n'est pas définie, elle prend par défaut la valeur 8125. Pour le processus principal Puma, il est nécessaire d'utiliser la variable d'environnement ; elle ne lira pas la configuration du fichier AppSignal.

## Redémarrage par phases {/* id: minutely-probe-phased-restart */}

Les [redémarrages par phases](https://github.com/puma/puma/blob/master/docs/restart.md) de Puma
ne redémarrent pas le processus Puma principal, ce qui signifie que le processus AppSignal en arrière-plan
n'est pas non plus redémarré lors d'un redémarrage par phases. Si vous avez apporté des modifications à la
configuration AppSignal, vous devrez redémarrer entièrement votre application Puma par la suite pour que
la modification de configuration prenne effet.

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

## Magic dashboard

Lorsqu'AppSignal reçoit des métriques Puma, il créera un magic dashboard Puma, disponible dans la section dashboard de l'application AppSignal.

Le magic dashboard Puma contiendra les graphiques suivants :

| Graphique                                       | Métriques                 | Tags                                            |
| ----------------------------------------------- | ------------------------- | ----------------------------------------------- |
| [Connection backlog](#connection-backlog-graph) | `puma_connection_backlog` | `hostname`                                      |
| [Pool capacity](#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> |

Les tags vous offrent une décomposition contextuelle des informations de performance d'Active Job. AppSignal signale les tags suivants pour les jobs Active Job :

| Nom        | Description                                                                                                                                                                 |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `booted`   | Nombre total de workers actuellement démarrés pour ce serveur.                                                                                                              |
| `count`    | Nombre de threads en cours d'exécution pour ce serveur.                                                                                                                     |
| `hostname` | Nom de l'hôte depuis lequel la métrique a été signalée.                                                                                                                     |
| `max`      | Nombre maximum de threads configurés pour ce serveur.                                                                                                                       |
| `old`      | Nombre de workers exécutant la configuration/le code précédent du serveur à un moment donné. Puma les éliminera progressivement à mesure que de nouveaux workers démarrent. |
| `running`  | Nombre de threads en cours d'exécution pour ce serveur                                                                                                                      |

Les graphiques vous permettent de surveiller visuellement les métriques de votre application. Vous pouvez ajouter des marqueurs aux graphiques et cliquer sur n'importe quel point de données pour obtenir des informations sur l'état de votre application à ce moment-là.

<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="Exemple de magic dashboard Puma" width="1432" height="672" data-path="assets/images/screenshots/ruby/integrations/puma/dashboard-graphs.png" />

### Graphique Connection backlog

Le graphique Connection backlog montre le nombre de connexions entrantes au serveur qui attendent d'être servies dans la file d'attente backlog du serveur.

Vous pouvez utiliser le graphique Connection backlog pour surveiller le nombre de requêtes en attente de traitement et repérer les goulots d'étranglement Puma.

### Graphique Pool capacity

Le graphique Pool capacity montre le nombre de threads Puma disponibles pour recevoir des requêtes, y compris les threads Puma qui n'ont pas encore été créés.

Vous pouvez utiliser le graphique Pool capacity pour surveiller la disponibilité des threads Puma et optimiser les workers.

### Graphique Threads

Le graphique Threads affiche des informations sur les threads créés par Puma pour servir les requêtes web, agrégés sur l'ensemble des workers Puma. Pour servir les requêtes web, Puma créera plus de threads selon les besoins. Le graphique vous montrera le nombre de threads en cours d'exécution par rapport au nombre maximal de threads disponibles.

Vous pouvez utiliser le graphique Threads pour surveiller la demande et l'offre de threads Puma et optimiser les workers.

### Graphique Worker info

Le graphique Worker info montre combien de workers Puma fonctionnent et quelle version de votre site web ils utilisent. La ligne count montre combien de workers fonctionnent au total, tandis que les lignes booted et old indiquent combien de workers utilisent la nouvelle version et combien utilisent l'ancienne version de votre application.

Vous pouvez utiliser le graphique worker info pour surveiller l'état et les performances de vos workers Puma et voir combien de workers fonctionnent sur une configuration obsolète de votre application.

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

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