@noego/telemetry 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cli/telemetry_bin.cjs +57 -57
  2. package/dist/cli/telemetry_bin.cjs.map +1 -1
  3. package/dist/cli/telemetry_bin.js +57 -57
  4. package/dist/cli/telemetry_bin.js.map +1 -1
  5. package/dist/cli/telemetry_cli.cjs +57 -57
  6. package/dist/cli/telemetry_cli.cjs.map +1 -1
  7. package/dist/cli/telemetry_cli.d.cts +3 -3
  8. package/dist/cli/telemetry_cli.d.ts +3 -3
  9. package/dist/cli/telemetry_cli.js +57 -57
  10. package/dist/cli/telemetry_cli.js.map +1 -1
  11. package/dist/core/index.d.cts +5 -5
  12. package/dist/core/index.d.ts +5 -5
  13. package/dist/index.d.cts +6 -6
  14. package/dist/index.d.ts +6 -6
  15. package/dist/{maintenance_coordinator.types-B-bZUNvw.d.cts → maintenance_coordinator.types-C4ULi4A4.d.cts} +2 -2
  16. package/dist/{maintenance_coordinator.types-CBA5y74b.d.ts → maintenance_coordinator.types-ikUrRXmO.d.ts} +2 -2
  17. package/dist/{metric_definition_contract-l4i4SaAp.d.ts → metric_definition_contract-BYtnODhu.d.ts} +1 -1
  18. package/dist/{metric_definition_contract-BR6a_GzF.d.cts → metric_definition_contract-DfhhmTZ1.d.cts} +1 -1
  19. package/dist/node/index.cjs +57 -57
  20. package/dist/node/index.cjs.map +1 -1
  21. package/dist/node/index.d.cts +5 -5
  22. package/dist/node/index.d.ts +5 -5
  23. package/dist/node/index.js +57 -57
  24. package/dist/node/index.js.map +1 -1
  25. package/dist/{query.types-DySoqYop.d.ts → query.types-DU5v7vM0.d.ts} +7 -0
  26. package/dist/{query.types-Bntwh6KF.d.cts → query.types-DuYWbFFe.d.cts} +7 -0
  27. package/dist/sqlite/index.cjs +34 -57
  28. package/dist/sqlite/index.cjs.map +1 -1
  29. package/dist/sqlite/index.d.cts +3 -3
  30. package/dist/sqlite/index.d.ts +3 -3
  31. package/dist/sqlite/index.js +34 -57
  32. package/dist/sqlite/index.js.map +1 -1
  33. package/dist/{storage.types-DjuUMinz.d.cts → storage.types-Bji_pWqr.d.cts} +1 -1
  34. package/dist/{storage.types-BTCGVxOM.d.ts → storage.types-k7oElEB3.d.ts} +1 -1
  35. package/dist/{telemetry_configuration_parser-C7Et_gwG.d.ts → telemetry_configuration_parser-BZ8Nvnle.d.ts} +3 -2
  36. package/dist/{telemetry_configuration_parser-R-niZQRZ.d.cts → telemetry_configuration_parser-CgSN7R6A.d.cts} +3 -2
  37. package/dist/testing/index.d.cts +2 -2
  38. package/dist/testing/index.d.ts +2 -2
  39. package/migrations/1785073006031_raw_events_level_index.down.sql +1 -0
  40. package/migrations/1785073006031_raw_events_level_index.up.sql +5 -0
  41. package/native/noego_telemetry_native.node +0 -0
  42. package/package.json +1 -1
