# BT.stats

## 功能

返回当前 BT 进程的运行期资源统计，用于定位 I/O 运行边界、后台任务、定时器、网络服务和 VM 缓存状态。

## 语法

```bt
BT.stats()
```

## 参数

| 参数 | 类型 | 必填 | 默认值 | 说明 |
| ------ | ------ | ------ | ------ | ------ |
| 无 | - | 否 | 无 | 不需要参数。 |

## 返回值

| 类型 | 说明 |
| ------ | ------ |
| Object | 返回运行期资源统计对象。字段见下方“返回对象字段”。 |

## 返回对象字段

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| uptime | Int | 是 | 当前 BT 进程已运行秒数，按当前 Unix 时间戳减 `start_time` 计算。 |
| threads | Int | 是 | 当前系统可用并行线程数。读取失败时返回 `1`。 |
| start_time | Int | 是 | BT 进程启动时间戳，单位秒。 |
| io | Object | 是 | 进程级 I/O runtime 和 blocking pool 的配置、活动数、完成数、拒绝数、超时数。 |
| task | Object | 是 | 后台 task 执行器是否启动、队列上限、工作线程、排队数、运行数、完成数、拒绝数。 |
| timer | Object | 是 | 定时器运行时是否启动、活动定时器数、调度堆条目数、上限和单 VM 事件队列上限。 |
| net | Object | 是 | 网络 Web 服务数、事件型服务数、有界事件队列、连接和消息资源上限。 |
| http | Object | 是 | HTTP client 池配置、条目数、命中数、淘汰数、创建失败数和慢调用数。 |
| mysql | Object | 是 | MySQL 普通查询连接池配置、DSN 分组数、连接数、命中数、淘汰数、创建失败数和慢调用数。 |
| bytes | Object | 是 | Bytes 缓冲上限和配置错误。 |
| cache | Object | 是 | 当前线程 include 编译缓存和模板片段缓存条目数、字节数、命中、失效和淘汰统计。 |
| permission | Object | 是 | 权限配置快照、当前实际允许能力和权限拒绝次数。 |

I/O 默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_IO_WORKERS | CPU 线程数，最大 64 | 共享 Tokio runtime 工作线程数。 |
| BT_IO_BLOCKING_WORKERS | CPU 线程数，最大 64 | 有界 blocking pool 工作线程数。 |
| BT_IO_BLOCKING_QUEUE | 256，最大 8192 | blocking pool 等待队列长度。 |
| BT_IO_TIMEOUT_MS | 30000 | 默认同步等待超时时间，单位毫秒。 |
| BT_IO_SHUTDOWN_TIMEOUT_MS | 1000 | blocking pool 关闭等待时间，单位毫秒。 |

io 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| async_runtime_started | Bool | 是 | 共享 Tokio runtime 是否已经初始化。 |
| async_active | Int | 是 | 当前正在执行的异步 I/O 任务数量。 |
| async_completed | Int | 是 | 已完成的异步 I/O 任务数量。 |
| async_failed | Int | 是 | 执行失败的异步 I/O 任务数量。 |
| async_timeouts | Int | 是 | 同步等待异步任务结果时发生超时的次数。 |
| async_rejected | Int | 是 | 因运行时关闭或调度失败被拒绝的异步任务数量。 |
| blocking_pool_started | Bool | 是 | 有界 blocking pool 是否已经初始化。 |
| blocking_queued | Int | 是 | 当前排队等待执行的 blocking 任务数量。 |
| blocking_running | Int | 是 | 当前正在执行的 blocking 任务数量。 |
| blocking_completed | Int | 是 | 已完成的 blocking 任务数量。 |
| blocking_rejected | Int | 是 | 因队列满或线程池关闭被拒绝的 blocking 任务数量。 |
| blocking_timeouts | Int | 是 | blocking 任务等待结果超时次数。 |
| blocking_shutdown | Bool | 是 | blocking pool 是否已经进入关闭状态。 |
| config | Object | 是 | I/O 配置快照，包含 `async_workers`、`blocking_workers`、`blocking_queue_limit`、`default_timeout_ms`、`shutdown_timeout_ms`。 |

io.config 字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| async_workers | Int | 是 | 共享 Tokio runtime 工作线程数。 |
| blocking_workers | Int | 是 | 有界 blocking pool 工作线程数。 |
| blocking_queue_limit | Int | 是 | blocking pool 等待队列长度上限。 |
| default_timeout_ms | Int | 是 | 默认同步等待超时时间，单位毫秒。 |
| shutdown_timeout_ms | Int | 是 | blocking pool 关闭等待时间，单位毫秒。 |

