@grepr/cli 1.14.13-15e1f25 → 1.15.0-f5dcf28
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/build/dist/commands/job-draft-command.d.ts.map +1 -1
- package/build/dist/commands/job-draft-command.js +6 -71
- package/build/dist/commands/job-draft-command.js.map +1 -1
- package/build/dist/docs-index/index.json +1 -1
- package/build/dist/grepr.d.ts.map +1 -1
- package/build/dist/grepr.js +0 -2
- package/build/dist/grepr.js.map +1 -1
- package/build/dist/lib/backfill.js +4 -8
- package/build/dist/lib/backfill.js.map +1 -1
- package/build/dist/lib/job-patch.d.ts +15 -31
- package/build/dist/lib/job-patch.d.ts.map +1 -1
- package/build/dist/lib/job-patch.js +39 -709
- package/build/dist/lib/job-patch.js.map +1 -1
- package/build/dist/lib/job-plan.d.ts +3 -6
- package/build/dist/lib/job-plan.d.ts.map +1 -1
- package/build/dist/lib/job-plan.js +5 -55
- package/build/dist/lib/job-plan.js.map +1 -1
- package/build/dist/lib/option-parsers.d.ts +0 -5
- package/build/dist/lib/option-parsers.d.ts.map +1 -1
- package/build/dist/lib/option-parsers.js +0 -7
- package/build/dist/lib/option-parsers.js.map +1 -1
- package/build/dist/lib/signal-source.d.ts +1 -1
- package/build/dist/lib/signal-source.d.ts.map +1 -1
- package/build/dist/lib/signal-source.js +10 -69
- package/build/dist/lib/signal-source.js.map +1 -1
- package/build/dist/types.d.ts +8 -37
- package/build/dist/types.d.ts.map +1 -1
- package/build/dist/types.js +0 -69
- package/build/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/build/dist/commands/job-to-test-command.d.ts +0 -74
- package/build/dist/commands/job-to-test-command.d.ts.map +0 -1
- package/build/dist/commands/job-to-test-command.js +0 -161
- package/build/dist/commands/job-to-test-command.js.map +0 -1
- package/build/dist/lib/job-graph-log-pipeline-constants.d.ts +0 -12
- package/build/dist/lib/job-graph-log-pipeline-constants.d.ts.map +0 -1
- package/build/dist/lib/job-graph-log-pipeline-constants.js +0 -16
- package/build/dist/lib/job-graph-log-pipeline-constants.js.map +0 -1
- package/build/dist/lib/job-graph-transformer.d.ts +0 -119
- package/build/dist/lib/job-graph-transformer.d.ts.map +0 -1
- package/build/dist/lib/job-graph-transformer.js +0 -767
- package/build/dist/lib/job-graph-transformer.js.map +0 -1
- package/build/dist/lib/job-graph-utils.d.ts +0 -50
- package/build/dist/lib/job-graph-utils.d.ts.map +0 -1
- package/build/dist/lib/job-graph-utils.js +0 -90
- package/build/dist/lib/job-graph-utils.js.map +0 -1
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { CreateLogsBackfillJobDataType, CreateSpansBackfillJobDataType,
|
|
2
|
-
import { parseEdge } from './job-graph-utils.js';
|
|
1
|
+
import { CreateLogsBackfillJobDataType, CreateSpansBackfillJobDataType, TemplateOperationType } from '../openapi/openApiTypes.js';
|
|
3
2
|
const LOG_REDUCER_TEMPLATE_NAME = 'log-reducer-job-graph-template';
|
|
4
3
|
const TRACE_REDUCER_TEMPLATE_NAME = 'trace-reducer-job-graph-template';
|
|
5
|
-
const RAW_LOGS_SINK_NAME_PREFIX = 'raw_data_sink';
|
|
6
4
|
export function parseSignalDataType(value) {
|
|
7
5
|
switch (value) {
|
|
8
6
|
case CreateLogsBackfillJobDataType.logs:
|
|
@@ -35,8 +33,7 @@ export async function resolveSignalSource(options, apiClient, resolutionOptions
|
|
|
35
33
|
dataType: options.dataType ?? CreateLogsBackfillJobDataType.logs,
|
|
36
34
|
datasetId: options.datasetId,
|
|
37
35
|
teamIds: [],
|
|
38
|
-
sinkOperations: []
|
|
39
|
-
postReducerSqlOperations: []
|
|
36
|
+
sinkOperations: []
|
|
40
37
|
};
|
|
41
38
|
}
|
|
42
39
|
const dataset = await resolveDatasetFromOptions(options, apiClient);
|
|
@@ -44,8 +41,7 @@ export async function resolveSignalSource(options, apiClient, resolutionOptions
|
|
|
44
41
|
dataType: options.dataType ?? CreateLogsBackfillJobDataType.logs,
|
|
45
42
|
datasetId: dataset.id,
|
|
46
43
|
teamIds: includeTeamIds ? dataset.teamIds ?? [] : [],
|
|
47
|
-
sinkOperations: []
|
|
48
|
-
postReducerSqlOperations: []
|
|
44
|
+
sinkOperations: []
|
|
49
45
|
};
|
|
50
46
|
}
|
|
51
47
|
const job = await apiClient.getJob(options.jobId);
|
|
@@ -74,10 +70,12 @@ async function inferJobSource(job, apiClient) {
|
|
|
74
70
|
throw new Error(`Source job ${job.id ?? job.name} has an ambiguous pipeline definition`);
|
|
75
71
|
}
|
|
76
72
|
const templateOperation = templateOperations[0];
|
|
77
|
-
if (templateOperation) {
|
|
78
|
-
|
|
73
|
+
if (!templateOperation) {
|
|
74
|
+
throw new Error(`Source job ${job.id ?? job.name} uses a raw job graph (no template-operation vertex). ` +
|
|
75
|
+
'--job-id supports only template-backed pipelines. ' +
|
|
76
|
+
'Pass --dataset-id or --dataset-name instead. For a trace pipeline, also pass --data-type spans.');
|
|
79
77
|
}
|
|
80
|
-
return
|
|
78
|
+
return inferTemplateJobSource(templateOperation, apiClient);
|
|
81
79
|
}
|
|
82
80
|
async function inferTemplateJobSource(operation, apiClient) {
|
|
83
81
|
const template = await apiClient.getTemplate(operation.templateId, operation.templateVersion);
|
|
@@ -95,8 +93,7 @@ async function inferTemplateJobSource(operation, apiClient) {
|
|
|
95
93
|
datasetId,
|
|
96
94
|
sinkOperations: sinks
|
|
97
95
|
.map(wrapper => wrapper.sink)
|
|
98
|
-
.filter(isOperation)
|
|
99
|
-
postReducerSqlOperations: []
|
|
96
|
+
.filter(isOperation)
|
|
100
97
|
};
|
|
101
98
|
}
|
|
102
99
|
case TRACE_REDUCER_TEMPLATE_NAME: {
|
|
@@ -110,57 +107,13 @@ async function inferTemplateJobSource(operation, apiClient) {
|
|
|
110
107
|
sinkOperations: (spansInput.sinks ?? [])
|
|
111
108
|
.map(wrapper => wrapper.sink)
|
|
112
109
|
.filter(isOperation),
|
|
113
|
-
|
|
114
|
-
? [spansInput.sqlOperations.postReducer.sqlOperation]
|
|
115
|
-
: []
|
|
110
|
+
postReducerSqlOperation: spansInput.sqlOperations?.postReducer?.sqlOperation
|
|
116
111
|
};
|
|
117
112
|
}
|
|
118
113
|
default:
|
|
119
114
|
throw new Error(`Source job uses unsupported pipeline template ${template.name} (${operation.templateId})`);
|
|
120
115
|
}
|
|
121
116
|
}
|
|
122
|
-
function inferRawJobSource(job) {
|
|
123
|
-
const operations = job.jobGraph.vertices;
|
|
124
|
-
const rawLogSinks = operations.filter(isRawLogsSink);
|
|
125
|
-
const traceReducers = operations.filter(isTraceReducerWithDataset);
|
|
126
|
-
if (rawLogSinks.length > 0 && traceReducers.length > 0) {
|
|
127
|
-
throw new Error(`Source job ${job.id ?? job.name} contains both logs and spans datasets`);
|
|
128
|
-
}
|
|
129
|
-
if (rawLogSinks.length > 1) {
|
|
130
|
-
throw new Error(`Source job ${job.id ?? job.name} has multiple raw logs datasets; ` +
|
|
131
|
-
'use --dataset-id to select one explicitly');
|
|
132
|
-
}
|
|
133
|
-
if (traceReducers.length > 1) {
|
|
134
|
-
throw new Error(`Source job ${job.id ?? job.name} has multiple spans datasets; ` +
|
|
135
|
-
'use --dataset-id to select one explicitly');
|
|
136
|
-
}
|
|
137
|
-
const rawLogSink = rawLogSinks[0];
|
|
138
|
-
if (rawLogSinks.length === 1 && rawLogSink) {
|
|
139
|
-
return {
|
|
140
|
-
dataType: CreateLogsBackfillJobDataType.logs,
|
|
141
|
-
datasetId: rawLogSink.datasetId,
|
|
142
|
-
sinkOperations: operations,
|
|
143
|
-
postReducerSqlOperations: []
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
const traceReducer = traceReducers[0];
|
|
147
|
-
if (traceReducers.length === 1 && traceReducer) {
|
|
148
|
-
const postReducerSqlOperations = job.jobGraph.vertices
|
|
149
|
-
.filter(isSqlOperation)
|
|
150
|
-
.filter(operation => job.jobGraph.edges.some(edge => {
|
|
151
|
-
const parsed = parseEdge(edge);
|
|
152
|
-
return parsed.sourceVertex === traceReducer.name &&
|
|
153
|
-
parsed.targetVertex === operation.name;
|
|
154
|
-
}));
|
|
155
|
-
return {
|
|
156
|
-
dataType: CreateSpansBackfillJobDataType.spans,
|
|
157
|
-
datasetId: traceReducer.datasetId,
|
|
158
|
-
sinkOperations: operations,
|
|
159
|
-
postReducerSqlOperations
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
throw new Error(`Source job ${job.id ?? job.name} has no supported raw logs or spans dataset`);
|
|
163
|
-
}
|
|
164
117
|
async function resolveDatasetFromOptions(options, apiClient) {
|
|
165
118
|
if (options.datasetId) {
|
|
166
119
|
return resolveDataset(options.datasetId, 'id', apiClient);
|
|
@@ -186,18 +139,6 @@ function requireDatasetName(datasetName) {
|
|
|
186
139
|
function isTemplateOperation(operation) {
|
|
187
140
|
return operation.type === TemplateOperationType.template_operation;
|
|
188
141
|
}
|
|
189
|
-
function isSqlOperation(operation) {
|
|
190
|
-
return operation.type === SqlOperationType.sql_operation;
|
|
191
|
-
}
|
|
192
|
-
function isRawLogsSink(operation) {
|
|
193
|
-
return operation.type === LogsIcebergTableSinkType.logs_iceberg_table_sink &&
|
|
194
|
-
operation.name.startsWith(RAW_LOGS_SINK_NAME_PREFIX);
|
|
195
|
-
}
|
|
196
|
-
function isTraceReducerWithDataset(operation) {
|
|
197
|
-
return operation.type === TraceReducerType.trace_reducer &&
|
|
198
|
-
typeof operation.datasetId === 'string' &&
|
|
199
|
-
operation.datasetId.length > 0;
|
|
200
|
-
}
|
|
201
142
|
function isOperation(operation) {
|
|
202
143
|
return operation !== undefined;
|
|
203
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-source.js","sourceRoot":"","sources":["../../../src/main/typescript/lib/signal-source.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,
|
|
1
|
+
{"version":3,"file":"signal-source.js","sourceRoot":"","sources":["../../../src/main/typescript/lib/signal-source.ts"],"names":[],"mappings":"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"}
|
package/build/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for the Grepr CLI tool
|
|
3
3
|
*/
|
|
4
|
-
import { type AgentSessionEventsIcebergTableSourceSortOrder, PathsV1JobsGetParametersQueryExecution, PathsV1JobsGetParametersQueryProcessing, PathsV1JobsGetParametersQueryState, type SchemaReadDatadog, type SchemaReadDataWarehouse, type SchemaReadS3DataWarehouse, type SchemaReadNewRelic, type SchemaReadOtlp, type SchemaReadSplunk, type SchemaReadSumo
|
|
4
|
+
import { type AgentSessionEventsIcebergTableSourceSortOrder, PathsV1JobsGetParametersQueryExecution, PathsV1JobsGetParametersQueryProcessing, PathsV1JobsGetParametersQueryState, type SchemaReadDatadog, type SchemaReadDataWarehouse, type SchemaReadS3DataWarehouse, type SchemaReadNewRelic, type SchemaReadOtlp, type SchemaReadSplunk, type SchemaReadSumo } from './openapi/openApiTypes.js';
|
|
5
5
|
import type { SourcePredicateOptions } from './lib/query-predicate.js';
|
|
6
6
|
import type { SignalSourceInputs } from './lib/signal-source.js';
|
|
7
7
|
export type AuthMethod = 'oauth' | 'client-credentials' | 'none';
|
|
@@ -80,27 +80,16 @@ export interface JobDraftCommandOptions extends CliOptions {
|
|
|
80
80
|
* exclusive with the positional plan-file argument.
|
|
81
81
|
*/
|
|
82
82
|
jobId?: string;
|
|
83
|
-
/**
|
|
84
|
-
* Job-graph backend only. `maxAllowedRate` (messages/sec) for the
|
|
85
|
-
* logs-event-sampler inserted after each live source. Omitted by default so
|
|
86
|
-
* the server's sampler default applies, mirroring the UI's template drafts.
|
|
87
|
-
*/
|
|
88
|
-
sampleRate?: number;
|
|
89
|
-
/**
|
|
90
|
-
* Job-graph backend only. `maxBurstLimit` (messages) for the inserted
|
|
91
|
-
* logs-event-sampler. Defaults to the UI draft value when omitted.
|
|
92
|
-
*/
|
|
93
|
-
sampleBurst?: number;
|
|
94
83
|
/** Wall-clock cap in seconds; the streaming sync job is aborted client-side after it. */
|
|
95
84
|
maxDurationSeconds?: number;
|
|
96
85
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
86
|
+
* Path to a JSON array (or NDJSON, one event per line) of LogEvents to draft
|
|
87
|
+
* the proposed pipeline against instead of live traffic. Injected as the
|
|
88
|
+
* template input's `draftSource` (a bounded logs-values-source) and forces the
|
|
89
|
+
* draft to run as BATCH so the bounded source runs to completion and streams
|
|
90
|
+
* its sink-source-tagged outputs back. This is the deterministic equivalent of
|
|
91
|
+
* drafting against a signal's sample, avoiding the HEARTBEAT-only result sparse
|
|
92
|
+
* live traffic produces.
|
|
104
93
|
*/
|
|
105
94
|
sampleLogs?: string;
|
|
106
95
|
}
|
|
@@ -171,22 +160,4 @@ export interface IntegrationTypeAndList<T extends IntegrationReadType> {
|
|
|
171
160
|
type: T['type'];
|
|
172
161
|
items: T[];
|
|
173
162
|
}
|
|
174
|
-
export declare const DEFAULT_INPUT = "input";
|
|
175
|
-
export declare const DEFAULT_OUTPUT = "output";
|
|
176
|
-
export declare const DEFAULT_LIMIT = 100;
|
|
177
|
-
export interface IO {
|
|
178
|
-
name: string;
|
|
179
|
-
vertex: Vertex;
|
|
180
|
-
}
|
|
181
|
-
export declare class Vertex {
|
|
182
|
-
name: string;
|
|
183
|
-
operation: SchemaOperation;
|
|
184
|
-
prev: Map<string, IO[]>;
|
|
185
|
-
next: Map<string, IO[]>;
|
|
186
|
-
constructor(operation: SchemaOperation);
|
|
187
|
-
addPrev(inputPort: string, prev: IO, addToPrev?: boolean): void;
|
|
188
|
-
addNext(outputPort: string, next: IO, addToNext?: boolean): void;
|
|
189
|
-
removePrev(inputPort: string, prev: IO, removeFromPrev?: boolean): void;
|
|
190
|
-
removeNext(outputPort: string, next: IO, removeFromNext?: boolean): void;
|
|
191
|
-
}
|
|
192
163
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/main/typescript/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,KAAK,6CAA6C,EAClD,sCAAsC,EACtC,uCAAuC,EACvC,kCAAkC,EAKlC,KAAK,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EACpF,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/main/typescript/types.ts"],"names":[],"mappings":"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"}
|
package/build/dist/types.js
CHANGED
|
@@ -23,73 +23,4 @@ export const HEARTBEAT_EVENTS = {
|
|
|
23
23
|
};
|
|
24
24
|
// Re-export job enum values for convenience.
|
|
25
25
|
export { PathsV1JobsGetParametersQueryExecution as JobExecution, PathsV1JobsGetParametersQueryProcessing as JobProcessing, PathsV1JobsGetParametersQueryState as JobState };
|
|
26
|
-
export const DEFAULT_INPUT = "input";
|
|
27
|
-
export const DEFAULT_OUTPUT = "output";
|
|
28
|
-
export const DEFAULT_LIMIT = 100;
|
|
29
|
-
export class Vertex {
|
|
30
|
-
name;
|
|
31
|
-
operation;
|
|
32
|
-
// Map from input name to connected prev vertices
|
|
33
|
-
prev;
|
|
34
|
-
// Map from output name to connected next vertices
|
|
35
|
-
next;
|
|
36
|
-
constructor(operation) {
|
|
37
|
-
this.operation = operation;
|
|
38
|
-
this.name = operation.name || '';
|
|
39
|
-
this.prev = new Map();
|
|
40
|
-
this.next = new Map();
|
|
41
|
-
}
|
|
42
|
-
addPrev(inputPort, prev, addToPrev = true) {
|
|
43
|
-
if (!this.prev.has(inputPort)) {
|
|
44
|
-
this.prev.set(inputPort, []);
|
|
45
|
-
}
|
|
46
|
-
this.prev.get(inputPort)?.push(prev);
|
|
47
|
-
// Add this vertex as next of the previous IO's vertex
|
|
48
|
-
if (addToPrev) {
|
|
49
|
-
prev.vertex.addNext(prev.name, { name: inputPort, vertex: this }, false);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
addNext(outputPort, next, addToNext = true) {
|
|
53
|
-
if (!this.next.has(outputPort)) {
|
|
54
|
-
this.next.set(outputPort, []);
|
|
55
|
-
}
|
|
56
|
-
this.next.get(outputPort)?.push(next);
|
|
57
|
-
// Add this vertex as prev of the next IO's vertex
|
|
58
|
-
if (addToNext) {
|
|
59
|
-
next.vertex.addPrev(next.name, { name: outputPort, vertex: this }, false);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
removePrev(inputPort, prev, removeFromPrev = true) {
|
|
63
|
-
if (!this.prev.has(inputPort)) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (!prev) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const existingIoList = this.prev.get(inputPort) || [];
|
|
70
|
-
// Filter out the IO matching the prevName and prevOutput
|
|
71
|
-
const updatedList = existingIoList.filter((existingIo) => existingIo.vertex.name !== prev.vertex.name || existingIo.name !== prev.name) || [];
|
|
72
|
-
this.prev.set(inputPort, updatedList);
|
|
73
|
-
// Remove this vertex as next of the previous IO's vertex
|
|
74
|
-
if (removeFromPrev) {
|
|
75
|
-
prev.vertex.removeNext(prev.name, { name: inputPort, vertex: this }, false);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
removeNext(outputPort, next, removeFromNext = true) {
|
|
79
|
-
if (!this.next.has(outputPort)) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
if (!next) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const existingIoList = this.next.get(outputPort) || [];
|
|
86
|
-
// Filter out the IO matching the nextName and nextInput
|
|
87
|
-
const updatedList = existingIoList.filter((existingIo) => existingIo.vertex.name !== next.vertex.name || existingIo.name !== next.name) || [];
|
|
88
|
-
this.next.set(outputPort, updatedList);
|
|
89
|
-
// Remove this vertex as prev of the next IO's vertex
|
|
90
|
-
if (removeFromNext) {
|
|
91
|
-
next.vertex.removePrev(next.name, { name: outputPort, vertex: this }, false);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
26
|
//# sourceMappingURL=types.js.map
|
package/build/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/main/typescript/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,OAAO,EAEL,sCAAsC,EACtC,uCAAuC,EACvC,kCAAkC,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/main/typescript/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,OAAO,EAEL,sCAAsC,EACtC,uCAAuC,EACvC,kCAAkC,GAOnC,MAAM,2BAA2B,CAAC;AA4InC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB,EAAE,mBAAmB;IACtC,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AASF,6CAA6C;AAC7C,OAAO,EACL,sCAAsC,IAAI,YAAY,EACtD,uCAAuC,IAAI,aAAa,EACxD,kCAAkC,IAAI,QAAQ,EAC/C,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI command for transforming production jobs into test configurations.
|
|
3
|
-
*
|
|
4
|
-
* The job:to-test command takes a production job definition and transforms it
|
|
5
|
-
* for testing purposes. This is a pure transformation - no API calls are made.
|
|
6
|
-
*
|
|
7
|
-
* Key features:
|
|
8
|
-
* - Replace sources with dataset queries or add record limits
|
|
9
|
-
* - Replace sinks with synchronous test sinks or test dataset sinks
|
|
10
|
-
* - Add test tagging to track test data
|
|
11
|
-
* - Show diff of transformations
|
|
12
|
-
* - Output to file or stdout
|
|
13
|
-
*
|
|
14
|
-
* Example usage:
|
|
15
|
-
* grepr job:to-test prod.json --execution SYNCHRONOUS --output test.json
|
|
16
|
-
* grepr job:to-test prod.json --dataset-id my_dataset --start 2025-01-01T00:00:00Z \
|
|
17
|
-
* --end 2025-01-01T01:00:00Z --show-diff
|
|
18
|
-
*/
|
|
19
|
-
import { Command } from 'commander';
|
|
20
|
-
import { ICommand } from '../lib/command-registry.js';
|
|
21
|
-
import { MergeConfiguration } from '../types.js';
|
|
22
|
-
/**
|
|
23
|
-
* Command implementation for job:to-test.
|
|
24
|
-
*
|
|
25
|
-
* This command registers itself with the CLI and handles:
|
|
26
|
-
* - Option parsing and validation
|
|
27
|
-
* - Job file loading
|
|
28
|
-
* - Transformation execution
|
|
29
|
-
* - Output formatting and writing
|
|
30
|
-
*/
|
|
31
|
-
export declare class JobToTestCommand implements ICommand {
|
|
32
|
-
/**
|
|
33
|
-
* Registers the job:to-test command with the CLI program.
|
|
34
|
-
*
|
|
35
|
-
* @param program - The commander program to add the command to
|
|
36
|
-
* @param _mergeConfiguration - Configuration merger (unused by this command)
|
|
37
|
-
*/
|
|
38
|
-
addToProgram(program: Command, _mergeConfiguration: MergeConfiguration): void;
|
|
39
|
-
/**
|
|
40
|
-
* Validates command options for consistency and completeness.
|
|
41
|
-
*
|
|
42
|
-
* Validation rules:
|
|
43
|
-
* - Cannot use both --sample-data-file and --dataset-id (mutually exclusive)
|
|
44
|
-
* - --dataset-id requires --start and --end
|
|
45
|
-
* - --execution must be SYNCHRONOUS or ASYNCHRONOUS
|
|
46
|
-
* - --processing must be BATCH or STREAMING
|
|
47
|
-
*
|
|
48
|
-
* @param options - The command options to validate
|
|
49
|
-
* @throws Error if validation fails
|
|
50
|
-
*/
|
|
51
|
-
private validateOptions;
|
|
52
|
-
/**
|
|
53
|
-
* Loads and validates a job definition from a JSON file.
|
|
54
|
-
*
|
|
55
|
-
* The file must exist and contain valid JSON with required fields:
|
|
56
|
-
* - name: Job name
|
|
57
|
-
* - execution: Execution type
|
|
58
|
-
* - processing: Processing type
|
|
59
|
-
*
|
|
60
|
-
* @param jobFile - Path to the job definition file
|
|
61
|
-
* @returns The loaded job definition
|
|
62
|
-
* @throws Error if file not found, invalid JSON, or missing required fields
|
|
63
|
-
*/
|
|
64
|
-
private loadJobFromFile;
|
|
65
|
-
/**
|
|
66
|
-
* Formats the transformed job as JSON string.
|
|
67
|
-
*
|
|
68
|
-
* @param transformedJob - The job to format
|
|
69
|
-
* @param pretty - Whether to pretty-print (2-space indentation) or compact
|
|
70
|
-
* @returns JSON string representation of the job
|
|
71
|
-
*/
|
|
72
|
-
private formatOutput;
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=job-to-test-command.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-to-test-command.d.ts","sourceRoot":"","sources":["../../../src/main/typescript/commands/job-to-test-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAA+B,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI1E;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,GAAG,IAAI;IAoE7E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;;;;;;;;OAWG;YACW,eAAe;IAmB7B;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI command for transforming production jobs into test configurations.
|
|
3
|
-
*
|
|
4
|
-
* The job:to-test command takes a production job definition and transforms it
|
|
5
|
-
* for testing purposes. This is a pure transformation - no API calls are made.
|
|
6
|
-
*
|
|
7
|
-
* Key features:
|
|
8
|
-
* - Replace sources with dataset queries or add record limits
|
|
9
|
-
* - Replace sinks with synchronous test sinks or test dataset sinks
|
|
10
|
-
* - Add test tagging to track test data
|
|
11
|
-
* - Show diff of transformations
|
|
12
|
-
* - Output to file or stdout
|
|
13
|
-
*
|
|
14
|
-
* Example usage:
|
|
15
|
-
* grepr job:to-test prod.json --execution SYNCHRONOUS --output test.json
|
|
16
|
-
* grepr job:to-test prod.json --dataset-id my_dataset --start 2025-01-01T00:00:00Z \
|
|
17
|
-
* --end 2025-01-01T01:00:00Z --show-diff
|
|
18
|
-
*/
|
|
19
|
-
import fs from 'fs-extra';
|
|
20
|
-
import { parseIntArg } from '../lib/option-parsers.js';
|
|
21
|
-
import { JobExecution, JobProcessing } from '../types.js';
|
|
22
|
-
import { transformJobToTest, showDiff } from '../lib/job-graph-transformer.js';
|
|
23
|
-
/**
|
|
24
|
-
* Command implementation for job:to-test.
|
|
25
|
-
*
|
|
26
|
-
* This command registers itself with the CLI and handles:
|
|
27
|
-
* - Option parsing and validation
|
|
28
|
-
* - Job file loading
|
|
29
|
-
* - Transformation execution
|
|
30
|
-
* - Output formatting and writing
|
|
31
|
-
*/
|
|
32
|
-
export class JobToTestCommand {
|
|
33
|
-
/**
|
|
34
|
-
* Registers the job:to-test command with the CLI program.
|
|
35
|
-
*
|
|
36
|
-
* @param program - The commander program to add the command to
|
|
37
|
-
* @param _mergeConfiguration - Configuration merger (unused by this command)
|
|
38
|
-
*/
|
|
39
|
-
addToProgram(program, _mergeConfiguration) {
|
|
40
|
-
program
|
|
41
|
-
.command('job:to-test <input-file>')
|
|
42
|
-
.description('Transform a job configuration for testing')
|
|
43
|
-
// Output options (note: -o, --output is registered as a global flag on the program)
|
|
44
|
-
.option('--no-pretty', 'Disable pretty printing')
|
|
45
|
-
.option('--show-diff', 'Show transformation diff')
|
|
46
|
-
// Execution and processing type overrides
|
|
47
|
-
.option('--execution <type>', 'Execution type (SYNCHRONOUS|ASYNCHRONOUS)')
|
|
48
|
-
.option('--processing <type>', 'Processing type (BATCH|STREAMING)')
|
|
49
|
-
// Source options (mutually exclusive: sample data OR dataset)
|
|
50
|
-
.option('--sample-data-file <file>', 'Sample logs file')
|
|
51
|
-
.option('--dataset-id <id>', 'Dataset ID for source (requires --start and --end)')
|
|
52
|
-
.option('--query <query>', 'Datadog syntax query for dataset source (optional, requires --dataset-id)')
|
|
53
|
-
.option('--start <time>', 'Start time (ISO 8601)')
|
|
54
|
-
.option('--end <time>', 'End time (ISO 8601)')
|
|
55
|
-
.option('--limit-records <n>', 'Limit for batch sources', parseIntArg, 1000)
|
|
56
|
-
// Sink options
|
|
57
|
-
.option('--test-dataset <id>', 'Test dataset ID for async sinks (enables tagging)')
|
|
58
|
-
// Test metadata
|
|
59
|
-
.option('--test-tag <tag>', 'Custom test tag (default: auto-generated)')
|
|
60
|
-
.option('--test-name <name>', 'Custom test job name (default: {original}_test)')
|
|
61
|
-
.action(async (inputFile, options, command) => {
|
|
62
|
-
try {
|
|
63
|
-
// Merge global options (-o, --output, --quiet, etc.) with sub-command options.
|
|
64
|
-
// Same pattern used by ListCommand/CrudCommand for consistent flag handling.
|
|
65
|
-
const merged = { ...command.parent?.opts(), ...options };
|
|
66
|
-
// Step 1: Validate that options are valid and compatible
|
|
67
|
-
this.validateOptions(merged);
|
|
68
|
-
// Step 2: Load the original job definition from file
|
|
69
|
-
const originalJob = await this.loadJobFromFile(inputFile);
|
|
70
|
-
// Step 3: Transform the job to test configuration
|
|
71
|
-
const transformedJob = transformJobToTest(originalJob, merged);
|
|
72
|
-
// Step 4: Show diff if requested (before outputting JSON)
|
|
73
|
-
if (merged.showDiff) {
|
|
74
|
-
showDiff(originalJob, transformedJob);
|
|
75
|
-
}
|
|
76
|
-
// Step 5: Format the output (pretty or compact JSON)
|
|
77
|
-
const output = this.formatOutput(transformedJob, merged.pretty !== false);
|
|
78
|
-
// Step 6: Write to file or stdout
|
|
79
|
-
if (merged.output) {
|
|
80
|
-
await fs.writeFile(merged.output, output);
|
|
81
|
-
console.log(`✓ Test job written to ${merged.output}`);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
console.log(output);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
console.error('Error transforming job:', error.message);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Validates command options for consistency and completeness.
|
|
95
|
-
*
|
|
96
|
-
* Validation rules:
|
|
97
|
-
* - Cannot use both --sample-data-file and --dataset-id (mutually exclusive)
|
|
98
|
-
* - --dataset-id requires --start and --end
|
|
99
|
-
* - --execution must be SYNCHRONOUS or ASYNCHRONOUS
|
|
100
|
-
* - --processing must be BATCH or STREAMING
|
|
101
|
-
*
|
|
102
|
-
* @param options - The command options to validate
|
|
103
|
-
* @throws Error if validation fails
|
|
104
|
-
*/
|
|
105
|
-
validateOptions(options) {
|
|
106
|
-
if (options.sampleDataFile && options.datasetId) {
|
|
107
|
-
throw new Error('Cannot use both --sample-data-file and --dataset-id');
|
|
108
|
-
}
|
|
109
|
-
if (options.datasetId && (!options.start || !options.end)) {
|
|
110
|
-
throw new Error('--dataset-id requires --start and --end');
|
|
111
|
-
}
|
|
112
|
-
if (options.execution && ![JobExecution.ASYNCHRONOUS, JobExecution.SYNCHRONOUS].includes(options.execution)) {
|
|
113
|
-
throw new Error('--execution must be SYNCHRONOUS or ASYNCHRONOUS');
|
|
114
|
-
}
|
|
115
|
-
if (options.processing && ![JobProcessing.BATCH, JobProcessing.STREAMING].includes(options.processing)) {
|
|
116
|
-
throw new Error('--processing must be BATCH or STREAMING');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Loads and validates a job definition from a JSON file.
|
|
121
|
-
*
|
|
122
|
-
* The file must exist and contain valid JSON with required fields:
|
|
123
|
-
* - name: Job name
|
|
124
|
-
* - execution: Execution type
|
|
125
|
-
* - processing: Processing type
|
|
126
|
-
*
|
|
127
|
-
* @param jobFile - Path to the job definition file
|
|
128
|
-
* @returns The loaded job definition
|
|
129
|
-
* @throws Error if file not found, invalid JSON, or missing required fields
|
|
130
|
-
*/
|
|
131
|
-
async loadJobFromFile(jobFile) {
|
|
132
|
-
if (!await fs.pathExists(jobFile)) {
|
|
133
|
-
throw new Error(`Job definition file not found: ${jobFile}`);
|
|
134
|
-
}
|
|
135
|
-
let jobDefinition;
|
|
136
|
-
try {
|
|
137
|
-
jobDefinition = await fs.readJson(jobFile);
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
throw new Error(`Failed to load job definition: ${error.message}`);
|
|
141
|
-
}
|
|
142
|
-
if (!jobDefinition.name || !jobDefinition.execution || !jobDefinition.processing) {
|
|
143
|
-
throw new Error('Invalid job definition: missing required fields (name, execution, processing)');
|
|
144
|
-
}
|
|
145
|
-
return jobDefinition;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Formats the transformed job as JSON string.
|
|
149
|
-
*
|
|
150
|
-
* @param transformedJob - The job to format
|
|
151
|
-
* @param pretty - Whether to pretty-print (2-space indentation) or compact
|
|
152
|
-
* @returns JSON string representation of the job
|
|
153
|
-
*/
|
|
154
|
-
formatOutput(transformedJob, pretty) {
|
|
155
|
-
if (pretty) {
|
|
156
|
-
return JSON.stringify(transformedJob, null, 2);
|
|
157
|
-
}
|
|
158
|
-
return JSON.stringify(transformedJob);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=job-to-test-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-to-test-command.js","sourceRoot":"","sources":["../../../src/main/typescript/commands/job-to-test-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { GrokParserType, JsonLogProcessorType, LogAttributesRemapperType } from '../openapi/openApiTypes.js';
|
|
2
|
-
export declare const RAW_PRE_PARSER_FILTER = "pre_parser_filter";
|
|
3
|
-
export declare const RAW_PRE_WAREHOUSE_FILTER = "pre_data_warehouse_filter";
|
|
4
|
-
export declare const RAW_PRE_EXCEPTIONS_FILTER = "pre_exceptions_filter";
|
|
5
|
-
export declare const RAW_JSON_PROCESSOR = "json_log_processor";
|
|
6
|
-
export declare const RAW_ATTRIBUTES_REMAPPER = "log_attributes_remapper";
|
|
7
|
-
export declare const RAW_LOG_REDUCER = "log_reducer";
|
|
8
|
-
export declare const RAW_JSON_PROCESSOR_TYPE = JsonLogProcessorType.json_log_processor;
|
|
9
|
-
export declare const RAW_ATTRIBUTES_REMAPPER_TYPE = LogAttributesRemapperType.log_attributes_remapper;
|
|
10
|
-
export declare const RAW_GROK_PARSER_TYPE = GrokParserType.grok_parser;
|
|
11
|
-
export declare const RAW_PARSER_TYPES: ReadonlySet<string>;
|
|
12
|
-
//# sourceMappingURL=job-graph-log-pipeline-constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-graph-log-pipeline-constants.d.ts","sourceRoot":"","sources":["../../../src/main/typescript/lib/job-graph-log-pipeline-constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AACzD,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AACpE,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AACjE,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAC/E,eAAO,MAAM,4BAA4B,oDAAoD,CAAC;AAC9F,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAI/C,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { GrokParserType, JsonLogProcessorType, LogAttributesRemapperType, } from '../openapi/openApiTypes.js';
|
|
2
|
-
export const RAW_PRE_PARSER_FILTER = 'pre_parser_filter';
|
|
3
|
-
export const RAW_PRE_WAREHOUSE_FILTER = 'pre_data_warehouse_filter';
|
|
4
|
-
export const RAW_PRE_EXCEPTIONS_FILTER = 'pre_exceptions_filter';
|
|
5
|
-
export const RAW_JSON_PROCESSOR = 'json_log_processor';
|
|
6
|
-
export const RAW_ATTRIBUTES_REMAPPER = 'log_attributes_remapper';
|
|
7
|
-
export const RAW_LOG_REDUCER = 'log_reducer';
|
|
8
|
-
export const RAW_JSON_PROCESSOR_TYPE = JsonLogProcessorType.json_log_processor;
|
|
9
|
-
export const RAW_ATTRIBUTES_REMAPPER_TYPE = LogAttributesRemapperType.log_attributes_remapper;
|
|
10
|
-
export const RAW_GROK_PARSER_TYPE = GrokParserType.grok_parser;
|
|
11
|
-
export const RAW_PARSER_TYPES = new Set([
|
|
12
|
-
RAW_JSON_PROCESSOR_TYPE,
|
|
13
|
-
RAW_ATTRIBUTES_REMAPPER_TYPE,
|
|
14
|
-
RAW_GROK_PARSER_TYPE,
|
|
15
|
-
]);
|
|
16
|
-
//# sourceMappingURL=job-graph-log-pipeline-constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-graph-log-pipeline-constants.js","sourceRoot":"","sources":["../../../src/main/typescript/lib/job-graph-log-pipeline-constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,kBAAkB,CAAC;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAC,uBAAuB,CAAC;AAC9F,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC,WAAW,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC3D,uBAAuB;IACvB,4BAA4B;IAC5B,oBAAoB;CACrB,CAAC,CAAC"}
|