跳转到内容
文档

测试手册 — Query Regressions

一份循序渐进的指南,教你在 MongoDB、Cosmos DB 和 DocumentDB 上打开、使用并验证 Query Regressions——基于稳定指纹的性能回退检测器。

预计时间: 约 25 分钟
本手册内容

简介

一份循序渐进的指南,帮助你打开、使用并验证 Query Regressions 界面——NoSqlStudio 内置的性能回退与异常检测器。请从第 1 步开始,按顺序读到最后。每一步都会告诉你该做什么以及你会看到什么

如何阅读本手册

每一步都包含:

  • 操作 — 具体动作(点击、输入、运行某条命令)。
  • 查看 — 屏幕上应当发生的情况。这就是你的“通过 / 失败”判定标准。
  • 原因 — 额外的背景说明,仅在有帮助时才有(赶时间的话可以跳过)。

什么是 Query Regressions

概念

一个稳定的指纹,类似 Oracle 的 sql_id

每种查询形态都会获得一个稳定的指纹,它在不同运行之间永远不变——与 Oracle 的 sql_id 是同样的思路。NoSqlStudio 为每个指纹学习一个滚动的baseline(基线),当同一个查询开始变得更昂贵时就触发告警:墙钟时间更慢、检查的文档更多、消耗更多 RU,或执行计划更差(例如 IXSCAN → COLLSCAN)。

概念

一个界面,三种引擎

同一个界面适用于 MongoDBAzure Cosmos DB(Mongo API)AWS DocumentDB。采集是实例级的——它能看到来自每个客户端、每个数据库的慢查询,而不仅仅是你从 NoSqlStudio 运行的那些。这正是它能在维护窗口期间捕捉到未声明变更的原因。

概念

五个层级的根因分析

每条告警都分层解释:L1 变更前后的指标 · L2 执行计划差异 · L3 调查项(索引、集合统计、基数)· L4 ±5 分钟窗口内相关的 DDL/部署事件(“在它变慢之前发生了什么变更”)· L5 AI 叙述。

开始之前

你可以完全不连接任何数据库、仅用演示数据探索整个界面(阶段 1–3)。实时采集(阶段 4–6)需要一个连接,数据源取决于引擎:

  1. 1MongoDB — 通过 getLog:'global' 读取服务器慢查询日志。适用于自托管的副本集和专用 Atlas 集群。在 Atlas 共享层级(M0/M2/M5)上不可用,因为它们会阻止 getLog
  2. 2Cosmos DB — 从 Azure Log Analytics 读取诊断日志。需要在 Cloud Credentials(Cosmos Optimizer)中接入 Log Analytics。
  3. 3DocumentDB — 从 Amazon CloudWatch Logs 读取 DocDB profiler 流。需要在集群参数组中启用 profiler、导出到 CloudWatch,并在 Cloud Credentials 中设置 AWS 凭据
  4. 4第二个标签页,你可以在其中运行 shell 命令——ScratchpadMongo Shell——来生成慢查询。

完成整个演练的预计时间:约 25 分钟

阶段 1

打开界面(无需数据库)

先把界面打开并加载内置演示,这样你可以在接入实时数据源之前先熟悉布局。

步骤 1

打开 Query Regressions

操作

在工具栏中选择 Monitoring ▼ → Query Regressions(快捷键 Ctrl+Alt+Shift+Q)。

查看

会打开一个新标签页,左侧是 Query Regressions 标题、一个主列表,右侧是详情面板。

步骤 2

加载演示数据

操作

如果列表为空,请在空状态中点击 Load demo data

查看

在一个 SHOP 分组下会出现两条示例告警:一条 Plan regression — shop.orders,一条 Selectivity collapse — shop.events。标题处显示一个红色的 2 CRITICAL 徽章。

原因

演示完全在内存中运行——没有服务器、无需权限。这是了解卡片中每个区块含义的最快方式。

步骤 3

选择一条告警

操作

