@dx-do/cli 5.2.48 → 5.2.50

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 (185) hide show
  1. package/README.md +24 -6
  2. package/dist-node/01-discover-vertices.tas-pwngv2fz.md +31 -0
  3. package/dist-node/01-discover-vertices.tas.data-store-svjfrm1f.json5 +29 -0
  4. package/dist-node/01-discover-vertices.tas.data-store-tmd-w650nfzt.json +4 -0
  5. package/dist-node/02-discover-services.tas-867m0m88.md +30 -0
  6. package/dist-node/02-discover-services.tas.data-store-jz0gx5vn.json5 +40 -0
  7. package/dist-node/02-discover-services.tas.data-store-tmd-eq264m6y.json +4 -0
  8. package/dist-node/03-discover-sources.nassql-4tgp9jvv.md +34 -0
  9. package/dist-node/03-discover-sources.nassql.data-store-by6sqk23.json5 +63 -0
  10. package/dist-node/03-discover-sources.nassql.data-store-tmd-n3gy57wm.json +4 -0
  11. package/dist-node/04-discover-metadata-columns.nassql-vhzb0mrq.md +26 -0
  12. package/dist-node/04-discover-metadata-columns.nassql.data-store-c9zr7p0q.json5 +35 -0
  13. package/dist-node/04-discover-metadata-columns.nassql.data-store-tmd-4ygrjvty.json +4 -0
  14. package/dist-node/10-filter-attribute-matches.tas-tafqmtw1.md +33 -0
  15. package/dist-node/10-filter-attribute-matches.tas.data-store-tmd-m2sendv0.json +4 -0
  16. package/dist-node/10-filter-attribute-matches.tas.data-store-whdc6vbc.json5 +35 -0
  17. package/dist-node/11-filter-and-compose.tas-m8856738.md +29 -0
  18. package/dist-node/11-filter-and-compose.tas.data-store-dh5meyk8.json5 +56 -0
  19. package/dist-node/11-filter-and-compose.tas.data-store-tmd-mfn8a16f.json +4 -0
  20. package/dist-node/12-filter-or-not.tas-21zab96s.md +35 -0
  21. package/dist-node/12-filter-or-not.tas.data-store-7vjr4fnd.json5 +83 -0
  22. package/dist-node/12-filter-or-not.tas.data-store-tmd-am9smwe5.json +4 -0
  23. package/dist-node/13-filter-layer.tas-r1ff5anv.md +29 -0
  24. package/dist-node/13-filter-layer.tas.data-store-5mneyz77.json5 +30 -0
  25. package/dist-node/13-filter-layer.tas.data-store-tmd-9qmhyfzr.json +4 -0
  26. package/dist-node/14-filter-traverse.tas-da9jene0.md +38 -0
  27. package/dist-node/14-filter-traverse.tas.data-store-p0vxtfvj.json5 +63 -0
  28. package/dist-node/14-filter-traverse.tas.data-store-tmd-5hepg5wf.json +4 -0
  29. package/dist-node/15-filter-take-vertices-edges.tas-m160qc7z.md +35 -0
  30. package/dist-node/15-filter-take-vertices-edges.tas.data-store-drmcme43.json5 +46 -0
  31. package/dist-node/15-filter-take-vertices-edges.tas.data-store-tmd-8fewsp5s.json +4 -0
  32. package/dist-node/16-filter-projection.tas-dh39mcx8.md +31 -0
  33. package/dist-node/16-filter-projection.tas.data-store-tmd-3r8anggx.json +4 -0
  34. package/dist-node/16-filter-projection.tas.data-store-xjbdry1x.json5 +36 -0
  35. package/dist-node/17-filter-lucene.tas-gyvtzwaa.md +29 -0
  36. package/dist-node/17-filter-lucene.tas.data-store-1knw6srt.json5 +39 -0
  37. package/dist-node/17-filter-lucene.tas.data-store-tmd-5cf3tygg.json +5 -0
  38. package/dist-node/18-filter-variable-reuse.tas-89fq0y6x.md +46 -0
  39. package/dist-node/18-filter-variable-reuse.tas.data-store-by35113t.json5 +55 -0
  40. package/dist-node/18-filter-variable-reuse.tas.data-store-tmd-ak7aprgk.json +4 -0
  41. package/dist-node/19-filter-order-statefilter.tas-hm3z71qj.md +36 -0
  42. package/dist-node/19-filter-order-statefilter.tas.data-store-ra9hj1rz.json5 +51 -0
  43. package/dist-node/19-filter-order-statefilter.tas.data-store-tmd-wqer9xy2.json +4 -0
  44. package/dist-node/20-nassql-from-metadata-basic.nassql-szr2xax1.md +28 -0
  45. package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-tmd-c7drxs1m.json +4 -0
  46. package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-zdf1gp1v.json5 +42 -0
  47. package/dist-node/21-nassql-from-metadata-regex.nassql-78jnsn3e.md +30 -0
  48. package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-ckzsv7h1.json5 +53 -0
  49. package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-tmd-zgr6r9my.json +4 -0
  50. package/dist-node/22-nassql-from-topology.nassql-a71qw9r0.md +42 -0
  51. package/dist-node/22-nassql-from-topology.nassql.data-store-81m23nge.json5 +58 -0
  52. package/dist-node/22-nassql-from-topology.nassql.data-store-tmd-vhpjy6c7.json +4 -0
  53. package/dist-node/23-nassql-join-topology-metadata.nassql-hywxhcg2.md +35 -0
  54. package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-da7q90n2.json5 +76 -0
  55. package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-tmd-rr8wt9qa.json +4 -0
  56. package/dist-node/24-nassql-from-data-window-mean.nassql-q6qsgdxw.md +33 -0
  57. package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-j7xmg7fc.json5 +81 -0
  58. package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-tmd-qgzz2f7v.json +4 -0
  59. package/dist-node/25-nassql-group-order-top.nassql-awgnwn3r.md +30 -0
  60. package/dist-node/25-nassql-group-order-top.nassql.data-store-cmrn300b.json5 +48 -0
  61. package/dist-node/25-nassql-group-order-top.nassql.data-store-tmd-7xpqeh7c.json +4 -0
  62. package/dist-node/26-nassql-filter-predicate.nassql-2t27h5ev.md +41 -0
  63. package/dist-node/26-nassql-filter-predicate.nassql.data-store-k2rgp609.json5 +59 -0
  64. package/dist-node/26-nassql-filter-predicate.nassql.data-store-tmd-m4dddgwm.json +4 -0
  65. package/dist-node/27-nassql-distinct-keep.nassql-6z55dvk3.md +24 -0
  66. package/dist-node/27-nassql-distinct-keep.nassql.data-store-mrx00ys5.json5 +52 -0
  67. package/dist-node/27-nassql-distinct-keep.nassql.data-store-tmd-0p9hy42g.json +4 -0
  68. package/dist-node/28-nassql-format-time.nassql-6wraqgdk.md +30 -0
  69. package/dist-node/28-nassql-format-time.nassql.data-store-tmd-bbbqhz1x.json +4 -0
  70. package/dist-node/28-nassql-format-time.nassql.data-store-tvy8y2cs.json5 +59 -0
  71. package/dist-node/29-nassql-describe-log.nassql-t9vnxeb0.md +31 -0
  72. package/dist-node/29-nassql-describe-log.nassql.data-store-tmd-q4mtczy8.json +4 -0
  73. package/dist-node/29-nassql-describe-log.nassql.data-store-x16y4crx.json5 +51 -0
  74. package/dist-node/30-nassql-map-string.nassql-f2tdknzs.md +30 -0
  75. package/dist-node/30-nassql-map-string.nassql.data-store-t8ahcabn.json5 +53 -0
  76. package/dist-node/30-nassql-map-string.nassql.data-store-tmd-a6xq0bdx.json +4 -0
  77. package/dist-node/31-nassql-join-data-sum.nassql-p16y3xk6.md +26 -0
  78. package/dist-node/31-nassql-join-data-sum.nassql.data-store-dje7wm6v.json5 +64 -0
  79. package/dist-node/31-nassql-join-data-sum.nassql.data-store-tmd-c1pyx1qw.json +4 -0
  80. package/dist-node/32-nassql-bottom-aggregation.nassql-hpgfn77p.md +26 -0
  81. package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-tmd-p0ssj1vc.json +4 -0
  82. package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-v9580caa.json5 +43 -0
  83. package/dist-node/33-nassql-cross-domain-pipeline.nassql-fm0ynphf.md +45 -0
  84. package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-tmd-18881drs.json +4 -0
  85. package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-vqs9hkx4.json5 +79 -0
  86. package/dist-node/3rdpartylicenses-hx59bakt.txt +885 -0
  87. package/dist-node/50-discover-custom-layers.tas-2hvvpkzw.md +66 -0
  88. package/dist-node/50-discover-custom-layers.tas.data-store-h85zgna9.json5 +36 -0
  89. package/dist-node/50-discover-custom-layers.tas.data-store-tmd-hagn9eak.json +4 -0
  90. package/dist-node/51-collect-counts-everything.tas-nz0ksgdc.md +46 -0
  91. package/dist-node/51-collect-counts-everything.tas.data-store-eypcjah8.json5 +48 -0
  92. package/dist-node/51-collect-counts-everything.tas.data-store-tmd-4pcj94s9.json +4 -0
  93. package/dist-node/52-collect-counts-bulk.tas-eerw4z8s.md +54 -0
  94. package/dist-node/52-collect-counts-bulk.tas.data-store-scedtw1m.json5 +65 -0
  95. package/dist-node/52-collect-counts-bulk.tas.data-store-tmd-csyzj189.json +4 -0
  96. package/dist-node/53-collect-attributes-by-type.tas-cw0285hx.md +71 -0
  97. package/dist-node/53-collect-attributes-by-type.tas.data-store-fvjge4yr.json5 +65 -0
  98. package/dist-node/53-collect-attributes-by-type.tas.data-store-tmd-274qrd8f.json +4 -0
  99. package/dist-node/README-ghxecaz0.md +84 -0
  100. package/dist-node/SKILL-1xn7r9nt.md +104 -0
  101. package/dist-node/agent-25q752kd.md +55 -0
  102. package/dist-node/agent_connection_and_status-0dq7zkpc.md +62 -0
  103. package/dist-node/agent_source_collector-6s06n3rs.md +40 -0
  104. package/dist-node/agentic-mcp-rycd2gh8.md +140 -0
  105. package/dist-node/application-dfva8tz0.md +48 -0
  106. package/dist-node/application-m0q2vaxj.md +74 -0
  107. package/dist-node/attribute_resource_metric_name-pxrceab5.md +56 -0
  108. package/dist-node/browseragent-snippet.template-9megjp8a.html +12 -0
  109. package/dist-node/bulkvertexpatch-1a4qy5vb.md +78 -0
  110. package/dist-node/bundle.pbd-38r15kyd.template +13 -0
  111. package/dist-node/bundle.profile-1wpzpt3d.template +2 -0
  112. package/dist-node/business_transaction-mbqz5ex9.md +61 -0
  113. package/dist-node/chunk-4I3HBO6U-2ebgf7kh.js +127 -0
  114. package/dist-node/chunk-4PMCLJMS-0mqvr4m4.js +1 -0
  115. package/dist-node/chunk-5VSFINOX-ewzpx7wh.js +5 -0
  116. package/dist-node/chunk-72HYG3XZ-kf7hy4vs.js +3625 -0
  117. package/dist-node/chunk-JRM4BLOM-rg32z8w4.js +1 -0
  118. package/dist-node/chunk-Q2JA73UH-akkb8bh3.js +14 -0
  119. package/dist-node/chunk-RNMHSXZF-pdwasrg7.js +1358 -0
  120. package/dist-node/chunk-VV2FJEMA-3rvtkmga.js +321 -0
  121. package/dist-node/chunk-YVD3UK5I-9pxr1jka.js +695 -0
  122. package/dist-node/configuration-1vczsdex.md +104 -0
  123. package/dist-node/dashboards-x0xddksy.md +17 -0
  124. package/dist-node/database_or_inferred-8vqf5gyr.md +75 -0
  125. package/dist-node/default-licensing-config-0p879qpb.template +122 -0
  126. package/dist-node/dependency-3b0neg5x.md +40 -0
  127. package/dist-node/description.md-qwc2bj9r.template +30 -0
  128. package/dist-node/discovery-flow-fw79kbx4.md +116 -0
  129. package/dist-node/dxi_service-13prnpd5.md +59 -0
  130. package/dist-node/entity-relationships-cevz61kj.md +142 -0
  131. package/dist-node/gotchas-8ab64kcd.md +389 -0
  132. package/dist-node/host-es6fxtgx.md +46 -0
  133. package/dist-node/host-j3qqrm5f.md +55 -0
  134. package/dist-node/index-104hyb1m.html +13 -0
  135. package/dist-node/index-7fp2dfas.json +178 -0
  136. package/dist-node/index-g3hh5wez.json +403 -0
  137. package/dist-node/index-mbzg9rhc.json +270 -0
  138. package/dist-node/index-qffdhwgm.json +2479 -0
  139. package/dist-node/inferred-w998vfq1.md +41 -0
  140. package/dist-node/installInstructions.md-k9ghf3dr.template +21 -0
  141. package/dist-node/inventorize-xc9h9bjr.md +34 -0
  142. package/dist-node/investigation-planning-6kcm01h9.md +149 -0
  143. package/dist-node/investigator-flow-jc2s0n46.md +186 -0
  144. package/dist-node/k8s_deployment_and_namespace-69c29152.md +88 -0
  145. package/dist-node/k8s_pod_and_container-9h4v6cmj.md +64 -0
  146. package/dist-node/main-SGLYO5YX-ht69eb0y.js +13 -0
  147. package/dist-node/main.js +397415 -0
  148. package/dist-node/marketplace-srdmzxkj.json +15 -0
  149. package/dist-node/metric-source-names-6cbczyks.md +75 -0
  150. package/dist-node/metrics-grounding-2h4kkbe3.md +130 -0
  151. package/dist-node/mm-cookbook-23jpw721.md +231 -0
  152. package/dist-node/mm-quickstart-x2adfc16.md +106 -0
  153. package/dist-node/nassql-cookbook-n8kc0mff.md +812 -0
  154. package/dist-node/nassql-quickstart-090e0yex.md +149 -0
  155. package/dist-node/plugin-c3bavxvf.json +18 -0
  156. package/dist-node/polyfills-A7ZF72EO-mp884a0b.js +2 -0
  157. package/dist-node/prerendered-routes-523d8gat.json +3 -0
  158. package/dist-node/primeicons-4GST5W3O-jac3wxrf.woff2 +0 -0
  159. package/dist-node/primeicons-DHQU4SEP-760n99pp.svg +345 -0
  160. package/dist-node/primeicons-GEFHGEHP-rc4kaa3b.ttf +0 -0
  161. package/dist-node/primeicons-P53SE5CV-4saz3d5j.woff +0 -0
  162. package/dist-node/primeicons-RSSEDYLY-4d4vbd67.eot +0 -0
  163. package/dist-node/query-vs-analysis-separation-sag1ezcq.md +97 -0
  164. package/dist-node/run-query-vs-run-partial-6138pc94.md +80 -0
  165. package/dist-node/service-5pz5nhzf.md +133 -0
  166. package/dist-node/service-hierarchies-87a4ynpj.md +178 -0
  167. package/dist-node/service-k4f5mkbq.md +51 -0
  168. package/dist-node/servlet_or_frontend-1kjcb7ar.md +76 -0
  169. package/dist-node/src-apm-mfnsq6vw.svg +4 -0
  170. package/dist-node/src-axa-nn28yqmj.svg +4 -0
  171. package/dist-node/src-dxim-fv7ne4qa.svg +4 -0
  172. package/dist-node/styles-23VUPSCU-9ehggc1f.css +1 -0
  173. package/dist-node/tas-cookbook-0y4826rp.md +693 -0
  174. package/dist-node/tas-quickstart-wgcvwffc.md +138 -0
  175. package/dist-node/time-format-0595g01j.md +41 -0
  176. package/dist-node/toggles.pbd-9wscbmng.template +2 -0
  177. package/dist-node/type-host-agbhmn6v.svg +6 -0
  178. package/dist-node/type-metric-p9b90bpx.svg +4 -0
  179. package/dist-node/type-service-k7f1x71k.svg +4 -0
  180. package/dist-node/ui-0b5grqrg.md +113 -0
  181. package/dist-node/universe-b9nhf325.md +47 -0
  182. package/dist-node/universe-fzpwzvxr.md +91 -0
  183. package/dist-node/universes-and-scopes-1cb9pfk7.md +105 -0
  184. package/dist-node/vertex_entity_node-mm3yp9d0.md +31 -0
  185. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ # 27-nassql-distinct-keep (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate `FROM_TOPOLOGY` for listing Kubernetes namespace names from the topology.
