---
name: system-observability
description: Microi 系统日志/监控查询、诊断与治理规范。用于分析系统日志、Trace、热点接口、CPU/内存吃满、OOM、异常分配、接口引擎/V8 事件归因、重启事故恢复、网络流量、安全事件和监控性能成本。
---

> **Codex 非阻塞自动更新：** 当前宿主为 Codex 时，吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新；需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。

# Microi 系统日志/监控

本 Skill 用于读取、解释、扩展和验收 Microi 的统一【系统日志/监控】能力。它不授权查看其它租户、绕过菜单/平台管理员权限，或把当前节点样本扩写成全局结论。

## 大权限对象与 SQL 参数处理回归
- 浏览器 Pinia 持久化应按已选字段独立深度监听，缓存序列化片段；非持久化的时钟/加载状态不得触发完整权限遍历，主题变化不得重新序列化用户。权限嵌套修改、登录退出、显式保存、恢复钩子、失败恢复和 dispose 必须回归，嵌入 WebOS 窗口保持只读存储边界。前端镜像验收与后端分开记录。
待办的多项只读计数由内部 `IFormEngineReadOnlyCountRuntime` 在一个批次中拥有一份独立身份；业务参数不能提供非空 `_CurrentUser`，每项仍经过原表单查询与租户/角色/数据范围检查，事务内顺序执行。抄送分页及可能执行行 V8 的 CRUD 保留独立身份。私有文件 HTTP 原子可接收本次 DiyToken 验证后独占的身份，后台可信上下文仍复制；资源引用、权限、审计和 `Limit=true` 不变。上述优化需要更新后端镜像，不能靠修改 V8 参数来启用或跳过鉴权。

- `FromSection.formatSql` 是 ORM 结果缓存键处理，独立于页面 SQL 展示。大型 IN 权限快照需测试这条真实路径的分配量、参数前缀、字面量、替换值含参数文本、空值和缓存键稳定性；禁止用逐参数 `String.Replace`。单对象 HTTP 表单仅可转交本次 DiyToken 验证后独立身份，批量行与已有 JSON 持有者必须保留副本，不能推广为共享可变身份缓存。

- 保持用户需要的 `PrintSqlToPage` 开启。参数准备、页面可执行 SQL 与慢日志不得逐参数扫描和复制整条 SQL；使用单次扫描，并测试字符串、注释、参数名前缀、替换值含参数文本及完整页面输出。
- 动态 FormEngine 参数不得把 `_CurrentUser` 复制进业务行数据；一轮转换只拥有一份独立身份树，不能为性能共享可变用户缓存或修改调用方对象。用接近实际规模的权限树测量分配，并验证租户、访问密钥、角色和可变子对象隔离。
- 接口引擎正常、异常与慢日志使用 `ApiEngineLogParameters.Serialize`，在序列化前排除顶层内部 `_CurrentUser`，用户仍由独立 UserId/UserName 字段记录；业务嵌套同名字段、类型和空值保留，不修改原参数。不允许先深复制/序列化权限树再截断。托管文件 URL、后台任务和菜单接口向可信原子只投影业务参数，后端仍独立验证身份、租户和资源权限。

登录身份权限异常膨胀时，先比对 sys_rolelimit 的有效行与 IsDeleted=1 历史行。原生权限快照与菜单授权编辑只加载有效权限，IsDeleted 为 NULL 的存量记录仍有效；没有该列的旧表保持兼容，新增列后立即采用过滤，元数据或查询异常不回退为全量授权。该修复需要更新后端镜像；已有登录缓存通过正常重新登录或 RefreshToken 刷新，不删除权限历史，不改变 DiyToken、角色/数据范围或 PrintSqlToPage。用真实数据库回归旧表、新列、撤销权限、无权限角色、注入参数和查询失败，不能仅凭身份体积下降宣称请求耗时已经恢复。

