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

# HTTPoison

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 Elixir", version: "2.17.0" },
{ name: "HTTPoison", version: "2.0.0" }
]}
/>

Le paquet AppSignal pour Elixir instrumente les requêtes HTTP effectuées par [HTTPoison](https://github.com/edgurgel/httpoison).

HTTPoison est un client HTTP populaire pour Elixir. Contrairement à Finch et Tesla, HTTPoison n'émet pas d'événements de télémétrie, donc AppSignal ne peut pas l'instrumenter automatiquement. À la place, AppSignal fournit des modules wrappers que vous activez explicitement : `Appsignal.HTTPoison` comme client drop-in, et `Appsignal.HTTPoison.Base` pour les modules clients personnalisés. Les structs de réponse et d'erreur (`%HTTPoison.Response{}`, `%HTTPoison.Error{}`, ...) sont les types propres à HTTPoison et sont renvoyés inchangés.

AppSignal enveloppera les requêtes exécutées via `Appsignal.HTTPoison` en tant qu'événements `request.httpoison` sur la timeline des événements de vos échantillons de performance, vous permettant de voir combien de temps HTTPoison passe à effectuer des requêtes API externes. Ces données peuvent vous aider à décider de déplacer les requêtes API vers un job en arrière-plan, ou à introduire de la mise en cache pour aider à accélérer les performances et limiter les requêtes API inutiles.

## Configuration

L'instrumentation HTTPoison est en opt-in. Choisissez l'approche qui correspond le mieux à votre application.

### Utiliser Appsignal.HTTPoison directement

Appelez `Appsignal.HTTPoison` au lieu de `HTTPoison` pour effectuer des requêtes instrumentées. Pattern-matchez sur `%HTTPoison.Response{...}` et `%HTTPoison.Error{...}` comme d'habitude — ce sont les types de structs propres à HTTPoison, renvoyés inchangés :

<Warning>
  N'utilisez pas `alias Appsignal.HTTPoison`. Cela masquerait le nom du module
  `HTTPoison`, ce qui ferait échouer les pattern-matchings sur `%HTTPoison.Response{}` et
  `%HTTPoison.Error{}`.
</Warning>

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyAppWeb.PageController do
    use MyAppWeb, :controller

    def index(conn, _params) do
      case Appsignal.HTTPoison.get("https://api.example.com/users") do
        {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
          render(conn, :index, users: body)

        {:ok, %HTTPoison.Response{status_code: status}} ->
          conn |> put_status(status) |> text("Error")

        {:error, %HTTPoison.Error{reason: reason}} ->
          conn |> put_status(500) |> text("Error: #{reason}")
      end
    end
  end
  ```
</CodeGroup>

### Modules clients personnalisés

Si vous utilisez un module client HTTP personnalisé basé sur `HTTPoison.Base`, remplacez `use HTTPoison.Base` par `use Appsignal.HTTPoison.Base`. Aucune autre modification n'est nécessaire — à l'intérieur du module, vous pouvez appeler des méthodes comme `get/1` et `post/3`, et faire correspondre les structs de réponse et d'erreur HTTPoison comme d'habitude :

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyApp.ApiClient do
    # replace `use HTTPoison.Base` with `use Appsignal.HTTPoison.Base`
    use Appsignal.HTTPoison.Base

    def process_url(url) do
      "https://api.example.com" <> url
    end

    def users do
      case get("/users") do
        {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> {:ok, body}
        {:ok, %HTTPoison.Response{status_code: status}} -> {:error, status}
        {:error, %HTTPoison.Error{reason: reason}} -> {:error, reason}
      end
    end
  end
  ```
</CodeGroup>

Toutes les requêtes effectuées via votre client personnalisé seront alors instrumentées automatiquement. Si votre module surcharge `request/5`, veillez à appeler `super` pour préserver l'instrumentation :

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyApp.ApiClient do
    use Appsignal.HTTPoison.Base

    def request(method, url, body, headers, options) do
      # ... custom logic here ...
      super(method, url, body, headers, options)
    end
  end
  ```
</CodeGroup>
