@lwmacct/260529-promclient 0.15.260628 → 0.17.260629

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,71 +177,50 @@ const time = serializeTime(new Date());
176
177
 
177
178
  Prometheus 的 sample value 是字符串。转换工具会在需要时解析为 number,并过滤 `NaN`。
178
179
 
179
- ### Label Record Transform
180
+ ### Record Schema Transform
180
181
 
181
- 有些指标会把表格结构编码到 labels 中,例如用某些 labels 表示 `index`、`key`、`field`,再用 sample value 或 `value` label 表示字段值。可以用 `mapVectorToFieldRows` 先转成标准行,再按 key 或 index/key pivot 成对象表。
182
+ 有些指标会把表格结构编码到 labels 中,例如用某些 labels 表示 record key、field name,并用 sample value 或某个 label 表示字段值。`mapVectorToRecords` 和 `mapVectorToRecordMap` 使用 schema 直接把 vector 转成对象,不再暴露中间 field rows。
182
183
 
183
184
  示例一:sample value 作为字段值。
184
185
 
185
- 假设查询返回这些 vector samples:
186
-
187
186
  ```promql
188
187
  demo_service_quota{tenant="acme", service="api", resource="cpu"} 4
189
188
  demo_service_quota{tenant="acme", service="api", resource="memory_gb"} 16
190
189
  demo_service_quota{tenant="acme", service="worker", resource="cpu"} 2
191
190
  ```
192
191
 
193
- 可以把它理解为:
194
-
195
- | index | key | field | value |
196
- | --- | --- | --- | --- |
197
- | `acme` | `api` | `cpu` | `4` |
198
- | `acme` | `api` | `memory_gb` | `16` |
199
- | `acme` | `worker` | `cpu` | `2` |
200
-
201
192
  ```ts
202
193
  import {
203
- mapFieldRowsByIndexKey,
204
- mapVectorToFieldRows,
194
+ label,
195
+ labels,
196
+ mapVectorToRecords,
197
+ numberSample,
205
198
  } from "@lwmacct/260529-promclient";
206
199
 
207
- const response = await client.query("demo_service_quota");
208
-
209
- const rows = mapVectorToFieldRows(response, {
210
- indexLabels: ["tenant"],
211
- keyLabels: ["service"],
212
- fieldLabels: ["resource"],
213
- valueSource: "sample",
214
- });
215
-
216
- const table = mapFieldRowsByIndexKey(rows);
217
- // {
218
- // acme: {
219
- // api: {
220
- // cpu: 4,
221
- // memory_gb: 16
222
- // },
223
- // worker: {
224
- // cpu: 2
225
- // }
226
- // }
227
- // }
228
- ```
229
-
230
- 如果字段由多个 label 共同决定,可以把多个 label 组合成字段名:
231
-
232
- ```ts
233
- const rows = mapVectorToFieldRows(response, {
234
- indexLabels: ["tenant"],
235
- keyLabels: ["service"],
236
- fieldLabels: ["method", "status"],
200
+ type ServiceQuota = {
201
+ key: string;
202
+ tenant: string;
203
+ service: string;
204
+ cpu?: number;
205
+ memoryGb?: number;
206
+ };
207
+
208
+ const rows = mapVectorToRecords<ServiceQuota>(response, {
209
+ key: labels(["tenant", "service"]),
210
+ field: label("resource"),
211
+ base: {
212
+ key: labels(["tenant", "service"]),
213
+ tenant: label("tenant"),
214
+ service: label("service"),
215
+ },
216
+ fields: {
217
+ cpu: numberSample("cpu"),
218
+ memory_gb: numberSample("memoryGb"),
219
+ },
237
220
  });
238
- // method="GET", status="200" -> field: "GET.200"
239
221
  ```
240
222
 
241
- 示例二:`value` label 作为字段值。
242
-
243
- 这类指标通常用 sample value `1` 表示“这条信息存在”,真正的字段值在 label 中:
223
+ 示例二:字段值来自 label。
244
224
 