接口引擎构造脚本参数时，顶层 `_CurrentUser` 属于宿主保留身份，不再复制到 `V8.Param`；脚本读取已认证身份应使用 `V8.CurrentUser`。权限树仍保留完整内容，身份验证、令牌撤销、访问密钥范围、跨租户检查和独立脚本快照保持执行；嵌套业务对象中同名字段仍保留。实时通知检测只读取成功结果的 Code 与 DataAppend，避免为了检查不存在的事件而序列化整份用户/列表/文件 Data；事件字段白名单、大小限制、提交后发送和订阅权限不变。两项优化都需要更新后端镜像。
- 公共鉴权的角色基础权限读取只检查 `_Roles`，不得复制整份用户的表/菜单权限树；显式 Bearer 请求在同一过滤器中只加载一次有效会话。优化必须保留签名、过期、安全版本、租户一致性、Redis 活动令牌、历史敏感字段清理及访问密钥撤销/范围检查；不得用跨请求身份缓存或共享可变 V8 用户对象换取速度。
- 分层归因同时核对 `FormAuthorization` 与其内部 `AuthorizationVersion`；原生 Redis 授权版本读取不经过通用 `RedisRead`，不能只用后者排除缓存等待。
- HTTP Controller 到首个接口引擎可单次交接已经实时验证的身份；交接必须绑定原始参数对象和同一 HttpContext，不能放入 JSON/可复制注解。参数克隆、租户或身份投影变化、重复消费、后续请求及嵌套调用均回到原验证路径。脱敏须继续覆盖全部嵌套字段，优化临时分配不能跳过大权限树。
- V8 AI 代理在创建时固定不可变身份，首次调用 AI 才构造可变 JSON；普通 V8 不应为未使用的 AI 复制完整权限树。必须测试脚本修改后的身份隔离、全部权限保留、JSON 类型/注解和二进制值隔离，不能延迟读取仍由脚本持有的身份对象。
- 原生统计失败时不自动重跑全部兼容查询。兼容回退只处理能力确实缺失的旧后端，避免故障放大。
- 用相同测试记录修复前失败、修复后通过；实际请求需区分冷启动、稳定调用、页面并发、数据库执行与 HTTP 总耗时。镜像、应用包和线上节点分别验收。

## 请求等待分层归因

- 用唯一 TraceId 对齐浏览器计时与 `RecentRequests[].Latency`，分别解释发出前排队、首字节等待、响应接收和服务端顺序阶段；不能将总耗时减 TTFB 当作下载时间。
- `Latency.Parts` 是含子调用、可能并行的累计墙钟时间，不可相加或等同 CPU。连接打开/连接池等待与 SQL 命令分开；Reader 后续读行不计入 DatabaseCommand。
- `RuntimeIntervals` 是当前节点最近 30 个约 1 秒同窗样本。分别核对 CPU 执行、I/O wait、steal、GC 暂停、线程池积压、采样唤醒延迟和 cgroup 节流；缺值按不可用处理。旧 Linux CPU 百分比包含 I/O wait，不能直接判定计算饱和。
- `Memory.HelperProcesses.Collector/RecoveryAnalyzer` 是当前 API 管理的诊断采集/恢复子进程。两次查询间的 CPU 结合 PID、启动时间和 RSS 判断监控成本；首次、重建、不可用时 CPU 为 null。它不是 NAS 全部进程清单，不能将剩余主机负载直接归给某个服务。
- `Snapshot(includeHost:true)` 的 `Host.Processes`（`process-resources/v1`）每 5 秒持续采样，CPU/RSS/Swap/I/O 前 10 名及最近 12 次样本；核对 Fresh、Scope、HostProcessesVisible、不可读/缺项计数。CPU 100% 是一核；首次、PID 重用、计数重置为 null，RSS 不能累加作独占内存。不采命令行/环境变量。Linux 无固定只读 `/proc:/host/proc:ro` 挂载时只声明当前 PID 命名空间，不能声称看到了全部宿主进程；镜像更新不能新增挂载，不能为诊断开放 Docker socket 或特权容器。
- `Host.DiskIO.Devices` 包含 SATA/NVMe/RAID/映射设备的速率、IOPS、BusyPercent、AwaitMs 和 InFlight；分区按 sysfs 标记识别，名称以数字结尾不能排除。汇总只累加物理整盘，避免与 RAID/dm 双计；独立时间窗，首次/重置速率为 null。Docker 不可访问不等于宿主没有 Docker。
- 宿主进程排名的 CPU/IO 速率分别使用每个进程计数器的实际读取时间窗 `CpuWindowSeconds / IoWindowSeconds`，顶层 `WindowSeconds` 只是扫描周期。GC 或调度暂停导致扫描耗时变长时，不能继续用扫描开始时间作为计数分母；单次计数读取超过 250 ms 则该次时间无效，速率为 null。旧后端长扫描的 CPU 尖峰不能直接用来证明宿主饱和。
- `Trace.RuntimeRequests` 只从当前租户、当前节点最近 500 个请求中返回最多 20 个匹配记录；淘汰和重启导致缺证，不代表快。协议为 `request-latency/v1`，现有 MCP 查询参数不变；本次底层指标没有新增商城声明式资源，后端升级即可读取。

