From 9d31aa057e4407596c143b8fd42505dc3905251d Mon Sep 17 00:00:00 2001
From: Pierre-Yves Bigourdan <10694593+PyvesB@users.noreply.github.com>
Date: Tue, 9 Jul 2024 17:57:22 +0200
Subject: [PATCH] Add CF-Ray header value to Sentry errors if available
 (#10339)

---
 core/base-service/check-error-response.js      | 14 +++++++++++++-
 core/base-service/check-error-response.spec.js |  6 +++++-
 core/server/log.js                             |  6 ++++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/core/base-service/check-error-response.js b/core/base-service/check-error-response.js
index bc0d0a1ae1..beceeecc7b 100644
--- a/core/base-service/check-error-response.js
+++ b/core/base-service/check-error-response.js
@@ -6,6 +6,8 @@ const defaultErrorMessages = {
   429: 'rate limited by upstream service',
 }
 
+const headersToInclude = ['cf-ray']
+
 export default function checkErrorResponse(httpErrors = {}, logErrors = [429]) {
   return async function ({ buffer, res }) {
     let error
@@ -28,7 +30,17 @@ export default function checkErrorResponse(httpErrors = {}, logErrors = [429]) {
     }
 
     if (logErrors.includes(res.statusCode)) {
-      log.error(new Error(`${res.statusCode} calling ${res.requestUrl.origin}`))
+      const tags = {}
+      for (const headerKey of headersToInclude) {
+        const headerValue = res.headers[headerKey]
+        if (headerValue) {
+          tags[`header-${headerKey}`] = headerValue
+        }
+      }
+      log.error(
+        new Error(`${res.statusCode} calling ${res.requestUrl.origin}`),
+        tags,
+      )
     }
 
     if (error) {
diff --git a/core/base-service/check-error-response.spec.js b/core/base-service/check-error-response.spec.js
index 411008dfd6..d5479d8b59 100644
--- a/core/base-service/check-error-response.spec.js
+++ b/core/base-service/check-error-response.spec.js
@@ -47,7 +47,11 @@ describe('async error handler', function () {
 
   context('when status is 429', function () {
     const buffer = Buffer.from('some stuff')
-    const res = { statusCode: 429, requestUrl: new URL('https://example.com/') }
+    const res = {
+      statusCode: 429,
+      headers: { 'some-key': 'some-value' },
+      requestUrl: new URL('https://example.com/'),
+    }
 
     it('throws InvalidResponse', async function () {
       try {
diff --git a/core/server/log.js b/core/server/log.js
index d571863ad7..268bffdfa2 100644
--- a/core/server/log.js
+++ b/core/server/log.js
@@ -28,10 +28,12 @@ const log = (...msg) => {
   console.log(d, ...msg)
 }
 
-const error = err => {
+const error = (err, tags) => {
   const d = date()
   listeners.forEach(f => f(d, err))
-  Sentry.captureException(err)
+  Sentry.captureException(err, {
+    tags,
+  })
   console.error(d, err)
 }
 
-- 
GitLab