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

# amqplib

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 Node.js", version: "3.4.2" }
]}
/>

O Advanced Message Queuing Protocol (AMQP) é um protocolo padrão aberto que facilita a interoperabilidade de mensagens entre sistemas, independentemente do fornecedor ou plataforma de message broker utilizada, por exemplo, entre brokers STOMP e MQTT.

A integração do AppSignal para Node.js com [amqplib](https://www.npmjs.com/package/amqplib) e pacotes compatíveis, como [Rascal](https://www.npmjs.com/package/rascal), permite instrumentar o envio e o recebimento de mensagens na sua aplicação.

## Instalação

O pacote amqplib é instrumentado automaticamente pelo pacote AppSignal para Node.js.

## Recursos

Ao usar a integração amqplib, o AppSignal criará um span filho para cada mensagem que for enviada ou recebida.

Observe que, se as mensagens forem recebidas/enviadas fora de um contexto instrumentado, como uma requisição web ou um job em background, é necessário criar manualmente um span para envolver o processamento da mensagem.

Abaixo está um exemplo para Rascal usando o exemplo mais simples encontrado em seu repositório, com instrumentação manual adicionada para envolver o processamento da mensagem em um span.

<CodeGroup>
  ```javascript Node.js theme={null}
  let Rascal = require("../..");
  let config = require("./config");
  const trace = require("@opentelemetry/api");
  const tracer = trace.getTracer("example-tracer");

  Rascal.Broker.create(Rascal.withDefaultConfig(config), function (err, broker) {
    if (err) throw err;

    broker.subscribe("demo_sub", function (err, subscription) {
      if (err) throw err;
      subscription.on("message", function (message, content, ackOrNack) {
        tracer.startActiveSpan("received message demo_sub", (span) => {
          // Process the message
          ackOrNack();
          span.end();
        });
      });
    });
    broker.on("error", console.error);

    setInterval(function () {
      broker.publish(
        "demo_pub",
        new Date().toISOString() + ": hello world",
        function (err, publication) {
          tracer.startActiveSpan("sent message demo_pub", (span) => {
            if (err) throw err;
            span.end();
          });
        }
      );
    }, 1000);
  });
  ```
</CodeGroup>

Para mais informações sobre instrumentação manual, consulte o [guia de instrumentação personalizada](/nodejs/3.x/instrumentation/instrumentation).