- 批量角标/计数变慢时核对 Identity 次数是否随项数增长。只读 `GetTableDataCountBatch` 允许批内复用一份脱离缓存的可信身份；保留逐项表权限/数据范围、跨批次实时校验及普通 CRUD 的可变身份隔离，不能把该优化扩展为跨请求缓存权限或共享脚本可修改身份。
- `RoutingMs` 包含在 `BeforeActionMs` 中；路由阶段也可能访问缓存和数据库，不可只看 Controller/表单内部计时。

## 先选入口

| 目标 | 推荐入口 |
|---|---|
| 人工排查、看趋势、打开日志详情 | 平台菜单【系统日志/监控】 |
| AI 查询、自动诊断、验收 | MCP `microi_query_system_observability` |
| AI 封禁或解封 IP | MCP `microi_manage_system_observability` |
| 连接池耗尽时在线诊断/恢复 | 查询 `DatabasePools / DatabasePoolRecovery`，治理 `ResetDatabasePools` |
| 应用页面读取 | Managed 接口引擎 `mci-system-observability-query` |
| 应用页面治理 | Managed 接口引擎 `mci-system-observability-action` |
| 扩展宿主、进程、Mongo 或安全底层原子能力 | `V8.Method.GetSystemObservability` / `V8.Method.ManageSystemObservability` |

AI 第一次使用时先查询 `action=Capabilities`，再按返回的动作、权限和边界选择查询。优先使用专用工具，它已经限制动作、参数、分页、确认和审计。旧进程缺少新 Memory 动作时，仅允许通过标准 `microi_run_engine` 临时只读执行固定查询引擎；完整版本排查与降级边界见 [内存事故排查手册](references/memory-incident-triage.md)。不得创建临时维护引擎或绕过后端权限。

## 查询动作

### 连接池故障应急入口

