• /
  • EnglishEspañol日本語한국어Português
  • 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 이 페이지를 방문하시기 바랍니다.

문제 신고

메시지 대기열에 Amazon SQS 사용

잔류 에이전트는 AWS SQS 위치에 대한 리소스를 지원합니다. SQS 측정, 계측가 메시지 브로커 트레이스를 생성하는 동안, SQS SDK 사용에 대한 추가 정보가 필요할 수 있습니다.

지원되는 모든 SQS 라이브러리를 보려면 오른쪽 호환성 및 요구 사항 페이지 를 참조하세요.

SQS 분산 추적 보기

AWS SQS SDK 측정, 트랜잭션은 SQS 메시지에 대한 메시지 속성으로 수신 트레이스 헤더를 자동으로 포함합니다. 이 기능은 2.1.0 버전부터 사용할 수 있습니다. 그러나 메시지 수신자 작업의 경우 이러한 헤더를 처리하는 기본 제공 메서드가 없습니다. 사용자 정의 추적 헤더를 읽으려면 사용자 정의 측정을 구현하는 것이 좋습니다.

다음은 V2 SDK를 사용하여 SQS 메시지에서 통합 트레이스 헤더를 읽는 방법의 예입니다.

// 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);
}

SQS 메시지에서 분산 트레이스 헤더를 추출하는 래퍼 클래스 SQSReceivedMessageHeaders 은 다음과 같습니다.

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.