@@ -75,6 +75,13 @@ type SqliteRetentionConfiguration = Readonly<{
75
75
  rawMs: number;
76
76
  lateArrivalMs: number;
77
77
  samplesMs: number;
78
+ /**
79
+ * Per-level raw-event retention, keyed by lowercased level string.
80
+ * A level present here expires at its own window; any level absent here
81
+ * (including an empty or NULL level) falls back to `rawMs`. There is no
82
+ * "retain forever" branch — every raw row has exactly one time bound.
83
+ */
84
+ levelMs?: Readonly<Record<string, number>>;
78
85
  rollups: readonly Readonly<{
79
86
  resolutionMs: number;
80
87
  retainMs: number;
@@ -75,6 +75,13 @@ type SqliteRetentionConfiguration = Readonly<{
75
75
  rawMs: number;
76
76
  lateArrivalMs: number;
77
77
  samplesMs: number;
78
+ /**
79
+ * Per-level raw-event retention, keyed by lowercased level string.
80
+ * A level present here expires at its own window; any level absent here
81
+ * (including an empty or NULL level) falls back to `rawMs`. There is no
82
+ * "retain forever" branch — every raw row has exactly one time bound.
83
+ */
84
+ levelMs?: Readonly<Record<string, number>>;
78
85
  rollups: readonly Readonly<{
79
86
  resolutionMs: number;
80
87
  retainMs: number;
@@ -1831,73 +1831,49 @@ var TelemetryRepository = class {
1831
1831
  lastSequence: sample.sequence
1832
1832
  };
1833
1833
  }
1834
+ /**
1835
+ * Raw retention is purely time-based, matching the native collector: every
1836
+ * expired row goes in one set-based statement per level band. No page size,
1837
+ * no row cap, and no rollup-completion gate — metric samples are extracted at
1838
+ * ingest and retained on their own clock, so dropping a raw row costs no
1839
+ * metric fidelity, and no row can outlive its window waiting on a rollup.
1840
+ */
1834
1841
  createRawEventRetentionStep(nowMs) {
1835
- const cutoffMs = nowMs - this.options.retention.rawMs;
1836
1842
  const table = this.options.tableMap.quoted("rawEvents");
1837
- const readFirstPage = this.options.connection.prepare(
1838
- `SELECT producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,
1839
- source, process_kind, level, label, conversation_id,
1840
- conversation_id_kind, correlation_id, metadata_json, schema_version
1841
- FROM ${table}
1842
- WHERE target_id = ? AND occurred_at_ms < ?
1843
- ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC
1844
- LIMIT ${RETENTION_PAGE_SIZE}`
1845
- );
1846
- const readNextPage = this.options.connection.prepare(
1847
- `SELECT producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,
1848
- source, process_kind, level, label, conversation_id,
1849
- conversation_id_kind, correlation_id, metadata_json, schema_version
1850
- FROM ${table}
1851
- WHERE target_id = ? AND occurred_at_ms < ?
1852
- AND (occurred_at_ms, producer_id, sequence) > (?, ?, ?)
1853
- ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC
1854
- LIMIT ${RETENTION_PAGE_SIZE}`
1843
+ const levelMs = this.options.retention.levelMs ?? {};
1844
+ const levels = Object.keys(levelMs);
1845
+ const removeByLevel = this.options.connection.prepare(
1846
+ `DELETE FROM ${table}
1847
+ WHERE target_id = ? AND lower(coalesce(level, '')) = ? AND occurred_at_ms < ?`
1855
1848
  );
1856
- const remove = this.options.connection.prepare(
1857
- `DELETE FROM ${table} WHERE target_id = ? AND producer_id = ? AND sequence = ?`
1849
+ const fallbackPlaceholders = levels.map(() => "?").join(", ");
1850
+ const removeFallback = this.options.connection.prepare(
1851
+ `DELETE FROM ${table}
1852
+ WHERE target_id = ? AND occurred_at_ms < ?` + (levels.length === 0 ? "" : ` AND lower(coalesce(level, '')) NOT IN (${fallbackPlaceholders})`)
1858
1853
  );
1859
- let cursor = null;
1854
+ let done = false;
1860
1855
  return () => {
1861
- const rows = cursor === null ? readFirstPage.all(this.options.targetId, cutoffMs) : readNextPage.all(
1862
- this.options.targetId,
1863
- cutoffMs,
1864
- cursor.occurredAtMs,
1865
- cursor.producerId,
1866
- cursor.sequence
1867
- );
1868
- if (rows.length === 0) {
1856
+ if (done) {
1869
1857
  return { deleted: 0, done: true };
1870
1858
  }
1871
- const scanned = rows.map((row) => {
1872
- const parsed = this.rowParser.parseRawEnvelope(row);
1873
- if (!parsed.ok) {
1874
- throw new Error(parsed.error);
1875
- }
1876
- return parsed.value;
1877
- });
1878
- const eligible = scanned.filter((envelope) => this.rawEventHasRequiredRollups(envelope));
1859
+ done = true;
1879
1860
  const transaction = this.options.connection.transaction(() => {
1880
- let deleted2 = 0;
1881
- for (const envelope of eligible) {
1882
- deleted2 += remove.run(
1883
- this.options.targetId,
1884
- envelope.producerId,
1885
- envelope.sequence
1886
- ).changes;
1861
+ let deleted = 0;
1862
+ for (const level of levels) {
1863
+ const retainMs = levelMs[level];
1864
+ if (retainMs === void 0) {
1865
+ continue;
1866
+ }
1867
+ deleted += removeByLevel.run(this.options.targetId, level, nowMs - retainMs).changes;
1887
1868
  }
1888
- return deleted2;
1869
+ deleted += removeFallback.run(
1870
+ this.options.targetId,
1871
+ nowMs - this.options.retention.rawMs,
1872
+ ...levels
1873
+ ).changes;
1874
+ return deleted;
1889
1875
  });
1890
- const deleted = transaction();
1891
- const last = scanned[scanned.length - 1];
1892
- if (last === void 0 || rows.length < RETENTION_PAGE_SIZE) {
1893
- return { deleted, done: true };
1894
- }
1895
- cursor = {
1896
- occurredAtMs: last.occurredAtMs,
1897
- producerId: last.producerId,
1898
- sequence: last.sequence
1899
- };
1900
- return { deleted, done: false };
1876
+ return { deleted: transaction(), done: true };
1901
1877
  };
1902
1878
  }
1903
1879
  rawEventHasRequiredRollups(envelope) {
@@ -2638,6 +2614,7 @@ var TelemetryTableMap = class _TelemetryTableMap {
2638
2614
  rawEventsOccurredIndex: this.indexName(mapping.rawEvents, "occurred"),
2639
2615
  rawEventsConversationIndex: this.indexName(mapping.rawEvents, "conversation"),
2640
2616
  rawEventsLabelIndex: this.indexName(mapping.rawEvents, "label"),
2617
+ rawEventsLevelIndex: this.indexName(mapping.rawEvents, "level"),
2641
2618
  metricSamplesTimeIndex: this.indexName(mapping.metricSamples, "time"),
2642
2619
  metricSamplesEventIndex: this.indexName(mapping.metricSamples, "event"),
2643
2620
  metricRollupsTimeIndex: this.indexName(mapping.metricRollups, "time")