Skip to content

Commit 6c1d069

Browse files
authored
Merge pull request #16078 from getsentry/prepare-release/9.13.0
meta(changelog): Update changelog for 9.13.0
2 parents 37126bf + b839506 commit 6c1d069

File tree

60 files changed

+2253
-445
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2253
-445
lines changed

.github/ISSUE_TEMPLATE/bug.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,17 @@ body:
3232
options:
3333
- '@sentry/browser'
3434
- '@sentry/node'
35+
- '@sentry/node - express'
36+
- '@sentry/node - fastify'
37+
- '@sentry/node - koa'
38+
- '@sentry/node - hapi'
39+
- '@sentry/node - connect'
3540
- '@sentry/angular'
3641
- '@sentry/astro'
3742
- '@sentry/aws-serverless'
3843
- '@sentry/bun'
3944
- '@sentry/cloudflare'
45+
- '@sentry/cloudflare - hono'
4046
- '@sentry/deno'
4147
- '@sentry/ember'
4248
- '@sentry/gatsby'
@@ -45,6 +51,7 @@ body:
4551
- '@sentry/nextjs'
4652
- '@sentry/nuxt'
4753
- '@sentry/react'
54+
- '@sentry/react-router'
4855
- '@sentry/remix'
4956
- '@sentry/solid'
5057
- '@sentry/solidstart'

