@wizeworks/lens-hub 0.3.0-alpha.3 → 0.3.0-alpha.4

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.
Files changed (190) hide show
  1. package/dist/alerts/api.d.ts +5 -0
  2. package/dist/alerts/api.d.ts.map +1 -0
  3. package/dist/alerts/api.js +87 -0
  4. package/dist/alerts/api.js.map +1 -0
  5. package/dist/alerts/deliver.d.ts +54 -0
  6. package/dist/alerts/deliver.d.ts.map +1 -0
  7. package/dist/alerts/deliver.js +66 -0
  8. package/dist/alerts/deliver.js.map +1 -0
  9. package/dist/alerts/evaluate.d.ts +16 -0
  10. package/dist/alerts/evaluate.d.ts.map +1 -0
  11. package/dist/alerts/evaluate.js +76 -0
  12. package/dist/alerts/evaluate.js.map +1 -0
  13. package/dist/alerts/loop.d.ts +10 -0
  14. package/dist/alerts/loop.d.ts.map +1 -0
  15. package/dist/alerts/loop.js +27 -0
  16. package/dist/alerts/loop.js.map +1 -0
  17. package/dist/alerts/store.d.ts +32 -0
  18. package/dist/alerts/store.d.ts.map +1 -0
  19. package/dist/alerts/store.js +38 -0
  20. package/dist/alerts/store.js.map +1 -0
  21. package/dist/alerts/target.d.ts +3 -0
  22. package/dist/alerts/target.d.ts.map +1 -0
  23. package/dist/alerts/target.js +23 -0
  24. package/dist/alerts/target.js.map +1 -0
  25. package/dist/api.d.ts +5 -0
  26. package/dist/api.d.ts.map +1 -1
  27. package/dist/api.js +38 -4
  28. package/dist/api.js.map +1 -1
  29. package/dist/body.d.ts +2 -2
  30. package/dist/body.d.ts.map +1 -1
  31. package/dist/body.js +4 -4
  32. package/dist/body.js.map +1 -1
  33. package/dist/cli-args.d.ts +1 -1
  34. package/dist/cli-args.d.ts.map +1 -1
  35. package/dist/cli-args.js +32 -1
  36. package/dist/cli-args.js.map +1 -1
  37. package/dist/data.js +1 -1
  38. package/dist/data.js.map +1 -1
  39. package/dist/hub.d.ts.map +1 -1
  40. package/dist/hub.js +15 -3
  41. package/dist/hub.js.map +1 -1
  42. package/dist/infra-read.d.ts +11 -0
  43. package/dist/infra-read.d.ts.map +1 -0
  44. package/dist/infra-read.js +30 -0
  45. package/dist/infra-read.js.map +1 -0
  46. package/dist/ingest.d.ts.map +1 -1
  47. package/dist/ingest.js +14 -3
  48. package/dist/ingest.js.map +1 -1
  49. package/dist/issues.d.ts +10 -0
  50. package/dist/issues.d.ts.map +1 -0
  51. package/dist/issues.js +34 -0
  52. package/dist/issues.js.map +1 -0
  53. package/dist/kit.d.ts +6 -0
  54. package/dist/kit.d.ts.map +1 -1
  55. package/dist/kit.js +4 -0
  56. package/dist/kit.js.map +1 -1
  57. package/dist/list-search.d.ts +10 -0
  58. package/dist/list-search.d.ts.map +1 -0
  59. package/dist/list-search.js +13 -0
  60. package/dist/list-search.js.map +1 -0
  61. package/dist/mcp.d.ts +3 -2
  62. package/dist/mcp.d.ts.map +1 -1
  63. package/dist/mcp.js +57 -11
  64. package/dist/mcp.js.map +1 -1
  65. package/dist/metrics-read.js +1 -1
  66. package/dist/metrics-read.js.map +1 -1
  67. package/dist/models-api.d.ts +11 -1
  68. package/dist/models-api.d.ts.map +1 -1
  69. package/dist/models-api.js +41 -15
  70. package/dist/models-api.js.map +1 -1
  71. package/dist/options.d.ts +23 -2
  72. package/dist/options.d.ts.map +1 -1
  73. package/dist/options.js +10 -1
  74. package/dist/options.js.map +1 -1
  75. package/dist/otlp/db-params.d.ts +7 -0
  76. package/dist/otlp/db-params.d.ts.map +1 -0
  77. package/dist/otlp/db-params.js +74 -0
  78. package/dist/otlp/db-params.js.map +1 -0
  79. package/dist/otlp/logs.d.ts +1 -1
  80. package/dist/otlp/logs.d.ts.map +1 -1
  81. package/dist/otlp/logs.js +8 -7
  82. package/dist/otlp/logs.js.map +1 -1
  83. package/dist/otlp/metrics.d.ts +3 -3
  84. package/dist/otlp/metrics.d.ts.map +1 -1
  85. package/dist/otlp/metrics.js +7 -6
  86. package/dist/otlp/metrics.js.map +1 -1
  87. package/dist/otlp/nested.d.ts +4 -0
  88. package/dist/otlp/nested.d.ts.map +1 -0
  89. package/dist/otlp/nested.js +19 -0
  90. package/dist/otlp/nested.js.map +1 -0
  91. package/dist/otlp/semconv.d.ts +17 -0
  92. package/dist/otlp/semconv.d.ts.map +1 -0
  93. package/dist/otlp/semconv.js +68 -0
  94. package/dist/otlp/semconv.js.map +1 -0
  95. package/dist/otlp/spans.d.ts +3 -3
  96. package/dist/otlp/spans.d.ts.map +1 -1
  97. package/dist/otlp/spans.js +15 -7
  98. package/dist/otlp/spans.js.map +1 -1
  99. package/dist/otlp/values.d.ts +5 -10
  100. package/dist/otlp/values.d.ts.map +1 -1
  101. package/dist/otlp/values.js +32 -24
  102. package/dist/otlp/values.js.map +1 -1
  103. package/dist/saved.d.ts +7 -0
  104. package/dist/saved.d.ts.map +1 -0
  105. package/dist/saved.js +49 -0
  106. package/dist/saved.js.map +1 -0
  107. package/dist/scale-exec.d.ts +2 -2
  108. package/dist/scale-exec.d.ts.map +1 -1
  109. package/dist/scale-exec.js +4 -4
  110. package/dist/scale-exec.js.map +1 -1
  111. package/dist/schema-saved.d.ts +15 -0
  112. package/dist/schema-saved.d.ts.map +1 -0
  113. package/dist/schema-saved.js +43 -0
  114. package/dist/schema-saved.js.map +1 -0
  115. package/dist/schema-scale.d.ts.map +1 -1
  116. package/dist/schema-scale.js +11 -1
  117. package/dist/schema-scale.js.map +1 -1
  118. package/dist/schema.d.ts +2 -2
  119. package/dist/schema.d.ts.map +1 -1
  120. package/dist/schema.js +20 -1
  121. package/dist/schema.js.map +1 -1
  122. package/dist/search-api.d.ts +1 -1
  123. package/dist/search-api.d.ts.map +1 -1
  124. package/dist/search-api.js +7 -5
  125. package/dist/search-api.js.map +1 -1
  126. package/dist/settings-prune.d.ts +12 -0
  127. package/dist/settings-prune.d.ts.map +1 -0
  128. package/dist/settings-prune.js +15 -0
  129. package/dist/settings-prune.js.map +1 -0
  130. package/dist/settings.d.ts +27 -0
  131. package/dist/settings.d.ts.map +1 -0
  132. package/dist/settings.js +64 -0
  133. package/dist/settings.js.map +1 -0
  134. package/dist/settle.d.ts +3 -3
  135. package/dist/settle.d.ts.map +1 -1
  136. package/dist/settle.js +12 -6
  137. package/dist/settle.js.map +1 -1
  138. package/dist/slos.d.ts +14 -0
  139. package/dist/slos.d.ts.map +1 -0
  140. package/dist/slos.js +73 -0
  141. package/dist/slos.js.map +1 -0
  142. package/dist/sourcemaps-api.d.ts +15 -0
  143. package/dist/sourcemaps-api.d.ts.map +1 -0
  144. package/dist/sourcemaps-api.js +55 -0
  145. package/dist/sourcemaps-api.js.map +1 -0
  146. package/dist/sourcemaps.d.ts +10 -0
  147. package/dist/sourcemaps.d.ts.map +1 -0
  148. package/dist/sourcemaps.js +41 -0
  149. package/dist/sourcemaps.js.map +1 -0
  150. package/dist/store-read.d.ts +2 -0
  151. package/dist/store-read.d.ts.map +1 -1
  152. package/dist/store-read.js +3 -1
  153. package/dist/store-read.js.map +1 -1
  154. package/dist/store.d.ts +13 -3
  155. package/dist/store.d.ts.map +1 -1
  156. package/dist/store.js +35 -10
  157. package/dist/store.js.map +1 -1
  158. package/dist/tags-api.d.ts +5 -0
  159. package/dist/tags-api.d.ts.map +1 -0
  160. package/dist/tags-api.js +94 -0
  161. package/dist/tags-api.js.map +1 -0
  162. package/dist/tags.d.ts +11 -0
  163. package/dist/tags.d.ts.map +1 -0
  164. package/dist/tags.js +31 -0
  165. package/dist/tags.js.map +1 -0
  166. package/dist/uptime/api.d.ts +5 -0
  167. package/dist/uptime/api.d.ts.map +1 -0
  168. package/dist/uptime/api.js +78 -0
  169. package/dist/uptime/api.js.map +1 -0
  170. package/dist/uptime/cert.d.ts +5 -0
  171. package/dist/uptime/cert.d.ts.map +1 -0
  172. package/dist/uptime/cert.js +26 -0
  173. package/dist/uptime/cert.js.map +1 -0
  174. package/dist/uptime/guard.d.ts +13 -0
  175. package/dist/uptime/guard.d.ts.map +1 -0
  176. package/dist/uptime/guard.js +38 -0
  177. package/dist/uptime/guard.js.map +1 -0
  178. package/dist/uptime/run.d.ts +11 -0
  179. package/dist/uptime/run.d.ts.map +1 -0
  180. package/dist/uptime/run.js +96 -0
  181. package/dist/uptime/run.js.map +1 -0
  182. package/dist/uptime/schedule.d.ts +15 -0
  183. package/dist/uptime/schedule.d.ts.map +1 -0
  184. package/dist/uptime/schedule.js +26 -0
  185. package/dist/uptime/schedule.js.map +1 -0
  186. package/dist/uptime/store.d.ts +25 -0
  187. package/dist/uptime/store.d.ts.map +1 -0
  188. package/dist/uptime/store.js +80 -0
  189. package/dist/uptime/store.js.map +1 -0
  190. package/package.json +4 -4
