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

# Rack

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

Para instrumentar aplicações Rack, o AppSignal fornece um middleware de instrumentation Rack. Se você usa algum dos frameworks Rack suportados como [Rails], [Sinatra], [Hanami], [Grape] ou [Padrino], recomendamos usar essas instrumentations em vez deste.

## Adicionar o middleware de instrumentation

<Compatibility versions={[{ name: "AppSignal for Ruby", version: "4.7.0" }]} />

<Tip>
  Usando uma gem AppSignal Ruby mais antiga? Siga [nosso guia
  legado](#using-the-legacy-instrumentation-middleware).
</Tip>

Para [integrar o AppSignal][integrate] em uma aplicação Rack, primeiro precisamos carregar, [configurar][configuration] e iniciar o AppSignal.

Em seguida, instrumente o app Rack adicionando nossos middlewares `EventMiddleware` e `InstrumentationMiddleware` do Rack à pilha de middleware.

Esta documentação explica como fazer isso no arquivo `config.ru` da sua aplicação.

<CodeGroup>
  ```ruby Ruby theme={null}
  # config.ru
  require "appsignal"                           # Carrega o AppSignal

  Appsignal.start                               # Inicia a integração AppSignal

  # Adiciona primeiro o EventMiddleware do Rack
  use Appsignal::Rack::EventMiddleware
  # Adiciona o InstrumentationMiddleware do Rack
  use Appsignal::Rack::InstrumentationMiddleware

  # Carregue seu app com uma instrução require aqui, como
  require_relative "app"

  # Adicione outros middleware aqui, se necessário

  # Por fim, execute o app
  use MyApp.run
  ```
</CodeGroup>

Certifique-se de que `EventMiddleware` e `InstrumentationMiddleware` estejam registrados na pilha de middleware da aplicação o mais cedo possível. Quanto mais cedo esses middlewares forem registrados, mais runtime da requisição o middleware irá instrumentar. Se outros middlewares forem registrados antes, nossos middlewares não irão instrumentá-los.

Após adicionar `EventMiddleware` e `InstrumentationMiddleware` à pilha de middleware do seu app, [a action](#setting-the-action-name) precisa ser definida para cada rota no seu app no AppSignal. Sem um nome de action para agrupar as requisições, o event middleware não reportará as informações da requisição.

Para mais insights sobre o funcionamento da sua aplicação Rack, recomendamos [adicionar instrumentation adicional][instrumentation] aos endpoints da aplicação.

### O event middleware Rack

Recomendamos adicionar nosso event middleware Rack a todas as aplicações Rack. Este middleware garantirá que rastreemos
O event middleware Rack do AppSignal tem as seguintes funcionalidades:

* Instrumentation da requisição e registro de um evento `process_request.rack`.
* Reporte de Exceptions que ocorrem no app e no middleware.
* Rastreamento do status code da response como a tag `response_status` no sample.
* Rastreamento do status code da response como a métrica `response_status`, com as tags `namespace` e `status`.

### O instrumentation middleware Rack

Recomendamos que além do `Appsignal::Rack::EventMiddleware`, o `AppSignal::Rack::InstrumentationMiddleware` seja adicionado ao app. Este middleware complementa a instrumentation do event middleware adicionando tags para o caminho da requisição e o método da requisição, bem como rastreando o tratamento e o fechamento do response body.

O instrumentation middleware tem as seguintes funcionalidades:

* Instrumentation da requisição e registro de um evento `process_request.rack`.
* Reporte de Exceptions que ocorrem no app.
* Rastreamento do caminho da requisição e do método da requisição como tags no sample.
* Instrumentation do tratamento do response body e registro de um evento `process_response_body.rack` para esta operação.
* Instrumentation do fechamento do response body e registro de um evento `close_response_body.rack` para esta operação.

## Usando o middleware de instrumentation legado

<Compatibility versions={[{ name: "AppSignal for Ruby", version: "v1.1.6" }]} />

<Warning>
  O middleware GenericInstrumentation foi descontinuado na gem Ruby 3.10.0.
  Por favor, use o [novo guia](#add-the-instrumentation-middleware) em vez disso.
</Warning>

Para [integrar o AppSignal][integrate] em uma aplicação Rack, primeiro precisamos carregar, [configurar][configuration] e iniciar o AppSignal.

Em seguida, instrumente o app Rack adicionando nosso middleware `GenericInstrumentation` do Rack à pilha de middleware.

Esta documentação explica como fazer isso no arquivo `config.ru` da sua aplicação.

<CodeGroup>
  ```ruby Ruby theme={null}
  # config.ru
  # Carrega e configura o AppSignal
  require "appsignal"                           # Carrega o AppSignal

  Appsignal.config = Appsignal::Config.new(
    File.expand_path("../", __FILE__),          # Caminho raiz da aplicação
    ENV["RACK_ENV"],                            # Ambiente da aplicação
  )
  Appsignal.start                               # Inicia a integração AppSignal
  Appsignal.start_logger                        # Inicia o logger

  # Carregue seu app com uma instrução require aqui, como
  require_relative "app"

  # Adiciona o middleware GenericInstrumentation
  use Appsignal::Rack::GenericInstrumentation

  # Adicione outros middleware aqui, se necessário

  # Por fim, execute o app
  use MyApp.run
  ```
</CodeGroup>

Certifique-se de que `EventMiddleware` e `InstrumentationMiddleware` estejam registrados na pilha de middleware da aplicação o mais cedo possível. Quanto mais cedo esses middlewares forem registrados, mais runtime da requisição o middleware irá instrumentar. Se outros middlewares forem registrados antes, nossos middlewares não irão instrumentá-los.

Após adicionar `EventMiddleware` e `InstrumentationMiddleware` à pilha de middleware do seu app, [a action](#setting-the-action-name) precisa ser definida para cada rota no seu app no AppSignal. Sem um nome de action para agrupar as requisições, o event middleware não reportará as informações da requisição.

Para mais insights sobre o funcionamento da sua aplicação Rack, recomendamos [adicionar instrumentation adicional][instrumentation] aos endpoints da aplicação.

## Definindo o nome da action

Defina um nome de action na transaction do AppSignal para uma requisição para que possamos agrupar endpoints em nossos issues e métricas. Recomendamos usar um nome de action estático por endpoint, como `GET /blog`, `POST /users`, `PUT /users/:id`, etc.

Para definir um nome de action para uma requisição, chame o helper `Appsignal.set_action` a partir do app.

<Warning>
  Não use o caminho da requisição da rota como o nome da action se o caminho tiver
  segmentos dinâmicos. Usar caminhos de requisição reais para nomes de action quebra nosso
  agrupamento de requisições, criando issues únicos para cada possível caminho de requisição.
</Warning>

<CodeGroup>
  ```ruby Ruby theme={null}
  # app.rb
  require "rack"

  # Exemplo de app Rack puro
  class MyApp
    def call(env)
      case [env["REQUEST_METHOD"], env["PATH_INFO"]]
      when ["GET", "/"]
        Appsignal.set_action("GET /") # Nome da action definido aqui
        body = <<~BODY
          <h1>Rack example app</h1>

          <ul>
            <li><a href="/slow">Slow request</a></li>
            <li><a href="/error">Error request</a></li>
          </ul>
        BODY
        [200, {"Content-Type" => "text/html"}, [body]]
      when ["GET", "/slow"]
        Appsignal.set_action("GET /slow") # Nome da action definido aqui
        sleep 1
        [200, {"Content-Type" => "text/plain"}, ["Slow response"]]
      when ["GET", "/error"]
        Appsignal.set_action("GET /error") # Nome da action definido aqui
        raise "uh oh"
      else
        Appsignal.set_action("NotFound") # Nome da action definido aqui
        [404, {"Content-Type" => "text/plain"}, ["Page not found"]]
      end
    end
  end
  ```
</CodeGroup>

[configuration]: /ruby/configuration

[integrate]: /ruby/instrumentation/integrating-appsignal.html

[instrumentation]: /ruby/instrumentation/instrumentation.html

[Rails]: /ruby/integrations/rails.html

[Sinatra]: /ruby/integrations/sinatra.html

[Hanami]: /ruby/integrations/hanami.html

[Grape]: /ruby/integrations/grape.html

[Padrino]: /ruby/integrations/padrino.html
