@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,78 @@
|
|
|
1
|
+
# dx-do bulk-vertex-patch
|
|
2
|
+
|
|
3
|
+
The bulk vertex patch command ('vertex bulk-patch') is intended to ingest large
|
|
4
|
+
amounts of attribute data from a json file, which will usually be generated by another script.
|
|
5
|
+
|
|
6
|
+
The format of the json file is described in a json schema that is accessible with the bulk-patch-schema command (vertex bulk-patch-schema).
|
|
7
|
+
|
|
8
|
+
The top level of a bulk vertex patch is an object with three properties
|
|
9
|
+
|
|
10
|
+
* **patchFilter**: a dictionary of attributeNames -> attributeValues. Only objects that match this filter may be patched, regardless of the specific patch matching filters.
|
|
11
|
+
* **hostnameConfiguration**: default domain names for the source and vertex, to allow matching when the source or the vertex has a FQDN
|
|
12
|
+
* **patches**: a list of patches, which are defined by attribute matching rules, new attributes to apply to matching vertices, and whether to overwrite existing attribute values.
|
|
13
|
+
|
|
14
|
+
Here is a boilerplate bulk-patch file that defines a single patch.
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"patchFilter": {
|
|
18
|
+
"<attributeName1>": "<attributeValue>",
|
|
19
|
+
"<attributeName2>": "<attributeValue>"
|
|
20
|
+
},
|
|
21
|
+
"hostnameConfiguration": {
|
|
22
|
+
"patchHostDefaultDomain": "<.domain.name.com>",
|
|
23
|
+
"vertexHostDefaultDomain": "<.domain.name.com>"
|
|
24
|
+
},
|
|
25
|
+
"patches": [
|
|
26
|
+
{
|
|
27
|
+
"matches": [
|
|
28
|
+
{
|
|
29
|
+
"matchType": "DEFAULT_DOMAIN_MAPPING_HOST",
|
|
30
|
+
"attributeName": "hostname",
|
|
31
|
+
"matchValue": "lvnkprod010365"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"newAttributeValues": {
|
|
35
|
+
"cmdb.ci.app": "2124451"
|
|
36
|
+
},
|
|
37
|
+
"overwrite": false
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
###
|
|
45
|
+
|
|
46
|
+
| MatchType | Description |
|
|
47
|
+
| --- |------------------------------------------|
|
|
48
|
+
| DEFAULT_DOMAIN_MAPPING_HOST | see below |
|
|
49
|
+
| ATTRIBUTE_EXACT | matches the exact value of the attribute |
|
|
50
|
+
|ATTRIBUTE_PREFIX | matches the matchValue.* |
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### hostname configuration
|
|
54
|
+
|
|
55
|
+
> Note the DEFAULT_DOMAIN_MAPPING_HOST strategy can be used on any attribute that has hostname-like values.
|
|
56
|
+
|
|
57
|
+
If the patchHostDefaultDomain and the vertexHostDefaultDomain (both "domain.name.com") are the same, you will get the following match result:
|
|
58
|
+
|
|
59
|
+
| patch source | vertex attr value | match |
|
|
60
|
+
|-----------------------|-----------------------| --- |
|
|
61
|
+
| host1 | host1 | true |
|
|
62
|
+
| host1.domain.name.com | host1 | true |
|
|
63
|
+
| host1 | host1.domain.name.com | true |
|
|
64
|
+
| host1.another.domain | host1 | false |
|
|
65
|
+
| host1 | host1.another.domain | false |
|
|
66
|
+
|
|
67
|
+
If the patchHostDefaultDomain and the vertexHostDefaultDomain are different ("d1.com" vs "d2.com"), you will get the following match result:
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
| patch source (d1.com) | vertex attr value (d2.com) | match |
|
|
72
|
+
|-----------------------|----------------------------|-------|
|
|
73
|
+
| host1 | host1 | false |
|
|
74
|
+
| host1.d1.com | host1 | false |
|
|
75
|
+
| host1 | host1.d1.com | true |
|
|
76
|
+
| host1.d2.com | host1 | true |
|
|
77
|
+
|
|
78
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
SetFlag: ${flagName}
|
|
2
|
+
|
|
3
|
+
#IdentifyClassAs: <class> ${flagName}
|
|
4
|
+
#IdentifyInheritedAs: <class> ${flagName}
|
|
5
|
+
#IdentifyAnnotatedClassAs: <class> ${flagName}
|
|
6
|
+
#IdentifyDeepInheritedAs: <class> ${flagName}
|
|
7
|
+
#IdentifyClassAs: <class> ${flagName}
|
|
8
|
+
|
|
9
|
+
#TraceAnnotatedMethodsWithParametersIfFlagged: ${flagName} <AnnotationClass> BlamePointTracer "${metricRoot}|SubCategory"
|
|
10
|
+
#TraceComplexMethodsIfFlagged: ${flagName} BlamePointTracer "${metricRoot}|SubCategory"
|
|
11
|
+
#TraceComplexMethodsWithParametersIfFlagged: ${flagName} BlamePointTracer "${metricRoot}|SubCategory"
|
|
12
|
+
#TraceOneMethodIfFlagged: ${flagName} <method> BlamePointTracer "${metricRoot}|SubCategory"
|
|
13
|
+
#TraceOneMethodWithParametersIfFlagged: ${flagName} <method> BlamePointTracer "${metricRoot}|SubCategory"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: business_transaction
|
|
3
|
+
title: BUSINESSTRANSACTION — a named end-to-end APM transaction
|
|
4
|
+
layer: ATC
|
|
5
|
+
synonyms: [BT, transaction, business txn]
|
|
6
|
+
related_entities: [servlet, springservice, genericfrontend, agent, database]
|
|
7
|
+
related_cookbooks: [investigator-flow, metrics-grounding]
|
|
8
|
+
tags: [apm, universal]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# BUSINESSTRANSACTION
|
|
12
|
+
|
|
13
|
+
## What it is
|
|
14
|
+
|
|
15
|
+
A BUSINESSTRANSACTION (BT) is the APM agent's view of a complete end-to-end transaction — a logical unit of work that crosses code boundaries and often network boundaries. The BT name typically describes the user-facing behavior: `Login`, `Checkout`, `GetAccountSummary`, `ProcessOrder`. A single BT can show up across multiple frontends, servlets, and Spring services on its journey; the BT vertex is the unifying identity.
|
|
16
|
+
|
|
17
|
+
## Where it lives
|
|
18
|
+
|
|
19
|
+
`type=BUSINESSTRANSACTION` lives in the **ATC** layer. Filter on `applicationName` to narrow to a specific app. Most attributes are populated; the empirically-frequent set:
|
|
20
|
+
|
|
21
|
+
- `name`, `transactionName` — the BT's display label.
|
|
22
|
+
- `applicationName` — the APM application the BT belongs to.
|
|
23
|
+
- `agentDomain` — the agent's domain segment.
|
|
24
|
+
- `serviceId` — the DXO2 service id the agent is configured to feed (when set).
|
|
25
|
+
- `endUser` — synthetic-identifier or experience name (when configured).
|
|
26
|
+
- `processedBy`, `product` — provenance.
|
|
27
|
+
|
|
28
|
+
## Common uses
|
|
29
|
+
|
|
30
|
+
- **Performance triage** — "How is the checkout transaction performing?" Pull BT's own response time / errors-per-interval, then drill to the agent that produced it.
|
|
31
|
+
- **Application inventory** — list all BTs for `applicationName=X`. Cross-reference with the agents servicing that app.
|
|
32
|
+
- **End-to-end coverage** — BTs are the natural anchor for "this user flow is slow"; from a BT, traverse to the participating frontends/servlets/backends.
|
|
33
|
+
|
|
34
|
+
## How metrics are reported
|
|
35
|
+
|
|
36
|
+
BT metrics come from the **APM agent of the JVM (or Node, .NET, etc.) running the BT**, not from a global aggregator. To find them:
|
|
37
|
+
|
|
38
|
+
1. Identify the agent — either via `serviceId` ↔ DXI_SERVICE relationship, or by traversing TAS `agent-monitors` edges incident on the BT.
|
|
39
|
+
2. Query metric metadata under that agent's metric source. Path shape: `Frontends|<frontend-name>|<bt-name>:<metric>`. Common metric names: `Average Response Time (ms)`, `Errors Per Interval`, `Responses Per Interval`, `Stalls Per Interval`.
|
|
40
|
+
3. Reach time-series via NASSQL `FROM_DATA` with the discovered metric source / path.
|
|
41
|
+
|
|
42
|
+
When a BT shows up under more than one agent (e.g. multi-instance app), each agent reports its own slice — sum or average across agents in NASSQL with a `GROUP` step.
|
|
43
|
+
|
|
44
|
+
## Common synonyms / mistakes
|
|
45
|
+
|
|
46
|
+
- "Transaction" / "BT" / "business txn" — interchangeable in user phrasing.
|
|
47
|
+
- Don't confuse BT with `SERVLET`/`GENERICFRONTEND` — those are *touchpoints* the BT passes through. The BT is the logical end-to-end identity.
|
|
48
|
+
- Some agents report BT-level data without creating a BT vertex (low-traffic, sampling, or first-day-of-deploy). If a `vertex search` returns nothing, fall back to MM search by `applicationName` in the path.
|
|
49
|
+
|
|
50
|
+
## Related entities
|
|
51
|
+
|
|
52
|
+
- **SERVLET / GENERICFRONTEND / SPRINGSERVICE** — entry-point types the BT passes through. The BT often has `agent-monitors` edges back to one or more of these.
|
|
53
|
+
- **AGENT** — the producing collector; usually one agent per JVM hosting the BT.
|
|
54
|
+
- **DATABASE / INFERRED_DATABASE** — backends the BT calls; performance is split per-backend in BT detail metrics.
|
|
55
|
+
|
|
56
|
+
## See also
|
|
57
|
+
|
|
58
|
+
- `cookbooks/investigator-flow` — end-to-end question handling, including the BT-vs-frontend disambiguation.
|
|
59
|
+
- `cookbooks/metrics-grounding` — agent ↔ metric mapping when a BT has data but no obvious topology vertex.
|
|
60
|
+
- `entities/agent` — the producing AGENT side.
|
|
61
|
+
- `entities/servlet_or_frontend` — the entry-point cluster.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import{ca as $,da as c,ga as B,ia as N,ja as x,ka as r}from"./chunk-RNMHSXZF.js";import{Ab as j,Bb as P,Cc as H,Hb as S,Ib as R,Jb as V,Kb as z,La as a,Mb as E,Nb as w,Pc as L,R as h,Rc as W,S as v,Sb as O,Tc as q,U as b,Uc as M,Vb as s,W as p,Wb as G,Xb as Q,Za as k,_a as T,ba as A,bb as C,cb as I,db as l,dc as D,kb as g,na as d,tb as o,ub as u,vb as f,wb as _}from"./chunk-5VSFINOX.js";var J=`
|
|
2
|
+
.p-progressspinner {
|
|
3
|
+
position: relative;
|
|
4
|
+
margin: 0 auto;
|
|
5
|
+
width: 100px;
|
|
6
|
+
height: 100px;
|
|
7
|
+
display: inline-block;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.p-progressspinner::before {
|
|
11
|
+
content: '';
|
|
12
|
+
display: block;
|
|
13
|
+
padding-top: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.p-progressspinner-spin {
|
|
17
|
+
height: 100%;
|
|
18
|
+
transform-origin: center center;
|
|
19
|
+
width: 100%;
|
|
20
|
+
position: absolute;
|
|
21
|
+
top: 0;
|
|
22
|
+
bottom: 0;
|
|
23
|
+
left: 0;
|
|
24
|
+
right: 0;
|
|
25
|
+
margin: auto;
|
|
26
|
+
animation: p-progressspinner-rotate 2s linear infinite;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.p-progressspinner-circle {
|
|
30
|
+
stroke-dasharray: 89, 200;
|
|
31
|
+
stroke-dashoffset: 0;
|
|
32
|
+
stroke: dt('progressspinner.colorOne');
|
|
33
|
+
animation:
|
|
34
|
+
p-progressspinner-dash 1.5s ease-in-out infinite,
|
|
35
|
+
p-progressspinner-color 6s ease-in-out infinite;
|
|
36
|
+
stroke-linecap: round;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@keyframes p-progressspinner-rotate {
|
|
40
|
+
100% {
|
|
41
|
+
transform: rotate(360deg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
@keyframes p-progressspinner-dash {
|
|
45
|
+
0% {
|
|
46
|
+
stroke-dasharray: 1, 200;
|
|
47
|
+
stroke-dashoffset: 0;
|
|
48
|
+
}
|
|
49
|
+
50% {
|
|
50
|
+
stroke-dasharray: 89, 200;
|
|
51
|
+
stroke-dashoffset: -35px;
|
|
52
|
+
}
|
|
53
|
+
100% {
|
|
54
|
+
stroke-dasharray: 89, 200;
|
|
55
|
+
stroke-dashoffset: -124px;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
@keyframes p-progressspinner-color {
|
|
59
|
+
100%,
|
|
60
|
+
0% {
|
|
61
|
+
stroke: dt('progressspinner.color.one');
|
|
62
|
+
}
|
|
63
|
+
40% {
|
|
64
|
+
stroke: dt('progressspinner.color.two');
|
|
65
|
+
}
|
|
66
|
+
66% {
|
|
67
|
+
stroke: dt('progressspinner.color.three');
|
|
68
|
+
}
|
|
69
|
+
80%,
|
|
70
|
+
90% {
|
|
71
|
+
stroke: dt('progressspinner.color.four');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`;var te={root:()=>["p-progressspinner"],spin:"p-progressspinner-spin",circle:"p-progressspinner-circle"},K=(()=>{class e extends B{name="progressspinner";style=J;classes=te;static \u0275fac=(()=>{let t;return function(n){return(t||(t=d(e)))(n||e)}})();static \u0275prov=h({token:e,factory:e.\u0275fac})}return e})();var U=new b("PROGRESSSPINNER_INSTANCE"),ie=(()=>{class e extends x{componentName="ProgressSpinner";$pcProgressSpinner=p(U,{optional:!0,skipSelf:!0})??void 0;bindDirectiveInstance=p(r,{self:!0});styleClass;strokeWidth="2";fill="none";animationDuration="2s";ariaLabel;onAfterViewChecked(){this.bindDirectiveInstance.setAttrs(this.ptms(["host","root"]))}_componentStyle=p(K);static \u0275fac=(()=>{let t;return function(n){return(t||(t=d(e)))(n||e)}})();static \u0275cmp=k({type:e,selectors:[["p-progressSpinner"],["p-progress-spinner"],["p-progressspinner"]],hostVars:5,hostBindings:function(i,n){i&2&&(g("aria-label",n.ariaLabel)("role","progressbar")("aria-busy",!0),s(n.cn(n.cx("root"),n.styleClass)))},inputs:{styleClass:"styleClass",strokeWidth:"strokeWidth",fill:"fill",animationDuration:"animationDuration",ariaLabel:"ariaLabel"},features:[D([K,{provide:U,useExisting:e},{provide:N,useExisting:e}]),C([r]),I],decls:2,vars:10,consts:[["viewBox","25 25 50 50",3,"pBind"],["cx","50","cy","50","r","20","stroke-miterlimit","10",3,"pBind"]],template:function(i,n){i&1&&(A(),u(0,"svg",0),_(1,"circle",1),f()),i&2&&(s(n.cx("spin")),O("animation-duration",n.animationDuration),o("pBind",n.ptm("spin")),a(),s(n.cx("circle")),o("pBind",n.ptm("circle")),g("fill",n.fill)("stroke-width",n.strokeWidth))},dependencies:[M,c,r],encapsulation:2,changeDetection:0})}return e})(),Me=(()=>{class e{static \u0275fac=function(i){return new(i||e)};static \u0275mod=T({type:e});static \u0275inj=v({imports:[ie,c,c]})}return e})();var X=`
|
|
75
|
+
.p-tag {
|
|
76
|
+
display: inline-flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
background: dt('tag.primary.background');
|
|
80
|
+
color: dt('tag.primary.color');
|
|
81
|
+
font-size: dt('tag.font.size');
|
|
82
|
+
font-weight: dt('tag.font.weight');
|
|
83
|
+
padding: dt('tag.padding');
|
|
84
|
+
border-radius: dt('tag.border.radius');
|
|
85
|
+
gap: dt('tag.gap');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.p-tag-icon {
|
|
89
|
+
font-size: dt('tag.icon.size');
|
|
90
|
+
width: dt('tag.icon.size');
|
|
91
|
+
height: dt('tag.icon.size');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.p-tag-rounded {
|
|
95
|
+
border-radius: dt('tag.rounded.border.radius');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.p-tag-success {
|
|
99
|
+
background: dt('tag.success.background');
|
|
100
|
+
color: dt('tag.success.color');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.p-tag-info {
|
|
104
|
+
background: dt('tag.info.background');
|
|
105
|
+
color: dt('tag.info.color');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.p-tag-warn {
|
|
109
|
+
background: dt('tag.warn.background');
|
|
110
|
+
color: dt('tag.warn.color');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.p-tag-danger {
|
|
114
|
+
background: dt('tag.danger.background');
|
|
115
|
+
color: dt('tag.danger.color');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.p-tag-secondary {
|
|
119
|
+
background: dt('tag.secondary.background');
|
|
120
|
+
color: dt('tag.secondary.color');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.p-tag-contrast {
|
|
124
|
+
background: dt('tag.contrast.background');
|
|
125
|
+
color: dt('tag.contrast.color');
|
|
126
|
+
}
|
|
127
|
+
`;var oe=["icon"],re=["*"];function ae(e,m){if(e&1&&_(0,"span",4),e&2){let t=S(2);s(t.cx("icon")),o("ngClass",t.icon)("pBind",t.ptm("icon"))}}function se(e,m){if(e&1&&(j(0),l(1,ae,1,4,"span",3),P()),e&2){let t=S();a(),o("ngIf",t.icon)}}function pe(e,m){}function ce(e,m){e&1&&l(0,pe,0,0,"ng-template")}function de(e,m){if(e&1&&(u(0,"span",2),l(1,ce,1,0,null,5),f()),e&2){let t=S();s(t.cx("icon")),o("pBind",t.ptm("icon")),a(),o("ngTemplateOutlet",t.iconTemplate||t._iconTemplate)}}var le={root:({instance:e})=>["p-tag p-component",{"p-tag-info":e.severity==="info","p-tag-success":e.severity==="success","p-tag-warn":e.severity==="warn","p-tag-danger":e.severity==="danger","p-tag-secondary":e.severity==="secondary","p-tag-contrast":e.severity==="contrast","p-tag-rounded":e.rounded}],icon:"p-tag-icon",label:"p-tag-label"},Y=(()=>{class e extends B{name="tag";style=X;classes=le;static \u0275fac=(()=>{let t;return function(n){return(t||(t=d(e)))(n||e)}})();static \u0275prov=h({token:e,factory:e.\u0275fac})}return e})();var Z=new b("TAG_INSTANCE"),ge=(()=>{class e extends x{componentName="Tag";$pcTag=p(Z,{optional:!0,skipSelf:!0})??void 0;bindDirectiveInstance=p(r,{self:!0});onAfterViewChecked(){this.bindDirectiveInstance.setAttrs(this.ptms(["host","root"]))}styleClass;severity;value;icon;rounded;iconTemplate;templates;_iconTemplate;_componentStyle=p(Y);onAfterContentInit(){this.templates?.forEach(t=>{t.getType()==="icon"&&(this._iconTemplate=t.template)})}get dataP(){return this.cn({rounded:this.rounded,[this.severity]:this.severity})}static \u0275fac=(()=>{let t;return function(n){return(t||(t=d(e)))(n||e)}})();static \u0275cmp=k({type:e,selectors:[["p-tag"]],contentQueries:function(i,n,F){if(i&1&&z(F,oe,4)(F,$,4),i&2){let y;E(y=w())&&(n.iconTemplate=y.first),E(y=w())&&(n.templates=y)}},hostVars:3,hostBindings:function(i,n){i&2&&(g("data-p",n.dataP),s(n.cn(n.cx("root"),n.styleClass)))},inputs:{styleClass:"styleClass",severity:"severity",value:"value",icon:"icon",rounded:[2,"rounded","rounded",H]},features:[D([Y,{provide:Z,useExisting:e},{provide:N,useExisting:e}]),C([r]),I],ngContentSelectors:re,decls:5,vars:6,consts:[[4,"ngIf"],[3,"class","pBind",4,"ngIf"],[3,"pBind"],[3,"class","ngClass","pBind",4,"ngIf"],[3,"ngClass","pBind"],[4,"ngTemplateOutlet"]],template:function(i,n){i&1&&(R(),V(0),l(1,se,2,1,"ng-container",0)(2,de,2,4,"span",1),u(3,"span",2),G(4),f()),i&2&&(a(),o("ngIf",!n.iconTemplate&&!n._iconTemplate),a(),o("ngIf",n.iconTemplate||n._iconTemplate),a(),s(n.cx("label")),o("pBind",n.ptm("label")),a(),Q(n.value))},dependencies:[M,L,W,q,c,r],encapsulation:2,changeDetection:0})}return e})(),qe=(()=>{class e{static \u0275fac=function(i){return new(i||e)};static \u0275mod=T({type:e});static \u0275inj=v({imports:[ge,c,c]})}return e})();export{ge as a,qe as b,ie as c,Me as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as P,b as T,c as ee,d as ne}from"./chunk-4I3HBO6U.js";import{Ea as E,Ga as k,Ka as Q,La as Z,ua as W,va as q}from"./chunk-RNMHSXZF.js";import{$ as M,Cb as z,Db as w,Fb as D,Hb as l,La as a,R as X,Rb as j,Tb as J,Tc as U,W as x,Wb as s,Xb as u,Yb as _,Za as C,aa as N,bd as H,db as Y,fc as $,g as A,ka as O,nb as p,ob as g,oc as K,pb as G,rb as h,rc as f,sb as S,tb as c,ub as r,vb as o,wb as m}from"./chunk-5VSFINOX.js";var le=Object.freeze({error:0,warning:0,recommendation:0,info:0}),y=class t{api=x(H);report=O(null);loading=O(!1);error=O(null);selectedServiceName=O(null);hasReport=f(()=>this.report()!==null);isEmpty=f(()=>{let n=this.report();return n!==null&&n.totalDxo2Services===0});findingCountsBySeverity=f(()=>this.report()?.findingCountsBySeverity??le);selectedNode=f(()=>{let n=this.report(),e=this.selectedServiceName();return!n||!e?null:n.nodesByName[e]??null});load(){return A(this,null,function*(){if(!this.loading()){this.loading.set(!0),this.error.set(null);try{let n=yield this.api.getServiceDiagnostics();this.report.set(n);let e=this.selectedServiceName();e&&!n.nodesByName[e]&&this.selectedServiceName.set(null)}catch(n){this.error.set(n.message??"Failed to load service diagnostics"),this.report.set(null)}finally{this.loading.set(!1)}}})}select(n){this.selectedServiceName.set(n)}static \u0275fac=function(e){return new(e||t)};static \u0275prov=X({token:t,factory:t.\u0275fac,providedIn:"root"})};var I=class t{store=x(y);static \u0275fac=function(e){return new(e||t)};static \u0275cmp=C({type:t,selectors:[["dx-service-summary-bar"]],decls:23,vars:6,consts:[[1,"dx-summary-bar"],[1,"dx-summary-cell"],[1,"dx-summary-label"],[1,"dx-summary-value"],[1,"dx-summary-cell","dx-summary-cell--findings"],[1,"dx-summary-tags"],["severity","danger",3,"value"],["severity","warn",3,"value"],["severity","info",3,"value"]],template:function(e,i){if(e&1&&(r(0,"div",0)(1,"div",1)(2,"span",2),s(3,"DXO2 services"),o(),r(4,"span",3),s(5),o()(),r(6,"div",1)(7,"span",2),s(8,"Leaf services without entities"),o(),r(9,"span",3),s(10),o()(),r(11,"div",1)(12,"span",2),s(13,"Top-level roots"),o(),r(14,"span",3),s(15),o()(),r(16,"div",4)(17,"span",2),s(18,"Findings"),o(),r(19,"div",5),m(20,"p-tag",6)(21,"p-tag",7)(22,"p-tag",8),o()()()),e&2){let d,v,b;a(5),u(((d=i.store.report())==null?null:d.totalDxo2Services)??0),a(5),_(" ",((v=i.store.report())==null?null:v.totalLeafServicesWithoutEntities)??0," "),a(5),_(" ",((b=i.store.report())==null||b.topLevelNames==null?null:b.topLevelNames.length)??0," "),a(5),c("value","errors: "+(i.store.findingCountsBySeverity().error??0)),a(),c("value","warnings: "+(i.store.findingCountsBySeverity().warning??0)),a(),c("value","recommendations: "+(i.store.findingCountsBySeverity().recommendation??0))}},dependencies:[T,P],styles:["[_nghost-%COMP%]{display:block}.dx-summary-bar[_ngcontent-%COMP%]{display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;padding:.75rem 1rem;border:1px solid var(--p-content-border-color, #2a2a2a);border-radius:6px;background:var(--p-content-background, transparent)}.dx-summary-cell[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.25rem}.dx-summary-cell--findings[_ngcontent-%COMP%]{margin-left:auto}.dx-summary-label[_ngcontent-%COMP%]{font-size:.7rem;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color, #888)}.dx-summary-value[_ngcontent-%COMP%]{font-size:1.25rem;font-weight:600}.dx-summary-tags[_ngcontent-%COMP%]{display:flex;gap:.4rem;flex-wrap:wrap}"],changeDetection:0})};var ie=t=>({$implicit:t}),ce=(t,n)=>n.key,me=(t,n)=>n.severity;function pe(t,n){if(t&1&&(r(0,"div",1),z(1,2),o()),t&2){let e=n.$implicit;l();let i=j(3);a(),c("ngTemplateOutlet",i)("ngTemplateOutletContext",$(2,ie,e))}}function ge(t,n){t&1&&m(0,"p-tag",7)}function ue(t,n){if(t&1&&m(0,"p-tag",8),t&2){let e=n.$implicit,i=l(2);c("severity",i.severityToTag(e.severity))("value",e.severity+": "+e.count)("pTooltip",e.ruleCodes.join(", "))}}function ve(t,n){if(t&1&&z(0,2),t&2){let e=n.$implicit;l(3);let i=j(3);c("ngTemplateOutlet",i)("ngTemplateOutletContext",$(2,ie,e))}}function fe(t,n){if(t&1&&(r(0,"div",9),h(1,ve,1,4,"ng-container",2,G),o()),t&2){let e=l().$implicit;a(),S(e.children)}}function xe(t,n){if(t&1){let e=w();r(0,"div",3),D("click",function(d){let v=M(e).$implicit,b=l();return N(b.onClick(d,v))}),r(1,"div",4)(2,"span",5),s(3),o(),m(4,"p-tag",6),p(5,ge,1,0,"p-tag",7),h(6,ue,1,3,"p-tag",8,me),o(),p(8,fe,3,0,"div",9),o()}if(t&2){let e=n.$implicit,i=l();J("dx-svc-node--selected",i.store.selectedServiceName()===e.key),a(3),u(e.name),a(),c("value",e.entityCount+" entities"),a(),g(e.multiParent?5:-1),a(),S(e.severityChips),a(2),g(e.children.length>0?8:-1)}}var ye=["error","warning","recommendation","info"],_e={error:"danger",warning:"warn",recommendation:"info",info:"secondary"},B=class t{store=x(y);trees=f(()=>{let n=this.store.report();if(!n)return[];let e=i=>{let d=n.nodesByName[i],v=d?.name??i,b=d?.entityCount??0,L=d?.findings??[],re=Ce(L),ae=(d?.parentNames.length??0)>1,se=(n.childrenByName[i]??[]).map(de=>e(de));return{key:i,name:v,entityCount:b,findings:L,severityChips:re,multiParent:ae,children:se}};return n.topLevelNames.map(i=>e(i))});severityToTag(n){return _e[n]??"secondary"}onClick(n,e){n.stopPropagation(),this.store.select(e.key)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=C({type:t,selectors:[["dx-service-tree"]],decls:4,vars:0,consts:[["nodeTemplate",""],[1,"dx-svc-tree-root"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"dx-svc-node",3,"click"],[1,"dx-svc-row"],[1,"dx-svc-name"],["severity","info","styleClass","dx-svc-count",3,"value"],["severity","secondary","value","multi-parent","styleClass","dx-svc-multi"],["tooltipPosition","top","styleClass","dx-svc-finding",3,"severity","value","pTooltip"],[1,"dx-svc-children"]],template:function(e,i){e&1&&(h(0,pe,2,4,"div",1,ce),Y(2,xe,9,6,"ng-template",null,0,K)),e&2&&S(i.trees())},dependencies:[U,T,P,Z,Q],styles:["[_nghost-%COMP%]{display:block}.dx-svc-tree-root[_ngcontent-%COMP%]{margin-bottom:.75rem}.dx-svc-node[_ngcontent-%COMP%]{cursor:pointer;padding:.25rem .4rem;border-radius:4px;transition:background-color 60ms ease-out}.dx-svc-node[_ngcontent-%COMP%]:hover > .dx-svc-row[_ngcontent-%COMP%]{background:var(--p-highlight-bg, rgba(120, 160, 240, .08))}.dx-svc-node--selected[_ngcontent-%COMP%] > .dx-svc-row[_ngcontent-%COMP%]{background:var(--p-highlight-bg, rgba(120, 160, 240, .18));outline:1px solid var(--p-primary-color, #6ea0ff)}.dx-svc-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap;padding:.25rem .5rem;border-radius:4px}.dx-svc-name[_ngcontent-%COMP%]{font-weight:500}.dx-svc-children[_ngcontent-%COMP%]{margin-left:1.25rem;border-left:1px dashed var(--p-content-border-color, #444);padding-left:.5rem}"],changeDetection:0})};function Ce(t){if(t.length===0)return[];let n=new Map;for(let i of t){let d=n.get(i.severity);d||(d=new Set,n.set(i.severity,d)),d.add(i.ruleCode)}let e=[];for(let i of ye){let d=n.get(i);!d||d.size===0||e.push({severity:i,count:d.size,ruleCodes:[...d].sort()})}return e}var he=(t,n)=>n.ruleCode,Se=(t,n)=>n.ruleCode+"::"+n.subjectId;function De(t,n){t&1&&s(0),t&2&&_(" ",n.name," ")}function Pe(t,n){t&1&&s(0," All findings ")}function Te(t,n){if(t&1){let e=w();r(0,"button",4),D("click",function(){M(e);let d=l();return N(d.onClearSelection())}),o()}}function Me(t,n){t&1&&(r(0,"p",8),s(1,"No findings for this service."),o())}function Ne(t,n){if(t&1&&(r(0,"details",14)(1,"summary"),s(2,"Detail"),o(),r(3,"pre"),s(4),o()()),t&2){let e=l().$implicit,i=l(3);a(4),u(i.formatDetail(e.detail))}}function Oe(t,n){if(t&1&&(r(0,"article",9)(1,"div",10),m(2,"p-tag",11),r(3,"code",12),s(4),o()(),r(5,"p",13),s(6),o(),p(7,Ne,5,1,"details",14),o()),t&2){let e=n.$implicit,i=l(3);a(2),c("severity",i.severityTag(e.severity))("value",e.severity),a(2),u(e.ruleCode),a(2),u(e.message),a(),g(e.detail?7:-1)}}function we(t,n){if(t&1&&h(0,Oe,8,5,"article",9,he),t&2){let e=l();S(e.findings)}}function Ee(t,n){if(t&1&&(r(0,"div",3)(1,"div",5)(2,"span",6),s(3,"Direct entities:"),o(),r(4,"span",7),s(5),o()(),r(6,"div",5)(7,"span",6),s(8),o(),r(9,"span",7),s(10),o()(),r(11,"div",5)(12,"span",6),s(13),o(),r(14,"span",7),s(15),o()(),m(16,"hr"),p(17,Me,2,0,"p",8)(18,we,2,0),o()),t&2){let e=n,i=l();a(5),u(e.entityCount),a(3),_("Parents (",e.parentNames.length,"):"),a(2),_(" ",i.parentDisplayNames()," "),a(3),_("Children (",e.childNames.length,"):"),a(2),_(" ",i.childDisplayNames()," "),a(2),g(e.findings.length===0?17:18)}}function ke(t,n){t&1&&(r(0,"p",8),s(1,"No findings on this tenant."),o())}function Fe(t,n){if(t&1){let e=w();r(0,"article",16),D("click",function(){let d=M(e).$implicit,v=l(3);return N(v.onJumpTo(d))}),r(1,"div",10),m(2,"p-tag",11),r(3,"code",12),s(4),o(),r(5,"span",17),s(6),o()(),r(7,"p",13),s(8),o()()}if(t&2){let e=n.$implicit,i=l(3);a(2),c("severity",i.severityTag(e.severity))("value",e.severity),a(2),u(e.ruleCode),a(2),u(e.subjectName),a(2),u(e.message)}}function Ie(t,n){if(t&1&&h(0,Fe,9,5,"article",15,Se),t&2){let e=l(2);S(e.allFindings())}}function Be(t,n){if(t&1&&(r(0,"div",3),p(1,ke,2,0,"p",8)(2,Ie,2,0),o()),t&2){let e=l();a(),g(e.allFindings().length===0?1:2)}}var Re={error:"danger",warning:"warn",recommendation:"info",info:"secondary"},R=class t{store=x(y);selectedNode=f(()=>this.store.selectedNode());allFindings=f(()=>this.store.report()?.findings??[]);parentDisplayNames=f(()=>{let n=this.store.report(),e=this.selectedNode();return!n||!e?"\u2014":e.parentNames.length===0?"(top-level)":e.parentNames.map(i=>n.nodesByName[i]?.name??i).join(", ")});childDisplayNames=f(()=>{let n=this.store.report(),e=this.selectedNode();return!n||!e?"\u2014":e.childNames.length===0?"(none)":e.childNames.map(i=>n.nodesByName[i]?.name??i).join(", ")});severityTag(n){return Re[n]??"secondary"}formatDetail(n){return JSON.stringify(n,null,2)}onClearSelection(){this.store.select(null)}onJumpTo(n){let e=this.store.report();if(!e)return;let i=null;for(let[d,v]of Object.entries(e.nodesByName))if(v.id===n.subjectId){i=d;break}this.store.select(i)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=C({type:t,selectors:[["dx-service-finding-panel"]],decls:8,vars:3,consts:[[1,"dx-finding-panel"],[1,"dx-finding-panel-header"],["pButton","","type","button","icon","pi pi-times","severity","secondary","text","","rounded","","size","small","ariaLabel","Clear selection"],[1,"dx-finding-panel-body"],["pButton","","type","button","icon","pi pi-times","severity","secondary","text","","rounded","","size","small","ariaLabel","Clear selection",3,"click"],[1,"dx-finding-meta"],[1,"dx-finding-meta-label"],[1,"dx-finding-meta-value"],[1,"dx-finding-empty"],[1,"dx-finding-card"],[1,"dx-finding-card-head"],["styleClass","dx-finding-sev",3,"severity","value"],[1,"dx-finding-code"],[1,"dx-finding-message"],[1,"dx-finding-detail"],[1,"dx-finding-card","dx-finding-card--clickable"],[1,"dx-finding-card","dx-finding-card--clickable",3,"click"],[1,"dx-finding-service"]],template:function(e,i){if(e&1&&(r(0,"div",0)(1,"header",1)(2,"h2"),p(3,De,1,1)(4,Pe,1,0),o(),p(5,Te,1,0,"button",2),o(),p(6,Ee,19,6,"div",3)(7,Be,3,1,"div",3),o()),e&2){let d,v;a(3),g((d=i.selectedNode())?3:4,d),a(2),g(i.selectedNode()?5:-1),a(),g((v=i.selectedNode())?6:7,v)}},dependencies:[T,P,k,E],styles:["[_nghost-%COMP%]{display:block;height:100%}.dx-finding-panel[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.dx-finding-panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.75rem 1rem;border-bottom:1px solid var(--p-content-border-color, #2a2a2a)}.dx-finding-panel-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:1rem;font-weight:600;word-break:break-word}.dx-finding-panel-body[_ngcontent-%COMP%]{flex:1;overflow:auto;padding:.75rem 1rem;display:flex;flex-direction:column;gap:.5rem}.dx-finding-meta[_ngcontent-%COMP%]{display:flex;gap:.5rem;font-size:.8rem;word-break:break-word}.dx-finding-meta-label[_ngcontent-%COMP%]{color:var(--p-text-muted-color, #888);flex-shrink:0}.dx-finding-meta-value[_ngcontent-%COMP%]{flex:1}.dx-finding-empty[_ngcontent-%COMP%]{color:var(--p-text-muted-color, #888);font-style:italic;margin:0}hr[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--p-content-border-color, #2a2a2a);margin:.5rem 0}.dx-finding-card[_ngcontent-%COMP%]{border:1px solid var(--p-content-border-color, #2a2a2a);border-radius:4px;padding:.5rem .75rem;display:flex;flex-direction:column;gap:.4rem}.dx-finding-card--clickable[_ngcontent-%COMP%]{cursor:pointer;transition:background-color 60ms ease-out}.dx-finding-card--clickable[_ngcontent-%COMP%]:hover{background:var(--p-highlight-bg, rgba(120, 160, 240, .08))}.dx-finding-card-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.dx-finding-code[_ngcontent-%COMP%]{font-family:var(--p-font-family-monospace, ui-monospace, monospace);font-size:.75rem}.dx-finding-service[_ngcontent-%COMP%]{font-weight:500;font-size:.85rem}.dx-finding-message[_ngcontent-%COMP%]{margin:0;font-size:.85rem;line-height:1.35}.dx-finding-detail[_ngcontent-%COMP%]{font-size:.75rem}.dx-finding-detail[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{background:var(--p-surface-100, rgba(255, 255, 255, .04));padding:.4rem .5rem;border-radius:3px;white-space:pre-wrap;word-break:break-word;max-height:16rem;overflow:auto}"],changeDetection:0})};function ze(t,n){t&1&&(r(0,"p-message",6),s(1),o()),t&2&&(c("closable",!1),a(),u(n))}function je(t,n){t&1&&(r(0,"div",7),m(1,"p-progressspinner",8),r(2,"span"),s(3,"Running service diagnostics audit\u2026"),o()())}function $e(t,n){t&1&&(r(0,"p-message",9),s(1," No DXO2 services found on this tenant. Diagnostics has nothing to analyze yet. "),o()),t&2&&c("closable",!1)}function Ve(t,n){t&1&&(m(0,"dx-service-summary-bar"),r(1,"div",10)(2,"div",11),m(3,"dx-service-tree"),o(),r(4,"div",12),m(5,"dx-service-finding-panel"),o()())}function Le(t,n){if(t&1&&p(0,$e,2,1,"p-message",9)(1,Ve,6,0),t&2){let e=l();g(e.store.isEmpty()?0:1)}}var oe=class t{store=x(y);ngOnInit(){this.store.hasReport()||this.store.load()}onRefresh(){this.store.load()}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=C({type:t,selectors:[["dx-service-diagnostics-page"]],decls:12,vars:3,consts:[[1,"dx-diagnostics-page"],[1,"dx-diagnostics-header"],[1,"dx-diagnostics-title"],[1,"dx-diagnostics-blurb"],[1,"dx-diagnostics-actions"],["pButton","","type","button","icon","pi pi-refresh","label","Run audit",3,"click","loading"],["severity","error",3,"closable"],[1,"dx-diagnostics-loading"],["ariaLabel","Loading diagnostics"],["severity","info",3,"closable"],[1,"dx-diagnostics-body"],[1,"dx-diagnostics-trees"],[1,"dx-diagnostics-panel"]],template:function(e,i){if(e&1&&(r(0,"section",0)(1,"header",1)(2,"div",2)(3,"h1"),s(4,"DXO2 Service Diagnostics"),o(),r(5,"p",3),s(6," Audits the bound tenant's DXO2 service organization and surfaces findings per service. Multi-parent services appear under every parent. "),o()(),r(7,"div",4)(8,"button",5),D("click",function(){return i.onRefresh()}),o()()(),p(9,ze,2,2,"p-message",6),p(10,je,4,0,"div",7)(11,Le,2,1),o()),e&2){let d;a(8),c("loading",i.store.loading()),a(),g((d=i.store.error())?9:-1,d),a(),g(i.store.loading()&&!i.store.hasReport()?10:i.store.hasReport()?11:-1)}},dependencies:[k,E,q,W,ne,ee,I,B,R],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.dx-diagnostics-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0;padding:1.25rem 1.5rem;gap:1rem}.dx-diagnostics-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.dx-diagnostics-title[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0 0 .25rem;font-size:1.4rem;font-weight:600}.dx-diagnostics-blurb[_ngcontent-%COMP%]{margin:0;color:var(--p-text-muted-color, #888);font-size:.85rem;max-width:60ch}.dx-diagnostics-actions[_ngcontent-%COMP%]{flex-shrink:0}.dx-diagnostics-loading[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:1rem;color:var(--p-text-muted-color, #888)}.dx-diagnostics-body[_ngcontent-%COMP%]{flex:1;display:grid;grid-template-columns:minmax(0,1fr) 22rem;gap:1rem;min-height:0;overflow:hidden}.dx-diagnostics-trees[_ngcontent-%COMP%]{overflow:auto;border:1px solid var(--p-content-border-color, #2a2a2a);border-radius:6px;padding:.75rem .5rem;background:var(--p-content-background, transparent)}.dx-diagnostics-panel[_ngcontent-%COMP%]{overflow:auto;border:1px solid var(--p-content-border-color, #2a2a2a);border-radius:6px;background:var(--p-content-background, transparent)}"],changeDetection:0})};export{oe as ServiceDiagnosticsPageComponent};
|