package/dist/kit.d.ts CHANGED
@@ -7,4 +7,10 @@ export type { HubWrite } from "./store.js";
7
7
  export { fromExponential, pointsOf, writesFromMetrics } from "./otlp/metrics.js";
8
8
  export type { OtlpMetric, OtlpResourceMetrics } from "./otlp/metrics.js";
9
9
  export { encodeMetrics } from "./otlp/proto.js";
10
+ export { runCheck } from "./uptime/run.js";
11
+ export type { RunOptions } from "./uptime/run.js";
12
+ export { isPrivateAddress } from "./uptime/guard.js";
13
+ export { chatBody, deliver, noticeLines, PAGERDUTY_EVENTS_URL, pagerDutyEvents } from "./alerts/deliver.js";
14
+ export type { Notice, NoticeProblem, Outbox } from "./alerts/deliver.js";
15
+ export { checkTarget } from "./alerts/target.js";
10
16
  //# sourceMappingURL=kit.d.ts.map
package/dist/kit.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC5G,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/kit.js CHANGED
@@ -5,4 +5,8 @@ export { isProtobuf, MAX_BODY, parseJson, readBody } from "./body.js";
5
5
  export { parseDuration } from "./cli-args.js";
6
6
  export { fromExponential, pointsOf, writesFromMetrics } from "./otlp/metrics.js";
