@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.
- package/README.md +24 -6
- package/dist-node/01-discover-vertices.tas-pwngv2fz.md +31 -0
- package/dist-node/01-discover-vertices.tas.data-store-svjfrm1f.json5 +29 -0
- package/dist-node/01-discover-vertices.tas.data-store-tmd-w650nfzt.json +4 -0
- package/dist-node/02-discover-services.tas-867m0m88.md +30 -0
- package/dist-node/02-discover-services.tas.data-store-jz0gx5vn.json5 +40 -0
- package/dist-node/02-discover-services.tas.data-store-tmd-eq264m6y.json +4 -0
- package/dist-node/03-discover-sources.nassql-4tgp9jvv.md +34 -0
- package/dist-node/03-discover-sources.nassql.data-store-by6sqk23.json5 +63 -0
- package/dist-node/03-discover-sources.nassql.data-store-tmd-n3gy57wm.json +4 -0
- package/dist-node/04-discover-metadata-columns.nassql-vhzb0mrq.md +26 -0
- package/dist-node/04-discover-metadata-columns.nassql.data-store-c9zr7p0q.json5 +35 -0
- package/dist-node/04-discover-metadata-columns.nassql.data-store-tmd-4ygrjvty.json +4 -0
- package/dist-node/10-filter-attribute-matches.tas-tafqmtw1.md +33 -0
- package/dist-node/10-filter-attribute-matches.tas.data-store-tmd-m2sendv0.json +4 -0
- package/dist-node/10-filter-attribute-matches.tas.data-store-whdc6vbc.json5 +35 -0
- package/dist-node/11-filter-and-compose.tas-m8856738.md +29 -0
- package/dist-node/11-filter-and-compose.tas.data-store-dh5meyk8.json5 +56 -0
- package/dist-node/11-filter-and-compose.tas.data-store-tmd-mfn8a16f.json +4 -0
- package/dist-node/12-filter-or-not.tas-21zab96s.md +35 -0
- package/dist-node/12-filter-or-not.tas.data-store-7vjr4fnd.json5 +83 -0
- package/dist-node/12-filter-or-not.tas.data-store-tmd-am9smwe5.json +4 -0
- package/dist-node/13-filter-layer.tas-r1ff5anv.md +29 -0
- package/dist-node/13-filter-layer.tas.data-store-5mneyz77.json5 +30 -0
- package/dist-node/13-filter-layer.tas.data-store-tmd-9qmhyfzr.json +4 -0
- package/dist-node/14-filter-traverse.tas-da9jene0.md +38 -0
- package/dist-node/14-filter-traverse.tas.data-store-p0vxtfvj.json5 +63 -0
- package/dist-node/14-filter-traverse.tas.data-store-tmd-5hepg5wf.json +4 -0
- package/dist-node/15-filter-take-vertices-edges.tas-m160qc7z.md +35 -0
- package/dist-node/15-filter-take-vertices-edges.tas.data-store-drmcme43.json5 +46 -0
- package/dist-node/15-filter-take-vertices-edges.tas.data-store-tmd-8fewsp5s.json +4 -0
- package/dist-node/16-filter-projection.tas-dh39mcx8.md +31 -0
- package/dist-node/16-filter-projection.tas.data-store-tmd-3r8anggx.json +4 -0
- package/dist-node/16-filter-projection.tas.data-store-xjbdry1x.json5 +36 -0
- package/dist-node/17-filter-lucene.tas-gyvtzwaa.md +29 -0
- package/dist-node/17-filter-lucene.tas.data-store-1knw6srt.json5 +39 -0
- package/dist-node/17-filter-lucene.tas.data-store-tmd-5cf3tygg.json +5 -0
- package/dist-node/18-filter-variable-reuse.tas-89fq0y6x.md +46 -0
- package/dist-node/18-filter-variable-reuse.tas.data-store-by35113t.json5 +55 -0
- package/dist-node/18-filter-variable-reuse.tas.data-store-tmd-ak7aprgk.json +4 -0
- package/dist-node/19-filter-order-statefilter.tas-hm3z71qj.md +36 -0
- package/dist-node/19-filter-order-statefilter.tas.data-store-ra9hj1rz.json5 +51 -0
- package/dist-node/19-filter-order-statefilter.tas.data-store-tmd-wqer9xy2.json +4 -0
- package/dist-node/20-nassql-from-metadata-basic.nassql-szr2xax1.md +28 -0
- package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-tmd-c7drxs1m.json +4 -0
- package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-zdf1gp1v.json5 +42 -0
- package/dist-node/21-nassql-from-metadata-regex.nassql-78jnsn3e.md +30 -0
- package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-ckzsv7h1.json5 +53 -0
- package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-tmd-zgr6r9my.json +4 -0
- package/dist-node/22-nassql-from-topology.nassql-a71qw9r0.md +42 -0
- package/dist-node/22-nassql-from-topology.nassql.data-store-81m23nge.json5 +58 -0
- package/dist-node/22-nassql-from-topology.nassql.data-store-tmd-vhpjy6c7.json +4 -0
- package/dist-node/23-nassql-join-topology-metadata.nassql-hywxhcg2.md +35 -0
- package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-da7q90n2.json5 +76 -0
- package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-tmd-rr8wt9qa.json +4 -0
- package/dist-node/24-nassql-from-data-window-mean.nassql-q6qsgdxw.md +33 -0
- package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-j7xmg7fc.json5 +81 -0
- package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-tmd-qgzz2f7v.json +4 -0
- package/dist-node/25-nassql-group-order-top.nassql-awgnwn3r.md +30 -0
- package/dist-node/25-nassql-group-order-top.nassql.data-store-cmrn300b.json5 +48 -0
- package/dist-node/25-nassql-group-order-top.nassql.data-store-tmd-7xpqeh7c.json +4 -0
- package/dist-node/26-nassql-filter-predicate.nassql-2t27h5ev.md +41 -0
- package/dist-node/26-nassql-filter-predicate.nassql.data-store-k2rgp609.json5 +59 -0
- package/dist-node/26-nassql-filter-predicate.nassql.data-store-tmd-m4dddgwm.json +4 -0
- package/dist-node/27-nassql-distinct-keep.nassql-6z55dvk3.md +24 -0
- package/dist-node/27-nassql-distinct-keep.nassql.data-store-mrx00ys5.json5 +52 -0
- package/dist-node/27-nassql-distinct-keep.nassql.data-store-tmd-0p9hy42g.json +4 -0
- package/dist-node/28-nassql-format-time.nassql-6wraqgdk.md +30 -0
- package/dist-node/28-nassql-format-time.nassql.data-store-tmd-bbbqhz1x.json +4 -0
- package/dist-node/28-nassql-format-time.nassql.data-store-tvy8y2cs.json5 +59 -0
- package/dist-node/29-nassql-describe-log.nassql-t9vnxeb0.md +31 -0
- package/dist-node/29-nassql-describe-log.nassql.data-store-tmd-q4mtczy8.json +4 -0
- package/dist-node/29-nassql-describe-log.nassql.data-store-x16y4crx.json5 +51 -0
- package/dist-node/30-nassql-map-string.nassql-f2tdknzs.md +30 -0
- package/dist-node/30-nassql-map-string.nassql.data-store-t8ahcabn.json5 +53 -0
- package/dist-node/30-nassql-map-string.nassql.data-store-tmd-a6xq0bdx.json +4 -0
- package/dist-node/31-nassql-join-data-sum.nassql-p16y3xk6.md +26 -0
- package/dist-node/31-nassql-join-data-sum.nassql.data-store-dje7wm6v.json5 +64 -0
- package/dist-node/31-nassql-join-data-sum.nassql.data-store-tmd-c1pyx1qw.json +4 -0
- package/dist-node/32-nassql-bottom-aggregation.nassql-hpgfn77p.md +26 -0
- package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-tmd-p0ssj1vc.json +4 -0
- package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-v9580caa.json5 +43 -0
- package/dist-node/33-nassql-cross-domain-pipeline.nassql-fm0ynphf.md +45 -0
- package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-tmd-18881drs.json +4 -0
- package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-vqs9hkx4.json5 +79 -0
- package/dist-node/3rdpartylicenses-hx59bakt.txt +885 -0
- package/dist-node/50-discover-custom-layers.tas-2hvvpkzw.md +66 -0
- package/dist-node/50-discover-custom-layers.tas.data-store-h85zgna9.json5 +36 -0
- package/dist-node/50-discover-custom-layers.tas.data-store-tmd-hagn9eak.json +4 -0
- package/dist-node/51-collect-counts-everything.tas-nz0ksgdc.md +46 -0
- package/dist-node/51-collect-counts-everything.tas.data-store-eypcjah8.json5 +48 -0
- package/dist-node/51-collect-counts-everything.tas.data-store-tmd-4pcj94s9.json +4 -0
- package/dist-node/52-collect-counts-bulk.tas-eerw4z8s.md +54 -0
- package/dist-node/52-collect-counts-bulk.tas.data-store-scedtw1m.json5 +65 -0
- package/dist-node/52-collect-counts-bulk.tas.data-store-tmd-csyzj189.json +4 -0
- package/dist-node/53-collect-attributes-by-type.tas-cw0285hx.md +71 -0
- package/dist-node/53-collect-attributes-by-type.tas.data-store-fvjge4yr.json5 +65 -0
- package/dist-node/53-collect-attributes-by-type.tas.data-store-tmd-274qrd8f.json +4 -0
- package/dist-node/README-ghxecaz0.md +84 -0
- package/dist-node/SKILL-1xn7r9nt.md +104 -0
- package/dist-node/agent-25q752kd.md +55 -0
- package/dist-node/agent_connection_and_status-0dq7zkpc.md +62 -0
- package/dist-node/agent_source_collector-6s06n3rs.md +40 -0
- package/dist-node/agentic-mcp-rycd2gh8.md +140 -0
- package/dist-node/application-dfva8tz0.md +48 -0
- package/dist-node/application-m0q2vaxj.md +74 -0
- package/dist-node/attribute_resource_metric_name-pxrceab5.md +56 -0
- package/dist-node/browseragent-snippet.template-9megjp8a.html +12 -0
- package/dist-node/bulkvertexpatch-1a4qy5vb.md +78 -0
- package/dist-node/bundle.pbd-38r15kyd.template +13 -0
- package/dist-node/bundle.profile-1wpzpt3d.template +2 -0
- package/dist-node/business_transaction-mbqz5ex9.md +61 -0
- package/dist-node/chunk-4I3HBO6U-2ebgf7kh.js +127 -0
- package/dist-node/chunk-4PMCLJMS-0mqvr4m4.js +1 -0
- package/dist-node/chunk-5VSFINOX-ewzpx7wh.js +5 -0
- package/dist-node/chunk-72HYG3XZ-kf7hy4vs.js +3625 -0
- package/dist-node/chunk-JRM4BLOM-rg32z8w4.js +1 -0
- package/dist-node/chunk-Q2JA73UH-akkb8bh3.js +14 -0
- package/dist-node/chunk-RNMHSXZF-pdwasrg7.js +1358 -0
- package/dist-node/chunk-VV2FJEMA-3rvtkmga.js +321 -0
- package/dist-node/chunk-YVD3UK5I-9pxr1jka.js +695 -0
- package/dist-node/configuration-1vczsdex.md +104 -0
- package/dist-node/dashboards-x0xddksy.md +17 -0
- package/dist-node/database_or_inferred-8vqf5gyr.md +75 -0
- package/dist-node/default-licensing-config-0p879qpb.template +122 -0
- package/dist-node/dependency-3b0neg5x.md +40 -0
- package/dist-node/description.md-qwc2bj9r.template +30 -0
- package/dist-node/discovery-flow-fw79kbx4.md +116 -0
- package/dist-node/dxi_service-13prnpd5.md +59 -0
- package/dist-node/entity-relationships-cevz61kj.md +142 -0
- package/dist-node/gotchas-8ab64kcd.md +389 -0
- package/dist-node/host-es6fxtgx.md +46 -0
- package/dist-node/host-j3qqrm5f.md +55 -0
- package/dist-node/index-104hyb1m.html +13 -0
- package/dist-node/index-7fp2dfas.json +178 -0
- package/dist-node/index-g3hh5wez.json +403 -0
- package/dist-node/index-mbzg9rhc.json +270 -0
- package/dist-node/index-qffdhwgm.json +2479 -0
- package/dist-node/inferred-w998vfq1.md +41 -0
- package/dist-node/installInstructions.md-k9ghf3dr.template +21 -0
- package/dist-node/inventorize-xc9h9bjr.md +34 -0
- package/dist-node/investigation-planning-6kcm01h9.md +149 -0
- package/dist-node/investigator-flow-jc2s0n46.md +186 -0
- package/dist-node/k8s_deployment_and_namespace-69c29152.md +88 -0
- package/dist-node/k8s_pod_and_container-9h4v6cmj.md +64 -0
- package/dist-node/main-SGLYO5YX-ht69eb0y.js +13 -0
- package/dist-node/main.js +397415 -0
- package/dist-node/marketplace-srdmzxkj.json +15 -0
- package/dist-node/metric-source-names-6cbczyks.md +75 -0
- package/dist-node/metrics-grounding-2h4kkbe3.md +130 -0
- package/dist-node/mm-cookbook-23jpw721.md +231 -0
- package/dist-node/mm-quickstart-x2adfc16.md +106 -0
- package/dist-node/nassql-cookbook-n8kc0mff.md +812 -0
- package/dist-node/nassql-quickstart-090e0yex.md +149 -0
- package/dist-node/plugin-c3bavxvf.json +18 -0
- package/dist-node/polyfills-A7ZF72EO-mp884a0b.js +2 -0
- package/dist-node/prerendered-routes-523d8gat.json +3 -0
- package/dist-node/primeicons-4GST5W3O-jac3wxrf.woff2 +0 -0
- package/dist-node/primeicons-DHQU4SEP-760n99pp.svg +345 -0
- package/dist-node/primeicons-GEFHGEHP-rc4kaa3b.ttf +0 -0
- package/dist-node/primeicons-P53SE5CV-4saz3d5j.woff +0 -0
- package/dist-node/primeicons-RSSEDYLY-4d4vbd67.eot +0 -0
- package/dist-node/query-vs-analysis-separation-sag1ezcq.md +97 -0
- package/dist-node/run-query-vs-run-partial-6138pc94.md +80 -0
- package/dist-node/service-5pz5nhzf.md +133 -0
- package/dist-node/service-hierarchies-87a4ynpj.md +178 -0
- package/dist-node/service-k4f5mkbq.md +51 -0
- package/dist-node/servlet_or_frontend-1kjcb7ar.md +76 -0
- package/dist-node/src-apm-mfnsq6vw.svg +4 -0
- package/dist-node/src-axa-nn28yqmj.svg +4 -0
- package/dist-node/src-dxim-fv7ne4qa.svg +4 -0
- package/dist-node/styles-23VUPSCU-9ehggc1f.css +1 -0
- package/dist-node/tas-cookbook-0y4826rp.md +693 -0
- package/dist-node/tas-quickstart-wgcvwffc.md +138 -0
- package/dist-node/time-format-0595g01j.md +41 -0
- package/dist-node/toggles.pbd-9wscbmng.template +2 -0
- package/dist-node/type-host-agbhmn6v.svg +6 -0
- package/dist-node/type-metric-p9b90bpx.svg +4 -0
- package/dist-node/type-service-k7f1x71k.svg +4 -0
- package/dist-node/ui-0b5grqrg.md +113 -0
- package/dist-node/universe-b9nhf325.md +47 -0
- package/dist-node/universe-fzpwzvxr.md +91 -0
- package/dist-node/universes-and-scopes-1cb9pfk7.md +105 -0
- package/dist-node/vertex_entity_node-mm3yp9d0.md +31 -0
- 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,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,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,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,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,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,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,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
|
+
}
|