From bfb96ac2242b419d5021f5774017b2bfff7ca874 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:34:37 +0300 Subject: [PATCH 01/39] Document Linux node_exporter onboarding --- docs/16-linux-host-metrics-onboarding.md | 158 +++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 docs/16-linux-host-metrics-onboarding.md 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. From fc6594f81c9183b508fc312bc2217c483b540014 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:34:57 +0300 Subject: [PATCH 02/39] Clarify telemetry paths and host metrics onboarding --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3d1819d..f325f31 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 @@ -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 From d45f5e467b1e61c6375fd4ad3618d735cb6cb8ed Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:35:15 +0300 Subject: [PATCH 03/39] Align metrics architecture with live Data Prepper RED path --- docs/02-architecture.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 From 4ffd92c69cb0909360dedd2e302d306b2e6b0671 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:37:12 +0300 Subject: [PATCH 04/39] Clarify Kubernetes telemetry metric discovery --- docs/05-kubernetes-telemetry-onboarding.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From 88f47aa29e5e39b26b611c33cc156c4ab909f17d Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:37:15 +0300 Subject: [PATCH 05/39] Record final live observability closeout --- docs/11-live-closeout.md | 150 +++++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 70 deletions(-) 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. From 3e21ee1cc940c41d1920bacabce045ab4188aaff Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:37:18 +0300 Subject: [PATCH 06/39] Document final alerting naming and routing contract --- docs/14-alerting-standard.md | 119 ++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 38 deletions(-) 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. From da8df9bfc9d1fce2e9eab3c8f1e50b1266b8cd95 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:38:17 +0300 Subject: [PATCH 07/39] Align Alertmanager example with final live routing --- .../alertmanager/alertmanager.yml.example | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/observability-host/alertmanager/alertmanager.yml.example b/observability-host/alertmanager/alertmanager.yml.example index a9ea966..899031a 100644 --- a/observability-host/alertmanager/alertmanager.yml.example +++ b/observability-host/alertmanager/alertmanager.yml.example @@ -5,17 +5,59 @@ 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 +inhibit_rules: + - source_matchers: + - severity="critical" + - alertname="NodeDiskUsageCritical" + target_matchers: + - severity="warning" + - alertname="NodeDiskUsageHigh" + equal: + - environment + - node + - mountpoint + + - source_matchers: + - severity="critical" + - alertname="NodeCPUUsageCritical" + target_matchers: + - severity="warning" + - alertname="NodeCPUUsageHigh" + equal: + - environment + - node + + - source_matchers: + - severity="critical" + - alertname="NodeMemoryUsageCritical" + target_matchers: + - severity="warning" + - alertname="NodeMemoryUsageHigh" + equal: + - environment + - node + + - source_matchers: + - severity="critical" + - alertname="ApplicationP99LatencyCritical" + target_matchers: + - severity="warning" + - alertname="ApplicationP99LatencyHigh" + equal: + - environment + - service + receivers: - - name: telegram-infrastructure + - name: telegram-observability telegram_configs: - bot_token_file: "{{ ALERTMANAGER_TELEGRAM_TOKEN_FILE }}" chat_id: {{ ALERTMANAGER_TELEGRAM_CHAT_ID }} From 8452f904bdede7a81400b1c5019b14009a3aad0d Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:38:20 +0300 Subject: [PATCH 08/39] Standardize application alert rule groups --- .../rules/application-alerts.yml.example | 40 +------------------ 1 file changed, 2 insertions(+), 38 deletions(-) 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." From 8d683913b41c9ada937968d842a5ab19266bbfa2 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:38:22 +0300 Subject: [PATCH 09/39] Add standardized platform alert rules --- prometheus/rules/platform-alerts.yml.example | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 prometheus/rules/platform-alerts.yml.example 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." From 6844401f704f80b420257c1d50ebe15dad1cb284 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:38:25 +0300 Subject: [PATCH 10/39] Standardize infrastructure alert rule groups --- prometheus/rules/infrastructure-alerts.yml.example | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 From ebf0aaf3c8175680de5a2441845b5febd5fefaa8 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:38:29 +0300 Subject: [PATCH 11/39] Remove obsolete platform alert baseline --- prometheus/rules/platform-alerts.yml | 51 ---------------------------- 1 file changed, 51 deletions(-) delete mode 100644 prometheus/rules/platform-alerts.yml 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. From 70d5a0210bc1e7ab50dda7cc9f79202cc076909a Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:39:31 +0300 Subject: [PATCH 12/39] Make APM recording rules optional by default --- config/reference.env.example | 5 +++++ 1 file changed, 5 insertions(+) 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 From 16c57a28f5742591492c0df6e18cdd7eff487687 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:39:34 +0300 Subject: [PATCH 13/39] Align renderer with final live alert and metric architecture --- scripts/render-reference-config.sh | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/render-reference-config.sh b/scripts/render-reference-config.sh index 0559853..d7cd15a 100644 --- a/scripts/render-reference-config.sh +++ b/scripts/render-reference-config.sh @@ -35,6 +35,7 @@ Rendered contract: - OpenSearch Dashboards workspace/data-source/Explore feature configuration - Data Prepper trace 21890 + HTTP log 2021 + Prometheus service-map sink - Prometheus 30s scrape/evaluation configuration + - Prometheus alert rules; optional APM recording/reporting rules - Alertmanager Telegram routing/template configuration - process-exporter process grouping configuration @@ -88,6 +89,8 @@ for var in "${required_vars[@]}"; do done [[ "$ALERTMANAGER_TELEGRAM_CHAT_ID" =~ ^-?[0-9]+$ ]] || die "ALERTMANAGER_TELEGRAM_CHAT_ID must be an integer" +ENABLE_APM_RECORDING_RULES="${ENABLE_APM_RECORDING_RULES:-false}" +[[ "$ENABLE_APM_RECORDING_RULES" =~ ^(true|false)$ ]] || die "ENABLE_APM_RECORDING_RULES must be true or false" [[ -s "$DASHBOARDS_SERVICE_PASSWORD_FILE" ]] || die "Dashboards password file missing/empty: $DASHBOARDS_SERVICE_PASSWORD_FILE" [[ -s "$OPENSEARCH_INGEST_PASSWORD_FILE" ]] || die "Data Prepper ingest password file missing/empty: $OPENSEARCH_INGEST_PASSWORD_FILE" @@ -148,12 +151,14 @@ render_template "$REPO_ROOT/observability-host/dashboards/opensearch_dashboards. render_template "$REPO_ROOT/observability-host/data-prepper/data-prepper-config.yaml" "$OUTPUT_DIR/data-prepper/config/data-prepper-config.yaml" render_template "$REPO_ROOT/observability-host/data-prepper/pipelines.example.yaml" "$OUTPUT_DIR/data-prepper/pipelines/pipelines.yaml" render_template "$REPO_ROOT/observability-host/alertmanager/alertmanager.yml.example" "$OUTPUT_DIR/alertmanager/alertmanager.yml" -install -m 0640 "$REPO_ROOT/observability-host/alertmanager/telegram.tmpl" "$OUTPUT_DIR/alertmanager/templates/observability-telegram.tmpl" +install -m 0640 "$REPO_ROOT/observability-host/alertmanager/telegram.tmpl" "$OUTPUT_DIR/alertmanager/templates/telegram.tmpl" install -m 0640 "$REPO_ROOT/observability-host/process-exporter/process-exporter.yml" "$OUTPUT_DIR/process-exporter/process-exporter.yml" render_template "$REPO_ROOT/prometheus/rules/infrastructure-alerts.yml.example" "$OUTPUT_DIR/prometheus/rules/infrastructure-alerts.yml" render_template "$REPO_ROOT/prometheus/rules/application-alerts.yml.example" "$OUTPUT_DIR/prometheus/rules/application-alerts.yml" +render_template "$REPO_ROOT/prometheus/rules/platform-alerts.yml.example" "$OUTPUT_DIR/prometheus/rules/platform-alerts.yml" +if [[ "$ENABLE_APM_RECORDING_RULES" == "true" ]]; then python3 - "$REPO_ROOT/prometheus/rules/opensearch-apm-red.yml" "$OUTPUT_DIR/prometheus/rules/opensearch-apm-red.yml" <<'PY' import os, sys src, dst = sys.argv[1:3] @@ -163,6 +168,7 @@ open(dst, "w", encoding="utf-8").write(text) PY install -m 0640 "$REPO_ROOT/prometheus/rules/opensearch-apm-report.yml" "$OUTPUT_DIR/prometheus/rules/opensearch-apm-report.yml" +fi python3 - "$REPO_ROOT/observability-host/prometheus/prometheus.yml.example" "$TARGETS_FILE" "$OUTPUT_DIR/prometheus/prometheus.yml" <<'PY' import json, os, re, sys @@ -237,8 +243,13 @@ chmod 0640 \ "$OUTPUT_DIR/prometheus/prometheus.yml" \ "$OUTPUT_DIR/prometheus/rules/infrastructure-alerts.yml" \ "$OUTPUT_DIR/prometheus/rules/application-alerts.yml" \ - "$OUTPUT_DIR/prometheus/rules/opensearch-apm-red.yml" \ - "$OUTPUT_DIR/prometheus/rules/opensearch-apm-report.yml" + "$OUTPUT_DIR/prometheus/rules/platform-alerts.yml" + +if [[ "$ENABLE_APM_RECORDING_RULES" == "true" ]]; then + chmod 0640 \ + "$OUTPUT_DIR/prometheus/rules/opensearch-apm-red.yml" \ + "$OUTPUT_DIR/prometheus/rules/opensearch-apm-report.yml" +fi bash "$REPO_ROOT/scripts/validate-rendered-reference-config.sh" "$OUTPUT_DIR" ok "Reference configuration rendered: $OUTPUT_DIR" From 3216d3374f4298407bce1148d66aebfe7c04906f Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:39:37 +0300 Subject: [PATCH 14/39] Validate final alert routing and platform rule file --- scripts/validate-rendered-reference-config.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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" From d9b14b0e2e004af31267ca6c3e249ba8fda7ffaf Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:39:40 +0300 Subject: [PATCH 15/39] Align README with live RED metric architecture --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f325f31..ec1b8df 100644 --- a/README.md +++ b/README.md @@ -101,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 @@ -119,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. From ce88894c856504ee154e91024c48e87f689c15f3 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:39:43 +0300 Subject: [PATCH 16/39] Clarify optional recording rules in clean-room evidence --- docs/15-ubuntu-2404-cleanroom-qualification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From a5456d5a4ec9718675328de209c60c4db2bf05af Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:41:08 +0300 Subject: [PATCH 17/39] Add reusable node_exporter host installer --- scripts/install-node-exporter-host.sh | 133 ++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 scripts/install-node-exporter-host.sh 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" < Date: Fri, 2 Oct 2026 19:41:24 +0300 Subject: [PATCH 18/39] Use pinned node_exporter host installer From 20b656c0bf8230bd50a5454132d7efd46551e0fe Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:42:11 +0300 Subject: [PATCH 19/39] Align observability host docs with final exporter and template naming --- observability-host/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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` From 7be4262683a4e35df46f8b010cb191a738c74c13 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 19:42:19 +0300 Subject: [PATCH 20/39] Record node_exporter in reference service layout --- docs/08-reference-uat-baseline.md | 1 + 1 file changed, 1 insertion(+) 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: From 5bb73ea2a03820700935d08bdc67a3df43f5467b Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:13:28 +0300 Subject: [PATCH 21/39] Synchronize final live Telegram alert template --- observability-host/alertmanager/telegram.tmpl | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 deletions(-) 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 }} From 99dac03166e8262388c4d6a234ab32e1775c6cd6 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:13:31 +0300 Subject: [PATCH 22/39] Match Alertmanager example to final live behavior --- .../alertmanager/alertmanager.yml.example | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/observability-host/alertmanager/alertmanager.yml.example b/observability-host/alertmanager/alertmanager.yml.example index 899031a..43abd76 100644 --- a/observability-host/alertmanager/alertmanager.yml.example +++ b/observability-host/alertmanager/alertmanager.yml.example @@ -6,61 +6,59 @@ templates: route: receiver: telegram-observability + group_by: - alertname - severity - environment + group_wait: 30s group_interval: 5m repeat_interval: 4h +receivers: + - 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: - - severity="critical" - - alertname="NodeDiskUsageCritical" + - 'alertname="NodeDiskUsageCritical"' target_matchers: - - severity="warning" - - alertname="NodeDiskUsageHigh" + - 'alertname="NodeDiskUsageHigh"' equal: - environment - node - mountpoint - source_matchers: - - severity="critical" - - alertname="NodeCPUUsageCritical" + - 'alertname="NodeCPUUsageCritical"' target_matchers: - - severity="warning" - - alertname="NodeCPUUsageHigh" + - 'alertname="NodeCPUUsageHigh"' equal: - environment - node - source_matchers: - - severity="critical" - - alertname="NodeMemoryUsageCritical" + - 'alertname="NodeMemoryUsageCritical"' target_matchers: - - severity="warning" - - alertname="NodeMemoryUsageHigh" + - 'alertname="NodeMemoryUsageHigh"' equal: - environment - node - source_matchers: - - severity="critical" - - alertname="ApplicationP99LatencyCritical" + - 'alertname="ApplicationP99LatencyCritical"' target_matchers: - - severity="warning" - - alertname="ApplicationP99LatencyHigh" + - 'alertname="ApplicationP99LatencyHigh"' equal: - environment - service - -receivers: - - 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" . }}' From 5c452b685f3cbb57733a6a3e77f2af4f19f1482e Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:31:10 +0300 Subject: [PATCH 23/39] Add sanitized dashboard reference validator --- scripts/validate-dashboard-reference.py | 130 ++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 scripts/validate-dashboard-reference.py diff --git a/scripts/validate-dashboard-reference.py b/scripts/validate-dashboard-reference.py new file mode 100644 index 0000000..14f0a76 --- /dev/null +++ b/scripts/validate-dashboard-reference.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +import ipaddress +import json +import pathlib +import re +import sys + +ROOT = pathlib.Path(__file__).resolve().parents[1] +REF = ROOT / "dashboards" / "reference" + +EXPECTED = { + "dashboards.json": ("dashboard", 6), + "explore-panels.json": ("explore", 74), + "data-views.json": ("index-pattern", 4), + "saved-searches.json": ("search", 2), +} + +PRIVATE_PATTERNS = { + "live private subnet": re.compile(r"\b10\.1\.22\.\d+\b"), + "workspace id": re.compile(r"Wbvl8L"), + "customer name": re.compile(r"\bEnat\b", re.I), + "customer hostname": re.compile(r"\bebuat[a-z0-9.-]*\b", re.I), + "live environment name": re.compile(r"\buat2\b", re.I), + "live Prometheus connection UUID": re.compile( + r"a76653e0-9c1a-11f1-97a4-c15765a0dbb6", re.I + ), + "private application namespace": re.compile( + r"app-hub|backoffice|inquiry|internet-banking|taf-app|taf-flink|" + r"transferhub|ussd-push-payment|wallet", + re.I, + ), +} + +TRANSIENT_KEYS = {"updated_at", "version", "workspaces", "namespaces", "score"} + +def die(message: str) -> 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}]") + +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}") + objects[key] = obj + scan_transient(obj, f"{filename}:{obj['id']}") + +combined = "\n".join(texts) + +for label, pattern in PRIVATE_PATTERNS.items(): + if pattern.search(combined): + die(f"private deployment identity remains: {label}") + +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 not ip in ipaddress.ip_network("192.0.2.0/24"): + die(f"unexpected IPv4 address remains in dashboard reference: {value}") + +allowed_placeholder = ("index-pattern", "reference-prometheus") +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 != allowed_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 {target}") + +if "reference-prometheus" not in combined: + 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("[OK] only reference-prometheus remains as an intentional external mapping") +print("[OK] no known private deployment identifiers remain") From 1f0fef10a90ac20f954744f966f0cac492ff33a0 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:31:21 +0300 Subject: [PATCH 24/39] Validate sanitized dashboard reference in CI --- .github/workflows/validate.yml | 4 ++++ 1 file changed, 4 insertions(+) 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: | From 2c478373c00ddf1593612ab52c04b114f7aa312c Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:04 +0300 Subject: [PATCH 25/39] Add sanitized dashboard reference dashboards.json --- dashboards/reference/dashboards.json | 528 +++++++++++++++++++++++++++ 1 file changed, 528 insertions(+) create mode 100644 dashboards/reference/dashboards.json diff --git a/dashboards/reference/dashboards.json b/dashboards/reference/dashboards.json new file mode 100644 index 0000000..7ea9781 --- /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" + } + } + ] +} \ No newline at end of file From db31343677fb921dadbebb1826765aadb3800623 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:10 +0300 Subject: [PATCH 26/39] Add sanitized dashboard reference explore-panels.json --- dashboards/reference/explore-panels.json | 1947 ++++++++++++++++++++++ 1 file changed, 1947 insertions(+) create mode 100644 dashboards/reference/explore-panels.json diff --git a/dashboards/reference/explore-panels.json b/dashboards/reference/explore-panels.json new file mode 100644 index 0000000..a6dbd19 --- /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" + } + ] + } + ] +} \ No newline at end of file From 79986d1544bb70adb51fddc6a0ae053d01365193 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:14 +0300 Subject: [PATCH 27/39] Add sanitized dashboard reference data-views.json --- dashboards/reference/data-views.json | 64 ++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 dashboards/reference/data-views.json diff --git a/dashboards/reference/data-views.json b/dashboards/reference/data-views.json new file mode 100644 index 0000000..6d10b44 --- /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" + } + } + ] +} \ No newline at end of file From 1ae83bdfd21b8b20b8e49b80b34b2c7239b85107 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:19 +0300 Subject: [PATCH 28/39] Add sanitized dashboard reference saved-searches.json --- dashboards/reference/saved-searches.json | 77 ++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 dashboards/reference/saved-searches.json diff --git a/dashboards/reference/saved-searches.json b/dashboards/reference/saved-searches.json new file mode 100644 index 0000000..d7eab75 --- /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" + } + } + ] +} \ No newline at end of file From de7e64cee0460ada0dd32e7db17041063ff69807 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:22 +0300 Subject: [PATCH 29/39] Add sanitized dashboard reference SANITIZATION.md --- dashboards/reference/SANITIZATION.md | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 dashboards/reference/SANITIZATION.md diff --git a/dashboards/reference/SANITIZATION.md b/dashboards/reference/SANITIZATION.md new file mode 100644 index 0000000..04ce608 --- /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. \ No newline at end of file From 978af6d64c319a16ea0ac114453de98083a7c16d Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:26 +0300 Subject: [PATCH 30/39] Add sanitized dashboard reference SHA256SUMS --- dashboards/reference/SHA256SUMS | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 dashboards/reference/SHA256SUMS diff --git a/dashboards/reference/SHA256SUMS b/dashboards/reference/SHA256SUMS new file mode 100644 index 0000000..08d7591 --- /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 \ No newline at end of file From 50d317493a54908d52b92ab8c95ae32356c7b39a Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:49 +0300 Subject: [PATCH 31/39] Preserve exact sanitized reference snapshot for dashboards.json --- dashboards/reference/dashboards.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/dashboards.json b/dashboards/reference/dashboards.json index 7ea9781..f0ac281 100644 --- a/dashboards/reference/dashboards.json +++ b/dashboards/reference/dashboards.json @@ -525,4 +525,4 @@ } } ] -} \ No newline at end of file +} From 1c3e3515a643789cb0cf7f751c42d1d1c047109d Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:34:56 +0300 Subject: [PATCH 32/39] Preserve exact sanitized reference snapshot for explore-panels.json --- dashboards/reference/explore-panels.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/explore-panels.json b/dashboards/reference/explore-panels.json index a6dbd19..a25882f 100644 --- a/dashboards/reference/explore-panels.json +++ b/dashboards/reference/explore-panels.json @@ -1944,4 +1944,4 @@ ] } ] -} \ No newline at end of file +} From 294a12eae8de9f0b3756ed2e34b55be74b86880c Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:35:00 +0300 Subject: [PATCH 33/39] Preserve exact sanitized reference snapshot for data-views.json --- dashboards/reference/data-views.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/data-views.json b/dashboards/reference/data-views.json index 6d10b44..fb0ab03 100644 --- a/dashboards/reference/data-views.json +++ b/dashboards/reference/data-views.json @@ -61,4 +61,4 @@ } } ] -} \ No newline at end of file +} From 4610a1ea06ee922cb235b8d2e7ac54b2ddd57eee Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:35:05 +0300 Subject: [PATCH 34/39] Preserve exact sanitized reference snapshot for saved-searches.json --- dashboards/reference/saved-searches.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/saved-searches.json b/dashboards/reference/saved-searches.json index d7eab75..6f0d9cb 100644 --- a/dashboards/reference/saved-searches.json +++ b/dashboards/reference/saved-searches.json @@ -74,4 +74,4 @@ } } ] -} \ No newline at end of file +} From 8219059a3313b51c185984547e54602ecf7fd96b Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:35:10 +0300 Subject: [PATCH 35/39] Preserve exact sanitized reference snapshot for SANITIZATION.md --- dashboards/reference/SANITIZATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/SANITIZATION.md b/dashboards/reference/SANITIZATION.md index 04ce608..8124928 100644 --- a/dashboards/reference/SANITIZATION.md +++ b/dashboards/reference/SANITIZATION.md @@ -46,4 +46,4 @@ These files are sanitized reference collections rather than raw live exports. Be 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. \ No newline at end of file +No raw workspace ID, private IP address, customer hostname, customer name, credential, token, trace ID, or transaction payload is retained in these files. From 8a2c5ce0edaaae76d2f7ed7660687b0fec1b85fd Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:35:14 +0300 Subject: [PATCH 36/39] Preserve exact sanitized reference snapshot for SHA256SUMS --- dashboards/reference/SHA256SUMS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboards/reference/SHA256SUMS b/dashboards/reference/SHA256SUMS index 08d7591..a3c9cba 100644 --- a/dashboards/reference/SHA256SUMS +++ b/dashboards/reference/SHA256SUMS @@ -2,4 +2,4 @@ 7133d12f7788df621d5d23640720de8a8fc00b282bf8751f1e0c233c5f9aacab explore-panels.json 038c2dbf3020036a94e4e380a07fdf97024d8598f0dc0f0e7127107d9d545137 data-views.json fe91d451c24584cdb21784a3961eff71ed7650407875e66674467e6a3001590c saved-searches.json -53ad361042085871a8687af9a5c2d482913a2245e0a3c5116efc81feb5585eff SANITIZATION.md \ No newline at end of file +53ad361042085871a8687af9a5c2d482913a2245e0a3c5116efc81feb5585eff SANITIZATION.md From 73e8043983479cf6806c3eca1328a2792666e83e Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:35:38 +0300 Subject: [PATCH 37/39] Publish final sanitized dashboard reference --- dashboards/README.md | 59 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) 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. From c06f120c6727fedc0b2e37363896a0dd91407260 Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:37:03 +0300 Subject: [PATCH 38/39] Avoid embedding live workspace identifier in validator source --- scripts/validate-dashboard-reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/validate-dashboard-reference.py b/scripts/validate-dashboard-reference.py index 14f0a76..307bce0 100644 --- a/scripts/validate-dashboard-reference.py +++ b/scripts/validate-dashboard-reference.py @@ -17,7 +17,7 @@ PRIVATE_PATTERNS = { "live private subnet": re.compile(r"\b10\.1\.22\.\d+\b"), - "workspace id": re.compile(r"Wbvl8L"), + "workspace id": re.compile("Wb" + "vl8L"), "customer name": re.compile(r"\bEnat\b", re.I), "customer hostname": re.compile(r"\bebuat[a-z0-9.-]*\b", re.I), "live environment name": re.compile(r"\buat2\b", re.I), From 2b9b9998835f89b529dbe6c6515fe8fccbbe30cf Mon Sep 17 00:00:00 2001 From: Natnael Amsalu Date: Fri, 2 Oct 2026 20:39:00 +0300 Subject: [PATCH 39/39] Make dashboard privacy validation structural and reusable --- scripts/validate-dashboard-reference.py | 148 +++++++++++++++++++----- 1 file changed, 122 insertions(+), 26 deletions(-) diff --git a/scripts/validate-dashboard-reference.py b/scripts/validate-dashboard-reference.py index 307bce0..f463c68 100644 --- a/scripts/validate-dashboard-reference.py +++ b/scripts/validate-dashboard-reference.py @@ -15,23 +15,34 @@ "saved-searches.json": ("search", 2), } -PRIVATE_PATTERNS = { - "live private subnet": re.compile(r"\b10\.1\.22\.\d+\b"), - "workspace id": re.compile("Wb" + "vl8L"), - "customer name": re.compile(r"\bEnat\b", re.I), - "customer hostname": re.compile(r"\bebuat[a-z0-9.-]*\b", re.I), - "live environment name": re.compile(r"\buat2\b", re.I), - "live Prometheus connection UUID": re.compile( - r"a76653e0-9c1a-11f1-97a4-c15765a0dbb6", re.I - ), - "private application namespace": re.compile( - r"app-hub|backoffice|inquiry|internet-banking|taf-app|taf-flink|" - r"transferhub|ussd-push-payment|wallet", - re.I, - ), +TRANSIENT_KEYS = {"updated_at", "version", "workspaces", "namespaces", "score"} +PROMETHEUS_PLACEHOLDER = ("index-pattern", "reference-prometheus") + +ALLOWED_NAMESPACE_SELECTORS = { + "span_derived", + "^application-.*$", + "channel-mobile", + "channel-ussd", + "^(cattle-capi-system|cattle-fleet-local-system|cattle-fleet-system|" + "cattle-system|cattle-turtles-system|cert-manager|fleet-default|" + "kube-system|longhorn-system|monitoring)$", } -TRANSIENT_KEYS = {"updated_at", "version", "workspaces", "namespaces", "score"} +ALLOWED_NODE_SELECTORS = { + "host-01", + "host-02", + "host-03", + "observability-host-01", +} + +UUID_PATTERN = re.compile( + r"\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-" + r"[89ab][0-9a-f]{3}-[0-9a-f]{12}\b", + re.I, +) + +TOKEN_PATTERN = re.compile(r"\b\d{6,}:[A-Za-z0-9_-]{20,}\b") +PRIVATE_KEY_PATTERN = re.compile(r"BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY") def die(message: str) -> None: print(f"[ERROR] {message}", file=sys.stderr) @@ -41,6 +52,7 @@ 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: @@ -49,11 +61,14 @@ def load_collection(name: str, expected_type: str, expected_count: int): 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"): @@ -66,6 +81,63 @@ def scan_transient(value, where="root"): 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 = [] @@ -78,14 +150,22 @@ def scan_transient(value, where="root"): 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) -for label, pattern in PRIVATE_PATTERNS.items(): - if pattern.search(combined): - die(f"private deployment identity remains: {label}") +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: @@ -93,32 +173,45 @@ def scan_transient(value, where="root"): ip = ipaddress.ip_address(value) except ValueError: continue - if ip.version == 4 and not ip in ipaddress.ip_network("192.0.2.0/24"): + + 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}") -allowed_placeholder = ("index-pattern", "reference-prometheus") 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 != allowed_placeholder: + 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) + 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 {target}") + 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 "reference-prometheus" not in combined: +if prometheus_refs == 0: die("Prometheus placeholder reference is missing") print( @@ -126,5 +219,8 @@ def scan_transient(value, where="root"): "6 dashboards, 74 Explore panels, 4 data views, 2 saved searches" ) print("[OK] all dashboard dependencies resolve") -print("[OK] only reference-prometheus remains as an intentional external mapping") -print("[OK] no known private deployment identifiers remain") +print( + f"[OK] {prometheus_refs} metric references use the intentional " + "reference-prometheus placeholder" +) +print("[OK] environment, namespace, node, address, UUID, and secret guardrails passed")