245
225
  ```promql
246
226
  demo_asset_info{asset="srv-01", field="region", value="us-east"} 1
@@ -248,55 +228,152 @@ demo_asset_info{asset="srv-01", field="owner", value="platform"} 1
248
228
  demo_asset_info{asset="srv-02", field="region", value="eu-west"} 1
249
229
  ```
250
230
 
251
- 可以把它理解为:
231
+ ```ts
232
+ import {
233
+ label,
234
+ labelValue,
235
+ mapVectorToRecordMap,
236
+ } from "@lwmacct/260529-promclient";
252
237
 
253
- | key | field | value |
254
- | --- | --- | --- |
255
- | `srv-01` | `region` | `us-east` |
256
- | `srv-01` | `owner` | `platform` |
257
- | `srv-02` | `region` | `eu-west` |
238
+ type AssetInfo = {
239
+ asset: string;
240
+ region?: string;
241
+ owner?: string;
242
+ };
243
+
244
+ const table = mapVectorToRecordMap<AssetInfo>(response, {
245
+ key: label("asset"),
246
+ field: label("field"),
247
+ base: {
248
+ asset: label("asset"),
249
+ },
250
+ fields: {
251
+ region: labelValue("region", "value"),
252
+ owner: labelValue("owner", "value"),
253
+ },
254
+ });
255
+ ```
256
+
257
+ 示例三:部分字段来自 label,部分字段来自 sample。
258
258
 
259
259
  ```ts
260
260
  import {
261
- mapFieldRowsByKey,
262
- mapVectorToFieldRows,
261
+ autoValue,
262
+ label,
263
+ labelValue,
264
+ labels,
265
+ mapVectorToRecords,
266
+ numberSample,
263
267
  } from "@lwmacct/260529-promclient";
264
268
 
265
- const response = await client.query("demo_asset_info");
266
-
267
- const rows = mapVectorToFieldRows(response, {
268
- keyLabels: ["asset"],
269
- fieldLabels: ["field"],
270
- valueLabel: "value",
271
- valueSource: "auto",
269
+ type DiskInfo = {
270
+ key: string;
271
+ host: string;
272
+ serialNumber: string;
273
+ modelNumber?: string;
274
+ namespace?: string;
275
+ totalBytes?: number;
276
+ };
277
+
278
+ const disks = mapVectorToRecords<DiskInfo>(response, {
279
+ key: labels(["host", "serial"]),
280
+ field: label("field"),
281
+ base: {
282
+ key: labels(["host", "serial"]),
283
+ host: label("host"),
284
+ serialNumber: label("serial"),
285
+ },
286
+ fields: {
287
+ model_number: labelValue("modelNumber", "value"),
288
+ namespace: autoValue("namespace", "value"),
289
+ total_bytes: numberSample("totalBytes"),
290
+ },
272
291
  });
292
+ ```
293
+
294
+ 示例四:字段来自 metric name。
295
+
296
+ ```ts
297
+ import {
298
+ label,
299
+ mapVectorToRecordMap,
300
+ metricName,
301
+ numberSample,
302
+ } from "@lwmacct/260529-promclient";
273
303
 
274
- const table = mapFieldRowsByKey(rows);
275
- // {
276
- // "srv-01": {
277
- // region: "us-east",
278
- // owner: "platform"
279
- // },
280
- // "srv-02": {
281
- // region: "eu-west"
282
- // }
283
- // }
304
+ type MemoryStats = {
305
+ total?: number;
306
+ available?: number;
307
+ };
308
+
309
+ const stats = mapVectorToRecordMap<MemoryStats>(response, {
310
+ key: label("instance"),
311
+ field: metricName(),
312
+ fields: {
313
+ node_memory_MemTotal_bytes: numberSample("total"),
314
+ node_memory_MemAvailable_bytes: numberSample("available"),
315
+ },
316
+ });
284
317
  ```
285
318
 
