UNPKG

@sentry/nextjs

Version:
81 lines (78 loc) 3.03 kB
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