- 收到 `obtaining a connection from the pool` 时，直接用 `microi_query_system_observability(action=DatabasePools,poolTarget=Both)`；故障池可能阻塞普通 `Capabilities` 或 Managed 引擎，此动作走固定 `/api/Diagnostics/database-pools` 应急协议。要求后端支持 `database-pools/v1`，只更新 MCP 不能安装后端。
- `microi_manage_system_observability(action=ResetDatabasePools,poolTarget=Both)` 无确认值时只预览。执行必须带同一预览的 `operationId`、`poolIds`、`poolTarget` 和 `confirmExecution=ResetDatabasePools:<operationId>`。预览票据 2 分钟有效；执行前仍复核配置摘要。
- 请求超时或响应未知，使用查询动作 `DatabasePoolRecovery` 与原 `operationId` 回读，禁止换编号重试。每租户 60 秒冷却；命令期限 90 秒；回执保留 10 分钟，过期编号不能重新执行。
- 回执逐节点区分 `Pending / Incomplete / PartialFailure / CompletedForRegisteredNodes`。只有最后一项证明已注册节点完成；未升级节点不在覆盖范围，最后还需验证原故障只读接口。不得把当前节点探测成功说成全站恢复。
- 支持当前租户 MySQL/SQL Server 主、读池；`Both / Write / Read`，相同池去重。已加载的其它租户共享池时拒绝；扩展库和其它驱动明确不支持。池上限、驱动版本、退避和失败码可读，`Opening` 不等于驱动借出数。
- 服务继续验证 DiyToken、Redis 有效会话和主库管理员；访问密钥需要 `mcp:admin`。仅鉴权使用有界无池连接，每节点应急请求最多 2 个、连接和命令超时各 5 秒；修复后的探测使用原业务池。不得创建匿名维护引擎或另设万能密码。
- 不杀事务、不全局清池、不重放 SQL、不自动放大池上限，不以重启数据库/API 作为默认恢复。无有效会话、Redis/主库不可用或内存保护触发时不能绕过防护。持续泄漏、慢 SQL、容量与网络故障仍需定位根因。
- 此功能属框架运行时应急协议，不新增表/菜单/引擎，不需要发布商城资源；责任同步为 Core/Dos.ORM、MCP、本文档与内嵌知识。验收必须覆盖真实池耗尽、HTTP 撤权/失效会话、两个独立进程、幂等重试、配置漂移与事务存活。

`microi_query_system_observability` 支持：

| action | 用途 | 关键参数 |
|---|---|---|
| `Capabilities` | 能力目录与真实边界 | 无 |
| `Snapshot` | 请求、进程、主机、Docker、队列、诊断和实时网络 | `windowMinutes=1..15`、`top`、`includeHost`、`includeDocker` |
| `Memory` | 当前节点内存压力、执行分配、对象类型和采集质量 | 无；必须先核对采集器心跳与存储错误 |
| `MemoryIncidents` | 当前租户共享事故与本机持久记录摘要 | 最近最多 50 条 |
| `MemoryIncident` | 执行链、代码哈希、CLR 分配栈和退出证据 | 32 位小写十六进制 `incidentId` |
| `Logs` | 日志列表和完整详情数据 | `keyword/type/category/source/level/searchMonth/pageIndex/pageSize` |
| `LogTypes` | 日志类型与数量 | `keyword/searchMonth` |
| `LogStats` | 总数、错误、警告、慢 SQL、慢执行、异常 | `keyword/searchMonth` |
| `Signal` | 时间窗内的诊断信号 | `windowSeconds=60..86400` 与日志过滤项 |
| `Trace` | W3C Trace 时间线 | 32 位十六进制 `traceId` |
| `ApiRank` | 热点接口、耗时占比、平均/P95、异常率 | `top/apiEngineKey/name` |
| `AppLogs` | 当前 API 进程日志尾部 | `lines=20..1000` |
| `PlatformStats` | 表、菜单、接口引擎、租户、用户和排行 | 无 |
| `SecurityData` | 访问、攻击或封锁记录 | `kind=Access|Attack|Block`、分页 |
| `TrafficHistory` | MySQL 固定时间桶流量趋势 | `rangeKey`；可选 `dimensionType` |
| `HistoricalDashboard` | 同一时间范围内的热点接口、IP、帐号、租户、内容类型与请求/流量总览 | `rangeKey=live5|today|yesterday|3d|7d|15d|30d|3m|6m|1y`、`top` |
| `TrafficDetails` | 跨月大文件、上传下载和可疑传输 MongoDB 明细 | `rangeKey`、`pageIndex/pageSize`；可选 `keyword/transferAction/ip/userId/endpoint` |

示例：

