Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5c7110d
Update GH issue templates for Linear compatibility
stephanie-anderson Apr 29, 2025
a67ebc4
ref(core): Switch to standardized log envelope (#16133)
AbhiPrasad Apr 29, 2025
2130d35
Merge pull request #16163 from getsentry/master
github-actions[bot] Apr 30, 2025
2e164e1
test(node): Add utility to test esm & cjs instrumentation (#16159)
mydea Apr 30, 2025
13b202f
Merge branch 'develop' into issue-templates
stephanie-anderson Apr 30, 2025
20400d8
Change to single quotes
stephanie-anderson Apr 30, 2025
2f2b66b
Merge pull request #16164 from getsentry/issue-templates
stephanie-anderson Apr 30, 2025
b7c095b
test(node): Remove `axios` in favor of using `fetch` (#16172)
mydea Apr 30, 2025
de2f4b5
feat(vercel-edge): Add logs export (#16166)
AbhiPrasad Apr 30, 2025
b94062f
fix(feedback): Prevent `removeFromDom()` from throwing (#16030)
ryan953 May 1, 2025
7c50cd4
feat(cloudflare): Add support for durable objects (#16180)
AbhiPrasad May 1, 2025
eb49552
fix(node): Use class constructor in docstring for winston transport (…
AbhiPrasad May 2, 2025
4d46e53
docs(pii): Add comments about conditionals around sending PII data (#…
s1gr1d May 5, 2025
640b57f
feat(react-router): Add client-side router instrumentation (#16185)
chargome May 5, 2025
69224b8
fix(core): Respect manually set sentry tracing headers in fetch calls…
Lms24 May 5, 2025
0335cf7
fix(browser): Respect manually set sentry tracing headers in XHR requ…
Lms24 May 5, 2025
2e41f5e
fix(node): Avoid double-wrapping http module (#16177)
mydea May 5, 2025
1e0894c
feat(browser): Add option to sample linked traces consistently (#16037)
Lms24 May 5, 2025
f0e5e2f
feat(cloudflare): Add logs exports (#16165)
AbhiPrasad May 5, 2025
0c983b3
feat(node): Add Prisma integration by default (#16073)
May 5, 2025
229fe5f
feat: Create a Vite plugin that injects sentryConfig into the global …
RulaKhaled May 5, 2025
5c01344
Fix lint issue and tests
RulaKhaled May 5, 2025
a04f3cc
Merge pull request #16197 from getsentry/rola/config-injector
RulaKhaled May 6, 2025
38316fd
test(node): Update express integration tests (#16204)
mydea May 6, 2025
b74f300
fix(node): Fix vercel flushing logic & add test for it (#16208)
mydea May 6, 2025
e0c0d9d
fix(node): Fix 404 route handling in express 5 (#16211)
mydea May 7, 2025
3a81041
feat(node): Drop `http.server` spans with 404 status by default (#16205)
mydea May 7, 2025
a49c946
fix(logs): Ensure logs can be flushed correctly (#16216)
andreiborza May 7, 2025
caa1316
feat(cloudflare): Read `SENTRY_RELEASE` from `env` (#16201)
Lms24 May 7, 2025
35abfe9
meta(changelog): Update changelog for 9.16.0
RulaKhaled May 6, 2025
9c52994
lint the md file
RulaKhaled May 6, 2025
06dff1a
Update CHANGELOG.md
RulaKhaled May 6, 2025
2687d26
Update changelog to latest develop
RulaKhaled May 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test(node): Update express integration tests (#16204)
This updates naming etc. for express (v5) tests, and makes sure that we
test this in esm & cjs in a basic way.
It also adds test for handling of the root route (`/`) as well as 404,
where current failures are shown (see
#16203).
  • Loading branch information
mydea authored May 6, 2025
commit 38316fd3bff2a3079db61042021ecb055e40caf8
2 changes: 1 addition & 1 deletion .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ module.exports = [
path: 'packages/browser/build/npm/esm/index.js',
import: createImport('init', 'browserTracingIntegration', 'replayIntegration', 'replayCanvasIntegration'),
gzip: true,
limit: '81 KB',
limit: '82 KB',
},
{
name: '@sentry/browser (incl. Tracing, Replay, Feedback)',
Expand Down
5 changes: 4 additions & 1 deletion dev-packages/node-integration-tests/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ export function loggingTransport(_options: BaseTransportOptions): Transport {
* Setting this port to something specific is useful for local debugging but dangerous for
* CI/CD environments where port collisions can cause flakes!
*/
export function startExpressServerAndSendPortToRunner(app: Express, port: number | undefined = undefined): void {
export function startExpressServerAndSendPortToRunner(
app: Pick<Express, 'listen'>,
port: number | undefined = undefined,
): void {
const server = app.listen(port || 0, () => {
const address = server.address() as AddressInfo;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import * as Sentry from '@sentry/node';
import { loggingTransport } from '@sentry-internal/node-integration-tests';

Sentry.init({
dsn: 'https://public@dsn.ingest.sentry.io/1337',
release: '1.0',
// disable attaching headers to /test/* endpoints
tracePropagationTargets: [/^(?!.*test).*$/],
tracesSampleRate: 1.0,
transport: loggingTransport,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import * as Sentry from '@sentry/node';
import { startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
import bodyParser from 'body-parser';
import cors from 'cors';
import express from 'express';

const app = express();

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.text());
app.use(bodyParser.raw());

app.get('/', (_req, res) => {
res.send({ response: 'response 0' });
});

app.get('/test/express', (_req, res) => {
res.send({ response: 'response 1' });
});

app.get(/\/test\/regex/, (_req, res) => {
res.send({ response: 'response 2' });
});

app.get(['/test/array1', /\/test\/array[2-9]/], (_req, res) => {
res.send({ response: 'response 3' });
});

app.get(['/test/arr/:id', /\/test\/arr[0-9]*\/required(path)?(\/optionalPath)?\/(lastParam)?/], (_req, res) => {
res.send({ response: 'response 4' });
});

app.post('/test-post', function (req, res) {
res.send({ status: 'ok', body: req.body });
});

Sentry.setupExpressErrorHandler(app);

startExpressServerAndSendPortToRunner(app);
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { afterAll, describe, expect, test } from 'vitest';
import { cleanupChildProcesses, createRunner } from '../../../utils/runner';
import { afterAll, describe, expect } from 'vitest';
import { cleanupChildProcesses, createEsmAndCjsTests } from '../../../utils/runner';

describe('express tracing', () => {
describe('express v5 tracing', () => {
afterAll(() => {
cleanupChildProcesses();
});

describe('CJS', () => {
createEsmAndCjsTests(__dirname, 'scenario.mjs', 'instrument.mjs', (createRunner, test) => {
test('should create and send transactions for Express routes and spans for middlewares.', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
contexts: {
Expand Down Expand Up @@ -51,7 +51,7 @@ describe('express tracing', () => {
});

test('should set a correct transaction name for routes specified in RegEx', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
transaction: 'GET /\\/test\\/regex/',
Expand All @@ -77,10 +77,52 @@ describe('express tracing', () => {
await runner.completed();
});

test('handles root page correctly', async () => {
const runner = createRunner()
.expect({
transaction: {
transaction: 'GET /',
},
})
.start();
runner.makeRequest('get', '/');
await runner.completed();
});

test('handles 404 page correctly', async () => {
const runner = createRunner()
.expect({
transaction: {
// FIXME: This is wrong :(
transaction: 'GET /',
contexts: {
trace: {
span_id: expect.stringMatching(/[a-f0-9]{16}/),
trace_id: expect.stringMatching(/[a-f0-9]{32}/),
data: {
'http.response.status_code': 404,
url: expect.stringMatching(/\/does-not-exist$/),
'http.method': 'GET',
// FIXME: This is wrong :(
'http.route': '/',
'http.url': expect.stringMatching(/\/does-not-exist$/),
'http.target': '/does-not-exist',
},
op: 'http.server',
status: 'not_found',
},
},
},
})
.start();
runner.makeRequest('get', '/does-not-exist', { expectError: true });
await runner.completed();
});

test.each([['array1'], ['array5']])(
'should set a correct transaction name for routes consisting of arrays of routes for %p',
async (segment: string) => {
const runner = await createRunner(__dirname, 'server.js')
const runner = await createRunner()
.expect({
transaction: {
transaction: 'GET /test/array1,/\\/test\\/array[2-9]/',
Expand Down Expand Up @@ -115,7 +157,7 @@ describe('express tracing', () => {
['arr/required/lastParam'],
['arr55/required/lastParam'],
])('should handle more complex regexes in route arrays correctly for %p', async (segment: string) => {
const runner = await createRunner(__dirname, 'server.js')
const runner = await createRunner()
.expect({
transaction: {
transaction: 'GET /test/arr/:id,/\\/test\\/arr[0-9]*\\/required(path)?(\\/optionalPath)?\\/(lastParam)?/',
Expand Down Expand Up @@ -143,7 +185,7 @@ describe('express tracing', () => {

describe('request data', () => {
test('correctly captures JSON request data', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
transaction: 'POST /test-post',
Expand Down Expand Up @@ -173,7 +215,7 @@ describe('express tracing', () => {
});

test('correctly captures plain text request data', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
transaction: 'POST /test-post',
Expand All @@ -198,7 +240,7 @@ describe('express tracing', () => {
});

test('correctly captures text buffer request data', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
transaction: 'POST /test-post',
Expand All @@ -223,7 +265,7 @@ describe('express tracing', () => {
});

test('correctly captures non-text buffer request data', async () => {
const runner = createRunner(__dirname, 'server.js')
const runner = createRunner()
.expect({
transaction: {
transaction: 'POST /test-post',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/node';
import { afterAll, describe, expect, test } from 'vitest';
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';

describe('express tracing', () => {
describe('express v5 tracing', () => {
afterAll(() => {
cleanupChildProcesses();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { afterAll, describe, test } from 'vitest';
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';

describe('express tracing experimental', () => {
describe('express v5 tracing', () => {
afterAll(() => {
cleanupChildProcesses();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "../tsconfig.json"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import * as Sentry from '@sentry/node';
import { loggingTransport } from '@sentry-internal/node-integration-tests';

Sentry.init({
dsn: 'https://public@dsn.ingest.sentry.io/1337',
release: '1.0',
// disable attaching headers to /test/* endpoints
tracePropagationTargets: [/^(?!.*test).*$/],
tracesSampleRate: 1.0,
transport: loggingTransport,
integrations: [
Sentry.httpIntegration({
ignoreIncomingRequestBody: url => {
if (url.includes('/test-post-ignore-body')) {
return true;
}
return false;
},
}),
],
});
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
const { loggingTransport } = require('@sentry-internal/node-integration-tests');
const Sentry = require('@sentry/node');

Sentry.init({
dsn: 'https://public@dsn.ingest.sentry.io/1337',
release: '1.0',
// disable attaching headers to /test/* endpoints
tracePropagationTargets: [/^(?!.*test).*$/],
tracesSampleRate: 1.0,
transport: loggingTransport,
});

// express must be required after Sentry is initialized
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const { startExpressServerAndSendPortToRunner } = require('@sentry-internal/node-integration-tests');
import * as Sentry from '@sentry/node';
import { startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
import bodyParser from 'body-parser';
import cors from 'cors';
import express from 'express';

const app = express();

Expand All @@ -23,6 +11,10 @@ app.use(bodyParser.json());
app.use(bodyParser.text());
app.use(bodyParser.raw());

app.get('/', (_req, res) => {
res.send({ response: 'response 0' });
});

app.get('/test/express', (_req, res) => {
res.send({ response: 'response 1' });
});
Expand All @@ -43,6 +35,10 @@ app.post('/test-post', function (req, res) {
res.send({ status: 'ok', body: req.body });
});

app.post('/test-post-ignore-body', function (req, res) {
res.send({ status: 'ok', body: req.body });
});

Sentry.setupExpressErrorHandler(app);

startExpressServerAndSendPortToRunner(app);

This file was deleted.

Loading
Loading