@dx-do/cli 5.2.48 → 5.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +24 -6
  2. package/dist-node/01-discover-vertices.tas-pwngv2fz.md +31 -0
  3. package/dist-node/01-discover-vertices.tas.data-store-svjfrm1f.json5 +29 -0
  4. package/dist-node/01-discover-vertices.tas.data-store-tmd-w650nfzt.json +4 -0
  5. package/dist-node/02-discover-services.tas-867m0m88.md +30 -0
  6. package/dist-node/02-discover-services.tas.data-store-jz0gx5vn.json5 +40 -0
  7. package/dist-node/02-discover-services.tas.data-store-tmd-eq264m6y.json +4 -0
  8. package/dist-node/03-discover-sources.nassql-4tgp9jvv.md +34 -0
  9. package/dist-node/03-discover-sources.nassql.data-store-by6sqk23.json5 +63 -0
  10. package/dist-node/03-discover-sources.nassql.data-store-tmd-n3gy57wm.json +4 -0
  11. package/dist-node/04-discover-metadata-columns.nassql-vhzb0mrq.md +26 -0
  12. package/dist-node/04-discover-metadata-columns.nassql.data-store-c9zr7p0q.json5 +35 -0
  13. package/dist-node/04-discover-metadata-columns.nassql.data-store-tmd-4ygrjvty.json +4 -0
  14. package/dist-node/10-filter-attribute-matches.tas-tafqmtw1.md +33 -0
  15. package/dist-node/10-filter-attribute-matches.tas.data-store-tmd-m2sendv0.json +4 -0
  16. package/dist-node/10-filter-attribute-matches.tas.data-store-whdc6vbc.json5 +35 -0
  17. package/dist-node/11-filter-and-compose.tas-m8856738.md +29 -0
  18. package/dist-node/11-filter-and-compose.tas.data-store-dh5meyk8.json5 +56 -0
  19. package/dist-node/11-filter-and-compose.tas.data-store-tmd-mfn8a16f.json +4 -0
  20. package/dist-node/12-filter-or-not.tas-21zab96s.md +35 -0
  21. package/dist-node/12-filter-or-not.tas.data-store-7vjr4fnd.json5 +83 -0
  22. package/dist-node/12-filter-or-not.tas.data-store-tmd-am9smwe5.json +4 -0
  23. package/dist-node/13-filter-layer.tas-r1ff5anv.md +29 -0
  24. package/dist-node/13-filter-layer.tas.data-store-5mneyz77.json5 +30 -0
  25. package/dist-node/13-filter-layer.tas.data-store-tmd-9qmhyfzr.json +4 -0
  26. package/dist-node/14-filter-traverse.tas-da9jene0.md +38 -0
  27. package/dist-node/14-filter-traverse.tas.data-store-p0vxtfvj.json5 +63 -0
  28. package/dist-node/14-filter-traverse.tas.data-store-tmd-5hepg5wf.json +4 -0
  29. package/dist-node/15-filter-take-vertices-edges.tas-m160qc7z.md +35 -0
  30. package/dist-node/15-filter-take-vertices-edges.tas.data-store-drmcme43.json5 +46 -0
  31. package/dist-node/15-filter-take-vertices-edges.tas.data-store-tmd-8fewsp5s.json +4 -0
  32. package/dist-node/16-filter-projection.tas-dh39mcx8.md +31 -0
  33. package/dist-node/16-filter-projection.tas.data-store-tmd-3r8anggx.json +4 -0
  34. package/dist-node/16-filter-projection.tas.data-store-xjbdry1x.json5 +36 -0
  35. package/dist-node/17-filter-lucene.tas-gyvtzwaa.md +29 -0
  36. package/dist-node/17-filter-lucene.tas.data-store-1knw6srt.json5 +39 -0
  37. package/dist-node/17-filter-lucene.tas.data-store-tmd-5cf3tygg.json +5 -0
  38. package/dist-node/18-filter-variable-reuse.tas-89fq0y6x.md +46 -0
  39. package/dist-node/18-filter-variable-reuse.tas.data-store-by35113t.json5 +55 -0
  40. package/dist-node/18-filter-variable-reuse.tas.data-store-tmd-ak7aprgk.json +4 -0
  41. package/dist-node/19-filter-order-statefilter.tas-hm3z71qj.md +36 -0
  42. package/dist-node/19-filter-order-statefilter.tas.data-store-ra9hj1rz.json5 +51 -0
  43. package/dist-node/19-filter-order-statefilter.tas.data-store-tmd-wqer9xy2.json +4 -0
  44. package/dist-node/20-nassql-from-metadata-basic.nassql-szr2xax1.md +28 -0
  45. package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-tmd-c7drxs1m.json +4 -0
  46. package/dist-node/20-nassql-from-metadata-basic.nassql.data-store-zdf1gp1v.json5 +42 -0
  47. package/dist-node/21-nassql-from-metadata-regex.nassql-78jnsn3e.md +30 -0
  48. package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-ckzsv7h1.json5 +53 -0
  49. package/dist-node/21-nassql-from-metadata-regex.nassql.data-store-tmd-zgr6r9my.json +4 -0
  50. package/dist-node/22-nassql-from-topology.nassql-a71qw9r0.md +42 -0
  51. package/dist-node/22-nassql-from-topology.nassql.data-store-81m23nge.json5 +58 -0
  52. package/dist-node/22-nassql-from-topology.nassql.data-store-tmd-vhpjy6c7.json +4 -0
  53. package/dist-node/23-nassql-join-topology-metadata.nassql-hywxhcg2.md +35 -0
  54. package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-da7q90n2.json5 +76 -0
  55. package/dist-node/23-nassql-join-topology-metadata.nassql.data-store-tmd-rr8wt9qa.json +4 -0
  56. package/dist-node/24-nassql-from-data-window-mean.nassql-q6qsgdxw.md +33 -0
  57. package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-j7xmg7fc.json5 +81 -0
  58. package/dist-node/24-nassql-from-data-window-mean.nassql.data-store-tmd-qgzz2f7v.json +4 -0
  59. package/dist-node/25-nassql-group-order-top.nassql-awgnwn3r.md +30 -0
  60. package/dist-node/25-nassql-group-order-top.nassql.data-store-cmrn300b.json5 +48 -0
  61. package/dist-node/25-nassql-group-order-top.nassql.data-store-tmd-7xpqeh7c.json +4 -0
  62. package/dist-node/26-nassql-filter-predicate.nassql-2t27h5ev.md +41 -0
  63. package/dist-node/26-nassql-filter-predicate.nassql.data-store-k2rgp609.json5 +59 -0
  64. package/dist-node/26-nassql-filter-predicate.nassql.data-store-tmd-m4dddgwm.json +4 -0
  65. package/dist-node/27-nassql-distinct-keep.nassql-6z55dvk3.md +24 -0
  66. package/dist-node/27-nassql-distinct-keep.nassql.data-store-mrx00ys5.json5 +52 -0
  67. package/dist-node/27-nassql-distinct-keep.nassql.data-store-tmd-0p9hy42g.json +4 -0
  68. package/dist-node/28-nassql-format-time.nassql-6wraqgdk.md +30 -0
  69. package/dist-node/28-nassql-format-time.nassql.data-store-tmd-bbbqhz1x.json +4 -0
  70. package/dist-node/28-nassql-format-time.nassql.data-store-tvy8y2cs.json5 +59 -0
  71. package/dist-node/29-nassql-describe-log.nassql-t9vnxeb0.md +31 -0
  72. package/dist-node/29-nassql-describe-log.nassql.data-store-tmd-q4mtczy8.json +4 -0
  73. package/dist-node/29-nassql-describe-log.nassql.data-store-x16y4crx.json5 +51 -0
  74. package/dist-node/30-nassql-map-string.nassql-f2tdknzs.md +30 -0
  75. package/dist-node/30-nassql-map-string.nassql.data-store-t8ahcabn.json5 +53 -0
  76. package/dist-node/30-nassql-map-string.nassql.data-store-tmd-a6xq0bdx.json +4 -0
  77. package/dist-node/31-nassql-join-data-sum.nassql-p16y3xk6.md +26 -0
  78. package/dist-node/31-nassql-join-data-sum.nassql.data-store-dje7wm6v.json5 +64 -0
  79. package/dist-node/31-nassql-join-data-sum.nassql.data-store-tmd-c1pyx1qw.json +4 -0
  80. package/dist-node/32-nassql-bottom-aggregation.nassql-hpgfn77p.md +26 -0
  81. package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-tmd-p0ssj1vc.json +4 -0
  82. package/dist-node/32-nassql-bottom-aggregation.nassql.data-store-v9580caa.json5 +43 -0
  83. package/dist-node/33-nassql-cross-domain-pipeline.nassql-fm0ynphf.md +45 -0
  84. package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-tmd-18881drs.json +4 -0
  85. package/dist-node/33-nassql-cross-domain-pipeline.nassql.data-store-vqs9hkx4.json5 +79 -0
  86. package/dist-node/3rdpartylicenses-hx59bakt.txt +885 -0
  87. package/dist-node/50-discover-custom-layers.tas-2hvvpkzw.md +66 -0
  88. package/dist-node/50-discover-custom-layers.tas.data-store-h85zgna9.json5 +36 -0
  89. package/dist-node/50-discover-custom-layers.tas.data-store-tmd-hagn9eak.json +4 -0
  90. package/dist-node/51-collect-counts-everything.tas-nz0ksgdc.md +46 -0
  91. package/dist-node/51-collect-counts-everything.tas.data-store-eypcjah8.json5 +48 -0
  92. package/dist-node/51-collect-counts-everything.tas.data-store-tmd-4pcj94s9.json +4 -0
  93. package/dist-node/52-collect-counts-bulk.tas-eerw4z8s.md +54 -0
  94. package/dist-node/52-collect-counts-bulk.tas.data-store-scedtw1m.json5 +65 -0
  95. package/dist-node/52-collect-counts-bulk.tas.data-store-tmd-csyzj189.json +4 -0
  96. package/dist-node/53-collect-attributes-by-type.tas-cw0285hx.md +71 -0
  97. package/dist-node/53-collect-attributes-by-type.tas.data-store-fvjge4yr.json5 +65 -0
  98. package/dist-node/53-collect-attributes-by-type.tas.data-store-tmd-274qrd8f.json +4 -0
  99. package/dist-node/README-ghxecaz0.md +84 -0
  100. package/dist-node/SKILL-1xn7r9nt.md +104 -0
  101. package/dist-node/agent-25q752kd.md +55 -0
  102. package/dist-node/agent_connection_and_status-0dq7zkpc.md +62 -0
  103. package/dist-node/agent_source_collector-6s06n3rs.md +40 -0
  104. package/dist-node/agentic-mcp-rycd2gh8.md +140 -0
  105. package/dist-node/application-dfva8tz0.md +48 -0
  106. package/dist-node/application-m0q2vaxj.md +74 -0
  107. package/dist-node/attribute_resource_metric_name-pxrceab5.md +56 -0
  108. package/dist-node/browseragent-snippet.template-9megjp8a.html +12 -0
  109. package/dist-node/bulkvertexpatch-1a4qy5vb.md +78 -0
  110. package/dist-node/bundle.pbd-38r15kyd.template +13 -0
  111. package/dist-node/bundle.profile-1wpzpt3d.template +2 -0
  112. package/dist-node/business_transaction-mbqz5ex9.md +61 -0
  113. package/dist-node/chunk-4I3HBO6U-2ebgf7kh.js +127 -0
  114. package/dist-node/chunk-4PMCLJMS-0mqvr4m4.js +1 -0
  115. package/dist-node/chunk-5VSFINOX-ewzpx7wh.js +5 -0
  116. package/dist-node/chunk-72HYG3XZ-kf7hy4vs.js +3625 -0
  117. package/dist-node/chunk-JRM4BLOM-rg32z8w4.js +1 -0
  118. package/dist-node/chunk-Q2JA73UH-akkb8bh3.js +14 -0
  119. package/dist-node/chunk-RNMHSXZF-pdwasrg7.js +1358 -0
  120. package/dist-node/chunk-VV2FJEMA-3rvtkmga.js +321 -0
  121. package/dist-node/chunk-YVD3UK5I-9pxr1jka.js +695 -0
  122. package/dist-node/configuration-1vczsdex.md +104 -0
  123. package/dist-node/dashboards-x0xddksy.md +17 -0
  124. package/dist-node/database_or_inferred-8vqf5gyr.md +75 -0
  125. package/dist-node/default-licensing-config-0p879qpb.template +122 -0
  126. package/dist-node/dependency-3b0neg5x.md +40 -0
  127. package/dist-node/description.md-qwc2bj9r.template +30 -0
  128. package/dist-node/discovery-flow-fw79kbx4.md +116 -0
  129. package/dist-node/dxi_service-13prnpd5.md +59 -0
  130. package/dist-node/entity-relationships-cevz61kj.md +142 -0
  131. package/dist-node/gotchas-8ab64kcd.md +389 -0
  132. package/dist-node/host-es6fxtgx.md +46 -0
  133. package/dist-node/host-j3qqrm5f.md +55 -0
  134. package/dist-node/index-104hyb1m.html +13 -0
  135. package/dist-node/index-7fp2dfas.json +178 -0
  136. package/dist-node/index-g3hh5wez.json +403 -0
  137. package/dist-node/index-mbzg9rhc.json +270 -0
  138. package/dist-node/index-qffdhwgm.json +2479 -0
  139. package/dist-node/inferred-w998vfq1.md +41 -0
  140. package/dist-node/installInstructions.md-k9ghf3dr.template +21 -0
  141. package/dist-node/inventorize-xc9h9bjr.md +34 -0
  142. package/dist-node/investigation-planning-6kcm01h9.md +149 -0
  143. package/dist-node/investigator-flow-jc2s0n46.md +186 -0
  144. package/dist-node/k8s_deployment_and_namespace-69c29152.md +88 -0
  145. package/dist-node/k8s_pod_and_container-9h4v6cmj.md +64 -0
  146. package/dist-node/main-SGLYO5YX-ht69eb0y.js +13 -0
  147. package/dist-node/main.js +397415 -0
  148. package/dist-node/marketplace-srdmzxkj.json +15 -0
  149. package/dist-node/metric-source-names-6cbczyks.md +75 -0
  150. package/dist-node/metrics-grounding-2h4kkbe3.md +130 -0
  151. package/dist-node/mm-cookbook-23jpw721.md +231 -0
  152. package/dist-node/mm-quickstart-x2adfc16.md +106 -0
  153. package/dist-node/nassql-cookbook-n8kc0mff.md +812 -0
  154. package/dist-node/nassql-quickstart-090e0yex.md +149 -0
  155. package/dist-node/plugin-c3bavxvf.json +18 -0
  156. package/dist-node/polyfills-A7ZF72EO-mp884a0b.js +2 -0
  157. package/dist-node/prerendered-routes-523d8gat.json +3 -0
  158. package/dist-node/primeicons-4GST5W3O-jac3wxrf.woff2 +0 -0
  159. package/dist-node/primeicons-DHQU4SEP-760n99pp.svg +345 -0
  160. package/dist-node/primeicons-GEFHGEHP-rc4kaa3b.ttf +0 -0
  161. package/dist-node/primeicons-P53SE5CV-4saz3d5j.woff +0 -0
  162. package/dist-node/primeicons-RSSEDYLY-4d4vbd67.eot +0 -0
  163. package/dist-node/query-vs-analysis-separation-sag1ezcq.md +97 -0
  164. package/dist-node/run-query-vs-run-partial-6138pc94.md +80 -0
  165. package/dist-node/service-5pz5nhzf.md +133 -0
  166. package/dist-node/service-hierarchies-87a4ynpj.md +178 -0
  167. package/dist-node/service-k4f5mkbq.md +51 -0
  168. package/dist-node/servlet_or_frontend-1kjcb7ar.md +76 -0
  169. package/dist-node/src-apm-mfnsq6vw.svg +4 -0
  170. package/dist-node/src-axa-nn28yqmj.svg +4 -0
  171. package/dist-node/src-dxim-fv7ne4qa.svg +4 -0
  172. package/dist-node/styles-23VUPSCU-9ehggc1f.css +1 -0
  173. package/dist-node/tas-cookbook-0y4826rp.md +693 -0
  174. package/dist-node/tas-quickstart-wgcvwffc.md +138 -0
  175. package/dist-node/time-format-0595g01j.md +41 -0
  176. package/dist-node/toggles.pbd-9wscbmng.template +2 -0
  177. package/dist-node/type-host-agbhmn6v.svg +6 -0
  178. package/dist-node/type-metric-p9b90bpx.svg +4 -0
  179. package/dist-node/type-service-k7f1x71k.svg +4 -0
  180. package/dist-node/ui-0b5grqrg.md +113 -0
  181. package/dist-node/universe-b9nhf325.md +47 -0
  182. package/dist-node/universe-fzpwzvxr.md +91 -0
  183. package/dist-node/universes-and-scopes-1cb9pfk7.md +105 -0
  184. package/dist-node/vertex_entity_node-mm3yp9d0.md +31 -0
  185. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ ---