```json
{
  "action": "HistoricalDashboard",
  "rangeKey": "30d",
  "top": 15
}
```

```json
{
  "action": "TrafficDetails",
  "rangeKey": "7d",
  "transferAction": "Upload",
  "pageIndex": 1,
  "pageSize": 15
}
```

所有列表默认按 15 条开始；扩大分页前先增加过滤条件。日志和安全数据每页最多 200 条，Trace 最多 500 条。历史总览由固定聚合桶一次返回有界 TOP，不得循环拉取无时间边界的全量日志。

## 安全治理动作

`microi_manage_system_observability` 只允许 `BlockIp` 和 `UnblockIp`。第一次不带确认调用只返回 dry-run，不产生写入；确认值必须精确为：

```text
BlockIp:<ip>
UnblockIp:<ip>
```

封禁前必须核对反向代理、容器网桥、健康检查、办公出口和 NAT。可信后端会再次验证平台管理员身份、IP 格式、本机/未指定/组播限制、租户范围，并写审计日志。不能通过参数指定其它租户，也不能把批量 IP、CIDR、任意表写入或旧菜单删除塞进这个工具。

## 数据解释边界

1. `Snapshot`、活动请求、最近请求、进程与应用日志是当前 API 节点视角。多节点结论需要逐节点或接入统一遥测平台。
2. 热点接口的“耗时占比”是窗口总请求耗时贡献，用于定位相关性；它不是逐请求 CPU 核采样，也不等于该接口独占同等 CPU。
3. HTTP 可归因流量只统计经过 API 中间件的请求体和响应体。网卡、容器 NetIO 还包含 TLS/HTTP 头、重传、数据库、Redis、MongoDB、MQ、对象存储、外部 HTTP、健康检查和同机其它进程。
4. “未归因流量”只能作为排查线索，不能强行归属给某个帐号、IP 或接口。
5. IP 必须注明是可信代理解析后的客户端地址还是直接连接地址；代理链未配置正确前不要据此处罚用户。
6. 进程 CPU“多核原始值”可超过 100%；247.7% 表示约占用 2.48 个逻辑核心。判断整机压力应使用主机归一值并结合持续时间、请求率与热点排行。
7. 执行累计分配和 EventPipe 抽样不是存活堆或 RSS；父执行包含子调用，不能相加或把最高分配者直接宣布为唯一根因。CLR 栈关联脚本哈希和资源身份，不保证 JavaScript 行号。
8. MongoDB 驻留内存、WiredTiger 缓存和日志库存储空间分开解释；磁盘大小不能当作进程 RAM。未正常退出只说明检查点未完成正常关闭，不单独证明 OOM。

## 内存事故留证规范

处理内存吃满、OOM、异常分配、长循环或重启丢日志时，必须继续读取 [内存事故排查手册](references/memory-incident-triage.md)，按字段与证据质量完成归因，不得仅返回一个热点排行。