task 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| executor_started | Bool | 是 | 后台 task 执行器是否已经初始化。 |
| queue_limit | Int | 是 | 后台 task 等待队列长度上限。 |
| workers | Int | 是 | 后台 task worker 数量。 |
| queued | Int | 是 | 当前排队等待执行的 task 数量。 |
| running | Int | 是 | 当前正在执行的 task 数量。 |
| completed | Int | 是 | 已完成的 task 数量。 |
| rejected | Int | 是 | 因队列满或执行器关闭被拒绝的 task 数量。 |

timer 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| runtime_started | Bool | 是 | 定时器运行时是否已经初始化。 |
| active | Int | 是 | 当前活动定时器数量。 |
| queued | Int | 是 | 当前调度堆中的定时器条目数量。 |
| limit | Int | 是 | 当前进程允许的活动定时器数量上限。 |
| event_queue_limit | Int | 是 | 单个 VM 定时器事件队列长度上限。 |

net 默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_NET_EVENT_QUEUE | 4096，最大 65536 | TCP、UDP、WebSocket 后台事件投递到 VM 的有界队列长度。 |
| BT_NET_CONNECTION_LIMIT | 4096，最大 65536 | 单协议连接或 socket 数量上限。 |
| BT_NET_MESSAGE_LIMIT | 1048576，最大 16777216 | 单条 TCP/UDP/WebSocket 消息字节上限。 |
| BT_NET_WRITE_QUEUE | 1024，最大 8192 | 单个 TCP/WebSocket 连接的待写命令队列长度。 |
| BT_NET_IDLE_TTL_MS | 0 | TCP/WebSocket 连接空闲关闭时间，单位毫秒；0 表示不因空闲主动关闭。 |

net 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| runtime_started | Bool | 是 | 网络运行时是否已经初始化。 |
| web_services | Int | 是 | 当前由 `net.listen({type:'web'})` 或 Web 运行器持有的 Web 服务数量。 |
| event_services | Int | 是 | 当前 TCP、UDP、WebSocket 事件型服务数量。 |
| event_queue_bounded | Bool | 是 | 是否启用有界网络事件队列。当前固定为 `true`。 |
| event_queue_limit | Int/Empty | 是 | 网络事件队列上限。未启用事件队列时为 `empty`。 |
| event_queue_queued | Int | 是 | 当前等待 VM 分发的网络事件数量。 |
| event_queue_sent | Int | 是 | 已成功投递到 VM 的网络事件数量。 |
| event_queue_rejected | Int | 是 | 因队列满或通道关闭被拒绝的网络事件数量。 |
| connection_limit | Int | 是 | 单协议连接或 socket 数量上限。 |
| message_limit | Int | 是 | 单条消息字节上限。 |
| write_queue_limit | Int | 是 | 单连接写队列上限。 |
| idle_ttl_ms | Int | 是 | TCP/WebSocket 连接空闲关闭时间，单位毫秒；`0` 表示关闭该策略。 |

Bytes 默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_BYTES_LIMIT | 16777216，最大 67108864 | 单个 Bytes 缓冲最大字节数。 |

bytes 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| limit | Int | 是 | 单个 Bytes 缓冲上限，单位字节。 |
| config_error | String/Empty | 是 | Bytes 配置错误文本；无错误时为 `empty`。 |