2
+ description: Use when the user asks investigative questions about a DXO2 tenant — hosts, services, agents, alarms, metrics, traces, topology shape, "what's slow / noisy / broken / down". Teaches the investigator decision tree (scope-clarify → discovery → corpus grounding → query author → UI handoff) for the dx-do-query MCP. Always reach for this skill before authoring TAS / NASSQL / Metrics-Metadata queries against the bound tenant.
3
+ ---
4
+
5
+ # investigator (dx-do investigate)
6
+
7
+ You're acting as a DXO2 (DX Operational Observability) investigator. The user wants an answer about their tenant's data — hosts, services, alarms, metrics, traces, topology shape — and the dx-do-query MCP is your tool.
8
+
9
+ The full grounding lives in the corpus (`corpus_sections` to enumerate, `corpus_get` to fetch). This skill is the **decision tree** that tells you *which* corpus content to load and *when*. Don't restate corpus content here; reference it.
10
+
11
+ ## The investigator loop
12
+
13
+ Always in this order:
14
+
15
+ 1. **Scope clarification** — universes? services? subservice traversal? time window? threshold semantics? Identify the load-bearing ambiguities for the question shape.
16
+ 2. **Empirical grounding** — call `discovery_capabilities`, then enumerate universes / services / layers as the question demands. Surface counts in a single sentence to the user.
17
+ 3. **Targeted question** — ask one or two clarifying questions on the load-bearing ambiguities. Don't guess; don't ask five.
18
+ 4. **Pick query type** — TAS for graph (entities, neighbors, paths) / NASSQL for tabular (group, count, trend, aggregate) / metric-metadata is a *source* in NASSQL not a separate language.
19
+ 5. **Author + verify** — start from a corpus example via `corpus_get('queries', '<id>')` if one matches. Verify with `run_partial_query` for sub-trees, `run_query` for the whole.
20
+ 6. **Save + hand off** — `create_query` to save, then surface the saved id and the ui URL ("open in ui as `<id>`") OR offer the analyzer subagent.
21
+
22
+ The full version of step 1–6 lives in `corpus_get('cookbooks', 'investigator-flow')`. **Read it on the first investigative turn of any session**, then reference inline.
23
+
24
+ ## Three load-bearing distinctions
25
+
26
+ These collapse silently into wrong answers. Internalize them:
27
+
28
+ - **Universe ≠ Service ≠ DXI_SERVICE.** Two kinds of universes (APM + O2). Services are the secondary scoping axis (often hierarchical). DXI_SERVICE is APM-internal and rarely what the user means by "service." See `corpus_get('entities', 'universe')`, `'service'`, `'dxi_service'`.
29
+ - **`FROM_METADATA` vs `FROM`.** Metadata = metric *definitions*; FROM = metric *datapoints* over time. Same metric, totally different rows. See `corpus_get('cookbooks', 'nassql-quickstart')` source-op decision table at the top.
30
+ - **Query vs analysis.** Default to producing a query that returns *raw data*, not analysis. Let the user / ui / analyzer threshold. *"1-of-30 datapoints over 90 vs all-of-30 over 70"* — same dataset, different shapes; a thresholded query silently picks one. See `corpus_get('cookbooks', 'query-vs-analysis-separation')`.
31
+
32
+ ## Schema landmines (memorize)
33
+
34
+ The five gotchas that bite first-time TAS authors:
35
+
36
+ - **No `EQ` op** — use `ATTRIBUTE` with `operator: IN` or `LUCENE`.
37
+ - **`AND` / `OR` cannot be empty** — always at least one child; HTTP 400 otherwise.
38
+ - **`NOT` takes a single `input`, not an array** — `input: <filter>`, NOT `input: [<filter>]`.
39
+ - **Empty `run_query` payload** is server-refused — pair `op:"ALL"` with `limit ≤ 100`. The server-side guard's error message points at `corpus_get('queries', '01-discover-vertices')`.
40
+ - **`LUCENE` is tenant-config-dependent** — call `discovery_capabilities` once per session to know.
41
+
42
+ NASSQL parallels:
43
+
44
+ - **`KEEP` must be the last op.**
45
+ - **`TOP` / `BOTTOM` use `n`, not `count`.**
46
+ - **`vertex.attr.<name>` is the FROM_TOPOLOGY column convention.**
47
+
48
+ Full list in `corpus_get('cookbooks', 'tas-quickstart')` and `'nassql-quickstart'` (top of each).
49
+
50
+ ## Tool defaults
51
+
52
+ When the user asks an investigative question, your default first calls:
53
+
54
+ ```
55
+ corpus_get('cookbooks', 'investigator-flow') ← only on first turn of a session
56
+ discovery_capabilities ← only on first turn of a session
57
+ ```
58
+
59
+ Then for any specific question:
60
+
61
+ ```
62
+ corpus_list('entities', {}) ← if conceptual ambiguity
63
+ corpus_get('entities', '<name>') ← when an entity is named
64
+ discovery_layers / discovery_services / ← live tenant grounding
65
+ discovery_attributes / discovery_attribute_values
66
+ corpus_list('queries', {type: '<type>'}) ← worked-example patterns
67
+ corpus_get('queries', '<id>') ← study an example before authoring
68
+ run_partial_query ← verify sub-trees while authoring
69
+ run_query ← final execution (against narrowed scope)
70
+ create_query ← save, then hand off
71
+ ```
72
+
73
+ **Don't** guess attribute names, layer names, service names, or vertex types. Always discover. The cost is one tool call; the reward is correctness.
74
+
75
+ ## Handoff phrasing
76
+
77
+ When the query is built and saved:
78
+
79
+ > *"Saved as `<id>`. Open in the ui to refine the time window or thresholds: `http://localhost:<port>/queries/<id>` (the ui port is in the agentic-mcp launch logs / `dx-do ui start` log). If you'd like a thresholded analysis right now, I can hand it to the analyzer subagent."*
80
+
81
+ When more clarification is needed before authoring:
82
+
83
+ > *"Quick scope check first — [empirical observation: N universes, M services]. Did you want [option A] or [option B]? [Optionally one more clarifying question on threshold / time window if load-bearing.]"*
84
+
85
+ ## Anti-patterns
86
+
87
+ - Skipping scope clarification → wrong-scope query → wrong answer that looks right.
88
+ - Five clarifying questions instead of one or two → the user gives up.
89
+ - Hard-coding tenant-specific names → query rots when the tenant evolves.
90
+ - Defaulting to thresholded queries → silently lossy.
91
+ - Treating "service" as `DXI_SERVICE` by default → wrong scoping axis.
92
+ - Long-form analysis paragraph instead of a saved query → ephemeral; user can't iterate or share.
93
+ - `run_partial_query` as the FINAL execution → it's a debug op; save with `create_query` and `run_query` for the canonical answer.
94
+
95
+ ## See also
96
+
97
+ - `corpus_get('cookbooks', 'investigator-flow')` — the full 7-step loop.
98
+ - `corpus_get('cookbooks', 'universes-and-scopes')` — universe disambiguation.
99
+ - `corpus_get('cookbooks', 'service-hierarchies')` — service `excludeSubServices` polarity + traversal.
100
+ - `corpus_get('cookbooks', 'query-vs-analysis-separation')` — the data-vs-analysis default.
101
+ - `corpus_get('cookbooks', 'discovery-flow')` — discovery hierarchy (capabilities → entities → live → metadata).
102
+ - `corpus_get('cookbooks', 'gotchas')` — empirical surprises across all of the above.
103
+ - `corpus_get('cookbooks', 'run-query-vs-run-partial')` — full vs partial execution choice.
104
+ - `corpus_get('cookbooks', 'tas-quickstart')` / `'nassql-quickstart'` / `'mm-quickstart'` — schema-level details when authoring.
@@ -0,0 +1,55 @@
1
+ ---
2
+ id: agent
3
+ title: AGENT — a telemetry collector
4
+ layer: APM_INFRASTRUCTURE
5
+ synonyms: [collector, monitor]
6
+ related_entities: [host, agent_connection, dxi_service]
7
+ related_cookbooks: [tas-quickstart]
8
+ tags: [apm, telemetry]
9
+ ---
10
+
11
+ # AGENT
12
+
13
+ ## What it is
14
+
15
+ An AGENT vertex represents a software collector that reports telemetry — APM agents, infrastructure agents, Kubernetes agents, MySQL agents, etc. AGENTs are usually associated with a HOST and a PRODUCT.
16
+
17
+ ## Where it lives
18
+
19
+ `type=AGENT` vertices live in the **APM_INFRASTRUCTURE** layer. This is the layer to query when you want to know "what's collecting telemetry from where".
20
+
21
+ **If your goal is "find HOSTs that have APM agents"** — start from `INFRASTRUCTURE.HOST` with `SourceProduct=APM`, *not* from APM_INFRASTRUCTURE. See `entities/host`.
22
+
23
+ ## Common uses
24
+
25
+ - **Agent inventory** — list all agents per host, per product, per cluster.
26
+ - **Coverage analysis** — which hosts have which agent types?
27
+ - **Health filtering** — combine with `agentIsConnected`, `agentMode`, `agentConnectedTime` attributes.
28
+
29
+ ## Useful attributes
30
+
31
+ - `agentName` / `name` — display name (often `<cluster>|<host>|<product>` shape).
32
+ - `agentType` — kind of agent (e.g. `Kubernetes Agent`, `Infrastructure Agent`).
33
+ - `agentIsConnected` — boolean, current connectivity state.
34
+ - `agentConnectedTime` — last connection epoch ms.
35
+ - `SystemFQHostName` / `SystemSimpleHostName` — host this agent runs on.
36
+ - `SourceProduct` — usually `APM`, but agents can be associated with other products.
37
+
38
+ ## Common synonyms / mistakes
39
+
40
+ - "monitor", "collector" — colloquially synonymous with AGENT.
41
+ - **"the agent for host X"** — multiple agents can run on one host (Kubernetes + Infrastructure + product-specific). The relationship is many-to-one, not one-to-one.
42
+ - "is this host monitored?" — usually means "does this host have at least one connected AGENT?". Use the `agent` attribute on HOST as a shortcut, or TRAVERSE from HOST to AGENT.
43
+
44
+ ## Related entities
45
+
46
+ - **HOST** (in INFRASTRUCTURE) — typically the machine this agent runs on. TRAVERSE in either direction.
47
+ - **AGENT_CONNECTION** (same layer) — represents an agent's connection lifecycle.
48
+ - **DXI_SERVICE** (same layer) — APM service abstraction the agent feeds metrics into.
49
+
50
+ ## See also
51
+
52
+ - `entities/host` — for the host-side companion.
53
+ - `cookbooks/tas-quickstart` — the layer + ATTRIBUTE pattern.
54
+ - `queries/12-filter-or-not` — example query that filters AGENTs by name pattern.
55
+ - `queries/19-filter-order-statefilter` — agents sorted with status included.
@@ -0,0 +1,62 @@
1
+ ---
2
+ id: agent_connection_and_status
3
+ title: AGENT_CONNECTION / AGENT_STATUS — agent lifecycle records
4
+ layer: APM_INFRASTRUCTURE
5
+ related_entities: [agent, host, dxi_service]
6
+ related_cookbooks: []
7
+ tags: [apm, telemetry, platform-internal]
8
+ ---
9
+
10
+ # AGENT_CONNECTION and AGENT_STATUS
11
+
12
+ ## What they are
13
+
14
+ These two platform-internal vertex types describe the **state and history** of an agent's relationship to the platform:
15
+
16
+ - `AGENT_CONNECTION` — a connection lifecycle record. Holds the connection's identity, the agent it represents, and the backend node the agent connects through. Useful for "when did this agent last connect" / "is this agent connected right now".
17
+ - `AGENT_STATUS` — current health/state of a deployed agent. Holds attributes like `agentHostname`, `agentProcess`, and the platform's view of the agent's running state.
18
+
19
+ Most tenants have one `AGENT_CONNECTION` per `AGENT` (sometimes more — multiple connection histories) and similar fan-out for `AGENT_STATUS`. In demo-prod: 92 AGENTs, 59 AGENT_CONNECTIONs, 60 AGENT_STATUSes.
20
+
21
+ ## Where they live
22
+
23
+ Both live in the **APM_INFRASTRUCTURE** layer next to AGENT.
24
+
25
+ ## Useful attributes
26
+
27
+ AGENT_CONNECTION:
28
+ - `name`, `ACNId`, `SourceProduct`, `agent`, `backendNode`, `category`, `resourceType`.
29
+
30
+ AGENT_STATUS:
31
+ - `name`, `Hostname`, `agentHostname`, `agentAgent`, `agentProcess`.
32
+ - `RootResourceFolder`, `agentDomain`, `createdBy`, `Source cluster`.
33
+
34
+ ## When you'd actually query these
35
+
36
+ Most user-facing questions ("is X being monitored?", "did the agent miss data?") are answered by:
37
+
38
+ 1. Attributes on `AGENT` itself (`agentIsConnected`, `agentConnectedTime`).
39
+ 2. Time-series under the agent's own metric source (e.g. `*Status*` paths).
40
+
41
+ Reach for `AGENT_CONNECTION` / `AGENT_STATUS` only when:
42
+
43
+ - You're auditing connection lifecycle history (multiple records over time).
44
+ - You need to correlate a status flap with a specific deploy.
45
+ - You're writing a tenant-side report on agent fleet health.
46
+
47
+ For the common case "is host X being monitored?", traverse from HOST → AGENT and check `agentIsConnected` on the AGENT vertex.
48
+
49
+ ## No first-class metrics
50
+
51
+ Neither type is itself a metric source. State changes show up in alarms / event streams; for time-series of agent up/down, look at the agent's own metric source (the AGENT, not these records).
52
+
53
+ ## Related entities
54
+
55
+ - **AGENT** — the parent. Almost everything you'd want to know lives there or one TRAVERSE away.
56
+ - **HOST** — the machine the agent runs on; matched by hostname attribute.
57
+ - **DXI_SERVICE** — the platform-internal service that aggregates an agent's traffic.
58
+
59
+ ## See also
60
+
61
+ - `entities/agent` — the primary record.
62
+ - `cookbooks/metrics-grounding` — agent ↔ metric mapping.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: agent_source_collector
3
+ title: agent / source / collector / monitor
4
+ aliases: [collector, monitors, source]
5
+ category: agent
6
+ related: [attribute_resource_metric_name, host]
7
+ tags: [overloaded, core]
8
+ ---
9
+
10
+ # agent / source / collector / monitor
11
+
12
+ These four words refer to **closely related but not identical** things:
13
+
14
+ - **AGENT vertex** — a topology vertex of `type=AGENT` representing a deployed software collector. Has attributes like `agentName`, `agentType`, `agentIsConnected`. Lives in `APM_INFRASTRUCTURE`.
15
+ - **`source` field on a metric** — a string identifier on every metric in MM, naming the producer. Usually a pipe-delimited path: `<domain>|<host-or-agent-id>|<bus>|<role>`. Most metrics have *some* `source` even when no AGENT vertex exists.
16
+ - **"collector" / "monitor" / "agent"** (colloquial) — synonyms users employ for the AGENT vertex.
17
+
18
+ ## When the distinction matters
19
+
20
+ - Querying *what's monitored*: filter `AGENT` vertices, optionally TRAVERSE to monitored entities.
21
+ - Querying *where a metric came from*: filter MM by `metric.source`. **Not every metric.source has a corresponding AGENT vertex** (some come from platform-side processing, virtual sources, sub-agent components).
22
+ - Going from source string to AGENT: the `agent` segment of the source name often matches the AGENT vertex's `agentName`, but not always — some agents emit metrics under a separate sub-agent identity.
23
+
24
+ ## Common mistakes
25
+
26
+ - Assuming "the agent for host X" is unique. A host can have many agents (Infrastructure + Kubernetes + product-specific). The relationship is many-to-one.
27
+ - Filtering metrics by `source LIKE %X%` and expecting the result to match a single AGENT vertex. Sources can be more granular than AGENTs (sub-paths under one collector).
28
+ - Using `agent` ambiguously between the *attribute* (a string on many vertex types) and the *AGENT vertex* (one specific type). The string attribute often gives you the agent name without a TRAVERSE.
29
+
30
+ ## How users phrase it
31
+
32
+ - "the agent" / "the collector" / "the monitor" → AGENT vertex.
33
+ - "the source" → `metric.source` field on a metric.
34
+ - "is X being monitored" → check for AGENT vertex(es) whose monitored-entities include X.
35
+
36
+ ## See also
37
+
38
+ - `entities/agent` — AGENT vertex detail.
39
+ - `cookbooks/metric-source-names` — pipe-delimited source naming.
40
+ - `cookbooks/metrics-grounding` — agent ↔ metric mapping, including orphaned metrics.
@@ -0,0 +1,140 @@
1
+ # `dx-do agentic mcp` — stdio MCP server
2
+
3
+ Run `dx-do` as a [Model Context Protocol](https://modelcontextprotocol.io/) server bound to a single tenant config. The server speaks JSON-RPC over **stdio**, so it is launched as a subprocess by your AI agent (Claude Code, Cursor, mcp-inspector, …).
4
+
5
+ > **Experimental.** `agentic mcp` is currently gated. To run it from the shell, either:
6
+ > - pass `--enable-experimental-commands` on the dx-do invocation
7
+ > - export `DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true` in your environment
8
+ >
9
+ > When MCP clients spawn dx-do as a subprocess, set the env var in their MCP server config (Claude Code: `env: {"DXDO_ENABLE_EXPERIMENTAL_COMMANDS": "true"}`; Cursor: same). Examples below show this.
10
+
11
+ ## Usage
12
+
13
+ ```
14
+ DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true dx-do agentic mcp config=<alias> [module.<id>=off|read|write ...]
15
+ ```
16
+
17
+ Required:
18
+
19
+ * `config=<alias>` — bind to `~/.dxdo/<alias>.dxo2.config.json`. There is no default — stdio MCP servers must be explicitly bound.
20
+
21
+ Optional, repeatable:
22
+
23
+ * `module.<id>=off|read|write` — override the permission level for one module. See **Modules** below.
24
+
25
+ ## Modules
26
+
27
+ The MCP exposes the dx-do client surface as a small set of named **modules**. Each module is gated by a permission level you can set independently:
28
+
29
+ * `off` — module is not exposed at all (no tools registered)
30
+ * `read` — only read-only tools in the module are exposed
31
+ * `write` — full surface (reads + mutating tools, where they exist)
32
+
33
+ | Module | What it is | `read` | `write` |
34
+ |---|---|---|---|
35
+ | `discovery` | Explore the tenant's topology graph — what layers / services / metrics / attributes / attribute-values exist. Cached per session. | All discovery tools (read-only by nature). | Same as `read` — no mutating discovery operations. |
36
+ | `corpus` | Browse the corpus shipped with `@dx-do/corpus` — sections today: `queries` (worked-example payloads), `cookbooks` (quickstart + gotchas + discovery-flow), `entities` (vertex-type reference docs). Future: `metrics`, `lexicon`. | All three generic corpus tools (`corpus_sections` / `corpus_list` / `corpus_get`). | Same as `read` — no mutating corpus operations. |
37
+ | `datastore` | Execute queries against the live tenant's DXO2 DataStore APIs (TAS / NASSQL / Metrics-Metadata). | Run full and partial queries (read against tenant data). | Reserved for future mutating datastore operations (alarms, etc.) — currently same as `read`. |
38
+ | `ui` | Manage user-authored queries on disk under `~/.dxdo/queries/<alias>/`. Same surface the visual ui exposes. | List folders / list queries / get query. | Adds create / update / move query + create folder. |
39
+
40
+ **Defaults:** `ui=write`, everything else `read`. Override per module — modules you don't mention keep their default.
41
+
42
+ ### Examples
43
+
44
+ ```sh
45
+ # Default surface (ui=write, others=read).
46
+ dx-do agentic mcp config=demo-prod
47
+
48
+ # Lock the agent to read-only on user queries (no create/update/move).
49
+ dx-do agentic mcp config=demo-prod module.ui=read
50
+
51
+ # Hide the user-queries surface entirely. Agent can only browse the
52
+ # corpus + run queries against the tenant.
53
+ dx-do agentic mcp config=demo-prod module.ui=off
54
+
55
+ # Browse-only — no live tenant calls. Useful when teaching an agent
56
+ # what's available without letting it touch the tenant.
57
+ dx-do agentic mcp config=demo-prod module.datastore=off module.ui=read
58
+ ```
59
+
60
+ **Single-tenant guarantee.** No `select_segment` / `bind_session` tool exists in any module. The agent cannot programmatically switch tenants — re-binding requires restarting the process with a different `config=<alias>`.
61
+
62
+ ## Wiring into Claude Code
63
+
64
+ The simplest path is the bundled plugin (`dx-do agentic extract-claude-marketplace base-directory=~/`) — its `plugin.json` already carries the experimental-gate env var. If you wire MCP manually, set the env var explicitly:
65
+
66
+ ```sh
67
+ claude mcp add dx-do-query \
68
+ --env DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true \
69
+ -- /path/to/dx-do agentic mcp config=demo-prod
70
+ ```
71
+
72
+ For npm-installed dx-do:
73
+
74
+ ```sh
75
+ claude mcp add dx-do-query \
76
+ --env DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true \
77
+ -- npx @dx-do/cli agentic mcp config=demo-prod
78
+ ```
79
+
80
+ After adding, the tools appear in Claude Code's tool palette. Verify by asking Claude to call `corpus_sections` — it should return the registered corpus sections.
81
+
82
+ ## Wiring into Cursor
83
+
84
+ Cursor reads MCP servers from `~/.cursor/mcp.json` (or per-project `./.cursor/mcp.json`). Add an entry — note the `env` field that opens the experimental gate inside the spawned subprocess:
85
+
86
+ ```json
87
+ {
88
+ "mcpServers": {
89
+ "dx-do-query": {
90
+ "command": "/path/to/dx-do",
91
+ "args": ["agentic", "mcp", "config=demo-prod"],
92
+ "env": {
93
+ "DXDO_ENABLE_EXPERIMENTAL_COMMANDS": "true"
94
+ }
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ Restart Cursor to pick up the change. To pass module overrides, append them to the `args` array: `["agentic", "mcp", "config=demo-prod", "module.ui=read"]`.
101
+
102
+ ## Wiring into `mcp-inspector` (for debugging)
103
+
104
+ ```sh
105
+ DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true npx @modelcontextprotocol/inspector \
106
+ /path/to/dx-do agentic mcp config=demo-prod
107
+ ```
108
+
109
+ Inspector opens a browser UI where you can list tools, invoke them with arbitrary inputs, and watch the raw JSON-RPC traffic.
110
+
111
+ ## Smoke test from the shell
112
+
113
+ ```sh
114
+ cat <<'EOF' | DXDO_ENABLE_EXPERIMENTAL_COMMANDS=true dx-do agentic mcp config=demo-prod
115
+ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}
116
+ {"jsonrpc":"2.0","method":"notifications/initialized"}
117
+ {"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
118
+ EOF
119
+ ```
120
+
121
+ Expected: two JSON-RPC response lines on **stdout**. The first is the `initialize` reply (`serverInfo: { name: "dx-do-query", version: "1.0.0" }`); the second lists the tools enabled by your module flags. All other dx-do output (configuration loading, etc.) goes to **stderr** and is safe to ignore (or pipe to a log file).
122
+
123
+ ## stdout / stderr discipline
124
+
125
+ The MCP protocol uses stdout for JSON-RPC messages. Anything else on stdout corrupts the stream and the parent agent will disconnect.
126
+
127
+ * **stdout**: JSON-RPC only. Owned by the MCP transport.
128
+ * **stderr**: All `dx-do` diagnostic output (`signale`-routed by default). Treat as informational.
129
+
130
+ If you wrap `dx-do agentic mcp` in your own subprocess invocation, do **not** add anything that writes to stdout (no `tee`, no progress bars, no shell wrappers that prepend output). You can freely pipe stderr (`2>somewhere`).
131
+
132
+ ## Lifecycle
133
+
134
+ * The server runs until the parent process closes its stdin pipe (or the dx-do process receives SIGINT). Killing the parent agent terminates the MCP server cleanly.
135
+ * Each `agentic mcp` invocation spawns its own dx-do process, loads its own session, and maintains its own discovery cache. Two parents = two processes = two caches. There is no shared state across invocations.
136
+ * Authentication happens once at startup (during session bootstrap); failed auth aborts before any MCP requests are handled.
137
+
138
+ ## Related
139
+
140
+ * `dx-do help configuration` — how `~/.dxdo/<alias>.dxo2.config.json` files are loaded.
@@ -0,0 +1,48 @@
1
+ ---
2
+ id: application
3
+ title: application — also overloaded
4
+ aliases: [app, apps, applications]
5
+ category: scoping
6
+ related: [service, host]
7
+ tags: [overloaded, disambiguation, core]
8
+ ---
9
+
10
+ # application
11
+
12
+ "Application" overlaps with "service" but adds its own ambiguity. Candidates when a user says "the X application":
13
+
14
+ | Candidate | Description |
15
+ |-----------------------------------|---------------------------------------------------------------------------------------------------------|
16
+ | **DXO2 application** | A service with `type=application`. Recently introduced; Lives in the same hierarchy as other services. |
17
+ | **DXO2 service** | A service with `type=service`. For now, more common than DXO2 applications. |
18
+ | **APM agent's `applicationName`** | A label attribute the APM agent sets on BUSINESSTRANSACTIONs and SERVLETs. Pre-dates DXO2 applications. |
19
+ | **k8s_DEPLOYMENT** | In Kubernetes-native shops, "application" usually maps to a Deployment. |
20
+ | **APM-flavored "application"** | Older docs sometimes call the APM-monitored unit an "application". |
21
+ | **Universe** | At portfolio level, customers occasionally use a Universe to scope an application. |
22
+ | **Business application** | A user-narrative concept that may correspond to any of the above (or to nothing in DXO2). |
23
+
24
+ ## Disambiguation rule
25
+
26
+ When the user says "application X":
27
+
28
+ 1. **Name-search across multiple kinds**: services-with-type=application, plain DXO2 services, k8s_DEPLOYMENTs, universes, vertex names with `applicationName=X`. The MCP tool `discovery_search_by_name` does this in one call.
29
+ 2. **Pick the strongest match**:
30
+ - If a DXO2 service with `type=application` matches, use it.
31
+ - Else if a `k8s_DEPLOYMENT` with that name exists in a k8s-monitored tenant, use it.
32
+ - Else if a 'universe' with that name matches it
33
+ - Else if `applicationName` matches on BTs / SERVLETs, that's the APM-flavored anchor.
34
+ - Else fall back to plain DXO2 service.
35
+ 3. **If multiple candidates plausibly match**, surface them and ask the user.
36
+
37
+ ## How users phrase it
38
+
39
+ - "How is the X application doing?" → start with the name-search.
40
+ - "All the apps in our portfolio" → DXO2 services with `type=application`.
41
+ - "The Java app" → APM agent's `applicationName`, often paired with the agent.
42
+ - "The deployment for X" → `k8s_DEPLOYMENT` directly.
43
+
44
+ ## See also
45
+
46
+ - `entities/application` — the DXO2 application detail doc.
47
+ - `lexicon/service` — closely-related overload.
48
+ - `cookbooks/investigation-planning` — name-disambiguation as the very first step.
@@ -0,0 +1,74 @@
1
+ ---
2
+ id: application
3
+ title: Application — the recently-added DXO2 service-with-type=application
4
+ related_entities: [service, dxi_service, k8s_deployment, business_transaction]
5
+ related_cookbooks: [investigation-planning, service-hierarchies]
6
+ tags: [scoping, apm, organizational-axis]
7
+ ---
8
+
9
+ # Application
10
+
11
+ ## What it is
12
+
13
+ DXO2 introduced a first-class **application** concept on top of services. Mechanically, an application is a `service` with `type=application` — it lives in the same hierarchy as other services but has elevated semantic weight: applications are the headline names that tend to show up in dashboards, alert summaries, and conversation.
14
+
15
+ Applications are layered on top of services for **focus and visibility** rather than to introduce a new container type. A typical pattern:
16
+
17
+ ```
18
+ Service: corp-platform (root)
19
+ └── Service: payments-application (type=application)
20
+ ├── Service: payments-api (member services)
21
+ └── Service: payments-worker
22
+ ```
23
+
24
+ The application's children are a mix of services and the entities that ultimately populate them.
25
+
26
+ ## Where it lives
27
+
28
+ Same place as `service` (no separate layer). The catalog row in `entities/service.md` covers the underlying service shape; this doc adds what's special when `type=application`.
29
+
30
+ ## Useful attributes
31
+
32
+ (via the parent service shape)
33
+
34
+ - `name` — display label, e.g. `payments-application`.
35
+ - `type` — `application` (the marker).
36
+ - Plus everything a regular service carries: `root_service`, parent/child relationships, member entities.
37
+
38
+ ## Mapping to "application" in user phrasing
39
+
40
+ "Application X" is one of the most overloaded terms a user can use. Candidates:
41
+
42
+ | Candidate | When to suspect |
43
+ |---|---|
44
+ | **DXO2 application** (this entity) | The customer has explicitly modeled their portfolio with `type=application` services. Modern DXO2 deployments increasingly use this. |
45
+ | **APM agent's `applicationName`** attribute | Older APM-flavored phrasing; the application is a label on BTs and SERVLETs, not a vertex. |
46
+ | **k8s_DEPLOYMENT** | Kubernetes-native shops usually equate one Deployment with one app. |
47
+ | **DXO2 service** (without `type=application`) | Services predate applications; many tenants still organize purely by service. |
48
+ | **Universe** | Some customers use universes as application-level groupings (especially at the portfolio level). |
49
+
50
+ The `cookbooks/investigation-planning` decision tree starts with a name-search across all five candidates and picks based on what matches.
51
+
52
+ ## Common starting moves
53
+
54
+ - "How is the X application doing?" → `discovery_search_by_name` across services-with-type=application, plain services, k8s_DEPLOYMENTs, universes. If a `type=application` service matches, that's the strong candidate.
55
+ - "Inventory of the X application" → from the matched service, walk the service membership (`query-service-inventory` CLI / `service overview` MCP) to enumerate constituent entities.
56
+ - "Dependency graph for X" → from the matched service, the `service-dependency-graph` API returns the TAS subgraph.
57
+
58
+ ## Common synonyms / mistakes
59
+
60
+ - "App" / "application" / "system" / "product" — heavily overloaded. Always disambiguate via name-search before committing.
61
+ - Don't assume every customer has applications modeled — some tenants have services without `type=application` for their entire portfolio.
62
+
63
+ ## Related entities
64
+
65
+ - **service** — the underlying entity shape.
66
+ - **dxi_service** — APM-internal service abstraction (NOT the same).
67
+ - **k8s_DEPLOYMENT** — the most common k8s-shop equivalent of "application".
68
+ - **BUSINESSTRANSACTION** — BTs frequently carry `applicationName` matching the app's name.
69
+
70
+ ## See also
71
+
72
+ - `lexicon/application` — full term-overload disambiguation.
73
+ - `cookbooks/service-hierarchies` — the service hierarchy mechanics.
74
+ - `cookbooks/investigation-planning` — name-disambiguation as step #1.
@@ -0,0 +1,56 @@
1
+ ---
2
+ id: attribute_resource_metric_name
3
+ title: attribute / resource / metric name / metric path
4
+ aliases: [metric attribute, metric name, resource name]
5
+ category: metric
6
+ related: [agent_source_collector]
7
+ tags: [overloaded, core]
8
+ ---
9
+
10
+ # attribute / resource / metric name / metric path
11
+
12
+ The **same metric** has several names depending on which API surface or user phrasing you encounter it through. They all refer to the same underlying thing, but the field labels differ:
13
+
14
+ | Term | Where you see it | Example |
15
+ |---|---|---|
16
+ | `metric.path` (full) | NASSQL `FROM_METADATA` columns | `Frontends\|CheckoutBT:Average Response Time (ms)` |
17
+ | `metric.attribute` | older API field | (alias for the leaf segment) |
18
+ | User shorthand: `<resource>:<metric>` | Conversational phrasing | `CheckoutBT:Average Response Time` |
19
+ | MM "specifier" | Metrics-Metadata query input | `AttributeNameSpecifier { values: [...] }` |
20
+
21
+ ## Anatomy
22
+
23
+ A metric is identified by **(source, path)** together:
24
+
25
+ - `metric.source` — pipe-delimited path naming the producer. Example: `SuperDomain|host-001|Custom Metric Process|Custom Metric Agent`.
26
+ - `metric.path` — pipe-delimited folder breadcrumb ending with `:<metric-name>`. Example: `Beans|Nass Reactive Client|Store|Flush|Unregistered Queue:Concurrent Invocations`.
27
+
28
+ Together they uniquely identify the time-series.
29
+
30
+ ## The user's `<resource>:<metric>` framing
31
+
32
+ When a user says "the `CheckoutBT:Average Response Time` metric", they're using conventional shorthand: the *resource* is the path-without-the-name, and the *metric name* is the segment after the final `:`. To map to a query:
33
+
34
+ 1. The resource maps to the path's pipe-delimited prefix.
35
+ 2. The metric name maps to the segment after `:`.
36
+ 3. The source is whatever agent or producer is reporting it (often inferable from the path's first segment, but not always).
37
+
38
+ `cookbooks/metric-source-names` and `cookbooks/metrics-grounding` cover this in detail.
39
+
40
+ ## Pitfalls
41
+
42
+ - Don't author NASSQL queries with `metric.attribute` — the working column name in modern NASSQL is `metric.path`. Older docs may still say `attribute`.
43
+ - The path's `:` separator is **not** in the source. Sources don't have `:` segments; paths do.
44
+ - Some metrics have empty resource paths and a bare metric name; those are usually agent-level rollups.
45
+
46
+ ## How users phrase it
47
+
48
+ - "the response-time metric" → metric name (the leaf).
49
+ - "the resource" → folder breadcrumb (the path prefix).
50
+ - "the attribute" → ambiguous: vertex attribute? metric attribute? Always confirm.
51
+
52
+ ## See also
53
+
54
+ - `cookbooks/metric-source-names` — pipe-delimited source name anatomy.
55
+ - `cookbooks/metrics-grounding` — semantic layer for metrics.
56
+ - `cookbooks/mm-cookbook` — full MM specifier reference.
@@ -0,0 +1,12 @@
1
+ <script
2
+ type="text/javascript"
3
+ id="ca_eum_ba"
4
+ src="${app.collectorURL}/api/1/urn:ca:tenantId:${app.tenantId}/urn:ca:appId:${app.appId}/bajs?agent=browser"
5
+ data-profileUrl="${app.collectorURL}/api/1/urn:ca:tenantId:${app.tenantId}/urn:ca:appId:${app.appId}/profile?agent=browser"
6
+ data-tenantID="${app.tenantId}"
7
+ data-appID="${app.appId}"
8
+ data-appVersion="1.0"
9
+ data-use-axa-appname="true"
10
+ data-appKey="${app.appKey}"
11
+ async
12
+ ></script>