feature(queue): use postgres instead of redis for buffer

* wip(buffer): initial implementation of psql buffer

* wip(buffer): add both profile and bots buffer
This commit is contained in:
Carl-Gerhard Lindesvärd
2025-01-29 15:17:54 +00:00
committed by Carl-Gerhard Lindesvärd
parent 2b5b8ce446
commit 71bf22af51
16 changed files with 19713 additions and 18747 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -184,6 +184,9 @@ async function createMock(file: string) {
data: {
organizationId: 'openpanel-dev',
name: project.domain,
cors: [project.domain],
domain: project.domain,
crossDomain: true,
clients: {
create: {
organizationId: 'openpanel-dev',
@@ -191,7 +194,6 @@ async function createMock(file: string) {
secret: await hashPassword('secret'),
id: project.clientId,
type: ClientType.write,
cors: project.domain,
},
},
},
@@ -255,6 +257,10 @@ async function simultaneousRequests() {
trackit(screenView);
trackit(event);
}
const exit = async () => {
await new Promise((resolve) => setTimeout(resolve, 2000));
process.exit(1);
};
async function main() {
const [type, file = 'mock-basic.json'] = process.argv.slice(2);
@@ -268,10 +274,10 @@ async function main() {
break;
case 'mock':
await createMock(file);
await exit();
break;
default:
console.log('usage: jiti mock.ts send|mock|sim [file]');
process.exit(1);
}
}

View File

@@ -32,6 +32,10 @@ export default function EventDetails({ id }: Props) {
const event = query.data;
const common = [
{
name: 'Path',
value: event.path,
},
{
name: 'Origin',
value: event.origin,

View File

@@ -145,6 +145,7 @@ export async function createSessionEnd(
...sessionStart,
properties: {
...sessionStart.properties,
...(screenViews[0]?.properties ?? {}),
__bounce: screenViews.length <= 1,
},
name: 'session_end',

View File

@@ -2,6 +2,7 @@ import { getReferrerWithQuery, parseReferrer } from '@/utils/parse-referrer';
import type { Job } from 'bullmq';
import { omit } from 'ramda';
import { logger } from '@/utils/logger';
import { createSessionEnd, getSessionEnd } from '@/utils/session-handler';
import { isSameDomain, parsePath } from '@openpanel/common';
import { parseUserAgent } from '@openpanel/common/server';
@@ -20,7 +21,9 @@ const merge = <A, B>(a: Partial<A>, b: Partial<B>): A & B =>
R.mergeDeepRight(a, R.reject(R.anyPass([R.isEmpty, R.isNil]))(b)) as A & B;
async function createEventAndNotify(payload: IServiceCreateEventPayload) {
await checkNotificationRulesForEvent(payload);
await checkNotificationRulesForEvent(payload).catch((e) => {
logger.error('Error checking notification rules', { error: e });
});
return createEvent(payload);
}
@@ -121,7 +124,7 @@ export async function incomingEvent(job: Job<EventsQueuePayloadIncomingEvent>) {
referrer: sessionEnd.payload?.referrer,
referrerName: sessionEnd.payload?.referrerName,
referrerType: sessionEnd.payload?.referrerType,
}) as IServiceCreateEventPayload
}) as IServiceCreateEventPayload;
if (sessionEnd.notFound) {
await createSessionEnd({ payload });