getsentry/sentry-javascript

JavaScript heap out of memory

foodiecompany opened this issue · 6 comments

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/nextjs

SDK Version

7.117.0

Framework Version

@sentry/nextjs

Link to Sentry event

No response

SDK Setup

Sentry.init({
  enabled,

  environment: IS_PRODUCTION ? "production" : "development",

  dsn: "",

  // Adjust this value in production, or use tracesSampler for greater control
  tracesSampleRate: 1,

  // Setting this option to true will print useful information to the console while you're setting up Sentry.
  debug: false,

  replaysOnErrorSampleRate: 1.0,

  // This sets the sample rate to be 10%. You may want this to be 100% while
  // in development and sample at a lower rate in production
  replaysSessionSampleRate: 0.1,

  // You can remove this option if you're not planning to use the Sentry Session Replay feature:
  integrations: [
    Sentry.replayIntegration({
      // Additional Replay configuration goes in here, for example:
      maskAllText: true,
      blockAllMedia: true
    })
  ]
});

Steps to Reproduce

npm run build

Expected Result

#26 3.523 staff:build: warn  - In order to be able to deminify errors, @sentry/nextjs creates sourcemaps and uploads them to the Sentry server. Depending on your deployment setup, this means your original code may be visible in browser devtools in production. To prevent this, set hideSourceMaps to true in the sentry options in your next.config.js. To disable this warning without changing sourcemap behavior, set hideSourceMaps to false. (In @sentry/nextjs version 8.0.0 and beyond, this option will default to true.) See https://webpack.js.org/configuration/devtool/ and https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#use-hidden-source-map for more information.
#26 3.523 staff:build: 
#26 172.2 staff:build: 
#26 172.2 staff:build: <--- Last few GCs --->
#26 172.2 staff:build: 
#26 172.2 staff:build: [53:0x7f1f45da40c0]   166470 ms: Mark-sweep 2016.6 (2086.5) -> 1969.1 (2049.4) MB, 1677.0 / 0.0 ms  (average mu = 0.174, current mu = 0.141) allocation failure; scavenge might not succeed
#26 172.2 staff:build: [53:0x7f1f45da40c0]   168145 ms: Mark-sweep 2008.0 (2072.5) -> 1975.8 (2061.5) MB, 1553.9 / 0.0 ms  (average mu = 0.128, current mu = 0.073) allocation failure; scavenge might not succeed
#26 172.2 staff:build: 
#26 172.2 staff:build: 
#26 172.2 staff:build: <--- JS stacktrace --->
#26 172.2 staff:build: 
#26 172.2 staff:build: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

Actual Result

image

The build is successful when Sentry is disabled.

Hi @foodiecompany could you share your next.config.js file?

The issue here is probably sourcemaps generation (which is handled by nextjs, sentry just is responsible for uploading). What version of next.js/webpack are you using?

Sure

const { withSentryConfig } = require("@sentry/nextjs");
const path = require("path");

const env = process.env;
const SENTRY_PROJECT_NAME = env.SENTRY_PROJECT_NAME;
const IS_PRODUCTION = env.NODE_ENV === "production";
const STRAPI_MEDIA_HOST = IS_PRODUCTION ? "res.cloudinary.com" : "127.0.0.1";

let config = {
  reactStrictMode: true,
  output: "standalone",
  transpilePackages: [
    "ui",
    "@ant-design",
    "antd",
    "rc-pagination",
    "rc-picker",
    "rc-util"
  ],
  images: {
    remotePatterns: [
      {
        protocol: IS_PRODUCTION ? "https" : "http",
        hostname: STRAPI_MEDIA_HOST
      }
    ]
  },
  experimental: {
    outputFileTracingRoot: path.join(__dirname, "../../"),
    optimizePackageImports: ["lodash", "@ant-design", "antd"],

    // The instrumentation hook is required for Sentry to work on the serverside
    instrumentationHook: true
  }
};

// Injected content via Sentry wizard below
if (SENTRY_PROJECT_NAME) {
  config = withSentryConfig(config, {
    // For all available options, see:
    // https://github.com/getsentry/sentry-webpack-plugin#options

    org: "fastybill-vr",
    project: SENTRY_PROJECT_NAME,

    // Only print logs for uploading source maps in CI
    silent: true,

    // Upload a larger set of source maps for prettier stack traces (increases build time)
    widenClientFileUpload: true,

    // Transpiles SDK to be compatible with IE11 (increases bundle size)
    transpileClientSDK: true,

    // Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.
    // This can increase your server load as well as your hosting bill.
    // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-
    // side errors will fail.
    tunnelRoute: "/monitoring",

    // Hides source maps from generated client bundles
    hideSourceMaps: true,

    // Automatically tree-shake Sentry logger statements to reduce bundle size
    disableLogger: true,

    // Enables automatic instrumentation of Vercel Cron Monitors.
    // See the following for more information:
    // https://docs.sentry.io/product/crons/
    // https://vercel.com/docs/cron-jobs
    automaticVercelMonitors: true
  });
}

module.exports = config;

Dockerfile

FROM node:18-alpine AS base
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev vips-dev git > /dev/null 2>&1

FROM base AS builder
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk update
RUN apk add --no-cache libc6-compat
# Set working directory
WORKDIR /app
RUN yarn global add turbo
COPY . .
RUN turbo prune staff --docker

# Add lockfile and package.json's of isolated subworkspace
FROM base AS installer
RUN apk update
RUN apk add --no-cache libc6-compat
WORKDIR /app

# First install the dependencies (as they change less often)
COPY .gitignore .gitignore
COPY --from=builder /app/out/json/ .
COPY --from=builder /app/out/package-lock.json ./package-lock.json
RUN npm install -g node-gyp
RUN npm i sharp
RUN npm install

# Build the project
COPY --from=builder /app/out/full/ .
COPY turbo.json turbo.json

# The SENTRY env are send when we deployed the docker image
ARG SENTRY_PROJECT_NAME
ENV SENTRY_PROJECT_NAME=${SENTRY_PROJECT_NAME}

ARG SENTRY_AUTH_TOKEN
ENV SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN}

ARG SENTRY_DSN
ENV SENTRY_DSN=${SENTRY_DSN}

ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1

RUN npm run build:staff

FROM base AS runner
WORKDIR /app

# Don't run production as root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
USER nextjs

COPY --from=builder /app/apps/staff/next.config.js .
COPY --from=installer /app/apps/staff/package.json .

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=installer --chown=nextjs:nodejs /app/apps/staff/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/apps/staff/.next/static ./apps/staff/.next/static
COPY --from=installer --chown=nextjs:nodejs /app/apps/staff/public ./apps/staff/public

# Expose ports (for orchestrators and dynamic reverse proxies)
EXPOSE 3001
ENV PORT=3001
ENV HOSTNAME="0.0.0.0"

# Run the nextjs app
CMD ["node", "apps/staff/server.js"]

Can you try this workaround? #10468 (comment)

Can you try this workaround? #10468 (comment)

works thx

{
  // ...
  disableServerWebpackPlugin: true,
  disableClientWebpackPlugin: true
}

I'm seeing similar issues in version 8.11.0, specifically when building within a docker container. This version doesn't have the same disableServerWebpackPlugin and disableClientWebpackPlugin options but I've tried with:

unstable_sentryWebpackPluginOptions: {
  disable: true
}

which doesn't seem to help. Builds without the withSentryConfig wrapper work fine.

lforst commented

This is very likely because webpack is consuming a lot of memory generating sourcemaps. You can set the following in version 8.x:

module.exports = withSentryConfig(nextConfig, {
  sourcemaps: {
    disable: true
  }
})