286
- `valueSource` 支持:
319
+ 多个查询结果需要合并成同一批 records 时,可以使用 `mergeVectorRecords`。每个输入可以有独立 schema,只要 key 相同就会合并到同一个对象。
287
320
 
288
- | 值 | 说明 |
289
- | --- | --- |
290
- | `"auto"` | 优先读取 `valueLabel` 指定的 label;不存在时读取 sample value,默认值 |
291
- | `"label"` | 只读取 `valueLabel` 指定的 label |
292
- | `"sample"` | 只读取 Prometheus sample value |
321
+ ```ts
322
+ import {
323
+ constant,
324
+ label,
325
+ labels,
326
+ mergeVectorRecords,
327
+ numberSample,
328
+ } from "@lwmacct/260529-promclient";
329
+
330
+ type PortTraffic = {
331
+ key: string;
332
+ switchId: string;
333
+ ifIndex: string;
334
+ inBps?: number;
335
+ outBps?: number;
336
+ };
337
+
338
+ const base = {
339
+ key: labels(["switch", "ifIndex"]),
340
+ switchId: label("switch"),
341
+ ifIndex: label("ifIndex"),
342
+ };
343
+
344
+ const rows = mergeVectorRecords<PortTraffic>([
345
+ {
346
+ response: inResponse,
347
+ schema: {
348
+ key: labels(["switch", "ifIndex"]),
349
+ field: constant("inBps"),
350
+ base,
351
+ fields: { inBps: numberSample("inBps") },
352
+ },
353
+ },
354
+ {
355
+ response: outResponse,
356
+ schema: {
357
+ key: labels(["switch", "ifIndex"]),
358
+ field: constant("outBps"),
359
+ base,
360
+ fields: { outBps: numberSample("outBps") },
361
+ },
362
+ },
363
+ ]);
364
+ ```
293
365
 
294
- 重复字段默认采用后出现的值。需要保留第一条、保留数组或发现重复时报错时,可以配置 pivot 函数:
366
+ 重复字段默认采用后出现的值。可以在 schema 或字段规则中配置:
295
367
 
296
368
  ```ts
297
- mapFieldRowsByKey(rows, { duplicate: "first" });
298
- mapFieldRowsByKey(rows, { duplicate: "array" });
299
- mapFieldRowsByKey(rows, { duplicate: "error" });
369
+ const rows = mapVectorToRecords(response, {
370
+ key: label("asset"),
371
+ field: label("field"),
372
+ duplicate: "first",
373
+ fields: {
374
+ owner: labelValue("owner", "value", { duplicate: "error" }),
375
+ },
376
+ });
300
377
  ```
301
378
 
302
379
  ### Instant Response
@@ -1,33 +1,45 @@
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;
1
+ import type { PromInstantData, PromVectorItem, PromSuccessResponse } from "../types";
2
+ export type PromRecordValue = string | number | boolean | null;
3
+ export type PromRecordValueResolver<TValue = PromRecordValue> = (item: PromVectorItem) => TValue | undefined;
4
+ export type DuplicateRecordFieldStrategy = "last" | "first" | "array" | "error";
5
+ export type PromRecordFieldRule = {
6
6
  field: string;
7
- value: PromFieldValue;
8
- labels: PromLabelSet;
9
- sampleValue: string;
10
- timestampMs: number;
7
+ value: PromRecordValueResolver;
8
+ duplicate?: DuplicateRecordFieldStrategy;
11
9
  };
