Batch analytics events into an EventSink and compute stats from it
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 78/100
- Type d'issue
- Fonctionnalité
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- typescript
Piste de recherche
Read packages/core/src/analytics/collector.ts and packages/core/src/storage/memory.ts, then compare the existing stats shape and event query API. Implement the buffered sink and stats function in packages/core/src/analytics/sink.ts; use packages/core/tests/analytics/sink.test.ts to cover batching, timers, failures, concurrent flushes, and matching stats. Done when the module is exported, the tests pass, and a minor changeset is added.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Analytics live in an AnalyticsCollector in memory (packages/core/src/analytics/collector.ts), capped at 1000 events and per process, so on serverless the stats only describe one instance. @chatcops/core now has an EventSink interface (packages/core/src/storage/types.ts) that stores can back with Redis, Postgres or D1. Writing every event as its own database call would be slow, so this issue adds a small buffer in front of the sink and a function that turns the sink's counts back into today's stats shape.
What to do
Create packages/core/src/analytics/sink.ts:
export class BufferedEventSink {
constructor(sink: EventSink, options?: { maxBatch?: number; flushMs?: number });
/** Queues an event. Never throws and never waits. */
track(type: string, data?: Record<string, unknown>): void;
/** Writes everything queued. Safe to call any time, including concurrently. */
flush(): Promise<void>;
}
/** The same shape as AnalyticsCollector.getStats(), from the sink's counts. */
export function statsFromSink(sink: EventSink, range: { from: number; to: number }): Promise<AnalyticsStats>;
maxBatchdefaults to 50: reaching it starts a flush right away.flushMsdefaults to 2000: the firsttrackafter an empty buffer starts onesetTimeout. Create the timer only insidetrack, never in the constructor, because Workers forbid timers at global scope. Callunref()on it when it exists (Node), so it doesn't keep a process alive.- A failed
sink.writelogs one line,[chatcops] analytics write failed: <message>, and drops that batch. Analytics must never break a chat. - Two flushes at the same time must not write the same event twice.
statsFromSinkthrows a clear error when the sink has noquery. It countsconversation:startedas conversations,message:sentplusmessage:receivedas messages, andlead:capturedas leads. Keep the existing field names (includingleadsCapture), since people already read them.
Where to look
packages/core/src/analytics/collector.tsandpackages/core/tests/analytics/collector.test.tspackages/core/src/storage/memory.ts(memoryStorage().eventshasquery, use it in the tests)
Acceptance criteria
- New
packages/core/src/analytics/sink.tsandpackages/core/tests/analytics/sink.test.ts, exported from@chatcops/core - Tests (fake timers): flush on
maxBatch, flush onflushMs, no timer before the firsttrack, a failing sink logs and drops, concurrentflush()calls write each event once -
statsFromSinkonmemoryStorage().eventsmatches whatAnalyticsCollector.getStats()gives for the same events - Changeset for
@chatcops/core(minor) -
pnpm test:coverageandpnpm lintpass
Want to work on this? Comment below and I'll assign it to you. Please take one issue at a time, branch off dev, and open your PR against dev with Closes #<this issue number>. Setup notes (pnpm, build before test) are in CONTRIBUTING.md.
- Langage dominant
- TypeScript
- Étoiles
- 13
- Forks
- 7
- Merge moyen
- 4 h 11 min
- PR mergées (30 j)
- 122
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de codercops/chatcops
-
enhancement hacktoberfest help wanted server
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
Document the pre-chat formPeut-être pris @masyarakatai l’a pris il y a 5 jours. Ouvertedocumentation good first issue hacktoberfest widget
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
codercops/chatcops#70 · 3 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement hacktoberfest help wanted server
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 1 jour
-
Create @chatcops/store-redis for Upstash and other Redis clientsPeut-être pris @bhushan4work l’a pris il y a 1 jour. Ouverteenhancement hacktoberfest help wanted server
codercops/chatcops#248 · 2 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
Create @chatcops/store-sqlite, a store for single-server setupsPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverteenhancement hacktoberfest help wanted server
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de codercops/chatcops
Issues similaires
-
[BUG] rag: sentence content can cross the reported sentence boundariesPeut-être pris @LJK-ikun l’a pris aujourd’hui. Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
bug needs-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
README: the Resource URI Schemas example's file://documents/* pattern only matches that literal URIOuverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
platformatic/mcp#361 ·
Les mainteneurs répondent en général sous 1 jour
-
frontend
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Push: sem service worker ou sem VAPID, o interruptor de Notificações fica ligado sem avisar nadaOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
melgarafael/DeskcommCRM#3164 ·
Les mainteneurs répondent en général sous 1 jour