- 诊断始终独立于 V8 内存/语句保护；不能为了留证默认开启 `V8Limit`，也不能把正常复杂业务报错当成问题已解决。
- 先核对包含独立采集器的 API 二进制、可写持久 `logs` 卷和本机 .NET 诊断通道；仅升级商城微服务不代表底层已经上线。
- 每 2 秒检查点与周期分配样本覆盖尚未返回的执行；API 被强杀后由独立采集器保存末段证据，再由重启节点恢复。极快崩溃、线程调度停顿、磁盘满/丢失仍有缺口，不承诺零丢失。
- 优化版使用执行边界计量与单独后台线程约 200 ms 身份刷新，不挂载诊断专用的 Jint 逐语句 Constraint，也不依赖可能耗尽的业务线程池定时回调。后台事件必须携带原始 OS 线程 Id 和递增版本；运行中长循环的实时分配看 EventPipe 样本，不能把边界累计值的暂时不变或身份刷新误判成业务没有分配/已经取得进展。
- `Memory` 动作兼容不变；核对 `Executions.ObservationMode/IdentityRegistryOverflowCount/NativeThreadIdentityUnavailableCount/IdentityRefreshFailureCount` 和 `Collector.ObservedIdentityProtocolVersion/BackgroundIdentityRefreshes/RejectedStaleIdentityMarkers`。字段缺失按旧版/未知处理，不按零故障处理。性能数据与完整边界见下方内存诊断参考文件。
- 共享 Mongo 事故保留 14 天，本机历史预算 256 MiB。原始片段单段上限 64 MiB，保留最近两段，加上正在写入的一段最多 192 MiB；采集主体到 16 MiB 时提前收尾，为 rundown 留出空间，EventPipe 缓冲固定 64 MiB。完整 API 的收尾实测约 35 MiB，不能用小测试进程的片段大小代替平台验收；仍须检查截断、丢事件和离线方法栈。事件 Id 全局唯一，重放幂等且更新版本只前进；不得回退为无界日志/完整对象序列化。
- 共享存储断开时先保留本机证据，恢复后补传。多节点共享卷的恢复和清理必须尊重仍存活节点及采集器的租约。
- 查询先报告 `Fresh/LastCaptureError/LostEvents/OverflowSamples`、本机存储错误和待补传状态；指标缺失应显示不可用，不得按零值宣布健康。
- 整个容器退出后，重启解析器尝试最后两个原始片段。尾段缺方法栈时保留执行身份与对象类型，并补充前段；必须同时报告 `MissingStackSamples`、`Truncated` 与 `Evidence.StackQuality`，不得把部分恢复称为完整栈。
- 高 RSS 但没有分配热点时，继续区分长期保留、非托管和数据库进程；受控堆分析属于后续证据，不能伪称分配采样已经给出存活对象根因。

## 隐私与权限

- 只允许平台可观测性管理员读取敏感运行数据或治理 IP；通常要求 `Level >= 9999`，最终以可信后端判定为准。
- 不采集或持久化请求正文、响应正文、QueryString、Cookie、Authorization、Token、密码、Secret 或 API Key。
- 文件流量只记录清洗后的文件名/扩展名/数量/字节，不记录文件内容。
- 日志详情由可信后端递归脱敏；AI 回答仍要避免复述连接串、内部路径、个人信息或可用于登录的材料。
- 对外分享截图前检查帐号、IP、Trace、内部域名、物理路径和业务数据；需要时使用测试数据重新截图。

## 高性能存储规范

- 请求热路径只做原子计数和有硬上限的分钟桶聚合；端点、IP、帐号、租户、内容类型限制基数并保留 TOP N。
- 普通高频明细只保留短窗口内存；错误、慢请求、大文件和可疑传输进入有界队列，异步批量写 MongoDB。
- 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert；5 分钟桶保留 48 小时、小时桶保留 45 天、天桶保留 400 天。页面不能每次扫描 Mongo 明细重新聚合总览。
- 队列必须有硬容量、故障 spool/WAL、停机排空和幂等重放；禁止无界 `ConcurrentQueue` 或逐请求同步写 Mongo/MySQL。
- Redis 适合短时热点结果、租约和限流；缓存 Key 包含租户、动作和过滤摘要，写入或治理后主动失效，并保留短 TTL 防止永久陈旧。

## 接口引擎归因规范

- PC、UniApp、内置微服务、MCP 和应用包中的固定接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎唯一 `ApiAddress`；新增代码禁止调用 `/api/ApiEngine/Run`。
- SDK 的普通 `ApiEngine.Run` 必须自动生成真实引擎路径；旧通用入口只能封装在显式 `RunLegacy` 中，供不能立即升级的历史客户端使用。
- 监控中保留通用入口的兼容识别，但不能依赖读取请求正文才能知道 Key；真实路由、访问日志、限流和流量排行应直接显示接口引擎 Key。
- 代码审计要区分运行调用与文档/兼容测试；发布门至少扫描 Microi.Client、UniApp、微服务源码、MCP 与应用包，确保没有新增固定业务依赖。