在列表中点击 Plan regression — shop.orders 卡片。

查看

详情面板会填充内容。标题处显示一个 CRIT 徽章、标题,下方是 fingerprint(指纹,一个稳定的哈希值)、命名空间和发生次数。

阶段 2

告警的剖析

从上到下阅读详情面板的每个区块——所有引擎的布局都相同。

步骤 4

WHAT CHANGED(变更内容,Level 1)

查看

一个包含 Signal · Baseline · Now · Δ 的表格。对 MongoDB/DocumentDB,指标是 p95 duration (ms);对 Cosmos,指标是 RU。第二行显示 docs examined / returned。当出现回退时,“Now”和“Δ”列会被高亮(例如 2.6 → 197 = 75.8×)。

原因

这就是核心要点:同一个查询如今比它自己学习到的 baseline 昂贵得多。

步骤 5

HOW IT CHANGED — 执行计划差异(Level 2)

查看

变更前后的执行计划,例如 IXSCAN { userId:1, status:1 } COLLSCAN。被删除的索引或损坏的 plan-cache 条目会立即在这里显现。

步骤 6

WHY — 根本原因(Level 3)

查看

来自调查项的要点结论:集合上存在哪些索引、执行计划是否改变、plan-cache 键是否改变。每条要点用绿色(正常)或琥珀色(可疑)标注。

步骤 7

WHAT CHANGED NEARBY(附近的变更,Level 4)

查看

检测时刻 ±5 分钟内的 DDL 和部署事件时间线——例如 2m before · dropIndex · shop.orders · idx_user_status

原因

这就是对“在它变慢之前发生了什么变更”的回答。在执行计划翻转为 COLLSCAN 前两分钟删除了一个索引,几乎可以确定就是根本原因。

步骤 8

QUERY SHAPE 与 AI Root Cause(Level 5)

查看

规范化的查询形态(opfilter 字段、sort 字段),随后是一个带有模型选择器和 Run analysis 按钮的 AI Analysis 面板。

操作

点击 Run analysis

查看

按钮在模型工作时会发光,然后出现一段简洁的根因叙述 + 修复建议,它是基于本条告警的事实清单撰写的。

步骤 9

打开详情弹窗

操作

点击详情面板右上角的 ··· 按钮。

查看

会打开一个弹窗,带有固定的头部(严重级别 + 标题 + 指纹)和一个可滚动的主体真实执行的命令、一个 Explain plan 按钮以及一个 AI 区块。

概念

Command 是从慢查询源捕获到的实际命令——而非重建——因此 Explain 运行的是真实的查询形态。

步骤 10

建议的修复措施

查看

底部有:Clear plan cache(对 MongoDB 的 plan-change 告警启用)、AcknowledgeSnooze 24h

操作

点击 Acknowledge,然后点击 Snooze 24h,观察列表中该告警的状态变化。

注意

Clear plan cache 会写入到实时服务器。它总是会先要求确认——在确认前请阅读对话框,尤其是在生产环境上。

阶段 3

范围与未声明变更防护

步骤 11

切换范围

操作

SCOPE 栏中点击一个数据库标签(或 All databases)。

查看

列表会过滤到所选的数据库。All databases 是默认值,也是你在维护窗口期间想要的。

原因

检测始终在实例级运行。范围只过滤你看到的内容——它绝不会阻止引擎监视每一个数据库。

步骤 12

范围外的严重告警横幅

查看

如果你缩小了范围,而一个严重回退在你过滤之外的数据库中触发,就会出现一条警告横幅:“N critical regression(s) in databases outside your filter”

原因

这是针对那类经典事故的防护:某次变更声称只触及数据库 X,但一个隐藏脚本改动了未声明的数据库 Y。即便你没有在看 Y,横幅也会把它浮现出来。

阶段 4

在 MongoDB 上进行实时采集

现在接入一个真实数据源。MongoDB 无需设置凭据——它直接读取服务器慢查询日志。

