diff --git a/.changeset/dull-carrots-bow.md b/.changeset/dull-carrots-bow.md new file mode 100644 index 0000000000..950c823735 --- /dev/null +++ b/.changeset/dull-carrots-bow.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/api": patch +--- + +Disable mongoose autoIndex in check-alerts worker to prevent MongoExpiredSessionError diff --git a/packages/api/src/models/index.ts b/packages/api/src/models/index.ts index 3e932d006a..1779e3dc41 100644 --- a/packages/api/src/models/index.ts +++ b/packages/api/src/models/index.ts @@ -51,7 +51,7 @@ mongoose.connection.on('reconnectFailed', () => { logger.error('Failed to reconnect to MongoDB'); }); -export const connectDB = async () => { +export const connectDB = async (options?: mongoose.ConnectOptions) => { // breadcrumbs for future greppers: aws4 is included as a dependency of the api so that // users can use AWS auth in their mongo connection string here, e.g. // mongodb+srv://blahblah...mongodb.net/hyperdx?authSource=%24external&authMechanism=MONGODB-AWS @@ -61,6 +61,7 @@ export const connectDB = async () => { await mongoose.connect(config.MONGO_URI, { heartbeatFrequencyMS: 10000, // retry failed heartbeats maxPoolSize: 100, // 5 nodes -> max 1000 connections + ...options, }); }; diff --git a/packages/api/src/tasks/checkAlerts/providers/default.ts b/packages/api/src/tasks/checkAlerts/providers/default.ts index d14f456834..4075b09560 100644 --- a/packages/api/src/tasks/checkAlerts/providers/default.ts +++ b/packages/api/src/tasks/checkAlerts/providers/default.ts @@ -274,7 +274,12 @@ async function loadAlert( export default class DefaultAlertProvider implements AlertProvider { async init() { - await Promise.all([connectDB()]); + // The check-alerts worker only reads from MongoDB and never needs to + // ensure indexes exist (the API service owns that). Disabling autoIndex + // prevents background createIndexes calls from racing the short-lived + // connection close (which sends endSessions), surfaced as + // MongoExpiredSessionError on mongodb.createIndexes spans. + await Promise.all([connectDB({ autoIndex: false })]); } async asyncDispose() {