From 6e28a998dd5c8f6c1080640d69a576c7bde7f003 Mon Sep 17 00:00:00 2001 From: Guangdong Liu Date: Mon, 27 Nov 2023 23:28:25 +0800 Subject: [PATCH] [improve](metrics)Display garbage collector type (#27408) --- .../maint-monitor/monitor-alert.md | 12 +- .../maint-monitor/monitor-alert.md | 12 +- .../maint-monitor/monitor-metrics/metrics.md | 513 +++++++++--------- .../doris/metric/JsonMetricVisitor.java | 64 +-- .../doris/metric/PrometheusMetricVisitor.java | 29 +- .../org/apache/doris/monitor/jvm/GcNames.java | 12 - .../apache/doris/monitor/jvm/JvmStats.java | 2 +- .../org/apache/doris/metric/MetricsTest.java | 44 ++ .../suites/metrics_p0/test_fe_metrics.groovy | 15 +- 9 files changed, 365 insertions(+), 338 deletions(-) diff --git a/docs/en/docs/admin-manual/maint-monitor/monitor-alert.md b/docs/en/docs/admin-manual/maint-monitor/monitor-alert.md index f1680b21e6b8a96..5148469d77c8d71 100644 --- a/docs/en/docs/admin-manual/maint-monitor/monitor-alert.md +++ b/docs/en/docs/admin-manual/maint-monitor/monitor-alert.md @@ -84,14 +84,10 @@ jvm_young_size_bytes{type="max"} 907345920 jvm_old_size_bytes{type="used"} 114633448 jvm_old_size_bytes{type="peak_used"} 114633448 jvm_old_size_bytes{type="max"} 7455834112 -# HELP jvm_young_gc jvm young gc stat -# TYPE jvm_young_gc gauge -jvm_young_gc{type="count"} 247 -jvm_young_gc{type="time"} 860 -# HELP jvm_old_gc jvm old gc stat -# TYPE jvm_old_gc gauge -jvm_old_gc{type="count"} 3 -jvm_old_gc{type="time"} 211 +# HELP jvm_gc jvm gc stat +# TYPE jvm_gc gauge +{type="count"} 247 +{type="time"} 860 # HELP jvm_thread jvm thread stat # TYPE jvm_thread gauge jvm_thread{type="count"} 162 diff --git a/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-alert.md b/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-alert.md index ac70112559d94b7..5c696f1cef088c5 100644 --- a/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-alert.md +++ b/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-alert.md @@ -84,14 +84,10 @@ jvm_young_size_bytes{type="max"} 907345920 jvm_old_size_bytes{type="used"} 114633448 jvm_old_size_bytes{type="peak_used"} 114633448 jvm_old_size_bytes{type="max"} 7455834112 -# HELP jvm_young_gc jvm young gc stat -# TYPE jvm_young_gc gauge -jvm_young_gc{type="count"} 247 -jvm_young_gc{type="time"} 860 -# HELP jvm_old_gc jvm old gc stat -# TYPE jvm_old_gc gauge -jvm_old_gc{type="count"} 3 -jvm_old_gc{type="time"} 211 +# HELP jvm_gc jvm gc stat +# TYPE jvm_gc gauge +{type="count"} 247 +{type="time"} 860 # HELP jvm_thread jvm thread stat # TYPE jvm_thread gauge jvm_thread{type="count"} 162 diff --git a/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-metrics/metrics.md b/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-metrics/metrics.md index 129bfdb069edcc8..cb8de2bf1e908ef 100644 --- a/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-metrics/metrics.md +++ b/docs/zh-CN/docs/admin-manual/maint-monitor/monitor-metrics/metrics.md @@ -69,275 +69,272 @@ curl http://be_host:webserver_port/metrics?type=json ### 进程监控 -|名称| 标签 |单位 | 含义 | 说明 | 等级 | -|---|---|---|---|---|---| -|`doris_fe_cache_added`|{type="partition"}| Num | 新增的 Partition Cache 数量累计值 | | -||{type="sql"}|Num| 新增的 SQL Cache 数量累计值 | | -|`doris_fe_cache_hit`|{type="partition"}| Num | 命中 Partition Cache 的计数 | | -||{type="sql"}| Num | 命中 SQL Cache 的计数 | | -|`doris_fe_connection_total`| | Num| 当前FE的MySQL端口连接数 | 用于监控查询连接数。如果连接数超限,则新的连接将无法接入 | P0 | -|`doris_fe_counter_hit_sql_block_rule`|| Num| 被 SQL BLOCK RULE 拦截的查询数量 | | | -|`doris_fe_edit_log_clean`| {type="failed"} | Num| 清理历史元数据日志失败的次数 | 不应失败,如失败,需人工介入 | P0| -|| {type="success"} | Num| 清理历史元数据日志成功的次数 | | -|`doris_fe_edit_log`| {type="accumulated_bytes"} |字节 | 元数据日志写入量的累计值 | 通过计算斜率可以获得写入速率,来观察是否元数据写入有延迟 | P0 | -|| {type="current_bytes"} |字节 | 元数据日志当前值 | 用于监控editlog 大小。如果大小超限,需人工介入 | P0 | -|| {type="read"} |Num| 元数据日志读取次数的计数 | 通过斜率观察元数据读取频率是否正常 |P0 | -|| {type="write"} |Num | 元数据日志写入次数的计数 |通过斜率观察元数据写入频率是否正常 |P0 | -|| {type="current"} |Num | 元数据日志当前数量 |用于监控editlog 数量。如果数量超限,需人工介入 |P0 | -|`doris_fe_editlog_write_latency_ms`| | 毫秒| 元数据日志写入延迟的百分位统计。如 {quantile="0.75"} 表示 75 分位的写入延迟 | | -|`doris_fe_image_clean`|{type="failed"} | Num | 清理历史元数据镜像文件失败的次数 | 不应失败,如失败,需人工介入 | P0| -||{type="success"} | Num | 清理历史元数据镜像文件成功的次数 | | -|`doris_fe_image_push`|{type="failed"} | Num | 将元数据镜像文件推送给其他FE节点的失败的次数 | | -||{type="success"} | Num | 将元数据镜像文件推送给其他FE节点的成功的次数 | | -|`doris_fe_image_write`|{type="failed"} | Num | 生成元数据镜像文件失败的次数 | 不应失败,如失败,需人工介入 | P0| -||{type="success"} | Num | 生成元数据镜像文件成功的次数 | | -|`doris_fe_job`| | Num | 当前不同作业类型以及不同作业状态的计数。如 {job="load", type="INSERT", state="LOADING"} 表示类型为 INSERT 的导入作业,处于 LOADING 状态的作业个数| 可以根据需要,观察不同类型的作业在集群中的数量 | P0 | -|`doris_fe_max_journal_id`| | Num | 当前FE节点最大元数据日志ID。如果是Master FE,则是当前写入的最大ID,如果是非Master FE,则代表当前回放的元数据日志最大ID | 用于观察多个FE之间的 id 是否差距过大。过大则表示元数据同步出现问题 | P0 | -|`doris_fe_max_tablet_compaction_score`| | Num| 所有BE节点中最大的 compaction score 值。 | 该值可以观测当前集群最大的 compaction score,以判断是否过高。如过高则可能出现查询或写入延迟 | P0 | -|`doris_fe_qps`| | Num/Sec | 当前FE每秒查询数量(仅统计查询请求)| QPS | P0 | -|`doris_fe_query_err`| | Num | 错误查询的累积值 | | -|`doris_fe_query_err_rate`| | Num/Sec| 每秒错误查询数 | 观察集群是否出现查询错误 | P0 | -|`doris_fe_query_latency_ms`| | 毫秒| 查询请求延迟的百分位统计。如 {quantile="0.75"} 表示 75 分位的查询延迟 | 详细观察各分位查询延迟 | P0 | -|`doris_fe_query_latency_ms_db`| | 毫秒| 各个DB的查询请求延迟的百分位统计。如 {quantile="0.75",db="test"} 表示DB test 75 分位的查询延迟 | 详细观察各DB各分位查询延迟 | P0 | -|`doris_fe_query_olap_table`| | Num| 查询内部表(OlapTable)的请求个数统计 | | -|`doris_fe_query_total`| | Num | 所有查询请求的累积计数 | | -|`doris_fe_report_queue_size`| | Num | BE的各种定期汇报任务在FE端的队列长度 | 该值反映了汇报任务在 Master FE 节点上的阻塞程度,数值越大,表示FE处理能力不足 | P0| -|`doris_fe_request_total`| | Num | 所有通过 MySQL 端口接收的操作请求(包括查询和其他语句)| | -|`doris_fe_routine_load_error_rows`| | Num | 统计集群内所有 Routine Load 作业的错误行数总和 | | -|`doris_fe_routine_load_receive_bytes`| | 字节 | 统计集群内所有 Routine Load 作业接收的数据量大小 | | -|`doris_fe_routine_load_rows`| | Num | 统计集群内所有 Routine Load 作业接收的数据行数 | | -|`doris_fe_rps`| | Num | 当前FE每秒请求数量(包含查询以及其他各类语句) | 和 QPS 配合来查看集群处理请求的量 | P0 | -|`doris_fe_scheduled_tablet_num`| | Num | Master FE节点正在调度的 tablet 数量。包括正在修复的副本和正在均衡的副本 | 该数值可以反映当前集群,正在迁移的 tablet 数量。如果长时间有值,说明集群不稳定 | P0 | -|`doris_fe_tablet_max_compaction_score`| | Num | 各个BE节点汇报的 compaction core。如 {backend="172.21.0.1:9556"} 表示 "172.21.0.1:9556" 这个BE的汇报值| | -|`doris_fe_tablet_num`| | Num | 各个BE节点当前tablet总数。如 {backend="172.21.0.1:9556"} 表示 "172.21.0.1:9556" 这个BE的当前tablet数量 | 可以查看 tablet 分布是否均匀以及绝对值是否合理 | P0| -|`doris_fe_tablet_status_count`| |Num| 统计 Master FE 节点 Tablet调度器所调度的 tablet 数量的累计值。| | -| | {type="added"} |Num| 统计 Master FE 节点 Tablet调度器所调度的 tablet 数量的累计值。 "added" 表示被调度过的 tablet 数量 | | -|| {type="in_sched"} |Num| 同上。表示被重复调度的 tablet 数量 |该值如果增长较快,则说明有tablet长时间处于不健康状态,导致被调度器反复调度 | -|| {type="not_ready"} | Num |同上。表示尚未满足调度触发条件的tablet数量。| 该值如果增长较快,说明有大量 tablet 处于不健康状态但又无法被调度 | -|| {type="total"} |Num |同上。表示累积的被检查过(但不一定被调度)的tablet数量。| | -|| {type="unhealthy"}| Num| 同上。表示累积的被检查过的不健康的 tablet 数量。| | -|`doris_fe_thread_pool`| | Num | 统计各类线程池的工作线程数和排队情况。`"active_thread_num"` 表示正在执行的任务数。`"pool_size"` 表示线程池总线程数量。`"task_in_queue"` 表示正在排队的任务数| | -|| {name="agent-task-pool"} | Num | Master FE 用于发送 Agent Task 到 BE的线程池 | | -|| {name="connect-scheduler-check-timer"} | Num | 用于检查MySQL空闲连接是否超时的线程池 | | -|| {name="connect-scheduler-pool"} | Num | 用于接收MySQL连接请求的线程池 | | -|| {name="mysql-nio-pool"} | Num | NIO MySQL Server 用于处理任务的线程池 | | -|| {name="export-exporting-job-pool"} | Num | exporting状态的export作业的调度线程池 | | -|| {name="export-pending-job-pool"} | Num | pending状态的export作业的调度线程池| | -|| {name="heartbeat-mgr-pool"} | Num | Master FE 用于处理各个节点心跳的线程池| | -|| {name="loading-load-task-scheduler"} | Num | Master FE 用于调度Broker Load作业中,loading task的调度线程池| | -|| {name="pending-load-task-scheduler"} | Num | Master FE 用于调度Broker Load作业中,pending task的调度线程池| | -|| {name="schema-change-pool"} | Num | Master FE 用于调度 schema change 作业的线程池 | | -|| {name="thrift-server-pool"} | Num | FE 端ThriftServer的工作线程池。对应 fe.conf 中 `rpc_port`。用于和BE进行交互。 || -|`doris_fe_txn_counter`| | Num | 统计各个状态的导入事务的数量的累计值| 可以观测导入事务的执行情况。 | P0 | -|| {type="begin"}| Num| 提交的事务数量 | | -||{type="failed"} | Num| 失败的事务数量| | -|| {type="reject"} | Num| 被拒绝的事务数量。(如当前运行事务数大于阈值,则新的事务会被拒绝)| | -|| {type="succes"} | Num| 成功的事务数量| | -|`doris_fe_txn_status`| | Num | 统计当前处于各个状态的导入事务的数量。如 {type="committed"} 表示处于 committed 状态的事务的数量 | 可以观测各个状态下导入事务的数量,来判断是否有堆积 | P0 | -|`doris_fe_query_instance_num`|| Num| 指定用户当前正在请求的fragment instance数目。如 {user="test_u"} 表示用户 test_u 当前正在请求的 instance 数目 |该数值可以用于观测指定用户是否占用过多查询资源| P0 | -|`doris_fe_query_instance_begin`|| Num| 指定用户请求开始的fragment instance数目。如 {user="test_u"} 表示用户 test_u 开始请求的 instance 数目 |该数值可以用于观测指定用户是否提交了过多查询| P0 | -|`doris_fe_query_rpc_total`|| Num| 发往指定BE的RPC次数。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC次数 |该数值可以观测是否向某个BE提交了过多RPC| | -|`doris_fe_query_rpc_failed`|| Num| 发往指定BE的RPC失败次数。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC失败次数 |该数值可以观测某个BE是否存在RPC问题| | -|`doris_fe_query_rpc_size`|| Num| 指定BE的RPC数据大小。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC数据字节数 |该数值可以观测是否向某个BE提交了过大的RPC| | -|`doris_fe_txn_exec_latency_ms`| | 毫秒| 事务执行耗时的百分位统计。如 {quantile="0.75"} 表示 75 分位的事务执行耗时 | 详细观察各分位事务执行耗时 | P0 | -|`doris_fe_txn_publish_latency_ms`| | 毫秒| 事务publish耗时的百分位统计。如 {quantile="0.75"} 表示 75 分位的事务publish耗时 | 详细观察各分位事务publish耗时 | P0 | -|`doris_fe_txn_num`|| Num| 指定DB正在执行的事务数。如 {db="test"} 表示DB test 当前正在执行的事务数 |该数值可以观测某个DB是否提交了大量事务| P0 | -|`doris_fe_publish_txn_num`|| Num| 指定DB正在publish的事务数。如 {db="test"} 表示DB test 当前正在publish的事务数 |该数值可以观测某个DB的publish事务数量| P0 | -|`doris_fe_txn_replica_num`|| Num| 指定DB正在执行的事务打开的副本数。如 {db="test"} 表示DB test 当前正在执行的事务打开的副本数 |该数值可以观测某个DB是否打开了过多的副本,可能会影响其他事务执行| P0 | -|`doris_fe_thrift_rpc_total`|| Num| FE thrift接口各个方法接收的RPC请求次数。如 {method="report"} 表示 report 方法接收的RPC请求次数 |该数值可以观测某个thrift rpc方法的负载| | -|`doris_fe_thrift_rpc_latency_ms`|| 毫秒| FE thrift接口各个方法接收的RPC请求耗时。如 {method="report"} 表示 report 方法接收的RPC请求耗时 |该数值可以观测某个thrift rpc方法的负载| | -|`doris_fe_external_schema_cache` | {catalog="hive"} | Num | 指定 External Catalog 对应的 schema cache 的数量 ||| -|`doris_fe_hive_meta_cache` | {catalog="hive"} | Num | ||| -| | `{type="partition_value"}` | Num | 指定 External Hive Metastore Catalog 对应的 partition value cache 的数量 ||| -| | `{type="partition"}` | Num | 指定 External Hive Metastore Catalog 对应的 partition cache 的数量 ||| -| | `{type="file"}` | Num | 指定 External Hive Metastore Catalog 对应的 file cache 的数量 ||| +| 名称 | 标签 | 单位 | 含义 | 说明 | 等级 | +|----------------------------------------|----------------------------------------|---------|-----------------------------------------------------------------------------------------------------------|--------------------------------------------------------|----| +| `doris_fe_cache_added` | {type="partition"} | Num | 新增的 Partition Cache 数量累计值 | | +| | {type="sql"} | Num | 新增的 SQL Cache 数量累计值 | | +| `doris_fe_cache_hit` | {type="partition"} | Num | 命中 Partition Cache 的计数 | | +| | {type="sql"} | Num | 命中 SQL Cache 的计数 | | +| `doris_fe_connection_total` | | Num | 当前FE的MySQL端口连接数 | 用于监控查询连接数。如果连接数超限,则新的连接将无法接入 | P0 | +| `doris_fe_counter_hit_sql_block_rule` | | Num | 被 SQL BLOCK RULE 拦截的查询数量 | | | +| `doris_fe_edit_log_clean` | {type="failed"} | Num | 清理历史元数据日志失败的次数 | 不应失败,如失败,需人工介入 | P0 | +| | {type="success"} | Num | 清理历史元数据日志成功的次数 | | +| `doris_fe_edit_log` | {type="accumulated_bytes"} | 字节 | 元数据日志写入量的累计值 | 通过计算斜率可以获得写入速率,来观察是否元数据写入有延迟 | P0 | +| | {type="current_bytes"} | 字节 | 元数据日志当前值 | 用于监控editlog 大小。如果大小超限,需人工介入 | P0 | +| | {type="read"} | Num | 元数据日志读取次数的计数 | 通过斜率观察元数据读取频率是否正常 | P0 | +| | {type="write"} | Num | 元数据日志写入次数的计数 | 通过斜率观察元数据写入频率是否正常 | P0 | +| | {type="current"} | Num | 元数据日志当前数量 | 用于监控editlog 数量。如果数量超限,需人工介入 | P0 | +| `doris_fe_editlog_write_latency_ms` | | 毫秒 | 元数据日志写入延迟的百分位统计。如 {quantile="0.75"} 表示 75 分位的写入延迟 | | +| `doris_fe_image_clean` | {type="failed"} | Num | 清理历史元数据镜像文件失败的次数 | 不应失败,如失败,需人工介入 | P0 | +| | {type="success"} | Num | 清理历史元数据镜像文件成功的次数 | | +| `doris_fe_image_push` | {type="failed"} | Num | 将元数据镜像文件推送给其他FE节点的失败的次数 | | +| | {type="success"} | Num | 将元数据镜像文件推送给其他FE节点的成功的次数 | | +| `doris_fe_image_write` | {type="failed"} | Num | 生成元数据镜像文件失败的次数 | 不应失败,如失败,需人工介入 | P0 | +| | {type="success"} | Num | 生成元数据镜像文件成功的次数 | | +| `doris_fe_job` | | Num | 当前不同作业类型以及不同作业状态的计数。如 {job="load", type="INSERT", state="LOADING"} 表示类型为 INSERT 的导入作业,处于 LOADING 状态的作业个数 | 可以根据需要,观察不同类型的作业在集群中的数量 | P0 | +| `doris_fe_max_journal_id` | | Num | 当前FE节点最大元数据日志ID。如果是Master FE,则是当前写入的最大ID,如果是非Master FE,则代表当前回放的元数据日志最大ID | 用于观察多个FE之间的 id 是否差距过大。过大则表示元数据同步出现问题 | P0 | +| `doris_fe_max_tablet_compaction_score` | | Num | 所有BE节点中最大的 compaction score 值。 | 该值可以观测当前集群最大的 compaction score,以判断是否过高。如过高则可能出现查询或写入延迟 | P0 | +| `doris_fe_qps` | | Num/Sec | 当前FE每秒查询数量(仅统计查询请求) | QPS | P0 | +| `doris_fe_query_err` | | Num | 错误查询的累积值 | | +| `doris_fe_query_err_rate` | | Num/Sec | 每秒错误查询数 | 观察集群是否出现查询错误 | P0 | +| `doris_fe_query_latency_ms` | | 毫秒 | 查询请求延迟的百分位统计。如 {quantile="0.75"} 表示 75 分位的查询延迟 | 详细观察各分位查询延迟 | P0 | +| `doris_fe_query_latency_ms_db` | | 毫秒 | 各个DB的查询请求延迟的百分位统计。如 {quantile="0.75",db="test"} 表示DB test 75 分位的查询延迟 | 详细观察各DB各分位查询延迟 | P0 | +| `doris_fe_query_olap_table` | | Num | 查询内部表(OlapTable)的请求个数统计 | | +| `doris_fe_query_total` | | Num | 所有查询请求的累积计数 | | +| `doris_fe_report_queue_size` | | Num | BE的各种定期汇报任务在FE端的队列长度 | 该值反映了汇报任务在 Master FE 节点上的阻塞程度,数值越大,表示FE处理能力不足 | P0 | +| `doris_fe_request_total` | | Num | 所有通过 MySQL 端口接收的操作请求(包括查询和其他语句) | | +| `doris_fe_routine_load_error_rows` | | Num | 统计集群内所有 Routine Load 作业的错误行数总和 | | +| `doris_fe_routine_load_receive_bytes` | | 字节 | 统计集群内所有 Routine Load 作业接收的数据量大小 | | +| `doris_fe_routine_load_rows` | | Num | 统计集群内所有 Routine Load 作业接收的数据行数 | | +| `doris_fe_rps` | | Num | 当前FE每秒请求数量(包含查询以及其他各类语句) | 和 QPS 配合来查看集群处理请求的量 | P0 | +| `doris_fe_scheduled_tablet_num` | | Num | Master FE节点正在调度的 tablet 数量。包括正在修复的副本和正在均衡的副本 | 该数值可以反映当前集群,正在迁移的 tablet 数量。如果长时间有值,说明集群不稳定 | P0 | +| `doris_fe_tablet_max_compaction_score` | | Num | 各个BE节点汇报的 compaction core。如 {backend="172.21.0.1:9556"} 表示 "172.21.0.1:9556" 这个BE的汇报值 | | +| `doris_fe_tablet_num` | | Num | 各个BE节点当前tablet总数。如 {backend="172.21.0.1:9556"} 表示 "172.21.0.1:9556" 这个BE的当前tablet数量 | 可以查看 tablet 分布是否均匀以及绝对值是否合理 | P0 | +| `doris_fe_tablet_status_count` | | Num | 统计 Master FE 节点 Tablet调度器所调度的 tablet 数量的累计值。 | | +| | {type="added"} | Num | 统计 Master FE 节点 Tablet调度器所调度的 tablet 数量的累计值。 "added" 表示被调度过的 tablet 数量 | | +| | {type="in_sched"} | Num | 同上。表示被重复调度的 tablet 数量 | 该值如果增长较快,则说明有tablet长时间处于不健康状态,导致被调度器反复调度 | +| | {type="not_ready"} | Num | 同上。表示尚未满足调度触发条件的tablet数量。 | 该值如果增长较快,说明有大量 tablet 处于不健康状态但又无法被调度 | +| | {type="total"} | Num | 同上。表示累积的被检查过(但不一定被调度)的tablet数量。 | | +| | {type="unhealthy"} | Num | 同上。表示累积的被检查过的不健康的 tablet 数量。 | | +| `doris_fe_thread_pool` | | Num | 统计各类线程池的工作线程数和排队情况。`"active_thread_num"` 表示正在执行的任务数。`"pool_size"` 表示线程池总线程数量。`"task_in_queue"` 表示正在排队的任务数 | | +| | {name="agent-task-pool"} | Num | Master FE 用于发送 Agent Task 到 BE的线程池 | | +| | {name="connect-scheduler-check-timer"} | Num | 用于检查MySQL空闲连接是否超时的线程池 | | +| | {name="connect-scheduler-pool"} | Num | 用于接收MySQL连接请求的线程池 | | +| | {name="mysql-nio-pool"} | Num | NIO MySQL Server 用于处理任务的线程池 | | +| | {name="export-exporting-job-pool"} | Num | exporting状态的export作业的调度线程池 | | +| | {name="export-pending-job-pool"} | Num | pending状态的export作业的调度线程池 | | +| | {name="heartbeat-mgr-pool"} | Num | Master FE 用于处理各个节点心跳的线程池 | | +| | {name="loading-load-task-scheduler"} | Num | Master FE 用于调度Broker Load作业中,loading task的调度线程池 | | +| | {name="pending-load-task-scheduler"} | Num | Master FE 用于调度Broker Load作业中,pending task的调度线程池 | | +| | {name="schema-change-pool"} | Num | Master FE 用于调度 schema change 作业的线程池 | | +| | {name="thrift-server-pool"} | Num | FE 端ThriftServer的工作线程池。对应 fe.conf 中 `rpc_port`。用于和BE进行交互。 | | +| `doris_fe_txn_counter` | | Num | 统计各个状态的导入事务的数量的累计值 | 可以观测导入事务的执行情况。 | P0 | +| | {type="begin"} | Num | 提交的事务数量 | | +| | {type="failed"} | Num | 失败的事务数量 | | +| | {type="reject"} | Num | 被拒绝的事务数量。(如当前运行事务数大于阈值,则新的事务会被拒绝) | | +| | {type="succes"} | Num | 成功的事务数量 | | +| `doris_fe_txn_status` | | Num | 统计当前处于各个状态的导入事务的数量。如 {type="committed"} 表示处于 committed 状态的事务的数量 | 可以观测各个状态下导入事务的数量,来判断是否有堆积 | P0 | +| `doris_fe_query_instance_num` | | Num | 指定用户当前正在请求的fragment instance数目。如 {user="test_u"} 表示用户 test_u 当前正在请求的 instance 数目 | 该数值可以用于观测指定用户是否占用过多查询资源 | P0 | +| `doris_fe_query_instance_begin` | | Num | 指定用户请求开始的fragment instance数目。如 {user="test_u"} 表示用户 test_u 开始请求的 instance 数目 | 该数值可以用于观测指定用户是否提交了过多查询 | P0 | +| `doris_fe_query_rpc_total` | | Num | 发往指定BE的RPC次数。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC次数 | 该数值可以观测是否向某个BE提交了过多RPC | | +| `doris_fe_query_rpc_failed` | | Num | 发往指定BE的RPC失败次数。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC失败次数 | 该数值可以观测某个BE是否存在RPC问题 | | +| `doris_fe_query_rpc_size` | | Num | 指定BE的RPC数据大小。如 {be="192.168.10.1"} 表示发往ip为 192.168.10.1 的BE的RPC数据字节数 | 该数值可以观测是否向某个BE提交了过大的RPC | | +| `doris_fe_txn_exec_latency_ms` | | 毫秒 | 事务执行耗时的百分位统计。如 {quantile="0.75"} 表示 75 分位的事务执行耗时 | 详细观察各分位事务执行耗时 | P0 | +| `doris_fe_txn_publish_latency_ms` | | 毫秒 | 事务publish耗时的百分位统计。如 {quantile="0.75"} 表示 75 分位的事务publish耗时 | 详细观察各分位事务publish耗时 | P0 | +| `doris_fe_txn_num` | | Num | 指定DB正在执行的事务数。如 {db="test"} 表示DB test 当前正在执行的事务数 | 该数值可以观测某个DB是否提交了大量事务 | P0 | +| `doris_fe_publish_txn_num` | | Num | 指定DB正在publish的事务数。如 {db="test"} 表示DB test 当前正在publish的事务数 | 该数值可以观测某个DB的publish事务数量 | P0 | +| `doris_fe_txn_replica_num` | | Num | 指定DB正在执行的事务打开的副本数。如 {db="test"} 表示DB test 当前正在执行的事务打开的副本数 | 该数值可以观测某个DB是否打开了过多的副本,可能会影响其他事务执行 | P0 | +| `doris_fe_thrift_rpc_total` | | Num | FE thrift接口各个方法接收的RPC请求次数。如 {method="report"} 表示 report 方法接收的RPC请求次数 | 该数值可以观测某个thrift rpc方法的负载 | | +| `doris_fe_thrift_rpc_latency_ms` | | 毫秒 | FE thrift接口各个方法接收的RPC请求耗时。如 {method="report"} 表示 report 方法接收的RPC请求耗时 | 该数值可以观测某个thrift rpc方法的负载 | | +| `doris_fe_external_schema_cache` | {catalog="hive"} | Num | 指定 External Catalog 对应的 schema cache 的数量 | | | +| `doris_fe_hive_meta_cache` | {catalog="hive"} | Num | | | | +| | `{type="partition_value"}` | Num | 指定 External Hive Metastore Catalog 对应的 partition value cache 的数量 | | | +| | `{type="partition"}` | Num | 指定 External Hive Metastore Catalog 对应的 partition cache 的数量 | | | +| | `{type="file"}` | Num | 指定 External Hive Metastore Catalog 对应的 file cache 的数量 | | | ### JVM 监控 -|名称| 标签 |单位 | 含义 | 说明 | 等级 | -|---|---|---|---|---|---| -|`jvm_heap_size_bytes`| | 字节 | JVM 内存监控。标签包含 max, used, committed,分别对应最大值,已使用和已申请的内存 | 观测JVM内存使用情况 | P0 | -|`jvm_non_heap_size_bytes`| | 字节 | JVM 堆外内存统计| | -|`jvm_old_gc`| | | 老年代 GC 监控。| 观测是否出现长时间的 FullGC | P0 | -| |{type="count"} | Num | 老年代 GC 次数累计值| | -| |{type="time"} | 毫秒 | 老年代 GC 耗时累计值| | -|`jvm_old_size_bytes`| | 字节| JVM 老年代内存统计 | | P0 | -|`jvm_thread`| | Num| JVM 线程数统计 | 观测 JVM 线程数是否合理| P0| -|`jvm_young_gc`| | |新生代 GC 监控 | | -| |{type="count"} | Num | 新生代 GC 次数累计值| | -| |{type="time"} | 毫秒 | 新生代 GC 耗时累计值| | -|`jvm_young_size_bytes`| | 字节|JVM 新生代内存统计 | | P0 | +| 名称 | 标签 | 单位 | 含义 | 说明 | 等级 | +|---------------------------|----------------|-----|-------------------------------------------------------|----------------------------|----| +| `jvm_heap_size_bytes` | | 字节 | JVM 内存监控。标签包含 max, used, committed,分别对应最大值,已使用和已申请的内存 | 观测JVM内存使用情况 | P0 | +| `jvm_non_heap_size_bytes` | | 字节 | JVM 堆外内存统计 | | +| `` | | | GC 监控。 | GarbageCollector指代具体的垃圾收集器 | P0 | +| | {type="count"} | Num | GC 次数累计值 | | +| | {type="time"} | 毫秒 | GC 耗时累计值 | | +| `jvm_old_size_bytes` | | 字节 | JVM 老年代内存统计 | | P0 | +| `jvm_thread` | | Num | JVM 线程数统计 | 观测 JVM 线程数是否合理 | P0 | +| `jvm_young_size_bytes` | | 字节 | JVM 新生代内存统计 | | P0 | ### 机器监控 -|名称| 标签 |单位 | 含义 | 说明 | 等级 | -|---|---|---|---|---|---| -|`system_meminfo`| | 字节| FE节点机器的内存监控。采集自 `/proc/meminfo`。包括 `buffers`,`cached`, `memory_available`, `memory_free`, `memory_total` | | -|`system_snmp`| | FE节点机器的网络监控。采集自 `/proc/net/snmp`。 | | | -||`{name="tcp_in_errs"}` | Num| tcp包接收错误的次数| | -||`{name="tcp_in_segs"}` | Num | tcp包发送的个数 | | -|| `{name="tcp_out_segs"}`| Num | tcp包发送的个数 | | -||`{name="tcp_retrans_segs"}` | Num | tcp包重传的个数 | | +| 名称 | 标签 | 单位 | 含义 | 说明 | 等级 | +|------------------|-----------------------------|-----------------------------------|----------------------------------------------------------------------------------------------------------|----|----| +| `system_meminfo` | | 字节 | FE节点机器的内存监控。采集自 `/proc/meminfo`。包括 `buffers`,`cached`, `memory_available`, `memory_free`, `memory_total` | | +| `system_snmp` | | FE节点机器的网络监控。采集自 `/proc/net/snmp`。 | | | +| | `{name="tcp_in_errs"}` | Num | tcp包接收错误的次数 | | +| | `{name="tcp_in_segs"}` | Num | tcp包发送的个数 | | +| | `{name="tcp_out_segs"}` | Num | tcp包发送的个数 | | +| | `{name="tcp_retrans_segs"}` | Num | tcp包重传的个数 | | ## BE 监控指标 ### 进程监控 -|名称| 标签 |单位 | 含义 | 说明 | 等级 | -|---|---|---|---|---|---| -|`doris_be_active_scan_context_count`| | Num | 展示当前由外部直接打开的scanner的个数 | | -|`doris_be_add_batch_task_queue_size`| | Num | 记录导入时,接收batch的线程池的队列大小 |如果大于0,则表示导入任务的接收端出现积压 | P0| -|`agent_task_queue_size`| | Num | 展示各个 Agent Task 处理队列的长度,如 `{type="CREATE_TABLE"}` 表示 CREATE_TABLE 任务队列的长度 | | -|`doris_be_brpc_endpoint_stub_count`| | Num | 已创建的 brpc stub 的数量,这些 stub 用于 BE 之间的交互 | | -|`doris_be_brpc_function_endpoint_stub_count`| | Num | 已创建的 brpc stub 的数量,这些 stub 用于和 Remote RPC 之间交互 | | -|`doris_be_cache_capacity`| | | 记录指定 LRU Cache 的容量 | | -|`doris_be_cache_usage`| | | 记录指定 LRU Cache 的使用量 | 用于观测内存占用情况 | P0| -|`doris_be_cache_usage_ratio`| | | 记录指定 LRU Cache 的使用率 | | -|`doris_be_cache_lookup_count`| | | 记录指定 LRU Cache 被查找的次数 | | -|`doris_be_cache_hit_count`| | | 记录指定 LRU Cache 的命中次数 | | -|`doris_be_cache_hit_ratio`| | | 记录指定 LRU Cache 的命中率 | 用于观测cache是否有效 | P0| -|| {name="DataPageCache"} | Num | DataPageCache 用于缓存数据的 Data Page | 数据Cache,直接影响查询效率 | P0| -|| {name="IndexPageCache"} | Num| IndexPageCache 用于缓存数据的 Index Page | 索引Cache,直接影响查询效率 | P0| -|| {name="LastestSuccessChannelCache"} | Num| LastestSuccessChannelCache 用于缓存导入接收端的 LoadChannel | | -|| {name="SegmentCache"} | Num | SegmentCache 用于缓存已打开的 Segment,如索引信息 | | -|`doris_be_chunk_pool_local_core_alloc_count`| | Num | ChunkAllocator中,从绑定的 core 的内存队列中分配内存的次数 | | -|`doris_be_chunk_pool_other_core_alloc_count`| | Num | ChunkAllocator中,从其他的 core 的内存队列中分配内存的次数 | | -|`doris_be_chunk_pool_reserved_bytes`| | 字节 | ChunkAllocator 中预留的内存大小 | | -|`doris_be_chunk_pool_system_alloc_cost_ns`| | 纳秒 | SystemAllocator 申请内存的耗时累计值 | 通过斜率可以观测内存分配的耗时| P0| -|`doris_be_chunk_pool_system_alloc_count`| | Num | SystemAllocator 申请内存的次数 | | -|`doris_be_chunk_pool_system_free_cost_ns`| | 纳秒 |SystemAllocator 释放内存的耗时累计值 | 通过斜率可以观测内存释放的耗时| P0| -|`doris_be_chunk_pool_system_free_count`| | Num | SystemAllocator 释放内存的次数 | | -|`doris_be_compaction_bytes_total`| |字节| compaction处理的数据量的累计值 | 记录的是 compaction 任务中,input rowset 的 disk size。通过斜率可以观测 compaction的速率 | P0| -| |{type="base"} |字节 | Base Compaction 的数据量累计 | | -| |{type="cumulative"} |字节 | Cumulative Compaction 的数据量累计 | | -|`doris_be_compaction_deltas_total`| |Num| compaction处理的 rowset 个数的累计值 | 记录的是 compaction 任务中,input rowset 的 个数 | -| |{type="base"} |Num | Base Compaction 处理的 rowset 个数累计 | | -| |{type="cumulative"} |Num | Cumulative Compaction 处理的 rowset 个数累计 | | -|`doris_be_disks_compaction_num`| | Num| 指定数据目录上正在执行的 compaction 任务数。如 `{path="/path1/"}` 表示`/path1` 目录上正在执行的任务数 | 用于观测各个磁盘上的 compaction 任务数是否合理 | P0 | -|`doris_be_disks_compaction_score`| | Num| 指定数据目录上正在执行的 compaction 令牌数。如 `{path="/path1/"}` 表示`/path1` 目录上正在执行的令牌数 | | -|`doris_be_compaction_used_permits`| | Num | Compaction 任务已使用的令牌数量 | 用于反映Compaction的资源消耗量 | -|`doris_be_compaction_waitting_permits`| | Num | 正在等待Compaction令牌的数量 | | -|`doris_be_data_stream_receiver_count`| | Num | 数据接收端 Receiver 的数量 | FIXME:向量化引擎此指标缺失 | -|`doris_be_disks_avail_capacity`| | 字节 | 指定数据目录所在磁盘的剩余空间。如 `{path="/path1/"}` 表示 `/path1` 目录所在磁盘的剩余空间 | | P0 | -|`doris_be_disks_local_used_capacity`| |字节|指定数据目录所在磁盘的本地已使用空间 | | -|`doris_be_disks_remote_used_capacity`| | 字节| 指定数据目录所在磁盘的对应的远端目录的已使用空间| | -|`doris_be_disks_state`| | 布尔 | 指定数据目录的磁盘状态。1 表示正常。0 表示异常 | | -|`doris_be_disks_total_capacity`| | 字节 | 定数据目录所在磁盘的总容量| 配合 `doris_be_disks_avail_capacity` 计算磁盘使用率 | P0 | -|`doris_be_engine_requests_total`| | Num | BE 上各类任务执行状态的累计值| | -|| {status="failed",type="xxx"} | Num | xxx 类型的任务的失败次数的累计值| | -|| {status="total",type="xxx"} | Num | xxx 类型的任务的总次数的累计值。| 可以按需监控各类任务的失败次数 | P0 | -|| `{status="skip",type="report_all_tablets"}` | Num | xxx 类型任务被跳过执行的次数的累计值 | | -|`doris_be_fragment_endpoint_count`| | Num| 同 | FIXME: 同 `doris_be_data_stream_receiver_count` 数目。并且向量化引擎缺失 | -|`doris_be_fragment_request_duration_us`| | 微秒| 所有 fragment intance 的执行时间累计 | 通过斜率观测 instance 的执行耗时 | P0 | -|`doris_be_fragment_requests_total`| | Num | 执行过的 fragment instance 的数量累计 | | -|`doris_be_load_channel_count`| | Num | 当前打开的 load channel 个数 | 数值越大,说明当前正在执行的导入任务越多 | P0 | -|`doris_be_local_bytes_read_total`| | 字节 | 由 `LocalFileReader` 读取的字节数 | | P0 | -|`doris_be_local_bytes_written_total`| | 字节 | 由 `LocalFileWriter` 写入的字节数 | | P0 | -|`doris_be_local_file_reader_total`| | Num| 打开的 `LocalFileReader` 的累计计数 | | -|`doris_be_local_file_open_reading`| | Num | 当前打开的 `LocalFileReader` 个数 | | -|`doris_be_local_file_writer_total`| | Num | 打开的 `LocalFileWriter` 的累计计数。| | -|`doris_be_mem_consumption`| | 字节 | 指定模块的当前内存开销。如 {type="compaction"} 表示 compaction 模块的当前总内存开销。 | 值取自相同 type 的 MemTracker。FIXME | -|`doris_be_memory_allocated_bytes`| | 字节 | BE 进程物理内存大小,取自 `/proc/self/status/VmRSS` | | P0 | -|`doris_be_memory_jemalloc`| | 字节 | Jemalloc stats, 取自 `je_mallctl`。 | 含义参考:https://jemalloc.net/jemalloc.3.html | P0 | -|`doris_be_memory_pool_bytes_total`| | 字节| 所有 MemPool 当前占用的内存大小。统计值,不代表真实内存使用。| | -|`doris_be_memtable_flush_duration_us`| | 微秒 | memtable写入磁盘的耗时累计值 | 通过斜率可以观测写入延迟 | P0 | -|`doris_be_memtable_flush_total`| | Num | memtable写入磁盘的个数累计值| 通过斜率可以计算写入文件的频率 | P0 | -|`doris_be_meta_request_duration`| | 微秒| 访问 RocksDB 中的 meta 的耗时累计 | 通过斜率观测 BE 元数据读写延迟 | P0 | -||{type="read"} | 微秒| 读取耗时 | | -||{type="write"} | 微秒| 写入耗时 | | -|`doris_be_meta_request_total`| |Num | 访问 RocksDB 中的 meta 的次数累计 | 通过斜率观测 BE 元数据访问频率 | P0 | -||{type="read"} | Num| 读取次数 | | -||{type="write"} | Num| 写入次数 | | -|`doris_be_fragment_instance_count`| | Num | 当前已接收的 fragment instance 的数量 | 观测是否出现 instance 堆积 | P0 | -|`doris_be_process_fd_num_limit_hard`| |Num| BE 进程的文件句柄数硬限。通过 `/proc/pid/limits` 采集 | | -|`doris_be_process_fd_num_limit_soft`| |Num| BE 进程的文件句柄数软限。通过 `/proc/pid/limits` 采集 | | -|`doris_be_process_fd_num_used`| |Num| BE 进程已使用的文件句柄数。通过 `/proc/pid/limits` 采集 | | -|`doris_be_process_thread_num`| | Num | BE 进程线程数。通过 `/proc/pid/task` 采集 | | P0 | -|`doris_be_query_cache_memory_total_byte`| | 字节 | Query Cache 占用字节数 | | -|`doris_be_query_cache_partition_total_count`| | Num | 当前 Partition Cache 缓存个数 | | -|`doris_be_query_cache_sql_total_count`| | Num | 当前 SQL Cache 缓存个数 | | -|`doris_be_query_scan_bytes`| | 字节 | 读取数据量的累计值。这里只统计读取 Olap 表的数据量 | | -|`doris_be_query_scan_bytes_per_second`| | 字节/秒 | 根据 `doris_be_query_scan_bytes` 计算得出的读取速率 | 观测查询速率 | P0| -|`doris_be_query_scan_rows`| | Num | 读取行数的累计值。这里只统计读取 Olap 表的数据量。并且是 RawRowsRead(部分数据行可能被索引跳过,并没有真正读取,但仍会记录到这个值中) | 通过斜率观测查询速率 | P0 | -|`doris_be_result_block_queue_count`| | Num | 当前查询结果缓存中的 fragment instance 个数 | 该队列仅用于被外部系统直接读取时使用。如 Spark on Doris 通过 external scan 查询数据 | -|`doris_be_result_buffer_block_count`| | Num | 当前查询结果缓存中的 query 个数 | 该数值反映当前 BE 中有多少查询的结果正在等待 FE 消费| P0| -|`doris_be_routine_load_task_count`| | Num | 当前正在执行的 routine load task 个数| | -|`doris_be_rowset_count_generated_and_in_use`| | Num | 自上次启动后,新增的并且正在使用的 rowset id 个数。 | | -|`doris_be_s3_bytes_read_total`| | Num | `S3FileReader` 的打开累计次数 | | -|`doris_be_s3_file_open_reading`| | Num | 当前打开的 `S3FileReader` 个数 | | -|`doris_be_s3_bytes_read_total`| | 字节 | `S3FileReader` 读取字节数累计值 | | -|`doris_be_scanner_thread_pool_queue_size`| | Num | 用于 OlapScanner 的线程池的当前排队数量 | 大于零则表示 Scanner 开始堆积 | P0| -|`doris_be_segment_read`| `{type="segment_read_total"}` | Num | 读取的segment的个数累计值 | | -|`doris_be_segment_read`| `{type="segment_row_total"}` | Num | 读取的segment的行数累计值 | 该数值也包含了被索引过滤的行数。相当于读取的segment个数 * 每个segment的总行数 | -|`doris_be_send_batch_thread_pool_queue_size`| | Num | 导入时用于发送数据包的线程池的排队个数 | 大于0则表示有堆积 | P0 | -|`doris_be_send_batch_thread_pool_thread_num`| | Num| 导入时用于发送数据包的线程池的线程数 | | -|`doris_be_small_file_cache_count`| |Num| 当前BE缓存的小文件数量 | | -|`doris_be_streaming_load_current_processing`| | Num | 当前正在运行的 stream load 任务数| 仅包含 curl 命令发送的任务 | -|`doris_be_streaming_load_duration_ms`| | 毫秒 | 所有stream load 任务执行时间的耗时累计值 | | -|`doris_be_streaming_load_requests_total`| | Num | stream load 任务数的累计值 | 通过斜率可观测任务提交频率 | P0 | -|`doris_be_stream_load_pipe_count`| | Num | 当前 stream load 数据管道的个数| 包括 stream load 和 routine load 任务 | -|`doris_be_stream_load`| {type="load_rows"} | Num | stream load 最终导入的行数累计值| 包括 stream load 和 routine load 任务 | P0 | -|`doris_be_stream_load`| {type="receive_bytes"}|字节 | stream load 接收的字节数累计值| 包括 stream load 从 http 接收的数据,以及 routine load 从kafka 读取的数据| P0 | -|`doris_be_tablet_base_max_compaction_score`| | Num | 当前最大的 Base Compaction Score | 该数值实时变化,有可能丢失峰值数据。数值越高,表示 compaction 堆积越严重 | P0 | -|`doris_be_tablet_cumulative_max_compaction_score`| | Num | 同上。当前最大的 Cumulative Compaction Score | | -|`doris_be_tablet_version_num_distribution`| | Num | tablet version 数量的直方。| 用于反映 tablet version 数量的分布 | P0 | -|`doris_be_thrift_connections_total`| | Num | 创建过的 thrift 连接数的累计值。如 `{name="heartbeat"}` 表示心跳服务的连接数累计| 此数值为 BE 作为服务端的 thrift server 的连接 | -|`doris_be_thrift_current_connections`| | Num | 当前 thrift 连接数。如 `{name="heartbeat"}` 表示心跳服务的当前连接数。| 同上 | -|`doris_be_thrift_opened_clients`| |Num| 当前已打开的 thrift 客户端的数量。如 `{name="frontend"}` 表示访问 FE 服务的客户端数量 | | -|`doris_be_thrift_used_clients`| | Num | 当前正在使用的 thrift 客户端的数量。如 `{name="frontend"}` 表示正在用于访问 FE 服务的客户端数量 | | -|`doris_be_timeout_canceled_fragment_count`| | Num | 因超时而被取消的 fragment instance 数量累计值| 这个值可能会被重复记录。比如部分 fragment instance 被多次取消| P0 | -|`doris_be_stream_load_txn_request`| {type="begin"}| Num | stream load 开始事务数的累计值 | 包括 stream load 和 routine load 任务 | -|`doris_be_stream_load_txn_request `| {type="commit"}| Num| stream load 执行成功的事务数的累计值| 同上| -|`doris_be_stream_load_txn_request `| {type="rollback"}| | stream load 执行失败的事务数的累计值 |同上 | -|`doris_be_unused_rowsets_count`| | Num | 当前已废弃的rowset的个数| 这些rowset正常情况下会被定期删除 | -|`doris_be_upload_fail_count`| | Num | 冷热分层功能,上传到远端存储失败的rowset的次数累计值| | -|`doris_be_upload_rowset_count`| | Num | 冷热分层功能,上传到远端存储成功的rowset的次数累计值| | -|`doris_be_upload_total_byte`| | | 字节 | 冷热分层功能,上传到远端存储成功的rowset数据量累计值| | -|`doris_be_load_bytes`| | 字节|通过 tablet sink 发送的数量累计 | 可观测导入数据量 | P0 | -|`doris_be_load_rows`| | Num | 通过 tablet sink 发送的行数累计| 可观测导入数据量 | P0 | -|`fragment_thread_pool_queue_size`| | Num | 当前查询执行线程池等待队列的长度 | 如果大于零,则说明查询线程已耗尽,查询会出现堆积 | P0 | -|`doris_be_all_rowsets_num`| | Num | 当前所有 rowset 的个数 | | P0 | -|`doris_be_all_segments_num`| | Num | 当前所有 segment 的个数 | | P0 | -|`doris_be_heavy_work_max_threads`| | Num | brpc heavy线程池线程个数| | p0 | -|`doris_be_light_work_max_threads`| | Num | brpc light线程池线程个数| | p0 | -|`doris_be_heavy_work_pool_queue_size`| | Num | brpc heavy线程池队列最大长度,超过则阻塞提交work| | p0 | -|`doris_be_light_work_pool_queue_size`| | Num | brpc light线程池队列最大长度,超过则阻塞提交work| | p0 | -|`doris_be_heavy_work_active_threads`| | Num | brpc heavy线程池活跃线程数| | p0 | -|`doris_be_light_work_active_threads`| | Num | brpc light线程池活跃线程数| | p0 | +| 名称 | 标签 | 单位 | 含义 | 说明 | 等级 | +|---------------------------------------------------|---------------------------------------------|------|------------------------------------------------------------------------------|---------------------------------------------------------------------|----| +| `doris_be_active_scan_context_count` | | Num | 展示当前由外部直接打开的scanner的个数 | | +| `doris_be_add_batch_task_queue_size` | | Num | 记录导入时,接收batch的线程池的队列大小 | 如果大于0,则表示导入任务的接收端出现积压 | P0 | +| `agent_task_queue_size` | | Num | 展示各个 Agent Task 处理队列的长度,如 `{type="CREATE_TABLE"}` 表示 CREATE_TABLE 任务队列的长度 | | +| `doris_be_brpc_endpoint_stub_count` | | Num | 已创建的 brpc stub 的数量,这些 stub 用于 BE 之间的交互 | | +| `doris_be_brpc_function_endpoint_stub_count` | | Num | 已创建的 brpc stub 的数量,这些 stub 用于和 Remote RPC 之间交互 | | +| `doris_be_cache_capacity` | | | 记录指定 LRU Cache 的容量 | | +| `doris_be_cache_usage` | | | 记录指定 LRU Cache 的使用量 | 用于观测内存占用情况 | P0 | +| `doris_be_cache_usage_ratio` | | | 记录指定 LRU Cache 的使用率 | | +| `doris_be_cache_lookup_count` | | | 记录指定 LRU Cache 被查找的次数 | | +| `doris_be_cache_hit_count` | | | 记录指定 LRU Cache 的命中次数 | | +| `doris_be_cache_hit_ratio` | | | 记录指定 LRU Cache 的命中率 | 用于观测cache是否有效 | P0 | +| | {name="DataPageCache"} | Num | DataPageCache 用于缓存数据的 Data Page | 数据Cache,直接影响查询效率 | P0 | +| | {name="IndexPageCache"} | Num | IndexPageCache 用于缓存数据的 Index Page | 索引Cache,直接影响查询效率 | P0 | +| | {name="LastestSuccessChannelCache"} | Num | LastestSuccessChannelCache 用于缓存导入接收端的 LoadChannel | | +| | {name="SegmentCache"} | Num | SegmentCache 用于缓存已打开的 Segment,如索引信息 | | +| `doris_be_chunk_pool_local_core_alloc_count` | | Num | ChunkAllocator中,从绑定的 core 的内存队列中分配内存的次数 | | +| `doris_be_chunk_pool_other_core_alloc_count` | | Num | ChunkAllocator中,从其他的 core 的内存队列中分配内存的次数 | | +| `doris_be_chunk_pool_reserved_bytes` | | 字节 | ChunkAllocator 中预留的内存大小 | | +| `doris_be_chunk_pool_system_alloc_cost_ns` | | 纳秒 | SystemAllocator 申请内存的耗时累计值 | 通过斜率可以观测内存分配的耗时 | P0 | +| `doris_be_chunk_pool_system_alloc_count` | | Num | SystemAllocator 申请内存的次数 | | +| `doris_be_chunk_pool_system_free_cost_ns` | | 纳秒 | SystemAllocator 释放内存的耗时累计值 | 通过斜率可以观测内存释放的耗时 | P0 | +| `doris_be_chunk_pool_system_free_count` | | Num | SystemAllocator 释放内存的次数 | | +| `doris_be_compaction_bytes_total` | | 字节 | compaction处理的数据量的累计值 | 记录的是 compaction 任务中,input rowset 的 disk size。通过斜率可以观测 compaction的速率 | P0 | +| | {type="base"} | 字节 | Base Compaction 的数据量累计 | | +| | {type="cumulative"} | 字节 | Cumulative Compaction 的数据量累计 | | +| `doris_be_compaction_deltas_total` | | Num | compaction处理的 rowset 个数的累计值 | 记录的是 compaction 任务中,input rowset 的 个数 | +| | {type="base"} | Num | Base Compaction 处理的 rowset 个数累计 | | +| | {type="cumulative"} | Num | Cumulative Compaction 处理的 rowset 个数累计 | | +| `doris_be_disks_compaction_num` | | Num | 指定数据目录上正在执行的 compaction 任务数。如 `{path="/path1/"}` 表示`/path1` 目录上正在执行的任务数 | 用于观测各个磁盘上的 compaction 任务数是否合理 | P0 | +| `doris_be_disks_compaction_score` | | Num | 指定数据目录上正在执行的 compaction 令牌数。如 `{path="/path1/"}` 表示`/path1` 目录上正在执行的令牌数 | | +| `doris_be_compaction_used_permits` | | Num | Compaction 任务已使用的令牌数量 | 用于反映Compaction的资源消耗量 | +| `doris_be_compaction_waitting_permits` | | Num | 正在等待Compaction令牌的数量 | | +| `doris_be_data_stream_receiver_count` | | Num | 数据接收端 Receiver 的数量 | FIXME:向量化引擎此指标缺失 | +| `doris_be_disks_avail_capacity` | | 字节 | 指定数据目录所在磁盘的剩余空间。如 `{path="/path1/"}` 表示 `/path1` 目录所在磁盘的剩余空间 | | P0 | +| `doris_be_disks_local_used_capacity` | | 字节 | 指定数据目录所在磁盘的本地已使用空间 | | +| `doris_be_disks_remote_used_capacity` | | 字节 | 指定数据目录所在磁盘的对应的远端目录的已使用空间 | | +| `doris_be_disks_state` | | 布尔 | 指定数据目录的磁盘状态。1 表示正常。0 表示异常 | | +| `doris_be_disks_total_capacity` | | 字节 | 定数据目录所在磁盘的总容量 | 配合 `doris_be_disks_avail_capacity` 计算磁盘使用率 | P0 | +| `doris_be_engine_requests_total` | | Num | BE 上各类任务执行状态的累计值 | | +| | {status="failed",type="xxx"} | Num | xxx 类型的任务的失败次数的累计值 | | +| | {status="total",type="xxx"} | Num | xxx 类型的任务的总次数的累计值。 | 可以按需监控各类任务的失败次数 | P0 | +| | `{status="skip",type="report_all_tablets"}` | Num | xxx 类型任务被跳过执行的次数的累计值 | | +| `doris_be_fragment_endpoint_count` | | Num | 同 | FIXME: 同 `doris_be_data_stream_receiver_count` 数目。并且向量化引擎缺失 | +| `doris_be_fragment_request_duration_us` | | 微秒 | 所有 fragment intance 的执行时间累计 | 通过斜率观测 instance 的执行耗时 | P0 | +| `doris_be_fragment_requests_total` | | Num | 执行过的 fragment instance 的数量累计 | | +| `doris_be_load_channel_count` | | Num | 当前打开的 load channel 个数 | 数值越大,说明当前正在执行的导入任务越多 | P0 | +| `doris_be_local_bytes_read_total` | | 字节 | 由 `LocalFileReader` 读取的字节数 | | P0 | +| `doris_be_local_bytes_written_total` | | 字节 | 由 `LocalFileWriter` 写入的字节数 | | P0 | +| `doris_be_local_file_reader_total` | | Num | 打开的 `LocalFileReader` 的累计计数 | | +| `doris_be_local_file_open_reading` | | Num | 当前打开的 `LocalFileReader` 个数 | | +| `doris_be_local_file_writer_total` | | Num | 打开的 `LocalFileWriter` 的累计计数。 | | +| `doris_be_mem_consumption` | | 字节 | 指定模块的当前内存开销。如 {type="compaction"} 表示 compaction 模块的当前总内存开销。 | 值取自相同 type 的 MemTracker。FIXME | +| `doris_be_memory_allocated_bytes` | | 字节 | BE 进程物理内存大小,取自 `/proc/self/status/VmRSS` | | P0 | +| `doris_be_memory_jemalloc` | | 字节 | Jemalloc stats, 取自 `je_mallctl`。 | 含义参考:https://jemalloc.net/jemalloc.3.html | P0 | +| `doris_be_memory_pool_bytes_total` | | 字节 | 所有 MemPool 当前占用的内存大小。统计值,不代表真实内存使用。 | | +| `doris_be_memtable_flush_duration_us` | | 微秒 | memtable写入磁盘的耗时累计值 | 通过斜率可以观测写入延迟 | P0 | +| `doris_be_memtable_flush_total` | | Num | memtable写入磁盘的个数累计值 | 通过斜率可以计算写入文件的频率 | P0 | +| `doris_be_meta_request_duration` | | 微秒 | 访问 RocksDB 中的 meta 的耗时累计 | 通过斜率观测 BE 元数据读写延迟 | P0 | +| | {type="read"} | 微秒 | 读取耗时 | | +| | {type="write"} | 微秒 | 写入耗时 | | +| `doris_be_meta_request_total` | | Num | 访问 RocksDB 中的 meta 的次数累计 | 通过斜率观测 BE 元数据访问频率 | P0 | +| | {type="read"} | Num | 读取次数 | | +| | {type="write"} | Num | 写入次数 | | +| `doris_be_fragment_instance_count` | | Num | 当前已接收的 fragment instance 的数量 | 观测是否出现 instance 堆积 | P0 | +| `doris_be_process_fd_num_limit_hard` | | Num | BE 进程的文件句柄数硬限。通过 `/proc/pid/limits` 采集 | | +| `doris_be_process_fd_num_limit_soft` | | Num | BE 进程的文件句柄数软限。通过 `/proc/pid/limits` 采集 | | +| `doris_be_process_fd_num_used` | | Num | BE 进程已使用的文件句柄数。通过 `/proc/pid/limits` 采集 | | +| `doris_be_process_thread_num` | | Num | BE 进程线程数。通过 `/proc/pid/task` 采集 | | P0 | +| `doris_be_query_cache_memory_total_byte` | | 字节 | Query Cache 占用字节数 | | +| `doris_be_query_cache_partition_total_count` | | Num | 当前 Partition Cache 缓存个数 | | +| `doris_be_query_cache_sql_total_count` | | Num | 当前 SQL Cache 缓存个数 | | +| `doris_be_query_scan_bytes` | | 字节 | 读取数据量的累计值。这里只统计读取 Olap 表的数据量 | | +| `doris_be_query_scan_bytes_per_second` | | 字节/秒 | 根据 `doris_be_query_scan_bytes` 计算得出的读取速率 | 观测查询速率 | P0 | +| `doris_be_query_scan_rows` | | Num | 读取行数的累计值。这里只统计读取 Olap 表的数据量。并且是 RawRowsRead(部分数据行可能被索引跳过,并没有真正读取,但仍会记录到这个值中) | 通过斜率观测查询速率 | P0 | +| `doris_be_result_block_queue_count` | | Num | 当前查询结果缓存中的 fragment instance 个数 | 该队列仅用于被外部系统直接读取时使用。如 Spark on Doris 通过 external scan 查询数据 | +| `doris_be_result_buffer_block_count` | | Num | 当前查询结果缓存中的 query 个数 | 该数值反映当前 BE 中有多少查询的结果正在等待 FE 消费 | P0 | +| `doris_be_routine_load_task_count` | | Num | 当前正在执行的 routine load task 个数 | | +| `doris_be_rowset_count_generated_and_in_use` | | Num | 自上次启动后,新增的并且正在使用的 rowset id 个数。 | | +| `doris_be_s3_bytes_read_total` | | Num | `S3FileReader` 的打开累计次数 | | +| `doris_be_s3_file_open_reading` | | Num | 当前打开的 `S3FileReader` 个数 | | +| `doris_be_s3_bytes_read_total` | | 字节 | `S3FileReader` 读取字节数累计值 | | +| `doris_be_scanner_thread_pool_queue_size` | | Num | 用于 OlapScanner 的线程池的当前排队数量 | 大于零则表示 Scanner 开始堆积 | P0 | +| `doris_be_segment_read` | `{type="segment_read_total"}` | Num | 读取的segment的个数累计值 | | +| `doris_be_segment_read` | `{type="segment_row_total"}` | Num | 读取的segment的行数累计值 | 该数值也包含了被索引过滤的行数。相当于读取的segment个数 * 每个segment的总行数 | +| `doris_be_send_batch_thread_pool_queue_size` | | Num | 导入时用于发送数据包的线程池的排队个数 | 大于0则表示有堆积 | P0 | +| `doris_be_send_batch_thread_pool_thread_num` | | Num | 导入时用于发送数据包的线程池的线程数 | | +| `doris_be_small_file_cache_count` | | Num | 当前BE缓存的小文件数量 | | +| `doris_be_streaming_load_current_processing` | | Num | 当前正在运行的 stream load 任务数 | 仅包含 curl 命令发送的任务 | +| `doris_be_streaming_load_duration_ms` | | 毫秒 | 所有stream load 任务执行时间的耗时累计值 | | +| `doris_be_streaming_load_requests_total` | | Num | stream load 任务数的累计值 | 通过斜率可观测任务提交频率 | P0 | +| `doris_be_stream_load_pipe_count` | | Num | 当前 stream load 数据管道的个数 | 包括 stream load 和 routine load 任务 | +| `doris_be_stream_load` | {type="load_rows"} | Num | stream load 最终导入的行数累计值 | 包括 stream load 和 routine load 任务 | P0 | +| `doris_be_stream_load` | {type="receive_bytes"} | 字节 | stream load 接收的字节数累计值 | 包括 stream load 从 http 接收的数据,以及 routine load 从kafka 读取的数据 | P0 | +| `doris_be_tablet_base_max_compaction_score` | | Num | 当前最大的 Base Compaction Score | 该数值实时变化,有可能丢失峰值数据。数值越高,表示 compaction 堆积越严重 | P0 | +| `doris_be_tablet_cumulative_max_compaction_score` | | Num | 同上。当前最大的 Cumulative Compaction Score | | +| `doris_be_tablet_version_num_distribution` | | Num | tablet version 数量的直方。 | 用于反映 tablet version 数量的分布 | P0 | +| `doris_be_thrift_connections_total` | | Num | 创建过的 thrift 连接数的累计值。如 `{name="heartbeat"}` 表示心跳服务的连接数累计 | 此数值为 BE 作为服务端的 thrift server 的连接 | +| `doris_be_thrift_current_connections` | | Num | 当前 thrift 连接数。如 `{name="heartbeat"}` 表示心跳服务的当前连接数。 | 同上 | +| `doris_be_thrift_opened_clients` | | Num | 当前已打开的 thrift 客户端的数量。如 `{name="frontend"}` 表示访问 FE 服务的客户端数量 | | +| `doris_be_thrift_used_clients` | | Num | 当前正在使用的 thrift 客户端的数量。如 `{name="frontend"}` 表示正在用于访问 FE 服务的客户端数量 | | +| `doris_be_timeout_canceled_fragment_count` | | Num | 因超时而被取消的 fragment instance 数量累计值 | 这个值可能会被重复记录。比如部分 fragment instance 被多次取消 | P0 | +| `doris_be_stream_load_txn_request` | {type="begin"} | Num | stream load 开始事务数的累计值 | 包括 stream load 和 routine load 任务 | +| `doris_be_stream_load_txn_request ` | {type="commit"} | Num | stream load 执行成功的事务数的累计值 | 同上 | +| `doris_be_stream_load_txn_request ` | {type="rollback"} | | stream load 执行失败的事务数的累计值 | 同上 | +| `doris_be_unused_rowsets_count` | | Num | 当前已废弃的rowset的个数 | 这些rowset正常情况下会被定期删除 | +| `doris_be_upload_fail_count` | | Num | 冷热分层功能,上传到远端存储失败的rowset的次数累计值 | | +| `doris_be_upload_rowset_count` | | Num | 冷热分层功能,上传到远端存储成功的rowset的次数累计值 | | +| `doris_be_upload_total_byte` | | | 字节 | 冷热分层功能,上传到远端存储成功的rowset数据量累计值 | | +| `doris_be_load_bytes` | | 字节 | 通过 tablet sink 发送的数量累计 | 可观测导入数据量 | P0 | +| `doris_be_load_rows` | | Num | 通过 tablet sink 发送的行数累计 | 可观测导入数据量 | P0 | +| `fragment_thread_pool_queue_size` | | Num | 当前查询执行线程池等待队列的长度 | 如果大于零,则说明查询线程已耗尽,查询会出现堆积 | P0 | +| `doris_be_all_rowsets_num` | | Num | 当前所有 rowset 的个数 | | P0 | +| `doris_be_all_segments_num` | | Num | 当前所有 segment 的个数 | | P0 | +| `doris_be_heavy_work_max_threads` | | Num | brpc heavy线程池线程个数 | | p0 | +| `doris_be_light_work_max_threads` | | Num | brpc light线程池线程个数 | | p0 | +| `doris_be_heavy_work_pool_queue_size` | | Num | brpc heavy线程池队列最大长度,超过则阻塞提交work | | p0 | +| `doris_be_light_work_pool_queue_size` | | Num | brpc light线程池队列最大长度,超过则阻塞提交work | | p0 | +| `doris_be_heavy_work_active_threads` | | Num | brpc heavy线程池活跃线程数 | | p0 | +| `doris_be_light_work_active_threads` | | Num | brpc light线程池活跃线程数 | | p0 | ### 机器监控 -|名称| 标签 |单位 | 含义 | 说明 | 等级 | -|---|---|---|---|---|---| -|`doris_be_cpu`| | Num | CPU 相关监控指标,从 `/proc/stat` 采集。会分别采集每个逻辑核的各项数值。如 `{device="cpu0",mode="nice"}` 表示 cpu0 的 nice 值 | 可计算得出 CPU 使用率 | P0| -|`doris_be_disk_bytes_read`| |字节| 磁盘读取量累计值。从 `/proc/diskstats` 采集。会分别采集每块磁盘的数值。如 `{device="vdd"}` 表示 vvd 盘的数值 | | | -|`doris_be_disk_bytes_written`| | 字节 | 磁盘写入量累计值。采集方式同上 | | -|`doris_be_disk_io_time_ms`| |字节 | 采集方式同上| 可计算得出 IO Util | P0 | -|`doris_be_disk_io_time_weighted`| | 字节|采集方式同上| | -|`doris_be_disk_reads_completed`| |字节 |采集方式同上 | | -|`doris_be_disk_read_time_ms`| | 字节|采集方式同上| | -|`doris_be_disk_writes_completed`| | 字节|采集方式同上| | -|`doris_be_disk_write_time_ms`| | 字节|采集方式同上 | | -|`doris_be_fd_num_limit`| | Num | 系统文件句柄限制上限。从 `/proc/sys/fs/file-nr` 采集| | -|`doris_be_fd_num_used`| | Num | 系统已使用文件句柄数。 从 `/proc/sys/fs/file-nr` 采集 | | -|`doris_be_file_created_total`| | Num | 本地文件创建次数累计 | 所有调用 `local_file_writer` 并最终 close 的文件计数 | -|`doris_be_load_average`| | Num | 机器 Load Avg 指标监控。如 {mode="15_minutes"} 为 15 分钟 Load Avg| 观测整机负载 | P0 | -|`doris_be_max_disk_io_util_percent`| | 百分比 | 计算得出的所有磁盘中,最大的 IO UTIL 的磁盘的数值 | | P0 | -|`doris_be_max_network_receive_bytes_rate`| | 字节/秒 | 计算得出的所有网卡中,最大的接收速率| | P0 | -|`doris_be_max_network_send_bytes_rate`| | 字节/秒 | 计算得出的所有网卡中,最大的发送速率| | P0 | -|`doris_be_memory_pgpgin`| | 字节 | 系统从磁盘写到内存页的数据量 | | -|`doris_be_memory_pgpgout`| | 字节 | 系统内存页写入磁盘的数据量 | | -|`doris_be_memory_pswpin`| | 字节 | 系统从磁盘换入到内存的数量| 通常情况下,swap应该关闭,因此这个数值应该是0| -|`doris_be_memory_pswpout`| | 字节 | 系统从内存换入到磁盘的数量| 通常情况下,swap应该关闭,因此这个数值应该是0| -|`doris_be_network_receive_bytes`| | 字节| 各个网卡的接收字节累计。采集自 `/proc/net/dev` | | -|`doris_be_network_receive_packets`| | Num| 各个网卡的接收包个数累计。采集自 `/proc/net/dev` | | -|`doris_be_network_send_bytes`| | 字节| 各个网卡的发送字节累计。采集自 `/proc/net/dev` | | -|`doris_be_network_send_packets`| | Num| 各个网卡的发送包个数累计。采集自 `/proc/net/dev` | | -|`doris_be_proc`| `{mode="ctxt_switch"}` | Num | CPU 上下文切换的累计值。采集自 `/proc/stat` | 观测是否有异常的上下文切换 | P0 | -|`doris_be_proc `| `{mode="interrupt"}` | Num |CPU 中断次数的累计值。采集自 `/proc/stat` | | -|`doris_be_proc`| `{mode="procs_blocked"}` | Num | 系统当前被阻塞的进程数(如等待IO)。采集自 `/proc/stat` | | -|`doris_be_proc`| `{mode="procs_running"}` | Num | 系统当前正在执行的进程数。采集自 `/proc/stat` | | -|`doris_be_snmp_tcp_in_errs`| | Num| tcp包接收错误的次数。采集自 `/proc/net/snmp`| 可观测网络错误如重传、丢包等。需和其他 snmp 指标配合使用 | P0 -|`doris_be_snmp_tcp_in_segs`| | Num | tcp包发送的个数。 采集自 `/proc/net/snmp`| | -|`doris_be_snmp_tcp_out_segs`| | Num | tcp包发送的个数。采集自 `/proc/net/snmp`| | -|`doris_be_snmp_tcp_retrans_segs`| | Num | tcp包重传的个数。采集自 `/proc/net/snmp`| | +| 名称 | 标签 | 单位 | 含义 | 说明 | 等级 | +|-------------------------------------------|--------------------------|------|-----------------------------------------------------------------------------------------------|------------------------------------------|----| +| `doris_be_cpu` | | Num | CPU 相关监控指标,从 `/proc/stat` 采集。会分别采集每个逻辑核的各项数值。如 `{device="cpu0",mode="nice"}` 表示 cpu0 的 nice 值 | 可计算得出 CPU 使用率 | P0 | +| `doris_be_disk_bytes_read` | | 字节 | 磁盘读取量累计值。从 `/proc/diskstats` 采集。会分别采集每块磁盘的数值。如 `{device="vdd"}` 表示 vvd 盘的数值 | | | +| `doris_be_disk_bytes_written` | | 字节 | 磁盘写入量累计值。采集方式同上 | | | +| `doris_be_disk_io_time_ms` | | 字节 | 采集方式同上 | 可计算得出 IO Util | P0 | +| `doris_be_disk_io_time_weighted` | | 字节 | 采集方式同上 | | | +| `doris_be_disk_reads_completed` | | 字节 | 采集方式同上 | | | +| `doris_be_disk_read_time_ms` | | 字节 | 采集方式同上 | | | +| `doris_be_disk_writes_completed` | | 字节 | 采集方式同上 | | | +| `doris_be_disk_write_time_ms` | | 字节 | 采集方式同上 | | | +| `doris_be_fd_num_limit` | | Num | 系统文件句柄限制上限。从 `/proc/sys/fs/file-nr` 采集 | | | +| `doris_be_fd_num_used` | | Num | 系统已使用文件句柄数。 从 `/proc/sys/fs/file-nr` 采集 | | | +| `doris_be_file_created_total` | | Num | 本地文件创建次数累计 | 所有调用 `local_file_writer` 并最终 close 的文件计数 | | +| `doris_be_load_average` | | Num | 机器 Load Avg 指标监控。如 {mode="15_minutes"} 为 15 分钟 Load Avg | 观测整机负载 | P0 | +| `doris_be_max_disk_io_util_percent` | | 百分比 | 计算得出的所有磁盘中,最大的 IO UTIL 的磁盘的数值 | | P0 | +| `doris_be_max_network_receive_bytes_rate` | | 字节/秒 | 计算得出的所有网卡中,最大的接收速率 | | P0 | +| `doris_be_max_network_send_bytes_rate` | | 字节/秒 | 计算得出的所有网卡中,最大的发送速率 | | P0 | +| `doris_be_memory_pgpgin` | | 字节 | 系统从磁盘写到内存页的数据量 | | | +| `doris_be_memory_pgpgout` | | 字节 | 系统内存页写入磁盘的数据量 | | | +| `doris_be_memory_pswpin` | | 字节 | 系统从磁盘换入到内存的数量 | 通常情况下,swap应该关闭,因此这个数值应该是0 | | +| `doris_be_memory_pswpout` | | 字节 | 系统从内存换入到磁盘的数量 | 通常情况下,swap应该关闭,因此这个数值应该是0 | | +| `doris_be_network_receive_bytes` | | 字节 | 各个网卡的接收字节累计。采集自 `/proc/net/dev` | | | +| `doris_be_network_receive_packets` | | Num | 各个网卡的接收包个数累计。采集自 `/proc/net/dev` | | | +| `doris_be_network_send_bytes` | | 字节 | 各个网卡的发送字节累计。采集自 `/proc/net/dev` | | | +| `doris_be_network_send_packets` | | Num | 各个网卡的发送包个数累计。采集自 `/proc/net/dev` | | | +| `doris_be_proc` | `{mode="ctxt_switch"}` | Num | CPU 上下文切换的累计值。采集自 `/proc/stat` | 观测是否有异常的上下文切换 | P0 | +| `doris_be_proc ` | `{mode="interrupt"}` | Num | CPU 中断次数的累计值。采集自 `/proc/stat` | | | +| `doris_be_proc` | `{mode="procs_blocked"}` | Num | 系统当前被阻塞的进程数(如等待IO)。采集自 `/proc/stat` | | | +| `doris_be_proc` | `{mode="procs_running"}` | Num | 系统当前正在执行的进程数。采集自 `/proc/stat` | | | +| `doris_be_snmp_tcp_in_errs` | | Num | tcp包接收错误的次数。采集自 `/proc/net/snmp` | 可观测网络错误如重传、丢包等。需和其他 snmp 指标配合使用 | P0 | +| `doris_be_snmp_tcp_in_segs` | | Num | tcp包发送的个数。 采集自 `/proc/net/snmp` | | | +| `doris_be_snmp_tcp_out_segs` | | Num | tcp包发送的个数。采集自 `/proc/net/snmp` | | | +| `doris_be_snmp_tcp_retrans_segs` | | Num | tcp包重传的个数。采集自 `/proc/net/snmp` | | | diff --git a/fe/fe-core/src/main/java/org/apache/doris/metric/JsonMetricVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/metric/JsonMetricVisitor.java index 81ca24094e9123b..5b3b3d292a2f4eb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/metric/JsonMetricVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/metric/JsonMetricVisitor.java @@ -40,10 +40,10 @@ public class JsonMetricVisitor extends MetricVisitor { private static final String JVM_NON_HEAP_SIZE_BYTES = "jvm_non_heap_size_bytes"; private static final String JVM_YOUNG_SIZE_BYTES = "jvm_young_size_bytes"; private static final String JVM_OLD_SIZE_BYTES = "jvm_old_size_bytes"; - private static final String JVM_YOUNG_GC = "jvm_young_gc"; - private static final String JVM_OLD_GC = "jvm_old_gc"; private static final String JVM_THREAD = "jvm_thread"; + private static final String JVM_GC = "jvm_gc"; + public JsonMetricVisitor() { super(); sb.append("[\n"); @@ -52,59 +52,59 @@ public JsonMetricVisitor() { @Override public void visitJvm(JvmStats jvmStats) { // heap - setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, "max", "bytes", jvmStats.getMem().getHeapMax().getBytes()); - setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, "committed", "bytes", + setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, null, "max", "bytes", jvmStats.getMem().getHeapMax().getBytes()); + setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, null, "committed", "bytes", jvmStats.getMem().getHeapCommitted().getBytes()); - setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, "used", "bytes", jvmStats.getMem().getHeapUsed().getBytes()); + setJvmJsonMetric(sb, JVM_HEAP_SIZE_BYTES, null, "used", "bytes", jvmStats.getMem().getHeapUsed().getBytes()); // non heap - setJvmJsonMetric(sb, JVM_NON_HEAP_SIZE_BYTES, "committed", "bytes", + setJvmJsonMetric(sb, JVM_NON_HEAP_SIZE_BYTES, null, "committed", "bytes", jvmStats.getMem().getNonHeapCommitted().getBytes()); - setJvmJsonMetric(sb, JVM_NON_HEAP_SIZE_BYTES, "used", "bytes", jvmStats.getMem().getNonHeapUsed().getBytes()); + setJvmJsonMetric(sb, JVM_NON_HEAP_SIZE_BYTES, null, "used", "bytes", + jvmStats.getMem().getNonHeapUsed().getBytes()); // mem pool Iterator memIter = jvmStats.getMem().iterator(); while (memIter.hasNext()) { MemoryPool memPool = memIter.next(); if (memPool.getName().equalsIgnoreCase("young")) { - setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, "used", "bytes", memPool.getUsed().getBytes()); - setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, "peak_used", "bytes", memPool.getPeakUsed().getBytes()); - setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, "max", "bytes", memPool.getMax().getBytes()); + setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, null, "used", "bytes", memPool.getUsed().getBytes()); + setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, null, "peak_used", "bytes", + memPool.getPeakUsed().getBytes()); + setJvmJsonMetric(sb, JVM_YOUNG_SIZE_BYTES, null, "max", "bytes", memPool.getMax().getBytes()); } else if (memPool.getName().equalsIgnoreCase("old")) { - setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, "used", "bytes", memPool.getUsed().getBytes()); - setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, "peak_used", "bytes", memPool.getPeakUsed().getBytes()); - setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, "max", "bytes", memPool.getMax().getBytes()); + setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, null, "used", "bytes", memPool.getUsed().getBytes()); + setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, null, "peak_used", "bytes", memPool.getPeakUsed().getBytes()); + setJvmJsonMetric(sb, JVM_OLD_SIZE_BYTES, null, "max", "bytes", memPool.getMax().getBytes()); } } // gc - Iterator gcIter = jvmStats.getGc().iterator(); - while (gcIter.hasNext()) { - GarbageCollector gc = gcIter.next(); - if (gc.getName().equalsIgnoreCase("young")) { - setJvmJsonMetric(sb, JVM_YOUNG_GC, "count", "nounit", gc.getCollectionCount()); - setJvmJsonMetric(sb, JVM_YOUNG_GC, "time", "milliseconds", gc.getCollectionTime().getMillis()); - } else if (gc.getName().equalsIgnoreCase("old")) { - setJvmJsonMetric(sb, JVM_OLD_GC, "count", "nounit", gc.getCollectionCount()); - setJvmJsonMetric(sb, JVM_OLD_GC, "time", "milliseconds", gc.getCollectionTime().getMillis()); - } + for (GarbageCollector gc : jvmStats.getGc()) { + setJvmJsonMetric(sb, JVM_GC, gc.getName() + " Count", "count", "nounit", gc.getCollectionCount()); + setJvmJsonMetric(sb, JVM_GC, gc.getName() + " Time", "time", "milliseconds", + gc.getCollectionTime().getMillis()); } // threads Threads threads = jvmStats.getThreads(); - setJvmJsonMetric(sb, JVM_THREAD, "count", "nounit", threads.getCount()); - setJvmJsonMetric(sb, JVM_THREAD, "peak_count", "nounit", threads.getPeakCount()); - setJvmJsonMetric(sb, JVM_THREAD, "new_count", "nounit", threads.getThreadsNewCount()); - setJvmJsonMetric(sb, JVM_THREAD, "runnable_count", "nounit", threads.getThreadsRunnableCount()); - setJvmJsonMetric(sb, JVM_THREAD, "blocked_count", "nounit", threads.getThreadsBlockedCount()); - setJvmJsonMetric(sb, JVM_THREAD, "waiting_count", "nounit", threads.getThreadsWaitingCount()); - setJvmJsonMetric(sb, JVM_THREAD, "timed_waiting_count", "nounit", threads.getThreadsTimedWaitingCount()); - setJvmJsonMetric(sb, JVM_THREAD, "terminated_count", "nounit", threads.getThreadsTerminatedCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "count", "nounit", threads.getCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "peak_count", "nounit", threads.getPeakCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "new_count", "nounit", threads.getThreadsNewCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "runnable_count", "nounit", threads.getThreadsRunnableCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "blocked_count", "nounit", threads.getThreadsBlockedCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "waiting_count", "nounit", threads.getThreadsWaitingCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "timed_waiting_count", "nounit", threads.getThreadsTimedWaitingCount()); + setJvmJsonMetric(sb, JVM_THREAD, null, "terminated_count", "nounit", threads.getThreadsTerminatedCount()); } - private void setJvmJsonMetric(StringBuilder sb, String metric, String type, String unit, long value) { + private void setJvmJsonMetric(StringBuilder sb, String metric, String name, String type, String unit, long value) { sb.append("{\n\t\"tags\":\n\t{\n"); sb.append("\t\t\"metric\":\"").append(metric).append("\""); + if (name != null) { + sb.append(",\n"); + sb.append("\t\t\"name\":\"").append(name).append("\"\n"); + } if (type != null) { sb.append(",\n"); sb.append("\t\t\"type\":\"").append(type).append("\"\n"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java index b0cf862041592a8..6c0e74da35a4e9d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/metric/PrometheusMetricVisitor.java @@ -46,10 +46,10 @@ public class PrometheusMetricVisitor extends MetricVisitor { private static final String JVM_NON_HEAP_SIZE_BYTES = "jvm_non_heap_size_bytes"; private static final String JVM_YOUNG_SIZE_BYTES = "jvm_young_size_bytes"; private static final String JVM_OLD_SIZE_BYTES = "jvm_old_size_bytes"; - private static final String JVM_YOUNG_GC = "jvm_young_gc"; - private static final String JVM_OLD_GC = "jvm_old_gc"; private static final String JVM_THREAD = "jvm_thread"; + private static final String JVM_GC = "jvm_gc"; + private static final String HELP = "# HELP "; private static final String TYPE = "# TYPE "; @@ -104,22 +104,15 @@ public void visitJvm(JvmStats jvmStats) { } // gc - Iterator gcIter = jvmStats.getGc().iterator(); - while (gcIter.hasNext()) { - GarbageCollector gc = gcIter.next(); - if (gc.getName().equalsIgnoreCase("young")) { - sb.append(Joiner.on(" ").join(HELP, JVM_YOUNG_GC, "jvm young gc stat\n")); - sb.append(Joiner.on(" ").join(TYPE, JVM_YOUNG_GC, "gauge\n")); - sb.append(JVM_YOUNG_GC).append("{type=\"count\"} ").append(gc.getCollectionCount()).append("\n"); - sb.append(JVM_YOUNG_GC).append("{type=\"time\"} ") - .append(gc.getCollectionTime().getMillis()).append("\n"); - } else if (gc.getName().equalsIgnoreCase("old")) { - sb.append(Joiner.on(" ").join(HELP, JVM_OLD_GC, "jvm old gc stat\n")); - sb.append(Joiner.on(" ").join(TYPE, JVM_OLD_GC, "gauge\n")); - sb.append(JVM_OLD_GC).append("{type=\"count\"} ").append(gc.getCollectionCount()).append("\n"); - sb.append(JVM_OLD_GC).append("{type=\"time\"} ") - .append(gc.getCollectionTime().getMillis()).append("\n"); - } + sb.append(Joiner.on(" ").join(HELP, JVM_GC, "jvm gc stat\n")); + sb.append(Joiner.on(" ").join(TYPE, JVM_GC, "\n")); + for (GarbageCollector gc : jvmStats.getGc()) { + sb.append(JVM_GC).append("{"); + sb.append("name=\"").append(gc.getName()).append(" Count").append("\", ").append("type=\"count\"} ") + .append(gc.getCollectionCount()).append("\n"); + sb.append(JVM_GC).append("{"); + sb.append("name=\"").append(gc.getName()).append(" Time").append("\", ").append("type=\"time\"} ") + .append(gc.getCollectionTime().getMillis()).append("\n"); } // threads diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/GcNames.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/GcNames.java index a97224d6af10249..77bb27c5804c4b5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/GcNames.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/GcNames.java @@ -46,16 +46,4 @@ public static String getByMemoryPoolName(String poolName, String defaultName) { } return defaultName; } - - public static String getByGcName(String gcName, String defaultName) { - if ("Copy".equals(gcName) || "PS Scavenge".equals(gcName) || "ParNew".equals(gcName) - || "G1 Young Generation".equals(gcName)) { - return YOUNG; - } - if ("MarkSweepCompact".equals(gcName) || "PS MarkSweep".equals(gcName) - || "ConcurrentMarkSweep".equals(gcName) || "G1 Old Generation".equals(gcName)) { - return OLD; - } - return defaultName; - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java index d06a1a55c52f2fc..d3c16bb6c58087e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java @@ -125,7 +125,7 @@ public static JvmStats jvmStats() { GarbageCollector[] collectors = new GarbageCollector[gcMxBeans.size()]; for (int i = 0; i < collectors.length; i++) { GarbageCollectorMXBean gcMxBean = gcMxBeans.get(i); - collectors[i] = new GarbageCollector(GcNames.getByGcName(gcMxBean.getName(), gcMxBean.getName()), + collectors[i] = new GarbageCollector(gcMxBean.getName(), gcMxBean.getCollectionCount(), gcMxBean.getCollectionTime()); } GarbageCollectors garbageCollectors = new GarbageCollectors(collectors); diff --git a/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java b/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java index 162a57f3f369809..5b8c4bdd7288c69 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/metric/MetricsTest.java @@ -18,16 +18,25 @@ package org.apache.doris.metric; import org.apache.doris.common.FeConstants; +import org.apache.doris.common.util.JsonUtil; +import org.apache.doris.monitor.jvm.JvmService; +import org.apache.doris.monitor.jvm.JvmStats; import com.codahale.metrics.Histogram; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; import java.util.List; import java.util.Map; import java.util.SortedMap; +import java.util.concurrent.atomic.AtomicInteger; +@Slf4j public class MetricsTest { @BeforeClass @@ -78,4 +87,39 @@ public void testUserQueryMetrics() { Assert.assertTrue(metricResult.contains("doris_fe_query_latency_ms{quantile=\"0.999\",user=\"test_user\"} 10.0")); } + + @Test + public void testGc() { + PrometheusMetricVisitor visitor = new PrometheusMetricVisitor(); + JvmService jvmService = new JvmService(); + JvmStats jvmStats = jvmService.stats(); + visitor.visitJvm(jvmStats); + String metric = MetricRepo.getMetric(visitor); + List gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans(); + String finalMetricPrometheus = metric; + gcMxBeans.forEach(gcMxBean -> { + String name = gcMxBean.getName(); + Assert.assertTrue(finalMetricPrometheus.contains("jvm_gc{name=\"" + name + " Count\", type=\"count\"} ")); + Assert.assertTrue(finalMetricPrometheus.contains("jvm_gc{name=\"" + name + " Time\", type=\"time\"} ")); + }); + + JsonMetricVisitor jsonMetricVisitor = new JsonMetricVisitor(); + jsonMetricVisitor.visitJvm(jvmStats); + metric = MetricRepo.getMetric(jsonMetricVisitor); + String finalMetricJson = metric; + AtomicInteger size = new AtomicInteger(JsonUtil.parseArray(finalMetricJson).size()); + gcMxBeans.forEach(gcMxBean -> JsonUtil.parseArray(finalMetricJson).forEach(json -> { + ObjectNode jsonObject = JsonUtil.parseObject(json.toString()); + String name = gcMxBean.getName(); + if (jsonObject.findValue("tags").findValue("metric").asText().equals("jvm_gc") + && jsonObject.findValue("tags").findValue("name").asText().contains(name + " Count")) { + size.getAndDecrement(); + Assert.assertTrue(jsonObject.findValue("tags").findValue("name").asText().contains(name + " Count") + || jsonObject.findValue("tags").findValue("name").asText().contains(name + " Time")); + } + + })); + Assert.assertTrue(size.get() < JsonUtil.parseArray(finalMetricJson).size()); + + } } diff --git a/regression-test/suites/metrics_p0/test_fe_metrics.groovy b/regression-test/suites/metrics_p0/test_fe_metrics.groovy index 7eeb633f4171da8..d91971200d68031 100644 --- a/regression-test/suites/metrics_p0/test_fe_metrics.groovy +++ b/regression-test/suites/metrics_p0/test_fe_metrics.groovy @@ -24,6 +24,19 @@ suite("test_fe_metrics") { logger.debug("code:${code} body:${body}"); assertEquals(200, code) assertTrue(body.contains("jvm_heap_size_bytes")) + assertTrue(body.contains("jvm_gc")) } } -} \ No newline at end of file + + httpTest { + endpoint context.config.feHttpAddress + uri "/metrics?type=json" + op "get" + check { code, body -> + logger.debug("code:${code} body:${body}"); + assertEquals(200, code) + assertTrue(body.contains("jvm_heap_size_bytes")) + assertTrue(body.contains("jvm_gc")) + } + } +}