diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index c4b9012..827570f 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -22,6 +22,10 @@ jobs: bash -n "$script" done < <(find scripts -maxdepth 1 -type f -name '*.sh' | sort) + - name: Dashboard reference validation + shell: bash + run: python3 scripts/validate-dashboard-reference.py + - name: Version invariants shell: bash run: | diff --git a/README.md b/README.md index 3d1819d..ec1b8df 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This implementation replaces the repository's former SigNoz/Grafana experiment. | Kubernetes | OpenTelemetry Collector Contrib | 0.156.0 | OTLP gateway, Kubernetes enrichment, and signal routing | | Kubernetes | Fluent Bit | 4.1.0 | Container stdout collection for workloads not exporting OTLP logs | | Processing | Data Prepper | 2.16.0 | Trace/log ingestion and v2 service-map generation | -| Metrics | Prometheus | 3.14.0 | Metrics storage, RED rules, SLO calculations, and reporting metrics | +| Metrics | Prometheus | 3.14.0 | Metrics storage, remote-write ingestion, alert evaluation, and optional derived/reporting rules | | Alerting | Alertmanager | 0.31.1 | Alert routing and notification delivery | | Host metrics | node_exporter | 1.12.1 | Linux host CPU, memory, disk, filesystem, network, load, and uptime metrics | | Host processes | process-exporter | 0.8.7 | Selected process-level metrics on the observability host | @@ -69,7 +69,7 @@ Every Java container must run exactly one OpenTelemetry Java agent. Applications exporting logs directly through OTLP use `fluentbit.io/exclude: "true"` to prevent Fluent Bit from sending an uncorrelated duplicate. -See [Kubernetes Telemetry Onboarding](docs/05-kubernetes-telemetry-onboarding.md) for both manifests, the double-agent guardrail, validation, and rollback. +See [Kubernetes Telemetry Onboarding](docs/05-kubernetes-telemetry-onboarding.md) for the in-cluster OpenTelemetry Collector/Operator manifests, the double-agent guardrail, validation, and rollback. Linux host metrics are onboarded separately with [node_exporter](docs/16-linux-host-metrics-onboarding.md). ## Repository layout @@ -92,7 +92,8 @@ See [Kubernetes Telemetry Onboarding](docs/05-kubernetes-telemetry-onboarding.md │ ├── 12-developer-search-standardization.md │ ├── 13-explore-log-datasets.md │ ├── 14-alerting-standard.md -│ └── 15-ubuntu-2404-cleanroom-qualification.md +│ ├── 15-ubuntu-2404-cleanroom-qualification.md +│ └── 16-linux-host-metrics-onboarding.md ├── evidence/ # Evidence policy; generated output stays local ├── kubernetes/ │ ├── collector/ # Collector, Service, RBAC, and configuration @@ -100,7 +101,7 @@ See [Kubernetes Telemetry Onboarding](docs/05-kubernetes-telemetry-onboarding.md │ ├── instrumentation/ # Shared opt-in Instrumentation resource │ └── operator/ # Pinned Operator Helm values ├── prometheus/ -│ └── rules/ # Platform alerts, RED, SLO, and report rules +│ └── rules/ # Standardized alerts plus optional recording/reporting rules ├── scripts/ │ └── validate-platform.sh # Read-only end-to-end acceptance checks ├── prometheus.yml # Remote-write receiver and local scrape baseline @@ -118,7 +119,7 @@ The functional lab has demonstrated: - a gateway-to-payment distributed trace and v2 service-map relationship; - trace- and span-correlated application logs; - duplicate-log prevention between OTLP and Fluent Bit; -- automatic Prometheus reporting discovery for newly instrumented services; +- automatic service-derived RED metric discovery for newly instrumented services; - request, 4xx, 5xx, latency, availability, and error-budget calculations; - a fresh Ubuntu 24.04.5 LTS dedicated-host clean-room bootstrap, secured activation, and five-minute runtime soak with all seven observability services healthy, all configured Prometheus targets UP, and zero unhealthy Prometheus rules. @@ -143,6 +144,7 @@ Read the repository in this order: 13. [Explore Logs Dataset Separation](docs/13-explore-log-datasets.md) 14. [Alerting Standard](docs/14-alerting-standard.md) 15. [Ubuntu 24.04 Clean-Room Qualification](docs/15-ubuntu-2404-cleanroom-qualification.md) +16. [Linux Host Metrics Onboarding](docs/16-linux-host-metrics-onboarding.md) ## Lab-only OpenSearch start diff --git a/config/reference.env.example b/config/reference.env.example index e7d9815..482a2db 100644 --- a/config/reference.env.example +++ b/config/reference.env.example @@ -28,3 +28,8 @@ ALERTMANAGER_TELEGRAM_CHAT_ID=123456789 ALERTMANAGER_TELEGRAM_TOKEN_FILE=/etc/alertmanager/secrets/telegram_bot_token KUBELET_BEARER_TOKEN_FILE=/run/secrets/kubelet_bearer_token + +# Live UAT receives span_derived RED metrics directly from Data Prepper. +# Enable only for environments that intentionally use the optional Prometheus +# recording/reporting-rule path. +ENABLE_APM_RECORDING_RULES=false diff --git a/dashboards/README.md b/dashboards/README.md index 05d69e4..eb953f0 100644 --- a/dashboards/README.md +++ b/dashboards/README.md @@ -1,15 +1,56 @@ -# OpenSearch Dashboards exports +# OpenSearch Dashboards reference exports -This directory is reserved for sanitized OpenSearch Dashboards saved-object exports created from the validated observability workspace. +This directory contains the sanitized saved-object reference captured from the final validated observability workspace. The former Grafana sample was removed because Grafana is not part of the current platform. -Before committing an export: +## Final dashboard set -1. remove data-source identifiers that are environment-specific; -2. remove internal addresses, hostnames, usernames, and credentials; -3. remove customer, account, transaction, trace, span, pod, and node identifiers; -4. confirm that the object imports into a clean lab workspace; -5. record its required index patterns and minimum OpenSearch Dashboards version. +The reference contains six dashboards: -Planned exports include the Kubernetes platform overview, application SLO report, service health overview, and ingestion pipeline health. +1. Infrastructure Health +2. Deployment & Workload Health +3. Application Performance +4. Developer Investigation +5. Real-Time Channel Performance +6. Kubernetes Platform Health + +The complete sanitized dependency set is under [reference/](reference/): + +- `dashboards.json` — 6 dashboard objects; +- `explore-panels.json` — 74 Explore objects actually referenced by the six dashboards; +- `data-views.json` — 4 standardized log/APM data views; +- `saved-searches.json` — 2 saved searches used by Developer Investigation; +- `SANITIZATION.md` — mapping and import requirements; +- `SHA256SUMS` — checksums for the captured sanitized reference files. + +Unreferenced legacy Explore objects from the live workspace are intentionally excluded. + +## Privacy and sanitization + +The public reference does not retain the live workspace ID, customer identity, private hostnames, private addresses, deployment-specific application namespaces, credentials, tokens, trace IDs, transaction payloads, or the live Prometheus connection identity. + +The Prometheus source is represented by the placeholder `reference-prometheus`. Host identities use documentation labels and TEST-NET-1 addresses. + +Run: + +```bash +python3 scripts/validate-dashboard-reference.py +``` + +to verify object counts, reference integrity, the intentional Prometheus placeholder, and the private-identity guardrails. + +## Import / adaptation + +These files are sanitized reference collections, not a blind production restore. Before using them in another environment: + +1. create/select the target Prometheus data connection; +2. map `reference-prometheus` to that connection identifier; +3. replace the `reference` telemetry environment label; +4. adapt the generic application/channel namespace selectors; +5. map the documentation host inventory to the target hosts; +6. import/restore data views and saved searches before dashboards; +7. refresh data-view fields; +8. validate every query and visualization against the target telemetry. + +See [reference/SANITIZATION.md](reference/SANITIZATION.md) for the exact mapping contract. diff --git a/dashboards/reference/SANITIZATION.md b/dashboards/reference/SANITIZATION.md new file mode 100644 index 0000000..8124928 --- /dev/null +++ b/dashboards/reference/SANITIZATION.md @@ -0,0 +1,49 @@ +# Sanitized dashboard reference + +This directory is generated from the final operated saved-object snapshot and is safe for public reference after the checks described below. + +## Included objects + +- 6 dashboards +- 74 dashboard-referenced Explore panels +- 4 data views +- 2 saved searches used by Developer Investigation + +Unreferenced legacy Explore objects from the live workspace are intentionally excluded. + +## Sanitization map + +Private deployment identity is replaced before publication: + +- Prometheus source identity -> `reference-prometheus`; +- workspace metadata -> removed; +- environment label -> `reference`; +- application workload namespace selector -> `^application-.*$`; +- channel deployment namespaces -> `channel-mobile` and `channel-ussd`; +- host names -> `host-01`, `host-02`, `host-03`, and `observability-host-01`; +- internal host addresses -> TEST-NET-1 documentation addresses; +- customer/environment display text -> generic reference terminology; +- transient saved-object metadata (`updated_at`, `version`, workspace/namespace/score fields) -> removed; +- data-view field caches -> removed so fields can be refreshed after import. + +The public artifacts retain the generic Mobile and USSD channel concepts because they are part of the dashboard design, but deployment-specific namespace and host identity is removed. + +## Prometheus source mapping + +The operated workspace did not contain a normal `index-pattern` saved object with the live Prometheus connection name. Instead, metric Explore objects referenced the Prometheus `data-connection` connection identifier through the saved-object reference field. + +For that reason `reference-prometheus` is intentionally a placeholder, not a complete Prometheus connection definition. Before import/rendering, map it to the target OpenSearch Dashboards Prometheus connection identifier. + +## Import notes + +These files are sanitized reference collections rather than raw live exports. Before importing into another environment: + +1. create or select the target Prometheus data connection; +2. replace `reference-prometheus` with that connection identifier; +3. replace `environment="reference"` with the target telemetry environment; +4. adapt `^application-.*$`, `channel-mobile`, and `channel-ussd` selectors to the target namespace policy; +5. map the documentation host identities/addresses to the target host inventory; +6. import data views and saved searches before dashboards; +7. refresh data-view fields and validate every dashboard panel. + +No raw workspace ID, private IP address, customer hostname, customer name, credential, token, trace ID, or transaction payload is retained in these files. diff --git a/dashboards/reference/SHA256SUMS b/dashboards/reference/SHA256SUMS new file mode 100644 index 0000000..a3c9cba --- /dev/null +++ b/dashboards/reference/SHA256SUMS @@ -0,0 +1,5 @@ +6503112ee4c81673665fd32c16d0eb847524ae35cbe90dce773a978ff190de55 dashboards.json +7133d12f7788df621d5d23640720de8a8fc00b282bf8751f1e0c233c5f9aacab explore-panels.json +038c2dbf3020036a94e4e380a07fdf97024d8598f0dc0f0e7127107d9d545137 data-views.json +fe91d451c24584cdb21784a3961eff71ed7650407875e66674467e6a3001590c saved-searches.json +53ad361042085871a8687af9a5c2d482913a2245e0a3c5116efc81feb5585eff SANITIZATION.md diff --git a/dashboards/reference/dashboards.json b/dashboards/reference/dashboards.json new file mode 100644 index 0000000..f0ac281 --- /dev/null +++ b/dashboards/reference/dashboards.json @@ -0,0 +1,528 @@ +{ + "saved_objects": [ + { + "type": "dashboard", + "id": "std-dashboard-deployment-workload-health", + "attributes": { + "title": "Deployment & Workload Health", + "hits": 0, + "description": "Standard application workload dashboard covering pod restarts, unavailable deployment replicas, CPU and memory usage, resource request and limit utilization, CPU throttling and workload network throughput.", + "panelsJSON": "[{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-restarts\",\"gridData\":{\"i\":\"panel-deploy-restarts\",\"x\":0,\"y\":0,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-restarts\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-unavailable-replicas\",\"gridData\":{\"i\":\"panel-deploy-unavailable-replicas\",\"x\":24,\"y\":0,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-unavailable-replicas\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-pod-cpu\",\"gridData\":{\"i\":\"panel-deploy-pod-cpu\",\"x\":0,\"y\":10,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-pod-cpu\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-pod-memory\",\"gridData\":{\"i\":\"panel-deploy-pod-memory\",\"x\":24,\"y\":10,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-pod-memory\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-cpu-vs-request\",\"gridData\":{\"i\":\"panel-deploy-cpu-vs-request\",\"x\":0,\"y\":20,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-cpu-vs-request\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-cpu-vs-limit\",\"gridData\":{\"i\":\"panel-deploy-cpu-vs-limit\",\"x\":24,\"y\":20,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-cpu-vs-limit\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-memory-vs-request\",\"gridData\":{\"i\":\"panel-deploy-memory-vs-request\",\"x\":0,\"y\":30,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-memory-vs-request\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-memory-vs-limit\",\"gridData\":{\"i\":\"panel-deploy-memory-vs-limit\",\"x\":24,\"y\":30,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-memory-vs-limit\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-cpu-throttling\",\"gridData\":{\"i\":\"panel-deploy-cpu-throttling\",\"x\":0,\"y\":40,\"w\":48,\"h\":10},\"panelRefName\":\"deploy-cpu-throttling\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-network-rx\",\"gridData\":{\"i\":\"panel-deploy-network-rx\",\"x\":0,\"y\":50,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-network-rx\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-deploy-network-tx\",\"gridData\":{\"i\":\"panel-deploy-network-tx\",\"x\":24,\"y\":50,\"w\":24,\"h\":10},\"panelRefName\":\"deploy-network-tx\"}]", + "optionsJSON": "{\"useMargins\":true,\"hidePanelTitles\":false}", + "timeRestore": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{}" + } + }, + "references": [ + { + "name": "deploy-restarts", + "id": "std-deploy-restarts", + "type": "explore" + }, + { + "name": "deploy-unavailable-replicas", + "id": "std-deploy-unavailable-replicas", + "type": "explore" + }, + { + "name": "deploy-pod-cpu", + "id": "std-deploy-pod-cpu", + "type": "explore" + }, + { + "name": "deploy-pod-memory", + "id": "std-deploy-pod-memory", + "type": "explore" + }, + { + "name": "deploy-cpu-vs-request", + "id": "std-deploy-cpu-vs-request", + "type": "explore" + }, + { + "name": "deploy-cpu-vs-limit", + "id": "std-deploy-cpu-vs-limit", + "type": "explore" + }, + { + "name": "deploy-memory-vs-request", + "id": "std-deploy-memory-vs-request", + "type": "explore" + }, + { + "name": "deploy-memory-vs-limit", + "id": "std-deploy-memory-vs-limit", + "type": "explore" + }, + { + "name": "deploy-cpu-throttling", + "id": "std-deploy-cpu-throttling", + "type": "explore" + }, + { + "name": "deploy-network-rx", + "id": "std-deploy-network-rx", + "type": "explore" + }, + { + "name": "deploy-network-tx", + "id": "std-deploy-network-tx", + "type": "explore" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + }, + { + "type": "dashboard", + "id": "std-dashboard-application-performance", + "attributes": { + "title": "Application Performance", + "hits": 0, + "description": "Standard application performance dashboard covering request traffic, 4xx and 5xx rates, server-side request availability, service latency percentiles and dependency P99 latency.", + "panelsJSON": "[{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-traffic\",\"gridData\":{\"i\":\"panel-app-traffic\",\"x\":0,\"y\":0,\"w\":24,\"h\":9},\"panelRefName\":\"app-traffic\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-4xx-rate\",\"gridData\":{\"i\":\"panel-app-4xx-rate\",\"x\":24,\"y\":0,\"w\":24,\"h\":9},\"panelRefName\":\"app-4xx-rate\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-5xx-rate\",\"gridData\":{\"i\":\"panel-app-5xx-rate\",\"x\":0,\"y\":9,\"w\":24,\"h\":9},\"panelRefName\":\"app-5xx-rate\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-request-availability\",\"gridData\":{\"i\":\"panel-app-request-availability\",\"x\":24,\"y\":9,\"w\":24,\"h\":9},\"panelRefName\":\"app-request-availability\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-p50-latency\",\"gridData\":{\"i\":\"panel-app-p50-latency\",\"x\":0,\"y\":18,\"w\":24,\"h\":9},\"panelRefName\":\"app-p50-latency\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-p90-latency\",\"gridData\":{\"i\":\"panel-app-p90-latency\",\"x\":24,\"y\":18,\"w\":24,\"h\":9},\"panelRefName\":\"app-p90-latency\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-p99-latency\",\"gridData\":{\"i\":\"panel-app-p99-latency\",\"x\":0,\"y\":27,\"w\":24,\"h\":9},\"panelRefName\":\"app-p99-latency\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-app-dependency-p99\",\"gridData\":{\"i\":\"panel-app-dependency-p99\",\"x\":24,\"y\":27,\"w\":24,\"h\":9},\"panelRefName\":\"app-dependency-p99\"}]", + "optionsJSON": "{\"useMargins\":true,\"hidePanelTitles\":false}", + "timeRestore": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{}" + } + }, + "references": [ + { + "name": "app-traffic", + "id": "std-app-traffic", + "type": "explore" + }, + { + "name": "app-4xx-rate", + "id": "std-app-4xx-rate", + "type": "explore" + }, + { + "name": "app-5xx-rate", + "id": "std-app-5xx-rate", + "type": "explore" + }, + { + "name": "app-request-availability", + "id": "std-app-request-availability", + "type": "explore" + }, + { + "name": "app-p50-latency", + "id": "std-app-p50-latency", + "type": "explore" + }, + { + "name": "app-p90-latency", + "id": "std-app-p90-latency", + "type": "explore" + }, + { + "name": "app-p99-latency", + "id": "std-app-p99-latency", + "type": "explore" + }, + { + "name": "app-dependency-p99", + "id": "std-app-dependency-p99", + "type": "explore" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + }, + { + "type": "dashboard", + "id": "std-dashboard-developer-investigation", + "attributes": { + "title": "Developer Investigation", + "description": "Developer investigation workspace for HTTP server spans and correlated application logs. Use service, route, status, Trace ID and Span ID to move from an application symptom to the corresponding request and log evidence.", + "hits": 0, + "panelsJSON": "[{\"version\":\"3.6.0\",\"panelIndex\":\"panel-dev_panel_http\",\"gridData\":{\"i\":\"panel-dev_panel_http\",\"x\":0,\"y\":0,\"w\":48,\"h\":18},\"panelRefName\":\"dev_panel_http\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-dev_panel_logs\",\"gridData\":{\"i\":\"panel-dev_panel_logs\",\"x\":0,\"y\":18,\"w\":48,\"h\":24},\"panelRefName\":\"dev_panel_logs\"}]", + "optionsJSON": "{\"useMargins\":true,\"hidePanelTitles\":false}", + "timeRestore": true, + "timeFrom": "now-15m", + "timeTo": "now", + "refreshInterval": { + "pause": true, + "value": 0 + }, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + } + }, + "references": [ + { + "name": "dev_panel_http", + "id": "std-dev-http-routes-requests", + "type": "search" + }, + { + "name": "dev_panel_logs", + "id": "std-logs-application", + "type": "search" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + }, + { + "type": "dashboard", + "id": "std-dashboard-realtime-channel-performance", + "attributes": { + "title": "Real-Time Channel Performance", + "hits": 0, + "description": "Real-time side-by-side performance for standardized USSD and Mobile channels, covering per-service P99 latency trends, current/peak/best P99, current request volume and facade/gateway deployment health.", + "panelsJSON": "[{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-ussd-current-p99\"},\"panelIndex\":\"panel-channel-ussd-current-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-current-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":6,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-ussd-peak-p99\"},\"panelIndex\":\"panel-channel-ussd-peak-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-peak-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":12,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-ussd-best-p99\"},\"panelIndex\":\"panel-channel-ussd-best-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-best-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":18,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-ussd-current-requests\"},\"panelIndex\":\"panel-channel-ussd-current-requests\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-current-requests\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-mobile-current-p99\"},\"panelIndex\":\"panel-channel-mobile-current-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-current-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":30,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-mobile-peak-p99\"},\"panelIndex\":\"panel-channel-mobile-peak-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-peak-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":36,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-mobile-best-p99\"},\"panelIndex\":\"panel-channel-mobile-best-p99\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-best-p99\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":42,\"y\":23,\"w\":6,\"h\":8,\"i\":\"panel-channel-mobile-current-requests\"},\"panelIndex\":\"panel-channel-mobile-current-requests\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-current-requests\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":31,\"w\":24,\"h\":2,\"i\":\"panel-channel-ussd-entry-health\"},\"panelIndex\":\"panel-channel-ussd-entry-health\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-entry-health\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":31,\"w\":24,\"h\":2,\"i\":\"panel-channel-mobile-entry-health\"},\"panelIndex\":\"panel-channel-mobile-entry-health\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-entry-health\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":23,\"i\":\"panel-channel-ussd-p99-latency\"},\"panelIndex\":\"panel-channel-ussd-p99-latency\",\"embeddableConfig\":{},\"panelRefName\":\"channel-ussd-p99-latency\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":23,\"i\":\"panel-channel-mobile-p99-latency\"},\"panelIndex\":\"panel-channel-mobile-p99-latency\",\"embeddableConfig\":{},\"panelRefName\":\"channel-mobile-p99-latency\"}]", + "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}", + "timeRestore": true, + "timeTo": "now", + "timeFrom": "now-15m", + "refreshInterval": { + "pause": false, + "value": 30000 + }, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}" + } + }, + "references": [ + { + "name": "channel-ussd-current-p99", + "id": "std-channel-ussd-current-p99", + "type": "explore" + }, + { + "name": "channel-ussd-peak-p99", + "id": "std-channel-ussd-peak-p99", + "type": "explore" + }, + { + "name": "channel-ussd-best-p99", + "id": "std-channel-ussd-best-p99", + "type": "explore" + }, + { + "name": "channel-ussd-current-requests", + "id": "std-channel-ussd-current-requests", + "type": "explore" + }, + { + "name": "channel-mobile-current-p99", + "id": "std-channel-mobile-current-p99", + "type": "explore" + }, + { + "name": "channel-mobile-peak-p99", + "id": "std-channel-mobile-peak-p99", + "type": "explore" + }, + { + "name": "channel-mobile-best-p99", + "id": "std-channel-mobile-best-p99", + "type": "explore" + }, + { + "name": "channel-mobile-current-requests", + "id": "std-channel-mobile-current-requests", + "type": "explore" + }, + { + "name": "channel-ussd-entry-health", + "id": "std-channel-ussd-entry-health", + "type": "explore" + }, + { + "name": "channel-mobile-entry-health", + "id": "std-channel-mobile-entry-health", + "type": "explore" + }, + { + "name": "channel-ussd-p99-latency", + "id": "std-channel-ussd-p99-latency", + "type": "explore" + }, + { + "name": "channel-mobile-p99-latency", + "id": "std-channel-mobile-p99-latency", + "type": "explore" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + }, + { + "type": "dashboard", + "id": "std-dashboard-infrastructure-health", + "attributes": { + "title": "Infrastructure Health", + "description": "Infrastructure capacity and resource-pressure dashboard showing live per-host CPU, memory and filesystem utilization alongside provisioned capacity and available memory, followed by historical CPU, memory, filesystem and physical disk I/O trends.", + "hits": 0, + "panelsJSON": "[{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-cpu\",\"gridData\":{\"x\":0,\"y\":0,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-cpu\"},\"panelRefName\":\"infra-host-01-cpu\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-memory\",\"gridData\":{\"x\":0,\"y\":12,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-memory\"},\"panelRefName\":\"infra-host-01-memory\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-memory-available\",\"gridData\":{\"x\":0,\"y\":24,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-memory-available\"},\"panelRefName\":\"infra-host-01-memory-available\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-filesystem-max\",\"gridData\":{\"x\":0,\"y\":30,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-filesystem-max\"},\"panelRefName\":\"infra-host-01-filesystem-max\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-cpu\",\"gridData\":{\"x\":12,\"y\":0,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-cpu\"},\"panelRefName\":\"infra-host-02-cpu\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-memory\",\"gridData\":{\"x\":12,\"y\":12,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-memory\"},\"panelRefName\":\"infra-host-02-memory\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-memory-available\",\"gridData\":{\"x\":12,\"y\":24,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-memory-available\"},\"panelRefName\":\"infra-host-02-memory-available\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-filesystem-max\",\"gridData\":{\"x\":12,\"y\":30,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-filesystem-max\"},\"panelRefName\":\"infra-host-02-filesystem-max\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-cpu\",\"gridData\":{\"x\":24,\"y\":0,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-cpu\"},\"panelRefName\":\"infra-host-03-cpu\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-memory\",\"gridData\":{\"x\":24,\"y\":12,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-memory\"},\"panelRefName\":\"infra-host-03-memory\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-memory-available\",\"gridData\":{\"x\":24,\"y\":24,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-memory-available\"},\"panelRefName\":\"infra-host-03-memory-available\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-filesystem-max\",\"gridData\":{\"x\":24,\"y\":30,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-filesystem-max\"},\"panelRefName\":\"infra-host-03-filesystem-max\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-cpu\",\"gridData\":{\"x\":36,\"y\":0,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-cpu\"},\"panelRefName\":\"infra-observability-host-01-cpu\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-memory\",\"gridData\":{\"x\":36,\"y\":12,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-memory\"},\"panelRefName\":\"infra-observability-host-01-memory\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-memory-available\",\"gridData\":{\"x\":36,\"y\":24,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-memory-available\"},\"panelRefName\":\"infra-observability-host-01-memory-available\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-filesystem-max\",\"gridData\":{\"x\":36,\"y\":30,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-filesystem-max\"},\"panelRefName\":\"infra-observability-host-01-filesystem-max\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-node-cpu-trend\",\"gridData\":{\"x\":0,\"y\":42,\"w\":24,\"h\":10,\"i\":\"panel-infra-node-cpu-trend\"},\"panelRefName\":\"infra-node-cpu-trend\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-disk-io\",\"gridData\":{\"x\":24,\"y\":52,\"w\":24,\"h\":10,\"i\":\"panel-infra-disk-io\"},\"panelRefName\":\"infra-disk-io\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-filesystem-usage\",\"gridData\":{\"x\":0,\"y\":52,\"w\":24,\"h\":10,\"i\":\"panel-infra-filesystem-usage\"},\"panelRefName\":\"infra-filesystem-usage\"},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-cpu-capacity\",\"gridData\":{\"x\":0,\"y\":6,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-cpu-capacity\"},\"panelRefName\":\"infra-host-01-cpu-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-ram-total\",\"gridData\":{\"x\":0,\"y\":18,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-ram-total\"},\"panelRefName\":\"infra-host-01-ram-total\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-01-disk-capacity\",\"gridData\":{\"x\":0,\"y\":36,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-01-disk-capacity\"},\"panelRefName\":\"infra-host-01-disk-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-cpu-capacity\",\"gridData\":{\"x\":12,\"y\":6,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-cpu-capacity\"},\"panelRefName\":\"infra-host-02-cpu-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-ram-total\",\"gridData\":{\"x\":12,\"y\":18,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-ram-total\"},\"panelRefName\":\"infra-host-02-ram-total\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-02-disk-capacity\",\"gridData\":{\"x\":12,\"y\":36,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-02-disk-capacity\"},\"panelRefName\":\"infra-host-02-disk-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-cpu-capacity\",\"gridData\":{\"x\":24,\"y\":6,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-cpu-capacity\"},\"panelRefName\":\"infra-host-03-cpu-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-ram-total\",\"gridData\":{\"x\":24,\"y\":18,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-ram-total\"},\"panelRefName\":\"infra-host-03-ram-total\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-host-03-disk-capacity\",\"gridData\":{\"x\":24,\"y\":36,\"w\":12,\"h\":6,\"i\":\"panel-infra-host-03-disk-capacity\"},\"panelRefName\":\"infra-host-03-disk-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-cpu-capacity\",\"gridData\":{\"x\":36,\"y\":6,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-cpu-capacity\"},\"panelRefName\":\"infra-observability-host-01-cpu-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-ram-total\",\"gridData\":{\"x\":36,\"y\":18,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-ram-total\"},\"panelRefName\":\"infra-observability-host-01-ram-total\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-observability-host-01-disk-capacity\",\"gridData\":{\"x\":36,\"y\":36,\"w\":12,\"h\":6,\"i\":\"panel-infra-observability-host-01-disk-capacity\"},\"panelRefName\":\"infra-observability-host-01-disk-capacity\",\"embeddableConfig\":{}},{\"version\":\"3.6.0\",\"panelIndex\":\"panel-infra-node-memory-trend\",\"gridData\":{\"x\":24,\"y\":42,\"w\":24,\"h\":10,\"i\":\"panel-infra-node-memory-trend\"},\"panelRefName\":\"infra-node-memory-trend\",\"embeddableConfig\":{}}]", + "optionsJSON": "{\"useMargins\":true,\"hidePanelTitles\":false}", + "timeRestore": true, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "timeFrom": "now-1h", + "timeTo": "now", + "refreshInterval": { + "pause": false, + "value": 30000 + } + }, + "references": [ + { + "name": "infra-filesystem-usage", + "id": "std-infra-filesystem-usage", + "type": "explore" + }, + { + "name": "infra-node-cpu-trend", + "id": "std-infra-node-cpu-trend", + "type": "explore" + }, + { + "name": "infra-disk-io", + "id": "std-infra-disk-io", + "type": "explore" + }, + { + "name": "infra-host-01-cpu", + "id": "std-infra-host-01-cpu", + "type": "explore" + }, + { + "name": "infra-host-01-memory", + "id": "std-infra-host-01-memory", + "type": "explore" + }, + { + "name": "infra-host-01-memory-available", + "id": "std-infra-host-01-memory-available", + "type": "explore" + }, + { + "name": "infra-host-01-filesystem-max", + "id": "std-infra-host-01-filesystem-max", + "type": "explore" + }, + { + "name": "infra-host-02-cpu", + "id": "std-infra-host-02-cpu", + "type": "explore" + }, + { + "name": "infra-host-02-memory", + "id": "std-infra-host-02-memory", + "type": "explore" + }, + { + "name": "infra-host-02-memory-available", + "id": "std-infra-host-02-memory-available", + "type": "explore" + }, + { + "name": "infra-host-02-filesystem-max", + "id": "std-infra-host-02-filesystem-max", + "type": "explore" + }, + { + "name": "infra-host-03-cpu", + "id": "std-infra-host-03-cpu", + "type": "explore" + }, + { + "name": "infra-host-03-memory", + "id": "std-infra-host-03-memory", + "type": "explore" + }, + { + "name": "infra-host-03-memory-available", + "id": "std-infra-host-03-memory-available", + "type": "explore" + }, + { + "name": "infra-host-03-filesystem-max", + "id": "std-infra-host-03-filesystem-max", + "type": "explore" + }, + { + "name": "infra-observability-host-01-cpu", + "id": "std-infra-observability-host-01-cpu", + "type": "explore" + }, + { + "name": "infra-observability-host-01-memory", + "id": "std-infra-observability-host-01-memory", + "type": "explore" + }, + { + "name": "infra-observability-host-01-memory-available", + "id": "std-infra-observability-host-01-memory-available", + "type": "explore" + }, + { + "name": "infra-observability-host-01-filesystem-max", + "id": "std-infra-observability-host-01-filesystem-max", + "type": "explore" + }, + { + "name": "infra-host-01-cpu-capacity", + "id": "std-infra-host-01-cpu-capacity", + "type": "explore" + }, + { + "name": "infra-host-01-ram-total", + "id": "std-infra-host-01-ram-total", + "type": "explore" + }, + { + "name": "infra-host-01-disk-capacity", + "id": "std-infra-host-01-disk-capacity", + "type": "explore" + }, + { + "name": "infra-host-02-cpu-capacity", + "id": "std-infra-host-02-cpu-capacity", + "type": "explore" + }, + { + "name": "infra-host-02-ram-total", + "id": "std-infra-host-02-ram-total", + "type": "explore" + }, + { + "name": "infra-host-02-disk-capacity", + "id": "std-infra-host-02-disk-capacity", + "type": "explore" + }, + { + "name": "infra-host-03-cpu-capacity", + "id": "std-infra-host-03-cpu-capacity", + "type": "explore" + }, + { + "name": "infra-host-03-ram-total", + "id": "std-infra-host-03-ram-total", + "type": "explore" + }, + { + "name": "infra-host-03-disk-capacity", + "id": "std-infra-host-03-disk-capacity", + "type": "explore" + }, + { + "name": "infra-observability-host-01-cpu-capacity", + "id": "std-infra-observability-host-01-cpu-capacity", + "type": "explore" + }, + { + "name": "infra-observability-host-01-ram-total", + "id": "std-infra-observability-host-01-ram-total", + "type": "explore" + }, + { + "name": "infra-observability-host-01-disk-capacity", + "id": "std-infra-observability-host-01-disk-capacity", + "type": "explore" + }, + { + "name": "infra-node-memory-trend", + "id": "std-infra-node-memory-trend", + "type": "explore" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + }, + { + "type": "dashboard", + "id": "std-dashboard-kubernetes-platform-health", + "attributes": { + "title": "Kubernetes Platform Health", + "hits": 0, + "description": "Kubernetes platform overview styled after the OpenSearch Kubernetes integration dashboard while using the environment's existing Prometheus, kube-state-metrics, Node Exporter and cAdvisor telemetry.", + "panelsJSON": "[{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":9,\"h\":10,\"i\":\"panel-k8s-overview-nodes\"},\"panelIndex\":\"panel-k8s-overview-nodes\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-nodes\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":9,\"y\":0,\"w\":15,\"h\":10,\"i\":\"panel-k8s-overview-deployments\"},\"panelIndex\":\"panel-k8s-overview-deployments\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-deployments\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":10,\"i\":\"panel-k8s-overview-available-by-deployment\"},\"panelIndex\":\"panel-k8s-overview-available-by-deployment\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-available-by-deployment\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":10,\"w\":8,\"h\":10,\"i\":\"panel-k8s-overview-desired-pods\"},\"panelIndex\":\"panel-k8s-overview-desired-pods\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-desired-pods\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":8,\"y\":10,\"w\":8,\"h\":10,\"i\":\"panel-k8s-overview-available-pods\"},\"panelIndex\":\"panel-k8s-overview-available-pods\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-available-pods\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":16,\"y\":10,\"w\":8,\"h\":10,\"i\":\"panel-k8s-overview-unavailable-pods\"},\"panelIndex\":\"panel-k8s-overview-unavailable-pods\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-unavailable-pods\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":10,\"w\":24,\"h\":10,\"i\":\"panel-k8s-overview-unavailable-by-deployment\"},\"panelIndex\":\"panel-k8s-overview-unavailable-by-deployment\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-unavailable-by-deployment\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":20,\"w\":24,\"h\":12,\"i\":\"panel-k8s-overview-cpu-by-node\"},\"panelIndex\":\"panel-k8s-overview-cpu-by-node\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-cpu-by-node\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":20,\"w\":24,\"h\":12,\"i\":\"panel-k8s-overview-memory-by-node\"},\"panelIndex\":\"panel-k8s-overview-memory-by-node\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-memory-by-node\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":0,\"y\":32,\"w\":24,\"h\":12,\"i\":\"panel-k8s-overview-top-memory\"},\"panelIndex\":\"panel-k8s-overview-top-memory\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-top-memory\"},{\"version\":\"3.6.0\",\"gridData\":{\"x\":24,\"y\":32,\"w\":24,\"h\":12,\"i\":\"panel-k8s-overview-top-cpu\"},\"panelIndex\":\"panel-k8s-overview-top-cpu\",\"embeddableConfig\":{},\"panelRefName\":\"k8s-overview-top-cpu\"}]", + "optionsJSON": "{\"useMargins\":true,\"hidePanelTitles\":false}", + "timeRestore": true, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}" + }, + "timeFrom": "now-30m", + "timeTo": "now", + "refreshInterval": { + "pause": false, + "value": 30000 + } + }, + "references": [ + { + "name": "k8s-overview-nodes", + "type": "explore", + "id": "std-k8s-overview-nodes" + }, + { + "name": "k8s-overview-deployments", + "type": "explore", + "id": "std-k8s-overview-deployments" + }, + { + "name": "k8s-overview-available-by-deployment", + "type": "explore", + "id": "std-k8s-overview-available-by-deployment" + }, + { + "name": "k8s-overview-desired-pods", + "type": "explore", + "id": "std-k8s-overview-desired-pods" + }, + { + "name": "k8s-overview-available-pods", + "type": "explore", + "id": "std-k8s-overview-available-pods" + }, + { + "name": "k8s-overview-unavailable-pods", + "type": "explore", + "id": "std-k8s-overview-unavailable-pods" + }, + { + "name": "k8s-overview-unavailable-by-deployment", + "type": "explore", + "id": "std-k8s-overview-unavailable-by-deployment" + }, + { + "name": "k8s-overview-cpu-by-node", + "type": "explore", + "id": "std-k8s-overview-cpu-by-node" + }, + { + "name": "k8s-overview-memory-by-node", + "type": "explore", + "id": "std-k8s-overview-memory-by-node" + }, + { + "name": "k8s-overview-top-memory", + "type": "explore", + "id": "std-k8s-overview-top-memory" + }, + { + "name": "k8s-overview-top-cpu", + "type": "explore", + "id": "std-k8s-overview-top-cpu" + } + ], + "migrationVersion": { + "dashboard": "7.9.3" + } + } + ] +} diff --git a/dashboards/reference/data-views.json b/dashboards/reference/data-views.json new file mode 100644 index 0000000..fb0ab03 --- /dev/null +++ b/dashboards/reference/data-views.json @@ -0,0 +1,64 @@ +{ + "saved_objects": [ + { + "type": "index-pattern", + "id": "std-logs-platform-dataset", + "attributes": { + "title": "logs-platform", + "displayName": "Kubernetes Platform Logs", + "description": "RKE2, Kubernetes, Rancher, Longhorn and observability platform logs; routine Fluent Bit success chatter hidden.", + "timeFieldName": "time", + "signalType": "logs", + "schemaMappings": "{\"otelLogs\":{\"traceId\":\"traceId\",\"spanId\":\"spanId\",\"serviceName\":\"serviceName\",\"timestamp\":\"time\"}}" + }, + "references": [], + "migrationVersion": { + "index-pattern": "7.6.0" + } + }, + { + "type": "index-pattern", + "id": "std-logs-application-dataset", + "attributes": { + "title": "logs-application", + "displayName": "Application Logs", + "description": "Application and deployment workload logs only.", + "timeFieldName": "time", + "signalType": "logs", + "schemaMappings": "{\"otelLogs\":{\"traceId\":\"traceId\",\"spanId\":\"spanId\",\"serviceName\":\"serviceName\",\"timestamp\":\"time\"}}" + }, + "references": [], + "migrationVersion": { + "index-pattern": "7.6.0" + } + }, + { + "type": "index-pattern", + "id": "std-apm-span-data-view", + "attributes": { + "title": "otel-v1-apm-span*", + "displayName": "APM Traces", + "timeFieldName": "endTime", + "signalType": "traces", + "schemaMappings": "{}" + }, + "references": [], + "migrationVersion": { + "index-pattern": "7.6.0" + } + }, + { + "type": "index-pattern", + "id": "std-apm-service-map-data-view", + "attributes": { + "title": "otel-v2-apm-service-map*", + "displayName": "APM Service Map", + "timeFieldName": "timestamp" + }, + "references": [], + "migrationVersion": { + "index-pattern": "7.6.0" + } + } + ] +} diff --git a/dashboards/reference/explore-panels.json b/dashboards/reference/explore-panels.json new file mode 100644 index 0000000..a25882f --- /dev/null +++ b/dashboards/reference/explore-panels.json @@ -0,0 +1,1947 @@ +{ + "saved_objects": [ + { + "type": "explore", + "id": "std-app-dependency-p99", + "attributes": { + "title": "Dependency P99 Latency", + "description": "99th-percentile dependency latency in milliseconds by calling service and remote service. Only spans with a non-empty remote service are included, and cumulative histogram buckets are reconstructed from the span-derived bucket metrics.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - Dependency P99 Latency\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.99,(label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service,remoteService)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service,remoteService) (sum by (service,remoteService)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService!=\\\"\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-p50-latency", + "attributes": { + "title": "P50 Latency", + "description": "Per-service median request latency in milliseconds. Percentiles are calculated after reconstructing cumulative histogram buckets from the non-cumulative span-derived latency bucket metrics.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - P50 Latency\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.5,(label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service) (sum by (service)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-p99-latency", + "attributes": { + "title": "P99 Latency", + "description": "Per-service 99th-percentile request latency in milliseconds. Percentiles are calculated after reconstructing cumulative histogram buckets from the non-cumulative span-derived latency bucket metrics.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - P99 Latency (ms)\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.99,(label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service) (sum by (service)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-p90-latency", + "attributes": { + "title": "P90 Latency", + "description": "Per-service 90th-percentile request latency in milliseconds. Percentiles are calculated after reconstructing cumulative histogram buckets from the non-cumulative span-derived latency bucket metrics.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - P90 Latency\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.9,(label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service) (sum by (service)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-request-availability", + "attributes": { + "title": "Server-side Request Availability", + "description": "Per-service request availability derived as the absence of span-derived 5xx faults. This measures server-side request success, not Kubernetes replica, host, or infrastructure availability.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - Server-side Request Availability (%)\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"(\\n 1 -\\n (\\n sum by (service) (fault{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"})\\n /\\n clamp_min(sum by (service) (request{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}), 1)\\n )\\n) * 100\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-restarts", + "attributes": { + "title": "Recent Pod Restarts", + "description": "Application pods with one or more container restarts during the last 5 minutes. Only configured application namespaces are included.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Recent Pod Restarts (5m)\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,(sum by(namespace,pod)(increase(kube_pod_container_status_restarts_total{namespace=~\\\"^application-.*$\\\"}[5m]))) > 0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-traffic", + "attributes": { + "title": "Application Traffic", + "description": "Current span-derived request volume by service. The request metric is a windowed derived metric and is used directly rather than converted with rate().", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - Traffic (requests/window)\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" requests\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum by (service) (\\n request{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-4xx-rate", + "attributes": { + "title": "4xx Error Rate", + "description": "Percentage of application requests represented by span-derived 4xx errors, grouped by service.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - 4xx Error Rate\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"(\\n sum by (service) (error{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"})\\n /\\n clamp_min(sum by (service) (request{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}), 1)\\n) * 100\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-app-5xx-rate", + "attributes": { + "title": "5xx Fault Rate", + "description": "Percentage of application requests represented by span-derived 5xx faults, grouped by service.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Application - 5xx Fault Rate (%)\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"(\\n sum by (service) (fault{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"})\\n /\\n clamp_min(sum by (service) (request{environment=\\\"reference\\\",remoteService=\\\"\\\",namespace=\\\"span_derived\\\"}), 1)\\n) * 100\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-memory-vs-request", + "attributes": { + "title": "Memory vs Requests", + "description": "Top application pods by working-set memory as a percentage of configured memory requests. Pods without a positive memory request are excluded.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Pod Memory vs Requests\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,100 * sum by(namespace,pod)(container_memory_working_set_bytes{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}) / (sum by(namespace,pod)(kube_pod_container_resource_requests{namespace=~\\\"^application-.*$\\\",resource=\\\"memory\\\",unit=\\\"byte\\\"}) > 0))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-cpu-throttling", + "attributes": { + "title": "CPU Throttling", + "description": "Top application pods by CPU throttling percentage over 5 minutes, calculated from throttled scheduling periods versus total CPU scheduling periods.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Pod CPU Throttling\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,100 * sum by(namespace,pod)(rate(container_cpu_cfs_throttled_periods_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}[5m])) / clamp_min(sum by(namespace,pod)(rate(container_cpu_cfs_periods_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}[5m])),0.001))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-cpu-vs-request", + "attributes": { + "title": "CPU vs Requests", + "description": "Top application pods by CPU utilization as a percentage of configured CPU requests. Pods without a positive CPU request are excluded.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Pod CPU vs Requests\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,100 * sum by(namespace,pod)(rate(container_cpu_usage_seconds_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}[5m])) / (sum by(namespace,pod)(kube_pod_container_resource_requests{namespace=~\\\"^application-.*$\\\",resource=\\\"cpu\\\",unit=\\\"core\\\"}) > 0))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-cpu-vs-limit", + "attributes": { + "title": "CPU vs Limits", + "description": "Top application pods by CPU utilization as a percentage of configured CPU limits. Pods without a positive CPU limit are excluded.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Pod CPU vs Limits\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,100 * sum by(namespace,pod)(rate(container_cpu_usage_seconds_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}[5m])) / (sum by(namespace,pod)(kube_pod_container_resource_limits{namespace=~\\\"^application-.*$\\\",resource=\\\"cpu\\\",unit=\\\"core\\\"}) > 0))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-memory-vs-limit", + "attributes": { + "title": "Memory vs Limits", + "description": "Top application pods by working-set memory as a percentage of configured memory limits. Pods without a positive memory limit are excluded.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Pod Memory vs Limits\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" %\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,100 * sum by(namespace,pod)(container_memory_working_set_bytes{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}) / (sum by(namespace,pod)(kube_pod_container_resource_limits{namespace=~\\\"^application-.*$\\\",resource=\\\"memory\\\",unit=\\\"byte\\\"}) > 0))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-unavailable-replicas", + "attributes": { + "title": "Unavailable Replicas", + "description": "Application deployments currently reporting unavailable replicas. Healthy deployments with zero unavailable replicas are omitted.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Unavailable Deployment Replicas\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,(sum by(namespace,deployment)(kube_deployment_status_replicas_unavailable{namespace=~\\\"^application-.*$\\\"})) > 0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-pod-cpu", + "attributes": { + "title": "Top Workloads by CPU", + "description": "Top application pods by current CPU consumption, measured in CPU cores using a 5-minute rate.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Top Pods by CPU\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":3,\"unitSuffix\":\" cores\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,sum by(namespace,pod)(rate(container_cpu_usage_seconds_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-pod-memory", + "attributes": { + "title": "Top Workloads by Memory", + "description": "Top application pods by current working-set memory consumption in GiB.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Top Pods by Memory\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,sum by(namespace,pod)(container_memory_working_set_bytes{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\",container!=\\\"\\\",container!=\\\"POD\\\"})) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-network-rx", + "attributes": { + "title": "Workload Network Receive", + "description": "Top application pods by network receive throughput in MiB/s over 5 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Top Pod Network Receive\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" MiB/s\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,sum by(namespace,pod)(rate(container_network_receive_bytes_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\"}[5m]))) / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-deploy-network-tx", + "attributes": { + "title": "Workload Network Transmit", + "description": "Top application pods by network transmit throughput in MiB/s over 5 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Top Pod Network Transmit\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":2,\"unitSuffix\":\" MiB/s\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(10,sum by(namespace,pod)(rate(container_network_transmit_bytes_total{namespace=~\\\"^application-.*$\\\",pod!=\\\"\\\"}[5m]))) / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "reference-prometheus" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-p99-latency", + "attributes": { + "title": "Mobile Services - P99 Latency", + "description": "Live P99 latency for channel gateway and facade services.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Mobile Services - P99 Latency\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.99,(label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service) (sum by (service)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-p99-latency", + "attributes": { + "title": "USSD Services - P99 Latency", + "description": "Live P99 latency for channel gateway and facade services.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"USSD Services - P99 Latency\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\" ms\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\": {\"query\": \"(1000 * histogram_quantile(0.99,(label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum by (service)(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on (service) (sum by (service)(latency_seconds_count{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\"}) > 0)\", \"language\": \"PROMQL\", \"dataset\": {\"id\": \"reference-prometheus\", \"title\": \"reference-prometheus\", \"type\": \"PROMETHEUS\", \"language\": \"PROMQL\", \"timeFieldName\": \"Time\", \"dataSource\": {}, \"signalType\": \"metrics\"}}, \"filter\": [], \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-peak-p99", + "attributes": { + "title": "Mobile Peak P99 (15m)", + "description": "Highest correctly reconstructed Mobile P99 observed during the previous 15 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Mobile Peak P99 (15m)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max_over_time(((1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\"}) > 0))[15m:30s])\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-peak-p99", + "attributes": { + "title": "USSD Peak P99 (15m)", + "description": "Highest correctly reconstructed USSD P99 observed during the previous 15 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"USSD Peak P99 (15m)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max_over_time(((1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\"}) > 0))[15m:30s])\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-best-p99", + "attributes": { + "title": "USSD Best P99 (15m)", + "description": "Lowest correctly reconstructed USSD P99 observed during the previous 15 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"USSD Best P99 (15m)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"min_over_time(((1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\"}) > 0))[15m:30s])\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-current-p99", + "attributes": { + "title": "Mobile Current P99", + "description": "Current channel P99 reconstructed from non-cumulative span-derived latency buckets for entry requests from standardized mobile-* services.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Mobile Current P99\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"(1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\"}) > 0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-current-p99", + "attributes": { + "title": "USSD Current P99", + "description": "Current channel P99 reconstructed from non-cumulative span-derived latency buckets for entry requests from standardized ussd-* services.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"USSD Current P99\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"(1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\"}) > 0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-current-requests", + "attributes": { + "title": "USSD Current Requests", + "description": "Current span-derived entry-request volume for standardized ussd-* services. This is a windowed request count, not requests per second.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"USSD Current Requests\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" requests\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"ussd-.*\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-best-p99", + "attributes": { + "title": "Mobile Best P99 (15m)", + "description": "Lowest correctly reconstructed Mobile P99 observed during the previous 15 minutes.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Mobile Best P99 (15m)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" ms\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"min_over_time(((1000 * histogram_quantile(0.99,(label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0\\\"}),\\\"le\\\",\\\"0.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005\\\"}),\\\"le\\\",\\\"0.005\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01\\\"}),\\\"le\\\",\\\"0.01\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025\\\"}),\\\"le\\\",\\\"0.025\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05\\\"}),\\\"le\\\",\\\"0.05\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075\\\"}),\\\"le\\\",\\\"0.075\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1\\\"}),\\\"le\\\",\\\"0.1\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25\\\"}),\\\"le\\\",\\\"0.25\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5\\\"}),\\\"le\\\",\\\"0.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75\\\"}),\\\"le\\\",\\\"0.75\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0\\\"}),\\\"le\\\",\\\"1.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5\\\"}),\\\"le\\\",\\\"2.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0\\\"}),\\\"le\\\",\\\"5.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5\\\"}),\\\"le\\\",\\\"7.5\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0\\\"}),\\\"le\\\",\\\"10.0\\\",\\\"\\\",\\\"\\\") or label_replace(sum(latency_seconds_bucket{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\",le=~\\\"0\\\\\\\\.0|0\\\\\\\\.005|0\\\\\\\\.01|0\\\\\\\\.025|0\\\\\\\\.05|0\\\\\\\\.075|0\\\\\\\\.1|0\\\\\\\\.25|0\\\\\\\\.5|0\\\\\\\\.75|1\\\\\\\\.0|2\\\\\\\\.5|5\\\\\\\\.0|7\\\\\\\\.5|10\\\\\\\\.0|\\\\\\\\+Inf\\\"}),\\\"le\\\",\\\"+Inf\\\",\\\"\\\",\\\"\\\")))) and on() (sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\"}) > 0))[15m:30s])\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-ussd-entry-health", + "attributes": { + "title": "USSD Facade / Gateway Health", + "description": "Colored channel-entry health strip based only on USSD facade and gateway Kubernetes deployment availability. Green=both healthy, amber=at least one degraded, red=one down or an expected deployment is missing.", + "hits": 0, + "columns": [ + "spanId", + "status.code", + "attributes.http.status_code", + "resource.attributes.service.name", + "kind", + "name", + "durationNano", + "durationInNanos", + "links", + "traceState", + "traceId" + ], + "sort": [], + "type": "traces", + "visualization": "{\"title\":\"USSD Facade / Gateway Health\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#D0021B\",\"thresholds\":[{\"value\":0.01,\"color\":\"#F5A623\"},{\"value\":1,\"color\":\"#00BD6B\"}]},\"useThresholdColor\":true,\"textMode\":\"none\",\"colorMode\":\"background_solid\",\"decimals\":0,\"unitSuffix\":\"\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"min(max by(deployment)(kube_deployment_status_replicas_available{namespace=\\\"channel-ussd\\\",deployment=~\\\"^(facade|gateway)$\\\"}) / clamp_min(max by(deployment)(kube_deployment_spec_replicas{namespace=\\\"channel-ussd\\\",deployment=~\\\"^(facade|gateway)$\\\"}),1)) * on() (count(max by(deployment)(kube_deployment_spec_replicas{namespace=\\\"channel-ussd\\\",deployment=~\\\"^(facade|gateway)$\\\"})) == bool 2)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-entry-health", + "attributes": { + "title": "Mobile Facade / Gateway Health", + "description": "Colored channel-entry health strip based only on Mobile facade and gateway Kubernetes deployment availability. Green=both healthy, amber=at least one degraded, red=one down or an expected deployment is missing.", + "hits": 0, + "columns": [ + "spanId", + "status.code", + "attributes.http.status_code", + "resource.attributes.service.name", + "kind", + "name", + "durationNano", + "durationInNanos", + "links", + "traceState", + "traceId" + ], + "sort": [], + "type": "traces", + "visualization": "{\"title\":\"Mobile Facade / Gateway Health\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#D0021B\",\"thresholds\":[{\"value\":0.01,\"color\":\"#F5A623\"},{\"value\":1,\"color\":\"#00BD6B\"}]},\"useThresholdColor\":true,\"textMode\":\"none\",\"colorMode\":\"background_solid\",\"decimals\":0,\"unitSuffix\":\"\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"min(max by(deployment)(kube_deployment_status_replicas_available{namespace=\\\"channel-mobile\\\",deployment=~\\\"^(facade|gateway)$\\\"}) / clamp_min(max by(deployment)(kube_deployment_spec_replicas{namespace=\\\"channel-mobile\\\",deployment=~\\\"^(facade|gateway)$\\\"}),1)) * on() (count(max by(deployment)(kube_deployment_spec_replicas{namespace=\\\"channel-mobile\\\",deployment=~\\\"^(facade|gateway)$\\\"})) == bool 2)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-channel-mobile-current-requests", + "attributes": { + "title": "Mobile Current Requests", + "description": "Current span-derived entry-request volume for standardized mobile-* services. This is a windowed request count, not requests per second.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Mobile Current Requests\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" requests\",\"addLegend\":false,\"addTimeMarker\":false,\"titleOptions\":{\"show\":false,\"titleName\":\"\"}},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum(request{namespace=\\\"span_derived\\\",environment=\\\"reference\\\",remoteService=\\\"\\\",service=~\\\"mobile-.*\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-filesystem-usage", + "attributes": { + "title": "Filesystem Usage by Mount", + "description": "Filesystem utilization percentage by host and mount point. Virtual and pseudo filesystems are excluded.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Filesystem Usage by Node / Mount\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"decimals\":1,\"unitSuffix\":\" %\",\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"useThresholdColor\":false},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip,mountpoint)(100 * (1 - (node_filesystem_avail_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"} / clamp_min(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"},1))))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-disk-io", + "attributes": { + "title": "Physical Disk I/O", + "description": "Physical disk read and write throughput by host in MiB/s. Device filtering excludes LVM/device-mapper duplication and non-storage devices.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Disk I/O by Node\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"decimals\":2,\"unitSuffix\":\" MiB/s\",\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"useThresholdColor\":false},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"label_replace((sum by(node,ip)(rate(node_disk_read_bytes_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",device=~\\\"^(sda|sdb)$\\\"}[5m])) / 1024 / 1024),\\\"direction\\\",\\\"read\\\",\\\"\\\",\\\"\\\") or label_replace((sum by(node,ip)(rate(node_disk_written_bytes_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",device=~\\\"^(sda|sdb)$\\\"}[5m])) / 1024 / 1024),\\\"direction\\\",\\\"write\\\",\\\"\\\",\\\"\\\")\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-node-cpu-trend", + "attributes": { + "title": "CPU Usage by Host", + "description": "Historical CPU utilization percentage by Node Exporter host over 5-minute rates.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - CPU Usage by Node\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"decimals\":1,\"unitSuffix\":\" %\",\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"useThresholdColor\":false},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - avg by(node,ip)(rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",mode=\\\"idle\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-cpu-capacity", + "attributes": { + "title": "192.0.2.11 — CPU Capacity (cores)", + "description": "Total logical CPU cores reported by Node Exporter for 192.0.2.11.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.11 \\u2014 CPU Capacity (cores)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" cores\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count by(node,ip)(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\",mode=\\\"idle\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-cpu-capacity", + "attributes": { + "title": "192.0.2.12 — CPU Capacity (cores)", + "description": "Total logical CPU cores reported by Node Exporter for 192.0.2.12.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.12 \\u2014 CPU Capacity (cores)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" cores\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count by(node,ip)(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\",mode=\\\"idle\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-cpu-capacity", + "attributes": { + "title": "192.0.2.13 — CPU Capacity (cores)", + "description": "Total logical CPU cores reported by Node Exporter for 192.0.2.13.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.13 \\u2014 CPU Capacity (cores)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" cores\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count by(node,ip)(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\",mode=\\\"idle\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-cpu-capacity", + "attributes": { + "title": "192.0.2.20 — CPU Capacity (cores)", + "description": "Total logical CPU cores reported by Node Exporter for 192.0.2.20.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.20 \\u2014 CPU Capacity (cores)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":0,\"unitSuffix\":\" cores\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count by(node,ip)(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\",mode=\\\"idle\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-memory", + "attributes": { + "title": "192.0.2.11 — Memory Usage [🟠70% | 🔴85%]", + "description": "Current memory utilization for host-01 using MemAvailable versus total memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-01 \\u2014 Memory Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - (max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\"}) / max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\"})))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-memory", + "attributes": { + "title": "192.0.2.12 — Memory Usage [🟠70% | 🔴85%]", + "description": "Current memory utilization for host-02 using MemAvailable versus total memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-02 \\u2014 Memory Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - (max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\"}) / max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\"})))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-memory", + "attributes": { + "title": "192.0.2.13 — Memory Usage [🟠70% | 🔴85%]", + "description": "Current memory utilization for host-03 using MemAvailable versus total memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-03 \\u2014 Memory Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - (max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\"}) / max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\"})))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-cpu", + "attributes": { + "title": "192.0.2.11 — CPU Usage [🟠70% | 🔴85%]", + "description": "Current 5-minute CPU utilization for host-01.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-01 \\u2014 CPU Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - avg by(node,ip)(rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\",mode=\\\"idle\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-cpu", + "attributes": { + "title": "192.0.2.12 — CPU Usage [🟠70% | 🔴85%]", + "description": "Current 5-minute CPU utilization for host-02.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-02 \\u2014 CPU Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - avg by(node,ip)(rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\",mode=\\\"idle\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-cpu", + "attributes": { + "title": "192.0.2.13 — CPU Usage [🟠70% | 🔴85%]", + "description": "Current 5-minute CPU utilization for host-03.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-03 \\u2014 CPU Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - avg by(node,ip)(rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\",mode=\\\"idle\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-memory", + "attributes": { + "title": "192.0.2.20 — Memory Usage [🟠70% | 🔴85%]", + "description": "Current memory utilization for observability-host-01 using MemAvailable versus total memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"observability-host-01 \\u2014 Memory Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - (max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\"}) / max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\"})))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-node-memory-trend", + "attributes": { + "title": "Memory Usage by Host", + "description": "Historical memory utilization percentage by host, calculated from MemAvailable versus total physical memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Memory Usage by Host\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"bottom\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"decimals\":1,\"unitSuffix\":\" %\",\"tooltipOptions\":{\"mode\":\"all\"},\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"useThresholdColor\":false},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - (max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\"}) / max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\"})))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-cpu", + "attributes": { + "title": "192.0.2.20 — CPU Usage [🟠70% | 🔴85%]", + "description": "Current 5-minute CPU utilization for observability-host-01.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"observability-host-01 \\u2014 CPU Usage\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":70,\"color\":\"#F5A623\"},{\"value\":85,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"100 * (1 - avg by(node,ip)(rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\",mode=\\\"idle\\\"}[5m])))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-deployments", + "attributes": { + "title": "Kubernetes Deployments", + "description": "Total platform and observability deployments over time.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Deployments\",\"chartType\":\"area\",\"params\":{\"addLegend\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"tooltipOptions\":{\"mode\":\"all\"},\"barSizeMode\":\"auto\",\"barWidth\":0.7,\"barPadding\":0.1,\"showBarBorder\":false,\"barBorderWidth\":1,\"barBorderColor\":\"#000000\",\"stackMode\":\"none\",\"showValues\":true,\"bucket\":{\"aggregationType\":\"max\",\"bucketTimeUnit\":\"auto\"},\"decimals\":0,\"showFullTimeRange\":false,\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"useThresholdColor\":false,\"standardAxes\":[{\"position\":\"bottom\",\"show\":true,\"labels\":{\"show\":true,\"filter\":false,\"rotate\":-45,\"truncate\":30},\"title\":{\"text\":\"Namespaces\"},\"axisRole\":\"x\",\"grid\":{\"showLines\":false}},{\"position\":\"left\",\"show\":true,\"labels\":{\"show\":true,\"filter\":false,\"rotate\":0,\"truncate\":100},\"title\":{\"text\":\"Running Pods\"},\"axisRole\":\"y\",\"grid\":{\"showLines\":true}}],\"unitSuffix\":\"\",\"lineMode\":\"straight\",\"lineWidth\":2},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count(\\n kube_deployment_spec_replicas{\\n namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"\\n }\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-unavailable-by-deployment", + "attributes": { + "title": "Unavailable Pods by Deployment", + "description": "Unavailable deployment replicas. Shows zero when all platform deployments are healthy; affected deployment series appear automatically when unavailable replicas exist.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Unavailable pods per deployment [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(workload)(\\n label_join(\\n kube_deployment_status_replicas_unavailable{\\n namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"\\n } > 0,\\n \\\"workload\\\",\\\"\\\",\\\"deployment\\\"\\n )\\n) or vector(0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-available-by-deployment", + "attributes": { + "title": "Available Pods by Deployment", + "description": "Available replicas by platform deployment.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Available pods per deployment [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(workload)(\\n label_join(\\n kube_deployment_status_replicas_available{\\n namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"\\n },\\n \\\"workload\\\",\\\"\\\",\\\"deployment\\\"\\n )\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-top-memory", + "attributes": { + "title": "Top Memory-Intensive Pods", + "description": "Top platform pods by working-set memory.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Top memory intensive pods [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\" MiB\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(\\n 10,\\n max by(workload)(\\n label_join(\\n sum by(namespace,pod)(\\n container_memory_working_set_bytes{\\n namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\",\\n pod!=\\\"\\\",\\n container!=\\\"\\\",\\n container!=\\\"POD\\\"\\n }\\n ) / 1024 / 1024,\\n \\\"workload\\\",\\\"\\\",\\\"pod\\\"\\n )\\n )\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-unavailable-pods", + "attributes": { + "title": "Unavailable Pods", + "description": "Total unavailable platform deployment replicas over time.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Unavailable pods\",\"chartType\":\"area\",\"params\":{\"addLegend\":false,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum(kube_deployment_status_replicas_unavailable{namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"}) or vector(0)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-memory-by-node", + "attributes": { + "title": "Memory Usage by Node", + "description": "Memory utilization of Kubernetes nodes only.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Memory usage by node [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\"%\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node)(\\n (\\n 100 * (\\n 1 -\\n (\\n max by(node,ip)(\\n node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\"}\\n )\\n /\\n max by(node,ip)(\\n node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\"}\\n )\\n )\\n )\\n )\\n and on(node) kube_node_info\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-desired-pods", + "attributes": { + "title": "Desired Pods", + "description": "Total desired platform deployment replicas over time.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Desired pods\",\"chartType\":\"area\",\"params\":{\"addLegend\":false,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum(kube_deployment_spec_replicas{namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-available-pods", + "attributes": { + "title": "Available Pods", + "description": "Total available platform deployment replicas over time.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Available pods [Kubernetes]\",\"chartType\":\"area\",\"params\":{\"addLegend\":false,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum(kube_deployment_status_replicas_available{namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\"})\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-cpu-by-node", + "attributes": { + "title": "CPU Usage by Node", + "description": "CPU utilization of Kubernetes nodes only.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"CPU usage by node [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":1,\"unitSuffix\":\"%\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node)(\\n (100 * (\\n 1 -\\n avg by(node,ip)(\\n rate(node_cpu_seconds_total{job=\\\"node-exporter\\\",ip!=\\\"\\\",mode=\\\"idle\\\"}[5m])\\n )\\n ))\\n and on(node) kube_node_info\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-nodes", + "attributes": { + "title": "Kubernetes Nodes", + "description": "Kubernetes node count over time.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Kubernetes - Nodes\",\"chartType\":\"area\",\"params\":{\"addLegend\":false,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":0,\"unitSuffix\":\"\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"count(kube_node_info)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-filesystem-max", + "attributes": { + "title": "192.0.2.11 — Max Filesystem Usage [🟠80% | 🔴90%]", + "description": "Highest utilization percentage among real filesystems on host-01.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-01 \\u2014 Max Filesystem\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":80,\"color\":\"#F5A623\"},{\"value\":90,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(100 * (1 - (node_filesystem_avail_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"} / clamp_min(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"},1))))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-filesystem-max", + "attributes": { + "title": "192.0.2.12 — Max Filesystem Usage [🟠80% | 🔴90%]", + "description": "Highest utilization percentage among real filesystems on host-02.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-02 \\u2014 Max Filesystem\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":80,\"color\":\"#F5A623\"},{\"value\":90,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(100 * (1 - (node_filesystem_avail_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"} / clamp_min(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"},1))))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-k8s-overview-top-cpu", + "attributes": { + "title": "Top CPU-Intensive Pods", + "description": "Top platform pods by CPU consumption.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"Top CPU intensive pods [Kubernetes]\",\"chartType\":\"line\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"legendPosition\":\"right\",\"legendTitle\":\"\",\"lineMode\":\"straight\",\"lineStyle\":\"line\",\"lineWidth\":2,\"showFullTimeRange\":false,\"standardAxes\":[],\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholdStyle\":\"off\",\"thresholds\":[]},\"titleOptions\":{\"show\":false,\"titleName\":\"\"},\"tooltipOptions\":{\"mode\":\"all\"},\"decimals\":3,\"unitSuffix\":\" cores\",\"useThresholdColor\":false,\"stackMode\":\"none\"},\"axesMapping\":{\"color\":\"Series\",\"x\":\"Time\",\"y\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"topk(\\n 10,\\n max by(workload)(\\n label_join(\\n sum by(namespace,pod)(\\n rate(\\n container_cpu_usage_seconds_total{\\n namespace=~\\\"^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|cattle-system|cattle-turtles-system|cert-manager|fleet-default|kube-system|longhorn-system|monitoring)$\\\",\\n pod!=\\\"\\\",\\n container!=\\\"\\\",\\n container!=\\\"POD\\\"\\n }[5m]\\n )\\n ),\\n \\\"workload\\\",\\\"\\\",\\\"pod\\\"\\n )\\n )\\n)\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-disk-capacity", + "attributes": { + "title": "192.0.2.11 — Filesystem Capacity (GiB)", + "description": "Combined capacity of unique mounted real filesystem devices reported by Node Exporter for 192.0.2.11.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.11 \\u2014 Disk Capacity (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum by(node,ip)(max by(node,ip,device)(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"})) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-disk-capacity", + "attributes": { + "title": "192.0.2.12 — Filesystem Capacity (GiB)", + "description": "Combined capacity of unique mounted real filesystem devices reported by Node Exporter for 192.0.2.12.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.12 \\u2014 Disk Capacity (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum by(node,ip)(max by(node,ip,device)(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"})) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-disk-capacity", + "attributes": { + "title": "192.0.2.13 — Filesystem Capacity (GiB)", + "description": "Combined capacity of unique mounted real filesystem devices reported by Node Exporter for 192.0.2.13.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.13 \\u2014 Disk Capacity (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum by(node,ip)(max by(node,ip,device)(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"})) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-memory-available", + "attributes": { + "title": "192.0.2.11 — Memory Available (GiB)", + "description": "Currently available memory on host-01 in GiB.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-01 \\u2014 RAM Available\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-01-ram-total", + "attributes": { + "title": "192.0.2.11 — Memory Capacity (GiB)", + "description": "Total physical memory reported by Node Exporter for 192.0.2.11.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.11 \\u2014 RAM Total (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-01\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-memory-available", + "attributes": { + "title": "192.0.2.12 — Memory Available (GiB)", + "description": "Currently available memory on host-02 in GiB.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-02 \\u2014 RAM Available\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-02-ram-total", + "attributes": { + "title": "192.0.2.12 — Memory Capacity (GiB)", + "description": "Total physical memory reported by Node Exporter for 192.0.2.12.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.12 \\u2014 RAM Total (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-02\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-filesystem-max", + "attributes": { + "title": "192.0.2.13 — Max Filesystem Usage [🟠80% | 🔴90%]", + "description": "Highest utilization percentage among real filesystems on host-03.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-03 \\u2014 Max Filesystem\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":80,\"color\":\"#F5A623\"},{\"value\":90,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(100 * (1 - (node_filesystem_avail_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"} / clamp_min(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"},1))))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-memory-available", + "attributes": { + "title": "192.0.2.13 — Memory Available (GiB)", + "description": "Currently available memory on host-03 in GiB.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"host-03 \\u2014 RAM Available\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-host-03-ram-total", + "attributes": { + "title": "192.0.2.13 — Memory Capacity (GiB)", + "description": "Total physical memory reported by Node Exporter for 192.0.2.13.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.13 \\u2014 RAM Total (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"host-03\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-disk-capacity", + "attributes": { + "title": "192.0.2.20 — Filesystem Capacity (GiB)", + "description": "Combined capacity of unique mounted real filesystem devices reported by Node Exporter for 192.0.2.20.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.20 \\u2014 Disk Capacity (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"sum by(node,ip)(max by(node,ip,device)(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"})) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-filesystem-max", + "attributes": { + "title": "192.0.2.20 — Max Filesystem Usage [🟠80% | 🔴90%]", + "description": "Highest utilization percentage among real filesystems on observability-host-01.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"observability-host-01 \\u2014 Max Filesystem\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[{\"value\":80,\"color\":\"#F5A623\"},{\"value\":90,\"color\":\"#D0021B\"}]},\"useThresholdColor\":true,\"textMode\":\"value\",\"colorMode\":\"background_solid\",\"decimals\":1,\"unitSuffix\":\"\",\"unitId\":\"percentage\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(100 * (1 - (node_filesystem_avail_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"} / clamp_min(node_filesystem_size_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\",fstype!~\\\"tmpfs|overlay|squashfs|proc|sysfs|devtmpfs|devpts|cgroup2?|tracefs|securityfs|pstore|debugfs|mqueue|hugetlbfs|configfs|fusectl|autofs|binfmt_misc|rpc_pipefs\\\"},1))))\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-memory-available", + "attributes": { + "title": "192.0.2.20 — Memory Available (GiB)", + "description": "Currently available memory on observability-host-01 in GiB.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"observability-host-01 \\u2014 RAM Available\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemAvailable_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + }, + { + "type": "explore", + "id": "std-infra-observability-host-01-ram-total", + "attributes": { + "title": "192.0.2.20 — Memory Capacity (GiB)", + "description": "Total physical memory reported by Node Exporter for 192.0.2.20.", + "hits": 0, + "columns": [ + "_source" + ], + "sort": [], + "type": "metrics", + "visualization": "{\"title\":\"192.0.2.20 \\u2014 RAM Total (GiB)\",\"chartType\":\"metric\",\"params\":{\"showTitle\":false,\"title\":\"\",\"showPercentage\":false,\"percentageColor\":\"standard\",\"valueCalculation\":\"last\",\"thresholdOptions\":{\"baseColor\":\"#00BD6B\",\"thresholds\":[]},\"useThresholdColor\":false,\"textMode\":\"value\",\"colorMode\":\"none\",\"decimals\":1,\"unitSuffix\":\" GiB\"},\"axesMapping\":{\"value\":\"Value\"}}", + "uiState": "{\"activeTab\":\"explore_visualization_tab\"}", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"max by(node,ip)(node_memory_MemTotal_bytes{job=\\\"node-exporter\\\",ip!=\\\"\\\",node=\\\"observability-host-01\\\"}) / 1024 / 1024 / 1024\",\"language\":\"PROMQL\",\"dataset\":{\"id\":\"reference-prometheus\",\"title\":\"reference-prometheus\",\"type\":\"PROMETHEUS\",\"language\":\"PROMQL\",\"timeFieldName\":\"Time\",\"dataSource\":{},\"signalType\":\"metrics\"}},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "reference-prometheus", + "type": "index-pattern" + } + ] + } + ] +} diff --git a/dashboards/reference/saved-searches.json b/dashboards/reference/saved-searches.json new file mode 100644 index 0000000..6f0d9cb --- /dev/null +++ b/dashboards/reference/saved-searches.json @@ -0,0 +1,77 @@ +{ + "saved_objects": [ + { + "id": "std-dev-http-routes-requests", + "type": "search", + "attributes": { + "title": "HTTP Routes & Requests", + "description": "HTTP server spans for request-level investigation using service, route, status, duration and trace ID.", + "columns": [ + "serviceName", + "span.attributes.http@request@method", + "span.attributes.http@route", + "span.attributes.http@response@status_code", + "durationInNanos", + "traceId" + ], + "sort": [ + [ + "endTime", + "desc" + ] + ], + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"kind:\\\"SPAN_KIND_SERVER\\\" and instrumentationScope.name.keyword:\\\"io.opentelemetry.tomcat-10.0\\\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern", + "id": "std-apm-span-data-view" + } + ], + "migrationVersion": { + "search": "7.9.3" + } + }, + { + "id": "std-logs-application", + "type": "search", + "attributes": { + "title": "Application Logs", + "description": "Application workload logs from the standardized application-log data view. Includes Kubernetes workload metadata and trace/span IDs when present.", + "columns": [ + "level", + "serviceName", + "kubernetes.namespace_name", + "kubernetes.pod_name", + "kubernetes.container_name", + "logger", + "traceId", + "spanId", + "message" + ], + "sort": [ + [ + "time", + "desc" + ] + ], + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + } + }, + "references": [ + { + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "id": "std-logs-application-dataset", + "type": "index-pattern" + } + ], + "migrationVersion": { + "search": "7.9.3" + } + } + ] +} diff --git a/docs/02-architecture.md b/docs/02-architecture.md index b571e08..e62abbe 100644 --- a/docs/02-architecture.md +++ b/docs/02-architecture.md @@ -68,7 +68,7 @@ The observability system is not part of the business request path. If the observ | Node telemetry agent | Optional DaemonSet | One per eligible worker | Reads node-local logs and host telemetry | | Fluent Bit | Existing DaemonSet, if retained | One per worker | Kubernetes container log collection | | Data Prepper | Platform service | Dedicated observability host(s) | Trace/log processing and service-map generation | -| Prometheus | Platform service | Dedicated observability host(s) | Metrics storage, RED rules, SLO calculations | +| Prometheus | Platform service | Dedicated observability host(s) | Metrics storage, remote-write ingestion, alert evaluation, and optional derived/reporting rules | | OpenSearch | Stateful platform | Dedicated observability host(s) | Trace, log, and service-map storage | | OpenSearch Dashboards | Platform service | Dedicated observability host(s) | APM, search, dashboards, and reporting | @@ -86,12 +86,13 @@ The observability system is not part of the business request path. If the observ ### Metrics -1. Application agents produce runtime and HTTP metrics. -2. Collectors receive OTLP metrics and scrape approved cluster targets. -3. Resource attributes are converted to stable Prometheus labels. -4. Collectors remote-write metrics to Prometheus. -5. Generic recording rules calculate request, error, fault, latency, availability, and error-budget values by service and environment. -6. A reusable dashboard selects any discovered service without creating service-specific rules. +1. Application agents and Kubernetes integrations produce runtime, request, workload, and platform metrics. +2. The in-cluster Collector receives OTLP metrics and scrapes approved Kubernetes targets. +3. Resource attributes are converted to stable Prometheus labels and metrics are remote-written to Prometheus. +4. Data Prepper's service-map processing emits the live `span_derived` RED metric family (`request`, `error`, `fault`, and `latency_seconds_bucket`) directly to Prometheus through its Prometheus sink. +5. Prometheus evaluates reusable alert rules against those metrics and the host/Kubernetes metric sources. +6. Optional recording/reporting rules may be enabled for deployments that require precomputed reports, but they are not required for the validated live RED path. +7. Reusable dashboards select discovered services without creating service-specific alert rules. ### Logs diff --git a/docs/05-kubernetes-telemetry-onboarding.md b/docs/05-kubernetes-telemetry-onboarding.md index 41a187a..7e134e9 100644 --- a/docs/05-kubernetes-telemetry-onboarding.md +++ b/docs/05-kubernetes-telemetry-onboarding.md @@ -107,7 +107,7 @@ The lab produced the following results: - Collector rollout completed without warnings or errors. - Dedicated Collector RBAC returned `yes` for required reads and no write permissions were granted. - A newly Operator-instrumented Java service exported traces, logs, and metrics. -- The reporting rules discovered the new service automatically. +- Service-derived RED metrics appeared automatically for the newly instrumented service through the Collector/Data Prepper/Prometheus path. - Kubernetes metadata existed in both log and span resource attributes. - Four business log records shared one trace across the gateway and payment services. - Fluent Bit exclusion removed the two duplicate, uncorrelated gateway log records. diff --git a/docs/08-reference-uat-baseline.md b/docs/08-reference-uat-baseline.md index 312e417..f0a8057 100644 --- a/docs/08-reference-uat-baseline.md +++ b/docs/08-reference-uat-baseline.md @@ -28,6 +28,7 @@ The reference dedicated host runs these systemd-managed services: - Data Prepper - Prometheus - Alertmanager +- node_exporter - process-exporter The Prometheus reference process uses: diff --git a/docs/11-live-closeout.md b/docs/11-live-closeout.md index 44c7e70..d4394fe 100644 --- a/docs/11-live-closeout.md +++ b/docs/11-live-closeout.md @@ -1,102 +1,112 @@ # Live Observability Closeout **Status:** Passed -**Closeout date:** 2026-09-27 +**Closeout date:** 2026-10-02 -This document records the sanitized final verification of the operated UAT -observability environment. Customer names, internal hostnames, private -addresses, credentials, certificate identities, tokens, and telemetry payloads -are intentionally excluded. +This document records the sanitized final verification of the operated UAT observability environment. Customer names, internal hostnames, private addresses, credentials, certificate identities, tokens, workspace identifiers, and telemetry payloads are intentionally excluded. ## Final verification result -The Git-tracked live closeout verifier completed successfully against the -operated environment. +The operated environment passed the final naming, alerting, telemetry, dashboard, and rollback checks. -### Services +### Services and telemetry paths -All expected services were active: +The final architecture uses: -- OpenSearch -- OpenSearch Dashboards -- Data Prepper -- Prometheus -- Alertmanager -- process-exporter -- node_exporter +- OpenTelemetry Java instrumentation for application telemetry; +- one in-cluster OpenTelemetry Collector path for OTLP reception, Kubernetes enrichment, and signal routing; +- Fluent Bit for Kubernetes/container log collection where OTLP log export is not used; +- node_exporter on monitored Linux hosts for host CPU, memory, filesystem, disk, network, load, and uptime metrics; +- kube-state-metrics and kubelet/cAdvisor for Kubernetes state and workload resource metrics; +- Data Prepper for trace/log processing, v2 service-map generation, and service-derived RED metric output; +- Prometheus for metric storage, alert evaluation, and remote-write ingestion; +- Alertmanager for grouping, inhibition, routing, and Telegram notification delivery; +- OpenSearch and OpenSearch Dashboards for logs, traces, service maps, dashboards, and investigation. -### Listener contract +### Prometheus rule state -All expected listener ports were present: +The final live rule baseline is: -- Data Prepper HTTP logs: 2021 -- Data Prepper core API: 4900 -- OpenSearch Dashboards: 5601 -- Prometheus: 9090 -- Alertmanager: 9093 -- node_exporter: 9115 -- OpenSearch HTTPS: 9200 -- process-exporter: 9256 -- OpenSearch transport: 9300 -- Data Prepper OTLP traces: 21890 +- 9 rule groups; +- 16 alerting rules; +- 0 recording rules; +- 0 unhealthy rules after evaluation. -### Readiness and reachability +The live RED metrics used by application dashboards and alert rules are supplied by the Data Prepper service-map Prometheus sink. The repository keeps optional recording/reporting rules as a reusable alternative, but they are not required by this operated live path. -The final verification confirmed: +The standardized live rule files are: -- Prometheus readiness endpoint healthy; -- Alertmanager readiness endpoint healthy; -- node_exporter metrics reachable; -- process-exporter metrics reachable; -- OpenSearch HTTPS reachable and protected by authentication; -- OpenSearch Dashboards reachable and protected by authentication. +- `application-alerts.yml`; +- `platform-alerts.yml`; +- `infrastructure-alerts.yml`. -### Configuration validation +The standardized rule groups use the reusable `observability-*` naming contract. Alert names remain stable PascalCase identifiers and were not renamed during the standardization. -The live configuration passed: +### Alertmanager standard -- Prometheus configuration validation; -- Prometheus alert-rule validation; -- Alertmanager configuration validation. +The final live naming contract is: -### Loaded Prometheus rule state +- receiver: `telegram-observability`; +- template: `telegram.observability.message`; +- template file: `telegram.tmpl`. -The live Prometheus API reported: +Operational behavior remains: -- 9 rule groups; -- 16 alerting rules; -- 0 recording rules. +- `group_wait: 30s`; +- `group_interval: 5m`; +- `repeat_interval: 4h`; +- `send_resolved: true`; +- four warning-to-critical inhibition rules for CPU, memory, filesystem, and application P99 latency. + +### Log and APM presentation + +Application and platform logs are deliberately separated: + +- `Application Logs`; +- `Kubernetes Platform Logs`. + +Application logs retain trace/span/service/time correlation metadata. Platform logs remain separate from application trace correlation. + +The APM data-view display names are standardized as: + +- `APM Traces`; +- `APM Service Map`. + +### Dashboard presentation + +The final dashboard set is: + +- Infrastructure Health; +- Deployment & Workload Health; +- Application Performance; +- Developer Investigation; +- Real-Time Channel Performance; +- Kubernetes Platform Health. + +Kubernetes panel titles use consistent Title Case. Infrastructure cards use consistent CPU, Memory, and Filesystem terminology. + +Dashboard color thresholds are immediate visual indicators. Prometheus alert thresholds may intentionally be higher and require a sustained `for:` duration before notification. -### Alerting standardization +## Change safety and rollback -The final alerting pass preserved every validated PromQL expression and every -`for:` duration while standardizing operator-facing metadata. The live rule -set uses consistent severity, team, and environment labels plus summary, -description, threshold, impact, action, and recovery annotations. Numeric -`observed` annotations are included only when the rule value is meaningful. +Final standardization followed a backup-first operating procedure. -Telegram notifications use a shared Alertmanager template with explicit ALERT -and RECOVERED states, Prometheus identified as the detector, Alertmanager as -the notification component, and plain node/IP identity rather than exposing a -scrape-target `IP:port` when cleaner labels are available. +Before every live configuration or saved-object mutation, a timestamped backup of the affected files or objects was created. Rollback material was retained before applying changes, and post-change validation was required before accepting the new baseline. -### Telemetry presence +The final backend naming change preserved full Prometheus and Alertmanager configuration directories plus a rollback script. The final UI naming change preserved every targeted saved object plus a rollback script. -The final verification confirmed that the derived request metric used by the -application-observability dashboards was present for the target UAT environment. +Two earlier backend-standardization attempts intentionally triggered automatic rollback because validation gates failed. Subsequent verification confirmed that the previous configuration was restored and all 16 Prometheus rules returned to healthy state. This provides tested rollback evidence rather than relying only on the existence of backups. ## Closeout decision -The operated UAT observability environment is considered functionally complete -for the current scope: +The operated UAT observability environment is functionally complete for the current scope: - core observability services are running; -- metrics, traces, logs, dashboards, RBAC, and alerting dependencies are in place; -- alerting configuration is loaded and valid; -- host and application telemetry are present; -- the reusable repository reproduces the pinned component baseline and captures - the reference runtime contract. - -Remaining repository hardening work, including full disaster/restore -qualification and any later operating-system/version modernization, is tracked -separately and does not block this environment closeout. +- OpenTelemetry, logs, metrics, traces, service maps, dashboards, RBAC, and alerting dependencies are in place; +- Linux host metrics are collected from monitored hosts through node_exporter; +- application and platform telemetry are separated where appropriate; +- all 16 live alerts use the standardized naming and metadata contract; +- backup and rollback controls were exercised during final standardization; +- the public repository contains only sanitized reusable configuration and documentation. + +Production HA, capacity engineering, TLS hardening, secret-management integration, retention/snapshot policy, and disaster recovery remain separate production-promotion concerns. diff --git a/docs/14-alerting-standard.md b/docs/14-alerting-standard.md index ee289da..e7dad8b 100644 --- a/docs/14-alerting-standard.md +++ b/docs/14-alerting-standard.md @@ -4,41 +4,85 @@ This repository keeps alert detection, routing, presentation, and secrets separate so the same alerting design can be reused across lab, UAT, and production environments. -The standardized contract was validated against the operated UAT reference environment and then sanitized for repository use. +The final live contract was validated against the operated UAT reference environment and sanitized for repository use. ## Responsibility split - **Exporters / application telemetry** provide metrics. -- **Prometheus** evaluates alert rules and determines when a condition is firing or recovered. -- **Alertmanager** groups, routes, and delivers notifications. +- **Prometheus** evaluates alert rules and determines when a condition is pending, firing, or recovered. +- **Alertmanager** groups, inhibits, routes, and delivers notifications. - **Telegram** is a notification destination only. -Telegram messages therefore identify Prometheus as the detector and Alertmanager as the notification component. When a metric has a useful source label such as `job=node-exporter`, the template exposes that as the metric source. +Telegram messages identify Prometheus as the detector and Alertmanager as the notification component. When a metric has a useful source label such as `job=node-exporter`, the template exposes that as the metric source. + +## Naming contract + +Prometheus rule files use functional, environment-neutral names: + +- `application-alerts.yml`; +- `platform-alerts.yml`; +- `infrastructure-alerts.yml`. + +Rule groups use lowercase kebab-case and the `observability-` prefix: + +- `observability-application-errors`; +- `observability-application-latency`; +- `observability-platform-health`; +- `observability-kubernetes-availability`; +- `observability-monitoring-targets`; +- `observability-node-cpu`; +- `observability-node-memory`; +- `observability-node-filesystem`; +- `observability-rke2-storage`. + +Alert names are stable PascalCase identifiers such as `NodeDiskUsageHigh` and `ApplicationP99LatencyCritical`. Customer names and environment names do not belong in alert or rule-group identifiers; deployment scope belongs in labels such as `environment`. ## Alert labels -Every operational alert should provide: +Every operational alert provides: - `severity`: normally `warning` or `critical`; - `team`: for example `infrastructure` or `application`; - `environment`: rendered from the target deployment environment. -Additional category labels may be used when useful. +Additional category labels are used where useful. ## Alert annotations Use the following operator-facing annotation contract where semantically meaningful: -- `summary`: short human-readable problem statement; -- `description`: what condition has persisted and for how long; -- `observed`: current measured value when the alert expression produces a meaningful numeric value; -- `threshold`: configured trigger condition; -- `impact`: likely operational or user impact; -- `action`: first investigation or remediation step; -- `recovery`: factual statement describing what condition is no longer being reported. +- `summary`; +- `description`; +- `observed` when the expression produces a meaningful numeric value; +- `threshold`; +- `impact`; +- `action`; +- `recovery`. Do not invent an `observed` value for binary conditions such as NotReady or CrashLoopBackOff. +## Alertmanager contract + +The reusable naming contract is: + +- receiver: `telegram-observability`; +- template: `telegram.observability.message`; +- template file: `telegram.tmpl`. + +The validated routing timing is: + +- `group_wait: 30s`; +- `group_interval: 5m`; +- `repeat_interval: 4h`; +- `send_resolved: true`. + +The final configuration inhibits a warning when the matching critical alert is firing for the same resource: + +- node filesystem usage: match by environment, node, and mountpoint; +- node CPU usage: match by environment and node; +- node memory usage: match by environment and node; +- application P99 latency: match by environment and service. + ## Telegram presentation Firing notifications use severity-aware headings such as: @@ -54,43 +98,42 @@ Recovered notifications use: ✅ RECOVERED ``` -The standard template prefers human-readable resource identity: +The presentation is grouped and compact. Common threshold, impact, and action context should not be repeated unnecessarily for every resource in the same notification group. -- Service -- Node -- plain IP address -- Namespace / Pod / Container -- Resource / mountpoint - -It intentionally does **not** show Prometheus scrape-target `instance=IP:port` when a cleaner node/IP identity is already available. +The template prefers human-readable resource identity and does not expose a raw scrape-target `IP:port` when cleaner node/IP labels are available. A recovery notification means that Prometheus no longer reports the configured alert condition. It does not claim whether recovery was automatic or operator-driven. +## Live rule architecture versus optional recording rules + +The operated UAT baseline uses 16 alerting rules and 0 recording rules. Its live `span_derived` RED metrics are produced by the Data Prepper service-map Prometheus sink. + +The repository may retain optional recording/reporting rule examples for environments that derive or precompute those metrics differently. Such optional rules must not be assumed to be active in the live baseline. + ## Repository files -- `prometheus/rules/infrastructure-alerts.yml.example` — standardized infrastructure alerts; -- `prometheus/rules/application-alerts.yml.example` — standardized application and supplemental platform alerts; -- `observability-host/alertmanager/telegram.tmpl` — common Telegram presentation template; -- `observability-host/alertmanager/alertmanager.yml.example` — sanitized routing example. +- `prometheus/rules/infrastructure-alerts.yml.example`; +- `prometheus/rules/application-alerts.yml.example`; +- `prometheus/rules/platform-alerts.yml.example`; +- `observability-host/alertmanager/telegram.tmpl`; +- `observability-host/alertmanager/alertmanager.yml.example`. -The reference configuration renderer converts the environment-aware rule examples into deployable `.yml` rule files and validates them with `promtool`. +The reference renderer substitutes deployment-specific environment values and validates generated rule files with `promtool`. -## Secret handling +## Change safety -Never commit: +Operational changes follow: -- Telegram bot tokens; -- real Telegram chat IDs used by a customer environment; -- OpenSearch passwords; -- private keys; -- kubeconfigs or bearer tokens. +`backup -> stage -> validate -> apply/reload -> verify -> retain rollback`. -The bot token is read from a private file. On the validated reference host the token-file access model is equivalent to owner/group read only for the service account that needs it. +A configuration change is not accepted merely because the service reloads. Prometheus rules must complete evaluation without `health="err"` or `lastError`, and Alertmanager must pass configuration validation. + +## Secret handling -A chat ID is an identifier rather than an authentication credential, but real deployment-specific IDs should still remain outside the public repository. +Never commit Telegram bot tokens, real deployment chat IDs, OpenSearch passwords, private keys, kubeconfigs, bearer tokens, internal hostnames, or private addresses. -## Recovery and delivery notes +The Telegram bot token is read from a private file. Deployment-specific chat IDs remain outside the public repository. -`send_resolved: true` remains enabled so operators receive recovery notifications. +## Delivery limitation -A Prometheus rule such as `PrometheusAlertmanagerUnavailable` is still useful for Prometheus-side visibility, but if the only Alertmanager instance is actually unavailable it cannot deliver its own Telegram notification. An independent watchdog is a future hardening option and is not required for the current functional baseline. +`PrometheusAlertmanagerUnavailable` is useful for Prometheus-side visibility, but an unavailable sole Alertmanager instance cannot deliver its own Telegram notification. Independent watchdog delivery is a production-hardening option. diff --git a/docs/15-ubuntu-2404-cleanroom-qualification.md b/docs/15-ubuntu-2404-cleanroom-qualification.md index 646acc7..1b9730c 100644 --- a/docs/15-ubuntu-2404-cleanroom-qualification.md +++ b/docs/15-ubuntu-2404-cleanroom-qualification.md @@ -66,7 +66,7 @@ The qualification also confirmed: - OpenSearch Dashboards reachable; - all configured Prometheus scrape targets UP; - 16 standardized alerting rules loaded; -- 13 recording rules loaded; +- 13 optional recording/reporting rules loaded for this qualification run; - zero unhealthy Prometheus rules; - no failed systemd units; - no OOM-killer activity during the soak; diff --git a/docs/16-linux-host-metrics-onboarding.md b/docs/16-linux-host-metrics-onboarding.md new file mode 100644 index 0000000..462c183 --- /dev/null +++ b/docs/16-linux-host-metrics-onboarding.md @@ -0,0 +1,158 @@ +# Linux Host Metrics Onboarding + +**Scope:** Monitored Linux hosts, including RKE2 nodes and the dedicated observability host +**Exporter:** Prometheus node_exporter 1.12.1 +**Reference listen port:** 9115 +**Design goal:** Provide reusable host CPU, memory, filesystem, disk, network, load, and uptime telemetry without embedding customer-specific addresses in Git. + +## Purpose + +The observability platform uses node_exporter on Linux hosts that require host-level monitoring. In the validated UAT pattern, Prometheus scrapes node_exporter directly and attaches stable inventory labels such as node, IP, and role through the rendered target configuration. + +This is separate from Kubernetes workload telemetry: + +- OpenTelemetry Collector handles OTLP application telemetry and selected Kubernetes metrics. +- kube-state-metrics provides Kubernetes object state. +- cAdvisor/kubelet metrics provide container and pod resource usage. +- node_exporter provides Linux host and filesystem metrics. + +## Installation contract + +The reusable repository pins node_exporter in `versions.env`. Install the exact pinned release and the repository-provided systemd unit rather than relying on a distribution package with an uncontrolled version. + +Expected binary path: + +```text +/usr/local/bin/node_exporter +``` + +Expected service identity: + +```text +user: node_exporter +group: node_exporter +``` + +Expected listener: + +```text +0.0.0.0:9115 +``` + +The reference unit is: + +```text +observability-host/systemd/node_exporter.service +``` + +## Generic host installation + +Run the equivalent procedure on each approved Linux host. Keep environment-specific addresses outside Git. + +```bash +set -Eeuo pipefail + +VERSION="1.12.1" +ARCH="linux-amd64" +TMP="$(mktemp -d)" + +getent group node_exporter >/dev/null 2>&1 || groupadd --system node_exporter +id node_exporter >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin --gid node_exporter node_exporter + +curl -fL "https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.${ARCH}.tar.gz" -o "$TMP/node_exporter.tar.gz" + +tar -xzf "$TMP/node_exporter.tar.gz" -C "$TMP" + +install -o root -g root -m 0755 "$TMP/node_exporter-${VERSION}.${ARCH}/node_exporter" /usr/local/bin/node_exporter + +install -o root -g root -m 0644 observability-host/systemd/node_exporter.service /etc/systemd/system/node_exporter.service + +systemctl daemon-reload +systemctl enable --now node_exporter + +/usr/local/bin/node_exporter --version +systemctl is-active node_exporter +ss -ltnp | grep ':9115' +curl -fsS http://127.0.0.1:9115/metrics >/dev/null + +rm -rf "$TMP" +``` + +For production use, download verification must use the repository's pinned checksum workflow or an equivalently controlled artifact-verification process. + +## Prometheus target inventory + +Do not commit real host addresses. Put monitored hosts in the private target inventory consumed by `scripts/render-reference-config.sh`. + +Sanitized example: + +```json +{ + "node_exporter": [ + { + "target": "192.0.2.10:9115", + "node": "rke2-node-01", + "ip": "192.0.2.10", + "role": "rke2" + }, + { + "target": "192.0.2.20:9115", + "node": "observability-node-01", + "ip": "192.0.2.20", + "role": "observability" + } + ] +} +``` + +The renderer converts this inventory into the `node-exporter` Prometheus scrape job. The committed example inventory remains non-sensitive; customized target files stay outside Git. + +## Validation + +A host is considered onboarded only when all of the following pass: + +```bash +systemctl is-enabled node_exporter +systemctl is-active node_exporter +/usr/local/bin/node_exporter --version +curl -fsS http://127.0.0.1:9115/metrics >/dev/null +``` + +From Prometheus, validate that the target is UP and that core metrics are present: + +```promql +up{job="node-exporter"} +``` + +```promql +node_cpu_seconds_total{job="node-exporter"} +``` + +```promql +node_memory_MemAvailable_bytes{job="node-exporter"} +``` + +```promql +node_filesystem_avail_bytes{job="node-exporter"} +``` + +The Infrastructure Health dashboard and node resource alerts consume these metrics. + +## Firewall and exposure + +Port 9115 should be reachable only from the Prometheus/observability network path required for scraping. Do not expose node_exporter to untrusted networks. + +## Change safety and rollback + +Before replacing an existing node_exporter binary or unit: + +1. capture the current binary version; +2. back up the current systemd unit; +3. preserve the private Prometheus target inventory; +4. validate the replacement binary and unit; +5. restart or reload only after validation; +6. confirm the Prometheus target returns to UP. + +If the replacement fails, restore the previous binary/unit from the timestamped backup, reload systemd, restart node_exporter, and verify the target again. + +No production hostnames, addresses, credentials, certificates, or tokens belong in this repository. diff --git a/observability-host/README.md b/observability-host/README.md index fa30bf0..f6d2e20 100644 --- a/observability-host/README.md +++ b/observability-host/README.md @@ -19,7 +19,7 @@ They intentionally contain no addresses, credentials, certificates, or environme | `systemd/alertmanager.service` | `/etc/systemd/system/alertmanager.service` | Pinned Alertmanager process definition | | `systemd/node_exporter.service` | `/etc/systemd/system/node_exporter.service` | Reference node_exporter definition on port 9115 | | `alertmanager/alertmanager.yml.example` | `/etc/alertmanager/alertmanager.yml` | Reference alert routing without secrets | -| `alertmanager/telegram.tmpl` | `/etc/alertmanager/templates/observability-telegram.tmpl` | Generic Telegram alert format | +| `alertmanager/telegram.tmpl` | `/etc/alertmanager/templates/telegram.tmpl` | Generic Telegram alert format | | `prometheus/prometheus.yml.example` | `/etc/prometheus/prometheus.yml` | Parameterized 30-second scrape/evaluation baseline | | `process-exporter/process-exporter.yml` | `/etc/process-exporter/process-exporter.yml` | Reference process grouping | | `systemd/process-exporter.service` | `/etc/systemd/system/process-exporter.service` | Pinned process-exporter definition | @@ -43,6 +43,8 @@ The bootstrap installs the exact versions pinned in `versions.env`, verifies sig ## Runtime identity parity +Linux hosts that require host-level monitoring use the pinned node_exporter service and the private Prometheus target inventory described in [Linux Host Metrics Onboarding](../docs/16-linux-host-metrics-onboarding.md). + The reference runtime intentionally uses shared ownership for OpenSearch and Dashboards (`opensearch:opensearch`), `dataprepper:dataprepper` for Data Prepper, `prometheus:prometheus` for Prometheus, `alertmanager:alertmanager` diff --git a/observability-host/alertmanager/alertmanager.yml.example b/observability-host/alertmanager/alertmanager.yml.example index a9ea966..43abd76 100644 --- a/observability-host/alertmanager/alertmanager.yml.example +++ b/observability-host/alertmanager/alertmanager.yml.example @@ -5,20 +5,60 @@ templates: - /etc/alertmanager/templates/*.tmpl route: - receiver: telegram-infrastructure + receiver: telegram-observability + group_by: - alertname - severity - environment - group_wait: 10s + + group_wait: 30s group_interval: 5m repeat_interval: 4h receivers: - - name: telegram-infrastructure + - name: telegram-observability telegram_configs: - bot_token_file: "{{ ALERTMANAGER_TELEGRAM_TOKEN_FILE }}" chat_id: {{ ALERTMANAGER_TELEGRAM_CHAT_ID }} send_resolved: true parse_mode: '' message: '{{ template "telegram.observability.message" . }}' + +# Higher-severity alerts suppress the corresponding lower-severity +# notification for the same affected resource. Prometheus continues +# evaluating both rules; this controls notification noise only. +inhibit_rules: + + - source_matchers: + - 'alertname="NodeDiskUsageCritical"' + target_matchers: + - 'alertname="NodeDiskUsageHigh"' + equal: + - environment + - node + - mountpoint + + - source_matchers: + - 'alertname="NodeCPUUsageCritical"' + target_matchers: + - 'alertname="NodeCPUUsageHigh"' + equal: + - environment + - node + + - source_matchers: + - 'alertname="NodeMemoryUsageCritical"' + target_matchers: + - 'alertname="NodeMemoryUsageHigh"' + equal: + - environment + - node + + - source_matchers: + - 'alertname="ApplicationP99LatencyCritical"' + target_matchers: + - 'alertname="ApplicationP99LatencyHigh"' + equal: + - environment + - service diff --git a/observability-host/alertmanager/telegram.tmpl b/observability-host/alertmanager/telegram.tmpl index 98baa9a..feb1561 100644 --- a/observability-host/alertmanager/telegram.tmpl +++ b/observability-host/alertmanager/telegram.tmpl @@ -1,65 +1,99 @@ {{ define "telegram.observability.message" -}} -{{ if eq .Status "firing" -}} -{{ if eq .CommonLabels.severity "critical" }}🚨 ALERT — CRITICAL{{ else if eq .CommonLabels.severity "warning" }}⚠️ ALERT — WARNING{{ else }}🚨 ALERT{{ end }} +{{ $firing := .Alerts.Firing -}} +{{ $resolved := .Alerts.Resolved -}} + +{{ if gt (len $firing) 0 -}} +{{ if gt (len $resolved) 0 -}} +🔄 ALERT UPDATE{{ if eq .CommonLabels.severity "critical" }} — CRITICAL{{ else if eq .CommonLabels.severity "warning" }} — WARNING{{ end }} {{ else -}} -✅ RECOVERED +{{ if eq .CommonLabels.severity "critical" }}🚨 ALERT — CRITICAL{{ else if eq .CommonLabels.severity "warning" }}⚠️ ALERT — WARNING{{ else }}🚨 ALERT{{ end }} {{ end }} Alert: {{ .CommonLabels.alertname }} {{ if .CommonLabels.environment }}Environment: {{ .CommonLabels.environment }}{{ end }} {{ if .CommonLabels.team }}Team: {{ .CommonLabels.team }}{{ end }} +Affected Resources: {{ len $firing }} -{{ range .Alerts -}} -{{ if .Labels.service }}Service: {{ .Labels.service }} +{{ range $firing -}} +• {{ if .Labels.service }}Service: {{ .Labels.service }}{{ else if .Labels.node }}Node: {{ .Labels.node }}{{ else if .Labels.pod }}Pod: {{ .Labels.pod }}{{ else }}Resource{{ end }} +{{ if and .Labels.service .Labels.node }} Node: {{ .Labels.node }} +{{ end -}} +{{ if .Labels.ip }} IP: {{ .Labels.ip }} +{{ end -}} +{{ if .Labels.namespace }} Namespace: {{ .Labels.namespace }} +{{ end -}} +{{ if and .Labels.pod (not .Labels.service) }} Pod: {{ .Labels.pod }} +{{ end -}} +{{ if .Labels.container }} Container: {{ .Labels.container }} +{{ end -}} +{{ if .Labels.mountpoint }} Resource: {{ .Labels.mountpoint }} {{ end -}} -{{ if .Labels.node }}Node: {{ .Labels.node }} +{{ if .Annotations.observed }} Observed: {{ .Annotations.observed }} +{{ end }} + {{ end -}} -{{ if .Labels.ip }}IP: {{ .Labels.ip }} + +{{ if .CommonAnnotations.threshold }}Threshold: {{ .CommonAnnotations.threshold }} + {{ end -}} -{{ if .Labels.namespace }}Namespace: {{ .Labels.namespace }} +{{ if .CommonAnnotations.impact }}Impact: +{{ .CommonAnnotations.impact }} + {{ end -}} -{{ if .Labels.pod }}Pod: {{ .Labels.pod }} +{{ if .CommonAnnotations.action }}Recommended Action: +{{ .CommonAnnotations.action }} + {{ end -}} -{{ if .Labels.container }}Container: {{ .Labels.container }} + +{{ if gt (len $resolved) 0 -}} +Recovered Since Last Notification: {{ len $resolved }} + +{{ range $resolved -}} +• {{ if .Labels.service }}Service: {{ .Labels.service }}{{ else if .Labels.node }}Node: {{ .Labels.node }}{{ else if .Labels.pod }}Pod: {{ .Labels.pod }}{{ else }}Resource{{ end }} +{{ if and .Labels.service .Labels.node }} Node: {{ .Labels.node }} {{ end -}} -{{ if .Labels.mountpoint }}Resource: {{ .Labels.mountpoint }} +{{ if .Labels.ip }} IP: {{ .Labels.ip }} {{ end -}} -{{ if eq $.Status "firing" -}} -{{ if .Annotations.observed }}Observed: {{ .Annotations.observed }} +{{ if .Labels.namespace }} Namespace: {{ .Labels.namespace }} {{ end -}} -{{ if .Annotations.threshold }}Threshold: {{ .Annotations.threshold }} +{{ if .Labels.mountpoint }} Resource: {{ .Labels.mountpoint }} {{ end }} + +{{ end -}} +{{ end -}} + Detected By: Prometheus -{{ if .Labels.job }}Metric Source: {{ .Labels.job }} +{{ if .CommonLabels.job }}Metric Source: {{ .CommonLabels.job }} {{ end -}} Notification By: Alertmanager -{{ if .Annotations.summary }}Summary: -{{ .Annotations.summary }} +{{ else -}} +✅ RECOVERED + +Alert: {{ .CommonLabels.alertname }} +{{ if .CommonLabels.environment }}Environment: {{ .CommonLabels.environment }}{{ end }} +{{ if .CommonLabels.team }}Team: {{ .CommonLabels.team }}{{ end }} +Recovered Resources: {{ len $resolved }} + +{{ range $resolved -}} +• {{ if .Labels.service }}Service: {{ .Labels.service }}{{ else if .Labels.node }}Node: {{ .Labels.node }}{{ else if .Labels.pod }}Pod: {{ .Labels.pod }}{{ else }}Resource{{ end }} +{{ if and .Labels.service .Labels.node }} Node: {{ .Labels.node }} {{ end -}} -{{ if .Annotations.description }} -Description: -{{ .Annotations.description }} +{{ if .Labels.ip }} IP: {{ .Labels.ip }} {{ end -}} -{{ if .Annotations.impact }} -Impact: -{{ .Annotations.impact }} +{{ if .Labels.namespace }} Namespace: {{ .Labels.namespace }} {{ end -}} -{{ if .Annotations.action }} -Recommended Action: -{{ .Annotations.action }} +{{ if .Labels.container }} Container: {{ .Labels.container }} {{ end -}} -{{ else -}} -Detected By: Prometheus -{{ if .Labels.job }}Metric Source: {{ .Labels.job }} +{{ if .Labels.mountpoint }} Resource: {{ .Labels.mountpoint }} +{{ end }} + {{ end -}} -Notification By: Alertmanager Recovery: -{{ if .Annotations.recovery }}{{ .Annotations.recovery }}{{ else }}The monitored condition is no longer breaching its configured alert threshold.{{ end }} +{{ if .CommonAnnotations.recovery }}{{ .CommonAnnotations.recovery }}{{ else }}Prometheus no longer reports the configured alert condition.{{ end }} -Note: -This confirms recovery of the monitored condition. Recovery may have been automatic or operator-driven. -{{ end }} +Detected By: Prometheus +Notification By: Alertmanager {{ end -}} {{ end }} diff --git a/prometheus/rules/application-alerts.yml.example b/prometheus/rules/application-alerts.yml.example index 41e9dd1..6e418e0 100644 --- a/prometheus/rules/application-alerts.yml.example +++ b/prometheus/rules/application-alerts.yml.example @@ -1,5 +1,5 @@ groups: - - name: reference-application-errors + - name: observability-application-errors interval: 1m rules: - alert: Application4xxRateHigh @@ -53,7 +53,7 @@ groups: action: "Check service health, pods, recent deployments, application errors, dependencies, and correlated traces or logs." recovery: "Prometheus no longer reports application availability below the configured threshold." - - name: reference-application-latency + - name: observability-application-latency interval: 1m rules: - alert: ApplicationP99LatencyHigh @@ -89,39 +89,3 @@ groups: impact: "Users may experience severe response delays and application timeouts." action: "Immediately review slow traces, service resource pressure, downstream dependencies, database calls, and recent deployments." recovery: "Prometheus no longer reports P99 latency above the critical threshold for this service." - - - name: reference-platform-supplement - interval: 1m - rules: - - alert: KubernetesPodCrashLoopBackOff - expr: kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"} == 1 - for: 5m - labels: - severity: warning - team: infrastructure - environment: "{{ ENVIRONMENT }}" - category: platform - annotations: - summary: "Pod container is in CrashLoopBackOff" - description: "{{ $labels.namespace }}/{{ $labels.pod }} container {{ $labels.container }} has remained in CrashLoopBackOff for 5 minutes." - threshold: "CrashLoopBackOff for 5m" - impact: "The affected workload may be degraded or unavailable while the container repeatedly fails to start." - action: "Check pod events, container logs, exit reason, configuration, secrets, dependencies, resource limits, and the most recent deployment change." - recovery: "Prometheus no longer reports this container in CrashLoopBackOff." - - - alert: PrometheusAlertmanagerUnavailable - expr: prometheus_notifications_alertmanagers_discovered < 1 - for: 2m - labels: - severity: critical - team: infrastructure - environment: "{{ ENVIRONMENT }}" - category: monitoring - annotations: - summary: "Prometheus has no Alertmanager target" - description: "Prometheus has discovered zero Alertmanager instances for at least 2 minutes." - observed: '{{ printf "%.0f" $value }} discovered' - threshold: "< 1 discovered Alertmanager for 2m" - impact: "Prometheus may be unable to deliver alerts to Alertmanager, preventing downstream notifications." - action: "Check the Alertmanager service, Prometheus alerting configuration, service discovery, endpoint reachability, and network connectivity." - recovery: "Prometheus no longer reports zero discovered Alertmanager targets." diff --git a/prometheus/rules/infrastructure-alerts.yml.example b/prometheus/rules/infrastructure-alerts.yml.example index a847c68..7124082 100644 --- a/prometheus/rules/infrastructure-alerts.yml.example +++ b/prometheus/rules/infrastructure-alerts.yml.example @@ -4,7 +4,7 @@ groups: # KUBERNETES AVAILABILITY ##################################################################### - - name: reference-kubernetes-availability + - name: observability-kubernetes-availability interval: 30s rules: - alert: KubernetesNodeNotReady @@ -30,7 +30,7 @@ groups: # PROMETHEUS SCRAPE AVAILABILITY ##################################################################### - - name: reference-monitoring-targets + - name: observability-monitoring-targets interval: 30s rules: - alert: PrometheusTargetDown @@ -53,7 +53,7 @@ groups: # DISK ##################################################################### - - name: reference-node-disk + - name: observability-node-filesystem interval: 30s rules: - alert: NodeDiskUsageHigh @@ -120,7 +120,7 @@ groups: # MEMORY ##################################################################### - - name: reference-node-memory + - name: observability-node-memory interval: 30s rules: - alert: NodeMemoryUsageHigh @@ -175,7 +175,7 @@ groups: # CPU ##################################################################### - - name: reference-node-cpu + - name: observability-node-cpu interval: 30s rules: - alert: NodeCPUUsageHigh @@ -236,7 +236,7 @@ groups: # RKE2 / CONTAINERD IMAGE FILESYSTEM ##################################################################### - - name: reference-rke2-image-gc + - name: observability-rke2-storage interval: 30s rules: - alert: RKE2ImageGCThresholdReached diff --git a/prometheus/rules/platform-alerts.yml b/prometheus/rules/platform-alerts.yml deleted file mode 100644 index d1c4ecf..0000000 --- a/prometheus/rules/platform-alerts.yml +++ /dev/null @@ -1,51 +0,0 @@ -groups: - - name: platform-resource-alerts - interval: 30s - rules: - - alert: NodeHighCPUUsage - expr: | - 100 - ( - avg by (instance) ( - rate(node_cpu_seconds_total{mode="idle"}[5m]) - ) * 100 - ) > 80 - for: 10m - labels: - severity: warning - annotations: - summary: Node CPU usage is above 80 percent - description: Sustained CPU pressure was observed for at least ten minutes. - - - alert: NodeHighMemoryUsage - expr: | - 100 * ( - 1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes - ) > 85 - for: 10m - labels: - severity: warning - annotations: - summary: Node memory usage is above 85 percent - description: Sustained memory pressure was observed for at least ten minutes. - - - alert: NodeFilesystemLowSpace - expr: | - 100 * ( - 1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} - / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} - ) > 85 - for: 15m - labels: - severity: warning - annotations: - summary: Node filesystem usage is above 85 percent - description: A persistent filesystem is approaching its capacity threshold. - - - alert: OpenTelemetryCollectorTargetDown - expr: up{job="otel-collector"} == 0 - for: 5m - labels: - severity: critical - annotations: - summary: The OpenTelemetry Collector metrics endpoint is unavailable - description: Prometheus has been unable to scrape the Collector endpoint for five minutes. diff --git a/prometheus/rules/platform-alerts.yml.example b/prometheus/rules/platform-alerts.yml.example new file mode 100644 index 0000000..1645475 --- /dev/null +++ b/prometheus/rules/platform-alerts.yml.example @@ -0,0 +1,36 @@ +groups: + - name: observability-platform-health + interval: 1m + rules: + - alert: KubernetesPodCrashLoopBackOff + expr: kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"} == 1 + for: 5m + labels: + severity: warning + team: infrastructure + environment: "{{ ENVIRONMENT }}" + category: platform + annotations: + summary: "Pod container is in CrashLoopBackOff" + description: "{{ $labels.namespace }}/{{ $labels.pod }} container {{ $labels.container }} has remained in CrashLoopBackOff for 5 minutes." + threshold: "CrashLoopBackOff for 5m" + impact: "The affected workload may be degraded or unavailable while the container repeatedly fails to start." + action: "Check pod events, container logs, exit reason, configuration, secrets, dependencies, resource limits, and the most recent deployment change." + recovery: "Prometheus no longer reports this container in CrashLoopBackOff." + + - alert: PrometheusAlertmanagerUnavailable + expr: prometheus_notifications_alertmanagers_discovered < 1 + for: 2m + labels: + severity: critical + team: infrastructure + environment: "{{ ENVIRONMENT }}" + category: monitoring + annotations: + summary: "Prometheus has no Alertmanager target" + description: "Prometheus has discovered zero Alertmanager instances for at least 2 minutes." + observed: '{{ printf "%.0f" $value }} discovered' + threshold: "< 1 discovered Alertmanager for 2m" + impact: "Prometheus may be unable to deliver alerts to Alertmanager, preventing downstream notifications." + action: "Check the Alertmanager service, Prometheus alerting configuration, service discovery, endpoint reachability, and network connectivity." + recovery: "Prometheus no longer reports zero discovered Alertmanager targets." diff --git a/scripts/install-node-exporter-host.sh b/scripts/install-node-exporter-host.sh new file mode 100644 index 0000000..a2e35f0 --- /dev/null +++ b/scripts/install-node-exporter-host.sh @@ -0,0 +1,133 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +MODE="${1:---plan}" + +info() { printf '[INFO] %s\n' "$*"; } +ok() { printf '[OK] %s\n' "$*"; } +die() { printf '[ERROR] %s\n' "$*" >&2; exit 1; } + +case "$MODE" in + --plan|--apply) ;; + *) die "Usage: $0 [--plan|--apply]" ;; +esac + +# shellcheck disable=SC1091 +source "$REPO_ROOT/versions.env" +# shellcheck disable=SC1091 +source "$REPO_ROOT/observability-host/artifacts.lock.env" + +: "${NODE_EXPORTER_VERSION:?missing NODE_EXPORTER_VERSION}" +: "${NODE_EXPORTER_SHA256:?missing NODE_EXPORTER_SHA256}" + +ARCH="$(uname -m)" +case "$ARCH" in + x86_64) ARCHIVE_ARCH="linux-amd64" ;; + *) die "unsupported architecture: $ARCH" ;; +esac + +ARCHIVE="node_exporter-${NODE_EXPORTER_VERSION}.${ARCHIVE_ARCH}.tar.gz" +URL="https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/${ARCHIVE}" +UNIT_SRC="$REPO_ROOT/observability-host/systemd/node_exporter.service" + +[[ -f "$UNIT_SRC" ]] || die "missing repository unit: $UNIT_SRC" + +cat <"$BACKUP/enabled-state.txt" 2>&1 || true +systemctl is-active node_exporter >"$BACKUP/active-state.txt" 2>&1 || true + +info "Downloading pinned node_exporter artifact" +curl -fL "$URL" -o "$WORK/$ARCHIVE" + +printf '%s %s\n' "$NODE_EXPORTER_SHA256" "$WORK/$ARCHIVE" | sha256sum -c - + +getent group node_exporter >/dev/null 2>&1 || groupadd --system node_exporter +id node_exporter >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin --gid node_exporter node_exporter + +mkdir -p "$WORK/extract" +tar -xzf "$WORK/$ARCHIVE" -C "$WORK/extract" + +NODE_BIN="$(find "$WORK/extract" -type f -name node_exporter -perm -u+x | head -1)" +[[ -n "$NODE_BIN" ]] || die "node_exporter binary not found after extraction" + +install -o root -g root -m 0755 "$NODE_BIN" /usr/local/bin/node_exporter +install -o root -g root -m 0644 "$UNIT_SRC" /etc/systemd/system/node_exporter.service + +/usr/local/bin/node_exporter --version 2>&1 | head -1 | grep -q "version $NODE_EXPORTER_VERSION" || die "installed version mismatch" + +systemd-analyze verify /etc/systemd/system/node_exporter.service +systemctl daemon-reload +systemctl enable --now node_exporter + +systemctl is-active --quiet node_exporter || die "node_exporter is not active" +curl -fsS http://127.0.0.1:9115/metrics >/dev/null || die "local metrics endpoint failed" + +cat > "$BACKUP/rollback.sh" < None: + print(f"[ERROR] {message}", file=sys.stderr) + raise SystemExit(1) + +def load_collection(name: str, expected_type: str, expected_count: int): + path = REF / name + if not path.is_file(): + die(f"missing dashboard reference file: {path}") + + try: + data = json.loads(path.read_text(encoding="utf-8")) + except Exception as exc: + die(f"invalid JSON in {path}: {exc}") + + objects = data.get("saved_objects") + if not isinstance(objects, list): + die(f"{path} must contain saved_objects array") + + if len(objects) != expected_count: + die(f"{path}: expected {expected_count} objects, found {len(objects)}") + + for obj in objects: + if obj.get("type") != expected_type: + die(f"{path}: unexpected object type {obj.get('type')!r}") + + return objects + +def scan_transient(value, where="root"): + if isinstance(value, dict): + for key, child in value.items(): + if key in TRANSIENT_KEYS: + die(f"transient saved-object key {key!r} remains at {where}") + scan_transient(child, f"{where}.{key}") + elif isinstance(value, list): + for index, child in enumerate(value): + scan_transient(child, f"{where}[{index}]") + +def validate_query_object(obj): + meta = obj.get("attributes", {}).get("kibanaSavedObjectMeta", {}) + raw = meta.get("searchSourceJSON") + if not raw: + return + + try: + source = json.loads(raw) + except Exception as exc: + die(f"{obj['id']}: invalid searchSourceJSON: {exc}") + + query = source.get("query", {}) + text = query.get("query", "") + language = query.get("language", "") + + if language == "PROMQL": + dataset = query.get("dataset") + if not isinstance(dataset, dict): + die(f"{obj['id']}: PROMQL query has no dataset object") + + if dataset.get("id") != "reference-prometheus": + die(f"{obj['id']}: unexpected Prometheus dataset id") + if dataset.get("title") != "reference-prometheus": + die(f"{obj['id']}: unexpected Prometheus dataset title") + + env_values = set( + re.findall(r'environment\s*=\s*"([^"]*)"', text) + ) + if env_values - {"reference"}: + die(f"{obj['id']}: non-reference environment selector: {sorted(env_values)}") + + namespace_values = set( + value + for _, value in re.findall( + r'namespace\s*(=|=~)\s*"([^"]*)"', + text, + ) + ) + unexpected_namespaces = namespace_values - ALLOWED_NAMESPACE_SELECTORS + if unexpected_namespaces: + die( + f"{obj['id']}: unexpected namespace selector: " + f"{sorted(unexpected_namespaces)}" + ) + + node_values = set( + value + for _, value in re.findall( + r'node\s*(=|=~)\s*"([^"]*)"', + text, + ) + if value + ) + unexpected_nodes = node_values - ALLOWED_NODE_SELECTORS + if unexpected_nodes: + die(f"{obj['id']}: unexpected node selector: {sorted(unexpected_nodes)}") + +objects = {} +texts = [] + +for filename, (expected_type, count) in EXPECTED.items(): + collection = load_collection(filename, expected_type, count) + text = (REF / filename).read_text(encoding="utf-8") + texts.append(text) + + for obj in collection: + key = (obj["type"], obj["id"]) + if key in objects: + die(f"duplicate saved object: {key}") + + if not obj["id"].startswith("std-"): + die(f"non-standard saved-object id: {obj['id']}") + + objects[key] = obj + scan_transient(obj, f"{filename}:{obj['id']}") + validate_query_object(obj) + +combined = "\n".join(texts) + +if UUID_PATTERN.search(combined): + die("opaque UUID remains in sanitized dashboard reference") +if TOKEN_PATTERN.search(combined): + die("token-like value remains in sanitized dashboard reference") +if PRIVATE_KEY_PATTERN.search(combined): + die("private-key material remains in sanitized dashboard reference") + +ipv4_values = sorted(set(re.findall(r"\b(?:\d{1,3}\.){3}\d{1,3}\b", combined))) +for value in ipv4_values: + try: + ip = ipaddress.ip_address(value) + except ValueError: + continue + + if ip.version == 4 and ip not in ipaddress.ip_network("192.0.2.0/24"): + die(f"unexpected IPv4 address remains in dashboard reference: {value}") + +missing = [] + +for source, obj in objects.items(): + for ref in obj.get("references", []): + target = (ref.get("type"), ref.get("id")) + if target not in objects and target != PROMETHEUS_PLACEHOLDER: + missing.append((source, target, ref.get("name"))) + +if missing: + for source, target, name in missing: + print( + f"[ERROR] unresolved reference: {source} -> {target} ({name})", + file=sys.stderr, + ) + raise SystemExit(1) + +for source, obj in objects.items(): + if source[0] != "dashboard": + continue + + for ref in obj.get("references", []): + target = (ref.get("type"), ref.get("id")) + if target not in objects: + die( + f"dashboard {source[1]} has unresolved panel/search reference " + f"{target}" + ) + +prometheus_refs = 0 +for obj in objects.values(): + for ref in obj.get("references", []): + if (ref.get("type"), ref.get("id")) == PROMETHEUS_PLACEHOLDER: + prometheus_refs += 1 + +if prometheus_refs == 0: + die("Prometheus placeholder reference is missing") + +print( + "[OK] dashboard reference validated: " + "6 dashboards, 74 Explore panels, 4 data views, 2 saved searches" +) +print("[OK] all dashboard dependencies resolve") +print( + f"[OK] {prometheus_refs} metric references use the intentional " + "reference-prometheus placeholder" +) +print("[OK] environment, namespace, node, address, UUID, and secret guardrails passed") diff --git a/scripts/validate-rendered-reference-config.sh b/scripts/validate-rendered-reference-config.sh index d882cef..bba1413 100644 --- a/scripts/validate-rendered-reference-config.sh +++ b/scripts/validate-rendered-reference-config.sh @@ -16,10 +16,9 @@ required=( prometheus/prometheus.yml prometheus/rules/infrastructure-alerts.yml prometheus/rules/application-alerts.yml - prometheus/rules/opensearch-apm-red.yml - prometheus/rules/opensearch-apm-report.yml + prometheus/rules/platform-alerts.yml alertmanager/alertmanager.yml - alertmanager/templates/observability-telegram.tmpl + alertmanager/templates/telegram.tmpl process-exporter/process-exporter.yml ) for rel in "${required[@]}"; do @@ -57,7 +56,11 @@ grep -qE '^[[:space:]]+evaluation_interval:[[:space:]]+30s$' "$ROOT/prometheus/p grep -q '127.0.0.1:9256' "$ROOT/prometheus/prometheus.yml" || die "process-exporter scrape missing" ok "Prometheus reference baseline present" +grep -q 'group_wait: 30s' "$ROOT/alertmanager/alertmanager.yml" || die "Alertmanager group wait mismatch" +grep -q 'group_interval: 5m' "$ROOT/alertmanager/alertmanager.yml" || die "Alertmanager group interval mismatch" grep -q 'repeat_interval: 4h' "$ROOT/alertmanager/alertmanager.yml" || die "Alertmanager repeat interval mismatch" +grep -q 'receiver: telegram-observability' "$ROOT/alertmanager/alertmanager.yml" || die "Alertmanager receiver naming mismatch" +[[ "$(grep -c '^[[:space:]]*-[[:space:]]*source_matchers:' "$ROOT/alertmanager/alertmanager.yml" || true)" -eq 4 ]] || die "Alertmanager inhibition-rule count mismatch" grep -q 'send_resolved: true' "$ROOT/alertmanager/alertmanager.yml" || die "Alertmanager resolved notifications disabled" ok "Alertmanager reference routing present"