7
7
  export { encodeMetrics } from "./otlp/proto.js";
8
+ export { runCheck } from "./uptime/run.js";
9
+ export { isPrivateAddress } from "./uptime/guard.js";
10
+ export { chatBody, deliver, noticeLines, PAGERDUTY_EVENTS_URL, pagerDutyEvents } from "./alerts/deliver.js";
11
+ export { checkTarget } from "./alerts/target.js";
8
12
  //# sourceMappingURL=kit.js.map
package/dist/kit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE5G,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type TimeWindow } from "@wizeworks/lens-core";
2
+ import type { HubStore } from "./store.js";
3
+ /** `{ searchIds }` for a list page with a structured `q`; nothing otherwise. */
4
+ export declare function listSearch(store: HubStore, page: string, params: Record<string, string>, window: TimeWindow, scope: {
5
+ project?: string;
6
+ env?: string;
7
+ }): Promise<{
8
+ searchIds?: string[];
9
+ }>;
10
+ //# sourceMappingURL=list-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-search.d.ts","sourceRoot":"","sources":["../src/list-search.ts"],"names":[],"mappings":"AACA,OAAO,EAA+F,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpJ,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,gFAAgF;AAChF,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAKhM"}
@@ -0,0 +1,13 @@
1
+ // A structured search typed into the Requests, Traces, or Logs list: the trace ids it matches, from the hub's search tables.
2
+ import { activeTags, isStructuredSearch, LIST_SEARCH_KIND, searchSql, searchTraceIds, SQLITE_DIALECT } from "@wizeworks/lens-core";
3
+ import { sqliteRunner } from "./scale-exec.js";
4
+ import { hubTags } from "./tags.js";
5
+ /** `{ searchIds }` for a list page with a structured `q`; nothing otherwise. */
6
+ export async function listSearch(store, page, params, window, scope) {
7
+ const kind = LIST_SEARCH_KIND[page];
8
+ if (!kind || !isStructuredSearch(params.q))
9
+ return {};
10
+ const src = { d: SQLITE_DIALECT, run: sqliteRunner(store.db), scope: { project: scope.project } };
11
+ return { searchIds: await searchTraceIds((q) => searchSql(src, q), kind, params.q, window, scope.env, activeTags(hubTags(store.db))) };
12
+ }
13
+ //# sourceMappingURL=list-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-search.js","sourceRoot":"","sources":["../src/list-search.ts"],"names":[],"mappings":"AAAA,6HAA6H;AAC7H,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AACpJ,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAe,EAAE,IAAY,EAAE,MAA8B,EAAE,MAAkB,EAAE,KAAyC;IAC3J,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IAClG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1I,CAAC"}
package/dist/mcp.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { type McpDataSource } from "@wizeworks/lens-node/kit";
1
+ import type { McpDataSource, McpProjects } from "@wizeworks/lens-node/kit";
2
2
  import type { HubData } from "./data.js";
3
- export declare function hubMcpSource(data: HubData, name: string, version: string, audit: (line: string) => void): McpDataSource;
3
+ /** One project: tools read it. Several: tools take `project`, and list_projects names them, as on the cloud. */
4
+ export declare function hubMcpSource(data: HubData, name: string, version: string, audit: (line: string) => void): McpDataSource | McpProjects;
4
5
  //# sourceMappingURL=mcp.d.ts.map
package/dist/mcp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAA6C,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,aAAa,CAevH"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAc,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DzC,gHAAgH;AAChH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,aAAa,GAAG,WAAW,CAgBrI"}
package/dist/mcp.js CHANGED
@@ -1,23 +1,69 @@
1
1
  import { searchSql, SQLITE_DIALECT, suggestSql } from "@wizeworks/lens-core";
2
- import { DEFAULT_N_PLUS_ONE, DEFAULT_SLOW_QUERY_MS } from "@wizeworks/lens-node/kit";
2
+ import { listEvents, listRules } from "./alerts/store.js";
3
3
  import { metricsPage } from "./metrics-read.js";
4
+ import { hubPage } from "./models-api.js";
4
5
  import { sqliteRunner } from "./scale-exec.js";
5
- /** Recent traces the MCP tools search through. */
6
+ import { factsOf } from "./settings.js";
7
+ import { distinctOf, loadTraces } from "./store-read.js";
8
+ import { hubTags } from "./tags.js";
9
+ /** Recent traces the MCP tools read whole, and unsettled ones they add to store searches. */
6
10
  const MCP_RECENT = 2000;
