@lwmacct/260529-promclient 0.16.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
@@ -177,90 +177,50 @@ const time = serializeTime(new Date());
177
177
 
178
178
  Prometheus 的 sample value 是字符串。转换工具会在需要时解析为 number,并过滤 `NaN`。
179
179
 
180
- ### Label Record Transform
180
+ ### Record Schema Transform
181
181
 
182
- 有些指标会把表格结构编码到 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。
183
183
 
184
184
  示例一:sample value 作为字段值。
185
185
 
186
- 假设查询返回这些 vector samples:
187
-
188
186
  ```promql
189
187
  demo_service_quota{tenant="acme", service="api", resource="cpu"} 4
190
188
  demo_service_quota{tenant="acme", service="api", resource="memory_gb"} 16
191
189
  demo_service_quota{tenant="acme", service="worker", resource="cpu"} 2
192
190
  ```
193
191
 
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
192
  ```ts
203
193
  import {
204
- mapFieldRowsByIndexKey,
205
- mapVectorToFieldRows,
194
+ label,
195
+ labels,
196
+ mapVectorToRecords,
197
+ numberSample,
206
198
  } from "@lwmacct/260529-promclient";
207
199
 
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"],
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
+ },
238
220
  });
239
- // method="GET", status="200" -> field: "GET.200"
240
221
  ```
241
222
 
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 中:
223
+ 示例二:字段值来自 label。
264
224
 
265
225
  ```promql
266
226
  demo_asset_info{asset="srv-01", field="region", value="us-east"} 1
@@ -268,93 +228,152 @@ demo_asset_info{asset="srv-01", field="owner", value="platform"} 1
268
228
  demo_asset_info{asset="srv-02", field="region", value="eu-west"} 1
269
229
  ```
270
230
 
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
231
  ```ts
280
232
  import {
281
- mapFieldRowsByKey,
282
- mapVectorToFieldRows,
233
+ label,
234
+ labelValue,
235
+ mapVectorToRecordMap,
283
236
  } from "@lwmacct/260529-promclient";
284
237
 
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",
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
+ },
292
254
  });
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
255
  ```
305
256
 
306
- 字段名需要转换为业务对象属性时,可以配置 `fieldMappings`。映射值为 `false` 时会丢弃该字段;`unknownField: "drop"` 会丢弃未声明字段:
257
+ 示例三:部分字段来自 label,部分字段来自 sample。
307
258
 
308
259
  ```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,
260
+ import {
261
+ autoValue,
262
+ label,
263
+ labelValue,
264
+ labels,
265
+ mapVectorToRecords,
266
+ numberSample,
267
+ } from "@lwmacct/260529-promclient";
268
+
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"),
319
290
  },
320
291
  });
321
292
  ```
322
293
 
323
- 字段级配置可以覆盖全局 `valueSource`、`valueLabel` 和 `sampleParser`。这适合部分字段值在 label 中、部分字段值在 sample 中的指标:
294
+ 示例四:字段来自 metric name。
324
295
 
325
296
  ```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
- },
297
+ import {
298
+ label,
299
+ mapVectorToRecordMap,
300
+ metricName,
301
+ numberSample,
302
+ } from "@lwmacct/260529-promclient";
303
+
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"),
340
315
  },
341
316
  });
342
317
  ```
343
318
 
344
- `valueSource` 支持:
319
+ 多个查询结果需要合并成同一批 records 时,可以使用 `mergeVectorRecords`。每个输入可以有独立 schema,只要 key 相同就会合并到同一个对象。
345
320
 
346
- | 值 | 说明 |
347
- | --- | --- |
348
- | `"auto"` | 优先读取 `valueLabel` 指定的 label;不存在时读取 sample value,默认值 |
349
- | `"label"` | 只读取 `valueLabel` 指定的 label |
350
- | `"sample"` | 只读取 Prometheus sample value |
321
+ ```ts
322
+ import {
323
+ constant,
324
+ label,
325
+ labels,
326
+ mergeVectorRecords,
327
+ numberSample,
328
+ } from "@lwmacct/260529-promclient";
351
329
 
352
- 重复字段默认采用后出现的值。需要保留第一条、保留数组或发现重复时报错时,可以配置 pivot 函数:
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
+ ```
365
+
366
+ 重复字段默认采用后出现的值。可以在 schema 或字段规则中配置:
353
367
 
