@sentry/nextjs
Version:
Official Sentry SDK for Next.js
81 lines (78 loc) • 3.03 kB
JavaScript
import { URL_FULL } from '@sentry/conventions/attributes';
import { spanToJSON, getIsolationScope } from '@sentry/core';
const ATTR_MESSAGING_SYSTEM = "messaging.system";
const ATTR_MESSAGING_DESTINATION_NAME = "messaging.destination.name";
const ATTR_MESSAGING_MESSAGE_ID = "messaging.message.id";
const ATTR_MESSAGING_OPERATION_NAME = "messaging.operation.name";
const ATTR_MESSAGING_CONSUMER_GROUP_NAME = "messaging.consumer.group.name";
const ATTR_MESSAGING_MESSAGE_DELIVERY_COUNT = "messaging.message.delivery_count";
const ATTR_SENTRY_QUEUE_ENRICHED = "sentry.queue.enriched";
function maybeEnrichQueueConsumerSpan(span) {
const headers = getIsolationScope().getScopeData().sdkProcessingMetadata?.normalizedRequest?.headers;
if (!headers) {
return;
}
const ceType = Array.isArray(headers["ce-type"]) ? headers["ce-type"][0] : headers["ce-type"];
if (ceType !== "com.vercel.queue.v2beta") {
return;
}
const queueName = getHeader(headers, "ce-vqsqueuename");
const messageId = getHeader(headers, "ce-vqsmessageid");
const consumerGroup = getHeader(headers, "ce-vqsconsumergroup");
const deliveryCount = getHeader(headers, "ce-vqsdeliverycount");
span.setAttribute(ATTR_MESSAGING_SYSTEM, "vercel.queue");
span.setAttribute(ATTR_MESSAGING_OPERATION_NAME, "process");
if (queueName) {
span.setAttribute(ATTR_MESSAGING_DESTINATION_NAME, queueName);
}
if (messageId) {
span.setAttribute(ATTR_MESSAGING_MESSAGE_ID, messageId);
}
if (consumerGroup) {
span.setAttribute(ATTR_MESSAGING_CONSUMER_GROUP_NAME, consumerGroup);
}
if (deliveryCount) {
const count = parseInt(deliveryCount, 10);
if (!isNaN(count)) {
span.setAttribute(ATTR_MESSAGING_MESSAGE_DELIVERY_COUNT, count);
}
}
span.setAttribute(ATTR_SENTRY_QUEUE_ENRICHED, true);
}
function maybeEnrichQueueProducerSpan(span) {
const spanData = spanToJSON(span).data;
const urlFull = spanData?.[URL_FULL];
if (!urlFull) {
return;
}
let parsed;
try {
parsed = new URL(urlFull);
} catch {
return;
}
if (parsed.hostname !== "vercel-queue.com" && !parsed.hostname.endsWith(".vercel-queue.com")) {
return;
}
const topicMatch = parsed.pathname.match(/^\/api\/v3\/topic\/([^/]+)/);
if (!topicMatch) {
return;
}
const topic = decodeURIComponent(topicMatch[1]);
span.setAttribute(ATTR_MESSAGING_SYSTEM, "vercel.queue");
span.setAttribute(ATTR_MESSAGING_DESTINATION_NAME, topic);
span.setAttribute(ATTR_MESSAGING_OPERATION_NAME, "send");
span.setAttribute(ATTR_SENTRY_QUEUE_ENRICHED, true);
}
function maybeCleanupQueueSpan(span) {
const spanData = spanToJSON(span).data;
if (spanData?.[ATTR_SENTRY_QUEUE_ENRICHED]) {
span.setAttribute(ATTR_SENTRY_QUEUE_ENRICHED, void 0);
}
}
function getHeader(headers, name) {
const value = headers[name];
return Array.isArray(value) ? value[0] : value;
}
export { maybeCleanupQueueSpan, maybeEnrichQueueConsumerSpan, maybeEnrichQueueProducerSpan };
//# sourceMappingURL=vercelQueuesMonitoring.js.map