@lwmacct/260529-promclient 0.14.260628 → 0.16.260628

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,7 @@ Small Prometheus-compatible HTTP API client with PromQL helpers and response tra
13
13
  - 提供 Prometheus API 响应的 TypeScript 类型
14
14
  - 提供 PromQL selector / label matcher 转义工具
15
15
  - 提供 vector、matrix、scalar、string 响应转换工具
16
+ - 支持 label 编码 record、字段别名、字段级 value source 和多查询字段合并
16
17
  - 无运行时依赖
17
18
 
18
19
  ## 安装
@@ -176,6 +177,186 @@ const time = serializeTime(new Date());
176
177
 
177
178
  Prometheus 的 sample value 是字符串。转换工具会在需要时解析为 number,并过滤 `NaN`。
178
179
 
180
+ ### Label Record Transform
181
+
182
+ 有些指标会把表格结构编码到 labels 中,例如用某些 labels 表示 `index`、`key`、`field`,再用 sample value 或 `value` label 表示字段值。可以用 `mapVectorToFieldRows` 先转成标准行,再按 key 或 index/key pivot 成对象表。
183
+
184
+ 示例一:sample value 作为字段值。
185
+
186
+ 假设查询返回这些 vector samples:
187
+
188
+ ```promql
189
+ demo_service_quota{tenant="acme", service="api", resource="cpu"} 4
190
+ demo_service_quota{tenant="acme", service="api", resource="memory_gb"} 16
191
+ demo_service_quota{tenant="acme", service="worker", resource="cpu"} 2
192
+ ```
193
+
194
+ 可以把它理解为:
195
+
196
+ | index | key | field | value |
197
+ | --- | --- | --- | --- |
198
+ | `acme` | `api` | `cpu` | `4` |
199
+ | `acme` | `api` | `memory_gb` | `16` |
200
+ | `acme` | `worker` | `cpu` | `2` |
201
+
202
+ ```ts
203
+ import {
204
+ mapFieldRowsByIndexKey,
205
+ mapVectorToFieldRows,
206
+ } from "@lwmacct/260529-promclient";
207
+
208
+ const response = await client.query("demo_service_quota");
209
+
210
+ const rows = mapVectorToFieldRows(response, {
211
+ indexLabels: ["tenant"],
212
+ keyLabels: ["service"],
213
+ fieldLabels: ["resource"],
214
+ valueSource: "sample",
215
+ });
216
+
217
+ const table = mapFieldRowsByIndexKey(rows);
218
+ // {
219
+ // acme: {
220
+ // api: {
221
+ // cpu: 4,
222
+ // memory_gb: 16
223
+ // },
224
+ // worker: {
225
+ // cpu: 2
226
+ // }
227
+ // }
228
+ // }
229
+ ```
230
+
231
+ 如果字段由多个 label 共同决定,可以把多个 label 组合成字段名:
232
+
233
+ ```ts
234
+ const rows = mapVectorToFieldRows(response, {
235
+ indexLabels: ["tenant"],
236
+ keyLabels: ["service"],
237
+ fieldLabels: ["method", "status"],
238
+ });
239
+ // method="GET", status="200" -> field: "GET.200"
240
+ ```
241
+
242
+ 如果字段不是来自 label,而是整个查询对应一个固定字段,可以使用 `field`。这适合把多个查询结果合并成同一批 record:
243
+
244
+ ```ts
245
+ const rows = [
246
+ ...mapVectorToFieldRows(inResponse, {
247
+ keyLabels: ["switch", "ifIndex"],
248
+ field: "inBps",
249
+ valueSource: "sample",
250
+ }),
251
+ ...mapVectorToFieldRows(outResponse, {
252
+ keyLabels: ["switch", "ifIndex"],
253
+ field: "outBps",
254
+ valueSource: "sample",
255
+ }),
256
+ ];
257
+
258
+ const table = mapFieldRowsByKey(rows);
259
+ ```
260
+
261
+ 示例二:`value` label 作为字段值。
262
+
263
+ 这类指标通常用 sample value `1` 表示“这条信息存在”,真正的字段值在 label 中:
264
+
265
+ ```promql
266
+ demo_asset_info{asset="srv-01", field="region", value="us-east"} 1
267
+ demo_asset_info{asset="srv-01", field="owner", value="platform"} 1
268
+ demo_asset_info{asset="srv-02", field="region", value="eu-west"} 1
269
+ ```
270
+
271
+ 可以把它理解为:
272
+
273
+ | key | field | value |
274
+ | --- | --- | --- |
275
+ | `srv-01` | `region` | `us-east` |
276
+ | `srv-01` | `owner` | `platform` |
277
+ | `srv-02` | `region` | `eu-west` |
278
+
279
+ ```ts
280
+ import {
281
+ mapFieldRowsByKey,
282
+ mapVectorToFieldRows,
283
+ } from "@lwmacct/260529-promclient";
284
+
285
+ const response = await client.query("demo_asset_info");
286
+
287
+ const rows = mapVectorToFieldRows(response, {
288
+ keyLabels: ["asset"],
289
+ fieldLabels: ["field"],
290
+ valueLabel: "value",
291
+ valueSource: "auto",
292
+ });
293
+
294
+ const table = mapFieldRowsByKey(rows);
295
+ // {
296
+ // "srv-01": {
297
+ // region: "us-east",
298
+ // owner: "platform"
299
+ // },
300
+ // "srv-02": {
301
+ // region: "eu-west"
302
+ // }
303
+ // }
304
+ ```
305
+
306
+ 字段名需要转换为业务对象属性时,可以配置 `fieldMappings`。映射值为 `false` 时会丢弃该字段;`unknownField: "drop"` 会丢弃未声明字段:
307
+
308
+ ```ts
309
+ const rows = mapVectorToFieldRows(response, {
310
+ keyLabels: ["asset"],
311
+ fieldLabels: ["field"],
312
+ valueLabel: "value",
313
+ valueSource: "label",
314
+ unknownField: "drop",
315
+ fieldMappings: {
316
+ region: "region",
317
+ owner: "owner",
318
+ ignored_field: false,
319
+ },
320
+ });
321
+ ```
322
+
323
+ 字段级配置可以覆盖全局 `valueSource`、`valueLabel` 和 `sampleParser`。这适合部分字段值在 label 中、部分字段值在 sample 中的指标:
324
+
325
+ ```ts
326
+ const rows = mapVectorToFieldRows(response, {
327
+ keyLabels: ["asset"],
328
+ fieldLabels: ["field"],
329
+ valueSource: "label",
330
+ valueLabel: "value",
331
+ unknownField: "drop",
332
+ fieldMappings: {
333
+ model_number: { as: "modelNumber" },
334
+ firmware: { as: "firmware" },
335
+ total_bytes: {
336
+ as: "totalBytes",
337
+ valueSource: "sample",
338
+ sampleParser: (value) => Number.parseFloat(value),
339
+ },
340
+ },
341
+ });
342
+ ```
343
+
344
+ `valueSource` 支持:
345
+
346
+ | 值 | 说明 |
347
+ | --- | --- |
348
+ | `"auto"` | 优先读取 `valueLabel` 指定的 label;不存在时读取 sample value,默认值 |
349
+ | `"label"` | 只读取 `valueLabel` 指定的 label |
350
+ | `"sample"` | 只读取 Prometheus sample value |
351
+
352
+ 重复字段默认采用后出现的值。需要保留第一条、保留数组或发现重复时报错时,可以配置 pivot 函数:
353
+
354
+ ```ts
355
+ mapFieldRowsByKey(rows, { duplicate: "first" });
356
+ mapFieldRowsByKey(rows, { duplicate: "array" });
357
+ mapFieldRowsByKey(rows, { duplicate: "error" });
358
+ ```
359
+
179
360
  ### Instant Response