12
- export type PromFieldValueSource = "auto" | "label" | "sample";
13
- export type MapVectorToFieldRowsOptions = {
14
- indexLabels?: readonly string[];
15
- keyLabels: readonly string[];
16
- fieldLabels: readonly string[];
17
- valueLabel?: string;
18
- valueSource?: PromFieldValueSource;
19
- labelSeparator?: string;
20
- sampleParser?: (value: string, item: PromVectorItem) => PromFieldValue;
10
+ export type PromRecordBaseSchema<TRecord extends Record<string, unknown>> = {
11
+ [K in keyof TRecord]?: PromRecordValueResolver<TRecord[K]>;
21
12
  };
22
- export type DuplicateFieldRowStrategy = "last" | "first" | "array" | "error";
23
- export type MapFieldRowsOptions = {
24
- duplicate?: DuplicateFieldRowStrategy;
13
+ export type PromRecordSchema<TRecord extends Record<string, unknown>> = {
14
+ key: PromRecordValueResolver<string>;
15
+ field: PromRecordValueResolver<string>;
16
+ base?: PromRecordBaseSchema<TRecord>;
17
+ fields: Record<string, PromRecordFieldRule | readonly PromRecordFieldRule[]>;
18
+ duplicate?: DuplicateRecordFieldStrategy;
19
+ unknownField?: "drop" | "error";
25
20
  };
26
- export type PromFieldRecord = Record<string, PromFieldValue | PromFieldValue[]>;
27
- export type PromFieldTable = Record<string, PromFieldRecord>;
28
- export type PromIndexedFieldTable = Record<string, PromFieldTable>;
29
- export declare const mapVectorItemToFieldRow: (item: PromVectorItem, options: MapVectorToFieldRowsOptions) => PromFieldRow | undefined;
30
- export declare const mapVectorToFieldRows: (response: PromSuccessResponse<PromInstantData>, options: MapVectorToFieldRowsOptions) => PromFieldRow[];
31
- export declare const mapFieldRowsByKey: (rows: readonly PromFieldRow[], options?: MapFieldRowsOptions) => PromFieldTable;
32
- export declare const mapFieldRowsByIndexKey: (rows: readonly PromFieldRow[], options?: MapFieldRowsOptions) => PromIndexedFieldTable;
21
+ export type MergeVectorRecordsInput<TRecord extends Record<string, unknown>> = {
22
+ response: PromSuccessResponse<PromInstantData>;
23
+ schema: PromRecordSchema<TRecord>;
24
+ };
25
+ export declare const mapVectorToRecordMap: <TRecord extends Record<string, unknown>>(response: PromSuccessResponse<PromInstantData>, schema: PromRecordSchema<TRecord>) => Record<string, TRecord>;
26
+ export declare const mapVectorToRecords: <TRecord extends Record<string, unknown>>(response: PromSuccessResponse<PromInstantData>, schema: PromRecordSchema<TRecord>) => TRecord[];
27
+ export declare const mergeVectorRecords: <TRecord extends Record<string, unknown>>(inputs: readonly MergeVectorRecordsInput<TRecord>[]) => TRecord[];
28
+ export declare const label: (name: string) => PromRecordValueResolver<string>;
29
+ export declare const labels: (names: readonly string[], separator?: string) => PromRecordValueResolver<string>;
30
+ export declare const metricName: () => PromRecordValueResolver<string>;
31
+ export declare const constant: <TValue extends PromRecordValue>(value: TValue) => PromRecordValueResolver<TValue>;
32
+ export declare const sample: <TRecord extends Record<string, unknown>>(field: keyof TRecord | string, options?: {
33
+ duplicate?: DuplicateRecordFieldStrategy;
34
+ }) => PromRecordFieldRule;
35
+ export declare const numberSample: <TRecord extends Record<string, unknown>>(field: keyof TRecord | string, options?: {
36
+ duplicate?: DuplicateRecordFieldStrategy;
37
+ defaultValue?: number;
38
+ }) => PromRecordFieldRule;
39
+ export declare const labelValue: <TRecord extends Record<string, unknown>>(field: keyof TRecord | string, labelName: string, options?: {
40
+ duplicate?: DuplicateRecordFieldStrategy;
41
+ }) => PromRecordFieldRule;
42
+ export declare const autoValue: <TRecord extends Record<string, unknown>>(field: keyof TRecord | string, labelName: string, options?: {
43
+ duplicate?: DuplicateRecordFieldStrategy;
44
+ }) => PromRecordFieldRule;
33
45
  //# sourceMappingURL=records.d.ts.map
@@ -1 +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,2BAA2B,GAAG;IACxC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,cAAc,CAAC;CACxE,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;AA2CnE,eAAO,MAAM,uBAAuB,GAClC,MAAM,cAAc,EACpB,SAAS,2BAA2B,KACnC,YAAY,GAAG,SAwCjB,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"}
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"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"}
@@ -1,71 +1,5 @@
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
- export const mapVectorItemToFieldRow = (item, options) => {
26
- const labelSeparator = options.labelSeparator ?? defaultLabelSeparator;
27
- const indexLabels = options.indexLabels ?? [];
28
- const valueOptions = {
29
- sampleParser: options.sampleParser ??
30
- ((value) => safeParseFloat(value)),
31
- valueLabel: options.valueLabel ?? defaultValueLabel,
32
- valueSource: options.valueSource ?? "auto",
33
- };
34
- const index = indexLabels.length > 0
35
- ? joinLabelValues(item.metric, indexLabels, labelSeparator)
36
- : undefined;
37
- if (indexLabels.length > 0 && index === undefined) {
38
- return undefined;
39
- }
40
- const key = joinLabelValues(item.metric, options.keyLabels, labelSeparator);
41
- const field = joinLabelValues(item.metric, options.fieldLabels, labelSeparator);
42
- const value = resolveFieldValue(item, valueOptions);
43
- if (key === undefined || field === undefined || value === undefined) {
44
- return undefined;
45
- }
46
- return {
47
- index,
48
- key,
49
- field,
50
- value,
51
- labels: { ...item.metric },
52
- sampleValue: item.value[1],
53
- timestampMs: toMilliseconds(item.value[0]),
54
- };
55
- };
56
- export const mapVectorToFieldRows = (response, options) => {
57
- if (!isVectorData(response.data)) {
58
- return [];
59
- }
60
- return response.data.result.reduce((rows, item) => {
61
- const row = mapVectorItemToFieldRow(item, options);
62
- if (row !== undefined) {
63
- rows.push(row);
64
- }
65
- return rows;
66
- }, []);
67
- };
68
- const setFieldValue = (record, field, value, duplicate) => {
1
+ import { isVectorData, safeParseFloat } from "./core";
2
+ const setRecordField = (record, field, value, duplicate) => {
69
3
  const current = record[field];
70
4
  if (current === undefined) {
71
5
  record[field] = value;
@@ -79,35 +13,109 @@ const setFieldValue = (record, field, value, duplicate) => {
79
13
  return;
80
14
  }
81
15
  if (duplicate === "array") {
82
- record[field] = Array.isArray(current)
83
- ? [...current, value]
84
- : [current, value];
16
+ record[field] = (Array.isArray(current) ? [...current, value] : [current, value]);
85
17
  return;
86
18
  }
87
- throw new Error(`Duplicate field row for field "${field}".`);
19
+ throw new Error(`Duplicate record field "${field}".`);
88
20
  };
89
- export const mapFieldRowsByKey = (rows, options = {}) => {
90
- const duplicate = options.duplicate ?? "last";
91
- return rows.reduce((table, row) => {
92
- const record = table[row.key] ?? {};
93
- setFieldValue(record, row.field, row.value, duplicate);
94
- table[row.key] = record;
95
- return table;
96
- }, {});
21
+ const applyBase = (record, item, schema) => {
22
+ if (!schema) {
23
+ return;
24
+ }
25
+ for (const [field, resolver] of Object.entries(schema)) {
26
+ if (record[field] !== undefined || !resolver) {
27
+ continue;
28
+ }
29
+ const value = resolver(item);
30
+ if (value !== undefined) {
31
+ record[field] = value;
32
+ }
33
+ }
97
34
  };
98
- export const mapFieldRowsByIndexKey = (rows, options = {}) => {
99
- const duplicate = options.duplicate ?? "last";
100
- return rows.reduce((table, row) => {
101
- const index = row.index;
102
- if (index === undefined) {
103
- return table;
35
+ const getFieldRules = (rawField, schema) => {
36
+ const rules = schema.fields[rawField];
37
+ if (rules === undefined) {
38
+ if (schema.unknownField === "error") {
39
+ throw new Error(`Unknown record field "${rawField}".`);
40
+ }
41
+ return [];
42
+ }
43
+ return Array.isArray(rules) ? rules : [rules];
44
+ };
45
+ export const mapVectorToRecordMap = (response, schema) => {
46
+ if (!isVectorData(response.data)) {
47
+ return {};
48
+ }
49
+ return response.data.result.reduce((records, item) => {
50
+ const key = schema.key(item);
51
+ const rawField = schema.field(item);
52
+ if (key === undefined || rawField === undefined) {
53
+ return records;
54
+ }
55
+ const rules = getFieldRules(rawField, schema);
56
+ if (rules.length === 0) {
57
+ return records;
58
+ }
59
+ const record = records[key] ?? {};
60
+ applyBase(record, item, schema.base);
61
+ for (const rule of rules) {
62
+ const value = rule.value(item);
63
+ if (value !== undefined) {
64
+ setRecordField(record, rule.field, value, rule.duplicate ?? schema.duplicate ?? "last");
65
+ }
104
66
  }
105
- const records = table[index] ?? {};
106
- const record = records[row.key] ?? {};
107
- setFieldValue(record, row.field, row.value, duplicate);
108
- records[row.key] = record;
109
- table[index] = records;
110
- return table;
67
+ records[key] = record;
68
+ return records;
111
69
  }, {});
112
70
  };
71
+ export const mapVectorToRecords = (response, schema) => Object.values(mapVectorToRecordMap(response, schema));
72
+ export const mergeVectorRecords = (inputs) => {
73
+ const records = {};
74
+ for (const input of inputs) {
75
+ Object.entries(mapVectorToRecordMap(input.response, input.schema)).forEach(([key, record]) => {
76
+ records[key] = { ...(records[key] ?? {}), ...record };
77
+ });
78
+ }
79
+ return Object.values(records);
80
+ };
81
+ export const label = (name) => (item) => item.metric[name];
82
+ export const labels = (names, separator = "\u0000") => (item) => {
83
+ const values = [];
84
+ for (const name of names) {
85
+ const value = item.metric[name];
86
+ if (value === undefined) {
87
+ return undefined;
88
+ }
89
+ values.push(value);
90
+ }
91
+ return values.join(separator);
92
+ };
93
+ export const metricName = () => (item) => item.metric.__name__;
94
+ export const constant = (value) => () => value;
95
+ export const sample = (field, options = {}) => ({
96
+ field: String(field),
97
+ value: (item) => item.value[1],
98
+ duplicate: options.duplicate,
99
+ });
100
+ export const numberSample = (field, options = {}) => ({
101
+ field: String(field),
102
+ value: (item) => {
103
+ const value = safeParseFloat(item.value[1], Number.NaN);
104
+ if (Number.isNaN(value)) {
105
+ return options.defaultValue;
106
+ }
107
+ return value;
108
+ },
109
+ duplicate: options.duplicate,
110
+ });
111
+ export const labelValue = (field, labelName, options = {}) => ({
112
+ field: String(field),
113
+ value: (item) => item.metric[labelName],
114
+ duplicate: options.duplicate,
115
+ });
116
+ export const autoValue = (field, labelName, options = {}) => ({
117
+ field: String(field),
118
+ value: (item) => item.metric[labelName] ?? item.value[1],
119
+ duplicate: options.duplicate,
120
+ });
113
121
  //# sourceMappingURL=records.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lwmacct/260529-promclient",
3
- "version": "0.15.260628",
3
+ "version": "0.17.260629",
4
4
  "private": false,
5
5
  "description": "Small Prometheus-compatible HTTP API client with PromQL helpers and response transforms.",
6
6
  "type": "module",