# Frontend Monitoring Metrics Reference

Inspection date: `2026-03-27`

## Scope

This file extracts the frontend monitoring metrics currently shown in `ref/dbaas-ui-dev`, and rewrites them in a backend-report-friendly shape so they can be compared with:

- Dedicated metrics inventory under `check/dedicated-regression-check/static-check/`
- Premium / Essential / Starter metrics inventory under `check/tidb-x-check/static-check/`

Frontend sources reviewed:

- `ref/dbaas-ui-dev/src/dbaas/screens/NextGen/premium/metrics/config/config.ts`
- `ref/dbaas-ui-dev/src/dbaas/screens/ClusterV2/features/Metrics/config/serverless.ts`
- `ref/dbaas-ui-dev/src/dbaas/screens/ClusterV2/features/Metrics/config/dedicated.ts`
- `ref/dbaas-ui-dev/src/dbaas/screens/Changefeed/ChangefeedDetail/getMetricsConfig.tsx`
- `ref/dbaas-ui-dev/src/dbaas/screens/Changefeed/ChangefeedDetailEssential/index.tsx`

## Reading Notes

- Frontend PromQL is usually executed against a cluster-scoped metrics datasource returned by `useGetMetricsQueryRangeURL*`, so most cluster-level charts do **not** repeat backend-side matchers like `cluster_id="<cluster_id>"`, `tidb_cluster_id="<cluster_id>"`, or `keyspace_id="<keyspace_id>"`.
- For changefeed detail pages, frontend PromQL usually adds `changefeed="<id>"`.
- `match_status` meaning:
  - `exact`: frontend has a directly corresponding chart / series
  - `partial`: frontend shows an aggregated or derived form, but not the same backend output shape
  - `missing`: no current frontend PromQL chart found

## Premium

| metric_name | frontend_page | frontend_metric | promql | match_status | code_ref |
| --- | --- | --- | --- | --- | --- |
| `tidbcloud_db_total_connection` | `Metrics > Instance Status Overview` | `Connection Count / All` | `(sum(tidb_server_connections) or vector(0))` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_active_connections` | `Metrics > Instance Status Overview` | `Connection Count / active connections` | `sum(tidb_server_tokens)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_disconnections` | `Metrics > Instance Status Overview` | `Disconnection Count / {result}` | `(sum(tidb_server_disconnection_total) by (result) or vector(0))` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_database_time` | `Metrics > Instance Status Overview` | `Database Time by SQL Types / {sql_type}` | `sum(rate(tidb_server_handle_query_duration_seconds_sum{sql_type!="internal"}[$__rate_interval])) by (sql_type)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_query_per_second` | `Metrics > Instance Status Overview` | `Query Per Second / {type}` | `sum(rate(tidb_executor_statement_total[$__rate_interval])) by (type)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_failed_queries` | `Metrics > Instance Status Overview` | `Failed Queries / All` | `sum(rate(tidb_server_execute_error_total[$__rate_interval])) or vector(0)` | `partial` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_command_per_second` | `Metrics > Instance Status Overview` | `Command Per Second / {type}` | `(sum(rate(tidb_server_query_total[$__rate_interval])) by (type) or vector(0))` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_queries_using_plan_cache_ops` | `Metrics > Instance Status Overview` | `Queries Using Plan Cache OPS / avg - hit` | `(sum(rate(tidb_server_plan_cache_total[$__rate_interval])) or vector(0))` | `partial` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_average_query_duration` | `Metrics > Instance Status Overview` | `Query Duration / avg-{sql_type}` | `sum(rate(tidb_server_handle_query_duration_seconds_sum{sql_type!="internal"}[$__rate_interval])) by (sql_type) / sum(rate(tidb_server_handle_query_duration_seconds_count{sql_type!="internal"}[$__rate_interval])) by (sql_type)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_transaction_per_second` | `Metrics > Instance Status Overview` | `Transaction Per Second / {type}-{txn_mode}` | `sum(rate(tidb_session_transaction_duration_seconds_count{scope=~"general"}[$__rate_interval])) by (type, txn_mode)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_changefeed_latency` | `Metrics > Instance Status Overview` | `Changefeed Checkpoint Lag / {changefeed}` | `max(ticdc_owner_checkpoint_ts_lag) by (changefeed)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_changefeed_checkpoint_ts` | `Changefeed Detail` | `not shown by PromQL chart` |  | `missing` | `Changefeed detail uses API field checkpoint_tso, not PromQL` |
| `tidbcloud_changefeed_status` | `Metrics > Instance Status Overview` | `The Status of Changefeeds / {changefeed}` | `max(ticdc_owner_status) by (changefeed)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_changefeed_Replica_rows` | `Changefeed Detail` | `Replica rows Per Sec / changefeed` | `<6.3: sum(rate(ticdc_sink_total_flushed_rows_count{changefeed="<id>"}[1m])) by (changefeed); 6.3<=v<7.0: sum(rate(ticdc_sinkv2_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed); >=7.0: sum(rate(ticdc_sink_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed)` | `exact` | `Changefeed/ChangefeedDetail/getMetricsConfig.tsx` |
| `tidbcloud_ticdc_owner_resolved_ts_lag` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_resource_manager_resource_unit_read_request_unit` | `Metrics > Instance Status Overview` | `Request Units per Second / Total RU per second` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0))` | `partial` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_resource_manager_resource_unit_write_request_unit` | `Metrics > Instance Status Overview` | `Request Units per Second / Total RU per second` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0))` | `partial` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_row_storage_used_bytes` | `Metrics > Instance Status Overview` | `Used Storage Size / Row-based storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="used"}))[$__rate_interval]) or vector(0)` | `exact` | `NextGen/premium/metrics/config/config.ts` |
| `tidbcloud_db_columnar_storage_used_bytes` | `Metrics > Instance Status Overview` | `Used Storage Size / Columnar storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="tiflash_used"}))[$__rate_interval]) or vector(0)` | `exact` | `NextGen/premium/metrics/config/config.ts` |