步骤 13

连接一个副本集或专用 Atlas 集群

操作

将 NoSqlStudio 连接到一个 MongoDB 副本集或一个专用 Atlas 集群,然后在该连接上打开 Query Regressions

查看

标题处将实时状态显示为 live(绿色)。

注意

Atlas 共享层级(M0/M2/M5)会阻止 getLog 管理命令,因此实时状态会读作 unavailable。请使用专用集群或自托管的副本集。

步骤 14

生成一个明显糟糕的扫描

操作

在一个 shell 标签页中,对一个没有索引的字段运行一次慢速集合扫描——按一个无索引字段排序会强制对整个集合进行 COLLSCAN:

js·2 linhas
use <database>
db.<collection>.find({}).sort({ <unindexedField>: -1 }).limit(25).toArray()
查看

该查询耗时远超 100 ms,并扫描整个集合。

步骤 15

查看 New slow query 卡片

操作

切回 Query Regressions 标签页并等待几秒(慢日志大约每 5 秒轮询一次)。

查看

会出现一个标题为 New slow query — <namespace>(代码 Q7)的 WARN 卡片,执行计划为 COLLSCAN,且 docs examined 数值很高。

原因

一个从未见过、却已经是大型 COLLSCAN 的查询会在首次出现时就被标记——无需 baseline。这是针对维护窗口期间落地的变更的防护。

步骤 16

证明指纹是稳定的(去重)

操作

再运行完全相同的查询几次。

查看

不会出现新卡片。 重复运行会折叠进同一条告警——相同指纹 = 相同身份。

原因

这正是稳定指纹的全部意义所在:重新运行一个查询绝不会刷出重复告警。一个查询 = 一个身份,就像 sql_id

步骤 17

证明不同形态会产生新告警

操作

运行一个不同形态的 COLLSCAN——按一个不同的无索引字段排序:

js·2 linhas
use <database>
db.<collection>.find({}).sort({ <anotherUnindexedField>: -1 }).limit(25).toArray()
查看

会出现第二张、不同的卡片,带有不同的指纹。不同形态 = 新身份 = 新告警。

阶段 5

在 Cosmos DB 上进行实时采集(RU 模式)

Cosmos 没有可轮询的慢查询日志,因此采集会从 Azure Log Analytics 读取诊断日志。指标是 RU,而非毫秒。

步骤 18

在 Cloud Credentials 中接入 Log Analytics

操作

在一个 Cosmos DB(Mongo API)连接上,打开 Cosmos OptimizerCtrl+Alt+Shift+O)→ Configuration → Cloud Credentials,并填写 Azure 区段:Cosmos 账户的 Resource IDLog Analytics workspace ID。点击 Save

查看

会出现一条绿色确认信息(credentials saved … MetricsBridge promoted)。

注意

Log Analytics 是一个付费层级(写入 + 保留)。它是唯一能看到来自其他客户端的查询的路径——免费的 header 路径只能看到 NoSqlStudio 自己运行的内容,这对未声明变更的场景来说是不够的。

步骤 19

确认实时状态并生成一个昂贵的查询

操作

在 Cosmos 连接上打开 Query Regressions;确认状态读作 live。然后运行一个跨分区或无索引的查询,使其消耗 RU。

查看

在 Log Analytics 写入该行之后(有几分钟延迟),会出现一张卡片,以 RU 的前后值作为核心指标。

概念

在 Cosmos RU 模式下 Explain 不可用——弹窗会这样说明,并转而指引你查看 RU 指标和 Index Policy 面板。

阶段 6

在 DocumentDB 上进行实时采集

DocumentDB 不支持 getLog,因此采集会从 CloudWatch Logs 读取 DocDB profiler 流。它需要启用 profiler 并配置 AWS 凭据。

步骤 20

启用 DocDB profiler

操作