.github/workflows/issue-package-label.yml

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,76 +30,100 @@ jobs:
3030
map: |
3131
{
3232
"@sentry.angular": {
33-
"label": "Package: angular"
33+
"label": "Angular"
3434
},
3535
"@sentry.astro": {
36-
"label": "Package: astro"
36+
"label": "Astro"
3737
},
3838
"@sentry.aws-serverless": {
39-
"label": "Package: aws-serverless"
39+
"label": "AWS Lambda"
4040
},
4141
"@sentry.browser": {
42-
"label": "Package: browser"
42+
"label": "Browser"
4343
},
4444
"@sentry.bun": {
45-
"label": "Package: bun"
45+
"label": "Bun"
46+
},
47+
"@sentry.cloudflare - hono": {
48+
"label": "Hono"
4649
},
4750
"@sentry.cloudflare": {
48-
"label": "Package: cloudflare"
51+
"label": "Cloudflare Workers"
4952
},
5053
"@sentry.deno": {
51-
"label": "Package: deno"
54+
"label": "Deno"
5255
},
5356
"@sentry.ember": {
54-
"label": "Package: ember"
57+
"label": "Ember"
5558
},
5659
"@sentry.gatsby": {
57-
"label": "Package: gatbsy"
60+
"label": "Gatbsy"
5861
},
5962
"@sentry.google-cloud-serverless": {
60-
"label": "Package: google-cloud-serverless"
63+
"label": "Google Cloud Functions"
6164
},
6265
"@sentry.nestjs": {
63-
"label": "Package: nestjs"
66+
"label": "Nest.js"
6467
},
6568
"@sentry.nextjs": {
66-
"label": "Package: nextjs"
69+
"label": "Next.js"
70+
},
71+
"@sentry.node - express": {
72+
"label": "Express"
73+
},
74+
"@sentry.node - fastify": {
75+
"label": "Fastify"
76+
},
77+
"@sentry.node - koa": {
78+
"label": "Koa"
79+
},
80+
"@sentry.node - hapi": {
81+
"label": "Hapi
82+
},
83+
"@sentry.node - connect": {
84+
"label": "Connect
6785
},
6886
"@sentry.node": {
69-
"label": "Package: node"
87+
"label": "Node.js"
7088
},
7189
"@sentry.nuxt": {
72-
"label": "Package: nuxt"
90+
"label": "Nuxt"
91+
},
92+
"@sentry.react-router": {
93+
"label": "React Router Framework "
7394
},
7495
"@sentry.react": {
75-
"label": "Package: react"
96+
"label": "React"
7697
},
7798
"@sentry.remix": {
78-
"label": "Package: remix"
99+
"label": "Remix"
79100
},
80101
"@sentry.solid": {
81-
"label": "Package: solid"
102+
"label": "Solid"
82103
},
83-
"@sentry.solid": {
84-
"label": "Package: solidstart"
104+
"@sentry.solidstart": {
105+
"label": "SolidStart"
85106
},
86107
"@sentry.sveltekit": {
87-
"label": "Package: sveltekit"
108+
"label": "SvelteKit"
88109
},
89110
"@sentry.svelte": {
90-
"label": "Package: svelte"
111+
"label": "Svelte"
91112
},
92113
"@sentry.vue": {
93-
"label": "Package: vue"
114+
"label": "Vue"
115+
},
116+
"@sentry.tanstackstart-react": {
117+
"label": "Tanstack Start React"
94118
},
95119
"@sentry.wasm": {
96-
"label": "Package: wasm"
120+
"label": "WASM"
97121
},
98122
"Sentry.Browser.Loader": {
99-
"label": "Package-Meta: Loader"
123+
"label": "Browser\nLoader Script"
100124
},
101125
"Sentry.Browser.CDN.bundle": {
102-
"label": "Package-Meta: CDN"
126+
"label": "Browser\nCDN Bundle"
103127
}
104128
}
105129
export_to: output

.size-limit.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ module.exports = [
4040
path: 'packages/browser/build/npm/esm/index.js',
4141
import: createImport('init', 'browserTracingIntegration'),
4242
gzip: true,
43-
limit: '38 KB',
43+
limit: '39 KB',
4444
},
4545
{
4646
name: '@sentry/browser (incl. Tracing, Replay)',

CHANGELOG.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,65 @@
1010

1111
- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott
1212

13+
## 9.13.0
14+
15+
### Important Changes
16+
17+
- **feat(node): Add support for winston logger ([#15983](https://github.com/getsentry/sentry-javascript/pull/15983))**
18+
19+
Sentry is adding support for [structured logging](https://github.com/getsentry/sentry-javascript/discussions/15916). In this release we've added support for sending logs to Sentry via the [winston](https://github.com/winstonjs/winston) logger to the Sentry Node SDK (and SDKs that use the Node SDK under the hood like `@sentry/nestjs`). The Logging APIs in the Sentry SDK are still experimental and subject to change.
20+
21+
```js
22+
const winston = require('winston');
23+
const Transport = require('winston-transport');
24+
25+
const transport = Sentry.createSentryWinstonTransport(Transport);
26+
27+
const logger = winston.createLogger({
28+
transports: [transport],
29+
});
30+
```
31+
32+
- **feat(core): Add `wrapMcpServerWithSentry` to instrument MCP servers from `@modelcontextprotocol/sdk` ([#16032](https://github.com/getsentry/sentry-javascript/pull/16032))**
33+
34+
The Sentry SDK now supports instrumenting MCP servers from the `@modelcontextprotocol/sdk` package. Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package.
35+
36+
```js
37+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
38+
39+
// Create an MCP server
40+
const server = new McpServer({
41+
name: 'Demo',
42+
version: '1.0.0',
43+
});
44+
45+
// Use the instrumented server in your application
46+
const instrumentedServer = Sentry.wrapMcpServerWithSentry(server);
47+
```
48+
49+
- **feat(core): Move console integration into core and add to cloudflare/vercel-edge ([#16024](https://github.com/getsentry/sentry-javascript/pull/16024))**
50+
51+
Console instrumentation has been added to `@sentry/cloudflare` and `@sentry/nextjs` Edge Runtime and is enabled by default. Now calls to the console object will be captured as breadcrumbs for those SDKs.
52+
53+
- **feat(bun): Support new `Bun.serve` APIs ([#16035](https://github.com/getsentry/sentry-javascript/pull/16035))**
54+
55+
Bun `1.2.6` and above have a new `Bun.serve` API, which the Bun SDK now supports. The SDK instruments the new routes object that can be used to define routes for the server.
56+
57+
Thanks to @Jarred-Sumner for helping us get this supported!
58+
59+
### Other Changes
60+
61+
- feat(browser): Warn on duplicate `browserTracingIntegration` ([#16042](https://github.com/getsentry/sentry-javascript/pull/16042))
62+
- feat(core): Allow delayed sending with offline transport ([#15937](https://github.com/getsentry/sentry-javascript/pull/15937))
63+
- feat(deps): Bump @sentry/webpack-plugin from 3.2.4 to 3.3.1 ([#16057](https://github.com/getsentry/sentry-javascript/pull/16057))
64+
- feat(vue): Apply stateTransformer to attachments in Pinia Plugin ([#16034](https://github.com/getsentry/sentry-javascript/pull/16034))
65+
- fix(core): Run `beforeSendLog` after we process log ([#16019](https://github.com/getsentry/sentry-javascript/pull/16019))
66+
- fix(nextjs): Don't show turbopack warning for newer Next.js canaries ([#16065](https://github.com/getsentry/sentry-javascript/pull/16065))
67+
- fix(nextjs): Include patch version 0 for min supported 15.3.0 ([#16026](https://github.com/getsentry/sentry-javascript/pull/16026))
68+
- fix(node): Ensure late init works with all integrations ([#16016](https://github.com/getsentry/sentry-javascript/pull/16016))
69+
- fix(react-router): Pass `unstable_sentryVitePluginOptions` to cli instance ([#16033](https://github.com/getsentry/sentry-javascript/pull/16033))
70+
- fix(serverless-aws): Overwrite root span name with GraphQL if set ([#16010](https://github.com/getsentry/sentry-javascript/pull/16010))
71+
1372
## 9.12.0
1473

1574
### Important Changes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
integrations: [Sentry.browserTracingIntegration(), Sentry.browserTracingIntegration()],
8+
tracesSampleRate: 1,
9+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { expect } from '@playwright/test';
2+
3+
import { sentryTest } from '../../../../utils/fixtures';
4+
import { shouldSkipTracingTest } from '../../../../utils/helpers';
5+
6+
sentryTest('warns if multiple integrations are used', async ({ getLocalTestUrl, page }) => {
7+
if (shouldSkipTracingTest()) {
8+
sentryTest.skip();
9+
}
10+
11+
const msgs: string[] = [];
12+
13+
page.on('console', msg => {
14+
msgs.push(msg.text());
15+
});
16+
17+
const url = await getLocalTestUrl({ testDir: __dirname });
18+
19+
await page.goto(url);
20+
21+
expect(msgs).toEqual(['Multiple browserTracingIntegration instances are not supported.']);
22+
});

dev-packages/node-integration-tests/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"dependencies": {
2828
"@aws-sdk/client-s3": "^3.552.0",
2929
"@hapi/hapi": "^21.3.10",
30-
"@nestjs/common": "10.4.6",
30+
"@nestjs/common": "11.0.16",
3131
"@nestjs/core": "10.4.6",
3232
"@nestjs/platform-express": "10.4.6",
3333
"@sentry/aws-serverless": "9.12.0",
@@ -37,7 +37,7 @@
3737
"@types/mysql": "^2.15.21",
3838
"@types/pg": "^8.6.5",
3939
"ai": "^4.0.6",
40-
"amqplib": "^0.10.4",
40+
"amqplib": "^0.10.7",
4141
"apollo-server": "^3.11.1",
4242
"axios": "^1.7.7",
4343
"body-parser": "^1.20.3",
@@ -67,6 +67,7 @@
6767
"reflect-metadata": "0.2.1",
6868
"rxjs": "^7.8.1",
6969
"tedious": "^18.6.1",
70+
"winston": "^3.17.0",
7071
"yargs": "^16.2.0"
7172
},
7273
"devDependencies": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const { ApolloServer, gql } = require('apollo-server');
2+
const Sentry = require('@sentry/aws-serverless');
3+
4+
module.exports = () => {
5+
return Sentry.startSpan({ name: 'Test Server Start' }, () => {
6+
return new ApolloServer({
7+
typeDefs: gql`
8+
type Query {
9+
hello: String
10+
world: String
11+
}
12+
type Mutation {
13+
login(email: String): String
14+
}
15+
`,
16+
resolvers: {
17+
Query: {
18+
hello: () => {
19+
return 'Hello!';
20+
},
21+
world: () => {
22+
return 'World!';
23+
},
24+
},
25+
Mutation: {
26+
login: async (_, { email }) => {
27+
return `${email}--token`;
28+
},
29+
},
30+
},
31+
introspection: false,
32+
debug: false,
33+
});
34+
});
35+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const { loggingTransport } = require('@sentry-internal/node-integration-tests');
2+
const Sentry = require('@sentry/aws-serverless');
3+
4+
Sentry.init({
5+
dsn: 'https://[email protected]/1337',
6+
tracesSampleRate: 1.0,
7+
integrations: [Sentry.graphqlIntegration({ useOperationNameForRootSpan: true })],
8+
transport: loggingTransport,
9+
});
10+
11+
async function run() {
12+
const apolloServer = require('./apollo-server')();
13+
14+
await Sentry.startSpan({ name: 'Test Transaction' }, async span => {
15+
// Ref: https://www.apollographql.com/docs/apollo-server/testing/testing/#testing-using-executeoperation
16+
await apolloServer.executeOperation({
17+
query: 'query GetHello {hello}',
18+
});
19+
20+
setTimeout(() => {
21+
span.end();
22+
apolloServer.stop();
23+
}, 500);
24+
});
25+
}
26+
27+
run();
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { afterAll, describe, expect, test } from 'vitest';
2+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
3+
4+
const EXPECTED_TRANSCATION = {
5+
transaction: 'Test Transaction (query GetHello)',
6+
spans: expect.arrayContaining([
7+
expect.objectContaining({
8+
description: 'query GetHello',
9+
origin: 'auto.graphql.otel.graphql',
10+
status: 'ok',
11+
}),
12+
]),
13+
};
14+
15+
describe('graphqlIntegration', () => {
16+
afterAll(() => {
17+
cleanupChildProcesses();
18+
});
19+
20+
test('should use GraphQL operation name for root span if useOperationNameForRootSpan is set', async () => {
21+
await createRunner(__dirname, 'scenario.js')
22+
.ignore('event')
23+
.expect({ transaction: { transaction: 'Test Server Start (query IntrospectionQuery)' } })
24+
.expect({ transaction: EXPECTED_TRANSCATION })
25+
.start()
26+
.completed();
27+
});
28+
});

0 commit comments

Comments
 (0)