11
+ const ALERT_EVENTS = 50;
12
+ /** What the default project (no project set) is called in list_projects. */
13
+ const DEFAULT_PROJECT = "default";
14
+ /** Traces written since they last settled: the store's search does not have them yet. */
15
+ function unsettled(data, project) {
16
+ const where = project === undefined ? "" : " AND project = ?";
17
+ const ids = data.store.db.prepare(`SELECT trace_id FROM traces WHERE settled_ms < updated_ms${where} ORDER BY start_ms DESC LIMIT ?`).all(...(project === undefined ? [] : [project]), MCP_RECENT).map((r) => r.trace_id);
18
+ return loadTraces(data.store.db, ids, data.keepRemote);
19
+ }
20
+ /** The hub's data for one project, or for all of it when `project` is undefined. */
21
+ function scopedSource(data, project, info) {
22
+ const store = data.store;
23
+ const scope = project === undefined ? {} : { project };
24
+ const src = { d: SQLITE_DIALECT, run: sqliteRunner(store.db), scope };
25
+ const facts = factsOf(store, project ?? "");
26
+ return {
27
+ service: project ? `${info.name} · ${project}` : info.name,
28
+ version: info.version,
29
+ slowQueryMs: facts.slowQueryMs,
30
+ nPlusOneThreshold: facts.nPlusOneThreshold,
31
+ all: () => data.traces({ limit: MCP_RECENT, project }),
32
+ unsettled: () => unsettled(data, project),
33
+ get: (traceId, federate) => data.getTrace(traceId, federate),
34
+ audit: info.audit,
35
+ metrics: (range, params) => metricsPage(store.db, range, scope, params, store.now()),
36
+ search: (q) => searchSql(src, q),
37
+ suggest: (r) => suggestSql(src, r),
38
+ now: () => store.now(),
39
+ page: (page, range, params = {}) => hubPage(data, page, range, scope, params),
40
+ alerts: async () => ({ rules: listRules(store.db, project ?? ""), events: listEvents(store.db, project ?? "", ALERT_EVENTS) }),
41
+ tags: () => hubTags(store.db),
42
+ };
43
+ }
44
+ /** The hub's projects: the named ones, and the default one when traces have none. */
45
+ function hubProjects(data) {
46
+ const named = distinctOf(data.store.db, "project").map((p) => ({ id: p, name: p }));
47
+ const unnamed = data.store.db.prepare("SELECT 1 FROM traces WHERE project = '' LIMIT 1").get() !== undefined;
48
+ return [...named, ...(unnamed ? [{ id: "", name: DEFAULT_PROJECT }] : [])];
49
+ }
50
+ /** One project: tools read it. Several: tools take `project`, and list_projects names them, as on the cloud. */
7
51
  export function hubMcpSource(data, name, version, audit) {
8
- const src = { d: SQLITE_DIALECT, run: sqliteRunner(data.store.db), scope: {} };
52
+ const info = { name, version, audit };
53
+ const projects = hubProjects(data);
54
+ if (projects.length <= 1)
55
+ return scopedSource(data, projects[0]?.id, info);
9
56
  return {
10
57
  service: name,
11
58
  version,
12
- slowQueryMs: DEFAULT_SLOW_QUERY_MS,
13
- nPlusOneThreshold: DEFAULT_N_PLUS_ONE,
14
- all: () => data.traces({ limit: MCP_RECENT }),
15
- get: (traceId, federate) => data.getTrace(traceId, federate),
59
+ slowQueryMs: data.store.slowQueryMs,
60
+ nPlusOneThreshold: data.store.nPlusOneThreshold,
61
+ metrics: true,
62
+ overview: true,
63
+ alerts: true,
64
+ projects,
65
+ open: async (projectId) => scopedSource(data, projectId, info),
16
66
  audit,
17
- metrics: (range, params) => metricsPage(data.store.db, range, {}, params, data.store.now()),
18
- search: (q) => searchSql(src, q),
19
- suggest: (r) => suggestSql(src, r),
20
- now: () => data.store.now(),
21
67
  };
22
68
  }
23
69
  //# sourceMappingURL=mcp.js.map
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAsB,MAAM,0BAA0B,CAAC;AAEzG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,kDAAkD;AAClD,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,IAAY,EAAE,OAAe,EAAE,KAA6B;IACtG,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC/E,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO;QACP,WAAW,EAAE,qBAAqB;QAClC,iBAAiB,EAAE,kBAAkB;QACrC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC7C,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC5D,KAAK;QACL,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3F,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAClC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;KAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { alignNow, isTimeRange, metricPageSteps, metricsModelOf, runMetricSync }
2
2
  /** Parameters the metrics model reads; the range and scope are taken out. */
