@newrelic/preflight 1.45.0 → 1.47.0

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 (36) hide show
  1. package/dist/config.d.ts +13 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +35 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/dashboard/basic-auth.d.ts +6 -0
  6. package/dist/dashboard/basic-auth.d.ts.map +1 -0
  7. package/dist/dashboard/basic-auth.js +26 -0
  8. package/dist/dashboard/basic-auth.js.map +1 -0
  9. package/dist/dashboard/dashboard-server.d.ts +10 -0
  10. package/dist/dashboard/dashboard-server.d.ts.map +1 -1
  11. package/dist/dashboard/dashboard-server.js +8 -0
  12. package/dist/dashboard/dashboard-server.js.map +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +21 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/storage/index.d.ts +2 -0
  17. package/dist/storage/index.d.ts.map +1 -1
  18. package/dist/storage/index.js +1 -0
  19. package/dist/storage/index.js.map +1 -1
  20. package/dist/storage/tier-local-writer.d.ts +40 -0
  21. package/dist/storage/tier-local-writer.d.ts.map +1 -0
  22. package/dist/storage/tier-local-writer.js +63 -0
  23. package/dist/storage/tier-local-writer.js.map +1 -0
  24. package/dist/transport/nr-ingest.d.ts +46 -1
  25. package/dist/transport/nr-ingest.d.ts.map +1 -1
  26. package/dist/transport/nr-ingest.js +200 -63
  27. package/dist/transport/nr-ingest.js.map +1 -1
  28. package/dist/transport/tier-router.d.ts +29 -0
  29. package/dist/transport/tier-router.d.ts.map +1 -0
  30. package/dist/transport/tier-router.js +52 -0
  31. package/dist/transport/tier-router.js.map +1 -0
  32. package/dist/transport/tier-types.d.ts +73 -0
  33. package/dist/transport/tier-types.d.ts.map +1 -0
  34. package/dist/transport/tier-types.js +192 -0
  35. package/dist/transport/tier-types.js.map +1 -0
  36. package/package.json +1 -1
@@ -21,6 +21,7 @@ import { AuditTrailManager } from '../security/index.js';
21
21
  import type { AuditRecord } from '../security/index.js';
22
22
  import type { TurnCostAttributor, ClosedTurn } from '../metrics/turn-cost-attributor.js';
23
23
  import type { LocalStore } from '../storage/index.js';
24
+ import type { ResolvedTier } from './tier-types.js';
24
25
  type SendEventsFn = (events: NrEventData[], licenseKey: string, options: TransportOptions) => Promise<TransportResult>;
25
26
  type SendMetricsFn = (metrics: NrMetric[], licenseKey: string, options: TransportOptions) => Promise<TransportResult>;
26
27
  type SendLogsFn = (logs: NrLogEntry[], licenseKey: string, options: TransportOptions) => Promise<TransportResult>;
@@ -92,6 +93,18 @@ export interface NrIngestOptions {
92
93
  * share `session_id` === OTel's `session.id`). Default false.
93
94
  */
94
95
  companionMode?: boolean;
96
+ /**
97
+ * Multi-tier telemetry routing. Threaded from `config.tiers`.
98
+ * Absent or empty → one implicit `default` tier is synthesized from
99
+ * `licenseKey` + `transportOptions.accountId`, reproducing the existing
100
+ * single-scheduler behavior exactly.
101
+ *
102
+ * The FIRST nr-type tier in array order is the **primary tier**: it carries
103
+ * the aggregated Metric API stream, the NR Logs API audit entries, the OTLP
104
+ * bridge/transport, and the `getEventSendHealth()` counters. At least one
105
+ * nr-type tier is required.
106
+ */
107
+ tiers?: readonly ResolvedTier[];
95
108
  }