## Essential

| metric_name | frontend_page | frontend_metric | promql | match_status | code_ref |
| --- | --- | --- | --- | --- | --- |
| `tidbcloud_db_total_connection` | `Metrics > Cluster Status` | `Total Connection / All` | `sum(tidb_server_connections) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_active_connections` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_disconnections` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_database_time` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_query_per_second` | `Metrics > Cluster Status` | `Query Per Second / {type}` | `sum(rate(tidb_executor_statement_total[$__rate_interval])) by (type)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_failed_queries` | `Metrics > Cluster Status` | `Failed Query / All` | `sum(rate(tidb_server_execute_error_total{db!="",type!="unknown"}[$__rate_interval])) default 0` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_command_per_second` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_queries_using_plan_cache_ops` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_average_query_duration` | `Metrics > Cluster Status` | `Query Duration / avg-{sql_type}` | `sum(rate(tidb_server_handle_query_duration_seconds_sum{db!="",sql_type!="internal"}[$__rate_interval])) by (sql_type) / sum(rate(tidb_server_handle_query_duration_seconds_count{db!="",sql_type!="internal"}[$__rate_interval])) by (sql_type)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_transaction_per_second` | `Metrics > Cluster Status` | `Transaction Per Second / All` | `sum(rate(tidb_session_transaction_duration_seconds_count{scope=~"general"}[$__rate_interval])) or vector(0)` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_changefeed_latency` | `Metrics > Cluster Status` | `Changefeed Checkpoint Lag / {changefeed}` | `max(ticdc_owner_checkpoint_ts_lag) by (changefeed)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_changefeed_checkpoint_ts` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_changefeed_status` | `not found` | `not shown` |  | `missing` | `status chart is commented out in serverless.ts` |
| `tidbcloud_changefeed_Replica_rows` | `Changefeed Detail` | `Replica rows Per Sec / changefeed` | `avg(rate(ticdc_sink_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed)` | `partial` | `Changefeed/ChangefeedDetailEssential/index.tsx` |
| `tidbcloud_ticdc_owner_resolved_ts_lag` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_resource_manager_resource_unit_read_request_unit` | `Metrics > Cluster Status` | `Capacity vs Usage (RU/s) / Consumed (RU/s)` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit_sum[1m])) or vector(0)) + (sum(rate(gateway_connection_flow_bytes_sum{namespace="tidb-admin",direction="out"}[1m])/(1024)) or vector(0)) + (sum(rate(sum(tikv_worker_load_data_wru_cost_counter)[1m])) or vector(0)) + (sum(increase(sum(export_ru_cost_counter)[120s])/120) or vector(0))` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_resource_manager_resource_unit_write_request_unit` | `Metrics > Cluster Status` | `Capacity vs Usage (RU/s) / Consumed (RU/s)` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit_sum[1m])) or vector(0)) + (sum(rate(gateway_connection_flow_bytes_sum{namespace="tidb-admin",direction="out"}[1m])/(1024)) or vector(0)) + (sum(rate(sum(tikv_worker_load_data_wru_cost_counter)[1m])) or vector(0)) + (sum(increase(sum(export_ru_cost_counter)[120s])/120) or vector(0))` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_row_storage_used_bytes` | `Metrics > Cluster Status` | `Used Storage Size / Row-based storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="used"}))[$__rate_interval]) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_columnar_storage_used_bytes` | `Metrics > Cluster Status` | `Used Storage Size / Columnar storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="tiflash_used"}))[$__rate_interval]) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |

## Starter

| metric_name | frontend_page | frontend_metric | promql | match_status | code_ref |
| --- | --- | --- | --- | --- | --- |
| `tidbcloud_db_total_connection` | `Metrics > Cluster Status` | `Total Connection / All` | `sum(tidb_server_connections) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_active_connections` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_disconnections` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_database_time` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_query_per_second` | `Metrics > Cluster Status` | `Query Per Second / {type}` | `sum(rate(tidb_executor_statement_total[$__rate_interval])) by (type)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_failed_queries` | `Metrics > Cluster Status` | `Failed Query / All` | `sum(rate(tidb_server_execute_error_total{db!="",type!="unknown"}[$__rate_interval])) default 0` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_command_per_second` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_queries_using_plan_cache_ops` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_db_average_query_duration` | `Metrics > Cluster Status` | `Query Duration / avg-{sql_type}` | `sum(rate(tidb_server_handle_query_duration_seconds_sum{db!="",sql_type!="internal"}[$__rate_interval])) by (sql_type) / sum(rate(tidb_server_handle_query_duration_seconds_count{db!="",sql_type!="internal"}[$__rate_interval])) by (sql_type)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_transaction_per_second` | `Metrics > Cluster Status` | `Transaction Per Second / All` | `sum(rate(tidb_session_transaction_duration_seconds_count{scope=~"general"}[$__rate_interval])) or vector(0)` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_changefeed_latency` | `Metrics > Cluster Status` | `Changefeed Checkpoint Lag / {changefeed}` | `max(ticdc_owner_checkpoint_ts_lag) by (changefeed)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_changefeed_checkpoint_ts` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_changefeed_status` | `not found` | `not shown` |  | `missing` | `status chart is commented out in serverless.ts` |
| `tidbcloud_changefeed_Replica_rows` | `Changefeed Detail` | `Replica rows Per Sec / changefeed` | `<6.3: sum(rate(ticdc_sink_total_flushed_rows_count{changefeed="<id>"}[1m])) by (changefeed); 6.3<=v<7.0: sum(rate(ticdc_sinkv2_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed); >=7.0: sum(rate(ticdc_sink_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed)` | `exact` | `Changefeed/ChangefeedDetail/getMetricsConfig.tsx` |
| `tidbcloud_ticdc_owner_resolved_ts_lag` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_resource_manager_resource_unit_read_request_unit` | `Metrics > Cluster Status` | `Request Units / Total RU per second` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit_sum[1m])) or vector(0)) + (sum(rate(gateway_connection_flow_bytes_sum{namespace="tidb-admin",direction="out"}[1m])/(1024)) or vector(0)) + (sum(rate(sum(tikv_worker_load_data_wru_cost_counter)[1m])) or vector(0)) + (sum(increase(sum(export_ru_cost_counter)[120s])/120) or vector(0))` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_resource_manager_resource_unit_write_request_unit` | `Metrics > Cluster Status` | `Request Units / Total RU per second` | `(sum(rate(resource_manager_resource_unit_read_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_write_request_unit_sum[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit[1m])) or vector(0)) + (sum(rate(resource_manager_resource_unit_sql_layer_request_unit_sum[1m])) or vector(0)) + (sum(rate(gateway_connection_flow_bytes_sum{namespace="tidb-admin",direction="out"}[1m])/(1024)) or vector(0)) + (sum(rate(sum(tikv_worker_load_data_wru_cost_counter)[1m])) or vector(0)) + (sum(increase(sum(export_ru_cost_counter)[120s])/120) or vector(0))` | `partial` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_row_storage_used_bytes` | `Metrics > Cluster Status` | `Used Storage Size / Row-based storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="used"}))[$__rate_interval]) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |
| `tidbcloud_db_columnar_storage_used_bytes` | `Metrics > Cluster Status` | `Used Storage Size / Columnar storage` | `quantile_over_time(0.5, sum(avg by(keyspace_id, region_id) (tikv_store_size_bytes{type="tiflash_used"}))[$__rate_interval]) or vector(0)` | `exact` | `ClusterV2/features/Metrics/config/serverless.ts` |

## Dedicated

Dedicated frontend monitoring is broader than the current backend exported metrics inventory. The table below keeps only the frontend charts that overlap with backend metrics already listed in `dedicated-regression-check/static-check/01-current-branch-dedicated-metrics-output.md`.

| metric_name | frontend_page | frontend_metric | promql | match_status | code_ref |
| --- | --- | --- | --- | --- | --- |
| `tidbcloud_db_connections` | `Metrics > Overview` | `Connection Count / All` | `sum(tidb_server_connections)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_db_failed_queries_total` | `Metrics > Overview` | `Failed Queries / {type}-{instance}` | `sum(rate(tidb_server_execute_error_total[$__rate_interval])) by (type,instance)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_db_queries_total` | `Metrics > Overview` | `Query Per Second / {type}` | `sum(rate(tidb_executor_statement_total[$__rate_interval])) by (type)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_db_query_duration_seconds` | `Metrics > Overview` | `Query Duration / avg, 99, avg-{sql_type}, 99-{sql_type}` | `sum(rate(tidb_server_handle_query_duration_seconds_sum{sql_type!="internal"}[$__rate_interval])) / sum(rate(tidb_server_handle_query_duration_seconds_count{sql_type!="internal"}[$__rate_interval])) ; histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{sql_type!="internal"}[$__rate_interval])) by (le)) ; sum(rate(tidb_server_handle_query_duration_seconds_sum{sql_type!="internal"}[$__rate_interval])) by (sql_type) / sum(rate(tidb_server_handle_query_duration_seconds_count{sql_type!="internal"}[$__rate_interval])) by (sql_type)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_kv_request_duration` | `Metrics > Advanced` | `Average TiDB KV Request Duration / {type}` | `sum(rate(tidb_tikvclient_request_seconds_sum{store!="0"}[$__rate_interval])) by (type)/ sum(rate(tidb_tikvclient_request_seconds_count{store!="0"}[$__rate_interval])) by (type)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_component_uptime` | `Metrics > Server` | `TiDB Uptime`, `TiKV Uptime`, `TiFlash Uptime` | `avg by (cluster_id, instance) ((time() - process_start_time_seconds{component="tidb"})) ; avg by (cluster_id, instance) ((time() - process_start_time_seconds{component="tikv"})) ; avg by (cluster_id, instance) (tiflash_system_asynchronous_metric_Uptime)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_cpu_capacity_cores` | `Metrics > Server` | `TiDB CPU Usage / limit`, `TiKV CPU Usage / limit`, `TiFlash CPU Usage / limit` | `avg(tidb_server_maxprocs{component="tidb"}) by (tidb_cluster_id) ; avg(tikv_server_cpu_cores_quota{component="tikv"}) by (tidb_cluster_id) ; avg(sum(tiflash_system_current_metric_LogicalCPUCores) by (instance)) by (tidb_cluster_id)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_cpu_seconds_total` | `Metrics > Server` | `TiDB CPU Usage / {instance}`, `TiKV CPU Usage / {instance}`, `TiFlash CPU Usage / {instance}` | `sum(rate(node_cpu_seconds_total{mode!="idle",component="tidb"}[$__rate_interval])) by (instance) ; sum(rate(node_cpu_seconds_total{mode!="idle",component="tikv"}[$__rate_interval])) by (instance) ; sum(rate(node_cpu_seconds_total{mode!="idle",component="tiflash"}[$__rate_interval])) by (instance)` | `partial` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_memory_capacity_bytes` | `Metrics > Server` | `TiDB Memory Usage / limit`, `TiKV Memory Usage / limit`, `TiFlash Memory Usage / limit` | `avg(node_memory_MemTotal_bytes{component="tidb"}) by (tidb_cluster_id) ; avg(node_memory_MemTotal_bytes{component="tikv"}) by (tidb_cluster_id) ; avg(node_memory_MemTotal_bytes{component="tiflash"}) by (tidb_cluster_id)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_memory_used_bytes` | `Metrics > Server` | `TiDB Memory Usage / {instance}`, `TiKV Memory Usage / {instance}`, `TiFlash Memory Usage / {instance}` | `avg(node_memory_MemTotal_bytes{component="tidb"} - node_memory_MemAvailable_bytes{component="tidb"}) by (instance) ; avg(node_memory_MemTotal_bytes{component="tikv"} - node_memory_MemAvailable_bytes{component="tikv"}) by (instance) ; avg(node_memory_MemTotal_bytes{component="tiflash"} - node_memory_MemAvailable_bytes{component="tiflash"}) by (instance)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_storage_capacity_bytes` | `Metrics > Server` | `TiKV Storage Usage / limit`, `TiFlash Storage Usage / limit` | `avg(tikv_store_size_bytes{type="capacity"}) by (tidb_cluster_id) ; avg(tiflash_system_current_metric_StoreSizeCapacity) by (tidb_cluster_id)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_storage_used_bytes` | `Metrics > Server` | `TiKV Storage Usage / {instance}-Used`, `TiFlash Storage Usage / {instance}-Used` | `sum(tikv_store_size_bytes{type="capacity"}) by (instance) - sum(tikv_store_size_bytes{type="available"}) by (instance) ; sum(tiflash_system_current_metric_StoreSizeCapacity-tiflash_system_current_metric_StoreSizeAvailable) by (instance)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_node_storage_available_bytes` | `Metrics > Server` | `TiKV Storage Usage / {instance}-Available`, `TiFlash Storage Usage / {instance}-Available` | `sum(tikv_store_size_bytes{type="available"}) by (instance) ; sum(tiflash_system_current_metric_StoreSizeAvailable) by (instance)` | `exact` | `ClusterV2/features/Metrics/config/dedicated.ts` |
| `tidbcloud_changefeed_latency` | `Changefeed Detail` | `Latency / changefeed` | `max(ticdc_owner_checkpoint_ts_lag{changefeed="<id>"}) by (changefeed)` | `exact` | `Changefeed/ChangefeedDetail/getMetricsConfig.tsx` |
| `tidbcloud_changefeed_checkpoint_ts` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_changefeed_status` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_changefeed_Replica_rows` | `Changefeed Detail` | `Replica rows Per Sec / changefeed` | `<6.3: sum(rate(ticdc_sink_total_flushed_rows_count{changefeed="<id>"}[1m])) by (changefeed); 6.3<=v<7.0: sum(rate(ticdc_sinkv2_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed); >=7.0: sum(rate(ticdc_sink_batch_row_count_sum{changefeed="<id>"}[1m])) by (changefeed)` | `exact` | `Changefeed/ChangefeedDetail/getMetricsConfig.tsx` |
| `tidbcloud_ticdc_owner_resolved_ts_lag` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_resource_manager_resource_unit_read_request_unit` | `not found` | `not shown` |  | `missing` |  |
| `tidbcloud_resource_manager_resource_unit_write_request_unit` | `not found` | `not shown` |  | `missing` |  |

## Current Frontend Gaps vs Backend Inventory

### Premium

- Missing as PromQL chart: `changefeed_checkpoint_ts`, `ticdc_owner_resolved_ts_lag`
- Aggregated instead of split backend metric shape: `failed_queries`, `queries_using_plan_cache_ops`, RU read/write

### Essential

- Missing on current frontend metrics pages: `active_connections`, `disconnections`, `database_time`, `command_per_second`, `queries_using_plan_cache_ops`, `changefeed_checkpoint_ts`, `changefeed_status`, `ticdc_owner_resolved_ts_lag`
- `changefeed_Replica_rows` is only shown on changefeed detail, and the frontend query currently differs from backend inventory shape

### Starter

- Missing on current frontend metrics pages: `active_connections`, `disconnections`, `database_time`, `command_per_second`, `queries_using_plan_cache_ops`, `changefeed_checkpoint_ts`, `changefeed_status`, `ticdc_owner_resolved_ts_lag`
- RU is shown only as combined RU consumption, not as separate read/write series

### Dedicated

- Missing on current frontend metrics pages: `changefeed_checkpoint_ts`, `changefeed_status`, `ticdc_owner_resolved_ts_lag`, RU read/write
- Dedicated frontend server charts are component-specific and derived, so CPU metrics are closer to `node_cpu_seconds_total_rate` semantics than the backend Prometheus raw-capacity style
