Weave检查内容
Weave 读取项目已保存的配置,以及其工作流在过去 30 天内的运行记录,并报告发现的问题: 分摊步骤没有可分摊的内容、工作流保存的结构中同一步骤出现两次、工作流的上次运行失败、 步骤输出的行数远少于平时。Weave 只读取数据——它报告的任何内容都不会更改步骤, 也从不运行您的工作流。
整个过程不涉及任何 AI 模型。每项检查都是固定规则,每句话都是预先写好的, 因此无论请求报告多少次,生成报告都没有任何成本。
三种答案,而非两种
Section titled “三种答案,而非两种”PlaidCloud 中的大多数检查只有两种答案:配置没问题,或者被拒绝。Weave 还有第三种, 而这正是值得理解的一种。
| 答案 | 含义 |
|---|---|
| Weave 注意到…… | Weave 检查了此项并发现了问题。 |
| (未作任何表述) | Weave 检查了此项,未发现任何问题。 |
| Weave 尚未检查…… | Weave 完全无法判断此项。 |
之所以有第三种答案,是因为沉默是含糊的。创建分摊步骤时,PlaidCloud 允许在填写列映射之前 就保存步骤——您仍在构建它,拒绝保存会妨碍您的工作。而读取同一个空映射的监控程序, 很可能会将该步骤报告为正常。它并不正常;它尚未完成,也没有人检查过它。
所以 Weave 会如实说明。无法判断的步骤会被报告为未检查,并附上原因, 而且绝不会被当作已通过来计数、排序或着色。
Weave 还可能给出第四种说法,但它根本不是关于您的步骤的答案:Weave 没有针对……的规则。 这表示 Weave 没有针对此类内容的检查,也从未对其作出判断。与“尚未检查”不同, 无论对步骤做什么都不会产生判断结果,因此这两者值得区分:完成一个未检查的步骤后, Weave 就会对其作出判断;而 Weave 没有规则的步骤,无论如何修改都仍不会被判断。
报告是什么样子
Section titled “报告是什么样子”报告以一段摘要开头,摘要会注明自身的统计基数,让您能看出报告覆盖了项目的多大范围:
Weave fully checked 3 of the 417 steps and workflows in "Cost Model", and found 1problem in the parts it could judge. 1 more it hasn't fully checked.Weave has no rule for 412 steps and 1 workflow it looked at, so they have not beenjudged either way.
Weave noticed the step "Spread Overheads": No driver split value column found. Onedriver column must have the role "Split Value".Weave hasn't checked the step "Regional Split" — its column mapping is empty.当项目中有按计划写入的表或设置了时效性阈值的表时,第一行会单独计数这些表: Weave 完整检查了“Finance”中 36 个步骤和工作流中的 31 个,以及 4 个应保持最新的表中的 3 个,并在其能够判断的部分中发现了 2 个问题。
第一行中的分数是有意为之。检查了三个步骤且未发现问题,与项目没有问题并不是同一个说法; 开头一行自带规模,因此引用它时无法脱离这个规模。“在其能够判断的部分中”也是出于同样的原因: 当某些内容只被部分判断时,发现的问题不能归于这一行刚刚称为已检查的步骤。 第二行列出 Weave 完全没有规则的内容,并明确说明这些内容未被作出任何判断—— 而不是说它们不需要检查。
Weave 如何得知
Section titled “Weave 如何得知”每个发现项下方都有一个 Weave 如何得知链接,点击后会打开一个面板,显示 Weave 得出该结论的过程:
- 检查——用通俗的语言说明规则检测的内容及其使用的限制,例如将计数与之前多少次运行进行比较。
- 证据——检查所使用的值。对于发生变化的行数,包括最新计数、之前运行的平均值、 计数在各次运行之间通常的波动幅度,以及超出后 Weave 就会报告的范围。
- 来源——读取证据的运行、运行历史记录、步骤的已保存设置、计划事件或表。 以链接形式显示的来源会打开您查看它的位置,例如工作流或表资源管理器。
- Weave 未检查的内容——规则遗漏的内容。此项从不为空:例如, 检查表是否按时写入,并不会查看写入的内容。
对于 Weave 无法检查的发现项,面板会显示该检查及其无法运行的原因,但不显示证据。
面板只列出您能看到的内容。您的角色所隐藏的步骤、工作流或表会显示为您无法打开的项, 绝不会显示其名称;当工作流的上次运行在您无法打开的步骤中失败时,证据只统计这些步骤的数量, 而不列出名称。构建面板的过程不涉及 AI。
该面板出现在 Weave 选项卡和审核中。审核的 AI 撰写摘要也有此面板, 会说明摘要由 AI 撰写、基于多少个发现项,以及 Weave 在显示摘要之前检查了什么。 AI 助手通过 PlaidCloud MCP 运行的审核不包含该面板。
Weave 目前检查的内容
Section titled “Weave 目前检查的内容”分摊列映射。 对于 Allocation with Dimension 或 Allocation Split 步骤,检查是否有要分摊的数值列、用于分摊的数值动因值、在需要时是否有层次结构, 以及——对于拆分——分子和分母是否引用了源表中实际存在的列。 这些检查与保存步骤时运行的检查相同,读取的是已保存的内容。保存时还会检查分配维度本身—— 它是否存在,以及是否恰好有一个动因属性——而 Weave 不检查这些,因此因该原因被保存拒绝的步骤 不会产生 Weave 发现项。
步骤表达式。 对于任何包含表达式的步骤,检查您编写的每个表达式——无论在目标列上、 子集子句中还是辅助筛选器子句中——是否仍能编译。发现项会注明列或子句,以便您知道该打开哪一个, 并给出错误,例如 Syntax error at line 1, position 280。表达式本身位于 Weave 如何得知中,因此较长的表达式不会淹没错误。 这些检查与保存步骤时运行的检查相同。
有两种情况 Weave 会报告为未检查,而不作判断:
- 读取变量的表达式。 一个步骤可以属于多个工作流,每个工作流可以将同一变量设置为不同的值—— 或者根本不设置。保存检查知道您是从哪个工作流保存的;而扫描并不知道。 Weave 不会随意选择一个工作流而冒着把正常表达式判为错误的风险,而是在变量并非处处都已设置, 或设置的值互相矛盾时,将该步骤报告为未检查。您的角色看不到的工作流也按同样方式计算: Weave 同样无法读取其变量,因此不会声称该步骤一致。当所有工作流一致时, Weave 会正常判断该步骤。
- 此检查不读取的筛选器和列列表。 某些步骤类型将筛选器或第二个列列表保存在表单中 表达式检查从未读取的部分——双表联接和 Lookup、分摊拆分、Generate Batch 以及 SAP Post Journal Entry。保存这些步骤时一直会跳过这些字段, 因此 Weave 不会仅凭能读取的一半就判定步骤通过,而是将其报告为未检查。 多表联接和 Delete 步骤也按同样方式报告,因为它们的配置形式无法被此检查编译。
工作流中重复列出的内容。 检查同一工作流中没有任何步骤或嵌套工作流出现超过一次, 并且共享同一父项的两个文件夹没有使用相同的标识符。
可能在其读取的表写入之前运行的步骤。 在高级工作流中,检查每个读取表的步骤 是否通过画布上的连接线,在同一工作流中写入该表的步骤之后运行。无论工作流是否运行过, Weave 都会进行此检查。发现项会列出一个此类步骤及其应在之后运行的步骤,并说明受影响的步骤数量; 相关的表列在 Weave 如何得知中。画布已经让其过早运行的步骤会单独报告。 当某个步骤运行另一个工作流或使用 Weave 无法跟踪的表时,Weave 会将该工作流报告为未检查; 对于有多个步骤或另一个工作流也写入的表,Weave 不作判断。要审核并添加缺失的连接线, 请在画布上使用同步依赖项。如果某个步骤本来就要读取上一次运行的输出, 请将该发现项标记为预期。
工作流的运行情况。 Weave 读取每个工作流过去 30 天内的运行——每个工作流最多读取最近的二十次运行—— 并将最新一次运行与之前的运行进行比较。对于下文所述的月末和工作日比较, 它还会读取过去 180 天内的一些更早的运行。每次比较都是与工作流自身的历史记录比较, 从不与其他工作流比较。
-
上次运行失败。 报告最近一次运行失败的工作流,并附上失败日期;如果之前的运行也失败了, 还会说明连续失败了多少次以及从何时开始。
-
运行比平时慢。 运行已完成,但其步骤所用的总时间超出了该工作流之前已完成运行的允许范围—— 比平均值高出两个以上标准差,且至少超出平均值 5%(绝不少于一秒, 因此快速工作流不会因几毫秒而被报告)。该 时间是各步骤时间的总和,因此对于并行运行步骤的工作流,它会比时钟显示的时间更长。 完成得更快的运行不会被报告。
-
步骤比平时慢。 某个步骤在最近一次已完成运行中所用的时间,比它在该工作流中之前已完成的运行更长, 衡量标准与慢运行相同。Weave 由此指出导致运行变慢的步骤。属于多个工作流的步骤 会在每个工作流中分别判断。时间从步骤开始算到结束:Weave 不会把步骤自身的工作时间 与等待时间(例如等待繁忙的数据仓库)分开。
-
运行越来越慢。 持续存在的变慢。一旦较慢的运行占了与某次运行相比较的大部分之前运行, 慢运行看起来就不再异常,因此此检查改为比较前后两半。Weave 读取该工作流过去 30 天内的 最近 20 次运行,保留已完成的运行,并按开始时间将其分为较早的一半和较新的一半。 当较新一半的 中位时间比较早一半至少长 25% 且至少长 30 秒,并且在较新运行与较早运行的所有配对中, 至少 85% 的配对里较新运行耗时更长时,Weave 会报告该工作流。时间是各步骤时间的 总和,与慢运行相同。Weave 需要至少 12 次已完成运行,且分布在至少 14 天内, 因此两周内运行超过约 20 次的工作流不会被检查。失败和已停止的运行不计入; 越过失败步骤继续运行的运行则计入。发现项会列出最多三个您可以打开的、中位时间增长最多的步骤, 并且在变慢持续期间,其语句保持不变,因此不会在每次运行后都重复通知您。
-
目标行数与之前的运行不同。 步骤在上次运行后,其输出表所含的行数 远多于或远少于该步骤在该工作流中之前运行后的行数,衡量标准相同(且至少相差一行)。计数是表中所含的行数,因此 追加数据的步骤按不断增长的总数来判断。属于多个工作流的步骤会在每个工作流中 分别判断。
-
联接重复的行比平时多。 内联接、左联接或右联接针对其主表每一行写入的行数, 多于该工作流中之前运行后的行数——比平均值高出两个以上标准差,且至少超出平均值的 5%。 对于内联接或左联接,主表是 Table A;对于右联接,主表是 Table B。主表每一行写入多于一行,意味着它的某些联接键在另一个表中出现在多行上, 因此带有这些键的行被写入了不止一次。Weave 只报告高于 1.00 的数字, 并且只在该数字高于联接的通常水平时才报告,因此按设计每行写入多行的联接只有在该数字上升时才会被报告。 对于内联接,只能看到在 Table B 中重复的键。之前运行中记录了主表行数的次数 少于四次的联接会被报告为未检查。
进行聚合,或使用 非重复、切片(Limit)或 辅助筛选器的联接会被报告为未检查,因为它们各自都会改变行数 本身。主表没有记录行数的联接(例如视图)也是如此。主表的行数是其上次写入时记录的行数, 早于步骤对其应用的筛选。每次运行保留不同比例行的筛选器也会使该数字变化, 并可能被报告。以其他方式对主表所做的更改,或由同时运行的步骤所做的更改,都看不到。 全外联接、交叉联接和多表联接不会被检查,而 Lookup 不会将一行写入多次。
-
空值与之前的运行不同。 步骤输出表中的某一列,其为空的行所占比例 与该步骤之前运行后相比大得多或小得多——与通常比例相差两个以上标准差, 且至少相差五个百分点。步骤写入的每个表都按其自身的行进行 判断。
-
导入未找到文件。 导入步骤最近一次已完成的运行在其读取的路径中 未找到任何文件。该步骤以警告而非失败结束,并创建空的目标表或不加载任何内容,因此后续步骤 无法从它读取任何内容。发现项会列出工作流和路径, 不需要之前的运行,并在某次运行找到文件后清除。属于多个工作流的步骤会在每个工作流中 分别判断,在您无法打开的工作流中,路径不会显示。Weave 无法区分故意为空的文件夹 与缺失的文件:如果该位置出现空文件夹是正常的,项目 架构师可以 将该发现项标记为预期, 此后无论路径如何,Weave 都不再针对该工作流中的该步骤报告此问题。在此检查推出之前记录的运行不会保留 警告的措辞,因此其步骤会被报告为未检查,直到再次运行。
月末和工作日。 对于每天最多运行一次的工作流或步骤, 如果这些检查原本会报告的某次运行,与过去 180 天内至少四次同类日期的之前运行一致, 且这些运行相对于其规模的波动不大于其他日期的之前运行,则该运行会被放过。日期类型包括每月的最后一天、 每月的第一天,以及其他情况下的同一星期几。因此,总是很重的月末 加载,或总是在周一较轻的加载,在这些运行相对于其规模比其他日期更稳定时不会被报告。日历只会 放过运行:它从不报告这些检查原本会通过的运行。日期按 UTC 计算,不考虑公共假日和工作日日历。 一天内运行多次的工作流或步骤(包括失败的运行及其重新运行),会像以前一样与其之前的运行进行比较。
基线至少需要四次之前的运行。如果少于四次,该工作流的运行时间会被报告为未检查, 其步骤的行数和空值也会被报告为未检查,并各自说明已完成的运行次数, 而不是基于过少的数据进行判断。写入表但其记录的运行中没有空值计数的步骤, 也会在空值方面被报告为未检查。不写入表的步骤(例如发送电子邮件或导出文件的步骤) 不会检查行数或空值。 过去 30 天内未运行的工作流会被报告为未检查, 无法读取运行历史记录的工作流也是如此——两者都不会被报告为正常。 在声明了行访问的项目中,行数、联接、空值和值分布检查不适用于读取受筛选的任何人:每项检查都是针对整个表衡量的,因此发现项会向他们透露超出其授权范围的行。请参阅行数和表大小。
步骤上次运行所做的更改。 对于步骤上次运行写入的每个表, Weave 会将运行结束后的表与运行开始前的表进行比较,因此不需要之前运行的历史记录。
- 值的分布与上次运行前不同。 某一列的值在其范围内的分布,在运行后与运行前 差异很大。发现项会给出一个偏移分数:0 表示分布未变化,0.25 或以上表示 变化较大,此时 Weave 会报告。只比较包含小数的列。整数列通常是代码、期间或标志, 例如科目编号或月份,每次加载新期间时其分布都会变化。 空值不计入分布;上文的空值检查涵盖了空值。
“运行前”是指该表最近一个包含行的版本。因运行中途失败而留空的版本会被跳过, 因此失败后的第一次成功运行会与最后一份正常数据进行比较。
当步骤写入的某个表出现以下情况时,该步骤的运行会被报告为未检查,并附上原因:
- 其列上声明了行访问;
- 运行前或运行后包含超过 5,000,000 行;
- 比较耗时超过 10 秒;
- 不再保留其运行前的版本——某些 Lakehouse 只将表的早期版本 保留 7 天,因此重写频率低于每周一次的表没有可比较的对象;或
- 首次由该运行填充。
Lakehouse 不保留版本历史记录的项目完全不会接受此项 检查。
类型转换留下的空值。 Extract 步骤写入的每一列都有一个类型,例如文本、整数或日期,
步骤会将每个值转换为该类型。在 StarRocks Lakehouse 上,无法转换的值(例如进入整数列的 N/A)
会存储为空,且运行会无错误地完成。Extract 步骤在 StarRocks 上运行后,
Weave 会针对转换可能丢失值的每一列,统计输入时原本不为空的值,以及其中有多少在输出时变为空,
并报告出现这种情况的每一列。发现项会给出计数和该列的类型。
Weave 判断该步骤在每个工作流中最近一次已完成的运行,因此不需要
之前的运行。
- 输入时已为空的值不计入。空白文本则计入,因为 它在数字或日期列中会存储为空。
- 转换不会丢失值的列(例如整数进入小数列)不计入, 运行后没有空值的列也不计入。
- 如果计数耗时超过 30 秒,或 Weave 统计的行与步骤写入的行 不一致,该运行会被报告为未检查,Weave 会在步骤下次运行时 重新计数。
- 只检查 StarRocks 上的 Extract 步骤。使用辅助 筛选器或按表达式分组的步骤会被报告为未检查;当某列可能丢失值时, 使用 非重复或切片(Limit)的步骤也是如此, 因为 Weave 无法在不进行转换的情况下重新统计其行数。
- 如果该步骤本来就要将这些值留空,项目架构师可以 将该发现项标记为预期。
- 与行数和空值检查一样,此检查不适用于读取受行访问筛选的 任何人。
计划事件。 对于设置了计划事件的工作流, Weave 会将每个事件与其启动的运行以及集群中触发该事件的作业进行比较。每个时间都按事件自身的时区计算, 并在触发到期后 15 分钟再作判断,以便其作业有时间启动。
- 计划事件时间表无效。 已启用的事件,其计划 无法读取。
- 计划运行未启动。 已启用的事件已到期但未启动运行—— 自其上次启动运行以来,或如果从未启动过,则自其保存以来。在集群能够判断时, Weave 会补充说明是集群从未触发该事件,还是它触发的作业失败了。 发现项会列出该事件上次启动的运行或其保存时间,因此只要该事件以同样方式持续出错, 它就始终是同一个发现项。在触发到期后保存过的事件,不会就该次触发 作判断。
- 计划事件在运行期间到期。 事件在工作流仍在运行时到期, 因此当时没有启动运行。计划事件从不会为已在运行的工作流启动第二次运行; 此情况会报告一次,以免比工作流运行更密集的计划在无人察觉的情况下 丢失触发。
- 计划事件与集群不同步。 事件与集群中的作业 不一致:已启用的事件没有作业,或其作业已暂停; 已禁用的事件的作业未暂停;或作业设置的计划或时区与事件显示的不同。 当集群无法读取时,该工作流的计划事件会被 报告为未检查。
已停止启动运行的事件不会有运行结束来通知您, 因此它显示在 Weave 选项卡中,而不是以消息的形式出现。
按计划写入的表。 对于由设置了已启用计划事件的工作流写入的表,
Weave 会检查该表自计划上次到期以来是否已被写入。当写入该表的步骤完成时,
该表即视为已写入。Weave 不查看表的数据,因此看不到在项目步骤之外进行的加载。
与计划事件检查一样,每个计划都按其事件的时区读取,并在到期后 15 分钟再作判断。Weave
只检查您的角色允许您看到的表;如果没有 analyze.table.read
角色,它不检查任何表,其第一行只统计步骤和工作流。
- 表未按计划写入。 写入该表的工作流按计划到期后, 没有任何步骤写入过该表。任何步骤的写入都计入, 包括其他工作流中的步骤或您自己启动的运行。发现项会给出上次写入的时间, 而不是距今多久。失败的运行视为未写入,因此失败的计划 工作流的表既会在此处报告,也会在 上次运行失败下报告。
在以下情况下,Weave 会将表报告为未检查并附上原因,而不是报告为未写入:
- 写入该表的工作流正在运行、已排队,或刚刚完成但其 结果尚未记录;
- 写入该表的步骤在计划到期后的某次运行中被跳过,原因可能是 其自身的条件,或因为它没有要做的事情,例如文件未更改的 导入;
- 写入该表的步骤可能在不留下跳过记录的情况下被跳过:它位于 带有跳转到其他步骤的条件的标准工作流中,或位于 带有失败时转到其他步骤的步骤的标准串行工作流中, 或者它位于带有条件的容器中,或位于可能运行零次的循环中;
- 工作流在到期后完成了一次运行,但该次运行中写入步骤的记录 缺失;
- 项目中任何位置的某个步骤使用 Weave 无法推算其值的变量 来选择其写入的表,因此它可能会写入此表;
- 计划的运行频率低于每 180 天一次,而这正是 Weave 运行历史记录所能追溯的最远时间;或
- 工作流的计划无效,或无法读取运行历史记录。
在以下情况下,表根本不会被检查:
- 它没有时效性阈值(见下文),且没有任何自身设置了已启用 计划事件的工作流写入它。由另一个工作流 运行的工作流(通过运行工作流或 Macro 步骤,或作为放置在其中的 工作流),只通过其自身的计划计入;
- 写入它的步骤全部已禁用、位于已禁用的容器中,或位于 断点处或断点之后;或
- 它是视图。
其中第二条不适用于实际运行的循环内部:循环会运行其中的每个 步骤,即使该步骤已禁用、位于已禁用的容器中,或位于断点处或 断点之后。
在上次到期之后保存的计划事件,要等到再次到期时 才会被判断。
运行时间超过其计划间隔的工作流会跳过运行期间到期的触发, 因此在两次运行之间,其表可能会被报告为 未写入;计划事件在运行期间到期会报告原因。
如果上次写入表的步骤是您无权访问的步骤, 发现项会显示“您无权访问的步骤”,并仍会给出写入时间。 发现项中的“180 天”是 Weave 运行历史记录所能追溯的范围,而不是关于该表的 事实。
设置了时效性阈值的表。 时效性阈值是表两次写入之间允许经过的最长小时数, 范围为 1 到 4,320(180 天)。设置了阈值的表 会根据该阈值进行判断, 而不是根据写入它的工作流的计划进行判断。这样您可以设置比计划更宽松或更严格的界限, 并检查没有任何计划工作流写入的表。与计划一样,当写入该表的步骤完成时, 该表即视为已写入。
- 表未在设定时间内写入。 没有任何步骤写入该表的时间 超过了其阈值。发现项会给出上次写入的时间和 阈值。
在以下情况下,Weave 会将设置了阈值的表报告为未检查并附上原因, 而不是报告为未写入:
- 写入该表的工作流正在运行、已排队,或刚刚完成但其 结果尚未记录;
- 写入该表的工作流在阈值过后启动并完成了一次运行, 但该次运行中写入步骤的记录缺失;
- 项目中任何位置的某个步骤使用 Weave 无法推算其值的变量 来选择其写入的表,因此它可能会写入此表;
- 项目中没有任何步骤写入它,例如您手动加载的表,因此 Weave 没有可用于计算的写入;或
- 无法读取运行历史记录。
被跳过的步骤不会使设置了阈值的表变为未检查:该表仍然 超过阈值时间未被写入。视图不能设置 阈值,将表改为视图会清除其阈值。表的副本, 或从其某个快照创建的表,初始时没有阈值。
要设置阈值,请在项目的 表列表中选择该表,然后选择
查看/编辑表详细信息。在 时效性下,选择 Warn if this table
isn’t written for more than,输入小时数,然后单击 Update。
清除该复选框即可移除阈值。未设置阈值时,该复选框
会列出用于判断该表的计划工作流,或说明
没有您能打开的工作流按计划写入它。对于视图或正在创建的表,
或者没有 analyze.workflow.read 角色时,不会显示 时效性,更改它
需要 analyze.table.write。
您也可以让通过 PlaidCloud MCP 连接的 AI 助手设置
表的时效性阈值(其工具为 table_upsert,参数为
freshness_max_age_hours),或调用平台 API:
PUT /rest/v1/analyze/weave/freshness{"project_id": "<project>", "table_id": "<table>", "freshness_max_age_hours": 24}在数字的位置发送 null 即可清除阈值,该表将恢复为
根据其写入者的计划进行判断。GET /rest/v1/analyze/weave/freshness?project_id=<project>&table_id=<table> 返回
阈值和 scheduled_writers,即该表没有阈值时用于判断它的计划工作流。
读取阈值需要
analyze.table.read 和 analyze.workflow.read 角色,设置阈值需要
analyze.table.write 和 analyze.workflow.read。您只能在您的角色允许您看到的表上
设置阈值,并且项目锁定时不能设置。
工作流读取的、此后又被写入的表。 对于读取由另一个工作流写入的表的工作流, Weave 会检查自该工作流上次读取该表以来,是否没有其他工作流写入过该 表。当某个步骤将表指定为输入或输出并在某次运行中完成时,该表即视为被读取或写入。 Weave 读取的是运行历史记录所记录的内容,而不是表的数据。
- 读取的表在上次读取后又被写入。 工作流在其某次运行中上次读取了某个表, 而此后另一个工作流写入了该表, 因此其结果可能已过时。发现项会列出上次读取该表的运行, 以及写入该表的工作流。设置了已启用 计划事件的工作流,或由设置了计划事件的另一个工作流运行的工作流,只有在 运行它的计划于写入之后到期时才会被报告;没有任何计划运行的工作流 会立即被报告。
以下情况不计为此后被写入:
- 工作流自身的写入,包括在其运行期间由它通过 工作流:运行、工作流:循环或工作流: 有条件运行步骤运行的工作流所做的写入;
- 工作流在某次运行中、在该运行的任何步骤读取之前写入的表, 例如暂存表,除非该写入是由表:追加或表: Upsert 步骤,或由带筛选器的表:就地删除步骤完成的,这些步骤会保留 表中的其他行;以及
- 在执行写入的步骤上次保存之前所做的写入,因为该步骤当时 可能写入的是另一个表。
在以下情况下,Weave 会将工作流报告为未检查并附上原因,而不是报告为落后:
- 它正在运行,或刚刚完成但其结果尚未记录;
- 读取该表的步骤在写入之后的某次运行中被跳过;
- 运行它的计划无效;
- 其最近的运行中没有一次完成了对该表的读取,而另一个工作流 已经或可能已经写入了该表;
- 读取该表的步骤自其上次成功运行开始以来已被保存, 因此 Weave 无法判断该次运行是否读取了该表。任何保存都计入,即使 该保存没有更改步骤读取的任何内容;
- 它的某个步骤读取的表无法从步骤设置中推算出来, 例如 AI:LLM 步骤、Report 步骤、运行:远程 Python 步骤,或 读取多个表并通过搜索找到其中一个的步骤(表:去重合并 或表:全部合并步骤可以这样做);使用变量选择表;使用多个表共有的名称 指定表;读取视图;或读取另一个项目中的表;
- 它读取的表也被宏写入(Weave 看不到宏的运行), 或被另一个工作流中此后运行过的步骤写入,而该步骤使用变量选择其写入的表、 使用多个表共有的名称指定表,或写入 Weave 无法推算的 表;或
- 无法读取其运行历史记录。
过去 30 天内没有运行的工作流不会接受此项检查。
此检查看不到的内容:
- 早于 Weave 所读取运行历史记录的读取和写入,即过去 30 天内,以及每个工作流的最近 20 次运行;
- 检查表的步骤条件,它不计为读取该表;
- 另一个工作流对某个表的写入,而本工作流在同一次运行中向该表添加行后 又读取该表,除非它使用表:追加或表: Upsert 步骤添加这些行;
- 某个步骤较早的读取,而工作流的另一个步骤更近期读取了同一个 表;
- 宏内部由使用变量选择其表或 写入 Weave 无法推算的表的步骤所做的写入;以及
- 在写入步骤上次保存之前所做的写入,即使该保存 没有更改其写入的任何内容,直到其工作流再次运行。
如果没有 analyze.table.read 角色,则不会以此方式检查任何工作流。
如果写入或被读取的工作流或表是您无权访问的,
发现项会显示“您无权访问的工作流”或“您无权访问的表”,
且不说明数量。
类型没有 Weave 规则的步骤会被报告为未覆盖,而不是没有问题。
依赖失败运行的表。 当工作流的上次运行在写入表的步骤完成之前失败时, 该表仍保存其之前的数据,或只包含部分新数据。Weave 会沿着读取该表的步骤 及其写入的表,跨项目中的各个工作流跟踪该表,并报告依赖它的 内容:
- 读取失败运行未完成的表。 某个工作流读取该表,或读取 由它经过任意多个步骤构建出的表。发现项会列出该工作流 读取的表、失败运行未完成的表,以及失败的工作流 及该运行的开始时间。
- 显示失败运行未完成的表。 某个仪表板上有一个图表,基于 该表或由它构建的已发布表,或基于读取此类表的 SQL 数据集。 Weave 读取 SQL 数据集的模板逻辑时会去掉 标签,因此位于从不执行的分支中的表也可能被计入。 该发现项是关于 仪表板的,并列在其图表所显示的表所属的每个项目的 Weave 选项卡上。
Weave 注意到仪表板“Board Pack”:它显示的表“Margin”构建自 表“Sales”,而工作流“Import Sales”在其上次运行中(10 月 27 日 09:15 UTC) 未能完成该表的写入,因此其图表可能显示过时或 不完整的数据
每个失败的工作流都是一个独立的发现项,当该工作流的上次 运行不再失败时,该发现项就会消失。失败的工作流不会在此处收到关于其自身运行的通知; 它的 上次运行失败发现项涵盖了这一点。
以下情况不计为失败运行未完成的表:
- 其步骤是有意跳过的表,例如条件不满足的步骤、 已禁用的步骤,或跳过了已加载文件的导入;
- 其步骤可能被某次运行略过的表。在非高级工作流中, 条件的跳转,或串行工作流中失败步骤的跳转,会涵盖每个 步骤。在高级工作流中,它涵盖位于检查条件的执行容器中或之后的步骤, 以及循环中的步骤;
- 在失败运行开始后被另一个工作流完全替换(而不是添加行)的 表;以及
- 对于工作流而言,它在上次读取该表的运行中、读取之前已自行替换的 表。
正在运行的工作流要等到其运行结束后才会被判断。当无法读取运行历史记录时, Weave 会将这些报告为未检查,而不是没有问题。
此检查看不到的内容:
- 没有任何步骤记录失败就结束的运行,例如服务器 停止的运行,以及被人停止的运行;
- 步骤使用变量选择、使用多个表共有的名称指定、 通过视图读取或从另一个项目读取的表;
- 基于已保存查询的仪表板图表,或基于去掉模板逻辑后 Weave 无法读取其 SQL 的 SQL 数据集的图表;
- 名称由模板构建的表;
- SQL 数据集在未指定架构时引用的表,除非该数据集自身的架构 是项目的报表架构;
- 使用 Snowflake 或 Databricks 数据仓库的项目中的任何 SQL 数据集;
- 未发布的表,以及 Panel 应用;以及
- 早于 Weave 所读取运行历史记录的运行,即过去 30 天内,以及 每个工作流的最近 20 次运行。
您只能看到您能打开的仪表板的发现项。如果没有
analyze.table.read 角色,这两项检查都不会运行。
异常的指标总计。 Weave 每天读取项目的 指标,并报告最近一个已完成期间的结果与平常相差很大的指标, 同时指出导致该变化的项,例如某个客户或某个工厂。请参阅 异常的指标总计。
审核单个工作流
Section titled “审核单个工作流”审核会在您依赖某个工作流之前对其进行检查。它会对该工作流及其步骤(包括它运行的任何工作流的步骤) 运行 Weave 的检查,另外还有三项 仅在审核中运行的检查,因为它们读取的内容超出了 Weave 选项卡 每次打开时所能承受的读取量:
- 为自身输入提供数据的分摊。 对于工作流运行的每个分摊步骤, 检查其写入的内容是否会通过任意步骤、在任意工作流中回流到 它所分摊的表或其驱动因素表。如果会,该步骤分摊的数额或分摊方式 就取决于它在之前某次运行中分摊的结果。Weave 会列出该循环经过的步骤, 并请您确认该循环是否是有意的。不经过任何分摊 步骤的循环(例如读取其所追加表的增量加载)不会被 报告。
- 分摊驱动因素表和列。 检查分摊 步骤使用的驱动因素表是否存在,以及是否包含该步骤从中读取的每一列。对于步骤用常量或表达式填充的动因列, 不会查找。在其他任何位置构建的驱动因素表按其当前状态 进行检查;当此工作流中的某个步骤构建该表时,在该步骤运行之前无法得知其列, 因此 Weave 会将该分摊报告为未检查,而不是 通过。当步骤使用变量或文件夹路径选择其驱动因素表、当工作流是宏、 以及当您的角色无法看到该表时,Weave 也会将该分摊报告为未检查。
- 重命名列上的行级安全。 对于工作流写入的每个表, 检查其中是否有一列被标记了某个行级安全属性所使用的维度, 但未以该属性命名。行级安全只对以其属性命名的列进行筛选, 因此不会对该列进行筛选。此检查需要项目的架构师角色;对于其他任何人, 审核会说明未检查此项;对于工作流使用变量或文件夹路径 指定的表,审核同样如此。
审核开头会说明发现了什么以及覆盖了工作流的多大范围, 并且从不以“一切正常”结尾:
Weave found 2 problems in the workflow "Q3 Close". It couldn't finish checking 1of its 8 steps (listed below), so it may have missed problems in those. See belowfor what these checks don't cover.
Weave noticed the step "Allocate rent": it uses the column "sq_ft" from its drivertable "Floor space", which doesn't have that column. Pick a column the table has,or add "sq_ft" to it.Weave noticed the step "Allocate IT cost": its output flows back into its drivertable "IT driver" through "Build IT driver", so how it spreads what it allocatesdepends on what it allocated on an earlier run. Check whether that loop isintended.Weave hasn't checked the step "Allocate IT cost" — whether its driver table"IT driver" has the columns it uses: the step "Build IT driver" builds thattable, so its columns aren't known until that step runs.您的角色看不到的步骤会计入总数,审核会说明 未检查这些步骤。
审核会列出它不检查的内容。它不会对表运行 Weave 的检查 ——按计划写入的表是否延迟,以及工作流读取的表此后是否被写入—— 这些检查会读取整个项目,并在 Weave 选项卡中运行。对于包含分摊步骤的工作流,它不检查 每笔要分摊的金额是否都能找到匹配的动因行或维度成员、 源表和驱动因素表的数字是否处于同一明细级别, 也不检查经过在 SQL 中或使用变量指定其表的步骤的循环。
要审核工作流,请在其画布或 步骤网格中打开它,然后选择 检查。能够编辑该工作流并读取项目表的人员可以看到此按钮。 Weave 检查窗口按顺序显示:
- 审核的开头几行;
- 摘要(由 AI 撰写),当审核有摘要时;
- 审核的 问题,然后是 无法检查的内容。摘要指向的问题 会标记为 在摘要中,步骤发现项旁边的 转到会在您选择 检查的位置 选中该步骤;
- 此检查未涵盖的内容,始终位于最后。
再次选择 检查会在同一窗口中运行新的审核。
您也可以让通过 PlaidCloud MCP 连接的 AI 助手
审核工作流——其工具为 workflow_review——或调用平台 API。
审核需要对项目的步骤、工作流和表具有读取权限。上述
三项检查不会出现在 Weave 选项卡中;Weave 只在审核中
运行它们。
在 Weave 检查窗口中以及通过平台 API,发现问题的审核还会附带一段 由 PlaidCloud 内置 AI 撰写的一两句话的摘要,以及最多三个 应优先查看的问题。AI 只能看到审核的问题。在返回 摘要之前,它指向的问题必须是审核自身的问题,它引用的任何名称 和写出的任何数字都必须出现在这些问题中,并且它不得 使用“没有其他问题”之类的措辞。未通过的摘要会被丢弃, 审核返回时不带摘要。没有问题的审核没有摘要。通过 AI 助手进行的审核没有摘要;助手会自行阅读发现项。
运行结束时收到通知
Section titled “运行结束时收到通知”工作流运行结束时,Weave 会检查该工作流,并以应用内消息的形式通知每个问题的 负责人(请参阅为发现项指定负责人), 告知其针对该工作流、其运行以及其步骤的已保存配置 所发现的、尚未在项目的 Weave 选项卡中阅读的问题。没有负责人的问题, 或其负责人已无法看到的问题,会发送给该运行 所属的人:启动该运行的人,或者对于计划运行,为上次保存该计划的人。 每个问题只提及一次。在您于 Weave 选项卡中阅读之前, 后续运行不会再次提及它,因此运行多个工作流的 Workflow Loop 不会让重复的消息占满屏幕。Weave 按钮上的计数 会一直包含它,直到您阅读为止。
该消息在屏幕上停留 30 秒,并带有 打开 Weave链接, 点击后会打开项目的 Weave 选项卡,并定位到有关所运行工作流的发现项。单击 消息上的其他任意位置即可关闭它。
当有关某个项目的 Weave 消息显示在屏幕上时,有关同一 项目的新消息会并入其中,而不是显示在其下方。消息显示最新的 语句,后面跟着一行类似 此项目中另有 2 项。 的文字,并从最新一条起在屏幕上 停留 30 秒。当消息涉及不同的工作流时, 打开 Weave会打开整个 Weave 选项卡。因此,几乎同时失败的多个工作流 只会给您一条消息,而不是每个工作流一条。就绪状态 提醒始终单独显示。
您阅读某个问题后,只有当其内容 发生变化时才会再次提及它。运行发现项描述的是它所来自的运行——日期、时间、 计数——因此每晚都失败的工作流,在您阅读上一条后,下一次 失败时会再次提及。配置问题在每次运行时的内容都相同, 因此一旦您阅读过,就不会随每次运行重复。
已停止的运行不发送任何内容,无论是谁停止的。由 Macro Run 或 Macro Concurrent 步骤运行的工作流不会单独发送任何内容,且该次调用不计入 其运行次数;由运行工作流或 Workflow Loop 步骤启动的工作流, 与其他运行一样算作该工作流的一次运行。Weave 无法检查的内容从不 以这种方式发送,关于按计划写入的表,或关于工作流读取后 又被写入的表的发现项也不会:Weave 会在两次运行之间通知这些内容。 请参阅两次运行之间收到通知。
收到通知并不等于已阅读:提醒不会将该发现项 在 Weave 选项卡中标记为已读,点击其 打开 Weave链接也不会。
消息所通知的每个问题都会计入页眉中 Weave 按钮上的计数。请参阅 页眉中的 Weave 按钮。
两次运行之间收到通知
Section titled “两次运行之间收到通知”有些问题在没有任何运行时也会出现:未按计划 或未在时效性阈值内写入的表;未启动的 计划运行,或在工作流仍在运行时到期的计划运行;其读取的表在上次读取后 又被另一个工作流写入的工作流;以及依赖于失败运行 未完成的表的工作流或仪表板。任何运行的 结束都无法通知您这些问题,因此 Weave 每小时检查一次各项目中的这些问题, 并以应用内消息的形式通知每个问题的负责人(请参阅 为发现项指定负责人)。
无论多少次检查发现同一问题,每小时检查都只会通知您一次, 并且它对某个项目的首次检查会通知您已存在的问题, 无论它们已存在多久。只有当问题消失后 又再次出现,或者您阅读后其内容发生了变化(例如 之后的计划运行同样未启动)时,它才会再次通知您。计划问题也属于 工作流自身的检查,但一旦每小时检查已就此通知过您, 工作流下一次运行结束时的消息就不会重复它,直到您阅读 为止——请参阅运行结束时收到通知。同一项目中的多个问题 会合并为一条消息,消息会统计问题数量并引用第一个问题:
Weave 注意到项目“Finance Close”中有 3 个问题,首先是表 “Sales Daily”:步骤“Load Sales”上次于 10 月 14 日 06:00 UTC 写入该表,而 工作流“Nightly Load”自那时起就应按计划运行
有多个工作流写入的表在有人指定负责人之前没有 负责人。当该表未按计划写入时,Weave 会通知每个 本应写入它却未写入的工作流的负责人。其他任何没有负责人的问题 都不会发送;它会列在项目的 Weave 选项卡中。
检查以每个负责人的身份运行,因此消息只会列出您的角色允许您 看到的内容。只有当您是项目的活跃成员,且您的角色允许您查看 其步骤和工作流时,您才会收到通知;只有当您能读取表时,才会收到有关表的通知。
该消息在屏幕上停留 30 秒,并带有 打开 Weave链接, 点击后会打开项目的 Weave 选项卡;当消息中的每个问题都涉及同一个工作流时, 会定位到该工作流。消息只在您登录时显示,但它所通知的每个 问题都会计入页眉中 Weave 按钮上的计数, 因此您错过的消息仍会在那里计入。收到通知不会将 发现项标记为已读。
将发现项标记为已读
Section titled “将发现项标记为已读”每个发现项都带有一个 ID,您可以将其标记为已读,使其不再显示为 新发现项——在项目的 Weave 选项卡中,单击其卡片上的 标记为已读(请参阅 将发现项标记为已读)。该 ID 由发现项本身派生,因此如果底层问题发生变化, 您已忽略的发现项会以新发现项的形式重新出现——例如,您在修复一列后标记为已读的步骤, 如果之后另一列出错,就会重新出现。
已读状态仅属于您自己。将发现项标记为已读不会为项目中的 其他任何人将其标记为已读。
当写入延迟表的工作流正在运行时,Weave 会改为将该表报告 为未检查。如果您在此期间将任何发现项标记为已读,而运行 结束时没有写入该表,则其发现项会以新发现项的形式重新出现。
在一个工作流中重复列出的两个不同步骤是两个发现项,因此将其中一个 标记为已读不会影响另一个的未读状态。没有名称的工作流显示为“未命名 工作流”,无法运行的检查以其标题命名,例如“上次运行失败”。
简报是同一份报告,只保留您尚未阅读的内容,口径 相同。您可以随时请求简报,也可以让它以 应用内通知的形式送达,并带有指向项目 Weave 选项卡的 打开 Weave链接。
Weave 无法检查的发现项与其他发现项一样,也属于简报的一部分。悄悄 丢弃这些发现项的简报,恰恰就是第三种答案所要防止的那种令人安心的沉默。