Skip to content

Commit 830c6b1

Browse files
committed
refactor: only instrument user-defined storage
1 parent a0eddae commit 830c6b1

File tree

4 files changed

+45
-7
lines changed

4 files changed

+45
-7
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useNuxt } from '@nuxt/kit';
2+
import type { NuxtTemplate } from 'nuxt/schema';
3+
4+
/**
5+
* Adds a virtual file that can be used within the Nuxt Nitro server build.
6+
* Available in NuxtKit v4, so we are porting it here.
7+
* https://github.com/nuxt/nuxt/blob/d6df732eec1a3bd442bdb325b0335beb7e10cd64/packages/kit/src/template.ts#L55-L62
8+
*/
9+
export function addServerTemplate(template: NuxtTemplate): NuxtTemplate {
10+
const nuxt = useNuxt();
11+
if (template.filename) {
12+
nuxt.options.nitro.virtual ||= {};
13+
nuxt.options.nitro.virtual[template.filename] = template.getContents;
14+
}
15+
16+
return template;
17+
}

packages/nuxt/src/module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type { SentryNuxtModuleOptions } from './common/types';
1212
import { addDynamicImportEntryFileWrapper, addSentryTopImport, addServerConfigToBuild } from './vite/addServerConfig';
1313
import { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';
1414
import { setupSourceMaps } from './vite/sourceMaps';
15+
import { addStorageInstrumentation } from './vite/storageConfig';
1516
import { addOTelCommonJSImportAlias, findDefaultSdkInitFile } from './vite/utils';
1617

1718
export type ModuleOptions = SentryNuxtModuleOptions;
@@ -90,7 +91,6 @@ export default defineNuxtModule<ModuleOptions>({
9091

9192
if (serverConfigFile) {
9293
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));
93-
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/storage.server'));
9494

9595
addPlugin({
9696
src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'),
@@ -127,6 +127,7 @@ export default defineNuxtModule<ModuleOptions>({
127127
// Preps the the middleware instrumentation module.
128128
if (serverConfigFile) {
129129
addMiddlewareImports();
130+
addStorageInstrumentation(nuxt);
130131
}
131132

132133
nuxt.hooks.hook('nitro:init', nitro => {

packages/nuxt/src/runtime/plugins/storage.server.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,25 @@ import {
1313
// eslint-disable-next-line import/no-extraneous-dependencies
1414
import { defineNitroPlugin, useStorage } from 'nitropack/runtime';
1515
import type { Driver } from 'unstorage';
16+
// @ts-expect-error - This is a virtual module
17+
import { userStorageMounts } from '#sentry/storage-config.mjs';
1618

1719
/**
1820
* Creates a Nitro plugin that instruments the storage driver.
1921
*/
2022
export default defineNitroPlugin(async _nitroApp => {
2123
// This runs at runtime when the Nitro server starts
2224
const storage = useStorage();
23-
24-
// exclude mounts that are not relevant for instrumentation for a few reasons:
25-
// Nitro mounts some development-only mount points that are not relevant for instrumentation
26-
// https://nitro.build/guide/storage#development-only-mount-points
27-
const excludeMounts = new Set(['build:', 'cache:', 'root:', 'data:', 'src:', 'assets:']);
25+
// Mounts are suffixed with a colon, so we need to add it to the set items
26+
const userMounts = new Set((userStorageMounts as string[]).map(m => `${m}:`));
2827

2928
debug.log('[Storage Instrumentation] Starting to instrument storage drivers...');
3029

3130
// Get all mounted storage drivers
3231
const mounts = storage.getMounts();
3332
for (const mount of mounts) {
3433
// Skip excluded mounts and root mount
35-
if (!mount.base || excludeMounts.has(mount.base)) {
34+
if (!userMounts.has(mount.base)) {
3635
continue;
3736
}
3837

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { addServerPlugin, createResolver } from '@nuxt/kit';
2+
import type { Nuxt } from 'nuxt/schema';
3+
import { addServerTemplate } from '../common/server-template';
4+
5+
/**
6+
* Prepares the storage config export to be used in the runtime storage instrumentation.
7+
*/
8+
export function addStorageInstrumentation(nuxt: Nuxt): void {
9+
const moduleDirResolver = createResolver(import.meta.url);
10+
const userStorageMounts = Object.keys(nuxt.options.nitro.storage || {});
11+
12+
// Create a virtual module to pass this data to runtime
13+
addServerTemplate({
14+
filename: '#sentry/storage-config.mjs',
15+
getContents: () => {
16+
return `export const userStorageMounts = ${JSON.stringify(userStorageMounts)};`;
17+
},
18+
});
19+
20+
addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/storage.server'));
21+
}

0 commit comments

Comments
 (0)