在 AWS 中,创建一个自定义集群参数组,设置 profiler = enabled 和一个较低的 profiler_threshold_ms(例如 50),应用它(需要重启),并把 profiler 添加到集群的 Log exports to CloudWatch 中。

查看

慢操作开始落入 CloudWatch 日志组 /aws/docdb/<cluster>/profiler

步骤 21

在 Cloud Credentials 中设置 AWS 凭据

操作

在 DocumentDB 连接上,打开 Cosmos OptimizerCtrl+Alt+Shift+O)→ Configuration → Cloud Credentials,并填写 AWS DocumentDB 区段:RegionDocDB cluster identifier,以及可选的 AWS profile(留空则使用机器的默认凭据链)。向下滚动并点击 Save credentials

查看

该区段会显示一个绿色的 CONFIGURED 徽章,并且 aws-documentdb MetricsBridge 会为此连接注册。

概念

此面板由 AWS DocumentDB 和 Azure Cosmos 共享,并且是按连接的——在 DocumentDB 连接上填写 AWS 区段,在 Cosmos 连接上填写 Azure 区段。每个连接携带各自的区域/集群,因此不同区域中的多个 DocDB 集群会被独立处理。

步骤 22

打开界面并生成一个慢扫描

操作

在 DocumentDB 连接上打开 Query Regressions(确认状态为 live),然后在一个 shell 标签页中运行一次慢速 COLLSCAN:

js·2 linhas
use <database>
db.<collection>.find({}).sort({ <unindexedField>: -1 }).limit(25).toArray()
查看

在约 15 秒内会出现一张 New slow query 卡片,执行计划为 COLLSCAN,并带有一个推导出的 docs examined 数值。

注意

DocumentDB 不会直接发出 docsExamined,因此该值是从 profiler 的 execStats 扫描阶段推导出来的——对于无过滤的扫描是精确的,当某个阶段的过滤器排除了行时则是一个下界。一个高效的仅索引计数(IXONLYSCAN)即便有点慢,也会被有意地标记——只有检查了大量文档的 COLLSCAN 才会被标记。

阶段 7

持久化与行为

步骤 23

状态在重新打开后依然保留

操作

对一条告警执行 Acknowledge 或 snooze,然后关闭并重新打开 Query Regressions 标签页。

查看

已确认/已暂停(snoozed)的状态以及你的范围选择都还在。

步骤 24

同一个界面,每种引擎

查看

依次在 MongoDB、Cosmos 和 DocumentDB 连接上打开该界面。布局、卡片、五个 RCA 层级以及 AI 面板都完全相同——只有核心指标(ms 还是 RU)和 Explain 的可用性不同。

清理(完成之后)

操作

删除你创建的任何一次性测试集合:

js·2 linhas
use <database>
db.<collection>.drop()
操作

对于 DocumentDB,如果 profiler 只是为了本次测试而启用,你可以在参数组中禁用它并删除 CloudWatch 日志组,以停止写入费用。对于 Cosmos,如果你不需要持续采集,请降低或禁用 Log Analytics 诊断设置。

查看

测试数据已被清除,你为测试启用的任何付费云层级都已关停。

你所验证内容的总结

阶段功能
1无需数据库即可打开 Query Regressions 并加载演示数据
2读懂一条告警:L1 指标、L2 执行计划差异、L3 结论、L4 附近事件、L5 AI、详情弹窗、修复措施
3范围过滤器与范围外严重告警横幅(未声明变更防护)
4MongoDB 实时采集:New slow query、稳定指纹去重、新形态 = 新告警
5通过 Log Analytics 进行 Cosmos DB 实时采集,以 RU 作为指标
6通过 CloudWatch profiler 流进行 DocumentDB 实时采集
7状态/范围的持久化,以及在全部三种引擎上保持一致的同一个界面
如果每一步都给出了预期的“查看”结果,那么 Query Regressions 在 MongoDB、Cosmos DB 和 DocumentDB 上就已100% 验证通过。请记下任何不一致之处的步骤编号,以便我们修复它。