fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(bun): Ensure instrumentation of Bun.serve survives a server reload - #15148

Merged
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload
Jan 24, 2025
Merged

fix(bun): Ensure instrumentation of Bun.serve survives a server reload#15148
AbhiPrasad merged 1 commit into
getsentry:developfrom
nathankleyn:15144-fix-bun-instrumentation-disappearing-after-reload

Conversation

@nathankleyn

Copy link
Copy Markdown
Contributor

If #reload is called on an instance of Bun.serve, the Sentry intrumentation doesn't surive. This is because the Bun instrumentation works by using Proxy on the call to Bun.serve, which isn't called for a reload.

We can't wrap the serve created by calling Bun.serve with a Proxy as Bun seems to do some internal checks using instanceof which break if the instance is now reporting itself as a ProxyObject.

This fixes#15144.

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

// Fun fact: Bun = 2 21 14 :)
const DEFAULT_PORT = 22114;

describe('Bun Serve Integration', () => {

@nathankleynnathankleynJan 23, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discovered that none of the tests in this file were actually working — all of the client.on('spanEnd', ...) were never being called and since all the expects were inside of them nothing failed.

I have restructured the tests to make sure that if the events ever stop firing again in the future, the tests will fail, then fixed all the tests.

describe('Bun Serve Integration', () => {
let client: BunClient;
// Fun fact: Bun = 2 21 14 :)
let port: number = 22114;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't reuse the port on each start since server.stop happens in the background and tests end up using each other's servers.

Comment on lines +6 to +9
const initOptions = {
dsn: 'https://00000000000000000000000000000000@o000000.ingest.sentry.io/0000000',
tracesSampleRate: 1,
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the SDK initialised in here is effecting the SDK being used by bunserver.test.ts above. I am not familiar enough with the Sentry codebase to know how to properly reset after these tests but for sure something is missing here as the tests are not properly isolated.

I've had to add tracesSampleRate: 1 for now to ensure that the SDK being reused doesn't totally break the other tests which depend on tracing happening for every single call.

@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 16b41ad to 8fb5c8fCompareJanuary 23, 2025 14:23
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
This fixesgetsentry#15144.
@nathankleyn
nathankleynforce-pushed the 15144-fix-bun-instrumentation-disappearing-after-reload branch from 8fb5c8f to f946c81CompareJanuary 23, 2025 14:24
@AbhiPrasad

Copy link
Copy Markdown
Contributor

Hey @nathankleyn thanks for the PR! Assigning myself so that I can help get this merged in.

@AbhiPrasad
AbhiPrasad self-requested a review January 23, 2025 18:12
@AbhiPrasadAbhiPrasad self-assigned this Jan 23, 2025
@AbhiPrasadAbhiPrasad changed the title Ensure instrumentation of Bun.serve survives a server reloadfix(bun): Ensure instrumentation of Bun.serve survives a server reloadJan 23, 2025
@AbhiPrasadAbhiPrasad removed their assignment Jan 23, 2025
@AbhiPrasad
AbhiPrasad merged commit 8e37842 into getsentry:developJan 24, 2025
AbhiPrasad pushed a commit that referenced this pull request Jan 24, 2025
…oad (#15148)
If `#reload` is called on an instance of `Bun.serve`, the Sentry
intrumentation doesn't surive. This is because the Bun instrumentation
works by using `Proxy` on the call to `Bun.serve`, which isn't called
for a reload.
We can't wrap the serve created by calling `Bun.serve` with a `Proxy` as
Bun seems to do some internal checks using `instanceof` which break if
the instance is now reporting itself as a `ProxyObject`.
AbhiPrasad added a commit that referenced this pull request Jan 24, 2025
This PR adds the external contributor to the CHANGELOG.md file, so that
they are credited for their contribution. See #15148
---------
Co-authored-by: AbhiPrasad <18689448+AbhiPrasad@users.noreply.github.com>
Co-authored-by: Abhijeet Prasad <aprasad@sentry.io>
@nathankleyn
nathankleyn deleted the 15144-fix-bun-instrumentation-disappearing-after-reload branch January 29, 2025 13:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bun instrumentation stops working if reload is called on the server

2 participants

@nathankleyn@AbhiPrasad