需要压测或修改热路径时同时读取 `../performance-testing/SKILL.md`；排查 V8/日志写法时读取 `../v8-debugging/SKILL.md`。

## AI 诊断顺序

### 宿主数据库进程高 CPU

- `Host.Processes` 确认 `mysqld` 高 CPU 后，继续用 `microi_query_external_database` 对已授权实例只读查询实际 `performance_schema`/`information_schema`。先核对数据库版本与可用列；使用规范化 `DIGEST_TEXT`，不回传连接串或含业务值的 SQL 正文。
- 至少间隔一个业务周期采集两次 `events_statements_summary_by_digest`，计算 `COUNT_STAR/SUM_TIMER_WAIT/SUM_ROWS_EXAMINED/SUM_SELECT_SCAN` 差值；累计总耗时与并发墙钟时间不等于 CPU。当前页面 SQL 很快不能排除后台任务在同库扫描。
- 核对实际索引与锁/事务状态。典型例子是 `mic_data_version` 缺少 `(TableId,TableRowId,CreateTime)`，定时任务运行时间刷新又不断生成版本，形成越来越重的历史扫描。索引由所属应用声明，新旧库都应交付；在线修复后必须回读并观察后续 digest 和同窗宿主进程。
- 原生建索引工具若不能表达生产所需的在线算法、锁等待上限，应通过受控管理员数据库工具预览固定语句，再按已有明确修复授权执行并回读；不得因响应超时重复建索引，不做表重建或删除历史来掩盖问题。

1. 先查 `Capabilities`，确认当前版本和边界。
2. 查 `Snapshot`，记录节点、窗口、请求率、活动请求、CPU/内存、队列、HTTP 流量与未归因残差。
   内存问题同时查 `Memory`、`MemoryIncidents`、`MemoryIncident`，先确定采集健康，再关联接口/V8 事件、表/工作流节点、代码哈希和 Trace。
3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度，区分“计算慢”与“传输大”；再用 `TrafficDetails` 定位具体帐号/匿名、IP、接口、文件元数据和 TraceId。
4. 按异常接口或 TraceId 查 `Logs`、`Signal`、`Trace`；先处理时间线中的首个根因。
5. 对慢 SQL 核对执行计划、索引、返回字段、分页、排序/Join 和锁等待；不要先盲目加 Redis。
6. 对高频只读结果评估短 TTL Redis，并明确更新/删除时的失效路径；对写接口先批量化 I/O、缩小事务和消除逐行远程调用。
7. 对匿名上传、大响应、重复轮询或攻击信号先核对业务合法性，再限流、对象存储直传/CDN、Range、压缩或封禁。
8. 优化后用相同窗口与负载复测 P50/P95/P99、RPS、错误率、CPU、内存、分配率和网络字节，不能只凭单次页面刷新下结论。

## 扩展与商城交付

### CDN 模块