354
368
  ```ts
355
- mapFieldRowsByKey(rows, { duplicate: "first" });
356
- mapFieldRowsByKey(rows, { duplicate: "array" });
357
- 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
+ });
358
377
  ```
359
378
 
360
379
  ### Instant Response
@@ -366,7 +385,6 @@ import {
366
385
  getScalarNumber,
367
386
  mapVector,
368
387
  mapVectorByLabel,
369
- mapVectorByLabelAndName,
370
388
  } from "@lwmacct/260529-promclient";
371
389
  ```
372
390
 
@@ -378,23 +396,8 @@ import {
378
396
  | `getScalarValue(response)` | 从 scalar/string response 中取出原始字符串值 |
379
397
  | `getScalarNumber(response, defaultValue?)` | 从 scalar response 中解析数字 |
380
398
  | `mapVectorByLabel(response, labelName, parser?)` | 按指定 label 聚合 vector 数值 |
381
- | `mapVectorByLabelAndName(response, labelName, mapper, parser?)` | 按指定 label 聚合,并用 `__name__` 区分字段 |
382
399
  | `mapVector(response, mapper)` | 自定义映射 vector items |
383
400
 
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
-
398
401
  ### Range Response
399
402
 
400
403
  ```ts
@@ -3,6 +3,5 @@ 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>;
7
6
  export declare const mapVector: <T>(response: PromSuccessResponse<PromVectorData>, mapper: (item: PromVectorItem) => T | undefined) => T[];
8
7
  //# 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,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"}
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"}
@@ -30,25 +30,6 @@ 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
- };
52
33
  export const mapVector = (response, mapper) => response.data.result.reduce((result, item) => {
53
34
  const mapped = mapper(item);
54
35
  if (mapped !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"instant.js","sourceRoot":"","sources":["../../src/transform/instant.ts"],"names":[],"mappings":"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"}
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,42 +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 PromFieldMapping = string | false | {
14
- as?: string;
15
- valueLabel?: string;
16
- valueSource?: PromFieldValueSource;
17
- sampleParser?: (value: string, item: PromVectorItem) => PromFieldValue | undefined;
10
+ export type PromRecordBaseSchema<TRecord extends Record<string, unknown>> = {
11
+ [K in keyof TRecord]?: PromRecordValueResolver<TRecord[K]>;
18
12
  };
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";
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";
30
20
  };
31
- export type DuplicateFieldRowStrategy = "last" | "first" | "array" | "error";
32
- export type MapFieldRowsOptions = {
33
- duplicate?: DuplicateFieldRowStrategy;
21
+ export type MergeVectorRecordsInput<TRecord extends Record<string, unknown>> = {
22
+ response: PromSuccessResponse<PromInstantData>;
23
+ schema: PromRecordSchema<TRecord>;
34
24
  };
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;
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;
42
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,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"}
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/transform/records.ts"],"names":[],"mappings":"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"}
@@ -1,103 +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
- 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) => {
1
+ import { isVectorData, safeParseFloat } from "./core";
2
+ const setRecordField = (record, field, value, duplicate) => {
101
3
  const current = record[field];
102
4
  if (current === undefined) {
103
5
  record[field] = value;
@@ -111,35 +13,109 @@ const setFieldValue = (record, field, value, duplicate) => {
111
13
  return;
112
14
  }
113
15
  if (duplicate === "array") {
114
- record[field] = Array.isArray(current)
115
- ? [...current, value]
116
- : [current, value];
16
+ record[field] = (Array.isArray(current) ? [...current, value] : [current, value]);
117
17
  return;
118
18
  }
119
- throw new Error(`Duplicate field row for field "${field}".`);
19
+ throw new Error(`Duplicate record field "${field}".`);
120
20
  };
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
- }, {});
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
+ }
129
34
  };
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;
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;
136
58
  }
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;
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
+ }
66
+ }
67
+ records[key] = record;
68
+ return records;
143
69
  }, {});
144
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
+ });
145
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.16.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",