@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
package/README.md
CHANGED
|
@@ -4,10 +4,32 @@
|
|
|
4
4
|
|
|
5
5
|
***
|
|
6
6
|
|
|
7
|
-
|
|
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.
|
|
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,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,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,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,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,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,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
|
+
}
|