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

# Instrumentation des scripts et des tâches en arrière-plan

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.11.0" }
]}
/>

AppSignal prend en charge [de nombreuses gems prêtes à l'emploi][integrations] et ne nécessite pas d'instrumentation supplémentaire pour signaler les données d'erreur et de performance. Pour les scripts personnalisés et les bibliothèques que nous ne prenons pas en charge, vous pouvez ajouter une surveillance en suivant ce guide.

## Surveillance des scripts

Un échantillon AppSignal est composé de deux éléments : une transaction et des événements. Avant de signaler des événements avec [nos assistants d'instrumentation](#instrumentation-events), vous devez d'abord créer une transaction.

Utilisez l'assistant `Appsignal.monitor` pour créer une transaction et la rendre active pendant la durée du bloc donné.

L'assistant monitor signalera le bloc de code instrumenté sous forme de mesures de performance répertoriées dans la section Performance de l'interface utilisateur AppSignal, regroupées par nom d'action. Il suivra la durée du bloc et signalera les exceptions qui s'y produisent.

<CodeGroup>
  ```ruby Ruby theme={null}
  class CronJobScript
    def call
      Appsignal.monitor(
        :namespace => "cron",
        :action    => "CronJobScript#call"
      ) do
        # Your code
      end
    end
  end
  ```
</CodeGroup>

L'assistant `monitor` accepte deux arguments par mots-clés :

* `namespace` (Facultatif) : personnalise le namespace de la transaction. La valeur par défaut est « web ».
* `action` (Obligatoire) : nous regroupons les échantillons du script par ce nom d'action pour la création d'incidents et les notifications. Sans nom d'action, aucune information sur le bloc surveillé n'est signalée, car nous ne savons pas comment regrouper les données.

### Définir le nom de l'action ultérieurement

L'argument `action` de l'assistant `Appsignal.monitor` peut être laissé nil ou explicitement défini sur `:set_later`, mais uniquement si l'assistant `Appsignal.set_action` est toujours appelé à l'intérieur du bloc pour définir le nom de l'action. Sans nom d'action, aucune donnée n'est signalée concernant le bloc instrumenté. Cette méthode de définition du nom de l'action peut être utile si le nom de l'action ne peut être déterminé que lors d'une étape de traitement à l'intérieur du bloc.

<CodeGroup>
  ```ruby Ruby theme={null}
  class CronJobScript
    def call
      Appsignal.monitor(
        :action => :set_later
      ) do
        # Your code

        # Set action name later
        Appsignal.set_action("My action name")
      end
    end
  end
  ```
</CodeGroup>

### Événements d'instrumentation

Par défaut, la gem Ruby signalera les événements des [intégrations prises en charge][integrations]. Ces événements apparaîtront dans la chronologie des événements. Utilisez [nos assistants d'instrumentation](/ruby/instrumentation/instrumentation) pour ajouter vos propres événements à la chronologie des événements. Cela crée une répartition plus détaillée de ce qui se passe à l'intérieur du bloc surveillé.

<CodeGroup>
  ```ruby Ruby theme={null}
  class CronJobScript
    def call
      Appsignal.monitor(
        :namespace => "cron",
        :action    => "CronJobScript#call"
      ) do
        Appsignal.instrument "fetch.plans" do
          # Complex part of fetching payment plans
        end

        Appsignal.instrument "send.invoices" do
          # Complex part of sending invoices
        end
      end
    end
  end
  ```
</CodeGroup>

## Obligation d'arrêt

Pour les scripts exécutés sur des hôtes de courte durée, il est nécessaire d'arrêter la gem Ruby AppSignal avant que le script ne se termine.
Cela garantit qu'elle signale les données du script à AppSignal avant que l'hôte ne s'éteigne.

Ce comportement n'est nécessaire que dans des scénarios tels que :

* Lorsqu'une tâche planifiée (un cron job) est exécutée par un service d'hébergement.
* Lorsqu'un script est exécuté sur un conteneur qui démarre pour exécuter ce script et s'arrête lorsque le script se termine.
* Lorsqu'un script est exécuté sur un runner Heroku, ou des fournisseurs d'hébergement similaires.

Il n'est pas nécessaire d'arrêter la gem Ruby AppSignal si l'hôte sur lequel le script est démarré continue de fonctionner après la fin du script.

AppSignal est arrêté automatiquement lorsque le script se termine et qu'un conteneur ou un environnement d'hébergement comme Heroku est détecté.

Ce comportement est contrôlé par l'[option `enable_at_exit_hook`](/ruby/configuration/options#option-enable_at_exit_hook).
Assurez-vous que cette option est définie sur true pour les scripts qui nécessitent l'arrêt d'AppSignal, si elle n'est pas détectée automatiquement.

Il peut être nécessaire d'ajouter un appel `sleep` supplémentaire de quelques secondes pour s'assurer qu'il y a suffisamment de temps pour envoyer toutes les données. Utilisez l'exemple d'utilisation `at_exit` du code ci-dessous si nécessaire.

<CodeGroup>
  ```ruby Ruby theme={null}
  # This block is called after all tasks are ran
  # Ensures the AppSignal agent has enough time to send the data to the AppSignal servers
  at_exit { sleep 10 }

  # Your script code
  ```
</CodeGroup>

### Assistant Monitor and stop

<Warning>
  L'assistant `Appsignal.monitor_and_stop` est déprécié au profit de l'[option `enable_at_exit_hook`](/ruby/configuration/options#option-enable_at_exit_hook), qui garantit que `Appsignal.stop` est appelé lorsque le processus se termine, et non chaque fois que l'assistant `Appsignal.monitor_and_stop` est appelé.
  Son utilisation est décrite dans la section ci-dessus.

  N'utilisez cet assistant que dans les versions de la gem Ruby qui ne prennent pas en charge l'[option `enable_at_exit_hook`](/ruby/configuration/options#option-enable_at_exit_hook).
</Warning>

Si votre processus exécute toujours une seule tâche/un seul job et se termine immédiatement après, vous pouvez utiliser l'assistant `Appsignal.monitor_and_stop`. Cela garantira qu'AppSignal s'arrête automatiquement après l'exécution du bloc.

<CodeGroup>
  ```ruby Ruby theme={null}
  # This block is called right before the script exits
  # Ensures the AppSignal agent has enough time to send the data to the AppSignal servers
  at_exit do
    sleep 10
  end

  class CronJobScript
    def call
      Appsignal.monitor_and_stop(
        :namespace => "cron",
        :action    => "CronJobScript#call"
      ) do
        # Your code
      end
    end
  end
  ```
</CodeGroup>

[integrations]: /ruby/integrations.html
