@noego/telemetry 0.0.1
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/README.md +130 -0
- package/dist/browser/index.cjs +1346 -0
- package/dist/browser/index.cjs.map +1 -0
- package/dist/browser/index.d.cts +5 -0
- package/dist/browser/index.d.ts +5 -0
- package/dist/browser/index.js +1318 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser_telemetry_client-BzBPQm4m.d.cts +29 -0
- package/dist/browser_telemetry_client-Ch_VzwEa.d.ts +29 -0
- package/dist/cli/telemetry_bin.cjs +5531 -0
- package/dist/cli/telemetry_bin.cjs.map +1 -0
- package/dist/cli/telemetry_bin.d.cts +1 -0
- package/dist/cli/telemetry_bin.d.ts +1 -0
- package/dist/cli/telemetry_bin.js +5517 -0
- package/dist/cli/telemetry_bin.js.map +1 -0
- package/dist/cli/telemetry_cli.cjs +5523 -0
- package/dist/cli/telemetry_cli.cjs.map +1 -0
- package/dist/cli/telemetry_cli.d.cts +92 -0
- package/dist/cli/telemetry_cli.d.ts +92 -0
- package/dist/cli/telemetry_cli.js +5497 -0
- package/dist/cli/telemetry_cli.js.map +1 -0
- package/dist/client_defaults-B5tC-TgG.d.ts +8 -0
- package/dist/client_defaults-C9LnSX4j.d.cts +8 -0
- package/dist/core/index.cjs +2354 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +168 -0
- package/dist/core/index.d.ts +168 -0
- package/dist/core/index.js +2318 -0
- package/dist/core/index.js.map +1 -0
- package/dist/electron/index.cjs +1379 -0
- package/dist/electron/index.cjs.map +1 -0
- package/dist/electron/index.d.cts +31 -0
- package/dist/electron/index.d.ts +31 -0
- package/dist/electron/index.js +1353 -0
- package/dist/electron/index.js.map +1 -0
- package/dist/envelope.types-rOLpWXRC.d.cts +42 -0
- package/dist/envelope.types-rOLpWXRC.d.ts +42 -0
- package/dist/in_memory_batch_transport-DKW9EZnU.d.cts +16 -0
- package/dist/in_memory_batch_transport-oOwNxXnA.d.ts +16 -0
- package/dist/index.cjs +3325 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +66 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +3285 -0
- package/dist/index.js.map +1 -0
- package/dist/maintenance_coordinator.types-B-bZUNvw.d.cts +127 -0
- package/dist/maintenance_coordinator.types-CBA5y74b.d.ts +127 -0
- package/dist/metric_definition_contract-BR6a_GzF.d.cts +12 -0
- package/dist/metric_definition_contract-l4i4SaAp.d.ts +12 -0
- package/dist/node/index.cjs +7157 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +74 -0
- package/dist/node/index.d.ts +74 -0
- package/dist/node/index.js +7122 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/producer/index.cjs +1322 -0
- package/dist/node/producer/index.cjs.map +1 -0
- package/dist/node/producer/index.d.cts +21 -0
- package/dist/node/producer/index.d.ts +21 -0
- package/dist/node/producer/index.js +1294 -0
- package/dist/node/producer/index.js.map +1 -0
- package/dist/query.types-Bntwh6KF.d.cts +186 -0
- package/dist/query.types-DySoqYop.d.ts +186 -0
- package/dist/result.types-171Huujb.d.cts +9 -0
- package/dist/result.types-171Huujb.d.ts +9 -0
- package/dist/sqlite/index.cjs +3409 -0
- package/dist/sqlite/index.cjs.map +1 -0
- package/dist/sqlite/index.d.cts +77 -0
- package/dist/sqlite/index.d.ts +77 -0
- package/dist/sqlite/index.js +3382 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/storage.types-BTCGVxOM.d.ts +76 -0
- package/dist/storage.types-DjuUMinz.d.cts +76 -0
- package/dist/telemetry_client-BXw8WH_F.d.ts +141 -0
- package/dist/telemetry_client-CYaPYfOl.d.cts +141 -0
- package/dist/telemetry_configuration_parser-C7Et_gwG.d.ts +39 -0
- package/dist/telemetry_configuration_parser-R-niZQRZ.d.cts +39 -0
- package/dist/testing/index.cjs +215 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +32 -0
- package/dist/testing/index.d.ts +32 -0
- package/dist/testing/index.js +187 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/trace-adapter/index.cjs +1034 -0
- package/dist/trace-adapter/index.cjs.map +1 -0
- package/dist/trace-adapter/index.d.cts +72 -0
- package/dist/trace-adapter/index.d.ts +72 -0
- package/dist/trace-adapter/index.js +1007 -0
- package/dist/trace-adapter/index.js.map +1 -0
- package/dist/transport.types-BAl_TRtU.d.cts +99 -0
- package/dist/transport.types-DDnZoKWi.d.ts +99 -0
- package/migrations/1783695629569_raw_events.down.sql +1 -0
- package/migrations/1783695629569_raw_events.up.sql +30 -0
- package/migrations/1783695630053_batch_acknowledgements.down.sql +1 -0
- package/migrations/1783695630053_batch_acknowledgements.up.sql +13 -0
- package/migrations/1783695630960_ingest_watermarks.down.sql +1 -0
- package/migrations/1783695630960_ingest_watermarks.up.sql +9 -0
- package/migrations/1783695631522_metric_definitions.down.sql +1 -0
- package/migrations/1783695631522_metric_definitions.up.sql +10 -0
- package/migrations/1783695631966_metric_samples.down.sql +1 -0
- package/migrations/1783695631966_metric_samples.up.sql +15 -0
- package/migrations/1783695632417_metric_rollups.down.sql +1 -0
- package/migrations/1783695632417_metric_rollups.up.sql +22 -0
- package/migrations/1783695632860_rollup_completions.down.sql +1 -0
- package/migrations/1783695632860_rollup_completions.up.sql +17 -0
- package/migrations/1783695633302_extraction_failures.down.sql +1 -0
- package/migrations/1783695633302_extraction_failures.up.sql +10 -0
- package/migrations/1783695633748_maintenance_runs.down.sql +1 -0
- package/migrations/1783695633748_maintenance_runs.up.sql +12 -0
- package/migrations/1783695634221_reader_leases.down.sql +1 -0
- package/migrations/1783695634221_reader_leases.up.sql +9 -0
- package/migrations/1783702703104_committed_drop_counters.down.sql +1 -0
- package/migrations/1783702703104_committed_drop_counters.up.sql +11 -0
- package/migrations/1783705542684_rollup_completion_state.down.sql +2 -0
- package/migrations/1783705542684_rollup_completion_state.up.sql +6 -0
- package/migrations/1784309799539_metric_samples_event_index.down.sql +1 -0
- package/migrations/1784309799539_metric_samples_event_index.up.sql +2 -0
- package/native/noego_telemetry_native.node +0 -0
- package/package.json +137 -0
- package/proper.json +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/trace/trace_telemetry_adapter.ts","../../src/core/helper/canonical_json.ts","../../src/core/bounded_metadata_snapshotter.ts","../../src/core/helper/client_defaults.ts","../../src/core/telemetry_batch_contract.ts","../../src/adapters/trace/wood_telemetry_batch_adapter.ts"],"sourcesContent":["import { TelemetryClient } from '../../core/telemetry_client.js';\nimport type { TelemetryAdmissionResult } from '../../core/types/client.types.js';\nimport type { TelemetryJsonObject } from '../../core/types/json.types.js';\nimport type {\n ScopedTraceAdmission,\n TraceSinkManagerLike,\n} from './types/trace_telemetry_adapter.types.js';\n\nexport class TraceTelemetryAdapter {\n constructor(private readonly client: TelemetryClient) {}\n\n attachTraceManager(manager: TraceSinkManagerLike): () => void {\n return manager.registerSink((event) => {\n this.admitTraceEvent(event);\n });\n }\n\n admitTraceEvent(input: unknown): TelemetryAdmissionResult {\n const parsed = this.parseTraceEvent(input);\n if (!parsed.ok) {\n return this.client.admit(this.invalidAdmission('trace.invalid', parsed.error));\n }\n return this.client.admit({\n source: parsed.value.source,\n processKind: parsed.value.process,\n level: this.numericLevel(parsed.value.level),\n label: parsed.value.label,\n occurredAtMs: parsed.value.occurredAtMs,\n monotonicNs: null,\n conversationId: parsed.value.conversationId,\n correlationId: parsed.value.correlationId,\n metadata: parsed.value.metadata,\n });\n }\n\n admitWoodEvent(input: unknown): TelemetryAdmissionResult {\n const parsed = this.parseWoodEvent(input);\n if (!parsed.ok) {\n return this.client.admit(this.invalidAdmission('wood.invalid', parsed.error));\n }\n return this.client.admit({\n source: parsed.value.source,\n processKind: parsed.value.process,\n level: parsed.value.level,\n label: parsed.value.label,\n occurredAtMs: parsed.value.occurredAtMs,\n monotonicNs: null,\n conversationId: parsed.value.conversationId,\n correlationId: parsed.value.correlationId,\n metadata: parsed.value.metadata,\n });\n }\n\n admitScoped(input: ScopedTraceAdmission): TelemetryAdmissionResult {\n const correlation = this.correlationFromMetadata(input.metadata);\n return this.client.admit({\n source: input.source,\n processKind: input.processKind,\n level: input.level,\n label: input.label,\n occurredAtMs: input.occurredAtMs,\n monotonicNs: null,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata: input.metadata,\n });\n }\n\n private parseTraceEvent(input: unknown):\n | Readonly<{ ok: true; value: Readonly<{\n source: string;\n process: string;\n level: number;\n label: string;\n occurredAtMs: number;\n conversationId: string | number | null;\n correlationId: string | null;\n metadata: unknown;\n }> }>\n | Readonly<{ ok: false; error: string }> {\n if (!this.isRecord(input)) {\n return { ok: false, error: 'Trace event must be an object' };\n }\n const timestamp = input.timestamp;\n const source = input.source;\n const label = input.event;\n const level = input.level;\n if (typeof timestamp !== 'number' || !Number.isFinite(timestamp)) {\n return { ok: false, error: 'Trace event timestamp is invalid' };\n }\n if (typeof source !== 'string' || typeof label !== 'string' || typeof level !== 'number') {\n return { ok: false, error: 'Trace event identity is invalid' };\n }\n const metadata = this.mergeMessage(input.context, input.message);\n const correlation = this.correlationFromMetadata(metadata);\n return {\n ok: true,\n value: {\n source,\n process: typeof input.process === 'string' ? input.process : 'unknown',\n level,\n label,\n occurredAtMs: timestamp,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n },\n };\n }\n\n private parseWoodEvent(input: unknown):\n | Readonly<{ ok: true; value: Readonly<{\n source: string;\n process: string;\n level: string;\n label: string;\n occurredAtMs: number;\n conversationId: string | number | null;\n correlationId: string | null;\n metadata: unknown;\n }> }>\n | Readonly<{ ok: false; error: string }> {\n if (!this.isRecord(input)) {\n return { ok: false, error: 'Wood trace event must be an object' };\n }\n const source = input.source;\n const label = input.type;\n const level = input.level;\n const timestamp = input.timestamp;\n if (typeof source !== 'string' || typeof label !== 'string' || typeof level !== 'string') {\n return { ok: false, error: 'Wood trace event identity is invalid' };\n }\n const occurredAtMs = typeof timestamp === 'string' ? Date.parse(timestamp) : Number.NaN;\n if (!Number.isFinite(occurredAtMs)) {\n return { ok: false, error: 'Wood trace event timestamp is invalid' };\n }\n const metadata = this.copyRecord(input.payload);\n if (typeof input.message === 'string') {\n metadata.message = input.message;\n }\n if (typeof input.traceSeq === 'number') {\n metadata.woodTraceSeq = input.traceSeq;\n }\n const topConversation = this.scalarConversationId(input.conversationId);\n const correlation = this.correlationFromMetadata(metadata);\n return {\n ok: true,\n value: {\n source,\n process: typeof input.process === 'string' ? input.process : 'unknown',\n level,\n label,\n occurredAtMs,\n conversationId: topConversation ?? correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n },\n };\n }\n\n private correlationFromMetadata(input: unknown): Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }> {\n if (!this.isRecord(input)) {\n return { conversationId: null, correlationId: null };\n }\n const conversationId = this.scalarConversationId(input.conversationId)\n ?? this.scalarConversationId(input.threadId);\n const correlationId = typeof input.correlationId === 'string' ? input.correlationId : null;\n return { conversationId, correlationId };\n }\n\n private scalarConversationId(value: unknown): string | number | null {\n return typeof value === 'string' || typeof value === 'number' ? value : null;\n }\n\n private mergeMessage(context: unknown, message: unknown): unknown {\n const metadata = this.copyRecord(context);\n if (typeof message === 'string') {\n metadata.message = message;\n }\n return metadata;\n }\n\n private copyRecord(input: unknown): Record<string, unknown> {\n if (!this.isRecord(input)) {\n return {};\n }\n let keys: string[];\n try {\n keys = Object.keys(input);\n } catch {\n return { __telemetryAdapter: '[property-enumeration-failed]' };\n }\n const output: Record<string, unknown> = {};\n for (const key of keys) {\n try {\n output[key] = Reflect.get(input, key);\n } catch {\n output[key] = '[property-read-failed]';\n }\n }\n return output;\n }\n\n private numericLevel(level: number): string {\n switch (level) {\n case 0:\n return 'debug';\n case 1:\n return 'info';\n case 2:\n return 'warn';\n case 3:\n return 'error';\n default:\n return 'debug';\n }\n }\n\n private invalidAdmission(label: string, error: string) {\n return {\n source: 'telemetry-adapter',\n processKind: 'unknown',\n level: 'warn',\n label,\n occurredAtMs: Date.now(),\n monotonicNs: null,\n conversationId: null,\n correlationId: null,\n metadata: { error },\n };\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n try {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n } catch {\n return false;\n }\n }\n}\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\nimport type { MetadataSnapshot, MetadataSnapshotLimits, MetadataSnapshotStats } from './types/metadata.types.js';\n\nconst SENTINEL_CIRCULAR = '[telemetry:circular]';\nconst SENTINEL_TRUNCATED = '[telemetry:truncated]';\n\nexport class BoundedMetadataSnapshotter {\n constructor(private readonly limits: MetadataSnapshotLimits) {\n this.validateLimits();\n }\n\n snapshot(input: unknown): MetadataSnapshot {\n const state = {\n bytes: 0,\n properties: 0,\n truncatedValues: 0,\n redactedValues: 0,\n serializationFailures: 0,\n seen: new WeakSet<object>(),\n };\n\n let normalized: TelemetryJsonValue;\n try {\n normalized = this.normalize(input, '$', 0, state);\n } catch {\n state.serializationFailures += 1;\n normalized = { __telemetry: '[telemetry:snapshot-failed]' };\n }\n\n const root = this.ensureObject(normalized);\n const canonical = canonicalJson(root);\n const metadata = telemetryUtf8Length(canonical) <= this.limits.maxBytes\n ? root\n : Object.freeze({ __telemetry: SENTINEL_TRUNCATED });\n if (metadata !== root) {\n state.truncatedValues += 1;\n }\n\n const stats: MetadataSnapshotStats = Object.freeze({\n estimatedBytes: Math.min(telemetryUtf8Length(canonical), this.limits.maxBytes),\n truncatedValues: state.truncatedValues,\n redactedValues: state.redactedValues,\n serializationFailures: state.serializationFailures,\n });\n\n return Object.freeze({ metadata, stats });\n }\n\n private normalize(\n input: unknown,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonValue {\n const replacement = this.redactionFor(path);\n if (replacement !== null) {\n state.redactedValues += 1;\n return replacement;\n }\n\n if (depth > this.limits.maxDepth || state.bytes >= this.limits.maxBytes) {\n state.truncatedValues += 1;\n return SENTINEL_TRUNCATED;\n }\n\n if (input === null || typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return this.normalizeString(input, state);\n }\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : `[telemetry:number:${String(input)}]`;\n }\n if (typeof input === 'bigint') {\n return `[telemetry:bigint:${input.toString()}]`;\n }\n if (typeof input === 'undefined') {\n return '[telemetry:undefined]';\n }\n if (typeof input === 'symbol') {\n return `[telemetry:symbol:${input.description ?? ''}]`;\n }\n if (typeof input === 'function') {\n return '[telemetry:function]';\n }\n if (input instanceof Error) {\n return this.normalizeError(input, path, depth, state);\n }\n if (typeof input !== 'object') {\n return `[telemetry:unsupported:${typeof input}]`;\n }\n if (state.seen.has(input)) {\n return SENTINEL_CIRCULAR;\n }\n\n state.seen.add(input);\n try {\n return Array.isArray(input)\n ? this.normalizeArray(input, path, depth, state)\n : this.normalizeObject(input, path, depth, state);\n } finally {\n state.seen.delete(input);\n }\n }\n\n private normalizeString(\n input: string,\n state: { bytes: number; truncatedValues: number },\n ): string {\n const stringLimit = Math.min(this.limits.maxStringLength, Math.max(0, this.limits.maxBytes - state.bytes));\n const truncated = input.length > stringLimit;\n const normalized = truncated ? input.slice(0, stringLimit) : input;\n state.bytes += telemetryUtf8Length(normalized);\n if (truncated) {\n state.truncatedValues += 1;\n }\n return normalized;\n }\n\n private normalizeArray(\n input: readonly unknown[],\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): readonly TelemetryJsonValue[] {\n const length = Math.min(input.length, this.limits.maxArrayLength);\n const values: TelemetryJsonValue[] = [];\n for (let index = 0; index < length; index += 1) {\n let item: unknown;\n try {\n item = input[index];\n } catch {\n state.serializationFailures += 1;\n item = '[telemetry:property-read-failed]';\n }\n values.push(this.normalize(item, `${path}[${index}]`, depth + 1, state));\n }\n if (input.length > length) {\n values.push(SENTINEL_TRUNCATED);\n state.truncatedValues += 1;\n }\n return Object.freeze(values);\n }\n\n private normalizeObject(\n input: object,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n let keys: string[];\n try {\n keys = Object.keys(input).sort((left, right) => left.localeCompare(right));\n } catch {\n state.serializationFailures += 1;\n return Object.freeze({ __telemetry: '[telemetry:keys-failed]' });\n }\n\n const output: Record<string, TelemetryJsonValue> = {};\n for (const key of keys) {\n if (state.properties >= this.limits.maxProperties) {\n output.__telemetry = SENTINEL_TRUNCATED;\n state.truncatedValues += 1;\n break;\n }\n state.properties += 1;\n state.bytes += telemetryUtf8Length(key);\n const childPath = path === '$' ? key : `${path}.${key}`;\n const redaction = this.redactionFor(childPath);\n if (redaction !== null) {\n output[key] = redaction;\n state.redactedValues += 1;\n continue;\n }\n\n let property: unknown;\n try {\n property = Reflect.get(input, key);\n } catch {\n state.serializationFailures += 1;\n property = '[telemetry:property-read-failed]';\n }\n output[key] = this.normalize(property, childPath, depth + 1, state);\n }\n return Object.freeze(output);\n }\n\n private normalizeError(\n error: Error,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n const name = this.readErrorField(error, 'name', state);\n const message = this.readErrorField(error, 'message', state);\n const stack = this.readErrorField(error, 'stack', state).slice(0, this.limits.maxErrorStackLength);\n return Object.freeze({\n name: this.normalize(name, `${path}.name`, depth + 1, state),\n message: this.normalize(message, `${path}.message`, depth + 1, state),\n stack: this.normalize(stack, `${path}.stack`, depth + 1, state),\n });\n }\n\n private readErrorField(\n error: Error,\n field: 'name' | 'message' | 'stack',\n state: { serializationFailures: number },\n ): string {\n try {\n return typeof error[field] === 'string' ? error[field] : '';\n } catch {\n state.serializationFailures += 1;\n return '[telemetry:error-field-read-failed]';\n }\n }\n\n private ensureObject(value: TelemetryJsonValue): TelemetryJsonObject {\n return this.isJsonObject(value) ? value : Object.freeze({ value });\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private redactionFor(path: string): string | null {\n const matchingRule = this.limits.redactions.find((rule) => rule.path === path);\n return matchingRule?.replacement ?? null;\n }\n\n private validateLimits(): void {\n const limits = [\n this.limits.maxBytes,\n this.limits.maxDepth,\n this.limits.maxProperties,\n this.limits.maxArrayLength,\n this.limits.maxStringLength,\n this.limits.maxErrorStackLength,\n ];\n const hasInvalidLimit = limits.some((limit) => !Number.isInteger(limit) || limit <= 0);\n if (hasInvalidLimit) {\n throw new Error('Metadata snapshot limits must be positive integers');\n }\n }\n}\n","import type { TelemetryAdmissionPolicy } from '../types/client.types.js';\nimport type { MetadataSnapshotLimits } from '../types/metadata.types.js';\nimport type { TelemetryBatchValidationLimits } from '../types/transport.types.js';\n\nexport const DEFAULT_TELEMETRY_ADMISSION_POLICY: TelemetryAdmissionPolicy = Object.freeze({\n maxQueuedEvents: 2_000,\n maxQueuedBytes: 2_000_000,\n maxBatchEvents: 128,\n maxBatchBytes: 256_000,\n maxInFlightBatches: 1,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n sampleRates: Object.freeze({\n low: 1,\n normal: 1,\n high: 1,\n }),\n});\n\nexport const DEFAULT_METADATA_SNAPSHOT_LIMITS: MetadataSnapshotLimits = Object.freeze({\n maxBytes: 32_768,\n maxDepth: 8,\n maxProperties: 256,\n maxArrayLength: 128,\n maxStringLength: 4_096,\n maxErrorStackLength: 8_192,\n redactions: Object.freeze([]),\n});\n\nexport const DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS: TelemetryBatchValidationLimits = Object.freeze({\n maxBatchEvents: 1_024,\n maxBatchBytes: 1_000_000,\n maxEventBytes: 256_000,\n maxMetadataBytes: 131_072,\n maxMetadataDepth: 16,\n maxMetadataProperties: 1_024,\n maxMetadataArrayLength: 1_024,\n maxMetadataStringBytes: 65_536,\n maxDropCounters: 15,\n maxIdentityBytes: 1_024,\n});\n","import {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from './helper/canonical_json.js';\nimport { DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS } from './helper/client_defaults.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryBatch,\n TelemetryBatchValidationLimits,\n TelemetryDropCounter,\n} from './types/transport.types.js';\n\nconst BATCH_KEYS = Object.freeze([\n 'schemaVersion',\n 'producerId',\n 'sequenceStart',\n 'sequenceEnd',\n 'idempotencyKey',\n 'checksum',\n 'envelopes',\n 'dropCounters',\n]);\n\nconst ENVELOPE_KEYS = Object.freeze([\n 'schemaVersion',\n 'eventId',\n 'producerId',\n 'sequence',\n 'occurredAtMs',\n 'monotonicNs',\n 'source',\n 'processKind',\n 'level',\n 'label',\n 'conversationId',\n 'correlationId',\n 'metadata',\n]);\n\nconst DROP_COUNTER_KEYS = Object.freeze(['reason', 'priority', 'count']);\nconst DROP_REASONS = new Set(['capacity', 'sampled', 'stopped', 'invalid', 'transport']);\nconst DROP_PRIORITIES = new Set(['low', 'normal', 'high']);\n\ntype JsonValidationState = {\n properties: number;\n bytes: number;\n active: WeakSet<object>;\n};\n\nexport class TelemetryBatchContract {\n static readonly schemaVersion = 1;\n static readonly checksumAlgorithm = 'fnv1a64-canonical-json-v1';\n readonly limits: TelemetryBatchValidationLimits;\n\n constructor(limits: Partial<TelemetryBatchValidationLimits> = {}) {\n this.limits = Object.freeze({\n ...DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n ...limits,\n });\n this.validateLimits();\n }\n\n create(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.createChecked(envelopes, dropCounters);\n } catch {\n return { ok: false, error: 'Telemetry batch creation failed safe validation' };\n }\n }\n\n validate(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.validateChecked(batch);\n } catch {\n return { ok: false, error: 'Telemetry batch validation failed safely' };\n }\n }\n\n private createChecked(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n const payloadError = this.validatePayload(envelopes, dropCounters);\n if (payloadError !== null) {\n return { ok: false, error: payloadError };\n }\n const payloadBytesError = this.payloadBytesError(envelopes, dropCounters);\n if (payloadBytesError !== null) {\n return { ok: false, error: payloadBytesError };\n }\n\n const first = envelopes[0];\n const last = envelopes[envelopes.length - 1];\n if (!first || !last) {\n return { ok: false, error: 'A telemetry batch must contain a first and last envelope' };\n }\n\n const producerId = first.producerId;\n const sequenceStart = first.sequence;\n const sequenceEnd = last.sequence;\n const checksumPayload = this.checksumPayload(\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n );\n const checksum = telemetryChecksum(checksumPayload);\n const idempotencyKey = `tb1:${producerId}:${sequenceStart}-${sequenceEnd}:${checksum}`;\n const batch = Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n idempotencyKey,\n checksum,\n envelopes: Object.freeze([...envelopes]),\n dropCounters: Object.freeze([...dropCounters]),\n });\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const byteError = this.serializedByteError(batch, this.limits.maxBatchBytes, 'batch');\n return byteError === null\n ? { ok: true, value: this.detachBatch(batch) }\n : { ok: false, error: byteError };\n }\n\n private validateChecked(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n if (!this.isRecord(batch)) {\n return { ok: false, error: 'Telemetry batch must be a plain object' };\n }\n const schemaVersion = batch.schemaVersion;\n if (!Number.isSafeInteger(schemaVersion)) {\n return { ok: false, error: 'Telemetry batch schema version must be a safe integer' };\n }\n if (schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return { ok: false, error: `Unsupported telemetry schema version ${String(schemaVersion)}` };\n }\n if (!this.hasExactKeys(batch, BATCH_KEYS)) {\n return { ok: false, error: 'Telemetry batch fields do not match the schema' };\n }\n\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const recreated = this.create(\n batch.envelopes as readonly TelemetryEnvelope[],\n batch.dropCounters as readonly TelemetryDropCounter[],\n );\n if (!recreated.ok) {\n return recreated;\n }\n const identityError = this.compareFraming(batch, recreated.value);\n return identityError === null\n ? { ok: true, value: recreated.value }\n : { ok: false, error: identityError };\n }\n\n private validatePayload(envelopes: unknown, dropCounters: unknown): string | null {\n if (!Array.isArray(envelopes) || envelopes.length === 0) {\n return 'A telemetry batch must contain at least one envelope';\n }\n if (envelopes.length > this.limits.maxBatchEvents) {\n return `Telemetry batch exceeds ${this.limits.maxBatchEvents} envelopes`;\n }\n const envelopeError = this.validateEnvelopes(envelopes);\n return envelopeError ?? this.validateDropCounters(dropCounters);\n }\n\n private validateEnvelopes(envelopes: readonly unknown[]): string | null {\n let previousSequence = -1;\n let producerId: string | null = null;\n for (const envelope of envelopes) {\n const envelopeError = this.validateEnvelope(envelope, producerId, previousSequence);\n if (envelopeError !== null) {\n return envelopeError;\n }\n const typedEnvelope = envelope as TelemetryEnvelope;\n producerId = typedEnvelope.producerId;\n previousSequence = typedEnvelope.sequence;\n }\n return null;\n }\n\n private validateEnvelope(\n envelope: unknown,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (!this.isRecord(envelope) || !this.hasExactKeys(envelope, ENVELOPE_KEYS)) {\n return 'Telemetry envelope fields do not match the schema';\n }\n const identityError = this.validateEnvelopeIdentity(envelope, expectedProducerId, previousSequence);\n if (identityError !== null) {\n return identityError;\n }\n const valueError = this.validateEnvelopeValues(envelope);\n if (valueError !== null) {\n return valueError;\n }\n const metadataError = this.validateMetadata(envelope.metadata);\n return metadataError ?? this.serializedByteError(envelope, this.limits.maxEventBytes, 'event');\n }\n\n private validateEnvelopeIdentity(\n envelope: Record<string, unknown>,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (envelope.schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return 'Telemetry envelope schema version does not match its batch';\n }\n if (!this.isIdentity(envelope.producerId)) {\n return 'Telemetry envelope producer identity is invalid';\n }\n if (!this.isSequence(envelope.sequence) || envelope.sequence <= previousSequence) {\n return 'Telemetry envelope sequences must be nonnegative safe integers in increasing order';\n }\n if (expectedProducerId !== null && envelope.producerId !== expectedProducerId) {\n return 'A telemetry batch cannot mix producer identities';\n }\n const eventId = `${envelope.producerId}:${envelope.sequence}`;\n if (envelope.eventId !== eventId || telemetryUtf8Length(eventId) > this.limits.maxIdentityBytes) {\n return 'Telemetry envelope event identity is invalid';\n }\n return null;\n }\n\n private validateEnvelopeValues(envelope: Record<string, unknown>): string | null {\n if (!Number.isSafeInteger(envelope.occurredAtMs) || Number(envelope.occurredAtMs) < 0) {\n return 'Telemetry envelope occurredAtMs must be a nonnegative safe integer';\n }\n if (!this.isMonotonicTimestamp(envelope.monotonicNs)) {\n return 'Telemetry envelope monotonicNs is invalid';\n }\n if (!this.isIdentity(envelope.source) || !this.isIdentity(envelope.processKind)) {\n return 'Telemetry envelope source and process kind are invalid';\n }\n if (!this.isIdentity(envelope.level)) {\n return 'Telemetry envelope level is invalid';\n }\n if (!this.isLabel(envelope.label)) {\n return 'Telemetry envelope label is invalid';\n }\n if (!this.isConversationId(envelope.conversationId)) {\n return 'Telemetry envelope conversation identity is invalid';\n }\n if (!this.isOptionalBoundedString(envelope.correlationId)) {\n return 'Telemetry envelope correlation identity is invalid';\n }\n return null;\n }\n\n private validateMetadata(metadata: unknown): string | null {\n if (!this.isRecord(metadata)) {\n return 'Telemetry envelope metadata must be a plain JSON object';\n }\n const state: JsonValidationState = { properties: 0, bytes: 0, active: new WeakSet<object>() };\n const jsonError = this.validateJsonValue(metadata, 0, state);\n return jsonError ?? this.serializedByteError(metadata, this.limits.maxMetadataBytes, 'metadata');\n }\n\n private validateJsonValue(value: unknown, depth: number, state: JsonValidationState): string | null {\n if (value === null || typeof value === 'boolean') {\n state.bytes += value === null ? 4 : 5;\n return null;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return 'Telemetry metadata contains a non-finite number';\n }\n state.bytes += String(value).length;\n return this.metadataBudgetError(state);\n }\n if (typeof value === 'string') {\n if (!this.isWithinUtf8Limit(value, this.limits.maxMetadataStringBytes)) {\n return 'Telemetry metadata string exceeds the receiver limit';\n }\n state.bytes += telemetryUtf8Length(value);\n return this.metadataBudgetError(state);\n }\n if (typeof value !== 'object') {\n return 'Telemetry metadata contains a non-JSON value';\n }\n if (depth > this.limits.maxMetadataDepth) {\n return 'Telemetry metadata exceeds the receiver depth limit';\n }\n return Array.isArray(value)\n ? this.validateJsonArray(value, depth, state)\n : this.validateJsonObject(value, depth, state);\n }\n\n private validateJsonArray(value: readonly unknown[], depth: number, state: JsonValidationState): string | null {\n if (value.length > this.limits.maxMetadataArrayLength) {\n return 'Telemetry metadata array exceeds the receiver length limit';\n }\n const keys = Object.keys(value);\n if (keys.length !== value.length || Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata arrays must be dense JSON arrays';\n }\n return this.validateJsonChildren(value, value, depth, state);\n }\n\n private validateJsonObject(value: object, depth: number, state: JsonValidationState): string | null {\n if (!this.isRecord(value)) {\n return 'Telemetry metadata contains a non-plain object';\n }\n const keys = Object.keys(value);\n if (Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata objects cannot contain symbol keys';\n }\n state.properties += keys.length;\n if (state.properties > this.limits.maxMetadataProperties) {\n return 'Telemetry metadata exceeds the receiver property limit';\n }\n if (keys.some((key) => !this.isWithinUtf8Limit(key, this.limits.maxMetadataStringBytes))) {\n return 'Telemetry metadata property name exceeds the receiver string limit';\n }\n for (const key of keys) {\n state.bytes += telemetryUtf8Length(key);\n }\n const budgetError = this.metadataBudgetError(state);\n if (budgetError !== null) {\n return budgetError;\n }\n return this.validateJsonChildren(value, keys.map((key) => Reflect.get(value, key)), depth, state);\n }\n\n private validateJsonChildren(\n owner: object,\n values: readonly unknown[],\n depth: number,\n state: JsonValidationState,\n ): string | null {\n if (state.active.has(owner)) {\n return 'Telemetry metadata cannot contain a cycle';\n }\n state.active.add(owner);\n try {\n for (const value of values) {\n const error = this.validateJsonValue(value, depth + 1, state);\n if (error !== null) {\n return error;\n }\n }\n return null;\n } finally {\n state.active.delete(owner);\n }\n }\n\n private validateDropCounters(dropCounters: unknown): string | null {\n if (!Array.isArray(dropCounters) || dropCounters.length > this.limits.maxDropCounters) {\n return 'Telemetry drop counters exceed the fixed receiver limit';\n }\n const identities = new Set<string>();\n let total = 0;\n for (const counter of dropCounters) {\n const error = this.validateDropCounter(counter, identities, total);\n if (error !== null) {\n return error;\n }\n total += (counter as TelemetryDropCounter).count;\n }\n return null;\n }\n\n private validateDropCounter(\n counter: unknown,\n identities: Set<string>,\n currentTotal: number,\n ): string | null {\n if (!this.isRecord(counter) || !this.hasExactKeys(counter, DROP_COUNTER_KEYS)) {\n return 'Telemetry drop counter fields do not match the schema';\n }\n if (!DROP_REASONS.has(String(counter.reason)) || !DROP_PRIORITIES.has(String(counter.priority))) {\n return 'Telemetry drop counter identity is invalid';\n }\n if (!Number.isSafeInteger(counter.count) || Number(counter.count) <= 0) {\n return 'Telemetry drop counter count must be a positive safe integer';\n }\n if (currentTotal > Number.MAX_SAFE_INTEGER - Number(counter.count)) {\n return 'Telemetry drop counter total exceeds the safe integer range';\n }\n const identity = `${counter.reason}:${counter.priority}`;\n if (identities.has(identity)) {\n return 'Telemetry drop counter identities must be unique within a batch';\n }\n identities.add(identity);\n return null;\n }\n\n private validateFraming(batch: Record<string, unknown>): string | null {\n if (!this.isIdentity(batch.producerId)) {\n return 'Telemetry batch producer identity is invalid';\n }\n if (!this.isSequence(batch.sequenceStart) || !this.isSequence(batch.sequenceEnd)) {\n return 'Telemetry batch sequence range must use nonnegative safe integers';\n }\n if (Number(batch.sequenceEnd) < Number(batch.sequenceStart)) {\n return 'Telemetry batch sequence range is reversed';\n }\n if (typeof batch.checksum !== 'string' || !/^[a-f0-9]{16}$/.test(batch.checksum)) {\n return 'Telemetry batch checksum is invalid';\n }\n if (typeof batch.idempotencyKey !== 'string'\n || !this.isWithinUtf8Limit(batch.idempotencyKey, this.limits.maxIdentityBytes)) {\n return 'Telemetry batch idempotency identity is invalid';\n }\n return null;\n }\n\n private compareFraming(batch: Record<string, unknown>, recreated: TelemetryBatch): string | null {\n const matches = recreated.checksum === batch.checksum\n && recreated.idempotencyKey === batch.idempotencyKey\n && recreated.sequenceStart === batch.sequenceStart\n && recreated.sequenceEnd === batch.sequenceEnd\n && recreated.producerId === batch.producerId;\n return matches ? null : 'Telemetry batch framing or checksum is invalid';\n }\n\n private checksumPayload(\n producerId: string,\n sequenceStart: number,\n sequenceEnd: number,\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): object {\n return {\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n };\n }\n\n private serializedByteError(value: unknown, maximum: number, kind: string): string | null {\n const bytes = telemetryUtf8Length(canonicalJson(value));\n return bytes <= maximum ? null : `Telemetry ${kind} exceeds ${maximum} bytes`;\n }\n\n private payloadBytesError(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): string | null {\n let bytes = 0;\n for (const envelope of envelopes) {\n bytes += telemetryUtf8Length(canonicalJson(envelope));\n if (bytes > this.limits.maxBatchBytes) {\n return `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`;\n }\n }\n bytes += telemetryUtf8Length(canonicalJson(dropCounters));\n return bytes > this.limits.maxBatchBytes\n ? `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`\n : null;\n }\n\n private metadataBudgetError(state: JsonValidationState): string | null {\n return state.bytes > this.limits.maxMetadataBytes\n ? `Telemetry metadata exceeds ${this.limits.maxMetadataBytes} bytes`\n : null;\n }\n\n private detachBatch(batch: TelemetryBatch): TelemetryBatch {\n const detached = JSON.parse(canonicalJson(batch)) as TelemetryBatch;\n return this.deepFreeze(detached);\n }\n\n private deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n this.deepFreeze(child);\n }\n return Object.freeze(value);\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value) as { constructor?: { name?: unknown } } | null;\n return prototype === null || prototype.constructor?.name === 'Object';\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isSequence(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n }\n\n private isIdentity(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && value.trim().length > 0\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value);\n }\n\n private isLabel(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= Math.min(256, this.limits.maxIdentityBytes)\n && /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)\n && this.isWithinUtf8Limit(value, Math.min(256, this.limits.maxIdentityBytes));\n }\n\n private isMonotonicTimestamp(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && /^\\d+$/.test(value)\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes));\n }\n\n private isConversationId(value: unknown): boolean {\n return value === null\n || (typeof value === 'number' && Number.isSafeInteger(value))\n || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isOptionalBoundedString(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isWithinUtf8Limit(value: string, maximum: number): boolean {\n return value.length <= maximum && telemetryUtf8Length(value) <= maximum;\n }\n\n private validateLimits(): void {\n const values = Object.values(this.limits);\n if (values.some((value) => !Number.isSafeInteger(value) || value <= 0)) {\n throw new Error('Telemetry batch validation limits must be positive safe integers');\n }\n if (this.limits.maxMetadataBytes > this.limits.maxEventBytes\n || this.limits.maxEventBytes > this.limits.maxBatchBytes) {\n throw new Error('Telemetry receiver byte limits must satisfy metadata <= event <= batch');\n }\n }\n}\n","import { BoundedMetadataSnapshotter } from '../../core/bounded_metadata_snapshotter.js';\nimport { TelemetryBatchContract } from '../../core/telemetry_batch_contract.js';\nimport type { TelemetryEnvelope } from '../../core/types/envelope.types.js';\nimport type { MetadataSnapshotLimits } from '../../core/types/metadata.types.js';\nimport type { TelemetryResult } from '../../core/types/result.types.js';\nimport type { TelemetryBatch } from '../../core/types/transport.types.js';\nimport type {\n WoodTelemetryBatchInput,\n WoodTelemetryEventInput,\n WoodTelemetryRuntimeContext,\n} from './types/trace_telemetry_adapter.types.js';\n\nexport class WoodTelemetryBatchAdapter {\n private readonly batchContract = new TelemetryBatchContract();\n private readonly snapshotter: BoundedMetadataSnapshotter;\n\n constructor(\n metadataLimits: MetadataSnapshotLimits,\n private readonly producerIdPrefix = 'wood-renderer:',\n ) {\n this.snapshotter = new BoundedMetadataSnapshotter(metadataLimits);\n }\n\n create(\n batch: WoodTelemetryBatchInput,\n context: WoodTelemetryRuntimeContext = {},\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n const identityError = this.validateBatchIdentity(batch);\n if (identityError !== null) {\n return { ok: false, error: identityError };\n }\n const producerId = `${this.producerIdPrefix}${batch.producerId}`;\n const envelopes = batch.events.map((event) => {\n return this.createEnvelope(producerId, batch, event, context);\n });\n return this.batchContract.create(envelopes, []);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private createEnvelope(\n producerId: string,\n batch: WoodTelemetryBatchInput,\n event: WoodTelemetryEventInput,\n context: WoodTelemetryRuntimeContext,\n ): TelemetryEnvelope {\n const sequence = event.traceSeq - 1;\n const occurredAtMs = Date.parse(event.timestamp);\n if (!Number.isSafeInteger(sequence) || sequence < 0 || !Number.isFinite(occurredAtMs)) {\n throw new Error('Wood trace event timing is invalid');\n }\n if (!event.source.trim() || !event.type.trim() || !event.level.trim() || !event.process.trim()) {\n throw new Error('Wood trace event identity is invalid');\n }\n const payload = this.snapshotter.snapshot(event.payload ?? {}).metadata;\n const metadata = this.snapshotter.snapshot({\n ...payload,\n ...(typeof event.message === 'string' ? { message: event.message } : {}),\n woodTraceSeq: event.traceSeq,\n __telemetryWoodBatchId: batch.batchId,\n woodRendererProducerId: batch.producerId,\n woodRendererSequenceStart: batch.sequenceStart,\n woodRendererSequenceEnd: batch.sequenceEnd,\n ...context,\n }).metadata;\n const metadataConversationId = this.scalarConversationId(metadata.conversationId)\n ?? this.scalarConversationId(metadata.threadId);\n const conversationId = this.scalarConversationId(event.conversationId)\n ?? metadataConversationId;\n const correlationId = typeof metadata.correlationId === 'string'\n ? metadata.correlationId\n : null;\n return Object.freeze({\n schemaVersion: 1,\n eventId: `${producerId}:${sequence}`,\n producerId,\n sequence,\n occurredAtMs,\n monotonicNs: null,\n source: event.source,\n processKind: event.process,\n level: event.level,\n label: event.type,\n conversationId,\n correlationId,\n metadata,\n });\n }\n\n private validateBatchIdentity(batch: WoodTelemetryBatchInput): string | null {\n if (!batch.producerId.trim() || !batch.batchId.trim() || batch.events.length === 0) {\n return 'Wood trace batch identity is invalid';\n }\n const first = batch.events[0];\n const last = batch.events[batch.events.length - 1];\n const rangeMatches = first?.traceSeq === batch.sequenceStart + 1\n && last?.traceSeq === batch.sequenceEnd + 1;\n const sequencesIncrease = batch.events.every((event, index) => {\n const previous = batch.events[index - 1];\n return previous === undefined || event.traceSeq > previous.traceSeq;\n });\n return rangeMatches && sequencesIncrease\n ? null\n : 'Wood trace batch sequence range is invalid';\n }\n\n private scalarConversationId(value: unknown): string | number | null {\n return typeof value === 'string' || typeof value === 'number' ? value : null;\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { T as TelemetryEnvelope } from './envelope.types-rOLpWXRC.cjs';
|
|
2
|
+
|
|
3
|
+
declare const TELEMETRY_DELIVERY_MODES: readonly ["required", "best-effort"];
|
|
4
|
+
type TelemetryDeliveryMode = (typeof TELEMETRY_DELIVERY_MODES)[number];
|
|
5
|
+
type TelemetryDropCounter = Readonly<{
|
|
6
|
+
reason: 'capacity' | 'sampled' | 'stopped' | 'invalid' | 'transport';
|
|
7
|
+
priority: 'low' | 'normal' | 'high';
|
|
8
|
+
count: number;
|
|
9
|
+
}>;
|
|
10
|
+
type TelemetryBatchValidationLimits = Readonly<{
|
|
11
|
+
maxBatchEvents: number;
|
|
12
|
+
maxBatchBytes: number;
|
|
13
|
+
maxEventBytes: number;
|
|
14
|
+
maxMetadataBytes: number;
|
|
15
|
+
maxMetadataDepth: number;
|
|
16
|
+
maxMetadataProperties: number;
|
|
17
|
+
maxMetadataArrayLength: number;
|
|
18
|
+
maxMetadataStringBytes: number;
|
|
19
|
+
maxDropCounters: number;
|
|
20
|
+
maxIdentityBytes: number;
|
|
21
|
+
}>;
|
|
22
|
+
type TelemetryBatch = Readonly<{
|
|
23
|
+
schemaVersion: number;
|
|
24
|
+
producerId: string;
|
|
25
|
+
sequenceStart: number;
|
|
26
|
+
sequenceEnd: number;
|
|
27
|
+
idempotencyKey: string;
|
|
28
|
+
checksum: string;
|
|
29
|
+
envelopes: readonly TelemetryEnvelope[];
|
|
30
|
+
dropCounters: readonly TelemetryDropCounter[];
|
|
31
|
+
}>;
|
|
32
|
+
type TelemetryCommittedAcknowledgement = Readonly<{
|
|
33
|
+
kind: 'committed';
|
|
34
|
+
idempotencyKey: string;
|
|
35
|
+
committedAtMs: number;
|
|
36
|
+
acceptedEvents: number;
|
|
37
|
+
duplicate: boolean;
|
|
38
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
39
|
+
}>;
|
|
40
|
+
type TelemetryRetryableAcknowledgement = Readonly<{
|
|
41
|
+
kind: 'retryable';
|
|
42
|
+
idempotencyKey: string;
|
|
43
|
+
reason: string;
|
|
44
|
+
retryAfterMs: number;
|
|
45
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
46
|
+
}>;
|
|
47
|
+
type TelemetryRejectedAcknowledgement = Readonly<{
|
|
48
|
+
kind: 'rejected';
|
|
49
|
+
idempotencyKey: string;
|
|
50
|
+
code: 'invalid-batch' | 'unsupported-version' | 'no-required-terminal' | 'closed';
|
|
51
|
+
reason: string;
|
|
52
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
53
|
+
}>;
|
|
54
|
+
type TelemetryConflictAcknowledgement = Readonly<{
|
|
55
|
+
kind: 'conflict';
|
|
56
|
+
idempotencyKey: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
59
|
+
}>;
|
|
60
|
+
type TelemetryAcknowledgement = TelemetryCommittedAcknowledgement | TelemetryRetryableAcknowledgement | TelemetryRejectedAcknowledgement | TelemetryConflictAcknowledgement;
|
|
61
|
+
type TelemetryTargetDeliveryState = Readonly<{
|
|
62
|
+
targetId: string;
|
|
63
|
+
delivery: TelemetryDeliveryMode;
|
|
64
|
+
state: 'pending' | 'committed' | 'failed' | 'abandoned';
|
|
65
|
+
attempts: number;
|
|
66
|
+
reason: string | null;
|
|
67
|
+
}>;
|
|
68
|
+
type TelemetryBatchTransportCapabilities = Readonly<{
|
|
69
|
+
maxBatchBytes: number;
|
|
70
|
+
acknowledgement: 'durable' | 'receipt' | 'none';
|
|
71
|
+
ordering: 'producer' | 'none';
|
|
72
|
+
boundedCapacity: number;
|
|
73
|
+
}>;
|
|
74
|
+
interface TelemetryBatchTransport {
|
|
75
|
+
readonly transportId: string;
|
|
76
|
+
readonly capabilities: TelemetryBatchTransportCapabilities;
|
|
77
|
+
send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement>;
|
|
78
|
+
flush(deadlineMs: number): Promise<void>;
|
|
79
|
+
close(deadlineMs: number): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
interface TelemetryBatchReceiver {
|
|
82
|
+
readonly receiverId: string;
|
|
83
|
+
receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement>;
|
|
84
|
+
}
|
|
85
|
+
type TelemetryBatchRoute = Readonly<{
|
|
86
|
+
routeId: string;
|
|
87
|
+
delivery: TelemetryDeliveryMode;
|
|
88
|
+
transport: TelemetryBatchTransport;
|
|
89
|
+
matches: (batch: TelemetryBatch) => boolean;
|
|
90
|
+
}>;
|
|
91
|
+
type TelemetryBatchRouterOptions = Readonly<{
|
|
92
|
+
routerId: string;
|
|
93
|
+
routes: readonly TelemetryBatchRoute[];
|
|
94
|
+
volatile: boolean;
|
|
95
|
+
now: () => number;
|
|
96
|
+
maxRememberedBatches?: number;
|
|
97
|
+
}>;
|
|
98
|
+
|
|
99
|
+
export type { TelemetryBatchTransport as T, TelemetryBatchValidationLimits as a, TelemetryBatchTransportCapabilities as b, TelemetryBatchReceiver as c, TelemetryBatch as d, TelemetryAcknowledgement as e, TelemetryDropCounter as f, TelemetryDeliveryMode as g, TelemetryBatchRoute as h, TelemetryBatchRouterOptions as i, TelemetryTargetDeliveryState as j };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { T as TelemetryEnvelope } from './envelope.types-rOLpWXRC.js';
|
|
2
|
+
|
|
3
|
+
declare const TELEMETRY_DELIVERY_MODES: readonly ["required", "best-effort"];
|
|
4
|
+
type TelemetryDeliveryMode = (typeof TELEMETRY_DELIVERY_MODES)[number];
|
|
5
|
+
type TelemetryDropCounter = Readonly<{
|
|
6
|
+
reason: 'capacity' | 'sampled' | 'stopped' | 'invalid' | 'transport';
|
|
7
|
+
priority: 'low' | 'normal' | 'high';
|
|
8
|
+
count: number;
|
|
9
|
+
}>;
|
|
10
|
+
type TelemetryBatchValidationLimits = Readonly<{
|
|
11
|
+
maxBatchEvents: number;
|
|
12
|
+
maxBatchBytes: number;
|
|
13
|
+
maxEventBytes: number;
|
|
14
|
+
maxMetadataBytes: number;
|
|
15
|
+
maxMetadataDepth: number;
|
|
16
|
+
maxMetadataProperties: number;
|
|
17
|
+
maxMetadataArrayLength: number;
|
|
18
|
+
maxMetadataStringBytes: number;
|
|
19
|
+
maxDropCounters: number;
|
|
20
|
+
maxIdentityBytes: number;
|
|
21
|
+
}>;
|
|
22
|
+
type TelemetryBatch = Readonly<{
|
|
23
|
+
schemaVersion: number;
|
|
24
|
+
producerId: string;
|
|
25
|
+
sequenceStart: number;
|
|
26
|
+
sequenceEnd: number;
|
|
27
|
+
idempotencyKey: string;
|
|
28
|
+
checksum: string;
|
|
29
|
+
envelopes: readonly TelemetryEnvelope[];
|
|
30
|
+
dropCounters: readonly TelemetryDropCounter[];
|
|
31
|
+
}>;
|
|
32
|
+
type TelemetryCommittedAcknowledgement = Readonly<{
|
|
33
|
+
kind: 'committed';
|
|
34
|
+
idempotencyKey: string;
|
|
35
|
+
committedAtMs: number;
|
|
36
|
+
acceptedEvents: number;
|
|
37
|
+
duplicate: boolean;
|
|
38
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
39
|
+
}>;
|
|
40
|
+
type TelemetryRetryableAcknowledgement = Readonly<{
|
|
41
|
+
kind: 'retryable';
|
|
42
|
+
idempotencyKey: string;
|
|
43
|
+
reason: string;
|
|
44
|
+
retryAfterMs: number;
|
|
45
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
46
|
+
}>;
|
|
47
|
+
type TelemetryRejectedAcknowledgement = Readonly<{
|
|
48
|
+
kind: 'rejected';
|
|
49
|
+
idempotencyKey: string;
|
|
50
|
+
code: 'invalid-batch' | 'unsupported-version' | 'no-required-terminal' | 'closed';
|
|
51
|
+
reason: string;
|
|
52
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
53
|
+
}>;
|
|
54
|
+
type TelemetryConflictAcknowledgement = Readonly<{
|
|
55
|
+
kind: 'conflict';
|
|
56
|
+
idempotencyKey: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
targetStates: readonly TelemetryTargetDeliveryState[];
|
|
59
|
+
}>;
|
|
60
|
+
type TelemetryAcknowledgement = TelemetryCommittedAcknowledgement | TelemetryRetryableAcknowledgement | TelemetryRejectedAcknowledgement | TelemetryConflictAcknowledgement;
|
|
61
|
+
type TelemetryTargetDeliveryState = Readonly<{
|
|
62
|
+
targetId: string;
|
|
63
|
+
delivery: TelemetryDeliveryMode;
|
|
64
|
+
state: 'pending' | 'committed' | 'failed' | 'abandoned';
|
|
65
|
+
attempts: number;
|
|
66
|
+
reason: string | null;
|
|
67
|
+
}>;
|
|
68
|
+
type TelemetryBatchTransportCapabilities = Readonly<{
|
|
69
|
+
maxBatchBytes: number;
|
|
70
|
+
acknowledgement: 'durable' | 'receipt' | 'none';
|
|
71
|
+
ordering: 'producer' | 'none';
|
|
72
|
+
boundedCapacity: number;
|
|
73
|
+
}>;
|
|
74
|
+
interface TelemetryBatchTransport {
|
|
75
|
+
readonly transportId: string;
|
|
76
|
+
readonly capabilities: TelemetryBatchTransportCapabilities;
|
|
77
|
+
send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement>;
|
|
78
|
+
flush(deadlineMs: number): Promise<void>;
|
|
79
|
+
close(deadlineMs: number): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
interface TelemetryBatchReceiver {
|
|
82
|
+
readonly receiverId: string;
|
|
83
|
+
receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement>;
|
|
84
|
+
}
|
|
85
|
+
type TelemetryBatchRoute = Readonly<{
|
|
86
|
+
routeId: string;
|
|
87
|
+
delivery: TelemetryDeliveryMode;
|
|
88
|
+
transport: TelemetryBatchTransport;
|
|
89
|
+
matches: (batch: TelemetryBatch) => boolean;
|
|
90
|
+
}>;
|
|
91
|
+
type TelemetryBatchRouterOptions = Readonly<{
|
|
92
|
+
routerId: string;
|
|
93
|
+
routes: readonly TelemetryBatchRoute[];
|
|
94
|
+
volatile: boolean;
|
|
95
|
+
now: () => number;
|
|
96
|
+
maxRememberedBatches?: number;
|
|
97
|
+
}>;
|
|
98
|
+
|
|
99
|
+
export type { TelemetryBatchTransport as T, TelemetryBatchValidationLimits as a, TelemetryBatchTransportCapabilities as b, TelemetryBatchReceiver as c, TelemetryBatch as d, TelemetryAcknowledgement as e, TelemetryDropCounter as f, TelemetryDeliveryMode as g, TelemetryBatchRoute as h, TelemetryBatchRouterOptions as i, TelemetryTargetDeliveryState as j };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{rawEvents}};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{rawEvents}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
producer_id TEXT NOT NULL,
|
|
4
|
+
sequence INTEGER NOT NULL CHECK (sequence >= 0),
|
|
5
|
+
event_id TEXT NOT NULL,
|
|
6
|
+
batch_idempotency_key TEXT NOT NULL,
|
|
7
|
+
occurred_at_ms INTEGER NOT NULL,
|
|
8
|
+
monotonic_ns TEXT,
|
|
9
|
+
source TEXT NOT NULL,
|
|
10
|
+
process_kind TEXT NOT NULL,
|
|
11
|
+
level TEXT NOT NULL,
|
|
12
|
+
label TEXT NOT NULL,
|
|
13
|
+
conversation_id TEXT,
|
|
14
|
+
conversation_id_kind TEXT CHECK (conversation_id_kind IN ('string', 'number')),
|
|
15
|
+
correlation_id TEXT,
|
|
16
|
+
metadata_json TEXT NOT NULL,
|
|
17
|
+
schema_version INTEGER NOT NULL CHECK (schema_version > 0),
|
|
18
|
+
inserted_at_ms INTEGER NOT NULL,
|
|
19
|
+
PRIMARY KEY (target_id, producer_id, sequence),
|
|
20
|
+
UNIQUE (target_id, event_id)
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS {{rawEventsOccurredIndex}}
|
|
24
|
+
ON {{rawEvents}} (target_id, occurred_at_ms, producer_id, sequence);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS {{rawEventsConversationIndex}}
|
|
27
|
+
ON {{rawEvents}} (target_id, conversation_id, occurred_at_ms);
|
|
28
|
+
|
|
29
|
+
CREATE INDEX IF NOT EXISTS {{rawEventsLabelIndex}}
|
|
30
|
+
ON {{rawEvents}} (target_id, label, occurred_at_ms);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{batchAcknowledgements}};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{batchAcknowledgements}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
idempotency_key TEXT NOT NULL,
|
|
4
|
+
producer_id TEXT NOT NULL,
|
|
5
|
+
sequence_start INTEGER NOT NULL,
|
|
6
|
+
sequence_end INTEGER NOT NULL,
|
|
7
|
+
schema_version INTEGER NOT NULL,
|
|
8
|
+
checksum TEXT NOT NULL,
|
|
9
|
+
accepted_events INTEGER NOT NULL,
|
|
10
|
+
committed_at_ms INTEGER NOT NULL,
|
|
11
|
+
PRIMARY KEY (target_id, idempotency_key),
|
|
12
|
+
UNIQUE (target_id, producer_id, sequence_start, sequence_end)
|
|
13
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{ingestWatermarks}};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{ingestWatermarks}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
producer_id TEXT NOT NULL,
|
|
4
|
+
highest_sequence INTEGER NOT NULL,
|
|
5
|
+
last_occurred_at_ms INTEGER NOT NULL,
|
|
6
|
+
last_committed_at_ms INTEGER NOT NULL,
|
|
7
|
+
observed_gap_count INTEGER NOT NULL DEFAULT 0,
|
|
8
|
+
PRIMARY KEY (target_id, producer_id)
|
|
9
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{metricDefinitions}};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{metricDefinitions}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
metric_name TEXT NOT NULL,
|
|
4
|
+
definition_version INTEGER NOT NULL CHECK (definition_version > 0),
|
|
5
|
+
definition_json TEXT NOT NULL,
|
|
6
|
+
definition_checksum TEXT NOT NULL,
|
|
7
|
+
active INTEGER NOT NULL CHECK (active IN (0, 1)),
|
|
8
|
+
registered_at_ms INTEGER NOT NULL,
|
|
9
|
+
PRIMARY KEY (target_id, metric_name, definition_version)
|
|
10
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{metricSamples}};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{metricSamples}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
metric_name TEXT NOT NULL,
|
|
4
|
+
definition_version INTEGER NOT NULL,
|
|
5
|
+
occurred_at_ms INTEGER NOT NULL,
|
|
6
|
+
producer_id TEXT NOT NULL,
|
|
7
|
+
sequence INTEGER NOT NULL,
|
|
8
|
+
dimension_key TEXT NOT NULL,
|
|
9
|
+
dimensions_json TEXT NOT NULL,
|
|
10
|
+
values_json TEXT NOT NULL,
|
|
11
|
+
PRIMARY KEY (target_id, metric_name, definition_version, producer_id, sequence)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE INDEX IF NOT EXISTS {{metricSamplesTimeIndex}}
|
|
15
|
+
ON {{metricSamples}} (target_id, metric_name, definition_version, occurred_at_ms);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{metricRollups}};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{metricRollups}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
metric_name TEXT NOT NULL,
|
|
4
|
+
definition_version INTEGER NOT NULL,
|
|
5
|
+
resolution_ms INTEGER NOT NULL CHECK (resolution_ms > 0),
|
|
6
|
+
bucket_start_ms INTEGER NOT NULL,
|
|
7
|
+
dimension_key TEXT NOT NULL,
|
|
8
|
+
dimensions_json TEXT NOT NULL,
|
|
9
|
+
values_json TEXT NOT NULL,
|
|
10
|
+
materialized_at_ms INTEGER NOT NULL,
|
|
11
|
+
PRIMARY KEY (
|
|
12
|
+
target_id,
|
|
13
|
+
metric_name,
|
|
14
|
+
definition_version,
|
|
15
|
+
resolution_ms,
|
|
16
|
+
bucket_start_ms,
|
|
17
|
+
dimension_key
|
|
18
|
+
)
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE INDEX IF NOT EXISTS {{metricRollupsTimeIndex}}
|
|
22
|
+
ON {{metricRollups}} (target_id, metric_name, resolution_ms, bucket_start_ms);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{rollupCompletions}};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{rollupCompletions}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
metric_name TEXT NOT NULL,
|
|
4
|
+
definition_version INTEGER NOT NULL,
|
|
5
|
+
resolution_ms INTEGER NOT NULL,
|
|
6
|
+
bucket_start_ms INTEGER NOT NULL,
|
|
7
|
+
sample_count INTEGER NOT NULL,
|
|
8
|
+
sample_watermark_ms INTEGER NOT NULL,
|
|
9
|
+
completed_at_ms INTEGER NOT NULL,
|
|
10
|
+
PRIMARY KEY (
|
|
11
|
+
target_id,
|
|
12
|
+
metric_name,
|
|
13
|
+
definition_version,
|
|
14
|
+
resolution_ms,
|
|
15
|
+
bucket_start_ms
|
|
16
|
+
)
|
|
17
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{extractionFailures}};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{extractionFailures}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
metric_name TEXT NOT NULL,
|
|
4
|
+
definition_version INTEGER NOT NULL,
|
|
5
|
+
producer_id TEXT NOT NULL,
|
|
6
|
+
sequence INTEGER NOT NULL,
|
|
7
|
+
reason TEXT NOT NULL,
|
|
8
|
+
recorded_at_ms INTEGER NOT NULL,
|
|
9
|
+
PRIMARY KEY (target_id, metric_name, definition_version, producer_id, sequence)
|
|
10
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{maintenanceRuns}};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{maintenanceRuns}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
run_id TEXT NOT NULL,
|
|
4
|
+
state TEXT NOT NULL CHECK (state IN ('started', 'completed', 'failed')),
|
|
5
|
+
stage TEXT NOT NULL,
|
|
6
|
+
started_at_ms INTEGER NOT NULL,
|
|
7
|
+
completed_at_ms INTEGER,
|
|
8
|
+
affected_rows INTEGER NOT NULL DEFAULT 0,
|
|
9
|
+
affected_pages INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
detail TEXT,
|
|
11
|
+
PRIMARY KEY (target_id, run_id, stage)
|
|
12
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{readerLeases}};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{readerLeases}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
lease_id TEXT NOT NULL,
|
|
4
|
+
owner_id TEXT NOT NULL,
|
|
5
|
+
acquired_at_ms INTEGER NOT NULL,
|
|
6
|
+
expires_at_ms INTEGER NOT NULL,
|
|
7
|
+
state TEXT NOT NULL CHECK (state IN ('active', 'released', 'expired')),
|
|
8
|
+
PRIMARY KEY (target_id, lease_id)
|
|
9
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP TABLE IF EXISTS {{committedDropCounters}};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS {{committedDropCounters}} (
|
|
2
|
+
target_id TEXT NOT NULL,
|
|
3
|
+
reason TEXT NOT NULL CHECK (
|
|
4
|
+
reason IN ('capacity', 'sampled', 'stopped', 'invalid', 'transport')
|
|
5
|
+
),
|
|
6
|
+
priority TEXT NOT NULL CHECK (priority IN ('low', 'normal', 'high')),
|
|
7
|
+
count INTEGER NOT NULL CHECK (count >= 0),
|
|
8
|
+
first_committed_at_ms INTEGER NOT NULL,
|
|
9
|
+
last_committed_at_ms INTEGER NOT NULL,
|
|
10
|
+
PRIMARY KEY (target_id, reason, priority)
|
|
11
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DROP INDEX IF EXISTS {{metricSamplesEventIndex}};
|
|
Binary file
|