cache 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| compiled_file_entries | Int | 是 | 当前线程 include/Web 入口文件编译缓存条目数。 |
| compiled_file_limit | Int | 是 | 当前线程文件编译缓存条目上限。 |
| compiled_file_bytes | Int | 是 | 当前线程文件编译缓存估算字节数。 |
| compiled_file_bytes_limit | Int | 是 | 当前线程文件编译缓存估算字节上限。 |
| compiled_file_hits | Int | 是 | 文件编译缓存命中次数。 |
| compiled_file_misses | Int | 是 | 文件编译缓存未命中次数。 |
| compiled_file_invalidations | Int | 是 | 文件元信息、源码指纹、源码模式、编译配置或字节码格式变化导致的失效次数。 |
| compiled_file_evictions | Int | 是 | 文件编译缓存因条目数或字节数达到上限而淘汰的次数。 |
| compiled_file_fingerprint_checks | Int | 是 | 对最近修改文件执行内容指纹复核的次数。 |
| template_fragment_entries | Int | 是 | 当前线程模板片段编译缓存条目数。 |
| template_fragment_limit | Int | 是 | 当前线程模板片段缓存条目上限。 |
| template_fragment_bytes | Int | 是 | 当前线程模板片段缓存估算字节数。 |
| template_fragment_bytes_limit | Int | 是 | 当前线程模板片段缓存估算字节上限。 |
| template_fragment_hits | Int | 是 | 模板片段缓存命中次数。 |
| template_fragment_misses | Int | 是 | 模板片段缓存未命中次数。 |
| template_fragment_evictions | Int | 是 | 模板片段缓存因条目数或字节数达到上限而淘汰的次数。 |
| template_fragment_bypassed | Int | 是 | 模板片段过大或超过缓存容量时跳过缓存的次数。 |
| template_fragment_max_code_bytes | Int | 是 | 单个模板片段允许缓存的最大源码字节数。 |

permission 默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_PERMISSION_ALLOW | 未配置 | 允许能力列表。配置后只允许列表内能力；支持 `fs`、`process`、`net`、`http`、`mysql`、`device`、`env`、`desktop`、`all`、`none`。 |
| BT_PERMISSION_DENY | 未配置 | 拒绝能力列表。拒绝列表优先级高于允许列表。 |

permission 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| denied | Int | 是 | 当前进程内权限拒绝次数。 |
| config | Object | 是 | 权限配置快照。字段见下方 `permission.config 字段`。 |

permission.config 字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| allow_configured | Bool | 是 | 是否显式配置了 `BT_PERMISSION_ALLOW`。 |
| allow | Array | 是 | 允许列表中的能力名称；未配置时返回全部能力。 |
| deny | Array | 是 | 拒绝列表中的能力名称。 |
| allowed | Array | 是 | 当前实际允许的能力名称。 |
| config_error | String/Empty | 是 | 权限配置错误文本；没有错误时为 `empty`。 |

HTTP client 池默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_HTTP_CLIENT_POOL | true | 是否启用 HTTP client 池。 |
| BT_HTTP_CLIENT_POOL_LIMIT | 32，最大 1024 | 最多保留的 client 配置分组数量。 |
| BT_HTTP_CLIENT_IDLE_TTL_MS | 300000 | client 空闲保留时间，单位毫秒；0 表示不按空闲时间淘汰。 |
| BT_HTTP_SLOW_MS | 0 | 慢 HTTP 调用日志阈值，单位毫秒；0 表示关闭。 |

http 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| pool_started | Bool | 是 | HTTP client 池是否已经初始化。 |
| entries | Int | 是 | 当前池内 client 条目数。 |
| hits | Int | 是 | 池命中次数。 |
| misses | Int | 是 | 池未命中次数。 |
| created | Int | 是 | client 创建次数。 |
| evicted | Int | 是 | client 淘汰次数。 |
| bypassed | Int | 是 | 因关闭池或 Cookie 存储语义而绕过池的次数。 |
| build_failed | Int | 是 | client 创建失败次数。 |
| slow_calls | Int | 是 | 超过 `BT_HTTP_SLOW_MS` 的慢调用次数。 |
| config | Object | 是 | 当前 HTTP client 池配置。字段见下方 `http.config 字段`。 |

http.config 字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| enabled | Bool | 是 | 是否启用 HTTP client 池。 |
| pool_limit | Int | 是 | 最多保留的 client 配置分组数量。 |
| idle_ttl_ms | Int | 是 | client 空闲保留时间，单位毫秒；`0` 表示不按空闲时间淘汰。 |
| slow_ms | Int | 是 | 慢 HTTP 调用日志阈值，单位毫秒；`0` 表示关闭。 |
| config_error | String/Empty | 是 | HTTP client 池配置错误文本；没有错误时为 `empty`。 |

MySQL 普通查询连接池默认配置：

