• /
  • EnglishEspañol日本語한국어Português
  • EntrarComeçar agora

Esta tradução de máquina é fornecida para sua comodidade.

Caso haja alguma divergência entre a versão em inglês e a traduzida, a versão em inglês prevalece. Acesse esta página para mais informações.

Criar um problema

Use o Amazon SQS para fila de mensagens

O agente Java suporta instrumentação para fila de mensagens AWS SQS. Embora nossa instrumentação SQS gere rastreamento do broker de mensagens, você pode querer informações adicionais sobre o uso do SQS SDK.

Para ver todas as bibliotecas SQS suportadas, consulte a página de requisitos e compatibilidadeJava .

Exibir rastreamento distribuído SQS

A instrumentação AWS SQS SDK inclui automaticamente cabeçalhos distributed trace como atributo de mensagem para mensagens SQS. Esta funcionalidade está disponível a partir da versão 2.1.0. Entretanto, para operações de recebimento de mensagens, não há um método integrado para processar esses cabeçalhos. Sugerimos que você implemente instrumentação personalizada para ler os cabeçalhos distributed trace .

Aqui está um exemplo de como ler os cabeçalhos distributed trace de uma mensagem SQS usando o V2 SDK:

// This method will call the SDK to receive messages and then process them
public void readMessages(SqsClient sqsClient, String queueUrl) {
List<Message> msgs = receiveMessages(queueUrl);
for (Message msg : msgs) {
handleMessage(msg);
}
}
// Since calling the SDK to recieve messages is a batch call, it is not recommended to accept distributed trace headers
// in the same transaction as the SDK call. Distributed traces can only have one parent span.
@Trace(dispatcher = true, metricName = "v2/receiveMessages")
public List<Message> receiveMessages(SqsClient sqsClient, String queueUrl) {
ReceiveMessageRequest request = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(10)
.build();
List<Message> messages = sqsClient.receiveMessage(request).messages();
if (messages.isEmpty()) {
logger.info("[v2 API] No messages received");
}
return messages;
}
// Here we accept distributed trace headers in a seperate transaction from the SDK call.
@Trace(dispatcher = true, metricName = "v2/handleMessage")
public void handleMessage(Message msg, SqsClient sqsClient, String queueUrl) {
// We use a wrapper class that helps extract the distributed trace headers
SQSReceivedMessageHeaders headers = new SQSReceivedMessageHeaders(msg);
// Here we accept the distributed trace headers
NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers);
// Process your message here
DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder()
.queueUrl(queueUrl)
.receiptHandle(msg.receiptHandle())
.build();
sqsClient.deleteMessage(deleteMessageRequest);
}

Aqui está a classe wrapper SQSReceivedMessageHeaders que extrai os cabeçalhos distributed trace da mensagem SQS:

import com.newrelic.api.agent.HeaderType;
import com.newrelic.api.agent.Headers;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.MessageAttributeValue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class SQSReceivedMessageHeaders implements Headers {
private Message message = null;
public SQSReceivedMessageHeaders(Message msg) {
message = msg;
}
@Override
public HeaderType getHeaderType() {
return HeaderType.MESSAGE;
}
@Override
public String getHeader(String name) {
String value = null;
Map<String, MessageAttributeValue> msgAttributes = message.messageAttributes();
MessageAttributeValue msgAttributeValue = msgAttributes.get(name);
if(msgAttributeValue != null) {
if(msgAttributeValue.dataType().equalsIgnoreCase("string")) {
value = msgAttributeValue.stringValue();
}
}
return value;
}
@Override
public Collection<String> getHeaders(String name) {
List<String> list = new ArrayList<String>();
String value = getHeader(name);
if(value != null && !value.isEmpty()) {
list.add(value);
}
return list;
}
@Override
public void setHeader(String name, String value) {
// Not supported
}
@Override
public void addHeader(String name, String value) {
// Not supported
}
@Override
public Collection<String> getHeaderNames() {
if(message != null) {
Map<String, MessageAttributeValue> attributes = message.messageAttributes();
if(attributes != null) return attributes.keySet();
}
return Collections.emptyList();
}
@Override
public boolean containsHeader(String name) {
return getHeaderNames().contains(name);
}
}
Copyright © 2025 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.