@powersync/service-core 0.0.0-dev-20260313100403 → 0.0.0-dev-20260515144844
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.
- package/CHANGELOG.md +86 -7
- package/dist/api/RouteAPI.d.ts +17 -3
- package/dist/api/api-index.d.ts +1 -1
- package/dist/api/api-index.js +1 -1
- package/dist/api/api-index.js.map +1 -1
- package/dist/api/api-metrics.js.map +1 -1
- package/dist/api/diagnostics.d.ts +1 -1
- package/dist/api/diagnostics.js +32 -14
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/auth/CachedKeyCollector.js +1 -1
- package/dist/auth/CachedKeyCollector.js.map +1 -1
- package/dist/auth/CompoundKeyCollector.js.map +1 -1
- package/dist/auth/KeyStore.js.map +1 -1
- package/dist/auth/RemoteJWKSCollector.js.map +1 -1
- package/dist/auth/StaticKeyCollector.d.ts +1 -1
- package/dist/auth/StaticKeyCollector.js.map +1 -1
- package/dist/auth/StaticSupabaseKeyCollector.d.ts +1 -1
- package/dist/auth/StaticSupabaseKeyCollector.js.map +1 -1
- package/dist/entry/commands/compact-action.js +26 -5
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/entry/commands/teardown-action.js +2 -2
- package/dist/entry/commands/teardown-action.js.map +1 -1
- package/dist/entry/entry-index.d.ts +1 -1
- package/dist/entry/entry-index.js +1 -1
- package/dist/entry/entry-index.js.map +1 -1
- package/dist/events/EventsEngine.js +1 -1
- package/dist/events/EventsEngine.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/metrics/MetricsEngine.d.ts +1 -1
- package/dist/metrics/RollingBucketMax.d.ts +28 -0
- package/dist/metrics/RollingBucketMax.js +80 -0
- package/dist/metrics/RollingBucketMax.js.map +1 -0
- package/dist/metrics/metrics-index.d.ts +3 -2
- package/dist/metrics/metrics-index.js +3 -2
- package/dist/metrics/metrics-index.js.map +1 -1
- package/dist/metrics/open-telemetry/util.js +1 -1
- package/dist/metrics/open-telemetry/util.js.map +1 -1
- package/dist/metrics/register-metrics.js +2 -2
- package/dist/metrics/register-metrics.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +2 -2
- package/dist/modules/AbstractModule.js.map +1 -1
- package/dist/modules/modules-index.d.ts +1 -1
- package/dist/modules/modules-index.js +1 -1
- package/dist/modules/modules-index.js.map +1 -1
- package/dist/replication/AbstractReplicationJob.d.ts +2 -2
- package/dist/replication/AbstractReplicationJob.js +1 -1
- package/dist/replication/AbstractReplicationJob.js.map +1 -1
- package/dist/replication/AbstractReplicator.d.ts +7 -7
- package/dist/replication/AbstractReplicator.js +31 -28
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/replication/ReplicationLagTracker.d.ts +50 -0
- package/dist/replication/ReplicationLagTracker.js +78 -0
- package/dist/replication/ReplicationLagTracker.js.map +1 -0
- package/dist/replication/replication-index.d.ts +3 -2
- package/dist/replication/replication-index.js +3 -2
- package/dist/replication/replication-index.js.map +1 -1
- package/dist/replication/replication-metrics.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +59 -32
- package/dist/routes/endpoints/admin.d.ts +108 -54
- package/dist/routes/endpoints/admin.js +7 -3
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js +1 -1
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js +1 -1
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.js +10 -10
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.d.ts +10 -10
- package/dist/routes/endpoints/sync-stream.js +2 -2
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/routes/hooks.js +1 -1
- package/dist/routes/hooks.js.map +1 -1
- package/dist/routes/route-register.js.map +1 -1
- package/dist/runner/teardown.js +4 -4
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +9 -9
- package/dist/storage/BucketStorage.js +9 -9
- package/dist/storage/BucketStorageBatch.d.ts +1 -1
- package/dist/storage/BucketStorageFactory.d.ts +27 -20
- package/dist/storage/BucketStorageFactory.js +19 -16
- package/dist/storage/BucketStorageFactory.js.map +1 -1
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +3 -1
- package/dist/storage/PersistedSyncRulesContent.js +24 -5
- package/dist/storage/PersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/ReplicationEventPayload.d.ts +1 -1
- package/dist/storage/ReportStorage.d.ts +3 -3
- package/dist/storage/SourceTable.d.ts +4 -4
- package/dist/storage/SourceTable.js +3 -3
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/StorageVersionConfig.d.ts +1 -1
- package/dist/storage/StorageVersionConfig.js +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +38 -6
- package/dist/storage/SyncRulesBucketStorage.js +14 -0
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/storage/WriteCheckpointAPI.d.ts +6 -6
- package/dist/storage/WriteCheckpointAPI.js +1 -1
- package/dist/storage/bson.d.ts +0 -1
- package/dist/storage/bson.js +0 -4
- package/dist/storage/bson.js.map +1 -1
- package/dist/storage/storage-index.d.ts +8 -8
- package/dist/storage/storage-index.js +8 -8
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/storage-metrics.js.map +1 -1
- package/dist/streams/streams-index.d.ts +2 -2
- package/dist/streams/streams-index.js +2 -2
- package/dist/streams/streams-index.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +2 -5
- package/dist/sync/BucketChecksumState.js +119 -75
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/RequestTracker.js +1 -1
- package/dist/sync/RequestTracker.js.map +1 -1
- package/dist/sync/sync-index.d.ts +2 -2
- package/dist/sync/sync-index.js +2 -2
- package/dist/sync/sync-index.js.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +1 -1
- package/dist/system/ServiceContext.js +1 -1
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/tracing/PerformanceTracer.d.ts +44 -0
- package/dist/tracing/PerformanceTracer.js +102 -0
- package/dist/tracing/PerformanceTracer.js.map +1 -0
- package/dist/tracing/TraceWriter.d.ts +22 -0
- package/dist/tracing/TraceWriter.js +63 -0
- package/dist/tracing/TraceWriter.js.map +1 -0
- package/dist/util/checkpointing.js +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.d.ts +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.d.ts +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
- package/dist/util/config/compound-config-collector.d.ts +1 -1
- package/dist/util/config/compound-config-collector.js +2 -2
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +1 -1
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
- package/dist/util/config.js +1 -1
- package/dist/util/config.js.map +1 -1
- package/dist/util/env.js +1 -1
- package/dist/util/errors.d.ts +3 -0
- package/dist/util/errors.js +15 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/protocol-types.d.ts +3 -3
- package/dist/util/protocol-types.js +1 -1
- package/dist/util/util-index.d.ts +1 -1
- package/dist/util/util-index.js +1 -1
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/utils.d.ts +1 -1
- package/package.json +11 -11
- package/src/api/RouteAPI.ts +20 -3
- package/src/api/api-index.ts +1 -1
- package/src/api/api-metrics.ts +1 -1
- package/src/api/diagnostics.ts +42 -20
- package/src/auth/CachedKeyCollector.ts +2 -3
- package/src/auth/CompoundKeyCollector.ts +2 -3
- package/src/auth/KeyStore.ts +1 -1
- package/src/auth/RemoteJWKSCollector.ts +0 -1
- package/src/auth/StaticKeyCollector.ts +1 -1
- package/src/auth/StaticSupabaseKeyCollector.ts +1 -1
- package/src/entry/commands/compact-action.ts +29 -5
- package/src/entry/commands/teardown-action.ts +2 -2
- package/src/entry/entry-index.ts +1 -1
- package/src/events/EventsEngine.ts +1 -1
- package/src/index.ts +2 -0
- package/src/metrics/MetricsEngine.ts +1 -1
- package/src/metrics/RollingBucketMax.ts +109 -0
- package/src/metrics/metrics-index.ts +3 -2
- package/src/metrics/open-telemetry/util.ts +1 -1
- package/src/metrics/register-metrics.ts +3 -3
- package/src/modules/AbstractModule.ts +2 -2
- package/src/modules/modules-index.ts +1 -1
- package/src/replication/AbstractReplicationJob.ts +3 -3
- package/src/replication/AbstractReplicator.ts +32 -30
- package/src/replication/ReplicationLagTracker.ts +86 -0
- package/src/replication/replication-index.ts +3 -2
- package/src/replication/replication-metrics.ts +1 -1
- package/src/routes/endpoints/admin.ts +7 -3
- package/src/routes/endpoints/checkpointing.ts +1 -1
- package/src/routes/endpoints/socket-route.ts +1 -1
- package/src/routes/endpoints/sync-rules.ts +10 -12
- package/src/routes/endpoints/sync-stream.ts +2 -2
- package/src/routes/hooks.ts +2 -2
- package/src/routes/route-register.ts +2 -10
- package/src/runner/teardown.ts +4 -4
- package/src/storage/BucketStorage.ts +9 -9
- package/src/storage/BucketStorageBatch.ts +1 -1
- package/src/storage/BucketStorageFactory.ts +45 -34
- package/src/storage/ChecksumCache.ts +1 -1
- package/src/storage/PersistedSyncRulesContent.ts +30 -6
- package/src/storage/ReplicationEventPayload.ts +1 -1
- package/src/storage/ReportStorage.ts +3 -3
- package/src/storage/SourceTable.ts +4 -4
- package/src/storage/StorageVersionConfig.ts +1 -1
- package/src/storage/SyncRulesBucketStorage.ts +46 -7
- package/src/storage/WriteCheckpointAPI.ts +6 -6
- package/src/storage/bson.ts +0 -5
- package/src/storage/storage-index.ts +8 -8
- package/src/storage/storage-metrics.ts +2 -2
- package/src/streams/streams-index.ts +2 -2
- package/src/sync/BucketChecksumState.ts +141 -93
- package/src/sync/RequestTracker.ts +1 -1
- package/src/sync/sync-index.ts +2 -2
- package/src/sync/sync.ts +2 -8
- package/src/sync/util.ts +1 -1
- package/src/system/ServiceContext.ts +1 -1
- package/src/tracing/PerformanceTracer.ts +126 -0
- package/src/tracing/TraceWriter.ts +67 -0
- package/src/util/checkpointing.ts +1 -1
- package/src/util/config/collectors/impl/base64-config-collector.ts +1 -1
- package/src/util/config/collectors/impl/filesystem-config-collector.ts +2 -2
- package/src/util/config/compound-config-collector.ts +3 -3
- package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +1 -1
- package/src/util/config/sync-rules/sync-rules-provider.ts +1 -1
- package/src/util/config.ts +1 -1
- package/src/util/env.ts +1 -1
- package/src/util/errors.ts +21 -0
- package/src/util/protocol-types.ts +1 -1
- package/src/util/util-index.ts +1 -1
- package/src/util/utils.ts +1 -1
- package/test/src/ReplicationLagTracker.test.ts +53 -0
- package/test/src/RollingBucketMax.test.ts +106 -0
- package/test/src/auth.test.ts +115 -7
- package/test/src/diagnostics.test.ts +151 -0
- package/test/src/module-loader.test.ts +1 -1
- package/test/src/routes/mocks.ts +1 -1
- package/test/src/routes/stream.test.ts +1 -2
- package/test/src/sync/BucketChecksumState.test.ts +223 -67
- package/test/src/util/protocol_types.test.ts +1 -1
- package/test/tsconfig.json +0 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Counter,
|
|
1
|
+
import { Counter, MetricMetadata, MetricsFactory, ObservableGauge, UpDownCounter } from './metrics-interfaces.js';
|
|
2
2
|
export interface MetricsEngineOptions {
|
|
3
3
|
factory: MetricsFactory;
|
|
4
4
|
disable_telemetry_sharing: boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface RollingBucketMaxOptions {
|
|
2
|
+
bucketSizeMs?: number;
|
|
3
|
+
windowSizeMs?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Tracks a rolling max over a fixed number of time buckets.
|
|
7
|
+
*
|
|
8
|
+
* The window is bucket-aligned: with the default 30s window and 5s buckets,
|
|
9
|
+
* the rolling max covers the current 5s bucket plus the previous 5 buckets.
|
|
10
|
+
*/
|
|
11
|
+
export declare class RollingBucketMax {
|
|
12
|
+
private readonly bucketSizeMs;
|
|
13
|
+
private readonly bucketCount;
|
|
14
|
+
private readonly buckets;
|
|
15
|
+
constructor(options?: RollingBucketMaxOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Reports a new observed value into the bucket for the provided timestamp.
|
|
18
|
+
*/
|
|
19
|
+
report(value: number | undefined, timestampMs?: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* Returns the maximum value across the current bucket and prior buckets still
|
|
22
|
+
* inside the rolling window, or undefined when the window has no samples.
|
|
23
|
+
*/
|
|
24
|
+
getRollingMax(timestampMs?: number): number | undefined;
|
|
25
|
+
private getBucketId;
|
|
26
|
+
private getBucket;
|
|
27
|
+
private assertFiniteNumber;
|
|
28
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks a rolling max over a fixed number of time buckets.
|
|
3
|
+
*
|
|
4
|
+
* The window is bucket-aligned: with the default 30s window and 5s buckets,
|
|
5
|
+
* the rolling max covers the current 5s bucket plus the previous 5 buckets.
|
|
6
|
+
*/
|
|
7
|
+
export class RollingBucketMax {
|
|
8
|
+
bucketSizeMs;
|
|
9
|
+
bucketCount;
|
|
10
|
+
// Fixed-size ring buffer keyed by bucket id modulo bucketCount.
|
|
11
|
+
buckets;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.bucketSizeMs = options.bucketSizeMs ?? 5_000;
|
|
14
|
+
const windowSizeMs = options.windowSizeMs ?? 30_000;
|
|
15
|
+
if (!Number.isInteger(this.bucketSizeMs) || this.bucketSizeMs <= 0) {
|
|
16
|
+
throw new Error('bucketSizeMs must be a positive integer.');
|
|
17
|
+
}
|
|
18
|
+
if (!Number.isInteger(windowSizeMs) || windowSizeMs <= 0) {
|
|
19
|
+
throw new Error('windowSizeMs must be a positive integer.');
|
|
20
|
+
}
|
|
21
|
+
if (windowSizeMs % this.bucketSizeMs !== 0) {
|
|
22
|
+
throw new Error('windowSizeMs must be an exact multiple of bucketSizeMs.');
|
|
23
|
+
}
|
|
24
|
+
this.bucketCount = windowSizeMs / this.bucketSizeMs;
|
|
25
|
+
this.buckets = Array.from({ length: this.bucketCount }, () => ({
|
|
26
|
+
id: Number.NaN,
|
|
27
|
+
max: undefined
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reports a new observed value into the bucket for the provided timestamp.
|
|
32
|
+
*/
|
|
33
|
+
report(value, timestampMs = Date.now()) {
|
|
34
|
+
if (value == null) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this.assertFiniteNumber(value, 'value');
|
|
38
|
+
this.assertFiniteNumber(timestampMs, 'timestampMs');
|
|
39
|
+
const bucket = this.getBucket(this.getBucketId(timestampMs));
|
|
40
|
+
bucket.max = bucket.max === undefined ? value : Math.max(bucket.max, value);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns the maximum value across the current bucket and prior buckets still
|
|
44
|
+
* inside the rolling window, or undefined when the window has no samples.
|
|
45
|
+
*/
|
|
46
|
+
getRollingMax(timestampMs = Date.now()) {
|
|
47
|
+
this.assertFiniteNumber(timestampMs, 'timestampMs');
|
|
48
|
+
const currentBucketId = this.getBucketId(timestampMs);
|
|
49
|
+
const minimumBucketId = currentBucketId - this.bucketCount + 1;
|
|
50
|
+
let rollingMax;
|
|
51
|
+
for (const bucket of this.buckets) {
|
|
52
|
+
if (bucket.max === undefined) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (bucket.id < minimumBucketId || bucket.id > currentBucketId) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
rollingMax = rollingMax === undefined ? bucket.max : Math.max(rollingMax, bucket.max);
|
|
59
|
+
}
|
|
60
|
+
return rollingMax;
|
|
61
|
+
}
|
|
62
|
+
getBucketId(timestampMs) {
|
|
63
|
+
return Math.floor(timestampMs / this.bucketSizeMs);
|
|
64
|
+
}
|
|
65
|
+
getBucket(bucketId) {
|
|
66
|
+
const index = ((bucketId % this.bucketCount) + this.bucketCount) % this.bucketCount;
|
|
67
|
+
const bucket = this.buckets[index];
|
|
68
|
+
if (bucket.id !== bucketId) {
|
|
69
|
+
bucket.id = bucketId;
|
|
70
|
+
bucket.max = undefined;
|
|
71
|
+
}
|
|
72
|
+
return bucket;
|
|
73
|
+
}
|
|
74
|
+
assertFiniteNumber(value, name) {
|
|
75
|
+
if (!Number.isFinite(value)) {
|
|
76
|
+
throw new Error(`${name} must be a finite number.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=RollingBucketMax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RollingBucketMax.js","sourceRoot":"","sources":["../../src/metrics/RollingBucketMax.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export * from './MetricsEngine.js';
|
|
2
1
|
export * from './metrics-interfaces.js';
|
|
3
|
-
export * from './
|
|
2
|
+
export * from './MetricsEngine.js';
|
|
4
3
|
export * from './open-telemetry/OpenTelemetryMetricsFactory.js';
|
|
5
4
|
export * from './open-telemetry/util.js';
|
|
5
|
+
export * from './register-metrics.js';
|
|
6
|
+
export * from './RollingBucketMax.js';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export * from './MetricsEngine.js';
|
|
2
1
|
export * from './metrics-interfaces.js';
|
|
3
|
-
export * from './
|
|
2
|
+
export * from './MetricsEngine.js';
|
|
4
3
|
export * from './open-telemetry/OpenTelemetryMetricsFactory.js';
|
|
5
4
|
export * from './open-telemetry/util.js';
|
|
5
|
+
export * from './register-metrics.js';
|
|
6
|
+
export * from './RollingBucketMax.js';
|
|
6
7
|
//# sourceMappingURL=metrics-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-index.js","sourceRoot":"","sources":["../../src/metrics/metrics-index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"metrics-index.js","sourceRoot":"","sources":["../../src/metrics/metrics-index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iDAAiD,CAAC;AAChE,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC"}
|
|
@@ -3,8 +3,8 @@ import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
|
|
|
3
3
|
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
|
4
4
|
import { logger } from '@powersync/lib-services-framework';
|
|
5
5
|
import { OpenTelemetryMetricsFactory } from './OpenTelemetryMetricsFactory.js';
|
|
6
|
-
import pkg from '../../../package.json' with { type: 'json' };
|
|
7
6
|
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
7
|
+
import pkg from '../../../package.json' with { type: 'json' };
|
|
8
8
|
export function createOpenTelemetryMetricsFactory(context) {
|
|
9
9
|
const { configuration, lifeCycleEngine, storageEngine } = context;
|
|
10
10
|
const configuredExporters = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAgB,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createOpenTelemetryMetricsFactory } from './open-telemetry/util.js';
|
|
2
|
-
import { MetricsEngine } from './MetricsEngine.js';
|
|
3
1
|
import { createCoreAPIMetrics, initializeCoreAPIMetrics } from '../api/api-metrics.js';
|
|
4
2
|
import { createCoreReplicationMetrics, initializeCoreReplicationMetrics } from '../replication/replication-metrics.js';
|
|
5
3
|
import { createCoreStorageMetrics, initializeCoreStorageMetrics } from '../storage/storage-metrics.js';
|
|
4
|
+
import { MetricsEngine } from './MetricsEngine.js';
|
|
5
|
+
import { createOpenTelemetryMetricsFactory } from './open-telemetry/util.js';
|
|
6
6
|
export var MetricModes;
|
|
7
7
|
(function (MetricModes) {
|
|
8
8
|
MetricModes["API"] = "api";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-metrics.js","sourceRoot":"","sources":["../../src/metrics/register-metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register-metrics.js","sourceRoot":"","sources":["../../src/metrics/register-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACvH,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAEvG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,0BAAW,CAAA;IACX,0CAA2B,CAAA;IAC3B,kCAAmB,CAAA;AACrB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAOD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAAmC,EAAE,EAAE;IAC3E,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE3C,MAAM,cAAc,GAAG,iCAAiC,CAAC,eAAe,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;QACtC,OAAO,EAAE,cAAc;QACvB,yBAAyB,EAAE,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,yBAAyB;KAC7F,CAAC,CAAC;IACH,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAEvD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACpC,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,4BAA4B,CAAC,aAAa,CAAC,CAAC;QAC5C,gCAAgC,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAExC,gGAAgG;QAChG,eAAe,CAAC,aAAa,CAAC,gBAAgB,CAAC;YAC7C,gBAAgB,EAAE,CAAC,aAAa,EAAE,EAAE;gBAClC,4BAA4B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,EAAE;QAC3D,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE;KACrC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
2
1
|
import winston from 'winston';
|
|
3
2
|
import { PersistedSyncRulesContent } from '../storage/storage-index.js';
|
|
3
|
+
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
4
4
|
export interface TearDownOptions {
|
|
5
5
|
/**
|
|
6
|
-
* If required, tear down any configuration/state for the specific
|
|
6
|
+
* If required, tear down any configuration/state for the specific replication stream
|
|
7
7
|
*/
|
|
8
8
|
syncRules?: PersistedSyncRulesContent[];
|
|
9
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractModule.js","sourceRoot":"","sources":["../../src/modules/AbstractModule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AbstractModule.js","sourceRoot":"","sources":["../../src/modules/AbstractModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAgB3D,MAAM,OAAgB,cAAc;IAGF;IAFtB,MAAM,CAAiB;IAEjC,YAAgC,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAYD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules-index.js","sourceRoot":"","sources":["../../src/modules/modules-index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"modules-index.js","sourceRoot":"","sources":["../../src/modules/modules-index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
+
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
2
3
|
import * as storage from '../storage/storage-index.js';
|
|
3
4
|
import { ErrorRateLimiter } from './ErrorRateLimiter.js';
|
|
4
|
-
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
5
5
|
export interface AbstractReplicationJobOptions {
|
|
6
6
|
id: string;
|
|
7
7
|
storage: storage.SyncRulesBucketStorage;
|
|
@@ -39,5 +39,5 @@ export declare abstract class AbstractReplicationJob {
|
|
|
39
39
|
/**
|
|
40
40
|
* Get replication lag for this job in ms.
|
|
41
41
|
*/
|
|
42
|
-
abstract getReplicationLagMillis():
|
|
42
|
+
abstract getReplicationLagMillis(): number | undefined;
|
|
43
43
|
}
|
|
@@ -30,7 +30,7 @@ export class AbstractReplicationJob {
|
|
|
30
30
|
* Safely stop the replication process
|
|
31
31
|
*/
|
|
32
32
|
async stop() {
|
|
33
|
-
this.logger.info(`Stopping replication job
|
|
33
|
+
this.logger.info(`Stopping replication job`);
|
|
34
34
|
this.abortController.abort();
|
|
35
35
|
await this.isReplicatingPromise;
|
|
36
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractReplicationJob.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicationJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AActE,MAAM,OAAgB,sBAAsB;IAKV;IAJtB,MAAM,CAAiB;IACvB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,oBAAoB,GAAyB,IAAI,CAAC;IAE5D,YAAgC,OAAsC;QAAtC,YAAO,GAAP,OAAO,CAA+B;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAYD;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,EAAE;aACzC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YACZ,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE;gBACtC,QAAQ,EAAE;oBACR,UAAU,EAAE,IAAI,CAAC,EAAE;iBACpB;aACF,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC;aACD,OAAO,CAAC,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"AbstractReplicationJob.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicationJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AActE,MAAM,OAAgB,sBAAsB;IAKV;IAJtB,MAAM,CAAiB;IACvB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,oBAAoB,GAAyB,IAAI,CAAC;IAE5D,YAAgC,OAAsC;QAAtC,YAAO,GAAP,OAAO,CAA+B;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAYD;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,EAAE;aACzC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;YACZ,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE;gBACtC,QAAQ,EAAE;oBACR,UAAU,EAAE,IAAI,CAAC,EAAE;iBACpB;aACF,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC;aACD,OAAO,CAAC,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,oBAAoB,CAAC;IAClC,CAAC;IAED,IAAW,EAAE;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAc,IAAI;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,IAAc,WAAW;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7C,CAAC;CAMF"}
|
|
@@ -23,19 +23,19 @@ export interface AbstractReplicatorOptions {
|
|
|
23
23
|
/**
|
|
24
24
|
* A replicator manages the mechanics for replicating data from a data source to a storage bucket.
|
|
25
25
|
* This includes copying across the original data set and then keeping it in sync with the data source using Replication Jobs.
|
|
26
|
-
* It also handles any changes to the sync
|
|
26
|
+
* It also handles any changes to the sync config.
|
|
27
27
|
*/
|
|
28
28
|
export declare abstract class AbstractReplicator<T extends AbstractReplicationJob = AbstractReplicationJob> {
|
|
29
29
|
private options;
|
|
30
30
|
protected logger: winston.Logger;
|
|
31
31
|
private lockAlerted;
|
|
32
32
|
/**
|
|
33
|
-
* Map of replication jobs by
|
|
34
|
-
* transitioning to a new
|
|
33
|
+
* Map of replication jobs by replication stream id. Usually there is only one running job, but there could be two when
|
|
34
|
+
* transitioning to a new replication stream.
|
|
35
35
|
*/
|
|
36
36
|
private replicationJobs;
|
|
37
37
|
/**
|
|
38
|
-
* Map of
|
|
38
|
+
* Map of replciation stream ids to promises that are clearing the replication stream.
|
|
39
39
|
*
|
|
40
40
|
* We primarily do this to keep track of what we're currently clearing, but don't currently
|
|
41
41
|
* use the Promise value.
|
|
@@ -50,8 +50,8 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
50
50
|
protected constructor(options: AbstractReplicatorOptions);
|
|
51
51
|
abstract createJob(options: CreateJobOptions): T;
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
53
|
+
* Clean up any configuration or state for the specified replication stream on the datasource.
|
|
54
|
+
* Should be a no-op if the replication stream has already been cleared
|
|
55
55
|
*/
|
|
56
56
|
abstract cleanUp(syncRuleStorage: storage.SyncRulesBucketStorage): Promise<void>;
|
|
57
57
|
get id(): string;
|
|
@@ -85,5 +85,5 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
85
85
|
*
|
|
86
86
|
* "processing" replication streams are not taken into account for this metric.
|
|
87
87
|
*/
|
|
88
|
-
getReplicationLagMillis():
|
|
88
|
+
getReplicationLagMillis(): number | undefined;
|
|
89
89
|
}
|
|
@@ -7,19 +7,19 @@ const PING_INTERVAL = 1000000000n * 60n;
|
|
|
7
7
|
/**
|
|
8
8
|
* A replicator manages the mechanics for replicating data from a data source to a storage bucket.
|
|
9
9
|
* This includes copying across the original data set and then keeping it in sync with the data source using Replication Jobs.
|
|
10
|
-
* It also handles any changes to the sync
|
|
10
|
+
* It also handles any changes to the sync config.
|
|
11
11
|
*/
|
|
12
12
|
export class AbstractReplicator {
|
|
13
13
|
options;
|
|
14
14
|
logger;
|
|
15
15
|
lockAlerted = false;
|
|
16
16
|
/**
|
|
17
|
-
* Map of replication jobs by
|
|
18
|
-
* transitioning to a new
|
|
17
|
+
* Map of replication jobs by replication stream id. Usually there is only one running job, but there could be two when
|
|
18
|
+
* transitioning to a new replication stream.
|
|
19
19
|
*/
|
|
20
20
|
replicationJobs = new Map();
|
|
21
21
|
/**
|
|
22
|
-
* Map of
|
|
22
|
+
* Map of replciation stream ids to promises that are clearing the replication stream.
|
|
23
23
|
*
|
|
24
24
|
* We primarily do this to keep track of what we're currently clearing, but don't currently
|
|
25
25
|
* use the Promise value.
|
|
@@ -57,22 +57,25 @@ export class AbstractReplicator {
|
|
|
57
57
|
async start() {
|
|
58
58
|
this.abortController = new AbortController();
|
|
59
59
|
this.runLoop().catch((e) => {
|
|
60
|
-
this.logger.error('
|
|
60
|
+
this.logger.error('Fatal replication error', e);
|
|
61
61
|
container.reporter.captureException(e);
|
|
62
62
|
setTimeout(() => {
|
|
63
63
|
process.exit(1);
|
|
64
64
|
}, 1000);
|
|
65
65
|
});
|
|
66
66
|
this.metrics.getObservableGauge(ReplicationMetric.REPLICATION_LAG_SECONDS).setValueProvider(async () => {
|
|
67
|
-
|
|
67
|
+
try {
|
|
68
|
+
const lag = this.getReplicationLagMillis();
|
|
69
|
+
if (lag == null) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
// ms to seconds
|
|
73
|
+
return Math.round(lag / 1000);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
68
76
|
this.logger.error('Failed to get replication lag', e);
|
|
69
77
|
return undefined;
|
|
70
|
-
});
|
|
71
|
-
if (lag == null) {
|
|
72
|
-
return undefined;
|
|
73
78
|
}
|
|
74
|
-
// ms to seconds
|
|
75
|
-
return Math.round(lag / 1000);
|
|
76
79
|
});
|
|
77
80
|
}
|
|
78
81
|
async stop() {
|
|
@@ -87,9 +90,9 @@ export class AbstractReplicator {
|
|
|
87
90
|
const syncRules = await this.syncRuleProvider.get();
|
|
88
91
|
let configuredLock = undefined;
|
|
89
92
|
if (syncRules != null) {
|
|
90
|
-
this.logger.info('Loaded sync
|
|
93
|
+
this.logger.info('Loaded sync config');
|
|
91
94
|
try {
|
|
92
|
-
// Configure new sync
|
|
95
|
+
// Configure new sync config, if they have changed.
|
|
93
96
|
// In that case, also immediately take out a lock, so that another process doesn't start replication on it.
|
|
94
97
|
const { lock } = await this.storage.configureSyncRules(storage.updateSyncRulesFromYaml(syncRules, { lock: true, validate: this.syncRuleProvider.exitOnError }));
|
|
95
98
|
if (lock) {
|
|
@@ -99,12 +102,12 @@ export class AbstractReplicator {
|
|
|
99
102
|
catch (e) {
|
|
100
103
|
// Log and re-raise to exit.
|
|
101
104
|
// Should only reach this due to validation errors if exit_on_error is true.
|
|
102
|
-
this.logger.error(`Failed to update sync
|
|
105
|
+
this.logger.error(`Failed to update sync config`, e);
|
|
103
106
|
throw e;
|
|
104
107
|
}
|
|
105
108
|
}
|
|
106
109
|
else {
|
|
107
|
-
this.logger.info('No sync rules configured - configure via API');
|
|
110
|
+
this.logger.info('No sync streams or rules configured - configure via API');
|
|
108
111
|
}
|
|
109
112
|
while (!this.stopped) {
|
|
110
113
|
await container.probes.touch();
|
|
@@ -155,7 +158,7 @@ export class AbstractReplicator {
|
|
|
155
158
|
existingJobs.delete(syncRules.id);
|
|
156
159
|
}
|
|
157
160
|
else {
|
|
158
|
-
// New sync
|
|
161
|
+
// New sync config was found (or resume after restart)
|
|
159
162
|
try {
|
|
160
163
|
let lock;
|
|
161
164
|
if (configuredLock?.sync_rules_id == syncRules.id) {
|
|
@@ -179,23 +182,23 @@ export class AbstractReplicator {
|
|
|
179
182
|
catch (e) {
|
|
180
183
|
if (e?.errorData?.code === ErrorCode.PSYNC_S1003) {
|
|
181
184
|
if (!this.lockAlerted) {
|
|
182
|
-
|
|
185
|
+
syncRules.logger.info(`[${e.errorData.code}] ${e.errorData.description}`);
|
|
183
186
|
this.lockAlerted = true;
|
|
184
187
|
}
|
|
185
188
|
}
|
|
186
189
|
else {
|
|
187
|
-
// Could be a sync
|
|
190
|
+
// Could be a sync config parse error,
|
|
188
191
|
// for example from stricter validation that was added.
|
|
189
192
|
// This will be retried every couple of seconds.
|
|
190
|
-
// When new (valid) sync
|
|
191
|
-
|
|
193
|
+
// When new (valid) sync config is deployed and processed, this one be disabled.
|
|
194
|
+
syncRules.logger.error('Failed to start replication for new sync config', e);
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
197
|
}
|
|
195
198
|
}
|
|
196
199
|
this.replicationJobs = newJobs;
|
|
197
200
|
this.activeReplicationJob = activeJob;
|
|
198
|
-
// Stop any orphaned jobs that no longer have
|
|
201
|
+
// Stop any orphaned jobs that no longer have a replication stream.
|
|
199
202
|
// Termination happens below
|
|
200
203
|
for (let job of existingJobs.values()) {
|
|
201
204
|
// Old - stop and clean up
|
|
@@ -204,10 +207,10 @@ export class AbstractReplicator {
|
|
|
204
207
|
}
|
|
205
208
|
catch (e) {
|
|
206
209
|
// This will be retried
|
|
207
|
-
|
|
210
|
+
job.storage.logger.warn('Failed to stop old replication job', e);
|
|
208
211
|
}
|
|
209
212
|
}
|
|
210
|
-
//
|
|
213
|
+
// Replication stream stopped previously, including by a different process.
|
|
211
214
|
const stopped = await this.storage.getStoppedSyncRules();
|
|
212
215
|
for (let syncRules of stopped) {
|
|
213
216
|
if (this.clearingJobs.has(syncRules.id)) {
|
|
@@ -216,11 +219,11 @@ export class AbstractReplicator {
|
|
|
216
219
|
}
|
|
217
220
|
// We clear storage asynchronously.
|
|
218
221
|
// It is important to be able to continue running the refresh loop, otherwise we cannot
|
|
219
|
-
// retry locked
|
|
222
|
+
// retry locked replication stream, for example.
|
|
220
223
|
const syncRuleStorage = this.storage.getInstance(syncRules, { skipLifecycleHooks: true });
|
|
221
224
|
const promise = this.terminateSyncRules(syncRuleStorage)
|
|
222
225
|
.catch((e) => {
|
|
223
|
-
|
|
226
|
+
syncRuleStorage.logger.warn(`Failed clean up replication config`, e);
|
|
224
227
|
})
|
|
225
228
|
.finally(() => {
|
|
226
229
|
this.clearingJobs.delete(syncRules.id);
|
|
@@ -232,12 +235,12 @@ export class AbstractReplicator {
|
|
|
232
235
|
return `${this.id}-${syncRuleId}`;
|
|
233
236
|
}
|
|
234
237
|
async terminateSyncRules(syncRuleStorage) {
|
|
235
|
-
|
|
238
|
+
syncRuleStorage.logger.info(`Terminating replication stream...`);
|
|
236
239
|
// This deletes postgres replication slots - should complete quickly.
|
|
237
240
|
// It is safe to do before or after clearing the data in the storage.
|
|
238
241
|
await this.cleanUp(syncRuleStorage);
|
|
239
242
|
await syncRuleStorage.terminate({ signal: this.abortController?.signal, clearStorage: true });
|
|
240
|
-
|
|
243
|
+
syncRuleStorage.logger.info(`Successfully terminated replication stream`);
|
|
241
244
|
}
|
|
242
245
|
/**
|
|
243
246
|
* Measure replication lag in milliseconds.
|
|
@@ -257,7 +260,7 @@ export class AbstractReplicator {
|
|
|
257
260
|
*
|
|
258
261
|
* "processing" replication streams are not taken into account for this metric.
|
|
259
262
|
*/
|
|
260
|
-
|
|
263
|
+
getReplicationLagMillis() {
|
|
261
264
|
return this.activeReplicationJob?.getReplicationLagMillis();
|
|
262
265
|
}
|
|
263
266
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAOvD,WAAW;AACX,MAAM,aAAa,GAAG,WAAc,GAAG,GAAG,CAAC;AAkB3C;;;;GAIG;AACH,MAAM,OAAgB,kBAAkB;IA2BR;IA1BpB,MAAM,CAAiB;IACzB,WAAW,GAAY,KAAK,CAAC;IACrC;;;OAGG;IACK,eAAe,GAAG,IAAI,GAAG,EAAa,CAAC;IAE/C;;;;;OAKG;IACK,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IAExD;;OAEG;IACK,oBAAoB,GAAkB,SAAS,CAAC;IAExD,wDAAwD;IAChD,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAE3B,eAAe,CAA8B;IAErD,YAA8B,OAAkC;QAAlC,YAAO,GAAP,OAAO,CAA2B;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAUD,IAAW,EAAE;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAc,OAAO;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC;IACxD,CAAC;IAED,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACvC,CAAC;IAED,IAAc,WAAW;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC,CAAC;IAED,IAAc,OAAO;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC,CAAC;IAED,IAAc,OAAO;QACnB,OAAO,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks replication lag across the current in-flight transaction and a rolling
|
|
3
|
+
* max of recently observed lag values.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ReplicationLagTracker {
|
|
6
|
+
private readonly rollingReplicationLag;
|
|
7
|
+
private _oldestUncommittedChange;
|
|
8
|
+
private _isStartingReplication;
|
|
9
|
+
/**
|
|
10
|
+
* The oldest source timestamp still part of the current in-flight work.
|
|
11
|
+
*/
|
|
12
|
+
get oldestUncommittedChange(): Date | null;
|
|
13
|
+
/**
|
|
14
|
+
* True until replication has seen its first completed commit or equivalent keepalive.
|
|
15
|
+
*/
|
|
16
|
+
get isStartingReplication(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Registers the first source timestamp for the current in-flight work,
|
|
19
|
+
* for example the start of a transaction
|
|
20
|
+
*/
|
|
21
|
+
trackUncommittedChange(timestamp: Date | null | undefined): void;
|
|
22
|
+
/**
|
|
23
|
+
* Clears the current in-flight timestamp without changing startup state.
|
|
24
|
+
*/
|
|
25
|
+
clearUncommittedChange(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Marks replication as started even if no committed transaction lag was recorded.
|
|
28
|
+
*/
|
|
29
|
+
markStarted(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Mark the current pending changes as "committed".
|
|
32
|
+
*
|
|
33
|
+
* Records the current in-flight lag into the rolling window and clears it.
|
|
34
|
+
* The current lag is calculated as the differnence between current time and the oldest change,
|
|
35
|
+
* as marked by trackUncommittedChange.
|
|
36
|
+
*/
|
|
37
|
+
markCommitted(timestampMs?: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the lag for the current in-flight work.
|
|
40
|
+
*
|
|
41
|
+
* 0 if idle (no pending changes to replicate).
|
|
42
|
+
*
|
|
43
|
+
* undefined when replication is still starting up.
|
|
44
|
+
*/
|
|
45
|
+
getCurrentLagMillis(timestampMs?: number): number | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Returns the rolling lag metric value, including the current in-flight lag when present.
|
|
48
|
+
*/
|
|
49
|
+
getLagMillis(timestampMs?: number): number | undefined;
|
|
50
|
+
}
|