在 IoTDB 的运行过程中,我们希望对 IoTDB 的状态进行观测,以便于排查系统问题或者及时发现系统潜在的风险,能够**反映系统运行状态的一系列指标 **就是系统监控指标。
那么什么时候会用到监控框架呢?下面列举一些常见的场景。
系统变慢了
系统变慢几乎是最常见也最头疼的问题,这时候我们需要尽可能多的信息来帮助我们找到系统变慢的原因,比如:
磁盘快满了
这时候我们迫切想知道最近一段时间数据文件的增长情况,看看是不是某种文件有突增。
系统运行是否正常
此时我们可能需要通过错误日志的数量、集群节点的状态等指标来判断系统是否在正常运行。
所有关注系统状态的人员都可以使用,包括但不限于研发、测试、运维、DBA等等
在 IoTDB 的监控模块,每个监控指标被 Metric Name 和 Tags 唯一标识。
Metric Name:指标类型名称,比如logback_events表示日志事件。Tags:指标分类,形式为Key-Value对,每个指标下面可以有0到多个分类,常见的Key-Value对:name = xxx:被监控对象的名称,是对业务逻辑的说明。比如对于Metric Name = entry_seconds_count 类型的监控项,name的含义是指被监控的业务接口。type = xxx:监控指标类型细分,是对监控指标本身的说明。比如对于Metric Name = point 类型的监控项,type的含义是指监控具体是什么类型的点数。status = xxx:被监控对象的状态,是对业务逻辑的说明。比如对于Metric Name = Task类型的监控项可以通过该参数,从而区分被监控对象的状态。user = xxx:被监控对象的相关用户,是对业务逻辑的说明。比如统计root用户的写入总点数。Metric Level:指标管理级别,默认启动级别为Core级别,建议启动级别为Important级别 ,审核严格程度Core > Important > Normal > AllCore:系统的核心指标,供系统内核和运维人员使用,关乎系统的性能、稳定性、安全性,比如实例的状况,系统的负载等。Important:模块的重要指标,供运维和测试人员使用,直接关乎每个模块的运行状态,比如合并文件个数、执行情况等。Normal:模块的一般指标,供开发人员使用,方便在出现问题时定位模块,比如合并中的特定关键操作情况。All:模块的全部指标,供模块开发人员使用,往往在复现问题的时候使用,从而快速解决问题。org.apache.iotdb.metrics获取系统监控指标指标。目前,IoTDB 对外提供一些主要模块的监控指标,并且随着新功能的开发以及系统优化或者重构,监控指标也会同步添加和更新。如果想自己在 IoTDB 中添加更多系统监控指标埋点,可以参考IoTDB Metrics Framework使用说明。
Core 级别的监控指标在系统运行中默认开启,每一个 Core 级别的监控指标的添加都需要经过谨慎的评估,目前 Core 级别的监控指标如下所述:
| Metric | Tags | Type | Description |
|---|---|---|---|
| config_node | name=“total”,status=“Registered/Online/Unknown” | AutoGauge | 已注册/在线/离线 confignode 的节点数量 |
| data_node | name=“total”,status=“Registered/Online/Unknown” | AutoGauge | 已注册/在线/离线 datanode 的节点数量 |
| cluster_node_leader_count | name=“{ip}:{port}” | Gauge | 节点上共识组Leader的数量 |
| cluster_node_status | name=“{ip}:{port}”,type=“ConfigNode/DataNode” | Gauge | 节点的状态,0=Unkonwn 1=online |
| entry | name=“{interface}” | Timer | Client 建立的 Thrift 的耗时情况 |
| mem | name=“IoTConsensus” | AutoGauge | IoT共识协议的内存占用,单位为byte |
| Metric | Tags | Type | Description |
|---|---|---|---|
| thrift_connections | name=“ConfigNodeRPC” | AutoGauge | ConfigNode 的内部 Thrift 连接数 |
| thrift_connections | name=“InternalRPC” | AutoGauge | DataNode 的内部 Thrift 连接数 |
| thrift_connections | name=“MPPDataExchangeRPC” | AutoGauge | MPP 框架的内部 Thrift 连接数 |
| thrift_connections | name=“ClientRPC” | AutoGauge | Client 建立的 Thrift 连接数 |
| thrift_active_threads | name=“ConfigNodeRPC-Service” | AutoGauge | ConfigNode 的内部活跃 Thrift 连接数 |
| thrift_active_threads | name=“DataNodeInternalRPC-Service” | AutoGauge | DataNode 的内部活跃 Thrift 连接数 |
| thrift_active_threads | name=“MPPDataExchangeRPC-Service” | AutoGauge | MPP 框架的内部活跃 Thrift 连接数 |
| thrift_active_threads | name=“ClientRPC-Service” | AutoGauge | Client 建立的活跃 Thrift 连接数 |
| session_idle_time | name = “sessionId” | Histogram | 不同 Session 的空闲时间分布情况 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| quantity | name=“database” | AutoGauge | 系统数据库数量 |
| quantity | name=“timeSeries” | AutoGauge | 系统时间序列数量 |
| quantity | name=“pointsIn” | Counter | 系统累计写入点数 |
| points | database=“{database}”, type=“flush” | Gauge | 最新一个刷盘的memtale的点数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| performance_overview | interface=“{interface}”, type=“{statement_type}” | Timer | 客户端执行的操作的耗时情况 |
| performance_overview_detail | stage=“authority” | Timer | 权限认证总耗时 |
| performance_overview_detail | stage=“parser” | Timer | 解析构造总耗时 |
| performance_overview_detail | stage=“analyzer” | Timer | 语句分析总耗时 |
| performance_overview_detail | stage=“planner” | Timer | 请求规划总耗时 |
| performance_overview_detail | stage=“scheduler” | Timer | 请求执行总耗时 |
| performance_overview_schedule_detail | stage=“schema_validate” | Timer | 元数据验证总耗时 |
| performance_overview_schedule_detail | stage=“trigger” | Timer | Trigger 触发总耗时 |
| performance_overview_schedule_detail | stage=“consensus” | Timer | 共识层总耗时 |
| performance_overview_schedule_detail | stage=“lock” | Timer | DataRegion 抢锁总耗时 |
| performance_overview_schedule_detail | stage=“memory_block” | Timer | 内存控制阻塞总耗时 |
| performance_overview_schedule_detail | stage=“wal” | Timer | 写入 Wal 总耗时 |
| performance_overview_schedule_detail | stage=“memtable” | Timer | 写入 Memtable 总耗时 |
| performance_overview_schedule_detail | stage=“last_cache” | Timer | 更新 LastCache 总耗时 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| queue | name=“compaction_inner”, status=“running/waiting” | Gauge | 空间内合并任务数 |
| queue | name=“compaction_cross”, status=“running/waiting” | Gauge | 跨空间合并任务数 |
| queue | name=“flush”,status=“running/waiting” | AutoGauge | 刷盘任务数 |
| cost_task | name=“inner_compaction/cross_compaction/flush” | Gauge | 任务耗时情况 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| process_cpu_load | name=“process” | AutoGauge | IoTDB 进程的 CPU 占用率,单位为% |
| process_cpu_time | name=“process” | AutoGauge | IoTDB 进程占用的 CPU 时间,单位为ns |
| process_max_mem | name=“memory” | AutoGauge | IoTDB 进程最大可用内存 |
| process_total_mem | name=“memory” | AutoGauge | IoTDB 进程当前已申请内存 |
| process_free_mem | name=“memory” | AutoGauge | IoTDB 进程当前剩余可用内存 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| sys_cpu_load | name=“system” | AutoGauge | 系统的 CPU 占用率,单位为% |
| sys_cpu_cores | name=“system” | Gauge | 系统的可用处理器数 |
| sys_total_physical_memory_size | name=“memory” | Gauge | 系统的最大物理内存 |
| sys_free_physical_memory_size | name=“memory” | AutoGauge | 系统的剩余可用内存 |
| sys_total_swap_space_size | name=“memory” | AutoGauge | 系统的交换区最大空间 |
| sys_free_swap_space_size | name=“memory” | AutoGauge | 系统的交换区剩余可用空间 |
| sys_committed_vm_size | name=“memory” | AutoGauge | 系统保证可用于正在运行的进程的虚拟内存量 |
| sys_disk_total_space | name=“disk” | AutoGauge | 系统磁盘总大小 |
| sys_disk_free_space | name=“disk” | AutoGauge | 系统磁盘可用大小 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| logback_events | level=“trace/debug/info/warn/error” | Counter | 不同类型的日志个数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| file_size | name=“wal” | AutoGauge | 写前日志总大小,单位为byte |
| file_size | name=“seq” | AutoGauge | 顺序TsFile总大小,单位为byte |
| file_size | name=“unseq” | AutoGauge | 乱序TsFile总大小,单位为byte |
| file_size | name=“inner-seq-temp” | AutoGauge | 顺序空间内合并临时文件大小,单位为byte |
| file_size | name=“inner-unseq-temp” | AutoGauge | 乱序空间内合并临时文件大小,单位为byte |
| file_size | name=“cross-temp” | AutoGauge | 跨空间合并临时文件大小,单位为byte |
| file_size | name=“mods” | AutoGauge | Modification 文件的大小 |
| file_count | name=“wal” | AutoGauge | 写前日志文件个数 |
| file_count | name=“seq” | AutoGauge | 顺序TsFile文件个数 |
| file_count | name=“unseq” | AutoGauge | 乱序TsFile文件个数 |
| file_count | name=“inner-seq-temp” | AutoGauge | 顺序空间内合并临时文件个数 |
| file_count | name=“inner-unseq-temp” | AutoGauge | 乱序空间内合并临时文件个数 |
| file_count | name=“cross-temp” | AutoGauge | 跨空间合并临时文件个数 |
| file_count | name=“open_file_handlers” | AutoGauge | IoTDB 进程打开文件数,仅支持Linux和MacOS |
| file_count | name="mods | AutoGauge | Modification 文件的数目 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| jvm_buffer_memory_used_bytes | id=“direct/mapped” | AutoGauge | 已经使用的缓冲区大小 |
| jvm_buffer_total_capacity_bytes | id=“direct/mapped” | AutoGauge | 最大缓冲区大小 |
| jvm_buffer_count_buffers | id=“direct/mapped” | AutoGauge | 当前缓冲区数量 |
| jvm_memory_committed_bytes | {area=“heap/nonheap”,id=“xxx”,} | AutoGauge | 当前申请的内存大小 |
| jvm_memory_max_bytes | {area=“heap/nonheap”,id=“xxx”,} | AutoGauge | 最大内存 |
| jvm_memory_used_bytes | {area=“heap/nonheap”,id=“xxx”,} | AutoGauge | 已使用内存大小 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| jvm_threads_live_threads | AutoGauge | 当前线程数 | |
| jvm_threads_daemon_threads | AutoGauge | 当前 Daemon 线程数 | |
| jvm_threads_peak_threads | AutoGauge | 峰值线程数 | |
| jvm_threads_states_threads | state=“runnable/blocked/waiting/timed-waiting/new/terminated” | AutoGauge | 当前处于各种状态的线程数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| jvm_gc_pause | action=“end of major GC/end of minor GC”,cause=“xxxx” | Timer | 不同原因的Young GC/Full GC的次数与耗时 |
| jvm_gc_concurrent_phase_time | action=“{action}”,cause=“{cause}” | Timer | 不同原因的Young GC/Full GC的次数与耗时 |
| jvm_gc_max_data_size_bytes | AutoGauge | 老年代内存的历史最大值 | |
| jvm_gc_live_data_size_bytes | AutoGauge | 老年代内存的使用值 | |
| jvm_gc_memory_promoted_bytes | Counter | 老年代内存正向增长累计值 | |
| jvm_gc_memory_allocated_bytes | Counter | GC分配内存正向增长累计值 |
目前 Important 级别的监控指标如下所述:
| Metric | Tags | Type | Description |
|---|---|---|---|
| region | name=“total”,type=“SchemaRegion” | AutoGauge | 分区表中 SchemaRegion 总数量 |
| region | name=“total”,type=“DataRegion” | AutoGauge | 分区表中 DataRegion 总数量 |
| region | name=“{ip}:{port}”,type=“SchemaRegion” | Gauge | 分区表中对应节点上 DataRegion 总数量 |
| region | name=“{ip}:{port}”,type=“DataRegion” | Gauge | 分区表中对应节点上 DataRegion 总数量 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| iot_consensus | name=“logDispatcher-{IP}:{Port}”, region=“{region}”, type=“currentSyncIndex” | AutoGauge | 副本组同步线程的当前同步进度 |
| iot_consensus | name=“logDispatcher-{IP}:{Port}”, region=“{region}”, type=“cachedRequestInMemoryQueue” | AutoGauge | 副本组同步线程缓存队列请求总大小 |
| iot_consensus | name=“IoTConsensusServerImpl”, region=“{region}”, type=“searchIndex” | AutoGauge | 副本组主流程写入进度 |
| iot_consensus | name=“IoTConsensusServerImpl”, region=“{region}”, type=“safeIndex” | AutoGauge | 副本组同步进度 |
| iot_consensus | name=“IoTConsensusServerImpl”, region=“{region}”, type=“syncLag” | AutoGauge | 副本组写入进度与同步进度差 |
| iot_consensus | name=“IoTConsensusServerImpl”, region=“{region}”, type=“LogEntriesFromWAL” | AutoGauge | 副本组Batch中来自WAL的日志项数量 |
| iot_consensus | name=“IoTConsensusServerImpl”, region=“{region}”, type=“LogEntriesFromQueue” | AutoGauge | 副本组Batch中来自队列的日志项数量 |
| stage | name=“iot_consensus”, region=“{region}”, type=“getStateMachineLock” | Histogram | 主流程获取状态机锁耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“checkingBeforeWrite” | Histogram | 主流程写入状态机检查耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“writeStateMachine” | Histogram | 主流程写入状态机耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“offerRequestToQueue” | Histogram | 主流程尝试添加队列耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“consensusWrite” | Histogram | 主流程全写入耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“constructBatch” | Histogram | 同步线程构造 Batch 耗时 |
| stage | name=“iot_consensus”, region=“{region}”, type=“syncLogTimePerRequest” | Histogram | 异步回调流程同步日志耗时 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| cache_hit | name=“chunk” | AutoGauge | ChunkCache的命中率,单位为% |
| cache_hit | name=“schema” | AutoGauge | SchemaCache的命中率,单位为% |
| cache_hit | name=“timeSeriesMeta” | AutoGauge | TimeseriesMetadataCache的命中率,单位为% |
| cache_hit | name=“bloomFilter” | AutoGauge | TimeseriesMetadataCache中的bloomFilter的拦截率,单位为% |
| cache | name=“Database”, type=“hit” | Counter | Database Cache 的命中次数 |
| cache | name=“Database”, type=“all” | Counter | Database Cache 的访问次数 |
| cache | name=“SchemaPartition”, type=“hit” | Counter | SchemaPartition Cache 的命中次数 |
| cache | name=“SchemaPartition”, type=“all” | Counter | SchemaPartition Cache 的访问次数 |
| cache | name=“DataPartition”, type=“hit” | Counter | DataPartition Cache 的命中次数 |
| cache | name=“DataPartition”, type=“all” | Counter | DataPartition Cache 的访问次数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| mem | name=“database_{name}” | AutoGauge | DataNode内对应DataRegion的内存占用,单位为byte |
| mem | name=“chunkMetaData_{name}” | AutoGauge | 写入TsFile时的ChunkMetaData的内存占用,单位为byte |
| mem | name=“IoTConsensus” | AutoGauge | IoT共识协议的内存占用,单位为byte |
| mem | name=“IoTConsensusQueue” | AutoGauge | IoT共识协议用于队列的内存占用,单位为byte |
| mem | name=“IoTConsensusSync” | AutoGauge | IoT共识协议用于同步的内存占用,单位为byte |
| mem | name=“schema_region_total_usage” | AutoGauge | 所有SchemaRegion的总内存占用,单位为byte |
| Metric | Tags | Type | Description |
|---|---|---|---|
| data_written | name=“compaction”, type=“aligned/not-aligned/total” | Counter | 合并时写入量 |
| data_read | name=“compaction” | Counter | 合并时的读取量 |
| compaction_task_count | name = “inner_compaction”, type=“sequence” | Counter | 顺序空间内合并次数 |
| compaction_task_count | name = “inner_compaction”, type=“unsequence” | Counter | 乱序空间内合并次数 |
| compaction_task_count | name = “cross_compaction”, type=“cross” | Counter | 跨空间合并次数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| process_used_mem | name=“memory” | AutoGauge | IoTDB 进程当前使用内存 |
| process_mem_ratio | name=“memory” | AutoGauge | IoTDB 进程的内存占用比例 |
| process_threads_count | name=“process” | AutoGauge | IoTDB 进程当前线程数 |
| process_status | name=“process” | AutoGauge | IoTDB 进程存活状态,1为存活,0为终止 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| jvm_classes_unloaded_classes | AutoGauge | 累计卸载的class数量 | |
| jvm_classes_loaded_classes | AutoGauge | 累计加载的class数量 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| jvm_compilation_time_ms | {compiler=“HotSpot 64-Bit Tiered Compilers”,} | AutoGauge | 耗费在编译上的时间 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| query_plan_cost | stage=“analyzer” | Timer | 查询语句分析耗时 |
| query_plan_cost | stage=“logical_planner” | Timer | 查询逻辑计划规划耗时 |
| query_plan_cost | stage=“distribution_planner” | Timer | 查询分布式执行计划规划耗时 |
| query_plan_cost | stage=“partition_fetcher” | Timer | 分区信息拉取耗时 |
| query_plan_cost | stage=“schema_fetcher” | Timer | 元数据信息拉取耗时 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| dispatcher | stage=“wait_for_dispatch” | Timer | 分发执行计划耗时 |
| dispatcher | stage=“dispatch_read” | Timer | 查询执行计划发送耗时 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| query_resource | type=“sequence_tsfile” | Rate | 顺序文件访问频率 |
| query_resource | type=“unsequence_tsfile” | Rate | 乱序文件访问频率 |
| query_resource | type=“flushing_memtable” | Rate | flushing memtable 访问频率 |
| query_resource | type=“working_memtable” | Rate | working memtable 访问频率 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| data_exchange_cost | operation=“source_handle_get_tsblock”, type=“local/remote” | Timer | source handle 接收 TsBlock 耗时 |
| data_exchange_cost | operation=“source_handle_deserialize_tsblock”, type=“local/remote” | Timer | source handle 反序列化 TsBlock 耗时 |
| data_exchange_cost | operation=“sink_handle_send_tsblock”, type=“local/remote” | Timer | sink handle 发送 TsBlock 耗时 |
| data_exchange_cost | operation=“send_new_data_block_event_task”, type=“server/caller” | Timer | sink handle 发送 TsBlock RPC 耗时 |
| data_exchange_cost | operation=“get_data_block_task”, type=“server/caller” | Timer | source handle 接收 TsBlock RPC 耗时 |
| data_exchange_cost | operation=“on_acknowledge_data_block_event_task”, type=“server/caller” | Timer | source handle 确认接收 TsBlock RPC 耗时 |
| data_exchange_count | name=“send_new_data_block_num”, type=“server/caller” | Histogram | sink handle 发送 TsBlock数量 |
| data_exchange_count | name=“get_data_block_num”, type=“server/caller” | Histogram | source handle 接收 TsBlock 数量 |
| data_exchange_count | name=“on_acknowledge_data_block_num”, type=“server/caller” | Histogram | source handle 确认接收 TsBlock 数量 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| driver_scheduler | name=“ready_queued_time” | Timer | 就绪队列排队时间 |
| driver_scheduler | name=“block_queued_time” | Timer | 阻塞队列排队时间 |
| driver_scheduler | name=“ready_queue_task_count” | AutoGauge | 就绪队列排队任务数 |
| driver_scheduler | name=“block_queued_task_count” | AutoGauge | 阻塞队列排队任务数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| query_execution | stage=“local_execution_planner” | Timer | 算子树构造耗时 |
| query_execution | stage=“query_resource_init” | Timer | 查询资源初始化耗时 |
| query_execution | stage=“get_query_resource_from_mem” | Timer | 查询资源内存查询与构造耗时 |
| query_execution | stage=“driver_internal_process” | Timer | Driver 执行耗时 |
| query_execution | stage=“wait_for_result” | Timer | 从resultHandle 获取一次查询结果的耗时 |
| operator_execution_cost | name=“{operator_name}” | Timer | 算子执行耗时 |
| operator_execution_count | name=“{operator_name}” | Counter | 算子调用次数(以 next 方法调用次数计算) |
| aggregation | from=“raw_data” | Timer | 从一批原始数据进行一次聚合计算的耗时 |
| aggregation | from=“statistics” | Timer | 使用统计信息更新一次聚合值的耗时 |
| series_scan_cost | stage=“load_timeseries_metadata”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 加载 TimeseriesMetadata 耗时 |
| series_scan_cost | stage=“read_timeseries_metadata”, type="", from=“cache/file” | Timer | 读取一个文件的 Metadata 耗时 |
| series_scan_cost | stage=“timeseries_metadata_modification”, type=“aligned/non_aligned”, from=“null” | Timer | 过滤删除的 TimeseriesMetadata 耗时 |
| series_scan_cost | stage=“load_chunk_metadata_list”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 加载 ChunkMetadata 列表耗时 |
| series_scan_cost | stage=“chunk_metadata_modification”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 过滤删除的 ChunkMetadata 耗时 |
| series_scan_cost | stage=“chunk_metadata_filter”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 根据查询过滤条件过滤 ChunkMetadata 耗时 |
| series_scan_cost | stage=“construct_chunk_reader”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 构造 ChunkReader 耗时 |
| series_scan_cost | stage=“read_chunk”, type="", from=“cache/file” | Timer | 读取 Chunk 的耗时 |
| series_scan_cost | stage=“init_chunk_reader”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 初始化 ChunkReader(构造 PageReader) 耗时 |
| series_scan_cost | stage=“build_tsblock_from_page_reader”, type=“aligned/non_aligned”, from=“mem/disk” | Timer | 从 PageReader 构造 Tsblock 耗时 |
| series_scan_cost | stage=“build_tsblock_from_merge_reader”, type=“aligned/non_aligned”, from=“null” | Timer | 从 MergeReader 构造 Tsblock (解乱序数据)耗时 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| schema_engine | name=“schema_region_total_mem_usage” | AutoGauge | SchemaRegion 全局内存使用量 |
| schema_engine | name=“schema_region_mem_capacity” | AutoGauge | SchemaRegion 全局可用内存 |
| schema_engine | name=“schema_engine_mode” | Gauge | SchemaEngine 模式 |
| schema_engine | name=“schema_region_consensus” | Gauge | 元数据管理引擎共识协议 |
| schema_engine | name=“schema_region_number” | AutoGauge | SchemaRegion 个数 |
| schema_region | name=“schema_region_mem_usage”, region=“SchemaRegion[{regionId}]” | AutoGauge | 每个 SchemaRegion 分别的内存使用量 |
| schema_region | name=“schema_region_series_cnt”, region=“SchemaRegion[{regionId}]” | AutoGauge | 每个 SchemaRegion 分别的时间序列数 |
| Metric | Tags | Type | Description |
|---|---|---|---|
| region | name=“{DatabaseName}”,type=“SchemaRegion/DataRegion” | AutoGauge | 特定节点上不同 Database 的 DataRegion/SchemaRegion 个数 |
| slot | name=“{DatabaseName}”,type=“schemaSlotNumber/dataSlotNumber” | AutoGauge | 特定节点上不同 Database 的 DataSlot/SchemaSlot 个数 |
目前还没有All级别的监控指标,后续会持续添加。
conf/iotdb-{datanode/confignode}.properties中,所有配置项支持通过load configuration命令热加载。对于使用 JMX 对外暴露的指标,可以通过 Jconsole 来进行查看。在进入 Jconsole 监控页面后,首先会看到 IoTDB 的各类运行情况的概览。在这里,您可以看到堆内存信息、线程信息、类信息以及服务器的 CPU 使用情况。
连接到 JMX 后,您可以通过 “MBeans” 标签找到名为 “org.apache.iotdb.metrics” 的 “MBean”,可以在侧边栏中查看所有监控指标的具体值。
连接到 JMX 后,您可以通过 “MBeans” 标签找到名为 “org.apache.iotdb.service” 的 “MBean”,如下图所示,了解服务的基本状态
为了提高查询性能,IOTDB 对 ChunkMetaData 和 TsFileMetaData 进行了缓存。用户可以使用 MXBean ,展开侧边栏org.apache.iotdb.db.service查看缓存命中率:
对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,其中 value 为具体值
| 监控指标类型 | 映射关系 |
|---|---|
| Counter | name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value |
| AutoGauge、Gauge | name{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value |
| Histogram | name_max{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_sum{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_count{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.0”} value name{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.5”} value name{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.99”} value name{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.999”} value |
| Rate | name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, rate=“m1”} value name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, rate=“m5”} value name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, rate=“m15”} value name_total{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, rate=“mean”} value |
| Timer | name_seconds_max{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_seconds_sum{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_seconds_count{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”} value name_seconds{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.0”} value name_seconds{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.5”} value value name_seconds{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.99”} value name_seconds{cluster=“clusterName”, nodeType=“nodeType”, nodeId=“nodeId”,k1=“V1” , ..., Kn=“Vn”, quantile=“0.999”} value |
dn_metric_reporter_list=PROMETHEUS dn_metric_level=CORE dn_metric_prometheus_reporter_port=9091
启动 IoTDB DataNode
打开浏览器或者用curl 访问 http://servier_ip:9091/metrics, 就能得到如下 metric 数据:
...
# HELP file_count
# TYPE file_count gauge
file_count{name="wal",} 0.0
file_count{name="unseq",} 0.0
file_count{name="seq",} 2.0
...
如上所示,IoTDB 对外暴露出标准的 Prometheus 格式的监控指标数据,可以使用 Prometheus 采集并存储监控指标,使用 Grafana 可视化监控指标。
IoTDB、Prometheus、Grafana三者的关系如下图所示:

从交互流程可以看出,我们需要做一些额外的工作来部署和配置Prometheus和Grafana。
比如,你可以对Prometheus进行如下的配置(部分参数可以自行调整)来从IoTDB获取监控数据
job_name: pull-metrics honor_labels: true honor_timestamps: true scrape_interval: 15s scrape_timeout: 10s metrics_path: /metrics scheme: http follow_redirects: true static_configs: - targets: - localhost:9091
更多细节可以参考下面的文档:
Prometheus从HTTP接口拉取metrics数据的配置说明
我们提供了Apache IoTDB Dashboard,在Grafana中显示的效果图如下所示:

Apache IoTDB Dashboard并使用在创建Grafana时,您可以选择Import刚刚下载的json文件,并为Apache IoTDB Dashboard选择对应目标数据源。
除特殊说明的监控项以外,以下监控项均保证在Important级别的监控框架中可用
Overview:系统概述Registered Node:注册的ConfigNode/DataNode个数DataNode(仅在 ConfigNode Leader 侧可见):集群DataNode的存活状态,包括Online和Unknown两种。ConfigNode(仅在 ConfigNode Leader 侧可见):集群ConfigNode的存活状态,包括Online和Unknown两种。The Status Of Node:集群具体节点运行状态,包括Online和Unkown两种。Region:Region概述Region Number:Region个数,包括总个数,DataRegion 个数和 SchemaRegion 个数。Leadership distribution:集群 Leader 分布情况,指每个节点上对应 Region 的 Leader 的个数。Total Region in Node:不同 Node 的 Region 总数量。Region in Node:不同 Node 的 SchemaRegion/DataRegion 数量。Region in Database(Normal级别):不同 Database 的 Region 数量,包括 SchemaRegion、DataRegion。Slot in Database(Normal级别):不同 Database 的Slot数量,包括 DataSlot 数量和 SchemaSlot 数量。System:系统CPU Core:系统 CPU 核数情况。CPU Load:系统 CPU 负载情况、进度 CPU 负载情况。CPU Time Per Minute:进程平均每分钟占用系统 CPU 时间,注意:多核会导致该值超过1分钟。System Memory:系统物理内存大小、系统使用物理内存大小、虚拟机提交的内存大小。System Swap Size:系统交换区总大小、系统交换区使用大小。Process Memory:IoTDB 进程最大内存总大小、IoTDB 进程总内存大小、IoTDB 进程使用内存大小。The Number of GC Per Minute:平均每分钟 GC 次数。The Time Consumed Of GC Per Minute:平均每分钟 GC 耗时。The Number Of Java Thread:IoTDB 进程的不同状态的线程数。Heap Memory:IoTDB 进程的堆内存Off Heap Memory:IoTDB 进程的堆外内存Log Number Per Minute:IoTDB 进程平均每分钟日志数The Time Consumed of Compliation Per Minute:平均每分钟编译耗时The Number Of Class:JVM 加载和卸载的类数量除特殊说明的监控项以外,以下监控项均保证在Important级别的监控框架中可用。
Overview:系统概述The Number Of Entity:实体数量,包含时间序列等Write Point Per Minute:每分钟系统平均写入点数Database Used Memory:每个 Database 使用的内存大小Interface:接口The Time Consumed Of Operation(50%):不同客户端操作耗时的中位数The Time Consumed Of Operation(99%):不同客户端操作耗时的P99The Time Consumed Of Operation(99.9%):不同客户端操作耗时的P999The OPS of Interface:系统接口每秒钟访问次数The Time Consumed Of Interface:系统接口的平均耗时Cache Hit Rate:缓存命中率Thrift Connection:建立的 Thrift 连接个数Thrift Active Thread:建立的活跃的 Thrift 连接的个数Engine:引擎Task Number:系统中不同状态的任务个数The Time Consumed Of Tasking:系统中不同状态的任务的耗时Compaction Read And Write Per Minute:平均每分钟合并读取和写入数据量Compaction R/W Ratio Per Minute:平均每分钟合并读取和写入数据比Compaction Number Per Minute:平均每分钟不同类型的合并任务数量Query Engine:查询引擎The time consumed of query plan stages(avg\50%\99%\99.9%):查询规划各阶段耗时的平均值\中位数\P99\P999The time consumed of plan dispatch stages(avg\50%\99%\99.9%):查询计划分发耗时的平均值\中位数\P99\P999The time consumed of query execution stages(avg\50%\99%\99.9%):查询执行各阶段耗时的平均值\中位数\P99\P999The time consumed of operator execution stages(avg\50%\99%\99.9%):查询算子耗时的平均值\中位数\P99\P999The time consumed of query aggregation(avg\50%\99%\99.9%):查询聚合计算耗时的平均值\中位数\P99\P999The time consumed of query scan(avg\50%\99%\99.9%):查询文件/内存耗时的平均值\中位数\P99\P999The usage of query resource(avg\50%\99%\99.9%):查询不同资源访问数量的平均值\中位数\P99\P999The time consumed of query data exchange(avg\50%\99%\99.9%):查询数据传输耗时的平均值\中位数\P99\P999The count of data exchange(avg):查询数据传输平均次数The count of data exchange:查询数据传输次数的分布情况(最小值、下四分位数、中位数、上四分位数、最大值)The number of query queue:查询不同队列的大小The time consumed of query schedule time(avg\50%\99%\99.9%):查询任务调度耗时的平均值\中位数\P99\P999Query Interface:查询文件/耗时的具体耗时情况The time consumed of load timesereis metadata(avg\50%\99%\99.9%):查询从不同来源加载时间序列元数据耗时的平均值\中位数\P99\P999The time consumed of read timeseries metadata(avg\50%\99%\99.9%):查询从不同来源读取时间序列元数据耗时的平均值\中位数\P99\P999The time consumed of timeseries metadata modiftication(avg\50%\99%\99.9%):查询修改不同类型时间序列元数据耗时的平均值\中位数\P99\P999The time consumed of load chunk metadata list(avg\50%\99%\99.9%):查询加载不同类型Chunk元数据耗时的平均值\中位数\P99\P999The time consumed of chunk metadata modification(avg\50%\99%\99.9%):查询修改不同类型Chunk元数据耗时的平均值\中位数\P99\P999The time consumed of chunk metadata filter(avg\50%\99%\99.9%):查询过滤不同类型Chunk元数据耗时的平均值\中位数\P99\P999The time consumed of construct chunk reader(avg\50%\99%\99.9%):查询构造不同类型Chunk读取器耗时的平均值\中位数\P99\P999The time consumed of read chunk(avg\50%\99%\99.9%):查询读取不同类型Chunk耗时的平均值\中位数\P99\P999The time consumed of init chunk reader(avg\50%\99%\99.9%):查询初始化不同类型Chunk读取器耗时的平均值\中位数\P99\P999The time consumed of build tsblock from page reader(avg\50%\99%\99.9%):查询从PageReader构造TsBlock耗时的平均值\中位数\P99\P999The time consumed of build tsblock from merge reader(avg\50%\99%\99.9%):查询从MergeReader构造TsBlock耗时的平均值\中位数\P99\P999Query Data Exchange:查询数据传输的具体耗时情况The time consumed of source handle get tsblock(avg\50%\99%\99.9%):查询从不同来源获取TsBlock的耗时的平均值\中位数\P99\P999The time consumed of source handle deserialize tsblock(avg\50%\99%\99.9%):查询从不同来源反序列化TsBlock的耗时的平均值\中位数\P99\P999The time consumed of sink handle send tsblock(avg\50%\99%\99.9%):查询向不同地方发送TsBlock的耗时的平均值\中位数\P99\P999The time consumed of on acknowledge data block event task(avg\50%\99%\99.9%):查询从不同地方确认Block耗时的平均值\中位数\P99\P999The time consumed of get data block event task(avg\50%\99%\99.9%):查询从不同地方获取Block耗时的平均值\中位数\P99\P999IoTConsensus:IoT共识协议IoTConsensus Used Memory:IoT共识层使用的内存大小IoTConsensus Sync Index:不同的Region的写入Index和同步IndexIoTConsensus Overview:不同节点的同步总差距、总缓存的请求个数The time consumed of different stages(50%):不同阶段耗时的中位数The time consumed of different stages(99%):不同阶段耗时的P99The time consumed of different stages(99.9%):不同阶段耗时的P999IoTConsensus Search Index Rate:不同region的写入Index的增长速度IoTConsensus Safe Index Rate:不同region的同步Index的增长速度IoTConsensus LogDispatcher Request Size:不同的LogDispatcherThread缓存的请求个数Sync Lag:每个region的同步index差距Min Peer Sync Lag:每个region的写入index和同步最快的LogDispatcherThread的同步index之间的差距Sync speed diff of Peers:每个region中同步最快的LogDispatcherThread与同步最慢的LogDispatcherThread之间的同步index差距System:系统CPU Core:系统 CPU 核数情况。CPU Load:系统 CPU 负载情况、进度 CPU 负载情况。CPU Time Per Minute:进程平均每分钟占用系统 CPU 时间,注意:多核会导致该值超过1分钟。System Memory:系统物理内存大小、系统使用物理内存大小、虚拟机提交的内存大小。System Swap Size:系统交换区总大小、系统交换区使用大小。Process Memory:IoTDB 进程最大内存总大小、IoTDB 进程总内存大小、IoTDB 进程使用内存大小。The Size Of File:IoTDB系统相关的文件大小,包括wal下的文件总大小、seq下的tsfile文件总大小、unseq下的tsfile文件总大小The Number Of File:IoTDB系统相关的文件个数,包括wal下的文件个数、seq下的tsfile文件个数、unseq下的tsfile文件个数The Space Of Disk:当前data目录所挂载的磁盘总大小和剩余大小The Number of GC Per Minute:平均每分钟 GC 次数。The Time Consumed Of GC Per Minute:平均每分钟 GC 耗时。The Number Of Java Thread:IoTDB 进程的不同状态的线程数。Heap Memory:IoTDB 进程的堆内存Off Heap Memory:IoTDB 进程的堆外内存Log Number Per Minute:IoTDB 进程平均每分钟日志数The Time Consumed of Compliation Per Minute:平均每分钟编译耗时The Number Of Class:JVM 加载和卸载的类数量除特殊说明的监控项以外,以下监控项均保证在Core级别的监控框架中可用。
Overview:系统概述CPU Core:系统 CPU 核数情况。Total Disk Space:系统 data 目录挂载的磁盘总大小System Memory:系统内存总大小Swap Memory:系统交换区内存大小Total Timeseries:系统当前时间序列总数量Total File Number:系统文件总数量CPU Load:系统 CPU 负载率,单位为%Disk:系统 Disk 占比率,单位为%Process Memory:进程内存使用率,单位为%System Memory: 系统内存使用率,单位为%Write Point Per Second:系统每秒中写入点数Performance:系统性能OPS:系统接口和RPC每秒钟访问次数OPS Of Stage:Stage 各部分的每秒钟执行次数OPS Of Schedule:Schedule 各部分的每秒钟执行次数Time Consumed Of Operation:不同操作的耗时情况P99 Time Consumed of Interface:不同接口的 P99 耗时情况Average Time Consumed of Interface:不同接口的平均耗时情况P99 Time Consumed of Stage:不同阶段的 P99 耗时情况Average Time Consumed of Stage:不同阶段的平均耗时情况P99 Time Consumed of Schedule Stage:不同 Schedule 阶段的 P99 耗时情况Average Time Consumed of Schedule Stage:不同 Schedule 阶段的平均耗时情况Task Number:任务个数P99 Time Consumed of Task:任务的 P99 耗时情况Average Time Consumed of Task:任务的平均耗时情况System:系统CPU Load:CPU 负载变化情况CPU Time Per Minute:CPU 平均每分钟的耗时GC Time Per Minute:GC 平均每分钟的耗时Heap Memory:IoTDB 进程的堆内存Off Heap Memory:IoTDB 进程的堆外内存The Number Of Java Thread:IoTDB 进程的不同状态的线程数。File Count:文件数量变化情况File Size:文件大小变化情况Log Number Per Minute:日志每分钟变化情况对于 Metric Name 为 name, Tags 为 K1=V1, ..., Kn=Vn 的监控指标有如下映射,以默认写到 root.__system.metric.
clusterName.nodeType.nodeId为例
| 监控指标类型 | 映射关系 |
|---|---|
| Counter | root.__system.metric.clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.value |
| AutoGauge、Gauge | root.__system.metric.clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.value |
| Histogram | root.__system.metric.clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.count root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.max root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.sum root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p0 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p50 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p75 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p99 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p999 |
| Rate | root.__system.metric.clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.count root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.mean root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m1 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m5 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m15 |
| Timer | root.__system.metric.clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.count root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.max root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.mean root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.sum root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p0 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p50 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p75 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p99 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.p999 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m1 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m5 root.__system.metric. clusterName.nodeType.nodeId.name.K1=V1...Kn=Vn.m15 |
根据如上的映射关系,可以构成相关的 IoTDB 查询语句获取监控指标