6
+
7
+ ## Query Construction
8
+
9
+ Simple two-step pipeline:
10
+ 1. **FROM_TOPOLOGY**: Load `k8s_NAMESPACE` vertices using an ATTRIBUTE filter
11
+ 2. **KEEP**: Select only the name and type columns
12
+
13
+ ## API Surface Exercised
14
+
15
+ - **FROM_TOPOLOGY**: With ATTRIBUTE filter targeting k8s_NAMESPACE type
16
+ - **KEEP**: Column projection
17
+
18
+ ## Expected Output
19
+
20
+ Up to 50 rows, each a Kubernetes namespace with name and type. Typical results include the standard Kubernetes namespaces (`kube-system`, `ingress-nginx`, `tigera-operator`, …) alongside whatever application namespaces the cluster is running (e.g. `tixchange-v1`, `tixchange-v2`, `monitoring-system`).
21
+
22
+ ## What the Results Tell You
23
+
24
+ `FROM_TOPOLOGY` can target any TAS vertex type. Combined with `KEEP`, it provides a simple way to extract specific topology information into a tabular format. This is useful for building dropdowns or filters in a UI — e.g., "select a Kubernetes namespace" populated from live topology data.
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Distinct-name extraction from FROM_TOPOLOGY — load entities,
3
+ * project to (name, type), let the natural row-per-vertex shape
4
+ * give you the distinct list. KEEP-only after a source op.
5
+ *
6
+ * Use this shape for "what X exist on this tenant" questions
7
+ * where you just want the names (e.g. "list namespaces", "list
8
+ * services"). Cheaper than a full TAS query if you only need
9
+ * a few projected columns.
10
+ *
11
+ * NOTE: there is no NASSQL `DISTINCT` op today — distinct-ness
12
+ * comes from the underlying topology (one vertex per entity).
13
+ * If the same name appears on multiple vertices (rare but
14
+ * possible), they appear as separate rows. For true
15
+ * de-duplication, GROUP by the column.
16
+ */
17
+ {
18
+ "query": [
19
+ /*
20
+ * Standard FROM_TOPOLOGY → narrow to k8s_NAMESPACE vertices.
21
+ * The same shape works for any vertex type that has a
22
+ * `name` attribute and you want distinct values.
23
+ */
24
+ {
25
+ "op": "FROM_TOPOLOGY",
26
+ "querySpecifier": {
27
+ "filter": {
28
+ "op": "ATTRIBUTE",
29
+ "expressions": [
30
+ {
31
+ "name": "type",
32
+ "values": ["k8s_NAMESPACE"],
33
+ "operator": "IN"
34
+ }
35
+ ]
36
+ }
37
+ },
38
+ "alias": "namespaces"
39
+ },
40
+ /*
41
+ * Project to just (name, type). Using `vertex.attr.name`
42
+ * (NOT `name` directly — name is a NASSQL keyword in some
43
+ * contexts and FROM_TOPOLOGY uses the `vertex.attr.<n>`
44
+ * column-name convention).
45
+ */
46
+ {
47
+ "op": "KEEP",
48
+ "columns": ["vertex.attr.name", "vertex.attr.type"]
49
+ }
50
+ ],
51
+ "limit": 50
52
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "FROM_TOPOLOGY + KEEP: list Kubernetes namespace names from topology",
3
+ "tags": ["nassql", "from_topology", "keep", "distinct"]
4
+ }
@@ -0,0 +1,30 @@
1
+ # 28-nassql-format-time (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate the `FORMAT_TIME` operation, which converts epoch timestamps into human-readable date/time strings.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline:
10
+ 1. **FROM_TOPOLOGY**: Load AGENT vertices
11
+ 2. **FORMAT_TIME**: Convert `vertex.endTime` (epoch millis) to a formatted string
12
+ - `column`: Input column containing the timestamp
13
+ - `as`: Output column name
14
+ - `pattern`: Java SimpleDateFormat pattern
15
+ 3. **KEEP**: Select name, type, and formatted timestamp
16
+
17
+ ## API Surface Exercised
18
+
19
+ - **FORMAT_TIME**: Time formatting with `column`, `as`, `pattern`
20
+ - Also supports: `duration: true` (format as duration), `timezone` (timezone name)
21
+
22
+ ## Expected Output
23
+
24
+ Rows showing each agent name, type, and a human-readable "last seen" timestamp like `"2025-04-30 14:23:45"`.
25
+
26
+ ## What the Results Tell You
27
+
28
+ `FORMAT_TIME` is essential for dashboard displays where raw epoch milliseconds are not meaningful. The `pattern` follows Java SimpleDateFormat conventions (e.g., `yyyy-MM-dd HH:mm:ss`, `dd/MM/yyyy`, etc.).
29
+
30
+ The `vertex.endTime` column from `FROM_TOPOLOGY` indicates when a vertex was last updated in the topology, which for agents typically corresponds to their last heartbeat or data report.
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "FORMAT_TIME: format vertex endTime timestamps into human-readable strings",
3
+ "tags": ["nassql", "format_time", "formatting"]
4
+ }
@@ -0,0 +1,59 @@
1
+ /*
2
+ * `FORMAT_TIME` — convert an epoch-ms column into a human-readable
3
+ * timestamp string. Use to make timestamp columns readable in
4
+ * downstream output (`vertex.endTime`, `vertex.startTime`,
5
+ * `data.timestamp`, `time.bucket`, etc).
6
+ *
7
+ * Pattern uses Java SimpleDateFormat syntax:
8
+ * yyyy-MM-dd HH:mm:ss → 2026-05-04 14:23:01
9
+ * yyyy-MM-dd'T'HH:mm:ss → ISO-ish
10
+ * HH:mm → just hour:minute
11
+ *
12
+ * The original epoch-ms column stays in the row; the formatted
13
+ * value lands in the `as` column. Use KEEP to drop the original
14
+ * if you want only the formatted form.
15
+ */
16
+ {
17
+ "query": [
18
+ {
19
+ "op": "FROM_TOPOLOGY",
20
+ "querySpecifier": {
21
+ "filter": {
22
+ "op": "ATTRIBUTE",
23
+ "expressions": [
24
+ {
25
+ "name": "type",
26
+ "values": ["AGENT"],
27
+ "operator": "IN"
28
+ }
29
+ ]
30
+ }
31
+ },
32
+ "alias": "agents"
33
+ },
34
+ /*
35
+ * FORMAT_TIME projects an epoch-ms column to a string.
36
+ * `column` is the source (must be numeric, ms since epoch);
37
+ * `as` is the new column name; `pattern` is Java
38
+ * SimpleDateFormat syntax.
39
+ *
40
+ * Common patterns:
41
+ * "yyyy-MM-dd HH:mm:ss" full timestamp
42
+ * "yyyy-MM-dd" date only
43
+ * "EEE MMM d HH:mm" Mon May 4 14:23
44
+ *
45
+ * Timezone defaults to UTC; pattern with `Z` includes offset.
46
+ */
47
+ {
48
+ "op": "FORMAT_TIME",
49
+ "column": "vertex.endTime",
50
+ "as": "last_seen",
51
+ "pattern": "yyyy-MM-dd HH:mm:ss"
52
+ },
53
+ {
54
+ "op": "KEEP",
55
+ "columns": ["vertex.attr.name", "vertex.attr.type", "last_seen"]
56
+ }
57
+ ],
58
+ "limit": 20
59
+ }
@@ -0,0 +1,31 @@
1
+ # 29-nassql-describe-log (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate `DESCRIBE` as a debugging tool to inspect the column schema at any point in the pipeline.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline:
10
+ 1. **FROM_TOPOLOGY**: Load HOST vertices
11
+ 2. **JOIN_METADATA**: Join with all metric metadata
12
+ 3. **DESCRIBE**: Output the column names available at this point
13
+
14
+ `DESCRIBE` produces a single header row listing all available column names, with no data rows.
15
+
16
+ ## API Surface Exercised
17
+
18
+ - **DESCRIBE**: Debug/introspection operation
19
+ - **FROM_TOPOLOGY + JOIN_METADATA**: Cross-domain join whose column output we want to inspect
20
+
21
+ ## Expected Output
22
+
23
+ A single row listing all available columns after the topology+metadata join. Typically includes:
24
+ - `vertex.id`, `vertex.externalId`, `vertex.attr.*` — from topology
25
+ - `metric.source`, `metric.path`, `metric.id` — from metadata join
26
+
27
+ ## What the Results Tell You
28
+
29
+ `DESCRIBE` is invaluable when building complex pipelines. It shows what columns are available for subsequent `GROUP`, `FILTER`, `KEEP`, and aggregation operations. Use it when you get "Unknown required column" errors — insert `DESCRIBE` before the failing operation to see what's actually available.
30
+
31
+ The companion debug operation `LOG` can be inserted mid-pipeline to output intermediate results to the server log without affecting the pipeline output.
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "DESCRIBE: inspect column schema after FROM_TOPOLOGY + JOIN_METADATA to see all available fields",
3
+ "tags": ["nassql", "describe", "debug"]
4
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ * `DESCRIBE` after a JOIN — introspect the post-join column shape.
3
+ * Same DESCRIBE op as #04, but here applied AFTER FROM_TOPOLOGY +
4
+ * JOIN_METADATA so it reveals the COMBINED column set (vertex.attr.*
5
+ * + metric.* + any other fields the join adds).
6
+ *
7
+ * Use when you've composed a multi-source pipeline and need to
8
+ * confirm exactly which columns are available for the next op
9
+ * (KEEP, GROUP, FILTER, etc). Cheaper than running the full
10
+ * pipeline and inspecting the data rows.
11
+ */
12
+ {
13
+ "query": [
14
+ {
15
+ "op": "FROM_TOPOLOGY",
16
+ "querySpecifier": {
17
+ "filter": {
18
+ "op": "ATTRIBUTE",
19
+ "expressions": [
20
+ {
21
+ "name": "type",
22
+ "values": ["HOST"],
23
+ "operator": "IN"
24
+ }
25
+ ]
26
+ }
27
+ },
28
+ "alias": "hosts"
29
+ },
30
+ /*
31
+ * JOIN_METADATA — adds metric.* columns to each topology row.
32
+ * The join is implicit (DataStore knows the entity-to-metric
33
+ * mapping); aliases let you reference column collisions.
34
+ */
35
+ {
36
+ "op": "JOIN_METADATA",
37
+ "querySpecifier": { "op": "ALL" },
38
+ "alias": "host_metrics"
39
+ },
40
+ /*
41
+ * DESCRIBE shows the column shape after the joins. Columns
42
+ * include both `vertex.attr.<n>` (from FROM_TOPOLOGY) AND
43
+ * `metric.<n>` (from JOIN_METADATA). Useful for "what can I
44
+ * KEEP / GROUP / FILTER on after this join?" questions.
45
+ */
46
+ {
47
+ "op": "DESCRIBE"
48
+ }
49
+ ],
50
+ "limit": 100
51
+ }
@@ -0,0 +1,30 @@
1
+ # 30-nassql-map-string (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate the `MAP_STRING` operation, which applies regex-based string extraction/transformation to column values.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline:
10
+ 1. **FROM_TOPOLOGY**: Load k8s_POD vertices
11
+ 2. **MAP_STRING**: Extract from `vertex.attr.name` using regex pattern `(.*)`, outputting to `pod_label`
12
+ - `column`: Input column
13
+ - `pattern`: Java regex with capture groups
14
+ - `as`: Array of output column names (one per capture group)
15
+ 3. **KEEP**: Select the mapped column and vertex type
16
+
17
+ ## API Surface Exercised
18
+
19
+ - **MAP_STRING**: Regex-based string transformation with `column`, `pattern`, `as[]`
20
+ - Also supports: `asType` (type coercion), `fillValues` (defaults), `filterNotMatching` (exclude non-matching rows)
21
+
22
+ ## Expected Output
23
+
24
+ 20 rows showing pod names (unchanged since the pattern captures everything) and their vertex type.
25
+
26
+ ## What the Results Tell You
27
+
28
+ `MAP_STRING` is useful for extracting structured components from string fields. For example, with a source name like `SuperDomain|host|process|agent`, you could use pattern `.*\\|(.*)\\|(.*)\\|(.*)` with `as: ["host", "process", "agent"]` to split it into individual columns.
29
+
30
+ The `as` field is an array because each capture group in the regex maps to a separate output column.
@@ -0,0 +1,53 @@
1
+ /*
2
+ * `MAP_STRING` — regex-extract groups from a string column into
3
+ * one or more new columns. Powerful for parsing structured names
4
+ * (e.g. `app|env|version` patterns common in agent / pod naming
5
+ * conventions).
6
+ *
7
+ * Pattern is Java regex with capture groups. `as` is an array of
8
+ * names — one per capture group. The pattern shown here `(.*)`
9
+ * captures the whole string (a no-op trick to copy a column);
10
+ * realistic patterns split a name into parts.
11
+ *
12
+ * Example splitting an agent name like "EMEA|prod-01|infra-agent":
13
+ * pattern: "([^|]+)\\|([^|]+)\\|([^|]+)"
14
+ * as: ["region", "host", "agent_type"]
15
+ */
16
+ {
17
+ "query": [
18
+ {
19
+ "op": "FROM_TOPOLOGY",
20
+ "querySpecifier": {
21
+ "filter": {
22
+ "op": "ATTRIBUTE",
23
+ "expressions": [
24
+ {
25
+ "name": "type",
26
+ "values": ["k8s_POD"],
27
+ "operator": "IN"
28
+ }
29
+ ]
30
+ }
31
+ },
32
+ "alias": "pods"
33
+ },
34
+ /*
35
+ * MAP_STRING runs `pattern` against `column`'s value per row;
36
+ * each capture group lands in the corresponding `as` column.
37
+ * Rows whose value doesn't match the pattern get null in the
38
+ * `as` columns (don't get dropped — use FILTER + REGEX for
39
+ * row-level pattern filtering).
40
+ */
41
+ {
42
+ "op": "MAP_STRING",
43
+ "column": "vertex.attr.name",
44
+ "pattern": "(.*)",
45
+ "as": ["pod_label"]
46
+ },
47
+ {
48
+ "op": "KEEP",
49
+ "columns": ["pod_label", "vertex.attr.type"]
50
+ }
51
+ ],
52
+ "limit": 20
53
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "MAP_STRING: format pod names into labeled strings using printf-style format",
3
+ "tags": ["nassql", "map_string", "formatting"]
4
+ }
@@ -0,0 +1,26 @@
1
+ # 31-nassql-join-data-sum (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate `JOIN_METADATA` with a `SPEC` + `REGEX` specifier to join topology vertices with a filtered subset of metrics.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline:
10
+ 1. **FROM_TOPOLOGY**: Load AGENT vertices
11
+ 2. **JOIN_METADATA**: Join with metrics matching `.*Responses Per Interval.*` pattern (via SPEC + attributeNameSpecifier REGEX)
12
+ 3. **GROUP + COUNT**: Count matching metrics per agent
13
+ 4. **ORDER + KEEP**: Sort and select
14
+
15
+ ## API Surface Exercised
16
+
17
+ - **JOIN_METADATA**: With a filtered `querySpecifier` (not just ALL)
18
+ - **SPEC + REGEX in JOIN_METADATA**: Same specifier structure as in FROM_METADATA
19
+
20
+ ## Expected Output
21
+
22
+ Rows showing agents that have "Responses Per Interval" metrics. May return 0 rows if no agents on this tenant have that specific metric path.
23
+
24
+ ## What the Results Tell You
25
+
26
+ `JOIN_METADATA` accepts the same `querySpecifier` types as `FROM_METADATA`. By providing a SPEC with REGEX filters, you can narrow the join to only relevant metrics. This is more efficient than joining with ALL and filtering afterward, as the metadata lookup is constrained server-side.
@@ -0,0 +1,64 @@
1
+ /*
2
+ * Cross-domain pipeline targeting a SPECIFIC metric pattern —
3
+ * agents with their "Responses Per Interval" metrics, ranked by
4
+ * how many such metrics each publishes. Demonstrates JOIN_METADATA
5
+ * with a SPEC narrowing (vs the ALL of #23).
6
+ *
7
+ * Pattern: agents (FROM_TOPOLOGY) × narrowed metrics
8
+ * (JOIN_METADATA + REGEX) → group → count → order. Use this shape
9
+ * when you want "entities × specific metric category" coverage.
10
+ */
11
+ {
12
+ "query": [
13
+ {
14
+ "op": "FROM_TOPOLOGY",
15
+ "querySpecifier": {
16
+ "filter": {
17
+ "op": "ATTRIBUTE",
18
+ "expressions": [
19
+ {
20
+ "name": "type",
21
+ "values": ["AGENT"],
22
+ "operator": "IN"
23
+ }
24
+ ]
25
+ }
26
+ },
27
+ "alias": "agents"
28
+ },
29
+ /*
30
+ * JOIN_METADATA with a SPEC narrowing — join only metrics
31
+ * matching the regex (here "Responses Per Interval"-shaped
32
+ * names). Server-side narrowing is far cheaper than joining
33
+ * ALL metrics then FILTERing downstream.
34
+ */
35
+ {
36
+ "op": "JOIN_METADATA",
37
+ "querySpecifier": {
38
+ "op": "SPEC",
39
+ "attributeNameSpecifier": {
40
+ "op": "REGEX",
41
+ "pattern": ".*Responses Per Interval.*"
42
+ }
43
+ },
44
+ "alias": "response_metrics"
45
+ },
46
+ {
47
+ "op": "GROUP",
48
+ "columns": ["vertex.attr.name"]
49
+ },
50
+ {
51
+ "op": "COUNT",
52
+ "as": "response_metric_count"
53
+ },
54
+ {
55
+ "op": "ORDER",
56
+ "columns": [{ "column": "response_metric_count", "sortDescending": true }]
57
+ },
58
+ {
59
+ "op": "KEEP",
60
+ "columns": ["vertex.attr.name", "response_metric_count"]
61
+ }
62
+ ],
63
+ "limit": 20
64
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "FROM_TOPOLOGY + JOIN_METADATA (REGEX): find agents with 'Responses Per Interval' metrics, count per agent",
3
+ "tags": ["nassql", "from_topology", "join_metadata", "regex", "group"]
4
+ }
@@ -0,0 +1,26 @@
1
+ # 32-nassql-bottom-aggregation (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate the `BOTTOM` shaping operation — the inverse of `TOP` — to find the lowest-ranked rows.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline: FROM_METADATA → GROUP → COUNT → BOTTOM → KEEP
10
+
11
+ `BOTTOM` takes:
12
+ - `column`: Column to rank by
13
+ - `n`: How many lowest-value rows to return
14
+
15
+ ## API Surface Exercised
16
+
17
+ - **BOTTOM**: Selects the bottom N rows (lowest values)
18
+ - Counterpart to `TOP` (query 25)
19
+
20
+ ## Expected Output
21
+
22
+ 10 rows: the 10 metric sources with the fewest metrics. Rarely-reporting sources can have as few as 1–10 metrics — exact counts vary by tenant configuration.
23
+
24
+ ## What the Results Tell You
25
+
26
+ `BOTTOM` is useful for finding outliers on the low end — agents reporting very few metrics might indicate misconfiguration, partial monitoring, or agents that are shutting down. Combined with `TOP`, you can quickly identify both the busiest and quietest parts of your monitoring infrastructure.
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "BOTTOM: find the 10 metric sources with the fewest metrics (least active agents)",
3
+ "tags": ["nassql", "bottom", "group", "count", "shaping"]
4
+ }
@@ -0,0 +1,43 @@
1
+ /*
2
+ * `BOTTOM` — companion of TOP (#25). Same shape, returns the N
3
+ * rows with the LOWEST values in `column`. Use for outlier
4
+ * detection on the low end (e.g. quietest sources, smallest
5
+ * groups, lowest-coverage entities).
6
+ *
7
+ * Same `n` field gotcha as TOP — schema field is `n` not `count`.
8
+ *
9
+ * Investigative use: low-volume metric sources are often
10
+ * misconfigured / shutting-down / partially-monitored agents.
11
+ * Useful as a quality check.
12
+ */
13
+ {
14
+ "query": [
15
+ {
16
+ "op": "FROM_METADATA",
17
+ "querySpecifier": { "op": "ALL" },
18
+ "alias": "all_metadata"
19
+ },
20
+ {
21
+ "op": "GROUP",
22
+ "columns": ["metric.source"]
23
+ },
24
+ {
25
+ "op": "COUNT",
26
+ "as": "metric_count"
27
+ },
28
+ /*
29
+ * BOTTOM keeps the N rows with the LOWEST values in `column`.
30
+ * Same partial-sort efficiency as TOP. Same `n` field shape.
31
+ */
32
+ {
33
+ "op": "BOTTOM",
34
+ "column": "metric_count",
35
+ "n": 10
36
+ },
37
+ {
38
+ "op": "KEEP",
39
+ "columns": ["metric.source", "metric_count"]
40
+ }
41
+ ],
42
+ "limit": 10
43
+ }
@@ -0,0 +1,45 @@
1
+ # 33-nassql-cross-domain-pipeline (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate a complex cross-domain pipeline that embeds a TAS TRAVERSE filter inside FROM_TOPOLOGY, then uses NASSQL aggregation to summarize the topology structure.
6
+
7
+ ## Query Construction
8
+
9
+ The `FROM_TOPOLOGY` querySpecifier contains a full TAS query with a nested TRAVERSE:
10
+
11
+ ```
12
+ FROM_TOPOLOGY
13
+ └── TAS Query:
14
+ filter: TRAVERSE
15
+ └── input: ATTRIBUTE(type IN [k8s_CLUSTER])
16
+ └── traverse: [{ direction: ANY, repeat: 3 }]
17
+ └── includeInput: true
18
+ ```
19
+
20
+ This loads all vertices within 3 hops of the k8s cluster, then the NASSQL pipeline groups and counts by vertex type.
21
+
22
+ ## API Surface Exercised
23
+
24
+ - **FROM_TOPOLOGY** with complex nested TAS filter (TRAVERSE + ATTRIBUTE)
25
+ - **GROUP + COUNT + ORDER**: Standard aggregation
26
+ - **Cross-domain composition**: TAS topology filtering inside NASSQL tabular processing
27
+
28
+ ## Expected Output
29
+
30
+ Rows showing each vertex type and its count within the k8s cluster hierarchy:
31
+
32
+ | vertex.attr.type | entity_count |
33
+ |---|---|
34
+ | k8s_CONTAINER | 21 |
35
+ | k8s_POD | 20 |
36
+ | k8s_NAMESPACE | 13 |
37
+ | AGENT | 7 |
38
+ | HOST | 3 |
39
+ | ... | ... |
40
+
41
+ ## What the Results Tell You
42
+
43
+ This is the power of NASSQL: it combines the graph-traversal capabilities of TAS with the relational aggregation of SQL-like operations. You can explore a topology subgraph (using any TAS filter), then immediately aggregate, filter, and shape the results as tabular data.
44
+
45
+ This pattern is useful for "infrastructure summary" dashboards — e.g., "show me the composition of my Kubernetes cluster by entity type."
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Cross-domain pipeline: FROM_TOPOLOGY with TAS TRAVERSE filter into NASSQL GROUP + COUNT — count entities by type across the k8s cluster hierarchy",
3
+ "tags": ["nassql", "from_topology", "traverse", "group", "count", "cross-domain"]
4
+ }
@@ -0,0 +1,79 @@
1
+ /*
2
+ * The most-composed pattern in this catalog: TAS-TRAVERSE inside
3
+ * NASSQL-FROM_TOPOLOGY's filter. Walks the k8s topology graph
4
+ * (cluster → 3-hop neighborhood) inside TAS, then flattens to
5
+ * NASSQL rows for grouping/counting by vertex type.
6
+ *
7
+ * Result: one row per Kubernetes vertex TYPE that appears in the
8
+ * neighborhood, with how many of each. Tells you the SHAPE of
9
+ * the k8s topology (e.g. "200 pods, 50 deployments, 5 namespaces,
10
+ * 1 cluster"). Useful for "audit my k8s coverage" investigations.
11
+ *
12
+ * The TRAVERSE-inside-FROM_TOPOLOGY pattern works for ANY graph-
13
+ * shaped seed-and-walk you want to flatten into a table — pods,
14
+ * services-and-their-hosts, agents-and-their-monitored-services,
15
+ * etc.
16
+ */
17
+ {
18
+ "query": [
19
+ {
20
+ "op": "FROM_TOPOLOGY",
21
+ "querySpecifier": {
22
+ /*
23
+ * The TAS filter inside FROM_TOPOLOGY can be ANY TAS
24
+ * filter — including TRAVERSE for graph traversal.
25
+ * 3-hop walk from k8s_CLUSTER reaches: namespaces,
26
+ * deployments, pods, containers, daemonsets — the
27
+ * full k8s entity tree.
28
+ *
29
+ * `repeat: 3` is enough for typical k8s topology
30
+ * (cluster→namespace→deployment→pod). Bump to 4-5 if
31
+ * you also want containers / replicasets.
32
+ */
33
+ "filter": {
34
+ "op": "TRAVERSE",
35
+ "input": {
36
+ "op": "ATTRIBUTE",
37
+ "expressions": [
38
+ {
39
+ "name": "type",
40
+ "values": ["k8s_CLUSTER"],
41
+ "operator": "IN"
42
+ }
43
+ ]
44
+ },
45
+ "traverse": [
46
+ {
47
+ "direction": "ANY",
48
+ "repeat": 3
49
+ }
50
+ ],
51
+ "includeInput": true
52
+ }
53
+ },
54
+ "alias": "k8s_entities"
55
+ },
56
+ /*
57
+ * Group by VERTEX TYPE — one row per type, count per type.
58
+ * `vertex.attr.type` is the column name (the FROM_TOPOLOGY
59
+ * convention).
60
+ */
61
+ {
62
+ "op": "GROUP",
63
+ "columns": ["vertex.attr.type"]
64
+ },
65
+ {
66
+ "op": "COUNT",
67
+ "as": "entity_count"
68
+ },
69
+ {
70
+ "op": "ORDER",
71
+ "columns": [{ "column": "entity_count", "sortDescending": true }]
72
+ },
73
+ {
74
+ "op": "KEEP",
75
+ "columns": ["vertex.attr.type", "entity_count"]
76
+ }
77
+ ],
78
+ "limit": 20
79
+ }