3
3
  export function metricParams(p) {
4
4
  const out = {};
5
- for (const k of ["metric", "service", "group", "stat", "q"]) {
5
+ for (const k of ["metric", "service", "group", "stat", "q", "where"]) {
6
6
  const v = p.get(k);
7
7
  if (v)
8
8
  out[k] = v.slice(0, 200);
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-read.js","sourceRoot":"","sources":["../src/metrics-read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAsC,cAAc,EAAE,aAAa,EAAkB,MAAM,sBAAsB,CAAC;AAOjK,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAkB;IAC7C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAA4B,EAAE,QAAQ,GAAc,IAAI,EAAa,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAErI,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,KAAgB,EAAE,KAAkB,EAAE,MAA8B,EAAE,GAAW;IAC7H,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5I,OAAO,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAI,CAAC,CAAC,IAAwB,CAAe,CAAC,CAAC,CAAC;AAC1H,CAAC"}
1
+ {"version":3,"file":"metrics-read.js","sourceRoot":"","sources":["../src/metrics-read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAsC,cAAc,EAAE,aAAa,EAAkB,MAAM,sBAAsB,CAAC;AAOjK,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAkB;IAC7C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAA4B,EAAE,QAAQ,GAAc,IAAI,EAAa,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAErI,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,KAAgB,EAAE,KAAkB,EAAE,MAA8B,EAAE,GAAW;IAC7H,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5I,OAAO,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAI,CAAC,CAAC,IAAwB,CAAe,CAAC,CAAC,CAAC;AAC1H,CAAC"}
@@ -1,5 +1,15 @@
1
1
  import type { ServerResponse } from "node:http";
2
+ import { type ModelOf, type PageName, type TimeRange } from "@wizeworks/lens-core";
2
3
  import type { ApiContext } from "./api.js";
3
- /** `GET api/models/<page>?range=&project=&env=&...`: one page's numbers, from the hub's stats tables. */
4
+ import type { HubData } from "./data.js";
5
+ /** A range or window the hub does not keep: a 400 for the API, a tool error for MCP. */
6
+ export declare class PageRangeError extends Error {
7
+ }
8
+ /** One page's numbers for a project and environment, from the hub's stats tables. Cached until stats change. */
9
+ export declare function hubPage<P extends PageName>(data: HubData, page: P, range: TimeRange, scope: {
10
+ project?: string;
11
+ env?: string;
12
+ }, params: Record<string, string>): Promise<ModelOf<P>>;
13
+ /** `GET api/models/<page>?range=&project=&env=&...`: one page's numbers. */
4
14
  export declare function sendPageModel(c: ApiContext, page: string, p: URLSearchParams, res: ServerResponse): Promise<void>;
5
15
  //# sourceMappingURL=models-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models-api.d.ts","sourceRoot":"","sources":["../src/models-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAe3C,yGAAyG;AACzG,wBAAsB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvH"}
1
+ {"version":3,"file":"models-api.d.ts","sourceRoot":"","sources":["../src/models-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAA+D,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAqC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEnL,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wFAAwF;AACxF,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAU5C,gHAAgH;AAChH,wBAAsB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAiB1L;AAED,4EAA4E;AAC5E,wBAAsB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvH"}
@@ -1,9 +1,18 @@
1
- import { alignNow, FACT_SLOW_QUERY_MS, isPageName, isTimeRange, pageContext, runPage, TIME_RANGES } from "@wizeworks/lens-core";
1
+ import { alignNow, APDEX_PAGES, ISSUE_PAGES, isPageName, isTimeRange, pageContext, runPage, TIME_RANGES } from "@wizeworks/lens-core";
2
2
  import { sendJson } from "@wizeworks/lens-node/kit";
3
+ import { issueStates, issuesVersion } from "./issues.js";
4
+ import { apdexTargets, apdexVersion } from "./slos.js";
5
+ import { listSearch } from "./list-search.js";
6
+ import { factsOf, keepMsOf } from "./settings.js";
3
7
  import { hubExecutor, hubSettling } from "./scale-exec.js";
4
8
  const CACHE_MAX = 200;
9
+ /** A custom window may start this much before the kept age (snapping, clock skew). */
10
+ const WINDOW_SLACK_MS = 15 * 60_000;
5
11
  const RESERVED = new Set(["project", "range", "env"]);
6
12
  const cache = new Map();
13
+ /** A range or window the hub does not keep: a 400 for the API, a tool error for MCP. */
14
+ export class PageRangeError extends Error {
15
+ }
7
16
  /** Model parameters: every query value except the ones that pick the data. */
8
17
  const paramsOf = (p) => Object.fromEntries([...p].filter(([k]) => !RESERVED.has(k)).map(([k, v]) => [k, v.slice(0, 500)]).sort());
9
18
  function remember(key, value) {
@@ -11,26 +20,43 @@ function remember(key, value) {
11
20
  cache.delete(cache.keys().next().value);
12
21
  cache.set(key, value);
13
22
  }
14
- /** `GET api/models/<page>?range=&project=&env=&...`: one page's numbers, from the hub's stats tables. */
23
+ /** One page's numbers for a project and environment, from the hub's stats tables. Cached until stats change. */
24
+ export async function hubPage(data, page, range, scope, params) {
25
+ const store = data.store;
26
+ const keepMs = keepMsOf(store, scope.project ?? "");
27
+ if (TIME_RANGES[range].ms > keepMs)
28
+ throw new PageRangeError("This range is longer than the hub keeps data.");
29
+ const now = alignNow(store.now());
30
+ // Stats only change when traces settle or leave, so the settle counter keys the cache.
31
+ const slowQueryMs = factsOf(store, scope.project ?? "").slowQueryMs;
32
+ const key = JSON.stringify([page, range, scope, params, now, store.settleGen, issuesVersion(), apdexVersion(), slowQueryMs, keepMs]);
33
+ if (cache.has(key))
34
+ return cache.get(key);
35
+ const ctx = pageContext(range, now, params, { slowQueryMs }, hubSettling(store, scope));
36
+ if (now - ctx.window.from > keepMs + WINDOW_SLACK_MS)
37
+ throw new PageRangeError("This time window starts before the hub keeps data.");
38
+ const issues = ISSUE_PAGES.has(page) ? { issues: issueStates(store.db, scope.project ?? "") } : {};
39
+ const apdex = APDEX_PAGES.has(page) ? { apdex: apdexTargets(store.db, scope.project ?? "") } : {};
40
+ const search = await listSearch(store, page, params, ctx.window, scope);
41
+ const value = await runPage(page, { ...ctx, ...issues, ...apdex, ...search }, hubExecutor(store, scope, data.keepRemote));
42
+ remember(key, value);
43
+ return value;
44
+ }
45
+ /** `GET api/models/<page>?range=&project=&env=&...`: one page's numbers. */
15
46
  export async function sendPageModel(c, page, p, res) {
16
47
  if (!isPageName(page))
17
48
  return sendJson(res, 404, { error: `No model named "${page}".` });
18
49
  const range = p.get("range") ?? "24h";
19
50
  if (!isTimeRange(range))
20
51
  return sendJson(res, 400, { error: `Unknown range "${range}".` });
21
- const store = c.data.store;
22
- if (TIME_RANGES[range].ms > store.maxAgeMs)
23
- return sendJson(res, 400, { error: "This range is longer than the hub keeps data." });
24
52
  const scope = { project: p.get("project") || undefined, env: p.get("env") || undefined };
25
- const params = paramsOf(p);
26
- const now = alignNow(c.o.now());
27
- // Stats only change when traces settle or leave, so the settle counter keys the cache.
28
- const key = JSON.stringify([page, range, scope, params, now, store.settleGen]);
29
- if (cache.has(key))
30
- return sendJson(res, 200, cache.get(key));
31
- const ctx = pageContext(range, now, params, { slowQueryMs: FACT_SLOW_QUERY_MS }, hubSettling(store, scope));
32
- const value = await runPage(page, ctx, hubExecutor(store, scope, c.data.keepRemote));
33
- remember(key, value);
34
- sendJson(res, 200, value);
53
+ try {
54
+ sendJson(res, 200, await hubPage(c.data, page, range, scope, paramsOf(p)));
55
+ }
56
+ catch (err) {
57
+ if (err instanceof PageRangeError)
58
+ return sendJson(res, 400, { error: err.message });
59
+ throw err;
60
+ }
35
61
  }
36
62
  //# sourceMappingURL=models-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models-api.js","sourceRoot":"","sources":["../src/models-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models-api.js","sourceRoot":"","sources":["../src/models-api.ts"],"names":[],"mappings":"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"}
package/dist/options.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { SourceMapOptions } from "@wizeworks/lens-node/kit";
1
2
  export interface HubOptions {
2
3
  /** Port to listen on. Default 5960. 0 picks a free port. */
3
4
  port?: number;
@@ -11,21 +12,41 @@ export interface HubOptions {
11
12
  maxTraces?: number;
12
13
  /** Oldest trace (and metric point) kept, in ms. Default 7 days. */
13
14
  maxAgeMs?: number;
15
+ /** Oldest log line kept, in ms. Default: `maxAgeMs`. Lines in a request go with their trace when that is sooner. */
16
+ logMaxAgeMs?: number;
14
17
  /** Most metric points kept. Default 2,000,000. */
15
18
  maxMetricPoints?: number;
19
+ /** Run uptime checks (they can reach any address this machine can). Default true. */
20
+ uptime?: boolean;
16
21
  /** Expose the read-only MCP endpoint at `/_wizelens/mcp`. Default false. */
17
22
  enableMcp?: boolean;
18
- /** Key fragments to redact. Default: the contract list. */
23
+ /** Key fragments to redact. Default: the contract list. Projects can add their own in settings. */
19
24
  redactKeys?: string[];
25
+ /** A database call this slow or slower counts as slow, in ms. Default 100. Projects can set their own. */
26
+ slowQueryMs?: number;
27
+ /** This many similar calls in one request is an N+1. Default 5. Projects can set their own. */
28
+ nPlusOneThreshold?: number;
20
29
  /** Override where the dashboard build lives. */
21
30
  uiDir?: string;
22
31
  /** Name shown in the dashboard. Default "wizelens-hub". */
23
32
  name?: string;
24
33
  /** Where MCP audit lines go. Default console.info. */
25
34
  audit?: (line: string) => void;
35
+ /** Source maps with no upload: build folders, and dev servers on this machine (default). False turns them off; uploads still work. */
36
+ sourceMaps?: SourceMapOptions | false;
26
37
  now?: () => number;
38
+ /** How often alert rules run, in ms. Default 60000. */
39
+ alertIntervalMs?: number;
40
+ /** Let alert webhooks call plain http and private or local addresses. Default true: the hub runs on your own network. */
41
+ allowPrivateWebhooks?: boolean;
42
+ /** How alert notices are sent; tests replace it. Default the global fetch. */
43
+ fetch?: typeof fetch;
44
+ /** PagerDuty's Events API URL; tests point it at a local server. */
45
+ pagerDutyUrl?: string;
27
46
  }
28
- export interface ResolvedHubOptions extends Required<Omit<HubOptions, "token" | "uiDir" | "audit" | "now">> {
47
+ export interface ResolvedHubOptions extends Required<Omit<HubOptions, "token" | "uiDir" | "audit" | "now" | "sourceMaps" | "pagerDutyUrl">> {
48
+ sourceMaps: SourceMapOptions | false | undefined;
49
+ pagerDutyUrl: string | undefined;
29
50
  token: string | undefined;
30
51
  uiDir: string | undefined;
31
52
  audit: (line: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8GAA8G;IAC9G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;IACzG,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,QAAgD,CAAC;AAElF,wBAAgB,iBAAiB,CAAC,CAAC,GAAE,UAAe,GAAG,kBAAkB,CAgBxE"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8GAA8G;IAC9G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oHAAoH;IACpH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qFAAqF;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,sIAAsI;IACtI,UAAU,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yHAAyH;IACzH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,cAAc,CAAC,CAAC;IACzI,UAAU,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,CAAC;IACjD,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,QAAgD,CAAC;AAElF,wBAAgB,iBAAiB,CAAC,CAAC,GAAE,UAAe,GAAG,kBAAkB,CAyBxE"}
package/dist/options.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
- import { DEFAULT_REDACT_KEYS, HUB_DEFAULT_PORT } from "@wizeworks/lens-core";
3
+ import { DEFAULT_REDACT_KEYS, FACT_N_PLUS_ONE, FACT_SLOW_QUERY_MS, HUB_DEFAULT_PORT } from "@wizeworks/lens-core";
4
4
  export const DEFAULT_STORAGE_PATH = join(homedir(), ".wizelens", "hub", "hub.db");
5
5
  export function resolveHubOptions(o = {}) {
6
6
  return {
@@ -10,13 +10,22 @@ export function resolveHubOptions(o = {}) {
10
10
  token: o.token || undefined,
11
11
  maxTraces: o.maxTraces ?? 50_000,
12
12
  maxAgeMs: o.maxAgeMs ?? 7 * 24 * 60 * 60_000,
13
+ logMaxAgeMs: o.logMaxAgeMs ?? o.maxAgeMs ?? 7 * 24 * 60 * 60_000,
13
14
  maxMetricPoints: o.maxMetricPoints ?? 2_000_000,
14
15
  enableMcp: o.enableMcp ?? false,
16
+ uptime: o.uptime ?? true,
15
17
  redactKeys: o.redactKeys ?? [...DEFAULT_REDACT_KEYS],
18
+ slowQueryMs: o.slowQueryMs ?? FACT_SLOW_QUERY_MS,
19
+ nPlusOneThreshold: o.nPlusOneThreshold ?? FACT_N_PLUS_ONE,
16
20
  uiDir: o.uiDir,
17
21
  name: o.name ?? "wizelens-hub",
18
22
  audit: o.audit ?? ((line) => console.info(line)),
23
+ sourceMaps: o.sourceMaps,
19
24
  now: o.now ?? Date.now,
25
+ alertIntervalMs: o.alertIntervalMs ?? 60_000,
26
+ allowPrivateWebhooks: o.allowPrivateWebhooks ?? true,
27
+ fetch: o.fetch ?? ((...a) => fetch(...a)),
28
+ pagerDutyUrl: o.pagerDutyUrl,
20
29
  };
21
30
  }
22
31
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqC7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAElF,MAAM,UAAU,iBAAiB,CAAC,CAAC,GAAe,EAAE;IAClD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,gBAAgB;QAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW;QAC3B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,oBAAoB;QAClD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;QAC3B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,MAAM;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;QAC5C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,SAAS;QAC/C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK;QAC/B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,mBAAmB,CAAC;QACpD,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,cAAc;QAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA0DlH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAElF,MAAM,UAAU,iBAAiB,CAAC,CAAC,GAAe,EAAE;IAClD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,gBAAgB;QAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW;QAC3B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,oBAAoB;QAClD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;QAC3B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,MAAM;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;QAC5C,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;QAChE,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,SAAS;QAC/C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,mBAAmB,CAAC;QACpD,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,kBAAkB;QAChD,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,eAAe;QACzD,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,cAAc;QAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QACtB,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,MAAM;QAC5C,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,IAAI,IAAI;QACpD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,YAAY,EAAE,CAAC,CAAC,YAAY;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Attributes } from "@wizeworks/lens-core";
2
+ export declare const DB_PARAMS = "wizelens.db.parameters";
3
+ /** The `str()` of a Python tuple, list, or dict (what the dbapi instrumentation sends) as JSON. Null when it is not one. */
4
+ export declare function pythonToJson(text: string): unknown;
5
+ /** SQL parameters from the OTel agents (`db.query.parameter.<key>`, Python's `db.statement.parameters`) as `wizelens.db.parameters`. */
6
+ export declare function foldDbParams(a: Attributes, keys: readonly string[]): void;
7
+ //# sourceMappingURL=db-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-params.d.ts","sourceRoot":"","sources":["../../src/otlp/db-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAI/E,eAAO,MAAM,SAAS,2BAA2B,CAAC;AAWlD,4HAA4H;AAC5H,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBlD;AAyBD,wIAAwI;AACxI,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMzE"}
@@ -0,0 +1,74 @@
1
+ import { REDACTED, redactParams } from "@wizeworks/lens-core";
2
+ const PARAM_PREFIX = "db.query.parameter.";
3
+ const PYTHON_PARAMS = "db.statement.parameters";
4
+ export const DB_PARAMS = "wizelens.db.parameters";
5
+ // One Python literal token: a quoted string, a word (None, True, numbers), or punctuation.
6
+ const TOKEN = /\s*('(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|[A-Za-z_][\w.]*|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|[()[\]{}:,])/y;
7
+ const WORDS = { None: "null", True: "true", False: "false" };
8
+ function pyString(tok) {
9
+ const body = tok.slice(1, -1).replace(/\\'/g, "'");
10
+ return JSON.stringify(tok[0] === '"' ? JSON.parse(tok) : body.replace(/\\\\/g, "\\"));
11
+ }
12
+ /** The `str()` of a Python tuple, list, or dict (what the dbapi instrumentation sends) as JSON. Null when it is not one. */
13
+ export function pythonToJson(text) {
14
+ const parts = [];
15
+ TOKEN.lastIndex = 0;
16
+ let m;
17
+ while (TOKEN.lastIndex < text.length && (m = TOKEN.exec(text))) {
18
+ const t = m[1];
19
+ if (t === "(")
20
+ parts.push("[");
21
+ else if (t === ")")
22
+ parts.push("]");
23
+ else if (t[0] === "'" || t[0] === '"')
24
+ parts.push(pyString(t));
25
+ else if (/^[A-Za-z_]/.test(t))
26
+ parts.push(WORDS[t] ?? JSON.stringify(t));
27
+ else
28
+ parts.push(t);
29
+ }
30
+ if (text.slice(TOKEN.lastIndex).trim())
31
+ return null;
32
+ try {
33
+ return JSON.parse(parts.join("").replace(/,\s*([\]}])/g, "$1"));
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ // Agents name parameters by position ("0", "1") or by name; positions become an array.
40
+ function fromKeys(a) {
41
+ const keys = Object.keys(a).filter((k) => k.startsWith(PARAM_PREFIX));
42
+ if (keys.length === 0)
43
+ return null;
44
+ const named = {};
45
+ for (const k of keys) {
46
+ named[k.slice(PARAM_PREFIX.length)] = a[k];
47
+ delete a[k];
48
+ }
49
+ const names = Object.keys(named);
50
+ const positional = names.every((n) => /^\d+$/.test(n));
51
+ return positional ? names.sort((x, y) => Number(x) - Number(y)).map((n) => named[n]) : named;
52
+ }
53
+ function fromPython(a, keys) {
54
+ const raw = a[PYTHON_PARAMS];
55
+ if (typeof raw !== "string")
56
+ return null;
57
+ delete a[PYTHON_PARAMS];
58
+ const parsed = pythonToJson(raw);
59
+ if (parsed !== null && typeof parsed === "object")
60
+ return redactParams(parsed, keys);
61
+ return keys.some((k) => raw.toLowerCase().includes(k)) ? REDACTED : raw;
62
+ }
63
+ /** SQL parameters from the OTel agents (`db.query.parameter.<key>`, Python's `db.statement.parameters`) as `wizelens.db.parameters`. */
64
+ export function foldDbParams(a, keys) {
65
+ const fromAgent = fromKeys(a);
66
+ const python = fromPython(a, keys);
67
+ if (a[DB_PARAMS] !== undefined)
68
+ return;
69
+ if (fromAgent)
70
+ a[DB_PARAMS] = redactParams(fromAgent, keys);
71
+ else if (python !== null)
72
+ a[DB_PARAMS] = python;
73
+ }
74
+ //# sourceMappingURL=db-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-params.js","sourceRoot":"","sources":["../../src/otlp/db-params.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,6 @@ export interface OtlpResourceLogs {
19
19
  logRecords?: OtlpLogRecord[];
20
20
  }[];
21
21
  }
22
- /** Logs that belong to a trace. WizeLens shows logs per trace, so others are skipped. */
22
+ /** Log records: those of a trace go into it; those without one (startup, jobs) into a loose trace per source and 5-minute window. */
23
23
  export declare function writesFromLogs(list: readonly OtlpResourceLogs[], redactKeys: readonly string[]): HubWrite[];
24
24
  //# sourceMappingURL=logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/otlp/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkC,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAqB,MAAM,aAAa,CAAC;AAEzI,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,EAAE,CAAC;CAC3E;AAcD,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,EAAE,CAyB3G"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/otlp/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkC,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAqB,MAAM,aAAa,CAAC;AAEzI,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,EAAE,CAAC;CAC3E;AAcD,qIAAqI;AACrI,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,EAAE,CA2B3G"}
package/dist/otlp/logs.js CHANGED
@@ -1,4 +1,4 @@
1
- import { redactAttributes } from "@wizeworks/lens-core";
1
+ import { looseTraceIdOf, redactAttributes } from "@wizeworks/lens-core";
2
2
  import { attributesOf, hexId, nanosToMs, senderOf, valueOf } from "./values.js";
3
3
  const LEVELS = ["trace", "debug", "info", "warn", "error", "critical"];
4
4
  /** Severity 1-4 is trace, 5-8 debug, ... 21-24 critical. Text wins when the number is missing. */
@@ -13,26 +13,27 @@ function levelOf(r) {
13
13
  return "critical";
14
14
  return LEVELS.find((l) => t.startsWith(l)) ?? "info";
15
15
  }
16
- /** Logs that belong to a trace. WizeLens shows logs per trace, so others are skipped. */
16
+ /** Log records: those of a trace go into it; those without one (startup, jobs) into a loose trace per source and 5-minute window. */
17
17
  export function writesFromLogs(list, redactKeys) {
18
18
  return list.map((rl) => {
19
19
  const sender = senderOf(rl.resource);
20
+ const source = [sender.project, sender.service, sender.environment, sender.host].join("|");
20
21
  const logs = [];
21
22
  for (const sl of rl.scopeLogs ?? []) {
22
23
  for (const r of sl.logRecords ?? []) {
23
- const traceId = hexId(r.traceId, 32);
24
- if (!traceId)
25
- continue;
24
+ const timeMs = nanosToMs(r.timeUnixNano) || nanosToMs(r.observedTimeUnixNano);
25
+ const traced = hexId(r.traceId, 32);
26
+ const traceId = traced || looseTraceIdOf(source, timeMs);
26
27
  const body = valueOf(r.body);
27
28
  logs.push({
28
29
  traceId,
29
30
  log: {
30
- timeMs: nanosToMs(r.timeUnixNano) || nanosToMs(r.observedTimeUnixNano),
31
+ timeMs,
31
32
  level: levelOf(r),
32
33
  category: sl.scope?.name || "otlp",
33
34
  message: body === null ? "" : String(body).slice(0, 10_000),
34
35
  service: sender.service,
35
- spanId: hexId(r.spanId, 16) ?? null,
36
+ spanId: traced ? (hexId(r.spanId, 16) ?? null) : null,
36
37
  attributes: redactAttributes(attributesOf(r.attributes), redactKeys),
37
38
  },
38
39
  });
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/otlp/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAA2D,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAkBzI,MAAM,MAAM,GAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAEnF,kGAAkG;AAClG,SAAS,OAAO,CAAC,CAAgB;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;IAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IACrE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AACvD,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAAiC,EAAE,UAA6B;IAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC;oBACR,OAAO;oBACP,GAAG,EAAE;wBACH,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC;wBACtE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;wBACjB,QAAQ,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,MAAM;wBAClC,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;wBAC3D,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;wBACnC,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;qBACrE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAe,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/otlp/logs.ts"],"names":[],"mappings":"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"}