@dx-do/cli 5.2.49 → 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
package/README.md CHANGED
@@ -4,10 +4,32 @@
4
4
 
5
5
  ***
6
6
 
7
- ### Usage
7
+ ## Usage
8
8
 
9
9
  :warning: Using npm install for this package is highly discouraged.
10
10
 
11
+ The first time you run, an interactive setup will create <USER_HOME>/.dxdo/default.dxo2.config.json; you can have multiple configurations. the "--config=<config>" has the following resolution:
12
+
13
+
14
+ | variation | resolution |
15
+ |-------------------------------------------|----------------------------------------|
16
+ | No Config Specified | `~/.dxdo/default.dx02.config.json` |
17
+ | `--config=tenant-name` | `~/.dxdo/tenant-name.dx02.config.json` |
18
+ | `--config=tenant-name.dx02.config.json` | `~/.dxdo/tenant-name.dx02.config.json` | |
19
+ | `--config=./tenant-name.dx02.config.json` | `<CWD>/tenant-name.dx02.config.json` |
20
+
21
+ ### Full configuration options are available by running
22
+
23
+ ```dx-do --no-config help configuration```
24
+
25
+ ### via binary
26
+
27
+ 1. Download the binary for your platform
28
+ 2. rename to "dx-do" and add to path
29
+
30
+ ```
31
+ dx-do <--config=<config-file>> command-group command <parameter>=<value>
32
+ ```
11
33
 
12
34
  # via npx
13
35
 
@@ -20,16 +42,12 @@ npx @dx-do/cli@<version> <--config=<config-file>> command-group command <paramet
20
42
  bunx @dx-do/cli@<version> <--config=<config-file>> command-group command <parameter>=<value>
21
43
  ```
22
44
 
23
- # via binary
24
45
 
25
- ```
26
- dx-do <--config=<config-file>> command-group command <parameter>=<value>
27
- ```
28
46
 
29
47
  #### Output
30
48
 
31
49
  ```
32
- ℹ info dx-do v5.2.48 on node v22.21.0 on darwin-arm64 via node (ssl: 3.5.4)
50
+ ℹ info dx-do v5.2.50 on node v24.16.0 on linux-x64 via node (ssl: 3.5.6)
33
51
  ⚠ warning Not loading configuration
34
52
  ✖ error Usage: dx-do --option[=value]... <command-group> <command> <command-param>=<value>...
35
53
  ℹ info Available command-groups: acc, agent, agentic, alarm, alert, apm-universe, asm, attribute, audit, auth, axa, blob, channel, config, dashboard, diagnose, event, experience, graph, help, inventory, jsextension, log, managementmodule, metrex, metric, metricgrouping, nass, o2-alert, o2-managementmodule, o2-metricgrouping, o2-universe, perspective, service, situation, sql, tas, topographer, trace, ui, vertex