180
361
 
181
362
  ```ts
@@ -185,6 +366,7 @@ import {
185
366
  getScalarNumber,
186
367
  mapVector,
187
368
  mapVectorByLabel,
369
+ mapVectorByLabelAndName,
188
370
  } from "@lwmacct/260529-promclient";
189
371
  ```
190
372
 
@@ -196,8 +378,23 @@ import {
196
378
  | `getScalarValue(response)` | 从 scalar/string response 中取出原始字符串值 |
197
379
  | `getScalarNumber(response, defaultValue?)` | 从 scalar response 中解析数字 |
198
380
  | `mapVectorByLabel(response, labelName, parser?)` | 按指定 label 聚合 vector 数值 |
381
+ | `mapVectorByLabelAndName(response, labelName, mapper, parser?)` | 按指定 label 聚合,并用 `__name__` 区分字段 |
199
382
  | `mapVector(response, mapper)` | 自定义映射 vector items |
200
383
 
384
+ `mapVectorByLabelAndName` 适合多个 metric name 共同组成一张对象表的场景:
385
+
386
+ ```ts
387
+ const stats = mapVectorByLabelAndName(response, "instance", (name, value, prev) => {
388
+ if (name === "node_memory_MemTotal_bytes") {
389
+ return { ...prev, total: value };
390
+ }
391
+ if (name === "node_memory_MemAvailable_bytes") {
392
+ return { ...prev, available: value };
393
+ }
394
+ return prev;
395
+ });
396
+ ```
397
+
201
398
  ### Range Response
202
399
 
203
400
  ```ts
@@ -1,4 +1,5 @@
1
1
  export * from "./core";
2
2
  export * from "./instant";
3
3
  export * from "./range";
4
+ export * from "./records";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./core";
2
2
  export * from "./instant";
3
3
  export * from "./range";
4
+ export * from "./records";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
@@ -3,5 +3,6 @@ export declare const getVectorItems: (response: PromSuccessResponse<PromInstantD
3
3
  export declare const getScalarValue: (response: PromSuccessResponse<PromScalarData | PromStringData>) => string | undefined;
4
4
  export declare const getScalarNumber: (response: PromSuccessResponse<PromScalarData>, defaultValue?: number) => number;
5
5
  export declare const mapVectorByLabel: (response: PromSuccessResponse<PromVectorData>, labelName: string, parser?: (value: string) => number) => Record<string, number>;
6
+ export declare const mapVectorByLabelAndName: <T extends Record<string, unknown>>(response: PromSuccessResponse<PromInstantData>, labelName: string, mapper: (metricName: string, value: number, previous: T) => T, parser?: (value: string) => number) => Record<string, T>;
6
7
  export declare const mapVector: <T>(response: PromSuccessResponse<PromVectorData>, mapper: (item: PromVectorItem) => T | undefined) => T[];
7
8
  //# sourceMappingURL=instant.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instant.d.ts","sourceRoot":"","sources":["../../src/transform/instant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,UAAU,CAAC;AAQlB,eAAO,MAAM,cAAc,GACzB,UAAU,mBAAmB,CAAC,eAAe,CAAC,KAC7C,cAAc,EAKhB,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,UAAU,mBAAmB,CAAC,cAAc,GAAG,cAAc,CAAC,KAC7D,MAAM,GAAG,SAKX,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,qBAAyB,KACxB,MAKF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,WAAW,MAAM,EACjB,SAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,MAAyC,KACnE,MAAM,CAAC,MAAM,EAAE,MAAM,CAYvB,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,KAAK,CAAC,GAAG,SAAS,KAC9C,CAAC,EAOI,CAAC"}
1
+ {"version":3,"file":"instant.d.ts","sourceRoot":"","sources":["../../src/transform/instant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,UAAU,CAAC;AAQlB,eAAO,MAAM,cAAc,GACzB,UAAU,mBAAmB,CAAC,eAAe,CAAC,KAC7C,cAAc,EAKhB,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,UAAU,mBAAmB,CAAC,cAAc,GAAG,cAAc,CAAC,KAC7D,MAAM,GAAG,SAKX,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,qBAAyB,KACxB,MAKF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,WAAW,MAAM,EACjB,SAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,MAAyC,KACnE,MAAM,CAAC,MAAM,EAAE,MAAM,CAYvB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,UAAU,mBAAmB,CAAC,eAAe,CAAC,EAC9C,WAAW,MAAM,EACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAC7D,SAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,MAAyC,KACnE,MAAM,CAAC,MAAM,EAAE,CAAC,CAqBlB,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,UAAU,mBAAmB,CAAC,cAAc,CAAC,EAC7C,QAAQ,CAAC,IAAI,EAAE,cAAc,KAAK,CAAC,GAAG,SAAS,KAC9C,CAAC,EAOI,CAAC"}
@@ -30,6 +30,25 @@ export const mapVectorByLabel = (response, labelName, parser = (value) => safePa
30
30
  return result;
31
31
  }, {});
32
32
  };
33
+ export const mapVectorByLabelAndName = (response, labelName, mapper, parser = (value) => safeParseFloat(value)) => {
34
+ if (!isVectorData(response.data)) {
35
+ return {};
36
+ }
37
+ return response.data.result.reduce((result, item) => {
38
+ const labelValue = item.metric[labelName];
39
+ const metricName = item.metric.__name__;
40
+ if (!labelValue || !metricName) {
41
+ return result;
42
+ }
43
+ const value = parser(item.value[1]);
44
+ if (Number.isNaN(value)) {
45
+ return result;
46
+ }
47
+ const previous = result[labelValue] ?? {};
48
+ result[labelValue] = mapper(metricName, value, previous);
49
+ return result;
50
+ }, {});
51
+ };
33
52
  export const mapVector = (response, mapper) => response.data.result.reduce((result, item) => {
34
53
  const mapped = mapper(item);
35
54
  if (mapped !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"instant.js","sourceRoot":"","sources":["../../src/transform/instant.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAA8C,EAC5B,EAAE;IACpB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAA8D,EAC1C,EAAE;IACtB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAA6C,EAC7C,YAAY,GAAG,MAAM,CAAC,GAAG,EACjB,EAAE;IACV,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,QAA6C,EAC7C,SAAiB,EACjB,SAAoC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAC5C,EAAE;IAC1B,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,QAA6C,EAC7C,MAA+C,EAC1C,EAAE,CACP,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,EAAE,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"instant.js","sourceRoot":"","sources":["../../src/transform/instant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { PromInstantData, PromLabelSet, PromVectorItem, PromSuccessResponse } from "../types";
2
+ export type PromFieldValue = string | number;
3
+ export type PromFieldRow = {
4
+ index?: string;
5
+ key: string;
6
+ field: string;
7
+ value: PromFieldValue;
8
+ labels: PromLabelSet;
9
+ sampleValue: string;
10
+ timestampMs: number;
11
+ };
12
+ export type PromFieldValueSource = "auto" | "label" | "sample";
13
+ export type PromFieldMapping = string | false | {
14
+ as?: string;
15
+ valueLabel?: string;
16
+ valueSource?: PromFieldValueSource;
17
+ sampleParser?: (value: string, item: PromVectorItem) => PromFieldValue | undefined;
18
+ };
19
+ export type MapVectorToFieldRowsOptions = {
20
+ indexLabels?: readonly string[];
21
+ keyLabels: readonly string[];
22
+ fieldLabels?: readonly string[];
23
+ field?: string;
24
+ valueLabel?: string;
25
+ valueSource?: PromFieldValueSource;
26
+ labelSeparator?: string;
27
+ sampleParser?: (value: string, item: PromVectorItem) => PromFieldValue | undefined;
28
+ fieldMappings?: Record<string, PromFieldMapping>;
29
+ unknownField?: "keep" | "drop";
30
+ };
31
+ export type DuplicateFieldRowStrategy = "last" | "first" | "array" | "error";
32
+ export type MapFieldRowsOptions = {
33
+ duplicate?: DuplicateFieldRowStrategy;
34
+ };
35
+ export type PromFieldRecord = Record<string, PromFieldValue | PromFieldValue[]>;
36
+ export type PromFieldTable = Record<string, PromFieldRecord>;
37
+ export type PromIndexedFieldTable = Record<string, PromFieldTable>;
38
+ export declare const mapVectorItemToFieldRow: (item: PromVectorItem, options: MapVectorToFieldRowsOptions) => PromFieldRow | undefined;
39
+ export declare const mapVectorToFieldRows: (response: PromSuccessResponse<PromInstantData>, options: MapVectorToFieldRowsOptions) => PromFieldRow[];
40
+ export declare const mapFieldRowsByKey: (rows: readonly PromFieldRow[], options?: MapFieldRowsOptions) => PromFieldTable;
41
+ export declare const mapFieldRowsByIndexKey: (rows: readonly PromFieldRow[], options?: MapFieldRowsOptions) => PromIndexedFieldTable;
42
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,KAAK,GACL;IACE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,KACjB,cAAc,GAAG,SAAS,CAAC;CACjC,CAAC;AAEN,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,KACjB,cAAc,GAAG,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,yBAAyB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE7D,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AA6EnE,eAAO,MAAM,uBAAuB,GAClC,MAAM,cAAc,EACpB,SAAS,2BAA2B,KACnC,YAAY,GAAG,SA6DjB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,UAAU,mBAAmB,CAAC,eAAe,CAAC,EAC9C,SAAS,2BAA2B,KACnC,YAAY,EAYd,CAAC;AAiCF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,SAAS,YAAY,EAAE,EAC7B,UAAS,mBAAwB,KAChC,cASF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,MAAM,SAAS,YAAY,EAAE,EAC7B,UAAS,mBAAwB,KAChC,qBAgBF,CAAC"}
@@ -0,0 +1,145 @@
1
+ import { isVectorData, safeParseFloat, toMilliseconds } from "./core";
2
+ const defaultLabelSeparator = ".";
3
+ const defaultValueLabel = "value";
4
+ const joinLabelValues = (labels, labelNames, separator) => {
5
+ const values = [];
6
+ for (const labelName of labelNames) {
7
+ const value = labels[labelName];
8
+ if (value === undefined) {
9
+ return undefined;
10
+ }
11
+ values.push(value);
12
+ }
13
+ return values.join(separator);
14
+ };
15
+ const resolveFieldValue = (item, options) => {
16
+ const labelValue = item.metric[options.valueLabel];
17
+ if (options.valueSource === "label") {
18
+ return labelValue;
19
+ }
20
+ if (options.valueSource === "auto" && labelValue !== undefined) {
21
+ return labelValue;
22
+ }
23
+ return options.sampleParser(item.value[1], item);
24
+ };
25
+ const resolveFieldMapping = (field, options) => {
26
+ const mapping = options.fieldMappings?.[field];
27
+ if (mapping === undefined) {
28
+ return options.unknownField === "drop" ? undefined : { field };
29
+ }
30
+ if (mapping === false) {
31
+ return undefined;
32
+ }
33
+ if (typeof mapping === "string") {
34
+ return { field: mapping };
35
+ }
36
+ return {
37
+ ...mapping,
38
+ field: mapping.as ?? field,
39
+ };
40
+ };
41
+ export const mapVectorItemToFieldRow = (item, options) => {
42
+ const labelSeparator = options.labelSeparator ?? defaultLabelSeparator;
43
+ const indexLabels = options.indexLabels ?? [];
44
+ const valueOptions = {
45
+ sampleParser: options.sampleParser ??
46
+ ((value) => safeParseFloat(value)),
47
+ valueLabel: options.valueLabel ?? defaultValueLabel,
48
+ valueSource: options.valueSource ?? "auto",
49
+ };
50
+ const index = indexLabels.length > 0
51
+ ? joinLabelValues(item.metric, indexLabels, labelSeparator)
52
+ : undefined;
53
+ if (indexLabels.length > 0 && index === undefined) {
54
+ return undefined;
55
+ }
56
+ const key = joinLabelValues(item.metric, options.keyLabels, labelSeparator);
57
+ const rawField = options.field ??
58
+ (options.fieldLabels
59
+ ? joinLabelValues(item.metric, options.fieldLabels, labelSeparator)
60
+ : undefined);
61
+ if (key === undefined || rawField === undefined) {
62
+ return undefined;
63
+ }
64
+ const fieldMapping = resolveFieldMapping(rawField, options);
65
+ if (fieldMapping === undefined) {
66
+ return undefined;
67
+ }
68
+ const fieldValueOptions = {
69
+ ...valueOptions,
70
+ valueLabel: fieldMapping.valueLabel ?? valueOptions.valueLabel,
71
+ valueSource: fieldMapping.valueSource ?? valueOptions.valueSource,
72
+ sampleParser: fieldMapping.sampleParser ?? valueOptions.sampleParser,
73
+ };
74
+ const value = resolveFieldValue(item, fieldValueOptions);
75
+ if (value === undefined) {
76
+ return undefined;
77
+ }
78
+ return {
79
+ index,
80
+ key,
81
+ field: fieldMapping.field,
82
+ value,
83
+ labels: { ...item.metric },
84
+ sampleValue: item.value[1],
85
+ timestampMs: toMilliseconds(item.value[0]),
86
+ };
87
+ };
88
+ export const mapVectorToFieldRows = (response, options) => {
89
+ if (!isVectorData(response.data)) {
90
+ return [];
91
+ }
92
+ return response.data.result.reduce((rows, item) => {
93
+ const row = mapVectorItemToFieldRow(item, options);
94
+ if (row !== undefined) {
95
+ rows.push(row);
96
+ }
97
+ return rows;
98
+ }, []);
99
+ };
100
+ const setFieldValue = (record, field, value, duplicate) => {
101
+ const current = record[field];
102
+ if (current === undefined) {
103
+ record[field] = value;
104
+ return;
105
+ }
106
+ if (duplicate === "first") {
107
+ return;
108
+ }
109
+ if (duplicate === "last") {
110
+ record[field] = value;
111
+ return;
112
+ }
113
+ if (duplicate === "array") {
114
+ record[field] = Array.isArray(current)
115
+ ? [...current, value]
116
+ : [current, value];
117
+ return;
118
+ }
119
+ throw new Error(`Duplicate field row for field "${field}".`);
120
+ };
121
+ export const mapFieldRowsByKey = (rows, options = {}) => {
122
+ const duplicate = options.duplicate ?? "last";
123
+ return rows.reduce((table, row) => {
124
+ const record = table[row.key] ?? {};
125
+ setFieldValue(record, row.field, row.value, duplicate);
126
+ table[row.key] = record;
127
+ return table;
128
+ }, {});
129
+ };
130
+ export const mapFieldRowsByIndexKey = (rows, options = {}) => {
131
+ const duplicate = options.duplicate ?? "last";
132
+ return rows.reduce((table, row) => {
133
+ const index = row.index;
134
+ if (index === undefined) {
135
+ return table;
136
+ }
137
+ const records = table[index] ?? {};
138
+ const record = records[row.key] ?? {};
139
+ setFieldValue(record, row.field, row.value, duplicate);
140
+ records[row.key] = record;
141
+ table[index] = records;
142
+ return table;
143
+ }, {});
144
+ };
145
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAyDtE,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC,MAAM,eAAe,GAAG,CACtB,MAAoB,EACpB,UAA6B,EAC7B,SAAiB,EACG,EAAE;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,IAAoB,EACpB,OAKC,EAC2B,EAAE;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,KAAa,EACb,OAA4E,EAWhE,EAAE;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IAE/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,KAAK;KAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAoB,EACpB,OAAoC,EACV,EAAE;IAC5B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,MAAM,YAAY,GAKd;QACF,YAAY,EACV,OAAO,CAAC,YAAY;YACpB,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAmB,CAAC;QAC9D,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,iBAAiB;QACnD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM;KAC3C,CAAC;IAEF,MAAM,KAAK,GACT,WAAW,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC;QAC3D,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5E,MAAM,QAAQ,GACZ,OAAO,CAAC,KAAK;QACb,CAAC,OAAO,CAAC,WAAW;YAClB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;YACnE,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjB,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,GAAG,YAAY;QACf,UAAU,EAAE,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU;QAC9D,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,WAAW;QACjE,YAAY,EAAE,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY;KACrE,CAAC;IACF,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAEzD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK;QACL,GAAG;QACH,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,KAAK;QACL,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAA8C,EAC9C,OAAoC,EACpB,EAAE;IAClB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAChE,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,MAAuB,EACvB,KAAa,EACb,KAAqB,EACrB,SAAoC,EACpC,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC;YACrB,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,IAAI,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA6B,EAC7B,UAA+B,EAAE,EACjB,EAAE;IAClB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,OAAO,IAAI,CAAC,MAAM,CAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAA6B,EAC7B,UAA+B,EAAE,EACV,EAAE;IACzB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,OAAO,IAAI,CAAC,MAAM,CAAwB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lwmacct/260529-promclient",
3
- "version": "0.14.260628",
3
+ "version": "0.16.260628",
4
4
  "private": false,
5
5
  "description": "Small Prometheus-compatible HTTP API client with PromQL helpers and response transforms.",
6
6
  "type": "module",