This is an automated email from the ASF dual-hosted git repository.
wu-sheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git
The following commit(s) were added to refs/heads/main by this push:
new 2c2e3c7 fixes from manual review
2c2e3c7 is described below
commit 2c2e3c7951a922cf68b4b6d8d57694fb6723f040
Author: Wu Sheng <[email protected]>
AuthorDate: Sat May 16 23:51:30 2026 +0800
fixes from manual review
bff loaders: bundled_templates path
logic/layers/loader.ts + logic/overview/loader.ts moved one folder
deeper during the BFF refactor; their __dirname/'..'/bundled_templates
resolution lost its anchor, breaking layer + overview loading at
startup (ENOENT scandir 'apps/bff/src/logic/bundled_templates/...').
Bump to '..'/'..'/bundled_templates so it lands on the actual
apps/bff/src/bundled_templates/.
sidebar: split Live debugger + Capture history
Two top-level menu items under Operate instead of one expandable;
matches how operators reach each independently.
widget type: scalar MQE → card (59 widgets, 13 templates)
Any widget whose only expression collapses the time window to a
single number (latest(...), avg/sum/max/min of a plain metric) is
now type:"card", not type:"line". Line-charting a constant wastes
pixels and misreads. Affects activemq, clickhouse, elasticsearch,
flink, k8s, kafka, kong, mongodb, mysql, postgresql, rabbitmq,
redis, rocketmq. rowSpan dropped to 1 for the same set so cards
occupy one grid row instead of two.
CLAUDE.md
Adds the widget-type-follows-MQE-shape principle so future widgets
land in the right type, and so reviewers can flag misclassified
widgets quickly.
---
CLAUDE.md | 1 +
.../bff/src/bundled_templates/layers/activemq.json | 4 +--
.../src/bundled_templates/layers/clickhouse.json | 16 +++++------
.../bundled_templates/layers/elasticsearch.json | 32 +++++++++++-----------
apps/bff/src/bundled_templates/layers/flink.json | 24 ++++++++--------
apps/bff/src/bundled_templates/layers/k8s.json | 20 +++++++-------
apps/bff/src/bundled_templates/layers/kafka.json | 4 +--
apps/bff/src/bundled_templates/layers/kong.json | 12 ++++----
apps/bff/src/bundled_templates/layers/mongodb.json | 28 +++++++++----------
apps/bff/src/bundled_templates/layers/mysql.json | 16 +++++------
.../src/bundled_templates/layers/postgresql.json | 16 +++++------
.../bff/src/bundled_templates/layers/rabbitmq.json | 20 +++++++-------
apps/bff/src/bundled_templates/layers/redis.json | 32 +++++++++++-----------
.../bff/src/bundled_templates/layers/rocketmq.json | 12 ++++----
apps/bff/src/logic/layers/loader.ts | 5 ++--
apps/bff/src/logic/overview/loader.ts | 5 ++--
apps/ui/src/shell/AppSidebar.vue | 4 +--
17 files changed, 126 insertions(+), 125 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index f2fa042..1a79a89 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -45,6 +45,7 @@ Every OAP metric lives under exactly one entity scope
(Service / ServiceInstance
- **Storage backends have undocumented limits.** Page sizes, nested
selections, and per-record sub-queries fail at backend-specific thresholds.
Degrade list queries to the cheapest selection that satisfies the screen; probe
before defaulting.
- **OAP IDs are not always per-record unique.** Some wire `id` fields key on
the alarmed/related entity, not the firing instance. Disambiguate composite
keys with timestamp before using `id` as a row key.
+- **Widget type follows MQE shape.** A widget whose MQE collapses to a single
scalar must be `type: "card"`, not `type: "line"`. The tell-tale is the
outermost call: `latest(...)`, `max(...)`, `min(...)`, `avg(<plain-metric>)`,
`sum(<plain-metric>)` all reduce the window to one number — line-charting a
single point is wasteful and misleads operators into thinking the metric is
time-varying. Series-shaped wrappers (`relabels(...)`, `top_n(...)`,
`histogram*(...)`, `aggregate_labels(...)` [...]
## Design source of truth
diff --git a/apps/bff/src/bundled_templates/layers/activemq.json
b/apps/bff/src/bundled_templates/layers/activemq.json
index 066b3c2..74435c9 100644
--- a/apps/bff/src/bundled_templates/layers/activemq.json
+++ b/apps/bff/src/bundled_templates/layers/activemq.json
@@ -113,13 +113,13 @@
{
"id": "heap_max",
"title": "Heap Max (MB)",
- "type": "line",
+ "type": "card",
"unit": "MB",
"expressions": [
"latest(aggregate_labels(meter_activemq_cluster_heap_memory_usage_max,sum))/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "enqueue_dequeue",
diff --git a/apps/bff/src/bundled_templates/layers/clickhouse.json
b/apps/bff/src/bundled_templates/layers/clickhouse.json
index 4f51045..0d8dd33 100644
--- a/apps/bff/src/bundled_templates/layers/clickhouse.json
+++ b/apps/bff/src/bundled_templates/layers/clickhouse.json
@@ -81,12 +81,12 @@
{
"id": "files_open",
"title": "Files Open",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_clickhouse_file_open,sum))"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "qps",
@@ -271,22 +271,22 @@
{
"id": "uptime",
"title": "Uptime (days)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_clickhouse_instance_uptime)/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "version",
"title": "Version",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_clickhouse_instance_version)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "cpu",
@@ -427,12 +427,12 @@
{
"id": "files",
"title": "Files Open",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_clickhouse_instance_file_open)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "insert_io",
diff --git a/apps/bff/src/bundled_templates/layers/elasticsearch.json
b/apps/bff/src/bundled_templates/layers/elasticsearch.json
index 2283cd1..b94e432 100644
--- a/apps/bff/src/bundled_templates/layers/elasticsearch.json
+++ b/apps/bff/src/bundled_templates/layers/elasticsearch.json
@@ -92,32 +92,32 @@
{
"id": "nodes",
"title": "Nodes",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_elasticsearch_cluster_nodes)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "pending_tasks",
"title": "Pending Tasks",
- "type": "line",
+ "type": "card",
"expressions": [
"avg(meter_elasticsearch_cluster_pending_tasks_total)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "primary_shards",
"title": "Primary Shards",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_elasticsearch_cluster_primary_shards_total)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "shards_breakdown",
@@ -143,43 +143,43 @@
{
"id": "breakers",
"title": "Tripped Breakers",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_elasticsearch_cluster_breakers_tripped)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "cluster_cpu",
"title": "Cluster CPU Avg",
- "type": "line",
+ "type": "card",
"unit": "%",
"expressions": [
"avg(meter_elasticsearch_cluster_cpu_usage_avg)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "cluster_jvm",
"title": "JVM Memory Used Avg",
- "type": "line",
+ "type": "card",
"expressions": [
"avg(meter_elasticsearch_cluster_jvm_memory_used_avg)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "open_files",
"title": "Open Files Avg",
- "type": "line",
+ "type": "card",
"expressions": [
"avg(meter_elasticsearch_cluster_open_file_count)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
}
],
"instance": [
@@ -348,12 +348,12 @@
{
"id": "open_files",
"title": "Open Files",
- "type": "line",
+ "type": "card",
"expressions": [
"avg(meter_elasticsearch_node_open_file_count)"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
}
],
"endpoint": [
diff --git a/apps/bff/src/bundled_templates/layers/flink.json
b/apps/bff/src/bundled_templates/layers/flink.json
index 6316663..1fb3f43 100644
--- a/apps/bff/src/bundled_templates/layers/flink.json
+++ b/apps/bff/src/bundled_templates/layers/flink.json
@@ -75,22 +75,22 @@
{
"id": "jobs",
"title": "Running Jobs",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_jobManager_running_job_number)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "task_mgrs",
"title": "TaskManagers",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_jobManager_taskManagers_registered_number)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "slots",
@@ -433,42 +433,42 @@
{
"id": "running_time",
"title": "Job Running Time (min)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_job_runningTime)/1000/60"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "restarting_time",
"title": "Job Restarting Time (min)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_job_restartingTime)/1000/60"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "cancelling_time",
"title": "Job Cancelling Time (min)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_job_cancellingTime)/1000/60"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "restarts",
"title": "Job Restarts",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_flink_job_restart_number)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "checkpoints",
diff --git a/apps/bff/src/bundled_templates/layers/k8s.json
b/apps/bff/src/bundled_templates/layers/k8s.json
index 7e2fda8..acec1df 100644
--- a/apps/bff/src/bundled_templates/layers/k8s.json
+++ b/apps/bff/src/bundled_templates/layers/k8s.json
@@ -185,47 +185,47 @@
{
"id": "pod_waiting",
"title": "Pods Waiting",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(k8s_cluster_pod_status_waiting)"
],
"span": 3,
- "rowSpan": 2,
+ "rowSpan": 1,
"format": "int"
},
{
"id": "pod_not_running",
"title": "Pods Not Running",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(k8s_cluster_pod_status_not_running)"
],
"span": 3,
- "rowSpan": 2,
+ "rowSpan": 1,
"format": "int"
},
{
"id": "service_pod_status",
"title": "Service Pod Status",
"tip": "Aggregate health of pods backing K8s Service objects.",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(k8s_cluster_service_pod_status)"
],
"span": 4,
- "rowSpan": 2,
+ "rowSpan": 1,
"format": "int"
},
{
"id": "node_status",
"title": "Node Status",
"tip": "Sum of node Ready states.",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(k8s_cluster_node_status)"
],
"span": 4,
- "rowSpan": 2,
+ "rowSpan": 1,
"format": "int"
},
{
@@ -254,12 +254,12 @@
{
"id": "node_status",
"title": "Node Status",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(k8s_node_node_status)"
],
"span": 3,
- "rowSpan": 2,
+ "rowSpan": 1,
"format": "int"
},
{
diff --git a/apps/bff/src/bundled_templates/layers/kafka.json
b/apps/bff/src/bundled_templates/layers/kafka.json
index d39ec03..0052052 100644
--- a/apps/bff/src/bundled_templates/layers/kafka.json
+++ b/apps/bff/src/bundled_templates/layers/kafka.json
@@ -337,12 +337,12 @@
{
"id": "max_lag",
"title": "Max Lag (broker)",
- "type": "line",
+ "type": "card",
"expressions": [
"sum(meter_kafka_broker_max_lag)"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
}
]
}
diff --git a/apps/bff/src/bundled_templates/layers/kong.json
b/apps/bff/src/bundled_templates/layers/kong.json
index 2edda1e..90c51a1 100644
--- a/apps/bff/src/bundled_templates/layers/kong.json
+++ b/apps/bff/src/bundled_templates/layers/kong.json
@@ -174,22 +174,22 @@
{
"id": "datastore",
"title": "Datastore Reachable",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_kong_service_datastore_reachable,sum(service_instance_id)))"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "nginx_errors",
"title": "Nginx Metric Errors",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_kong_service_nginx_metric_errors_total,sum))"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
}
],
"instance": [
@@ -260,12 +260,12 @@
{
"id": "datastore",
"title": "Datastore Reachable",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_kong_instance_datastore_reachable)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "conns",
diff --git a/apps/bff/src/bundled_templates/layers/mongodb.json
b/apps/bff/src/bundled_templates/layers/mongodb.json
index fe1d2ef..267245d 100644
--- a/apps/bff/src/bundled_templates/layers/mongodb.json
+++ b/apps/bff/src/bundled_templates/layers/mongodb.json
@@ -95,42 +95,42 @@
{
"id": "uptime",
"title": "Cluster Uptime (days)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_uptime,max))/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "data_size",
"title": "Data Size (GB)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_data_size,sum))/1024/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "coll_count",
"title": "Collection Count",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_collection_count,sum))"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "obj_count",
"title": "Object Count",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_object_count,sum))"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "doc_qps",
@@ -186,34 +186,34 @@
{
"id": "db_data_size",
"title": "DB Total Data (GB)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_db_data_size,
sum(database)))/1024/1024/1024"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "db_index_size",
"title": "DB Total Index (GB)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_mongodb_cluster_db_index_size,
sum(database)))/1024/1024/1024"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
}
],
"instance": [
{
"id": "uptime",
"title": "Uptime (days)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_mongodb_node_uptime)/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "qps",
diff --git a/apps/bff/src/bundled_templates/layers/mysql.json
b/apps/bff/src/bundled_templates/layers/mysql.json
index e812f75..52590f1 100644
--- a/apps/bff/src/bundled_templates/layers/mysql.json
+++ b/apps/bff/src/bundled_templates/layers/mysql.json
@@ -180,44 +180,44 @@
{
"id": "uptime",
"title": "Uptime",
- "type": "line",
+ "type": "card",
"unit": "days",
"expressions": [
"latest(meter_mysql_instance_uptime)/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "max_conns",
"title": "Max Connections",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_mysql_instance_max_connections)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "buffer_pool",
"title": "InnoDB Buffer Pool",
- "type": "line",
+ "type": "card",
"unit": "MB",
"expressions": [
"latest(meter_mysql_instance_innodb_buffer_pool_size)/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "thread_cache",
"title": "Thread Cache Size",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_mysql_instance_thread_cache_size)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "instance_qps_tps",
diff --git a/apps/bff/src/bundled_templates/layers/postgresql.json
b/apps/bff/src/bundled_templates/layers/postgresql.json
index a213d09..f4afd9e 100644
--- a/apps/bff/src/bundled_templates/layers/postgresql.json
+++ b/apps/bff/src/bundled_templates/layers/postgresql.json
@@ -270,46 +270,46 @@
{
"id": "shared_buffers",
"title": "Shared Buffers",
- "type": "line",
+ "type": "card",
"unit": "MB",
"expressions": [
"latest(meter_pg_instance_shared_buffers)/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "effective_cache",
"title": "Effective Cache",
- "type": "line",
+ "type": "card",
"unit": "GB",
"expressions": [
"latest(meter_pg_instance_effective_cache)/1024/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "work_mem",
"title": "Work Mem",
- "type": "line",
+ "type": "card",
"unit": "MB",
"expressions": [
"latest(meter_pg_instance_work_mem)/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "max_wal_size",
"title": "Max WAL Size",
- "type": "line",
+ "type": "card",
"unit": "GB",
"expressions": [
"latest(meter_pg_instance_max_wal_size)/1024/1024/1024"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "instance_fetched",
diff --git a/apps/bff/src/bundled_templates/layers/rabbitmq.json
b/apps/bff/src/bundled_templates/layers/rabbitmq.json
index 4e7e068..d2f98ee 100644
--- a/apps/bff/src/bundled_templates/layers/rabbitmq.json
+++ b/apps/bff/src/bundled_templates/layers/rabbitmq.json
@@ -227,42 +227,42 @@
{
"id": "ready_msgs",
"title": "Ready Messages",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rabbitmq_node_queue_messages_ready)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "incoming",
"title": "Incoming Messages",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rabbitmq_node_incoming_messages)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "outgoing",
"title": "Outgoing Messages",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rabbitmq_node_outgoing_messages_total)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "unack",
"title": "Unacknowledged Messages",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rabbitmq_node_unacknowledged_messages)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "conns",
@@ -299,13 +299,13 @@
{
"id": "memory_pct",
"title": "Allocated Used %",
- "type": "line",
+ "type": "card",
"unit": "%",
"expressions": [
"latest(meter_rabbitmq_node_allocated_used_percent)/100"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "memory_bytes",
diff --git a/apps/bff/src/bundled_templates/layers/redis.json
b/apps/bff/src/bundled_templates/layers/redis.json
index 1591833..00f3f85 100644
--- a/apps/bff/src/bundled_templates/layers/redis.json
+++ b/apps/bff/src/bundled_templates/layers/redis.json
@@ -91,43 +91,43 @@
{
"id": "uptime",
"title": "Uptime (days)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_redis_uptime,max))/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "clients",
"title": "Connected Clients",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_redis_connected_clients,sum))"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "blocked",
"title": "Blocked Clients",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(aggregate_labels(meter_redis_blocked_clients,sum))"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "mem_pct",
"title": "Memory Usage",
- "type": "line",
+ "type": "card",
"unit": "%",
"expressions": [
"latest(aggregate_labels(meter_redis_memory_used_bytes,sum)/aggregate_labels(meter_redis_memory_max_bytes,sum))*100"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "commands",
@@ -209,42 +209,42 @@
{
"id": "uptime",
"title": "Uptime (days)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_redis_instance_uptime)/3600/24"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "clients",
"title": "Connected Clients",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_redis_instance_connected_clients)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "blocked",
"title": "Blocked Clients",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_redis_instance_redis_blocked_clients)"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "max_mem",
"title": "Memory Max (MB)",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_redis_instance_memory_max_bytes)/1000/1000"
],
"span": 3,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "mem_pct",
diff --git a/apps/bff/src/bundled_templates/layers/rocketmq.json
b/apps/bff/src/bundled_templates/layers/rocketmq.json
index b67cf8d..69cc538 100644
--- a/apps/bff/src/bundled_templates/layers/rocketmq.json
+++ b/apps/bff/src/bundled_templates/layers/rocketmq.json
@@ -143,12 +143,12 @@
{
"id": "consumer_lag",
"title": "Max Consumer Latency",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rocketmq_cluster_max_consumer_latency)"
],
"span": 4,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "commitlog_ratio",
@@ -330,22 +330,22 @@
{
"id": "consumer_groups",
"title": "Consumer Group Count",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rocketmq_topic_consumer_group_count)"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
},
{
"id": "brokers",
"title": "Broker Count",
- "type": "line",
+ "type": "card",
"expressions": [
"latest(meter_rocketmq_topic_broker_count)"
],
"span": 6,
- "rowSpan": 2
+ "rowSpan": 1
}
]
}
diff --git a/apps/bff/src/logic/layers/loader.ts
b/apps/bff/src/logic/layers/loader.ts
index 43da91c..979a382 100644
--- a/apps/bff/src/logic/layers/loader.ts
+++ b/apps/bff/src/logic/layers/loader.ts
@@ -309,8 +309,9 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
// Bundled layer JSONs live alongside other static templates under
// `apps/bff/src/bundled_templates/`. In the long run these should be
// served by OAP; for now they ship inside the BFF so a fresh deploy
-// renders something sensible without any operator setup.
-const CONFIG_DIR = join(__dirname, '..', 'bundled_templates', 'layers');
+// renders something sensible without any operator setup. Two levels
+// up from logic/layers/ to reach apps/bff/src/.
+const CONFIG_DIR = join(__dirname, '..', '..', 'bundled_templates', 'layers');
let cache: Map<string, LayerTemplate> | null = null;
diff --git a/apps/bff/src/logic/overview/loader.ts
b/apps/bff/src/logic/overview/loader.ts
index 200722e..0e93363 100644
--- a/apps/bff/src/logic/overview/loader.ts
+++ b/apps/bff/src/logic/overview/loader.ts
@@ -38,8 +38,9 @@ const __dirname =
path.dirname(fileURLToPath(import.meta.url));
// Bundled overview dashboards live under `bundled_templates/overviews/`
// (sibling to `bundled_templates/layers/`). Co-locating the static
// templates keeps the future "operator-editable / OAP-served" migration
-// to one directory swap.
-const CONFIG_DIR = path.join(__dirname, '..', 'bundled_templates',
'overviews');
+// to one directory swap. Two levels up from logic/overview/ to reach
+// apps/bff/src/.
+const CONFIG_DIR = path.join(__dirname, '..', '..', 'bundled_templates',
'overviews');
let cache: OverviewDashboard[] | null = null;
diff --git a/apps/ui/src/shell/AppSidebar.vue b/apps/ui/src/shell/AppSidebar.vue
index 669fdf4..3a96087 100644
--- a/apps/ui/src/shell/AppSidebar.vue
+++ b/apps/ui/src/shell/AppSidebar.vue
@@ -201,10 +201,8 @@ const sections: NavSection[] = [
// Match the tab variants only; the history sibling at
// /operate/live-debug/history must NOT highlight this row.
activeWhen: (p) => p === '/operate/live-debug' ||
/^\/operate\/live-debug\/(mal|lal|oal)(\/|$)/.test(p),
- children: [
- { icon: 'event', label: 'Capture history', to:
'/operate/live-debug/history' },
- ],
},
+ { icon: 'event', label: 'Capture history', to:
'/operate/live-debug/history' },
{ icon: 'metric', label: 'Metrics Inspect', to: '/operate/inspect' },
{
icon: 'set',