@adonis-agora/telescope 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/dist/src/ai/index.d.ts +1 -1
- package/dist/src/ai/index.js +1 -1
- package/dist/src/alerts/index.d.ts +1 -1
- package/dist/src/alerts/index.js +1 -1
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/index.d.ts +1 -1
- package/dist/src/mcp/index.js +1 -1
- package/dist/src/metrics/metrics_service.d.ts +5 -0
- package/dist/src/metrics/metrics_service.d.ts.map +1 -1
- package/dist/src/metrics/metrics_service.js +32 -4
- package/dist/src/metrics/metrics_service.js.map +1 -1
- package/dist/src/metrics/pulse.d.ts +8 -0
- package/dist/src/metrics/pulse.d.ts.map +1 -1
- package/dist/src/metrics/pulse.js +125 -37
- package/dist/src/metrics/pulse.js.map +1 -1
- package/dist/src/metrics/stats.d.ts +2 -0
- package/dist/src/metrics/stats.d.ts.map +1 -1
- package/dist/src/metrics/stats.js +8 -3
- package/dist/src/metrics/stats.js.map +1 -1
- package/dist/src/otel/otel_exporting_store.d.ts +1 -1
- package/dist/src/otel/otel_exporting_store.d.ts.map +1 -1
- package/dist/src/otel/otel_exporting_store.js +2 -0
- package/dist/src/otel/otel_exporting_store.js.map +1 -1
- package/dist/src/profiling/index.d.ts +1 -1
- package/dist/src/profiling/index.js +1 -1
- package/dist/src/redaction/redact.d.ts.map +1 -1
- package/dist/src/redaction/redact.js +28 -4
- package/dist/src/redaction/redact.js.map +1 -1
- package/dist/src/redaction/redacting_store.d.ts +1 -1
- package/dist/src/redaction/redacting_store.d.ts.map +1 -1
- package/dist/src/redaction/redacting_store.js +2 -0
- package/dist/src/redaction/redacting_store.js.map +1 -1
- package/dist/src/sampling/sampling_store.d.ts +1 -1
- package/dist/src/sampling/sampling_store.d.ts.map +1 -1
- package/dist/src/sampling/sampling_store.js +6 -1
- package/dist/src/sampling/sampling_store.js.map +1 -1
- package/dist/src/self_scope.d.ts +5 -0
- package/dist/src/self_scope.d.ts.map +1 -0
- package/dist/src/self_scope.js +28 -0
- package/dist/src/self_scope.js.map +1 -0
- package/dist/src/service.d.ts.map +1 -1
- package/dist/src/service.js +9 -2
- package/dist/src/service.js.map +1 -1
- package/dist/src/store.d.ts +46 -0
- package/dist/src/store.d.ts.map +1 -1
- package/dist/src/store.js +16 -1
- package/dist/src/store.js.map +1 -1
- package/dist/src/stores/factory.d.ts +79 -0
- package/dist/src/stores/factory.d.ts.map +1 -1
- package/dist/src/stores/factory.js +71 -0
- package/dist/src/stores/factory.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +73 -28
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +487 -183
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/stores/memory.d.ts +3 -1
- package/dist/src/stores/memory.d.ts.map +1 -1
- package/dist/src/stores/memory.js +29 -0
- package/dist/src/stores/memory.js.map +1 -1
- package/dist/src/stores/parquet.d.ts +184 -0
- package/dist/src/stores/parquet.d.ts.map +1 -0
- package/dist/src/stores/parquet.js +461 -0
- package/dist/src/stores/parquet.js.map +1 -0
- package/dist/src/stores/parquet_duckdb.d.ts +52 -0
- package/dist/src/stores/parquet_duckdb.d.ts.map +1 -0
- package/dist/src/stores/parquet_duckdb.js +266 -0
- package/dist/src/stores/parquet_duckdb.js.map +1 -0
- package/dist/src/stores/parquet_format.d.ts +108 -0
- package/dist/src/stores/parquet_format.d.ts.map +1 -0
- package/dist/src/stores/parquet_format.js +175 -0
- package/dist/src/stores/parquet_format.js.map +1 -0
- package/dist/src/stores/parquet_hyparquet.d.ts +34 -0
- package/dist/src/stores/parquet_hyparquet.d.ts.map +1 -0
- package/dist/src/stores/parquet_hyparquet.js +212 -0
- package/dist/src/stores/parquet_hyparquet.js.map +1 -0
- package/dist/src/stores/parquet_location.d.ts +88 -0
- package/dist/src/stores/parquet_location.d.ts.map +1 -0
- package/dist/src/stores/parquet_location.js +194 -0
- package/dist/src/stores/parquet_location.js.map +1 -0
- package/dist/src/stores/tiered.d.ts +96 -0
- package/dist/src/stores/tiered.d.ts.map +1 -0
- package/dist/src/stores/tiered.js +277 -0
- package/dist/src/stores/tiered.js.map +1 -0
- package/dist/src/stream/streaming_store.d.ts +1 -1
- package/dist/src/stream/streaming_store.d.ts.map +1 -1
- package/dist/src/stream/streaming_store.js +2 -0
- package/dist/src/stream/streaming_store.js.map +1 -1
- package/dist/src/telescope_middleware.d.ts.map +1 -1
- package/dist/src/telescope_middleware.js +20 -11
- package/dist/src/telescope_middleware.js.map +1 -1
- package/dist/src/ui/index.d.ts +1 -1
- package/dist/src/ui/index.js +1 -1
- package/dist/src/watchers/cache_watcher.js +1 -1
- package/dist/src/watchers/cache_watcher.js.map +1 -1
- package/dist/src/watchers/events_watcher.js +1 -1
- package/dist/src/watchers/events_watcher.js.map +1 -1
- package/dist/src/watchers/http_client_watcher.js +1 -1
- package/dist/src/watchers/http_client_watcher.js.map +1 -1
- package/dist/src/watchers/index.d.ts +1 -1
- package/dist/src/watchers/index.js +1 -1
- package/dist/src/watchers/logs_watcher.js +1 -1
- package/dist/src/watchers/logs_watcher.js.map +1 -1
- package/dist/src/watchers/lucid_query_watcher.d.ts.map +1 -1
- package/dist/src/watchers/lucid_query_watcher.js +8 -2
- package/dist/src/watchers/lucid_query_watcher.js.map +1 -1
- package/dist/src/watchers/mail_watcher.js +1 -1
- package/dist/src/watchers/mail_watcher.js.map +1 -1
- package/dist/src/watchers/profiling_watcher.js +1 -1
- package/dist/src/watchers/profiling_watcher.js.map +1 -1
- package/dist/src/watchers/queue_watcher.js +1 -1
- package/dist/src/watchers/queue_watcher.js.map +1 -1
- package/dist/src/watchers/record.d.ts +5 -1
- package/dist/src/watchers/record.d.ts.map +1 -1
- package/dist/src/watchers/record.js +10 -1
- package/dist/src/watchers/record.js.map +1 -1
- package/dist/src/watchers/redis_watcher.js +1 -1
- package/dist/src/watchers/redis_watcher.js.map +1 -1
- package/dist/src/watchers/schedule_watcher.js +1 -1
- package/dist/src/watchers/schedule_watcher.js.map +1 -1
- package/dist/stubs/database/migrations/create_telescope_entries_table.stub +2 -2
- package/package.json +35 -9
- package/skills/telescope-setup/SKILL.md +1 -1
- package/skills/telescope-storage-retention/SKILL.md +13 -7
- package/skills/telescope-watchers/SKILL.md +7 -5
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { access, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join, resolve, sep } from 'node:path';
|
|
5
|
+
import { fromParquetRow, toNumber } from './parquet_format.js';
|
|
6
|
+
import { ensureDir, importOptionalPeer, isNotFound } from './parquet_location.js';
|
|
7
|
+
/**
|
|
8
|
+
* The optional DuckDB cold engine (`@duckdb/node-api`, an optional peer).
|
|
9
|
+
*
|
|
10
|
+
* It only reads files by local path. A directory location's files are read in place;
|
|
11
|
+
* remote files are fetched through the location (the host's own S3 client) into a
|
|
12
|
+
* bounded local cache first. The instance is locked down at start: extension
|
|
13
|
+
* auto-install/auto-load off, external access off except the data and cache
|
|
14
|
+
* directories, and the configuration locked, so DuckDB can never download or load
|
|
15
|
+
* `httpfs` / `aws` (they are not bundled; DuckDB would fetch them at runtime).
|
|
16
|
+
*/
|
|
17
|
+
export class DuckDbEngine {
|
|
18
|
+
ctx;
|
|
19
|
+
instance;
|
|
20
|
+
name = 'duckdb';
|
|
21
|
+
cache;
|
|
22
|
+
constructor(ctx, instance, cache) {
|
|
23
|
+
this.ctx = ctx;
|
|
24
|
+
this.instance = instance;
|
|
25
|
+
this.cache = cache;
|
|
26
|
+
}
|
|
27
|
+
/** Build the engine. Fails with a clear error when `@duckdb/node-api` is missing. */
|
|
28
|
+
static async create(ctx, options = {}) {
|
|
29
|
+
const duckdb = await loadDuckDb();
|
|
30
|
+
const localRoot = ctx.location.localRoot;
|
|
31
|
+
const cache = localRoot === undefined
|
|
32
|
+
? new LocalFileCache(ctx, resolve(options.cacheDir ?? join(tmpdir(), 'adonis-telescope-parquet')), options.cacheBytes ?? 1024 ** 3)
|
|
33
|
+
: null;
|
|
34
|
+
if (cache)
|
|
35
|
+
await cache.init();
|
|
36
|
+
const dataDir = localRoot ?? cache.dir;
|
|
37
|
+
const instance = await duckdb.DuckDBInstance.create(':memory:', {
|
|
38
|
+
autoinstall_known_extensions: 'false',
|
|
39
|
+
autoload_known_extensions: 'false',
|
|
40
|
+
allow_community_extensions: 'false',
|
|
41
|
+
threads: String(Math.max(1, Math.floor(options.threads ?? 2))),
|
|
42
|
+
...(options.memoryLimit !== undefined ? { memory_limit: options.memoryLimit } : {}),
|
|
43
|
+
});
|
|
44
|
+
const connection = await instance.connect();
|
|
45
|
+
try {
|
|
46
|
+
// Checked before the lockdown: listing extensions reads DuckDB's extension directory.
|
|
47
|
+
const loaded = await connection.runAndReadAll("SELECT extension_name FROM duckdb_extensions() WHERE loaded AND extension_name IN ('httpfs', 'aws')");
|
|
48
|
+
if (loaded.getRowObjectsJson().length > 0) {
|
|
49
|
+
throw new Error('@adonis-agora/telescope: DuckDB started with httpfs/aws loaded; refusing to use it.');
|
|
50
|
+
}
|
|
51
|
+
await connection.run(`SET allowed_directories = [${literal(withSlash(resolve(dataDir)))}]`);
|
|
52
|
+
await connection.run('SET enable_external_access = false');
|
|
53
|
+
await connection.run('SET lock_configuration = true');
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
connection.closeSync();
|
|
57
|
+
}
|
|
58
|
+
return new DuckDbEngine(ctx, instance, cache);
|
|
59
|
+
}
|
|
60
|
+
async list(files, query, limit) {
|
|
61
|
+
if (files.length === 0)
|
|
62
|
+
return [];
|
|
63
|
+
const where = new Where();
|
|
64
|
+
if (query.type !== undefined)
|
|
65
|
+
where.add('type = ?', query.type);
|
|
66
|
+
if (query.familyHash !== undefined)
|
|
67
|
+
where.add('family_hash = ?', query.familyHash);
|
|
68
|
+
if (query.traceId !== undefined)
|
|
69
|
+
where.add('trace_id = ?', query.traceId);
|
|
70
|
+
if (query.traceIds !== undefined) {
|
|
71
|
+
if (query.traceIds.length === 0)
|
|
72
|
+
return [];
|
|
73
|
+
where.add(`trace_id IN (${query.traceIds.map(() => '?').join(', ')})`, ...query.traceIds);
|
|
74
|
+
}
|
|
75
|
+
if (query.before !== undefined)
|
|
76
|
+
where.add('created_at < epoch_ms(?::BIGINT)', query.before.getTime());
|
|
77
|
+
if (query.after !== undefined)
|
|
78
|
+
where.add('created_at > epoch_ms(?::BIGINT)', query.after.getTime());
|
|
79
|
+
if (query.tag !== undefined)
|
|
80
|
+
where.add('contains(tags, ?)', JSON.stringify(query.tag));
|
|
81
|
+
if (query.search !== undefined) {
|
|
82
|
+
const needle = query.search.toLowerCase();
|
|
83
|
+
where.add('(contains(lower(content), ?) OR contains(lower(tags), ?))', needle, needle);
|
|
84
|
+
}
|
|
85
|
+
const rows = await this.query(files, (source) => `SELECT ${ENTRY_COLUMNS} FROM ${source}${where.sql()} ORDER BY created_at_ms DESC, sequence DESC, id DESC${limit !== undefined ? ` LIMIT ${Math.max(0, Math.floor(limit))}` : ''}`, where.values);
|
|
86
|
+
return rows.map(toEntry);
|
|
87
|
+
}
|
|
88
|
+
async get(files, id) {
|
|
89
|
+
if (files.length === 0)
|
|
90
|
+
return null;
|
|
91
|
+
const rows = await this.query(files, (source) => `SELECT ${ENTRY_COLUMNS} FROM ${source} WHERE id = ? LIMIT 1`, [id]);
|
|
92
|
+
return rows.length === 0 ? null : toEntry(rows[0]);
|
|
93
|
+
}
|
|
94
|
+
async traceIds(files, query, limit) {
|
|
95
|
+
if (files.length === 0)
|
|
96
|
+
return [];
|
|
97
|
+
const where = new Where();
|
|
98
|
+
where.add('trace_id IS NOT NULL');
|
|
99
|
+
if (query.before !== undefined)
|
|
100
|
+
where.add('created_at < epoch_ms(?::BIGINT)', query.before.getTime());
|
|
101
|
+
if (query.after !== undefined)
|
|
102
|
+
where.add('created_at > epoch_ms(?::BIGINT)', query.after.getTime());
|
|
103
|
+
const rows = await this.query(files, (source) => `SELECT trace_id, max(epoch_ms(created_at)) AS last_at FROM ${source}${where.sql()} GROUP BY trace_id ORDER BY last_at DESC LIMIT ${Math.max(0, Math.floor(limit))}`, where.values);
|
|
104
|
+
return rows.map((row) => ({
|
|
105
|
+
traceId: String(row.trace_id),
|
|
106
|
+
lastAt: new Date(toNumber(row.last_at)),
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
async countByBucket(files, query) {
|
|
110
|
+
if (files.length === 0)
|
|
111
|
+
return [];
|
|
112
|
+
const startMs = query.after.getTime();
|
|
113
|
+
const bucketMs = Math.max(1, Math.floor(query.bucketMs));
|
|
114
|
+
const where = new Where();
|
|
115
|
+
where.add('created_at > epoch_ms(?::BIGINT)', startMs);
|
|
116
|
+
where.add('created_at <= epoch_ms(?::BIGINT)', query.before.getTime());
|
|
117
|
+
if (query.type !== undefined)
|
|
118
|
+
where.add('type = ?', query.type);
|
|
119
|
+
const rows = await this.query(files, (source) => `SELECT CAST(floor((epoch_ms(created_at) - ${startMs}) / ${bucketMs}) AS BIGINT) AS idx, type, count(*) AS n FROM ${source}${where.sql()} GROUP BY 1, 2`, where.values);
|
|
120
|
+
return rows.map((row) => ({
|
|
121
|
+
index: toNumber(row.idx),
|
|
122
|
+
type: String(row.type),
|
|
123
|
+
count: toNumber(row.n),
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
async close() {
|
|
127
|
+
this.instance.closeSync();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Run one statement over `files`. A file deleted between listing and reading
|
|
131
|
+
* (retention, compaction) makes DuckDB fail the whole scan, so on an IO error the
|
|
132
|
+
* statement is retried once over the files that still exist.
|
|
133
|
+
*/
|
|
134
|
+
async query(files, sql, values) {
|
|
135
|
+
let paths = await this.paths(files);
|
|
136
|
+
for (let attempt = 0;; attempt++) {
|
|
137
|
+
if (paths.length === 0)
|
|
138
|
+
return [];
|
|
139
|
+
const connection = await this.instance.connect();
|
|
140
|
+
try {
|
|
141
|
+
const reader = await connection.runAndReadAll(sql(source(paths)), values);
|
|
142
|
+
return reader.getRowObjectsJS();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (attempt > 0 || !/IO Error|No files found/i.test(String(error?.message)))
|
|
146
|
+
throw error;
|
|
147
|
+
paths = await existing(paths);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
connection.closeSync();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async paths(files) {
|
|
155
|
+
if (this.cache === null) {
|
|
156
|
+
const local = this.ctx.location.localPath;
|
|
157
|
+
return files.map((file) => local.call(this.ctx.location, file.key));
|
|
158
|
+
}
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const file of files) {
|
|
161
|
+
const path = await this.cache.ensure(file);
|
|
162
|
+
if (path !== null)
|
|
163
|
+
out.push(path);
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const ENTRY_COLUMNS = 'id, type, family_hash, content, tags, sequence, duration_ms, origin, trace_id, epoch_ms(created_at) AS created_at_ms';
|
|
169
|
+
function toEntry(row) {
|
|
170
|
+
return fromParquetRow({ ...row, created_at: toNumber(row.created_at_ms) });
|
|
171
|
+
}
|
|
172
|
+
function source(paths) {
|
|
173
|
+
return `read_parquet([${paths.map(literal).join(', ')}])`;
|
|
174
|
+
}
|
|
175
|
+
class Where {
|
|
176
|
+
clauses = [];
|
|
177
|
+
values = [];
|
|
178
|
+
add(clause, ...values) {
|
|
179
|
+
this.clauses.push(clause);
|
|
180
|
+
this.values.push(...values);
|
|
181
|
+
}
|
|
182
|
+
sql() {
|
|
183
|
+
return this.clauses.length === 0 ? '' : ` WHERE ${this.clauses.join(' AND ')}`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function literal(value) {
|
|
187
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
188
|
+
}
|
|
189
|
+
function withSlash(path) {
|
|
190
|
+
return path.endsWith(sep) ? path : `${path}${sep}`;
|
|
191
|
+
}
|
|
192
|
+
async function existing(paths) {
|
|
193
|
+
const out = [];
|
|
194
|
+
for (const path of paths) {
|
|
195
|
+
try {
|
|
196
|
+
await access(path);
|
|
197
|
+
out.push(path);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// gone
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
async function loadDuckDb() {
|
|
206
|
+
return importOptionalPeer('@duckdb/node-api', "storage.parquet({ engine: 'duckdb' })", () => import('@duckdb/node-api'));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Remote files copied to local disk for DuckDB, keyed by a hash of their (immutable)
|
|
210
|
+
* key and evicted least-recently-used past a byte budget. Copies go through the
|
|
211
|
+
* location, i.e. the host's own S3 client.
|
|
212
|
+
*/
|
|
213
|
+
class LocalFileCache {
|
|
214
|
+
ctx;
|
|
215
|
+
dir;
|
|
216
|
+
budget;
|
|
217
|
+
entries = new Map();
|
|
218
|
+
bytes = 0;
|
|
219
|
+
constructor(ctx, dir, budget) {
|
|
220
|
+
this.ctx = ctx;
|
|
221
|
+
this.dir = dir;
|
|
222
|
+
this.budget = budget;
|
|
223
|
+
}
|
|
224
|
+
async init() {
|
|
225
|
+
await ensureDir(this.dir);
|
|
226
|
+
}
|
|
227
|
+
async ensure(file) {
|
|
228
|
+
const hit = this.entries.get(file.key);
|
|
229
|
+
if (hit) {
|
|
230
|
+
this.entries.delete(file.key);
|
|
231
|
+
this.entries.set(file.key, hit);
|
|
232
|
+
return hit.path;
|
|
233
|
+
}
|
|
234
|
+
const path = join(this.dir, `${createHash('sha256').update(file.key).digest('hex')}.parquet`);
|
|
235
|
+
try {
|
|
236
|
+
await stat(path);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
let bytes;
|
|
240
|
+
try {
|
|
241
|
+
bytes = await this.ctx.location.read(file.key, 0);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
if (isNotFound(error))
|
|
245
|
+
return null;
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
249
|
+
await writeFile(temp, bytes);
|
|
250
|
+
await rename(temp, path);
|
|
251
|
+
}
|
|
252
|
+
this.entries.set(file.key, { path, size: file.size });
|
|
253
|
+
this.bytes += file.size;
|
|
254
|
+
await this.evict();
|
|
255
|
+
return path;
|
|
256
|
+
}
|
|
257
|
+
async evict() {
|
|
258
|
+
while (this.bytes > this.budget && this.entries.size > 1) {
|
|
259
|
+
const [key, oldest] = this.entries.entries().next().value;
|
|
260
|
+
this.entries.delete(key);
|
|
261
|
+
this.bytes -= oldest.size;
|
|
262
|
+
await rm(oldest.path, { force: true });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=parquet_duckdb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet_duckdb.js","sourceRoot":"","sources":["../../../src/stores/parquet_duckdb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type Entry } from '../entry.js';
|
|
2
|
+
import type { EntryQuery } from '../store.js';
|
|
3
|
+
/** One hour, in ms. Partitions are hourly. */
|
|
4
|
+
export declare const HOUR_MS = 3600000;
|
|
5
|
+
/**
|
|
6
|
+
* The on-disk row. `content` and `tags` are JSON text, exactly as the Lucid store keeps
|
|
7
|
+
* them, so a tag match is the same quoted-token substring test in every engine and no
|
|
8
|
+
* engine needs nested-type support. `created_at` is a millisecond TIMESTAMP so both the
|
|
9
|
+
* row-group statistics and DuckDB see a real time column.
|
|
10
|
+
*/
|
|
11
|
+
export interface ParquetRow {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
family_hash: string | null;
|
|
15
|
+
content: string;
|
|
16
|
+
tags: string;
|
|
17
|
+
sequence: bigint;
|
|
18
|
+
duration_ms: bigint | null;
|
|
19
|
+
origin: string;
|
|
20
|
+
trace_id: string | null;
|
|
21
|
+
instance_id: string;
|
|
22
|
+
created_at: Date;
|
|
23
|
+
}
|
|
24
|
+
/** Column order and types, shared by the writer and the DuckDB projection. */
|
|
25
|
+
export declare const PARQUET_COLUMNS: readonly [{
|
|
26
|
+
readonly name: 'id';
|
|
27
|
+
readonly type: 'STRING';
|
|
28
|
+
readonly nullable: false;
|
|
29
|
+
readonly bloomFilter: true;
|
|
30
|
+
}, {
|
|
31
|
+
readonly name: 'type';
|
|
32
|
+
readonly type: 'STRING';
|
|
33
|
+
readonly nullable: false;
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: 'family_hash';
|
|
36
|
+
readonly type: 'STRING';
|
|
37
|
+
readonly nullable: true;
|
|
38
|
+
}, {
|
|
39
|
+
readonly name: 'content';
|
|
40
|
+
readonly type: 'STRING';
|
|
41
|
+
readonly nullable: false;
|
|
42
|
+
}, {
|
|
43
|
+
readonly name: 'tags';
|
|
44
|
+
readonly type: 'STRING';
|
|
45
|
+
readonly nullable: false;
|
|
46
|
+
}, {
|
|
47
|
+
readonly name: 'sequence';
|
|
48
|
+
readonly type: 'INT64';
|
|
49
|
+
readonly nullable: false;
|
|
50
|
+
}, {
|
|
51
|
+
readonly name: 'duration_ms';
|
|
52
|
+
readonly type: 'INT64';
|
|
53
|
+
readonly nullable: true;
|
|
54
|
+
}, {
|
|
55
|
+
readonly name: 'origin';
|
|
56
|
+
readonly type: 'STRING';
|
|
57
|
+
readonly nullable: false;
|
|
58
|
+
}, {
|
|
59
|
+
readonly name: 'trace_id';
|
|
60
|
+
readonly type: 'STRING';
|
|
61
|
+
readonly nullable: true;
|
|
62
|
+
readonly bloomFilter: true;
|
|
63
|
+
}, {
|
|
64
|
+
readonly name: 'instance_id';
|
|
65
|
+
readonly type: 'STRING';
|
|
66
|
+
readonly nullable: false;
|
|
67
|
+
}, {
|
|
68
|
+
readonly name: 'created_at';
|
|
69
|
+
readonly type: 'TIMESTAMP';
|
|
70
|
+
readonly nullable: false;
|
|
71
|
+
}];
|
|
72
|
+
export declare function toParquetRow(entry: Entry, instanceId: string): ParquetRow;
|
|
73
|
+
/** Rebuild an {@link Entry} from a row as either engine returns it. */
|
|
74
|
+
export declare function fromParquetRow(row: Record<string, unknown>): Entry;
|
|
75
|
+
/** A file's partition, parsed from its key. */
|
|
76
|
+
export interface PartitionKey {
|
|
77
|
+
type: string;
|
|
78
|
+
/** Start of the file's UTC hour, epoch ms. */
|
|
79
|
+
hourStartMs: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* `type=<type>/dt=<yyyy-mm-dd>/hour=<hh>/` — type first, so a query on one type (and a
|
|
83
|
+
* bucket lifecycle rule on one type) only touches that type's prefix.
|
|
84
|
+
*/
|
|
85
|
+
export declare function partitionPrefix(type: string, hourStartMs: number): string;
|
|
86
|
+
export declare function typePrefix(type: string): string;
|
|
87
|
+
/** Parse a location-relative key, or `null` for anything that is not ours. */
|
|
88
|
+
export declare function parsePartition(key: string): PartitionKey | null;
|
|
89
|
+
export declare function hourStart(ms: number): number;
|
|
90
|
+
/**
|
|
91
|
+
* Newest-first total order used by every tier: `createdAt` desc, then `sequence` desc
|
|
92
|
+
* (the Lucid store's tiebreaker), then `id` desc so the order is total across pods.
|
|
93
|
+
*/
|
|
94
|
+
export declare function compareNewestFirst(a: Entry, b: Entry): number;
|
|
95
|
+
/** The `{ page, size }` of a query, resolved: how many to skip and how many to keep. */
|
|
96
|
+
export declare function resolvePage(query: EntryQuery): {
|
|
97
|
+
offset: number;
|
|
98
|
+
size: number | undefined;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The predicates of an {@link EntryQuery} that need the row itself (everything except
|
|
102
|
+
* the time bounds and type, which partitions and statistics already prune). Applied
|
|
103
|
+
* in JS by the hyparquet engine and as a final guard on merged results.
|
|
104
|
+
*/
|
|
105
|
+
export declare function matchesQuery(entry: Entry, query: EntryQuery): boolean;
|
|
106
|
+
export declare function toNumber(value: unknown): number;
|
|
107
|
+
export declare function toDate(value: unknown): Date;
|
|
108
|
+
//# sourceMappingURL=parquet_format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet_format.d.ts","sourceRoot":"","sources":["../../../src/stores/parquet_format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { isBatchOrigin } from '../entry.js';
|
|
2
|
+
/** One hour, in ms. Partitions are hourly. */
|
|
3
|
+
export const HOUR_MS = 3_600_000;
|
|
4
|
+
/** Column order and types, shared by the writer and the DuckDB projection. */
|
|
5
|
+
export const PARQUET_COLUMNS = [
|
|
6
|
+
{ name: 'id', type: 'STRING', nullable: false, bloomFilter: true },
|
|
7
|
+
{ name: 'type', type: 'STRING', nullable: false },
|
|
8
|
+
{ name: 'family_hash', type: 'STRING', nullable: true },
|
|
9
|
+
{ name: 'content', type: 'STRING', nullable: false },
|
|
10
|
+
{ name: 'tags', type: 'STRING', nullable: false },
|
|
11
|
+
{ name: 'sequence', type: 'INT64', nullable: false },
|
|
12
|
+
{ name: 'duration_ms', type: 'INT64', nullable: true },
|
|
13
|
+
{ name: 'origin', type: 'STRING', nullable: false },
|
|
14
|
+
{ name: 'trace_id', type: 'STRING', nullable: true, bloomFilter: true },
|
|
15
|
+
{ name: 'instance_id', type: 'STRING', nullable: false },
|
|
16
|
+
{ name: 'created_at', type: 'TIMESTAMP', nullable: false },
|
|
17
|
+
];
|
|
18
|
+
export function toParquetRow(entry, instanceId) {
|
|
19
|
+
return {
|
|
20
|
+
id: entry.id,
|
|
21
|
+
type: entry.type,
|
|
22
|
+
family_hash: entry.familyHash,
|
|
23
|
+
content: safeJson(entry.content),
|
|
24
|
+
tags: JSON.stringify(entry.tags),
|
|
25
|
+
sequence: BigInt(Math.trunc(entry.sequence)),
|
|
26
|
+
duration_ms: entry.durationMs == null ? null : BigInt(Math.round(entry.durationMs)),
|
|
27
|
+
origin: entry.origin,
|
|
28
|
+
trace_id: entry.traceId,
|
|
29
|
+
instance_id: instanceId,
|
|
30
|
+
created_at: entry.createdAt,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Rebuild an {@link Entry} from a row as either engine returns it. */
|
|
34
|
+
export function fromParquetRow(row) {
|
|
35
|
+
const duration = row.duration_ms;
|
|
36
|
+
return {
|
|
37
|
+
id: String(row.id),
|
|
38
|
+
type: String(row.type),
|
|
39
|
+
familyHash: row.family_hash == null ? null : String(row.family_hash),
|
|
40
|
+
content: parseJson(String(row.content ?? 'null')),
|
|
41
|
+
tags: parseTags(String(row.tags ?? '[]')),
|
|
42
|
+
sequence: toNumber(row.sequence),
|
|
43
|
+
durationMs: duration == null ? null : toNumber(duration),
|
|
44
|
+
origin: isBatchOrigin(row.origin) ? row.origin : 'manual',
|
|
45
|
+
traceId: row.trace_id == null ? null : String(row.trace_id),
|
|
46
|
+
createdAt: toDate(row.created_at),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* `type=<type>/dt=<yyyy-mm-dd>/hour=<hh>/` — type first, so a query on one type (and a
|
|
51
|
+
* bucket lifecycle rule on one type) only touches that type's prefix.
|
|
52
|
+
*/
|
|
53
|
+
export function partitionPrefix(type, hourStartMs) {
|
|
54
|
+
const d = new Date(hourStartMs);
|
|
55
|
+
const dt = `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
|
|
56
|
+
return `${typePrefix(type)}dt=${dt}/hour=${pad(d.getUTCHours())}/`;
|
|
57
|
+
}
|
|
58
|
+
export function typePrefix(type) {
|
|
59
|
+
return `type=${encodeURIComponent(type)}/`;
|
|
60
|
+
}
|
|
61
|
+
const KEY_PATTERN = /^type=([^/]+)\/dt=(\d{4})-(\d{2})-(\d{2})\/hour=(\d{2})\/[^/]+\.parquet$/;
|
|
62
|
+
/** Parse a location-relative key, or `null` for anything that is not ours. */
|
|
63
|
+
export function parsePartition(key) {
|
|
64
|
+
const match = KEY_PATTERN.exec(key);
|
|
65
|
+
if (!match)
|
|
66
|
+
return null;
|
|
67
|
+
const [, type, y, m, d, h] = match;
|
|
68
|
+
let decoded;
|
|
69
|
+
try {
|
|
70
|
+
decoded = decodeURIComponent(type);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
type: decoded,
|
|
77
|
+
hourStartMs: Date.UTC(Number(y), Number(m) - 1, Number(d), Number(h)),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function hourStart(ms) {
|
|
81
|
+
return Math.floor(ms / HOUR_MS) * HOUR_MS;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Newest-first total order used by every tier: `createdAt` desc, then `sequence` desc
|
|
85
|
+
* (the Lucid store's tiebreaker), then `id` desc so the order is total across pods.
|
|
86
|
+
*/
|
|
87
|
+
export function compareNewestFirst(a, b) {
|
|
88
|
+
const t = b.createdAt.getTime() - a.createdAt.getTime();
|
|
89
|
+
if (t !== 0)
|
|
90
|
+
return t;
|
|
91
|
+
if (a.sequence !== b.sequence)
|
|
92
|
+
return b.sequence - a.sequence;
|
|
93
|
+
return a.id < b.id ? 1 : a.id > b.id ? -1 : 0;
|
|
94
|
+
}
|
|
95
|
+
/** The `{ page, size }` of a query, resolved: how many to skip and how many to keep. */
|
|
96
|
+
export function resolvePage(query) {
|
|
97
|
+
if (query.size === undefined || query.size <= 0)
|
|
98
|
+
return { offset: 0, size: undefined };
|
|
99
|
+
const size = Math.floor(query.size);
|
|
100
|
+
const page = Math.max(1, Math.floor(query.page ?? 1));
|
|
101
|
+
return { offset: (page - 1) * size, size };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The predicates of an {@link EntryQuery} that need the row itself (everything except
|
|
105
|
+
* the time bounds and type, which partitions and statistics already prune). Applied
|
|
106
|
+
* in JS by the hyparquet engine and as a final guard on merged results.
|
|
107
|
+
*/
|
|
108
|
+
export function matchesQuery(entry, query) {
|
|
109
|
+
if (query.type !== undefined && entry.type !== query.type)
|
|
110
|
+
return false;
|
|
111
|
+
if (query.familyHash !== undefined && entry.familyHash !== query.familyHash)
|
|
112
|
+
return false;
|
|
113
|
+
if (query.traceId !== undefined && entry.traceId !== query.traceId)
|
|
114
|
+
return false;
|
|
115
|
+
if (query.traceIds !== undefined) {
|
|
116
|
+
if (entry.traceId === null || !query.traceIds.includes(entry.traceId))
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (query.before !== undefined && !(entry.createdAt < query.before))
|
|
120
|
+
return false;
|
|
121
|
+
if (query.after !== undefined && !(entry.createdAt > query.after))
|
|
122
|
+
return false;
|
|
123
|
+
if (query.tag !== undefined && !entry.tags.includes(query.tag))
|
|
124
|
+
return false;
|
|
125
|
+
if (query.search !== undefined) {
|
|
126
|
+
const needle = query.search.toLowerCase();
|
|
127
|
+
if (!entry.tags.some((tag) => tag.toLowerCase().includes(needle))) {
|
|
128
|
+
if (!safeJson(entry.content).toLowerCase().includes(needle))
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
function pad(n) {
|
|
135
|
+
return n < 10 ? `0${n}` : String(n);
|
|
136
|
+
}
|
|
137
|
+
function safeJson(value) {
|
|
138
|
+
try {
|
|
139
|
+
return JSON.stringify(value) ?? 'null';
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return 'null';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function parseJson(text) {
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(text);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function parseTags(text) {
|
|
154
|
+
const parsed = parseJson(text);
|
|
155
|
+
return Array.isArray(parsed) ? parsed.filter((t) => typeof t === 'string') : [];
|
|
156
|
+
}
|
|
157
|
+
export function toNumber(value) {
|
|
158
|
+
if (typeof value === 'number')
|
|
159
|
+
return value;
|
|
160
|
+
if (typeof value === 'bigint')
|
|
161
|
+
return Number(value);
|
|
162
|
+
if (typeof value === 'string')
|
|
163
|
+
return Number(value) || 0;
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
export function toDate(value) {
|
|
167
|
+
if (value instanceof Date)
|
|
168
|
+
return value;
|
|
169
|
+
if (typeof value === 'number' || typeof value === 'bigint')
|
|
170
|
+
return new Date(Number(value));
|
|
171
|
+
if (typeof value === 'string')
|
|
172
|
+
return new Date(value);
|
|
173
|
+
return new Date(0);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=parquet_format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet_format.js","sourceRoot":"","sources":["../../../src/stores/parquet_format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Entry } from '../entry.js';
|
|
2
|
+
import type { BucketCountQuery, BucketCountRow, EntryQuery, TraceIdRow } from '../store.js';
|
|
3
|
+
import type { ColdEngineContext, ColdFile, ColdReadEngine } from './parquet.js';
|
|
4
|
+
/**
|
|
5
|
+
* The default cold engine: pure JavaScript (hyparquet), nothing native and nothing
|
|
6
|
+
* fetched at runtime.
|
|
7
|
+
*
|
|
8
|
+
* Reads walk files newest-first and, inside each file, row groups newest-first,
|
|
9
|
+
* skipping any group whose `created_at` statistics fall outside the query, and stop
|
|
10
|
+
* as soon as the page is full and nothing older can still outrank it. Equality
|
|
11
|
+
* filters on `id` / `trace_id` also consult the bloom filters the writer emits.
|
|
12
|
+
*/
|
|
13
|
+
export declare class HyparquetEngine implements ColdReadEngine {
|
|
14
|
+
private readonly ctx;
|
|
15
|
+
readonly name: 'hyparquet';
|
|
16
|
+
constructor(ctx: ColdEngineContext);
|
|
17
|
+
list(files: ColdFile[], query: EntryQuery, limit: number | undefined): Promise<Entry[]>;
|
|
18
|
+
get(files: ColdFile[], id: string): Promise<Entry | null>;
|
|
19
|
+
traceIds(files: ColdFile[], query: {
|
|
20
|
+
before?: Date;
|
|
21
|
+
after?: Date;
|
|
22
|
+
}, limit: number): Promise<TraceIdRow[]>;
|
|
23
|
+
countByBucket(files: ColdFile[], query: BucketCountQuery): Promise<BucketCountRow[]>;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
/** One row group as plain objects; a file that vanished since listing reads as empty. */
|
|
26
|
+
private readGroup;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Every {@link EntryQuery} predicate, evaluated on the stored row before it is parsed.
|
|
30
|
+
* `tag` matches the quoted token inside the JSON text and `search` is a lower-cased
|
|
31
|
+
* substring over `content` and `tags` — the same semantics as the Lucid store.
|
|
32
|
+
*/
|
|
33
|
+
export declare function rowMatches(row: Record<string, unknown>, query: EntryQuery): boolean;
|
|
34
|
+
//# sourceMappingURL=parquet_hyparquet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet_hyparquet.d.ts","sourceRoot":"","sources":["../../../src/stores/parquet_hyparquet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAC;AAM/F;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,cAAc;IAGxC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IAErC,YAA6B,GAAG,EAAE,iBAAiB,EAAI;IAEjD,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAwB5F;IAEK,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAU9D;IAEK,QAAQ,CACZ,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAE,EACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC,CA8BvB;IAEK,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAsBzF;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAE/B,yFAAyF;YAC3E,SAAS;CAwBxB;AA+BD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CA0BnF"}
|