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

# Tesla

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.7.3" },
{ name: "Tesla", version: "1.4.3" }
]}
/>

O pacote AppSignal for Elixir instrumenta requisições HTTP realizadas pelo [Tesla](https://github.com/elixir-tesla/tesla).

Tesla é uma biblioteca cliente HTTP flexível para Elixir. Ela pode usar múltiplos middlewares e adapters para modificar e executar requisições HTTP, e tem suporte embutido para telemetria de requisições.

Após configurar o middleware Telemetry do Tesla, o AppSignal reconhecerá as requisições executadas via Tesla e as mostrará como eventos `request.tesla` na Event Timeline das suas amostras de desempenho.

Na Event Timeline, você verá quanto tempo o Tesla gasta fazendo requisições a APIs externas. Esses dados podem ajudá-lo a decidir mover as requisições de API para um background job ou introduzir caching para ajudar a acelerar o desempenho e limitar requisições desnecessárias a APIs.

Na view Slow API Requests de desempenho, você poderá ver throughput agregado e tempos médios para diferentes tipos de requisições HTTP. Siga as instruções na seção [Path Params Grouping](#path-params-grouping) para melhorar as informações exibidas nessa view.

## Configuração

Adicione o middleware `Tesla.Middleware.Telemetry` à cadeia de middlewares do seu módulo ou cliente, **antes de quaisquer outros middlewares**:

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyAPIClient do
    use Tesla

    plug Tesla.Middleware.Telemetry
    # ... plugue outros middlewares aqui, **depois** do middleware Telemetry
  end
  ```
</CodeGroup>

<CodeGroup>
  ```elixir Elixir theme={null}
  client = Tesla.client([
    Tesla.Middleware.Telemetry,
    # ... adicione outros middlewares aqui, **depois** do middleware Telemetry
  ])
  ```
</CodeGroup>

<Tip>
  Se estiver usando o adapter Finch para o Tesla, você deve [desabilitar a
  instrumentação Finch do AppSignal](/elixir/integrations/finch#automatic-instrumentation)
  definindo a opção de configuração `instrument_finch` como `false`.
</Tip>

## Agrupamento aprimorado

Por padrão, a instrumentação do AppSignal para o Tesla agrupará as requisições pelo nome de domínio contra o qual são feitas. O path da requisição não será mostrado no AppSignal. No entanto, usando certos middlewares do Tesla, é possível adicionar mais informações sobre a requisição.

As seções a seguir descrevem o comportamento de cada middleware separadamente, mas também é possível usá-los juntos.

### Agrupamento por Base URL

Ao usar o middleware `BaseUrl`, a base URL fornecida, incluindo seu path, será usada para o agrupamento, fornecendo a você algum insight adicional sobre o alvo das requisições HTTP realizadas pelo Tesla:

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyAPIClient do
    use Tesla

    plug Tesla.Middleware.Telemetry
    # certifique-se de que o Telemetry aparece **antes** de qualquer outro middleware!
    plug Tesla.Middleware.BaseUrl, "https://api.example.com/v2/users"

    def user_comments(id) do
      get("/#{id}/comments")
    end
  end
  ```
</CodeGroup>

No exemplo acima, requisições feitas por este cliente serão exibidas na Event Timeline da amostra e na view Slow API Requests como `GET https://api.example.com/v2/users`, em vez de apenas `GET https://api.example.com`, fornecendo informações adicionais sobre as requisições que estão sendo realizadas.

### Agrupamento por Path Params

Ao usar o middleware `PathParams`, a URL fornecida ao Tesla para a requisição será um template, com os path parameters sendo passados separadamente:

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyAPIClient do
    use Tesla

    plug Tesla.Middleware.Telemetry
    # certifique-se de que o Telemetry aparece **antes** de qualquer outro middleware!
    plug Tesla.Middleware.PathParams

    def user_comments(id) do
      params = [user: id]
      get("https://api.example.com/v2/users/:user/comments", opts: [path_params: params])
    end
  end
  ```
</CodeGroup>

Quando `PathParams` é usado, o template da URL será mostrado no AppSignal. As requisições aparecerão como `GET https://api.example.com/v2/users/:user/comments` na Event Timeline da amostra e na view Slow API Requests, fornecendo a você uma visão detalhada de cada tipo de requisição que seu cliente executa.

## Desabilitar a instrumentação do Tesla

Para desabilitar a instrumentação do Tesla, defina [a opção de configuração `instrument_tesla`](/elixir/configuration/options#option-instrument_tesla) como `false`.