| 环境变量 | 默认值 | 说明 |
| ------ | ------ | ------ |
| BT_MYSQL_POOL | true | 是否启用普通查询全局连接池。 |
| BT_MYSQL_POOL_LIMIT | 16，最大 256 | 最多保留的 DSN 分组数量。 |
| BT_MYSQL_POOL_MIN_CONNECTIONS | 0 | 每个连接池最小连接数。 |
| BT_MYSQL_POOL_MAX_CONNECTIONS | 8，最大 1024 | 每个连接池最大连接数。 |
| BT_MYSQL_POOL_IDLE_TTL_MS | 300000 | 连接池空闲保留时间，单位毫秒；0 表示不按空闲时间淘汰。 |
| BT_MYSQL_CONNECT_TIMEOUT_MS | 5000 | 获取连接的超时时间，单位毫秒。 |
| BT_MYSQL_QUERY_TIMEOUT_MS | 30000 | 单次 SQL 调用同步等待超时时间，单位毫秒。 |
| BT_MYSQL_SLOW_MS | 0 | 慢 MySQL 调用日志阈值，单位毫秒；0 表示关闭。 |

mysql 主要字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| pool_started | Bool | 是 | MySQL 全局连接池是否已经初始化。 |
| entries | Int | 是 | 当前池内 DSN 分组数量，不包含 DSN 明文。 |
| connections | Int | 是 | 当前 SQLx 池中已打开连接总数。 |
| idle_connections | Int | 是 | 当前 SQLx 池中空闲连接总数。 |
| hits | Int | 是 | 池命中次数。 |
| misses | Int | 是 | 池未命中次数。 |
| created | Int | 是 | 池创建次数。 |
| evicted | Int | 是 | 池淘汰次数。 |
| bypassed | Int | 是 | 因关闭全局池而绕过池的次数。 |
| build_failed | Int | 是 | 池创建失败次数。 |
| slow_calls | Int | 是 | 超过 `BT_MYSQL_SLOW_MS` 的慢调用次数。 |
| transactions_active | Int | 是 | 当前活动事务数量。 |
| transactions_started | Int | 是 | 事务开始次数。 |
| transactions_committed | Int | 是 | 事务提交次数。 |
| transactions_rolled_back | Int | 是 | 事务回滚次数，包含 `close()` 对活动事务执行的默认回滚。 |
| transactions_closed | Int | 是 | `close()` 成功关闭活动事务次数。 |
| transactions_failed | Int | 是 | 事务开始、提交、回滚或关闭失败次数。 |
| config | Object | 是 | 当前 MySQL 池配置。字段见下方 `mysql.config 字段`。 |

mysql.config 字段：

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| enabled | Bool | 是 | 是否启用普通查询全局连接池。 |
| pool_limit | Int | 是 | 最多保留的 DSN 分组数量。 |
| min_connections | Int | 是 | 每个连接池最小连接数。 |
| max_connections | Int | 是 | 每个连接池最大连接数。 |
| idle_ttl_ms | Int | 是 | 连接池空闲保留时间，单位毫秒；`0` 表示不按空闲时间淘汰。 |
| connect_timeout_ms | Int | 是 | 获取连接的超时时间，单位毫秒。 |
| query_timeout_ms | Int | 是 | 单次 SQL 调用同步等待超时时间，单位毫秒。 |
| slow_ms | Int | 是 | 慢 MySQL 调用日志阈值，单位毫秒；`0` 表示关闭。 |
| config_error | String/Empty | 是 | MySQL 池配置错误文本；没有错误时为 `empty`。 |

## 代码示例

```bt
stats = BT.stats()
result = stats.http.config.pool_limit

// 输出：32
print result
```

## 注意事项

- `BT.stats()` 按需读取统计，不会在 VM 普通指令执行时维护重型计数。
- `cache` 统计只反映当前线程的 VM 线程本地缓存；Web 多 worker 场景下，每个 worker 会各自维护缓存。
- 文件编译缓存稳定命中时只检查 mtime、长度和版本；最近修改的文件会低频复核内容指纹，避免同长度快速改写后执行旧字节码。
- `net.event_queue_rejected` 大于 0 表示网络事件队列发生过满载，TCP/WebSocket 消息事件会触发连接关闭，UDP 报文会被丢弃。
- `http.bypassed` 增长通常表示关闭了 HTTP client 池，或请求启用了 `cookie_store(true)`。
- `mysql.entries`、`mysql.connections` 和事务统计不包含 DSN 明文或密码；连接失败和慢调用日志也会避免输出 DSN 密码。
- `bytes.limit` 控制脚本和 I/O 边界能创建的单个 Bytes 最大长度，避免二进制缓冲无上限增长。
- `permission.denied` 大于 0 表示脚本触发过被当前配置拒绝的能力；权限拒绝是明确运行时错误，不会返回 `empty`。
- I/O 环境变量配置错误会在第一次使用相关 I/O 能力时报错，不会静默回退到危险默认值。