- 现有 `microi-platform-service` 的系统日志页增加 CDN Tab；不另建同名应用。固定管理员入口为 `mci-cdn-manager`，内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`，四个引擎归 `app.microi.sys-log` 的 Managed 资源。
- 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`，再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块，不为 CDN 新增旁路鉴权或通用 HTTP 代理。
- 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败，不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret，由可信后端解密到后端 `ServerPrivateSettings`；不返回原文。
- Aliyun 运营报表 ID：1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。未订阅不能伪造成零流量，也不能将历史 TOP 当作分钟级规则数据；未知流量单位保持原始值。
- 报表参数按类型分开：只有 13/15 传非空 Area，1/3/9/11 传非空 HttpCode，21/23 传 IsOverseas；17 不传 DomainName。不得统一附加无关或空筛选项，否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject，不向它写入配置对象，创建独立 JS 请求并从服务端读取接入配置。
- SLS 只用固定查询模板与已校验域名/项目/地域/Logstore；自动判断基于 `remote_ip`、`response_size` 字节以及完整窗口、采集延迟、连续命中、白名单、冷却与限额。私网/环回/链路本地/组播和与保护 CIDR 重叠的地址不封禁。动态阈值须满足历史样本数，默认观察。
- 云端变更先 `Preview` 再 `Submit`，请求号幂等、配置快照比较、独立持久化状态和租约不可省略。超时/崩溃记 Unknown 并 `Reconcile`，不能自动重发不确定写入。到期只删除本应用新增条目，重叠封禁延后回收。
- 单域名 IP 黑名单与全账号海量封禁必须分开；后者需阿里云开通，须明确 `ALL_CDN_DOMAINS`，不在验收时自动开通付费服务。`limit_rate` 是至少 100 KB/s 的下载速率，不是 QPS；日志规则也不等于实时边缘 WAF。
- `mci-cdn-security-tick` 回收到期封禁；每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构，不带云密钥、规则实例、白名单或任何测试 IP。
- 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时，如实标为待配置，不伪造云端通过。

- 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
- 历史日志兼容入口为 `POST/GET /api/SysLog/AddSysLog`；它只接受当前 DiyToken 用户和租户上下文，返回进入异步持久化流程不等于日志已经落库，必须以后续记录回读作为验收事实。
- 只有接口引擎缺少宿主进程、Docker、Mongo 聚合、安全运行态等可复用底层能力时，才扩展最小 V8 原子方法；Controller 不承载业务编排。
- 官方引擎声明 `ResourcePolicies.ApiEngines=Managed`，由本次已校验包正文覆盖其拥有的资源；客户扩展使用独立 Key 或 `CreateIfMissing`，既有扩展不被覆盖。不得把 Managed 的旧本地改动当作拒绝应用升级的理由，也不得扩大到无关资源。
- 按应用发布契约交付表、字段、索引/DDL、接口引擎、菜单、版本日志和微服务运行产物；私有源码由源码同步链交付。`DatabaseOnly/SourceNotIncluded` 必须如实标识，不能声称商城包包含全部源码。安装后回读固定版本快照并在真实页面验收。
- 后端框架和商城应用是两条升级链：只升级其中一条不能证明功能完整。目标端应先升级兼容框架，再安装/更新最新【系统日志/监控】应用。

## 最低验收

- 系统日志位于首个 Tab；统计、筛选、15 条默认分页、搜索、详情、Trace 时间线均可用。
- 日志详情使用平台级 `Teleport to="body"` 遮罩整个系统框架；标题/副标题最多两行，异常标红并提供原因与解决方案。
- 八个 Tab 均跟随主题；动画只使用 transform/opacity 等低成本属性，页面隐藏或 `prefers-reduced-motion` 时暂停。
- MCP 能发现两个专用工具；`Capabilities`、日志/流量分页、Trace 缺参拦截、IP dry-run、错误确认和成功审计均有自动测试。
- 通过实际打包后的 MCP 执行 `initialize`、`tools/list`、`describe_tool` 和 Memory 查询，确认三个动作及 `incidentId` 校验；源码测试通过不能代替发行包验收。旧后端失败保留原始 Code/Msg，不能伪造为空结果或自动开启 V8 限制。
- 对请求热路径做开关前后压测，确认观测开启后 P95/P99、CPU、内存和分配率没有不可接受回退；故障 Mongo 不得阻塞业务请求。
- 多节点、网卡重置/回绕、服务重启、匿名/登录、大上传/下载、敏感字段脱敏、时间桶幂等和缓存失效均有验证证据。
- 内存专项至少覆盖：V8 限制关闭的复杂执行、真实 Kestrel TraceId、500 个活动请求、异步嵌套归属、独立采集栈、Mongo 故障、执行中强杀、改名重启、跨节点补传、旧快照重放和租户隔离。
