@openplait/adapter-tempo 0.1.0-alpha.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/LICENSE +201 -0
- package/README.md +123 -0
- package/dist/src/adapter.d.ts +42 -0
- package/dist/src/adapter.d.ts.map +1 -0
- package/dist/src/adapter.js +458 -0
- package/dist/src/adapter.js.map +1 -0
- package/dist/src/compiler.d.ts +8 -0
- package/dist/src/compiler.d.ts.map +1 -0
- package/dist/src/compiler.js +267 -0
- package/dist/src/compiler.js.map +1 -0
- package/dist/src/datasets.d.ts +18 -0
- package/dist/src/datasets.d.ts.map +1 -0
- package/dist/src/datasets.js +60 -0
- package/dist/src/datasets.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/native.d.ts +5 -0
- package/dist/src/native.d.ts.map +1 -0
- package/dist/src/native.js +95 -0
- package/dist/src/native.js.map +1 -0
- package/dist/src/normalization.d.ts +9 -0
- package/dist/src/normalization.d.ts.map +1 -0
- package/dist/src/normalization.js +278 -0
- package/dist/src/normalization.js.map +1 -0
- package/dist/src/parameters.d.ts +3 -0
- package/dist/src/parameters.d.ts.map +1 -0
- package/dist/src/parameters.js +22 -0
- package/dist/src/parameters.js.map +1 -0
- package/dist/src/types.d.ts +126 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { validateQuery } from "@openplait/core";
|
|
2
|
+
import { AdapterError, } from "@openplait/adapter-sdk";
|
|
3
|
+
import { TEMPO_DATASET_NAME, TEMPO_TRACE_FIELDS } from "./datasets.js";
|
|
4
|
+
import { resolveParameterValue } from "./parameters.js";
|
|
5
|
+
const DEFAULT_MAX_RESULT_ROWS = 1_000;
|
|
6
|
+
const DEFAULT_MAX_SPANS_PER_SPAN_SET = 100;
|
|
7
|
+
const DEFAULT_MAX_TIME_RANGE_MS = 31 * 24 * 60 * 60 * 1_000;
|
|
8
|
+
function boundedEpochSeconds(fromMs, toMs, maxTimeRangeMs) {
|
|
9
|
+
let start = Math.floor(fromMs / 1_000);
|
|
10
|
+
const end = Math.ceil(toMs / 1_000);
|
|
11
|
+
const maxSeconds = Math.floor(maxTimeRangeMs / 1_000);
|
|
12
|
+
if (end - start > maxSeconds)
|
|
13
|
+
start = end - maxSeconds;
|
|
14
|
+
return { start, end };
|
|
15
|
+
}
|
|
16
|
+
const SAFE_ATTRIBUTE = /^[A-Za-z_][A-Za-z0-9_.\/-]*$/;
|
|
17
|
+
function tempoVersionAtLeast(version, major, minor) {
|
|
18
|
+
if (!version)
|
|
19
|
+
return false;
|
|
20
|
+
const match = version.trim().replace(/^v/i, "").match(/^(\d+)\.(\d+)/);
|
|
21
|
+
if (!match)
|
|
22
|
+
return false;
|
|
23
|
+
const actualMajor = Number(match[1]);
|
|
24
|
+
const actualMinor = Number(match[2]);
|
|
25
|
+
return actualMajor > major || (actualMajor === major && actualMinor >= minor);
|
|
26
|
+
}
|
|
27
|
+
export function supportsTempoMostRecent(config) {
|
|
28
|
+
return config.enableMostRecent ?? tempoVersionAtLeast(config.tempoVersion, 2, 8);
|
|
29
|
+
}
|
|
30
|
+
function fail(code, message, path, details) {
|
|
31
|
+
throw new AdapterError(code, message, {
|
|
32
|
+
path,
|
|
33
|
+
...(details === undefined ? {} : { details }),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function fields(config) {
|
|
37
|
+
const custom = Object.fromEntries(Object.entries(config.attributeFields ?? {}).map(([name, mapping]) => {
|
|
38
|
+
if (!SAFE_ATTRIBUTE.test(mapping.attribute)) {
|
|
39
|
+
fail("CONFIG_INVALID", `Tempo attribute '${mapping.attribute}' is invalid.`, `/attributeFields/${name}/attribute`);
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
name,
|
|
43
|
+
{
|
|
44
|
+
traceql: `${mapping.scope}.${mapping.attribute}`,
|
|
45
|
+
type: mapping.type ?? "string",
|
|
46
|
+
selectable: false,
|
|
47
|
+
valueKind: mapping.type ?? "string",
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
}));
|
|
51
|
+
return { ...TEMPO_TRACE_FIELDS, ...custom };
|
|
52
|
+
}
|
|
53
|
+
function fieldMapping(registry, fieldName, path) {
|
|
54
|
+
const mapping = registry[fieldName];
|
|
55
|
+
if (!mapping) {
|
|
56
|
+
fail("FIELD_NOT_FOUND", `Field '${fieldName}' is not defined by '${TEMPO_DATASET_NAME}'.`, path, {
|
|
57
|
+
dataset: TEMPO_DATASET_NAME,
|
|
58
|
+
field: fieldName,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return mapping;
|
|
62
|
+
}
|
|
63
|
+
function escapeString(value) {
|
|
64
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/[\r\n\0]/g, " ")}"`;
|
|
65
|
+
}
|
|
66
|
+
function escapeRegex(value) {
|
|
67
|
+
return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
|
|
68
|
+
}
|
|
69
|
+
function durationLiteral(value, path) {
|
|
70
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0)
|
|
71
|
+
return `${value}ms`;
|
|
72
|
+
if (typeof value === "string" && /^(?:\d+(?:\.\d+)?)(?:ns|us|µs|ms|s|m|h)$/.test(value))
|
|
73
|
+
return value;
|
|
74
|
+
fail("INVALID_PARAMETER", "Duration values must be non-negative milliseconds or a TraceQL duration string.", path);
|
|
75
|
+
}
|
|
76
|
+
function enumLiteral(value, kind, path) {
|
|
77
|
+
if (typeof value !== "string")
|
|
78
|
+
fail("INVALID_PARAMETER", `${kind} values must be strings.`, path);
|
|
79
|
+
const normalized = value.toLowerCase().replace(/^span_/, "").replace(/^status_/, "").replace(/^kind_/, "");
|
|
80
|
+
const allowed = kind === "status"
|
|
81
|
+
? ["unset", "ok", "error"]
|
|
82
|
+
: ["unspecified", "internal", "server", "client", "producer", "consumer"];
|
|
83
|
+
if (!allowed.includes(normalized))
|
|
84
|
+
fail("INVALID_PARAMETER", `Unknown Tempo ${kind} '${value}'.`, path);
|
|
85
|
+
return normalized;
|
|
86
|
+
}
|
|
87
|
+
function literal(value, mapping, path) {
|
|
88
|
+
if (value === null)
|
|
89
|
+
return "nil";
|
|
90
|
+
if (mapping.valueKind === "duration")
|
|
91
|
+
return durationLiteral(value, path);
|
|
92
|
+
if (mapping.valueKind === "status" || mapping.valueKind === "kind")
|
|
93
|
+
return enumLiteral(value, mapping.valueKind, path);
|
|
94
|
+
if (mapping.valueKind === "traceId") {
|
|
95
|
+
if (typeof value !== "string" || !/^[A-Fa-f0-9]{16,32}$/.test(value)) {
|
|
96
|
+
fail("INVALID_PARAMETER", "Trace IDs must contain 16 to 32 hexadecimal characters.", path);
|
|
97
|
+
}
|
|
98
|
+
return escapeString(value);
|
|
99
|
+
}
|
|
100
|
+
if (typeof value === "string")
|
|
101
|
+
return escapeString(value);
|
|
102
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
103
|
+
return String(value);
|
|
104
|
+
if (typeof value === "boolean")
|
|
105
|
+
return String(value);
|
|
106
|
+
fail("INVALID_PARAMETER", "TraceQL values must be finite scalars.", path);
|
|
107
|
+
}
|
|
108
|
+
function regexComparison(operator, fieldName, value, path, negated = false) {
|
|
109
|
+
if (typeof value !== "string")
|
|
110
|
+
fail("INVALID_PARAMETER", `Operator '${operator}' requires a string value.`, path);
|
|
111
|
+
const source = operator === "matches" ? value : escapeRegex(value);
|
|
112
|
+
const pattern = operator === "contains" || operator === "notContains"
|
|
113
|
+
? `.*${source}.*`
|
|
114
|
+
: operator === "startsWith"
|
|
115
|
+
? `${source}.*`
|
|
116
|
+
: operator === "endsWith"
|
|
117
|
+
? `.*${source}`
|
|
118
|
+
: source;
|
|
119
|
+
const negativeOperator = operator === "notContains" ? !negated : negated;
|
|
120
|
+
return `${fieldName} ${negativeOperator ? "!~" : "=~"} ${escapeString(pattern)}`;
|
|
121
|
+
}
|
|
122
|
+
function compileComparison(expression, registry, queryParameters, variables, path, negated = false) {
|
|
123
|
+
const mapping = fieldMapping(registry, expression.field, `${path}/field`);
|
|
124
|
+
if (!mapping.traceql)
|
|
125
|
+
fail("UNSUPPORTED_OPERATION", `Field '${expression.field}' cannot be used in a TraceQL filter.`, `${path}/field`);
|
|
126
|
+
if (expression.operator === "isNull")
|
|
127
|
+
return `${mapping.traceql} ${negated ? "!=" : "="} nil`;
|
|
128
|
+
if (expression.operator === "isNotNull")
|
|
129
|
+
return `${mapping.traceql} ${negated ? "=" : "!="} nil`;
|
|
130
|
+
if (!("value" in expression))
|
|
131
|
+
fail("QUERY_VALIDATION_FAILED", `Operator '${expression.operator}' requires a value.`, path);
|
|
132
|
+
const resolved = resolveParameterValue(expression.value, queryParameters ?? {}, variables, `${path}/value`);
|
|
133
|
+
if (expression.operator === "in" || expression.operator === "notIn") {
|
|
134
|
+
if (!Array.isArray(resolved) || resolved.length === 0)
|
|
135
|
+
fail("INVALID_PARAMETER", `Operator '${expression.operator}' requires a non-empty array.`, `${path}/value`);
|
|
136
|
+
const isIn = expression.operator === "in" ? !negated : negated;
|
|
137
|
+
const joiner = isIn ? " || " : " && ";
|
|
138
|
+
const operator = isIn ? "=" : "!=";
|
|
139
|
+
return `(${resolved.map((item) => `${mapping.traceql} ${operator} ${literal(item, mapping, `${path}/value`)}`).join(joiner)})`;
|
|
140
|
+
}
|
|
141
|
+
if (Array.isArray(resolved))
|
|
142
|
+
fail("INVALID_PARAMETER", `Operator '${expression.operator}' requires a scalar value.`, `${path}/value`);
|
|
143
|
+
if (["contains", "notContains", "startsWith", "endsWith", "matches"].includes(expression.operator)) {
|
|
144
|
+
if (mapping.type !== "string")
|
|
145
|
+
fail("UNSUPPORTED_OPERATION", `Operator '${expression.operator}' requires a string field.`, `${path}/operator`);
|
|
146
|
+
return regexComparison(expression.operator, mapping.traceql, resolved, `${path}/value`, negated);
|
|
147
|
+
}
|
|
148
|
+
const operators = {
|
|
149
|
+
equals: "=",
|
|
150
|
+
notEquals: "!=",
|
|
151
|
+
greaterThan: ">",
|
|
152
|
+
greaterThanOrEqual: ">=",
|
|
153
|
+
lessThan: "<",
|
|
154
|
+
lessThanOrEqual: "<=",
|
|
155
|
+
};
|
|
156
|
+
const negatedOperators = {
|
|
157
|
+
equals: "!=",
|
|
158
|
+
notEquals: "=",
|
|
159
|
+
greaterThan: "<=",
|
|
160
|
+
greaterThanOrEqual: "<",
|
|
161
|
+
lessThan: ">=",
|
|
162
|
+
lessThanOrEqual: ">",
|
|
163
|
+
};
|
|
164
|
+
const operator = (negated ? negatedOperators : operators)[expression.operator];
|
|
165
|
+
if (!operator)
|
|
166
|
+
fail("UNSUPPORTED_OPERATION", `Operator '${expression.operator}' is not supported.`, `${path}/operator`);
|
|
167
|
+
return `${mapping.traceql} ${operator} ${literal(resolved, mapping, `${path}/value`)}`;
|
|
168
|
+
}
|
|
169
|
+
function compileBoolean(expression, registry, queryParameters, variables, path, negated = false) {
|
|
170
|
+
if ("and" in expression) {
|
|
171
|
+
if (!expression.and.length)
|
|
172
|
+
fail("QUERY_VALIDATION_FAILED", "AND expressions cannot be empty.", path);
|
|
173
|
+
return `(${expression.and.map((item, index) => compileBoolean(item, registry, queryParameters, variables, `${path}/and/${index}`, negated)).join(negated ? " || " : " && ")})`;
|
|
174
|
+
}
|
|
175
|
+
if ("or" in expression) {
|
|
176
|
+
if (!expression.or.length)
|
|
177
|
+
fail("QUERY_VALIDATION_FAILED", "OR expressions cannot be empty.", path);
|
|
178
|
+
return `(${expression.or.map((item, index) => compileBoolean(item, registry, queryParameters, variables, `${path}/or/${index}`, negated)).join(negated ? " && " : " || ")})`;
|
|
179
|
+
}
|
|
180
|
+
if ("not" in expression) {
|
|
181
|
+
return compileBoolean(expression.not, registry, queryParameters, variables, `${path}/not`, !negated);
|
|
182
|
+
}
|
|
183
|
+
return compileComparison(expression, registry, queryParameters, variables, path, negated);
|
|
184
|
+
}
|
|
185
|
+
function timeValue(value, parameters, context, path) {
|
|
186
|
+
const resolved = resolveParameterValue(value, parameters ?? {}, context.variables, path);
|
|
187
|
+
if (Array.isArray(resolved) || resolved === null || typeof resolved === "boolean")
|
|
188
|
+
fail("INVALID_PARAMETER", "Time values must be strings or epoch milliseconds.", path);
|
|
189
|
+
const milliseconds = typeof resolved === "number" ? resolved : Date.parse(resolved);
|
|
190
|
+
if (!Number.isFinite(milliseconds))
|
|
191
|
+
fail("INVALID_PARAMETER", `Time value '${resolved}' is invalid.`, path);
|
|
192
|
+
return milliseconds;
|
|
193
|
+
}
|
|
194
|
+
function positiveLimit(requested, maximum, path) {
|
|
195
|
+
const value = requested ?? maximum;
|
|
196
|
+
if (!Number.isInteger(value) || value < 1 || value > maximum) {
|
|
197
|
+
fail("QUERY_LIMIT_EXCEEDED", `Query limit ${value} exceeds the allowed maximum of ${maximum}.`, path, { requested: value, maximum });
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
export function compileTempoQuery(query, config, context = {}) {
|
|
202
|
+
const validation = validateQuery(query);
|
|
203
|
+
if (!validation.valid)
|
|
204
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", "The semantic query is not valid.", { details: { errors: validation.errors } });
|
|
205
|
+
if (query.spec.mode !== "semantic")
|
|
206
|
+
fail("QUERY_VALIDATION_FAILED", "The Tempo semantic compiler only accepts semantic queries.", "/spec/mode");
|
|
207
|
+
if (query.spec.input.entity !== TEMPO_DATASET_NAME)
|
|
208
|
+
fail("DATASET_NOT_FOUND", `Dataset '${query.spec.input.entity}' is not registered.`, "/spec/input/entity");
|
|
209
|
+
if (query.spec.input.signal !== "traces")
|
|
210
|
+
fail("QUERY_VALIDATION_FAILED", "Tempo trace search requires the 'traces' signal.", "/spec/input/signal");
|
|
211
|
+
if (!query.spec.timeRange)
|
|
212
|
+
fail("TIME_RANGE_REQUIRED", "Tempo search requires a bounded time range.", "/spec/timeRange");
|
|
213
|
+
if (query.spec.timeRange.field !== "timestamp")
|
|
214
|
+
fail("QUERY_VALIDATION_FAILED", "Tempo search time ranges must use the 'timestamp' field.", "/spec/timeRange/field");
|
|
215
|
+
if (query.spec.groupBy?.length || query.spec.joins?.length || query.spec.select.some((item) => !("field" in item))) {
|
|
216
|
+
fail("UNSUPPORTED_OPERATION", "Tempo trace search supports field projection and filtering, not grouping, joins, arithmetic, or aggregation.", "/spec");
|
|
217
|
+
}
|
|
218
|
+
if (query.spec.orderBy?.some((item) => item.field !== "timestamp" || item.direction !== "desc")) {
|
|
219
|
+
fail("UNSUPPORTED_OPERATION", "Tempo only supports newest-first timestamp ordering.", "/spec/orderBy");
|
|
220
|
+
}
|
|
221
|
+
const registry = fields(config);
|
|
222
|
+
const selected = query.spec.select.map((item, index) => {
|
|
223
|
+
if (!("field" in item))
|
|
224
|
+
fail("UNSUPPORTED_OPERATION", "Tempo search only supports direct field projection.", `/spec/select/${index}`);
|
|
225
|
+
const mapping = fieldMapping(registry, item.field, `/spec/select/${index}/field`);
|
|
226
|
+
if (!mapping.selectable)
|
|
227
|
+
fail("UNSUPPORTED_OPERATION", `Field '${item.field}' is filter-only in Tempo search results.`, `/spec/select/${index}/field`);
|
|
228
|
+
return {
|
|
229
|
+
name: item.as ?? item.field,
|
|
230
|
+
type: mapping.type,
|
|
231
|
+
source: item.field,
|
|
232
|
+
...(mapping.unit === undefined ? {} : { unit: mapping.unit }),
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
const fromMs = timeValue(query.spec.timeRange.from, query.spec.parameters, context, "/spec/timeRange/from");
|
|
236
|
+
const toMs = timeValue(query.spec.timeRange.to, query.spec.parameters, context, "/spec/timeRange/to");
|
|
237
|
+
if (toMs < fromMs)
|
|
238
|
+
fail("INVALID_PARAMETER", "Time range end must not precede its start.", "/spec/timeRange");
|
|
239
|
+
const maxTimeRangeMs = config.maxTimeRangeMs ?? DEFAULT_MAX_TIME_RANGE_MS;
|
|
240
|
+
if (toMs - fromMs > maxTimeRangeMs)
|
|
241
|
+
fail("TIME_RANGE_TOO_LARGE", `Time range exceeds the configured maximum of ${maxTimeRangeMs}ms.`, "/spec/timeRange", { requestedMs: toMs - fromMs, maxTimeRangeMs });
|
|
242
|
+
const maximum = Math.min(config.maxResultRows ?? DEFAULT_MAX_RESULT_ROWS, context.maxResultRows ?? Number.POSITIVE_INFINITY);
|
|
243
|
+
const limit = positiveLimit(query.spec.limit, maximum, "/spec/limit");
|
|
244
|
+
const spansPerSpanSet = config.maxSpansPerSpanSet ?? DEFAULT_MAX_SPANS_PER_SPAN_SET;
|
|
245
|
+
const filter = query.spec.where ? ` ${compileBoolean(query.spec.where, registry, query.spec.parameters, context.variables, "/spec/where")} ` : " ";
|
|
246
|
+
const boundedRange = boundedEpochSeconds(fromMs, toMs, maxTimeRangeMs);
|
|
247
|
+
return {
|
|
248
|
+
kind: "CompiledQuery",
|
|
249
|
+
language: "traceql",
|
|
250
|
+
compiled: {
|
|
251
|
+
endpoint: "search",
|
|
252
|
+
traceql: `{${filter}}${query.spec.orderBy?.length && supportsTempoMostRecent(config) ? " with (most_recent=true)" : ""}`,
|
|
253
|
+
start: boundedRange.start,
|
|
254
|
+
end: boundedRange.end,
|
|
255
|
+
limit,
|
|
256
|
+
spansPerSpanSet,
|
|
257
|
+
},
|
|
258
|
+
parameters: {},
|
|
259
|
+
fields: selected,
|
|
260
|
+
source: { resourceName: query.metadata.name, dataset: TEMPO_DATASET_NAME },
|
|
261
|
+
warnings: [],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
export function tempoFieldRegistry(config) {
|
|
265
|
+
return fields(config);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DataFieldType, SemanticSchema } from "@openplait/core";
|
|
2
|
+
export interface TempoFieldMapping {
|
|
3
|
+
traceql: string;
|
|
4
|
+
type: DataFieldType;
|
|
5
|
+
unit?: string;
|
|
6
|
+
selectable: boolean;
|
|
7
|
+
resultKey?: string;
|
|
8
|
+
valueKind?: "string" | "number" | "boolean" | "duration" | "status" | "kind" | "traceId";
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Tempo's search endpoint returns trace summaries. Span fields are deliberately
|
|
13
|
+
* filter-only; use TempoAdapter.getTrace() when complete span rows are needed.
|
|
14
|
+
*/
|
|
15
|
+
export declare const TEMPO_TRACE_FIELDS: Readonly<Record<string, TempoFieldMapping>>;
|
|
16
|
+
export declare const TEMPO_DATASET_NAME = "tempo.trace_search";
|
|
17
|
+
export declare function tempoSemanticSchema(): SemanticSchema;
|
|
18
|
+
//# sourceMappingURL=datasets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../src/datasets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkBD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAiB1E,CAAC;AAEF,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,wBAAgB,mBAAmB,IAAI,cAAc,CA0BpD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const field = (traceql, type, resultKey, valueKind, options = {}) => ({
|
|
2
|
+
traceql,
|
|
3
|
+
type,
|
|
4
|
+
selectable: resultKey !== undefined,
|
|
5
|
+
...(resultKey === undefined ? {} : { resultKey }),
|
|
6
|
+
...(valueKind === undefined ? {} : { valueKind }),
|
|
7
|
+
...(options.unit === undefined ? {} : { unit: options.unit }),
|
|
8
|
+
...(options.description === undefined ? {} : { description: options.description }),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Tempo's search endpoint returns trace summaries. Span fields are deliberately
|
|
12
|
+
* filter-only; use TempoAdapter.getTrace() when complete span rows are needed.
|
|
13
|
+
*/
|
|
14
|
+
export const TEMPO_TRACE_FIELDS = {
|
|
15
|
+
timestamp: field("", "time", "startTimeUnixNano", undefined),
|
|
16
|
+
duration: field("trace:duration", "duration", "durationMs", "duration", { unit: "ms" }),
|
|
17
|
+
"trace.id": field("trace:id", "trace", "traceID", "traceId"),
|
|
18
|
+
"root.service.name": field("trace:rootService", "string", "rootServiceName", "string"),
|
|
19
|
+
"root.span.name": field("trace:rootName", "string", "rootTraceName", "string"),
|
|
20
|
+
"matched.spans": field("", "number", "matchedSpans", "number"),
|
|
21
|
+
"span.name": field("span:name", "string", undefined, "string"),
|
|
22
|
+
"span.id": field("span:id", "string", undefined, "string"),
|
|
23
|
+
"span.parent_id": field("span:parentID", "string", undefined, "string"),
|
|
24
|
+
"span.kind": field("span:kind", "string", undefined, "kind"),
|
|
25
|
+
"status.code": field("span:status", "string", undefined, "status"),
|
|
26
|
+
"status.message": field("span:statusMessage", "string", undefined, "string"),
|
|
27
|
+
"span.duration": field("span:duration", "duration", undefined, "duration", { unit: "ms" }),
|
|
28
|
+
"service.name": field("resource.service.name", "string", undefined, "string"),
|
|
29
|
+
"instrumentation.name": field("instrumentation:name", "string", undefined, "string"),
|
|
30
|
+
"instrumentation.version": field("instrumentation:version", "string", undefined, "string"),
|
|
31
|
+
};
|
|
32
|
+
export const TEMPO_DATASET_NAME = "tempo.trace_search";
|
|
33
|
+
export function tempoSemanticSchema() {
|
|
34
|
+
return {
|
|
35
|
+
datasets: [
|
|
36
|
+
{
|
|
37
|
+
name: TEMPO_DATASET_NAME,
|
|
38
|
+
signal: "traces",
|
|
39
|
+
fields: Object.entries(TEMPO_TRACE_FIELDS)
|
|
40
|
+
.filter(([, mapping]) => mapping.selectable)
|
|
41
|
+
.map(([name, mapping]) => ({
|
|
42
|
+
name,
|
|
43
|
+
type: mapping.type,
|
|
44
|
+
...(mapping.unit === undefined ? {} : { unit: mapping.unit }),
|
|
45
|
+
...(mapping.description === undefined ? {} : { description: mapping.description }),
|
|
46
|
+
signals: ["traces"],
|
|
47
|
+
})),
|
|
48
|
+
extensions: {
|
|
49
|
+
"io.openplait.tempo": {
|
|
50
|
+
filterOnlyFields: Object.entries(TEMPO_TRACE_FIELDS)
|
|
51
|
+
.filter(([, mapping]) => !mapping.selectable && mapping.traceql)
|
|
52
|
+
.map(([name]) => name),
|
|
53
|
+
traceDetail: true,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=datasets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasets.js","sourceRoot":"","sources":["../../src/datasets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { TEMPO_ADAPTER_MANIFEST, TEMPO_CAPABILITIES, TempoAdapter, tempoCapabilitiesForConfig, validateTempoConfig, } from "./adapter.js";
|
|
2
|
+
export { compileTempoQuery, supportsTempoMostRecent, tempoFieldRegistry } from "./compiler.js";
|
|
3
|
+
export { TEMPO_DATASET_NAME, TEMPO_TRACE_FIELDS, tempoSemanticSchema, type TempoFieldMapping, } from "./datasets.js";
|
|
4
|
+
export { compileNativeTempoQuery, validateTraceqlStatement } from "./native.js";
|
|
5
|
+
export { normalizeTempoSearchResponse, normalizeTempoMetricsResponse, normalizeTempoId, normalizeTempoTraceResponse, } from "./normalization.js";
|
|
6
|
+
export type { TempoAdapterConfig, TempoAdapterOptions, TempoAttributeField, TempoAttributeScope, TempoCompiledRequest, TempoNativeOptions, TempoMetricsRange, TempoMetricsResponse, TempoMetricsSample, TempoMetricsSeries, TempoSearchResponse, TempoSearchTrace, TempoServerCapabilities, TempoSpanSet, TempoTraceRange, TempoTraceResponse, } from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { TEMPO_ADAPTER_MANIFEST, TEMPO_CAPABILITIES, TempoAdapter, tempoCapabilitiesForConfig, validateTempoConfig, } from "./adapter.js";
|
|
2
|
+
export { compileTempoQuery, supportsTempoMostRecent, tempoFieldRegistry } from "./compiler.js";
|
|
3
|
+
export { TEMPO_DATASET_NAME, TEMPO_TRACE_FIELDS, tempoSemanticSchema, } from "./datasets.js";
|
|
4
|
+
export { compileNativeTempoQuery, validateTraceqlStatement } from "./native.js";
|
|
5
|
+
export { normalizeTempoSearchResponse, normalizeTempoMetricsResponse, normalizeTempoId, normalizeTempoTraceResponse, } from "./normalization.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NativeQuery, ParameterMap } from "@openplait/core";
|
|
2
|
+
import type { TempoAdapterConfig, TempoCompiledRequest } from "./types.js";
|
|
3
|
+
export declare function validateTraceqlStatement(statement: string): void;
|
|
4
|
+
export declare function compileNativeTempoQuery(query: NativeQuery, config: TempoAdapterConfig, variables?: ParameterMap): TempoCompiledRequest;
|
|
5
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAK9E,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAuDpB,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIhE;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,kBAAkB,EAC1B,SAAS,CAAC,EAAE,YAAY,GACvB,oBAAoB,CA+CtB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { validateQuery } from "@openplait/core";
|
|
2
|
+
import { AdapterError } from "@openplait/adapter-sdk";
|
|
3
|
+
import { resolveParameterValue } from "./parameters.js";
|
|
4
|
+
const DEFAULT_MAX_RESULT_ROWS = 1_000;
|
|
5
|
+
const DEFAULT_MAX_SPANS_PER_SPAN_SET = 100;
|
|
6
|
+
const DEFAULT_MAX_TIME_RANGE_MS = 31 * 24 * 60 * 60 * 1_000;
|
|
7
|
+
const MAX_TRACEQL_LENGTH = 32_768;
|
|
8
|
+
function boundedEpochSeconds(fromMs, toMs, maxTimeRangeMs) {
|
|
9
|
+
let start = Math.floor(fromMs / 1_000);
|
|
10
|
+
const end = Math.ceil(toMs / 1_000);
|
|
11
|
+
const maxSeconds = Math.floor(maxTimeRangeMs / 1_000);
|
|
12
|
+
// Rounding both boundaries outward can make an otherwise valid exact-limit
|
|
13
|
+
// window one second too wide for Tempo. Keep the inclusive end and move the
|
|
14
|
+
// start forward by at most one second so transport never exceeds validation.
|
|
15
|
+
if (end - start > maxSeconds)
|
|
16
|
+
start = end - maxSeconds;
|
|
17
|
+
return { start, end };
|
|
18
|
+
}
|
|
19
|
+
function invalid(message, path) {
|
|
20
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", message, { path });
|
|
21
|
+
}
|
|
22
|
+
function parseTime(value, parameters, variables, path) {
|
|
23
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
24
|
+
invalid("Native Tempo time values must be strings or epoch milliseconds.", path);
|
|
25
|
+
}
|
|
26
|
+
const resolved = resolveParameterValue(value, parameters, variables, path);
|
|
27
|
+
if (Array.isArray(resolved) || resolved === null || typeof resolved === "boolean") {
|
|
28
|
+
invalid("Native Tempo time values must resolve to strings or epoch milliseconds.", path);
|
|
29
|
+
}
|
|
30
|
+
const milliseconds = typeof resolved === "number" ? resolved : Date.parse(resolved);
|
|
31
|
+
if (!Number.isFinite(milliseconds))
|
|
32
|
+
invalid(`Time value '${resolved}' is invalid.`, path);
|
|
33
|
+
return milliseconds;
|
|
34
|
+
}
|
|
35
|
+
function positiveLimit(value, fallback, maximum, path) {
|
|
36
|
+
const resolved = value ?? fallback;
|
|
37
|
+
if (typeof resolved !== "number" || !Number.isInteger(resolved) || resolved < 1 || resolved > maximum) {
|
|
38
|
+
throw new AdapterError("QUERY_LIMIT_EXCEEDED", `Value at '${path}' must be between 1 and ${maximum}.`, {
|
|
39
|
+
path,
|
|
40
|
+
details: { requested: resolved, maximum },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
export function validateTraceqlStatement(statement) {
|
|
46
|
+
if (!statement.trim())
|
|
47
|
+
invalid("Native TraceQL cannot be empty.", "/spec/native/statement");
|
|
48
|
+
if (statement.length > MAX_TRACEQL_LENGTH)
|
|
49
|
+
invalid(`Native TraceQL exceeds ${MAX_TRACEQL_LENGTH} characters.`, "/spec/native/statement");
|
|
50
|
+
if (/\0/.test(statement))
|
|
51
|
+
invalid("Native TraceQL cannot contain null bytes.", "/spec/native/statement");
|
|
52
|
+
}
|
|
53
|
+
export function compileNativeTempoQuery(query, config, variables) {
|
|
54
|
+
const validation = validateQuery(query);
|
|
55
|
+
if (!validation.valid) {
|
|
56
|
+
throw new AdapterError("QUERY_VALIDATION_FAILED", "The native query is not valid.", {
|
|
57
|
+
details: { errors: validation.errors },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (query.spec.mode !== "native" || query.spec.native.language.toLowerCase() !== "traceql") {
|
|
61
|
+
invalid("Tempo native queries must use the 'traceql' language.", "/spec/native/language");
|
|
62
|
+
}
|
|
63
|
+
validateTraceqlStatement(query.spec.native.statement);
|
|
64
|
+
const raw = query.spec.extensions?.["io.openplait.tempo"];
|
|
65
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
66
|
+
invalid("Native TraceQL requires an 'io.openplait.tempo' extension with a timeRange.", "/spec/extensions/io.openplait.tempo");
|
|
67
|
+
}
|
|
68
|
+
const options = raw;
|
|
69
|
+
if (typeof options.timeRange !== "object" || options.timeRange === null) {
|
|
70
|
+
invalid("Native TraceQL requires a bounded timeRange.", "/spec/extensions/io.openplait.tempo/timeRange");
|
|
71
|
+
}
|
|
72
|
+
const parameters = query.spec.parameters ?? {};
|
|
73
|
+
const fromMs = parseTime(options.timeRange.from, parameters, variables, "/spec/extensions/io.openplait.tempo/timeRange/from");
|
|
74
|
+
const toMs = parseTime(options.timeRange.to, parameters, variables, "/spec/extensions/io.openplait.tempo/timeRange/to");
|
|
75
|
+
if (toMs < fromMs)
|
|
76
|
+
invalid("Time range end must not precede its start.", "/spec/extensions/io.openplait.tempo/timeRange");
|
|
77
|
+
const maxTimeRangeMs = config.maxTimeRangeMs ?? DEFAULT_MAX_TIME_RANGE_MS;
|
|
78
|
+
if (toMs - fromMs > maxTimeRangeMs) {
|
|
79
|
+
throw new AdapterError("TIME_RANGE_TOO_LARGE", `Time range exceeds the configured maximum of ${maxTimeRangeMs}ms.`, {
|
|
80
|
+
path: "/spec/extensions/io.openplait.tempo/timeRange",
|
|
81
|
+
details: { requestedMs: toMs - fromMs, maxTimeRangeMs },
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const maximum = config.maxResultRows ?? DEFAULT_MAX_RESULT_ROWS;
|
|
85
|
+
const boundedRange = boundedEpochSeconds(fromMs, toMs, maxTimeRangeMs);
|
|
86
|
+
return {
|
|
87
|
+
endpoint: "search",
|
|
88
|
+
traceql: query.spec.native.statement,
|
|
89
|
+
start: boundedRange.start,
|
|
90
|
+
end: boundedRange.end,
|
|
91
|
+
limit: positiveLimit(options.limit, maximum, maximum, "/spec/extensions/io.openplait.tempo/limit"),
|
|
92
|
+
spansPerSpanSet: positiveLimit(options.spansPerSpanSet, config.maxSpansPerSpanSet ?? DEFAULT_MAX_SPANS_PER_SPAN_SET, config.maxSpansPerSpanSet ?? DEFAULT_MAX_SPANS_PER_SPAN_SET, "/spec/extensions/io.openplait.tempo/spansPerSpanSet"),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QueryResult } from "@openplait/core";
|
|
2
|
+
import type { TempoNormalizationOptions, TempoMetricsResponse, TempoSearchResponse, TempoTraceResponse } from "./types.js";
|
|
3
|
+
/** OTLP/JSON protobuf encodes byte IDs as base64; Tempo search uses hex. */
|
|
4
|
+
export declare function normalizeTempoId(value: unknown): string | null;
|
|
5
|
+
export declare function normalizeTempoSearchResponse(response: TempoSearchResponse, options: TempoNormalizationOptions): QueryResult;
|
|
6
|
+
export declare function normalizeTempoTraceResponse(response: TempoTraceResponse, options: Omit<TempoNormalizationOptions, "fields">): QueryResult;
|
|
7
|
+
/** Normalize Prometheus-like TraceQL metric series into one row per sample. */
|
|
8
|
+
export declare function normalizeTempoMetricsResponse(response: TempoMetricsResponse, options: Omit<TempoNormalizationOptions, "fields">): QueryResult;
|
|
9
|
+
//# sourceMappingURL=normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/normalization.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA4B,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EAEnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAoCpB,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAY9D;AA2BD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,yBAAyB,GACjC,WAAW,CAsBb;AA8GD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,GACjD,WAAW,CAsBb;AASD,+EAA+E;AAC/E,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,GACjD,WAAW,CA8Cb"}
|