Triage 会根据配置文件分析诊断数据。
概览
借助分类功能,任何人都能轻松添加新的方式来分析 fx snapshot
数据
偏离标称条件的情况。
默认情况下,配置文件的读取来源
//src/diagnostics/config/triage/*.triage
。只需在其中添加新的配置文件即可。
配置文件语法为 JSON5。
每个配置文件指定四种配置:选择器和评估 (统称为“指标”)、操作次数和测试次数。
- 选择器会加载值,以供评估和操作使用。
- 评估值会计算值,以供评估和操作使用。
- 操作决定着如何对特定指定值执行操作。
- 测试包括示例数据,用于验证指定的操作是否会触发 正确。
每个 Select、Eval、Test 和 Action 都有一个名称。因此,配置的结构 文件为:
{
"select": {
"select1": "type:component:node/path:property",
"select2": "type:component:node/path:property"
},
"eval": {
"name1": "select1+select2",
"name2": "select1 - select2"
},
"act": {
"action1": { .... },
"action2": { .... }
},
"test": {
"test1": { .... },
"test2": { .... }
}
}
名称和命名空间
Select、Eval、Action、Test 和 config 文件名由
后跟零个或多个小写字符或下划线字符
字母数字字符或下划线字符。因此,“abc123”和“_abc_123”有效
但“123abc”“a.b.c”和“abc-123”。具体而言,文件名
不得包含除 .triage
扩展名之外的其他句点。
一个文件中的评估、测试和操作可以引用选择器、评估和操作
另一个文件中文件基名用作命名空间。::
用作
分隔符。例如,如果文件 foo.triage
已加载且包含指标
名为 bar
,则任何配置文件都可以引用 foo::bar
。
名称可以在“指标”“测试”和“操作”之间重复使用,但不能在“选择”之间重复使用 和评估。
用户定义的名称必须以小写字母开头。提供的语言 函数都以大写字母开头。
注意:程序的当前版本不一定会强制执行这些条件 限制。
选择器
选择器使用选择器格式。第一个 :
前面的文本用于选择
从 inspect.json
文件中获取组件名称。以 .
分隔的中间部分
指定检查节点名称,此名称形成一个以
第二个 :
。
计算
求值字符串是带有普通运算符优先级的内插数学表达式。
()。
算术运算符为 +
-
*
/
//
/?
//?
。/
是浮点除法;//
为整数
部门。除号为 ?
的除法运算符返回 Problem::忽略除以 0 时。
函数是函数名称 '(', 逗号分隔表达式列表, ')'。 提供的功能包括:
- 布尔值
<ph type="x-smartling-placeholder">
- </ph>
And(1+ args)
Or(1+ args)
Not(1 arg)
- 如果值是
Missing
类型错误,则Missing(value)
会返回 true 。 - 如果值是任何类型的错误,
Problem(value)
会返回 true。 True()
会返回 trueFalse()
返回 false
- 数字
<ph type="x-smartling-placeholder">
- </ph>
Min(1+ args)
Max(1+ args)
Abs(1 arg)
- 功能性
<ph type="x-smartling-placeholder">
- </ph>
Fn([name1, name2, ...], expression)
Map(function, vector1, vector2, ...)
Fold(function, vector, optional_start_value)
Filter(function, vector)
Apply(function, [arg1, arg2, ...])
Count(vector)
- 时间
<ph type="x-smartling-placeholder">
- </ph>
Days()
、Hours()
、Minutes()
、Seconds()
、Millis()
、Micros()
、 和Nanos()
计算值以与单调时间戳进行比较。Now()
会返回诊断数据发生时的大致时间戳 创建。
- 其他
Option(value1, value2, value3...)
会返回第一个有用的值, 支持选择器迁移和默认值:第一个非空列表, 非缺失值(如果有);或者为空列表;或缺失。Annotation(string)
会从 注释.json 文件(如果存在)。SyslogHas(regex)
、KlogHas(regex)
、BootlogHas(regex)
退货true
如果 syslog、内核日志或上一次启动日志包含与以下内容匹配的行 正则表达式。StringMatches(value, regex)
将指定的正则表达式应用于指定的 值,如果有匹配,则返回 true。正则表达式的语法是 支持。正则表达式 crate。
指标类型遵循从检查文件中读取的类型。目前,UInt 为 转换为 Int 类型。在混合 Int 和 Float 上运行可提高 转换为浮点数。
布尔运算为 >
<
>=
<=
==
!=
。相等性测试 ==
和
!=
比较
数字、布尔值、字符串和向量。>
<
>=
<=
仅会比较数字。
空格在所有地方都是可选的,但建议针对 infix 运算符使用空格。
无需专门分隔指标名称(包括命名空间名称)。
函数式编程和矢量
每个选择器实际上都会返回一个向量,但单项向量 自动解封以进行算术和布尔值 计算。检查没有通配符的选择器会返回一个单项 向量,除非相同的名称在 inspect.json 中多次出现。
带通配符的选择器、bootstrap/driver_manager
和
core/network/netstack
以及(最终)日志选择器可能会返回
多个项。为处理此类值,Triage 提供了
以下函数:
- Fn(参数, 表达式) - 例如
Fn([a, b], a+b)
- 映射(函数, 矢量 1, 矢量 2...)
- Fold(function, vector) 或 Fold(function, vector, start_value)
- 过滤器(函数、矢量)
- 计数(向量)
值的向量以 [ expr, expr, expr ]
的形式表示。
如果 Map 的 values
参数不是矢量,则其值会应用于每个
迭代。如果所有 values
都不是向量,或者未提供 values
,则
返回空矢量。如果矢量 values
长度不同,则
最短的一个值决定结果长度,其余值不予使用。
Count() 不会检查矢量 values
中的项的类型。的
非矢量 values
会返回 Missing。
如果 Fn 表达式是完整的“eval”这个表达式的名称, 表达式可用作映射、折叠或过滤器的第一个参数。
如果一个函数的参数原位错误,则是向其传递的函数 会返回 Missing。如果函数的评估失败,例如由于 则传递它的函数可能会返回部分值:
- 地图会返回一个矢量,该矢量的某些元素可能缺失。
- Fold 返回 Missing。
- 过滤器要求其过滤器函数返回布尔值 true 或 false。如果 函数返回任何其他内容,包括缺失,过滤器添加缺失 值。
操作
每个 Action 都会决定如何显示指定选择器的信息。
目前,我们提供两种类型的操作:“警告”和“采样平均值”操作包括
通过为 type
字段提供适当的值来指定。
警告类型
Warning
是一种操作,用于在满足布尔值条件时发出提醒。
。
Warning
支持以下字段:
trigger
是必填字段,用于指定提供 布尔值。print
是必填字段,用于指定在发出警告时要输出的字符串。 问题。tag
是可选字段,可将代码与此 Action 相关联。file_bug
,可选的字符串字段,用于指定应提交 bug 位置和位置。分类不会直接提交 bug;此字段只是告知 使用者(真人用户或自动化流水线)。它可以是问题跟踪器 组件(例如“Fuchsia > Internationalization (i18n)”)或对其他问题跟踪器的引用 即消费者所理解的内容
"actions": {
"disk_usage_high": {
"type": "Warning", "trigger": "disk_used / disk_total > 0.95", "print": "Disk usage is high!"
}
}
刻度盘类型
Gauge
是调用 Triage 时特定值的快照。
Gauge
支持以下字段:
value
是必填字段,指定要显示的值。format
是可选字段,用于指定刻度盘值的格式规则。
格式
通过 format
字段,用户可以控制刻度盘值的显示方式。如果
未提供此字段;如果指定的值无效,则值将为
按原样显示format
支持以下值:
percentage
:以百分比值的形式输出浮点数。
"actions": {
"disk_usage": {
"type": "Gauge", "value": "disk_used / disk_total", "format": "percentage"
}
}
测试
每个测试都会指定以下内容:
- 示例数据,由
inspect
键控 - 在给定数据的情况下应触发的操作列表,由
yes
键控 - 在给定数据的情况下不应触发的操作列表,由
no
键控
示例数据与 inspect.json 文件的格式相同:映射数组
其中,每个映射都包含 path
和 contents
字段。
"tests": {
"test1": {
"yes": ["action1", "action2"],
"no": ["action3"],
"inspect": [
{
"path": "global_data",
"contents": {"root": {"stats":
{"total_bytes": 10, "used_bytes": 9}}}
}
]
}
}