@@ -0,0 +1,31 @@
1
+ # 01-discover-vertices (TAS)
2
+
3
+ ## Purpose
4
+
5
+ Fetch a sample of topology vertices with full attribute detail to understand what vertex types exist on the tenant and what attributes they carry.
6
+
7
+ ## Query Construction
8
+
9
+ Uses the simplest possible TAS query: `ALL` filter with `DETAILED` projection and a `limit` of 20. The `DETAILED` projection includes all gathered, custom, and decorated attributes on each vertex.
10
+
11
+ ## API Surface Exercised
12
+
13
+ - **Filter**: `ALL` (the baseline — matches every vertex)
14
+ - **Projection**: `DETAILED` (returns all attributes, not just type/name)
15
+ - **Limit**: Caps result size for discovery
16
+
17
+ ## Expected Output
18
+
19
+ A `TasGraph` with up to 20 vertices, each containing:
20
+ - `id` (numeric internal ID)
21
+ - `externalId` (canonical string identifier)
22
+ - `attributes` map with keys like `type`, `name`, `hostname`, `ACNId`, etc.
23
+ - `startTime` / `endTime` timestamps
24
+
25
+ No edges are returned because the default query only retrieves vertices unless traversal or edge-adding filters are used.
26
+
27
+ ## What the Results Tell You
28
+
29
+ The `type` attribute reveals what kinds of entities are in the topology: `HOST`, `AGENT`, `BUSINESSTRANSACTION`, `k8s_POD`, `INFERRED_DATABASE`, etc. The attribute names on each vertex type tell you what fields are available for filtering (e.g., `hostname`, `agentName`, `applicationName`).
30
+
31
+ Typical vertex types include: HOST, AGENT, AGENT_CONNECTION, BUSINESSTRANSACTION, INFERRED_DATABASE, PRODUCT, DXI_SERVICE, CONNECTOR, ACN_CONFIG, MYSQL_DB, k8s_CLUSTER, k8s_NAMESPACE, k8s_DEPLOYMENT, k8s_DAEMONSET, k8s_POD, k8s_CONTAINER. The exact set varies by tenant — what's installed and reporting is what shows up here.
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Discovery query #1 — sample 20 vertices with FULL attribute detail
3
+ * to learn what's on this tenant. The pattern: cheapest possible
4
+ * filter (`ALL`), tightest sensible cap (`limit: 20`), widest
5
+ * projection (`DETAILED`). Reach for this when you're new to a
6
+ * tenant and need to see what vertex types and attributes exist
7
+ * before authoring anything specific.
8
+ *
9
+ * Pair with `02-discover-services` (filtered to top-level types) to
10
+ * learn the topology shape without burning a 10MB topology dump.
11
+ */
12
+ {
13
+ /*
14
+ * `ALL` is the only zero-cost filter — matches every vertex with
15
+ * no expression evaluation. SAFE here ONLY because `limit: 20`
16
+ * caps the response. WITHOUT `limit`, an `ALL` filter returns
17
+ * the entire topology (often megabytes). Don't author this shape
18
+ * without `limit`.
19
+ */
20
+ "filter": { "op": "ALL" },
21
+ "limit": 20,
22
+ /*
23
+ * `DETAILED` returns all gathered, custom, and decorated
24
+ * attributes per vertex. The alternatives are `BRIEF` (just type
25
+ * + name) and `NO_TYPE`. For discovery you almost always want
26
+ * `DETAILED` — that's the point of running this query.
27
+ */
28
+ "projection": "DETAILED"
29
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Discovery: fetch 20 vertices with full attributes to understand vertex types and attribute shapes",
3
+ "tags": ["discovery", "tas"]
4
+ }
@@ -0,0 +1,30 @@
1
+ # 02-discover-services (TAS)
2
+
3
+ ## Purpose
4
+
5
+ List vertices of the most common topology types to understand what agents, hosts, services, and applications exist on the tenant.
6
+
7
+ ## Query Construction
8
+
9
+ Uses the `ATTRIBUTE` filter with the `IN` operator on the `type` attribute, matching: `AGENT`, `HOST`, `DXI_SERVICE`, `BUSINESSTRANSACTION`, `INFERRED_DATABASE`, `PRODUCT`. Returns up to 100 vertices with full detail.
10
+
11
+ ## API Surface Exercised
12
+
13
+ - **Filter**: `ATTRIBUTE` with `expression.operator = "IN"` — matches vertices where the named attribute's value is in the provided list
14
+ - **Projection**: `DETAILED`
15
+
16
+ ## Expected Output
17
+
18
+ A `TasGraph` with up to 100 vertices matching the requested types. Each has full attributes including `name`, `type`, `hostname`, agent paths, etc.
19
+
20
+ ## What the Results Tell You
21
+
22
+ A typical small tenant might return something like:
23
+ - **3 HOSTs**: VMs / nodes hosting the workload
24
+ - **7 AGENTs**: Kubernetes, Infrastructure, MySQL, Logstash, Prometheus, etc.
25
+ - **11 BUSINESSTRANSACTIONs**: web app endpoints (signon, checkout, cart, …)
26
+ - **2 INFERRED_DATABASEs**: e.g. MySQL backing the same app
27
+ - **1 PRODUCT**: e.g. APM
28
+ - **1 DXI_SERVICE**: e.g. a Custom Metric virtual agent
29
+
30
+ The actual names returned depend entirely on what's installed and reporting on the tenant — use these as inputs to subsequent targeted filter queries.
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Discovery query #2 — list some top-level vertex TYPES on the
3
+ * tenant. Where #1 samples 20 random vertices, this targets the
4
+ * shape: AGENT / HOST / DXI_SERVICE / BUSINESSTRANSACTION /
5
+ * INFERRED_DATABASE / PRODUCT. Reach for this when you need to
6
+ * understand what categories of entities the tenant has + how many
7
+ * of each, before drilling into one.
8
+ *
9
+ * Pair with `01-discover-vertices` (random sample, full attributes)
10
+ * for a complementary view: #1 tells you "what exists in detail",
11
+ * #2 tells you "what TYPES exist in volume".
12
+ */
13
+ {
14
+ /*
15
+ * Single ATTRIBUTE filter — preferred over multiple AND-combined
16
+ * filters when the same attribute is being matched against an
17
+ * IN-list of values. One round trip, simpler shape.
18
+ */
19
+ "filter": {
20
+ "op": "ATTRIBUTE",
21
+ "expressions": [
22
+ /*
23
+ * `name=type, operator=IN, values=[…]` is the canonical
24
+ * "match by vertex type" pattern. The list here is the
25
+ * core set you care about on most tenants — extend if the
26
+ * tenant uses connector-specific types (CONNECTOR,
27
+ * ACN_CONFIG, etc.). Use `discovery_attribute_values
28
+ * (LAYER, "type")` to enumerate types that exist on a
29
+ * specific layer.
30
+ */
31
+ {
32
+ "name": "type",
33
+ "values": ["AGENT", "HOST", "DXI_SERVICE", "BUSINESSTRANSACTION", "INFERRED_DATABASE", "PRODUCT"],
34
+ "operator": "IN"
35
+ }
36
+ ]
37
+ },
38
+ "limit": 100,
39
+ "projection": "DETAILED"
40
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Discovery: list major vertex types (AGENT, HOST, DXI_SERVICE, etc.) to understand the topology",
3
+ "tags": ["discovery", "tas"]
4
+ }
@@ -0,0 +1,34 @@
1
+ # 03-discover-sources (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Discover all metric source names and count how many metrics each source reports, ordered by metric count descending. This reveals which agents are producing the most metric data.
6
+
7
+ ## Query Construction
8
+
9
+ Pipeline: `FROM_METADATA` (all metrics) -> `GROUP` by `metric.source` -> `COUNT` -> `ORDER` descending -> `KEEP` the two columns.
10
+
11
+ Note: The column is `metric.source`, not `metric.sourceName`. The available columns from `FROM_METADATA` are revealed by the `DESCRIBE` operation (query 04) and are `metric.source` and `metric.path`.
12
+
13
+ ## API Surface Exercised
14
+
15
+ - **FROM_METADATA**: Source operation that loads metric metadata
16
+ - **GROUP**: Groups rows by one or more columns
17
+ - **COUNT**: Aggregation that counts rows per group
18
+ - **ORDER**: Sorts results by a column (with `sortDescending`)
19
+ - **KEEP**: Selects which columns appear in the final output
20
+
21
+ ## Expected Output
22
+
23
+ A tabular result where the header is `["metric.source", "metric_count"]` and each data row is a source name with its metric count. Ordered from highest to lowest.
24
+
25
+ ## What the Results Tell You
26
+
27
+ Common high-volume metric producers (varies by tenant — exact counts depend on what's installed and what time window is being indexed):
28
+ 1. **OpenTelemetry sources** — frequently the largest single producer, especially for app/UI traffic (thousands of metrics)
29
+ 2. **Kubernetes agents** — node + pod + container metrics add up quickly
30
+ 3. **Infrastructure agents** — host-level CPU / memory / disk / network
31
+ 4. **Identity-provider agents** — authentication/session metrics
32
+ 5. **Synthetic-monitoring tools** — per-monitor latency + availability series
33
+
34
+ Use this listing to identify which sources are worth targeting in subsequent NASSQL queries.
@@ -0,0 +1,63 @@
1
+ /*
2
+ * Discovery query #3 — rank metric sources by how many metrics each
3
+ * one publishes. Answers "who's noisy?" / "what's reporting most
4
+ * data?". Useful as a first NASSQL query against any tenant — gives
5
+ * you the menu of metric sources to choose from for follow-on FROM
6
+ * queries (datapoints) or `discovery_metrics` lookups.
7
+ *
8
+ * Pipeline shape: FROM_METADATA → GROUP → COUNT → ORDER → KEEP.
9
+ * Note `metric.source` is the column name (NOT `metric.sourceName`).
10
+ */
11
+ {
12
+ "query": [
13
+ /*
14
+ * `FROM_METADATA` loads the metric METADATA catalog as rows
15
+ * (one row per metric definition). NOT to be confused with
16
+ * `FROM` which loads metric DATAPOINTS (values over time).
17
+ * For "how many metrics" / "what metrics exist", always
18
+ * FROM_METADATA. For "what was the value last hour", FROM.
19
+ */
20
+ {
21
+ "op": "FROM_METADATA",
22
+ "querySpecifier": { "op": "ALL" },
23
+ "alias": "all_metadata"
24
+ },
25
+ /*
26
+ * GROUP collapses rows by the named column(s). Here we group
27
+ * by `metric.source` so each output row is one source.
28
+ * GROUP MUST come before any aggregation (COUNT here).
29
+ */
30
+ {
31
+ "op": "GROUP",
32
+ "columns": ["metric.source"]
33
+ },
34
+ /*
35
+ * COUNT per group. `as: "metric_count"` names the new column
36
+ * — without `as`, you get a default name like `count` which
37
+ * is unfriendly downstream.
38
+ */
39
+ {
40
+ "op": "COUNT",
41
+ "as": "metric_count"
42
+ },
43
+ /*
44
+ * ORDER descending so the top noise sources are first.
45
+ * sortDescending is the per-column flag; you can mix asc/desc
46
+ * across multiple sort columns.
47
+ */
48
+ {
49
+ "op": "ORDER",
50
+ "columns": [{ "column": "metric_count", "sortDescending": true }]
51
+ },
52
+ /*
53
+ * KEEP must be the LAST op in a pipeline (server returns
54
+ * HTTP 400 if anything follows KEEP). It's the projection
55
+ * step — selects which columns the response includes.
56
+ */
57
+ {
58
+ "op": "KEEP",
59
+ "columns": ["metric.source", "metric_count"]
60
+ }
61
+ ],
62
+ "limit": 50
63
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Discovery: list distinct metric source names to understand what agents/hosts report data",
3
+ "tags": ["discovery", "nassql"]
4
+ }
@@ -0,0 +1,26 @@
1
+ # 04-discover-metadata-columns (NASSQL)
2
+
3
+ ## Purpose
4
+
5
+ Use the `DESCRIBE` operation to reveal the column structure available from `FROM_METADATA`. This is essential before writing queries that reference specific column names.
6
+
7
+ ## Query Construction
8
+
9
+ Simple two-step pipeline: `FROM_METADATA` (with `ALL` specifier) -> `DESCRIBE`. The `DESCRIBE` operation returns a single header row listing all available column names, with no data rows.
10
+
11
+ ## API Surface Exercised
12
+
13
+ - **FROM_METADATA**: Source operation
14
+ - **DESCRIBE**: Debug/introspection operation that outputs the column schema of the current result set
15
+
16
+ ## Expected Output
17
+
18
+ A single-row result (just the header): `[["metric.source", "metric.path"]]`
19
+
20
+ This tells us that `FROM_METADATA` with `ALL` produces two columns:
21
+ - `metric.source` — the agent/source path (e.g., `SuperDomain|host|process|agent`)
22
+ - `metric.path` — the metric attribute path (e.g., `GC Heap:Bytes In Use`)
23
+
24
+ ## What the Results Tell You
25
+
26
+ When building NASSQL queries against metadata, you can only `GROUP`, `FILTER`, `KEEP`, or aggregate on `metric.source` and `metric.path`. Other columns (like `metric.id`, `metric.firstSeen`, `metric.lastSeen`) become available when using different specifiers or when joining with data.
@@ -0,0 +1,35 @@
1
+ /*
2
+ * Discovery query #4 — show the column shape of metric metadata
3
+ * results. `DESCRIBE` is the introspection op: feed it ANY pipeline
4
+ * stage's output and it returns the columns + types instead of the
5
+ * data. Reach for this when you're authoring a NASSQL pipeline and
6
+ * need to confirm what columns are available for downstream
7
+ * GROUP / FILTER / KEEP / etc.
8
+ *
9
+ * Pattern is identical for any source op: replace FROM_METADATA
10
+ * with FROM_TOPOLOGY (vertex columns) or FROM (datapoint columns)
11
+ * to introspect those.
12
+ */
13
+ {
14
+ "query": [
15
+ /*
16
+ * Same FROM_METADATA-with-ALL-specifier pattern as #3 — load
17
+ * the full metric metadata catalog as rows.
18
+ */
19
+ {
20
+ "op": "FROM_METADATA",
21
+ "querySpecifier": { "op": "ALL" },
22
+ "alias": "metadata"
23
+ },
24
+ /*
25
+ * DESCRIBE replaces normal output with a column descriptor
26
+ * shape: one row per column, with `column.name` + `column.type`
27
+ * + sample values. Use as the ONLY downstream op (don't try
28
+ * to GROUP / FILTER after DESCRIBE — it's a terminal op).
29
+ */
30
+ {
31
+ "op": "DESCRIBE"
32
+ }
33
+ ],
34
+ "limit": 100
35
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "Discovery: DESCRIBE the column structure of metric metadata results",
3
+ "tags": ["discovery", "nassql"]
4
+ }
@@ -0,0 +1,33 @@
1
+ # 10-filter-attribute-matches (TAS)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate the `ATTRIBUTE` filter with the `MATCHES` (regex) operator to find vertices by pattern-matching on an attribute value.
6
+
7
+ ## Query Construction
8
+
9
+ Uses `ATTRIBUTE` filter with `expressions` containing a single expression:
10
+ - `name: "name"` — match against the vertex's `name` attribute
11
+ - `operator: "MATCHES"` — regex match
12
+ - `values: [".*tixchange.*"]` — Java-style regex (case insensitive via `caseInsensitive: true`)
13
+
14
+ This finds any vertex whose name contains "tixchange" (the demo TixChange application).
15
+
16
+ ## API Surface Exercised
17
+
18
+ - **Filter**: `ATTRIBUTE` with `MATCHES` operator
19
+ - **AttributeExpression**: `name`, `values`, `operator`, `caseInsensitive`
20
+ - **Projection**: `DETAILED`
21
+
22
+ ## Expected Output
23
+
24
+ Returns up to 50 vertices related to the TixChange application, including:
25
+ - `BUSINESSTRANSACTION` vertices (e.g., `/jtixchange_web/shop/checkout.shtml`)
26
+ - `MYSQL_DB` vertices (e.g., `MYSQL_DB @ jtixchange`)
27
+ - `INFERRED_DATABASE` vertices
28
+
29
+ ## What the Results Tell You
30
+
31
+ The `MATCHES` operator performs Java regex matching against string attribute values. Unlike `IN` (exact match), `MATCHES` allows partial matching, wildcard patterns, and complex expressions. The `caseInsensitive` flag makes the regex case-insensitive.
32
+
33
+ Note: The `expressions` field is an **array** of `AttributeExpression` objects. Each expression specifies a `name` (attribute name), `values` (patterns to match), and `operator`.
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "ATTRIBUTE filter with MATCHES operator: regex search for vertices with 'tixchange' in their name",
3
+ "tags": ["tas", "filter", "attribute"]
4
+ }
@@ -0,0 +1,35 @@
1
+ /*
2
+ * `ATTRIBUTE` filter with the `MATCHES` operator — Java-style regex
3
+ * against an attribute value. Use when an exact value isn't known
4
+ * but a pattern is (substring search, prefix match, etc.).
5
+ *
6
+ * Default to `caseInsensitive: true` for human-input substrings;
7
+ * default to `false` for tenant-internal identifiers (those are
8
+ * usually case-sensitive). MATCHES is more expensive than IN — if
9
+ * you have an enumerable value list, prefer IN.
10
+ */
11
+ {
12
+ "filter": {
13
+ "op": "ATTRIBUTE",
14
+ "expressions": [
15
+ /*
16
+ * `name` is the attribute being matched. `name` (the
17
+ * attribute) and `name` (the field) collide here — easy
18
+ * to misread. The OUTER `name: "name"` selects the vertex's
19
+ * `name` attribute as the target.
20
+ *
21
+ * `MATCHES` takes a Java-flavoured regex. Wildcards: `.*`
22
+ * for any-chars; anchors are NOT implicit (the regex matches
23
+ * anywhere unless you anchor with `^` or `$`).
24
+ */
25
+ {
26
+ "name": "name",
27
+ "values": [".*tixchange.*"],
28
+ "operator": "MATCHES",
29
+ "caseInsensitive": true
30
+ }
31
+ ]
32
+ },
33
+ "limit": 50,
34
+ "projection": "DETAILED"
35
+ }
@@ -0,0 +1,29 @@
1
+ # 11-filter-and-compose (TAS)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate the `AND` boolean filter to compose two `ATTRIBUTE` filters: restricting by vertex type AND by exact name.
6
+
7
+ ## Query Construction
8
+
9
+ Uses `AND` with `input` (array of sub-filters):
10
+ 1. `ATTRIBUTE` with `type IN ["BUSINESSTRANSACTION"]` — only business transaction vertices
11
+ 2. `ATTRIBUTE` with `name IN ["/jtixchange_web/shop/checkout.shtml", "/jtixchange_web/shop/signon.shtml"]` — exact name match for two specific BT URLs
12
+
13
+ Both conditions must be true for a vertex to be included.
14
+
15
+ ## API Surface Exercised
16
+
17
+ - **Filter**: `AND` with `input` array
18
+ - **Filter**: `ATTRIBUTE` with `IN` operator (exact value matching)
19
+ - **Composition**: Two filters combined with boolean AND
20
+
21
+ ## Expected Output
22
+
23
+ Returns 4 vertices (there are duplicate BTs across different agent connections) and 16 edges connecting them to related entities. The AND filter ensures only vertices that are both BUSINESSTRANSACTION type AND have one of the two specified names are returned.
24
+
25
+ ## What the Results Tell You
26
+
27
+ The `AND` filter uses `input` (array), not `filters`. Each sub-filter is a complete filter object. The API returns matching vertices along with their directly connected edges by default (the edge inclusion is implicit for BT vertices connected to other topology entities).
28
+
29
+ Key learning: On this tenant, BT names include the full URL path (e.g., `/jtixchange_web/shop/checkout.shtml`), so `IN` requires exact matches including leading slashes.
@@ -0,0 +1,56 @@
1
+ /*
2
+ * Compose two ATTRIBUTE filters with AND — restrict results to
3
+ * vertices that satisfy BOTH. Demonstrates the standard "narrow by
4
+ * type, then narrow by name" pattern that 80% of investigative
5
+ * TAS queries follow.
6
+ *
7
+ * Could be authored as a single ATTRIBUTE op with two expressions
8
+ * in the array (also AND-combined), but the two-op form is more
9
+ * legible when the constraints are conceptually distinct + makes
10
+ * each constraint independently editable in the ui.
11
+ */
12
+ {
13
+ /*
14
+ * AND: ALL children must match. NEVER author empty AND/OR
15
+ * arrays — the server returns HTTP 400. Min 1 child.
16
+ */
17
+ "filter": {
18
+ "op": "AND",
19
+ "input": [
20
+ /*
21
+ * First narrowing: type. Always cheaper to filter by type
22
+ * before name — the type index is more selective.
23
+ */
24
+ {
25
+ "op": "ATTRIBUTE",
26
+ "expressions": [
27
+ {
28
+ "name": "type",
29
+ "values": ["BUSINESSTRANSACTION"],
30
+ "operator": "IN"
31
+ }
32
+ ]
33
+ },
34
+ /*
35
+ * Second narrowing: exact name match against a small list.
36
+ * Use IN with explicit values when you know the exact
37
+ * targets — far more efficient than MATCHES with a regex.
38
+ *
39
+ * Note these particular names include the leading slash
40
+ * and the .shtml extension — exact match is byte-for-byte.
41
+ */
42
+ {
43
+ "op": "ATTRIBUTE",
44
+ "expressions": [
45
+ {
46
+ "name": "name",
47
+ "values": ["/jtixchange_web/shop/checkout.shtml", "/jtixchange_web/shop/signon.shtml"],
48
+ "operator": "IN"
49
+ }
50
+ ]
51
+ }
52
+ ]
53
+ },
54
+ "limit": 20,
55
+ "projection": "DETAILED"
56
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "AND filter: combine type=BUSINESSTRANSACTION with exact name IN for checkout and signon BTs",
3
+ "tags": ["tas", "filter", "boolean"]
4
+ }
@@ -0,0 +1,35 @@
1
+ # 12-filter-or-not (TAS)
2
+
3
+ ## Purpose
4
+
5
+ Demonstrate complex boolean composition with `OR`, `AND`, and `NOT` filters nested together.
6
+
7
+ ## Query Construction
8
+
9
+ The filter says: "give me all k8s pods OR agents that are NOT Logstash agents."
10
+
11
+ ```
12
+ OR
13
+ ├── ATTRIBUTE(type IN [k8s_POD])
14
+ └── AND
15
+ ├── ATTRIBUTE(type IN [AGENT])
16
+ └── NOT
17
+ └── ATTRIBUTE(name MATCHES [.*Logstash.*])
18
+ ```
19
+
20
+ This exercises three levels of boolean nesting.
21
+
22
+ ## API Surface Exercised
23
+
24
+ - **Filter**: `OR` with `input` array
25
+ - **Filter**: `AND` with `input` array (nested inside OR)
26
+ - **Filter**: `NOT` with single `input` filter (nested inside AND)
27
+ - **Filter**: `ATTRIBUTE` with both `IN` and `MATCHES` operators
28
+
29
+ ## Expected Output
30
+
31
+ Returns ~50 vertices: a mix of k8s_POD vertices and AGENT vertices, with any agent whose name matches "Logstash" excluded. On a typical tenant the result will be Kubernetes / Infrastructure / Prometheus / MySQL-style agents alongside the pods — minus whatever Logstash-named agents (if any) the tenant happens to run.
32
+
33
+ ## What the Results Tell You
34
+
35
+ Boolean filters can be arbitrarily nested. `NOT` takes a single `input` filter (not an array). `OR` and `AND` take an `input` array. This pattern is useful for building complex exclusion rules in topology queries.
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Three-level boolean composition: OR(k8s_POD, AND(AGENT, NOT(name
3
+ * MATCHES /Logstash/))). Demonstrates how AND / OR / NOT compose
4
+ * arbitrarily — they're all just filters that take filter children.
5
+ *
6
+ * NOT takes a SINGLE `input` filter (not an array, unlike AND/OR).
7
+ * Easy to mis-author as `input: [...]` — produces validation error.
8
+ *
9
+ * When NOT's child is a MATCHES expression, the result is "everything
10
+ * that does NOT match this regex." Note that this is far more
11
+ * expensive than NOT_MATCHES on the inner ATTRIBUTE expression — if
12
+ * you're just inverting a single MATCHES, prefer the operator-level
13
+ * inversion. NOT(...) wrapped is for inverting multi-expression /
14
+ * compound filters.
15
+ */
16
+ {
17
+ /*
18
+ * OR: ANY child matches. Like AND, must have ≥1 child.
19
+ */
20
+ "filter": {
21
+ "op": "OR",
22
+ "input": [
23
+ /*
24
+ * Branch A — straightforward type filter.
25
+ */
26
+ {
27
+ "op": "ATTRIBUTE",
28
+ "expressions": [
29
+ {
30
+ "name": "type",
31
+ "values": ["k8s_POD"],
32
+ "operator": "IN"
33
+ }
34
+ ]
35
+ },
36
+ /*
37
+ * Branch B — AGENTs whose name does NOT match Logstash.
38
+ * Compound: AND(AGENT-type, NOT(name-matches-Logstash)).
39
+ */
40
+ {
41
+ "op": "AND",
42
+ "input": [
43
+ {
44
+ "op": "ATTRIBUTE",
45
+ "expressions": [
46
+ {
47
+ "name": "type",
48
+ "values": ["AGENT"],
49
+ "operator": "IN"
50
+ }
51
+ ]
52
+ },
53
+ /*
54
+ * NOT takes `input` as a SINGLE filter (not an array).
55
+ * `input: { op: ... }`, NOT `input: [{ op: ... }]`.
56
+ * Common mis-authoring trap.
57
+ *
58
+ * Could be rewritten as NOT_MATCHES on the ATTRIBUTE
59
+ * expression directly — cheaper. NOT-wrapping is for
60
+ * cases where the inner filter is multi-expression or
61
+ * itself compound.
62
+ */
63
+ {
64
+ "op": "NOT",
65
+ "input": {
66
+ "op": "ATTRIBUTE",
67
+ "expressions": [
68
+ {
69
+ "name": "name",
70
+ "values": [".*Logstash.*"],
71
+ "operator": "MATCHES",
72
+ "caseInsensitive": true
73
+ }
74
+ ]
75
+ }
76
+ }
77
+ ]
78
+ }
79
+ ]
80
+ },
81
+ "limit": 50,
82
+ "projection": "DETAILED"
83
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "description": "OR + AND + NOT composition: all k8s pods OR (agents NOT matching 'Logstash')",
3
+ "tags": ["tas", "filter", "boolean"]
4
+ }