Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/disable-check-alerts-autocreate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@hyperdx/api": patch
---

Disable mongoose autoCreate in check-alerts worker to prevent NamespaceExists error spans on mongodb.create
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import * as models from '@/models';
import DefaultAlertProvider from '@/tasks/checkAlerts/providers/default';

jest.mock('@/models', () => ({
...jest.requireActual('@/models'),
connectDB: jest.fn().mockResolvedValue(undefined),
mongooseConnection: {
close: jest.fn().mockResolvedValue(undefined),
},
}));

describe('DefaultAlertProvider.init', () => {
beforeEach(() => {
jest.clearAllMocks();
});

it('disables both autoIndex and autoCreate when connecting to MongoDB', async () => {
const provider = new DefaultAlertProvider();
await provider.init();

expect(models.connectDB).toHaveBeenCalledTimes(1);
expect(models.connectDB).toHaveBeenCalledWith({
autoIndex: false,
autoCreate: false,
});
});
});
15 changes: 9 additions & 6 deletions packages/api/src/tasks/checkAlerts/providers/default.ts
Original file line number Diff line number Diff line change
Expand Up @@ -409,12 +409,15 @@ async function loadAlert(

export default class DefaultAlertProvider implements AlertProvider {
async init() {
// 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 })]);
// The check-alerts worker only reads/writes existing collections in MongoDB
// and never needs to ensure indexes or collections exist (the API service
// owns the schema). Disabling autoIndex prevents background createIndexes
// calls from racing the short-lived connection close (which sends
// endSessions), surfaced as MongoExpiredSessionError on
// mongodb.createIndexes spans. Disabling autoCreate prevents Model.init()
// from calling createCollection for each model on every run, which
// otherwise records failed mongodb.create (NamespaceExists) spans.
await Promise.all([connectDB({ autoIndex: false, autoCreate: false })]);
}

async asyncDispose() {
Expand Down
Loading