96
109
  export declare function attachTeamAttribution(event: NrEventData, attrs: {
97
110
  teamId?: string | null;
@@ -358,7 +371,12 @@ export declare function turnCostToNrEvents(turn: ClosedTurn, attrs: {
358
371
  companionMode?: boolean;
359
372
  }): NrEventData[];
360
373
  export declare class NrIngestManager {
361
- private readonly scheduler;
374
+ private readonly schedulers;
375
+ private readonly localWriters;
376
+ private readonly router;
377
+ /** First nr-type tier — carries metrics, logs, OTLP, and send-health. */
378
+ private readonly primaryScheduler;
379
+ private readonly primaryTierName;
362
380
  private readonly logIngest;
363
381
  private readonly sessionTracker;
364
382
  private readonly proxyMetrics;
@@ -392,6 +410,33 @@ export declare class NrIngestManager {
392
410
  lastFailureAt: number | null;
393
411
  lastSuccessAt: number | null;
394
412
  };
413
+ /**
414
+ * All configured tier names — NOT in overall declaration order. All
415
+ * nr-type tier names come first (in their own declaration order relative
416
+ * to each other), followed by all local-type tier names (likewise in
417
+ * their own relative declaration order). A local tier declared before an
418
+ * nr tier in config still appears after every nr tier here, because this
419
+ * reads `this.schedulers.keys()` (nr tiers) then `this.localWriters.keys()`
420
+ * (local tiers) — two separate maps keyed by destination type.
421
+ */
422
+ getTierNames(): readonly string[];
423
+ /** The tier carrying metrics, logs, OTLP, and send-health. */
424
+ getPrimaryTierName(): string;
425
+ /**
426
+ * Fan one NR event out to every tier whose `eventTypes` matches, in tier
427
+ * declaration order. The single choke point through which all ~15
428
+ * `ingestX()` methods emit events.
429
+ *
430
+ * The same event object is shared by reference across tiers — field-level
431
+ * redaction/projection per tier is an explicit non-goal (routing is
432
+ * event-type-level only). Neither `HarvestScheduler.addEvent()` nor
433
+ * `TierLocalWriter.addEvent()` mutates it.
434
+ *
435
+ * An event whose type matches no tier is dropped silently: a narrow tier
436
+ * list is a deliberate operator choice, and logging per dropped event would
437
+ * flood stderr at tool-call volume.
438
+ */
439
+ private routeEvent;
395
440
  ingestProxyRequest(record: ProxyRequestRecord): void;
396
441
  ingestToolCall(record: ToolCallRecord, auditRecord?: AuditRecord): void;
397
442
  ingestCodingTask(task: AiCodingTask): void;
@@ -1 +1 @@
1
- {"version":3,"file":"nr-ingest.d.ts","sourceRoot":"","sources":["../../src/transport/nr-ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nr-ingest.d.ts","sourceRoot":"","sources":["../../src/transport/nr-ingest.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@ import { VERSION } from '../version.js';
9
9
  import { ProxyMetricsTracker } from '../metrics/proxy-metrics.js';
10
10
  import { AuditTrailManager, auditRecordToNrEvent, securityAlertToNrEvent, } from '../security/index.js';
11
11
  import { LogIngestManager } from './log-ingest.js';
12
+ import { TierRouter } from './tier-router.js';
13
+ import { DEFAULT_TIER_NAME, WILDCARD_EVENT_TYPE } from './tier-types.js';
14
+ import { TierLocalWriter } from '../storage/tier-local-writer.js';
12
15
  // ---------------------------------------------------------------------------
13
16
  // Serializer
14
17
  // ---------------------------------------------------------------------------
@@ -591,7 +594,12 @@ class DeveloperAttributedMetricAggregator extends MetricAggregator {
591
594
  // NrIngestManager
592
595
  // ---------------------------------------------------------------------------
593
596
  export class NrIngestManager {
594
- scheduler;
597
+ schedulers;
598
+ localWriters;
599
+ router;
600
+ /** First nr-type tier — carries metrics, logs, OTLP, and send-health. */
601
+ primaryScheduler;
602
+ primaryTierName;
595
603
  logIngest;
596
604
  sessionTracker;
597
605
  proxyMetrics;
@@ -669,25 +677,35 @@ export class NrIngestManager {
669
677
  // Wrap send functions so non-retryable 4xx failures (400, 403, etc.) are not
670
678
  // re-queued by HarvestScheduler. Returning success=true suppresses the requeue
671
679
  // without masking the original error — we log a warning before returning.
680
+ //
681
+ // One wrapper per tier so the tier name appears in the drop log. Only the
682
+ // primary tier moves the `getEventSendHealth()` counters: those describe
683
+ // "is this process's own telemetry landing", and a secondary team-account
684
+ // tier being unreachable must not make the primary look unhealthy.
672
685
  const rawSendEventsFn = options.sendEventsFn ?? sendEvents;
673
- const classifyingEventsFn = async (events, licenseKey, opts) => {
674
- const result = await rawSendEventsFn(events, licenseKey, opts);
675
- if (result.success) {
676
- this.consecutiveEventSendFailures = 0;
677
- this.lastEventSendSuccessAt = Date.now();
678
- }
679
- else {
680
- this.consecutiveEventSendFailures += 1;
681
- this.lastEventSendFailureAt = Date.now();
682
- }
683
- if (!result.success && result.statusCode !== null && isNonRetryable4xx(result.statusCode)) {
684
- logger.warn('Dropping non-retryable event batch', {
685
- statusCode: result.statusCode,
686
- batchSize: events.length,
687
- });
688
- return { ...result, success: true };
689
- }
690
- return result;
686
+ const makeClassifyingEventsFn = (tierName, isPrimary) => {
687
+ return async (events, licenseKey, opts) => {
688
+ const result = await rawSendEventsFn(events, licenseKey, opts);
689
+ if (isPrimary) {
690
+ if (result.success) {
691
+ this.consecutiveEventSendFailures = 0;
692
+ this.lastEventSendSuccessAt = Date.now();
693
+ }
694
+ else {
695
+ this.consecutiveEventSendFailures += 1;
696
+ this.lastEventSendFailureAt = Date.now();
697
+ }
698
+ }
699
+ if (!result.success && result.statusCode !== null && isNonRetryable4xx(result.statusCode)) {
700
+ logger.warn('Dropping non-retryable event batch', {
701
+ tier: tierName,
702
+ statusCode: result.statusCode,
703
+ batchSize: events.length,
704
+ });
705
+ return { ...result, success: true };
706
+ }
707
+ return result;
708
+ };
691
709
  };
692
710
  const rawSendMetricsFn = options.sendMetricsFn ?? sendMetrics;
693
711
  const classifyingMetricsFn = async (metrics, licenseKey, opts) => {
@@ -706,21 +724,88 @@ export class NrIngestManager {
706
724
  clientName: 'newrelic-preflight',
707
725
  clientVersion: VERSION,
708
726
  };
709
- this.scheduler = new HarvestScheduler({
710
- licenseKey: options.licenseKey,
711
- transportOptions,
712
- eventHarvestIntervalMs: options.eventHarvestIntervalMs,
713
- metricHarvestIntervalMs: options.metricHarvestIntervalMs,
714
- sendEventsFn: classifyingEventsFn,
715
- sendMetricsFn: classifyingMetricsFn,
716
- otlpEventBridge: otlpEventBridge ?? undefined,
717
- otlpTransport: otlpTransport ?? undefined,
718
- transport: options.transport,
719
- allowProcessExit: true,
720
- });
727
+ // Absent/empty tiers → one implicit tier reproducing the existing
728
+ // single-scheduler behavior exactly (same licenseKey, same
729
+ // transportOptions, same OTLP objects, same transport mode).
730
+ const tiers = options.tiers !== undefined && options.tiers.length > 0
731
+ ? options.tiers
732
+ : [
733
+ {
734
+ name: DEFAULT_TIER_NAME,
735
+ destination: {
736
+ type: 'nr',
737
+ licenseKey: options.licenseKey,
738
+ accountId: options.transportOptions.accountId,
739
+ },
740
+ eventTypes: [WILDCARD_EVENT_TYPE],
741
+ },
742
+ ];
743
+ this.router = new TierRouter(tiers);
744
+ this.schedulers = new Map();
745
+ this.localWriters = new Map();
746
+ let primaryScheduler = null;
747
+ let primaryTierName = null;
748
+ let primaryLicenseKey = null;
749
+ let primaryTransportOptions = null;
750
+ const seenTierNames = new Set();
751
+ for (const tier of tiers) {
752
+ // validateTiers() already rejects duplicate names at config load; this
753
+ // guard covers direct programmatic construction (several existing
754
+ // tests build a `tiers` array by hand, bypassing validateTiers()). Without
755
+ // it, `this.schedulers.set(tier.name, scheduler)` /
756
+ // `this.localWriters.set(tier.name, ...)` would silently let the second
757
+ // tier's scheduler/writer overwrite the first's, so events meant for two
758
+ // destinations would silently double up on whichever survives instead
759
+ // of reaching both — with no error.
760
+ if (seenTierNames.has(tier.name)) {
761
+ throw new Error(`NrIngestManager received duplicate tier name "${tier.name}" — tier names must be unique.`);
762
+ }
763
+ seenTierNames.add(tier.name);
764
+ if (tier.destination.type === 'local') {
765
+ this.localWriters.set(tier.name, new TierLocalWriter({ tierName: tier.name, path: tier.destination.path }));
766
+ continue;
767
+ }
768
+ const isPrimary = primaryScheduler === null;
769
+ const tierTransportOptions = {
770
+ ...transportOptions,
771
+ accountId: tier.destination.accountId,
772
+ };
773
+ const scheduler = new HarvestScheduler({
774
+ licenseKey: tier.destination.licenseKey,
775
+ transportOptions: tierTransportOptions,
776
+ eventHarvestIntervalMs: options.eventHarvestIntervalMs,
777
+ metricHarvestIntervalMs: options.metricHarvestIntervalMs,
778
+ sendEventsFn: makeClassifyingEventsFn(tier.name, isPrimary),
779
+ sendMetricsFn: classifyingMetricsFn,
780
+ // Per-tier OTLP is an explicit non-goal — OTLP stays bound to the
781
+ // primary tier, so secondary tiers are NR-events-only.
782
+ otlpEventBridge: isPrimary ? (otlpEventBridge ?? undefined) : undefined,
783
+ otlpTransport: isPrimary ? (otlpTransport ?? undefined) : undefined,
784
+ transport: isPrimary ? options.transport : 'nr-events-api',
785
+ allowProcessExit: true,
786
+ });
787
+ this.schedulers.set(tier.name, scheduler);
788
+ if (isPrimary) {
789
+ primaryScheduler = scheduler;
790
+ primaryTierName = tier.name;
791
+ primaryLicenseKey = tier.destination.licenseKey;
792
+ primaryTransportOptions = tierTransportOptions;
793
+ }
794
+ }
795
+ if (primaryScheduler === null ||
796
+ primaryTierName === null ||
797
+ primaryLicenseKey === null ||
798
+ primaryTransportOptions === null) {
799
+ // validateTiers() already enforces this at config load; this guard covers
800
+ // direct programmatic construction.
801
+ throw new Error('NrIngestManager requires at least one nr-type tier — the aggregated Metric API stream ' +
802
+ 'and NR Logs API audit entries are delivered through the primary tier.');
803
+ }
804
+ this.primaryScheduler = primaryScheduler;
805
+ this.primaryTierName = primaryTierName;
721
806
  this.logIngest = new LogIngestManager({
722
- licenseKey: options.licenseKey,
723
- transportOptions,
807
+ licenseKey: primaryLicenseKey,
808
+ transportOptions: primaryTransportOptions,
724
809
  developer: options.developer,
725
810
  appName: options.appName,
726
811
  logHarvestIntervalMs: options.logHarvestIntervalMs,
@@ -734,6 +819,48 @@ export class NrIngestManager {
734
819
  lastSuccessAt: this.lastEventSendSuccessAt,
735
820
  };
736
821
  }
822
+ /**
823
+ * All configured tier names — NOT in overall declaration order. All
824
+ * nr-type tier names come first (in their own declaration order relative
825
+ * to each other), followed by all local-type tier names (likewise in
826
+ * their own relative declaration order). A local tier declared before an
827
+ * nr tier in config still appears after every nr tier here, because this
828
+ * reads `this.schedulers.keys()` (nr tiers) then `this.localWriters.keys()`
829
+ * (local tiers) — two separate maps keyed by destination type.
830
+ */
831
+ getTierNames() {
832
+ return [...this.schedulers.keys(), ...this.localWriters.keys()];
833
+ }
834
+ /** The tier carrying metrics, logs, OTLP, and send-health. */
835
+ getPrimaryTierName() {
836
+ return this.primaryTierName;
837
+ }
838
+ /**
839
+ * Fan one NR event out to every tier whose `eventTypes` matches, in tier
840
+ * declaration order. The single choke point through which all ~15
841
+ * `ingestX()` methods emit events.
842
+ *
843
+ * The same event object is shared by reference across tiers — field-level
844
+ * redaction/projection per tier is an explicit non-goal (routing is
845
+ * event-type-level only). Neither `HarvestScheduler.addEvent()` nor
846
+ * `TierLocalWriter.addEvent()` mutates it.
847
+ *
848
+ * An event whose type matches no tier is dropped silently: a narrow tier
849
+ * list is a deliberate operator choice, and logging per dropped event would
850
+ * flood stderr at tool-call volume.
851
+ */
852
+ routeEvent(event) {
853
+ const rawEventType = event.eventType;
854
+ const eventType = typeof rawEventType === 'string' ? rawEventType : '';
855
+ for (const tierName of this.router.resolveEventType(eventType)) {
856
+ const scheduler = this.schedulers.get(tierName);
857
+ if (scheduler !== undefined) {
858
+ scheduler.addEvent(event);
859
+ continue;
860
+ }
861
+ this.localWriters.get(tierName)?.addEvent(event);
862
+ }
863
+ }
737
864
  ingestProxyRequest(record) {
738
865
  const event = proxyRequestToNrEvent(record, {
739
866
  developer: this.developer,
@@ -743,11 +870,14 @@ export class NrIngestManager {
743
870
  orgId: this.orgId,
744
871
  repoUrl: this.repoUrl,
745
872
  });
746
- this.scheduler.addEvent(event);
873
+ this.routeEvent(event);
747
874
  const server = record.serverName;
748
- this.scheduler.recordMetric('ai.mcp.proxy_request_count', 1, { server, method: record.method });
875
+ this.primaryScheduler.recordMetric('ai.mcp.proxy_request_count', 1, {
876
+ server,
877
+ method: record.method,
878
+ });
749
879
  if (record.durationMs != null) {
750
- this.scheduler.recordMetric('ai.mcp.proxy_request_duration_ms', record.durationMs, {
880
+ this.primaryScheduler.recordMetric('ai.mcp.proxy_request_duration_ms', record.durationMs, {
751
881
  server,
752
882
  });
753
883
  }
@@ -775,7 +905,7 @@ export class NrIngestManager {
775
905
  // Cost attribution is available via the nr_observe_get_cost_per_tool MCP tool only.
776
906
  // Enriching NR events here would always produce null because the token event
777
907
  // (which finalizes turn cost) arrives asynchronously after ingestToolCall is called.
778
- this.scheduler.addEvent(event);
908
+ this.routeEvent(event);
779
909
  // Record per-call metrics for NR Metric API. Prefer the record's own
780
910
  // sessionId (see the comment on the AiToolCall event above) — this also
781
911
  // covers proxy calls' own per-connection sessionId (see
@@ -792,11 +922,11 @@ export class NrIngestManager {
792
922
  teamDims.org_id = this.orgId;
793
923
  if (this.repoUrl)
794
924
  teamDims.repo_url = this.repoUrl;
795
- this.scheduler.recordMetric('ai.tool.call_count', 1, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
925
+ this.primaryScheduler.recordMetric('ai.tool.call_count', 1, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
796
926
  if (record.durationMs != null) {
797
- this.scheduler.recordMetric('ai.tool.duration_ms', record.durationMs, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
927
+ this.primaryScheduler.recordMetric('ai.tool.duration_ms', record.durationMs, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
798
928
  }
799
- this.scheduler.recordMetric('ai.tool.success', record.success ? 1 : 0, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
929
+ this.primaryScheduler.recordMetric('ai.tool.success', record.success ? 1 : 0, sessionId != null ? { tool, session_id: sessionId, ...teamDims } : { tool, ...teamDims });
800
930
  // If this is a proxied tool call, also emit AiMcpToolCall event and aggregate
801
931
  if (isProxyToolCall(record)) {
802
932
  const proxyEvent = proxyToolCallToNrEvent(record, {
@@ -808,7 +938,7 @@ export class NrIngestManager {
808
938
  orgId: this.orgId,
809
939
  repoUrl: this.repoUrl,
810
940
  });
811
- this.scheduler.addEvent(proxyEvent);
941
+ this.routeEvent(proxyEvent);
812
942
  this.proxyMetrics.recordProxyCall(record);
813
943
  }
814
944
  // Security audit trail. The caller may pass a pre-computed auditRecord
@@ -818,14 +948,14 @@ export class NrIngestManager {
818
948
  (isProxyToolCall(record)
819
949
  ? this.auditTrail.recordProxyCall(record)
820
950
  : this.auditTrail.recordToolCall(record));
821
- this.scheduler.addEvent(auditRecordToNrEvent(finalAuditRecord, {
951
+ this.routeEvent(auditRecordToNrEvent(finalAuditRecord, {
822
952
  teamId: this.teamId,
823
953
  projectId: this.projectId,
824
954
  orgId: this.orgId,
825
955
  repoUrl: this.repoUrl,
826
956
  }));
827
957
  if (finalAuditRecord.securityAlert) {
828
- this.scheduler.addEvent(securityAlertToNrEvent(finalAuditRecord, {
958
+ this.routeEvent(securityAlertToNrEvent(finalAuditRecord, {
829
959
  teamId: this.teamId,
830
960
  projectId: this.projectId,
831
961
  orgId: this.orgId,
@@ -846,7 +976,7 @@ export class NrIngestManager {
846
976
  repoUrl: this.repoUrl,
847
977
  companionMode: this.companionMode,
848
978
  });
849
- this.scheduler.addEvent(event);
979
+ this.routeEvent(event);
850
980
  }
851
981
  /**
852
982
  * Buffer a completed workflow run as a single `AiWorkflowRun` event.
@@ -866,7 +996,7 @@ export class NrIngestManager {
866
996
  repoUrl: this.repoUrl,
867
997
  companionMode: this.companionMode,
868
998
  });
869
- this.scheduler.addEvent(event);
999
+ this.routeEvent(event);
870
1000
  }
871
1001
  /**
872
1002
  * Buffer a script-watcher-derived workflow run (`run_source='script'`).
@@ -884,7 +1014,7 @@ export class NrIngestManager {
884
1014
  repoUrl: this.repoUrl,
885
1015
  companionMode: this.companionMode,
886
1016
  });
887
- this.scheduler.addEvent(event);
1017
+ this.routeEvent(event);
888
1018
  }
889
1019
  /**
890
1020
  * Buffer a single subagent assistant turn (`AiSubagentTurn`).
@@ -901,7 +1031,7 @@ export class NrIngestManager {
901
1031
  repoUrl: this.repoUrl,
902
1032
  companionMode: this.companionMode,
903
1033
  });
904
- this.scheduler.addEvent(event);
1034
+ this.routeEvent(event);
905
1035
  }
906
1036
  /**
907
1037
  * Buffer a `SubagentTokenEvent` (storage-layer record) as an `AiSubagentTurn`
@@ -918,7 +1048,7 @@ export class NrIngestManager {
918
1048
  repoUrl: this.repoUrl,
919
1049
  companionMode: this.companionMode,
920
1050
  });
921
- this.scheduler.addEvent(ev);
1051
+ this.routeEvent(ev);
922
1052
  }
923
1053
  /** Buffer an `AiObservabilityHealth` event from the watcher pipeline. */
924
1054
  ingestObservabilityHealth(metrics) {
@@ -930,7 +1060,7 @@ export class NrIngestManager {
930
1060
  orgId: this.orgId,
931
1061
  repoUrl: this.repoUrl,
932
1062
  });
933
- this.scheduler.addEvent(event);
1063
+ this.routeEvent(event);
934
1064
  }
935
1065
  ingestAntiPattern(pattern, context) {
936
1066
  const event = antiPatternToNrEvent(pattern, {
@@ -945,7 +1075,7 @@ export class NrIngestManager {
945
1075
  repoUrl: this.repoUrl,
946
1076
  detectedAt: context.detectedAt,
947
1077
  });
948
- this.scheduler.addEvent(event);
1078
+ this.routeEvent(event);
949
1079
  }
950
1080
  ingestRetryAlert(alert, context = {}) {
951
1081
  const event = retryAlertToNrEvent(alert, {
@@ -958,7 +1088,7 @@ export class NrIngestManager {
958
1088
  orgId: this.orgId,
959
1089
  repoUrl: this.repoUrl,
960
1090
  });
961
- this.scheduler.addEvent(event);
1091
+ this.routeEvent(event);
962
1092
  }
963
1093
  ingestTurnCost(turn) {
964
1094
  const events = turnCostToNrEvents(turn, {
@@ -971,7 +1101,7 @@ export class NrIngestManager {
971
1101
  companionMode: this.companionMode,
972
1102
  });
973
1103
  for (const event of events) {
974
- this.scheduler.addEvent(event);
1104
+ this.routeEvent(event);
975
1105
  }
976
1106
  }
977
1107
  ingestContextSnapshot(snapshot, topTools) {
@@ -1007,7 +1137,7 @@ export class NrIngestManager {
1007
1137
  nrEvent.repo_url = this.repoUrl;
1008
1138
  if (this.sessionTraceId != null)
1009
1139
  nrEvent.session_id = this.sessionTraceId;
1010
- this.scheduler.addEvent(nrEvent);
1140
+ this.routeEvent(nrEvent);
1011
1141
  }
1012
1142
  ingestBudgetWarning(event) {
1013
1143
  const nrEvent = {
@@ -1032,13 +1162,14 @@ export class NrIngestManager {
1032
1162
  nrEvent.repo_url = this.repoUrl;
1033
1163
  if (this.sessionTraceId != null)
1034
1164
  nrEvent.session_id = this.sessionTraceId;
1035
- this.scheduler.addEvent(nrEvent);
1165
+ this.routeEvent(nrEvent);
1036
1166
  }
1037
1167
  start() {
1038
1168
  if (this.running)
1039
1169
  return;
1040
1170
  this.running = true;
1041
- this.scheduler.start();
1171
+ for (const scheduler of this.schedulers.values())
1172
+ scheduler.start();
1042
1173
  this.logIngest.start();
1043
1174
  // Emit session-level gauges on the metric harvest cadence
1044
1175
  this.sessionGaugeIntervalId = setInterval(() => {
@@ -1057,7 +1188,10 @@ export class NrIngestManager {
1057
1188
  this.sessionGaugeIntervalId = null;
1058
1189
  }
1059
1190
  this.running = false;
1060
- const cleanupPromises = [this.scheduler.stop(), this.logIngest.stop()];
1191
+ const cleanupPromises = [
1192
+ ...[...this.schedulers.values()].map((scheduler) => scheduler.stop()),
1193
+ this.logIngest.stop(),
1194
+ ];
1061
1195
  if (this.otlpTransport) {
1062
1196
  cleanupPromises.push(this.otlpTransport.shutdown());
1063
1197
  }
@@ -1085,7 +1219,7 @@ export class NrIngestManager {
1085
1219
  if (this.repoUrl)
1086
1220
  teamAttrs.repo_url = this.repoUrl;
1087
1221
  const record = (name, value, attrs = {}) => {
1088
- this.scheduler.recordMetric(name, value, sessionId != null ? { session_id: sessionId, ...attrs } : attrs);
1222
+ this.primaryScheduler.recordMetric(name, value, sessionId != null ? { session_id: sessionId, ...attrs } : attrs);
1089
1223
  };
1090
1224
  if (this.trackSessionGauges) {
1091
1225
  const metrics = this.sessionTracker.getMetrics();
@@ -1101,7 +1235,7 @@ export class NrIngestManager {
1101
1235
  this.apiFailureTracker ||
1102
1236
  this.gitEfficiencyTracker) {
1103
1237
  const developer = this.developer;
1104
- const scheduler = this.scheduler;
1238
+ const scheduler = this.primaryScheduler;
1105
1239
  const devAggregator = new DeveloperAttributedMetricAggregator((name, value, attrs) => {
1106
1240
  scheduler.recordMetric(name, value, sessionId != null
1107
1241
  ? { developer, session_id: sessionId, ...teamAttrs, ...attrs }
@@ -1120,30 +1254,33 @@ export class NrIngestManager {
1120
1254
  // Emit aggregated proxy metrics
1121
1255
  const proxyMetrics = this.proxyMetrics.getMetrics();
1122
1256
  for (const [server, stats] of Object.entries(proxyMetrics.perServer)) {
1123
- this.scheduler.recordMetric('ai.mcp.server_call_count', stats.callCount, {
1257
+ this.primaryScheduler.recordMetric('ai.mcp.server_call_count', stats.callCount, {
1124
1258
  server,
1125
1259
  ...teamAttrs,
1126
1260
  });
1127
1261
  if (stats.latencyMs.count > 0) {
1128
1262
  const avg = stats.latencyMs.sum / stats.latencyMs.count;
1129
- this.scheduler.recordMetric('ai.mcp.server_latency_ms', avg, { server, ...teamAttrs });
1263
+ this.primaryScheduler.recordMetric('ai.mcp.server_latency_ms', avg, {
1264
+ server,
1265
+ ...teamAttrs,
1266
+ });
1130
1267
  }
1131
1268
  if (stats.errorRate > 0) {
1132
- this.scheduler.recordMetric('ai.mcp.server_error_rate', stats.errorRate, {
1269
+ this.primaryScheduler.recordMetric('ai.mcp.server_error_rate', stats.errorRate, {
1133
1270
  server,
1134
1271
  ...teamAttrs,
1135
1272
  });
1136
1273
  }
1137
1274
  }
1138
1275
  if (proxyMetrics.avgProxyOverheadMs > 0) {
1139
- this.scheduler.recordMetric('ai.mcp.proxy_overhead_ms', proxyMetrics.avgProxyOverheadMs, {
1276
+ this.primaryScheduler.recordMetric('ai.mcp.proxy_overhead_ms', proxyMetrics.avgProxyOverheadMs, {
1140
1277
  ...teamAttrs,
1141
1278
  });
1142
1279
  }
1143
1280
  // Cap at 100 (tool, server) combinations to stay within NR Metric API cardinality limits.
1144
1281
  const MAX_TOOL_POPULARITY_ENTRIES = 100;
1145
1282
  for (const entry of proxyMetrics.toolPopularity.slice(0, MAX_TOOL_POPULARITY_ENTRIES)) {
1146
- this.scheduler.recordMetric('ai.mcp.tool_popularity', entry.count, {
1283
+ this.primaryScheduler.recordMetric('ai.mcp.tool_popularity', entry.count, {
1147
1284
  tool: entry.tool,
1148
1285
  server: entry.server,
1149
1286
  ...teamAttrs,