尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Perfetto UI Data Explorer 实战指南:用可视化节点管道零 SQL 完成 Trace 数据分析

Perfetto UI Data Explorer 实战指南:用可视化节点管道零 SQL 完成 Trace 数据分析 Perfetto UI Data Explorer 实战指南用可视化节点管道零 SQL 完成 Trace 数据分析【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfettoData Explorer 是 Perfetto UI 内置的可视化查询构建器它把一次 Trace 分析建模成一条由节点组成的管道pipeline从数据源出发依次串联过滤、聚合、连接等操作结果实时呈现。本文基于 />Data Explorer 是什么Data Explorer 是一个不写 SQL 也能探索 Trace 数据的交互式分析工具其核心思想是把分析过程视为一条管道先选定数据源一张标准库表或自定义 SQL再在可视化画布上把过滤、聚合、连接等操作像积木一样逐级串联每一步的结果都会实时显示在表格中随建随看。它最适合以下场景探索陌生数据在正式写查询之前先浏览表里有哪些列、有哪些取值定位性能问题快速切片、过滤、聚合事件缩小时间消耗的分布范围迭代式分析一步步搭建查询并在每个阶段检查中间结果结果可视化用 Charts 节点把查询输出绘制成图表和仪表盘或作为 debug track 回导到主时间线上。在 Perfetto 仓库中该功能以 UI 插件形式实现位于 ui/src/plugins/dev.perfetto.DataExplorer其中 query_builder/core_nodes.ts 集中注册了全部内置节点类型是理解本文所有节点的源码入口。核心特性无需 SQL节点完全抽象掉 SQL 概念。例如加列不需要理解 JOIN条件表达式通过表单构建而不是手写 SQLPerfetto 专属能力一等公民支持 Trace 特有操作——时间区间求交、按时间线选区过滤事件、生成时间区间、把 start/end 事件配对成 slice标准库感知与 PerfettoSQL 标准库 深度集成选择表作为数据源时工具知道存在哪些表、哪些表在当前加载的 Trace 中实际有数据可视化图在画布上连接节点即可组合查询图结构与查询结构一一对应交互式数据网格结果随构建实时刷新还能直接从网格创建新节点——点击某个列值即可添加过滤器或基于外键从关联表补充列图表与仪表盘任意查询挂上 Charts 节点即可出图多个可视化可组合成仪表盘需要时拥有完整 SQL 能力构建器底层生成真实 SQL随时可以检视生成结果内置节点不够用时可直接切换到 Query 节点状态持久化图保存在 permalink 中并在浏览器本地缓存跨会话不丢失任何你打开的 Trace 都能复用同一张图导入/导出查询图可以存为 JSON 文件分享给他人。核心概念Project项目Data Explorer 中的工作按project组织。每个 project 包含一张查询图query graph和任意数量的仪表盘dashboard。可以建多个 project 区分不同分析任务也可以全部放在一个 project 里完全由你决定。Node节点——四大分类节点是 Data Explorer 的核心概念共分四类源码中的注册关系见 core_nodes.ts 的registerCoreNodes()Source源节点提供初始数据如 SQL 表、slice 查询、自定义 SQL 表达式Modification修改节点接收单一输入并变换它如过滤、聚合、排序、加列。每一行从一个上游节点流入变换或过滤后流出Multi-source多源节点组合两个及以上输入没有单一主数据源如 join、union、interval intersect、create slicesExport导出节点位于管道末端把结果输出到查询图之外仪表盘视图、指标定义metric spec、或用于跨 Trace 分析的 trace summary。Graph画布节点排列在画布上从一个节点的输出端口拖到另一个节点的输入端口即可连线。多数节点只有单一主输入垂直流向部分节点还接受次级输入侧边端口用于 join 类操作。数据自左向右或自上而下流动每个节点接收上游节点的输出并把自身输出传给下游。插入节点点击目标节点上的按钮新节点会自动被接入该节点与其下游连接之间也可以直接从数据网格插入例如点击某个单元格的值即可内联添加一个基于该值的 Filter 节点删除节点选中后按Delete或使用右键菜单。如果被删节点位于管道中间其主父节点会自动重连到主孩子节点保持图的其余部分完整撤销/重做使用工具栏按钮即可。列类型Column Types每一列都有 PerfettoSQL 类型。类型影响数据网格中的显示方式、该列可用的操作以及网格交互行为。类型说明int整数值double浮点值string文本boolean布尔值timestamp绝对时间戳纳秒网格中以人类可读时间显示duration时长纳秒网格中以可读单位ms、us 等显示arg_set_id指向一组 Trace 参数的引用启用 Add Columns 中的From args能力id指向已知表中特定行的整数 ID网格中显示为时间线链接并支持外键列补充joinid类似id但专门用作连接键bytes原始字节序列实际中很少遇到类型通常从标准库 schema 自动推断。由 Query 节点或计算表达式产出的列可能需要通过 Modify Columns 或 Add Columns 中的类型选择器手动指定。结果Results选中图中的任一节点其结果会显示在画布下方的数据网格中。网格支持列排序、列过滤和新增列大结果集通过查询引擎分页处理。列类型驱动特殊单元格格式化——duration 以可读单位显示ID 直接链接到时间线。快速上手Smart Graph最快入门的方式是导航面板中的Smart Graph。它会检查当前加载的 Trace自动生成一张图把所有有数据的 Core 表和 Very Common 表都放进去无需任何手动配置即可总览 Trace 中可用的数据。探索时建议优先关注Very Common表——它们是官方推荐的起点。Core 表是直接取自 Trace Processor 的未经筛选集合仅为完整性而收录不作为推荐起点。详见下文 Table 节点的 importance level 说明。注意has data有数据指示是尽力而为的并非所有标记为有数据的表都一定有行把它当作提示而非保证。构建查询添加源节点点击画布左上角的蓝色按钮打开节点菜单在Sources下选择数据起点节点说明快捷键Table使用任意标准库表TSlices基于 Trace 线程 slice 的预配置查询LQuery自定义 SQL 查询列类型可能需要手动设置QTime Range时间区间可手动输入或从时间线选区同步—添加操作节点选中某个节点后打开节点菜单选择操作新节点会自动接入被选节点。操作分为三类Modification 节点变换单一输入节点说明Filter按值、条件、集合成员或时间区间过滤行Aggregation分组并添加聚合列Sort按一列或多列升序/降序排列Modify Columns重命名、移除或修改列类型Add Columns从次级数据源或计算表达式添加列Limit and Offset限制返回行数Filter During保留落在次级数据源区间内的行Counter to Intervals把计数器数据只有时间戳、没有时长转换为带ts和dur的区间Charts以柱状图、直方图等可视化数据点击柱子可添加过滤Multi-source 节点组合多个数据源节点说明Join基于共享键合并两个数据源的列Union把多个数据源的行堆叠成单一结果Interval Intersect只返回两组时间区间重叠的部分Create Slices把两个数据源的 start/end 事件配对成 sliceExport 节点在查询管道之外产出结果节点说明Export to Dashboard把数据源导出到仪表盘Metrics用值列和维度定义 Trace 指标Trace Summary把多个指标打包成一个 trace summary 规格运行查询与查看结果大多数节点在构建图的过程中自动执行。需要手写 SQL 或先完成输入配置才能运行的节点如 Query 节点会显示Run Query按钮配置就绪后点击即可。点击任意节点选中它其结果出现在 Data Explorer 底部的数据网格中网格支持列排序点击列表头排序列过滤在网格内联过滤值导出到时间线通过结果面板菜单中的Export to Timeline把结果作为 debug track 回传到主时间线。要查看选中节点生成的 SQL点击节点侧边栏的SQL标签页Proto标签页则展示节点内部的结构化查询表示proto 形式便于调试或以编程方式分享查询图。导入 / 导出与状态持久化使用画布菜单中的Export to JSON把当前图保存为 JSON 文件用Import from JSON重新加载。这在与同事分享查询管道、跨会话保存工作成果时非常有用。实现层面图的序列化/反序列化与 JSON 文件下载逻辑位于 json_handler.ts 与 graph_io.ts其中exportGraph/importGraph还包含未保存变更的确认与最近图历史记录管理。此外图会保存在 permalink 中并缓存在浏览器本地见 recent_graphs.ts因此不会跨会话丢失且同一张图可在任意 Trace 上复用。节点参考Node ReferenceSources 源节点Table加载 PerfettoSQL 标准库 中的任意表。选择表时Data Explorer 会显示哪些表存在并高亮当前加载 Trace 中有数据的表has data 为尽力而为的提示见上文。表带有重要度标记表示其通用程度。这一映射在 table_list.ts 的getImportanceLabel()中实现级别标签含义coreCore直接取自 Trace Processor 的未经筛选、无倾向性表集合——为完整性收录不作为起点推荐highVery common推荐作为分析起点的表mid无徽标常见表不显示标签lowDeprecated已废弃、可能被移除的表Smart Graph 会自动加入所有有数据的 Core 与 Very Common 表从 Very Common 表开始探索。Slices覆盖 Trace 中所有线程 slice 的预配置数据源线程和进程元数据已预先 join 好——直接暴露ts、dur、name、tid、pid、thread_name、process_name等列无需手动 join。等价于带线程/进程上下文查询slice表是不知道要 join 哪些表时探索事件的绝佳起点。从源码看该节点的查询基于标准库slices.with_context模块视图为thread_or_process_slice见 slices_source.ts 的getStructuredQuery()其列定义含id、ts、dur、track_id、process_name等类型逐列标注也在同一文件中。Query自由 SQL 编辑器内置源节点不够用时使用。Query 节点只接受一条SELECT语句可在其前加入INCLUDE PERFETTO MODULE语句以引入标准库模块不允许其他语句——不能CREATE、不能INSERT、不能多条SELECT。如果其他节点连接到该节点的输入端口可以在查询中以$input_0、$input_1等引用它们例如在SELECT中写FROM $input_0。这样可以在任意上游节点的输出之上组合自由 SQL。列类型永远不会从任意 SQL 推断——如果希望列类型正确用于链接渲染、时长格式化、外键补充等必须用下游的 Modify Columns 节点手动设置。Time Range作为数据源使用的时间区间。区间可手动输入也可从当前时间线选区同步——后者会随选区变化动态更新。常用于 Filter During 或 Interval Intersect 的输入。从源码看core_nodes.ts新建节点时会尝试读取trace.selection.getTimeSpanOfSelection()初始化 start/end并默认为静态isDynamicfalse模式。Modification 节点Filter过滤家族过滤家族共有三个节点覆盖不同类型的过滤需求三者都只减少行数、不改变列。Filter标准按条件过滤行。多数情况下无需手动创建——直接从待过滤节点的结果中操作更快点击单元格值添加该值的等于/不等于过滤点击列表头弹出选择器勾选要过滤的值。手动创建 Filter 节点时支持两种模式Structured结构化在 UI 中选择列、操作符和值。可用操作符、!、、、、、glob、is null、is not nullFreeform自由形式直接写原生 SQLWHERE表达式用于结构化模式无法表达的场景如多列条件或无法放入选择器的子表达式。多个条件可用AND全部满足或OR任一满足组合——在节点级别切换。由于 AND/OR 模式作用于整个节点类似(X OR Y) AND Z的复杂表达式需要用两个串联的 Filter 节点实现一个用 OR 表达X OR Y另一个用 AND 表达Z。源码层面节点属性filterMode、filters、filterOperator定义在 filter_node.ts 的FilterNodeAttrs中。Filter In按行只保留某列值出现在次级节点输出中的行等价于 SQLWHERE col IN (SELECT ...)。从主输入选一个基列、从次级输入选一个匹配列——当基列值出现在匹配列中时保留该行。若两个输入之间只有一个公共列会自动预选。典型用法把 slice 过滤到只属于特定线程集合或按一组 track ID 过滤计数器。Filter During按时间只保留时间区间与次级数据源区间重叠的行专为 Trace 时序过滤设计——例如只保留发生在某个任务、某一帧或某个阶段期间的事件。关键选项Clip to intervals默认开启输出ts和dur会被裁剪到与过滤区间的交集关闭后保留主行的原始ts和durPartition by按一列或多列如按线程或进程分组计算重叠使过滤区间只与同组内的主行匹配。重叠的过滤区间会自动合并如果主行横跨多个不重叠的过滤区间会按区间逐个复制成多行。Aggregation按一列或多列分组并计算聚合值等价于 SQLGROUP BY。不选择任何分组列时整个结果聚合成一行。可用聚合函数函数说明COUNT列中非空值计数COUNT(*)全部行计数COUNT_DISTINCT唯一非空值计数SUM求和MIN最小值MAX最大值MEAN算术平均值MEDIAN中位数DURATION_WEIGHTED_MEAN按dur列加权的均值PERCENTILE百分位值需指定百分位0-100单个节点可添加多个聚合每个聚合产出一个命名输出列。Sort按一列或多列排序每列可独立升序/降序拖拽列可调整优先级。等价于 SQLORDER BY。Modify Columns控制哪些列传到下游及其呈现方式显示/隐藏取消勾选以从输出中移除列重命名为任意列起别名改类型覆盖推断出的列类型重排拖拽调整列顺序。适用于在进一步处理或可视化前整理中间结果。Add Columns该节点的心智模型很简单取上游节点的所有内容再加上一列或多列新列。每行原样通过——节点只会加宽结果。看到结果时想要是这里还有 X 列就好了就用它。由于X可能是很多种东西——另一张表里的值、一个计算表达式、由原始 ID 派生的标签、Trace 参数——节点支持六种产生新列的方式Join from another source从其他源连接目标列在其他表中时使用。选一个次级节点、挑要引入的列、指定连接键自动完成 join无需写 SQL。连接键解析有两种方式若上游数据已有指向已知表的joinid列如指向thread的thread_idData Explorer 会自动建议该表并预填连接键两侧——只需确认并挑选要引入的列即可通常只需几次点击若无类型化建议则手动从主输入选一列、从次级输入选一列作为连接键。该 join 是left join上游节点的每一行都会保留即使次级源中找不到匹配行无匹配的行新列取NULL。这意味着加列绝不会静默丢行——始终能看到完整的上游数据只是 join 无匹配处为空。每个引入的列都可内联重命名和覆盖类型。Expression表达式目标列可从结果已有列计算得出时使用。写任意合法的 PerfettoSQL 表达式逐行求值。任何能写进 SQLSELECT子句的内容都适用例如dur / 1e6—— 纳秒转毫秒name || ( || tid || )—— 拼接显示标签ts dur—— 计算结束时间戳Switch映射把现有列的特定值映射为新输出值——例如把数字状态码变成人类可读标签或把内部枚举翻译成有意义的名字。选择要 switch 的列然后列出 case当列等于该值时输出该结果。等价于 SQLCASE col WHEN v1 THEN r1 WHEN v2 THEN r2 END但通过表单表达无需 SQL 知识。在字符串列上匹配可以使用glob 模式而非精确相等——可以把com.google.*映射为Google app、把com.android.*映射为Android app无需逐个列出包名。这正是列类型重要的原因之一Data Explorer 依据类型决定是否提供 glob 匹配选项。If条件目标列取决于条件而非精确值匹配时使用。写一个条件、条件为真时输出的值、可选的elif分支和兜底else值。适合给行分桶——例如dur 1e9时输出long、否则short或按阈值区间给行打标签。等价于 SQLCASE WHEN cond THEN val ... ELSE fallback END但通过结构化表单表达。From args从参数提取目标列以 Trace 参数形式存储在arg_set_id列上时使用——这是 Perfetto Trace 中非常常见的模式。无需手写 args joinData Explorer 检查当前结果集发现数据中实际存在的 arg key并展示为可搜索列表。挑一个 key新列即出现通过extract_arg(arg_set_id_col, key)填充列名自动由 key 派生。这让呈现任意 per-event 元数据——渲染 intent、调度参数、应用自定义注解——变成几次点击的事完全不需要了解 args 表 schema。Apply function应用函数目标列是 PerfettoSQL 标准库函数作用于当前行的返回值时使用。两步流程先搜索并从 stdlib 中选一个函数再配置参数绑定把每个函数参数映射到源列或自定义表达式。适合在不进入 Query 节点的情况下对数据调用辅助宏或任意 stdlib 函数。单个节点可混合添加任意类型的多列各自独立配置若自动推断的类型不正确可内联覆盖每列类型。Limit and Offset限制返回行数并可选跳过开头若干行等价于 SQLLIMIT/OFFSET。默认 limit10、offset0。适合对大结果集采样或分页浏览。Counter to Intervals把计数器数据有时间戳、无时长转换为区间将每个采样点与下一个配对产出ts、dur、next_value、delta_value列。输入必须包含id、ts、track_id、value列且不能已有dur列。这是计数器数据用于区间类节点如 Interval Intersect 或 Filter During的必要前置步骤。Charts为上游数据附加一个或多个可视化。支持图表类型柱状图bar、直方图histogram、折线图line、散点图scatter、饼图pie、矩形树图treemap、箱线图boxplot、热力图heatmap、CDF、计分卡scorecard。每个图表独立配置自己的列、聚合和显示选项。过滤可逐图表应用或在整个节点内共享。点击图表中的柱子或数据点会自动把过滤条件反馈回管道。Multi-Source 节点Join通过共享键匹配行来合并两个数据源的列。左输入提供基础行右输入提供要引入的列。两种 join 类型Inner join默认只保留两侧都匹配的行左输入中无匹配的行被丢弃Left join保留左输入的所有行右输入无匹配时右侧列取NULL。join 条件有两种配置模式Equality相等从左右输入各选一列两列相等时行匹配。覆盖常见场景Freeform自由形式写自定义 SQL 表达式用于相等模式无法表达的情况如范围条件或多列键。可以挑选输出中两侧各包含哪些列并用别名重命名。提示如果只是用关联表的列丰富结果Add Columns 的 Join from another source 通常更方便——它自动建议连接键且默认是 left join。需要 inner join 或自由条件时才用这个 Join 节点。Union把两个及以上数据源的行堆叠成单一结果接受任意数量的输入无上限。选择输出中包含哪些列。可以包含并非每个源都有的列——缺失于某个或多个源的列会被静默排除而不是报错。若各源列名不一致可在上游用 Modify Columns 重命名。注意这比 SQLUNION/UNION ALL更宽松——后者要求所有输入列完全一致这里可以自由加入不同 schema 的源不在所有源中出现的列不会出现在结果里。Interval Intersect接收 2 到 6 个时间区间数据源只返回所有源同时重叠的部分。每个输入必须包含id、ts、dur列数据只有时间戳没有时长时先用 Counter to Intervals 转换。关键选项Partition by把求交限制在共享一列或多列相同值的行之间。例如按utid分区意味着区间只与同一线程上的其他区间求交——线程 A 的 CPU 运行区间不会与线程 B 的帧区间相交ts/dur source控制输出中id、ts、dur的来源。设为 intersection 使用裁剪后的区间边界且不带id设为某个特定输入则在该输入原始id、ts、dur基础上附带裁剪边界。Create Slices接收两个事件源——start 事件与 end 事件——配对成带ts和dur的 slice。适合从原始 begin/end 日志行或 start/end 分开记录的计数器跳变构造合成 slice。每个输入有两种配置模式ts输入只提供标记每个事件开始或结束的单一时间戳列ts dur输入提供时间戳和时长区间结束计算为ts dur。当某一侧已有时长信息时使用。时间戳列类型必须是timestamp时长列必须是duration——若某源只有一列符合要求类型会自动选中。输出恰好两列ts和dur。Export 节点Dashboard把上游查询结果作为仪表盘视图中命名数据源提供。Dashboard 节点本身是直通pass-through——不变换数据只是把结果登记在一个名字下便于与其他数据源并列展示。多个管道可同时有多个 Dashboard 节点激活全部并排显示在仪表盘视图中——例如CPU 消耗 Top表格旁边放一个按进程分布图每个面板由各自独立的查询管道支撑。数据保持实时修改上游图时仪表盘自动更新。可以给每个 Dashboard 节点设置导出名以控制其在仪表盘中的显示未设置时使用上游节点标题。Metrics把上游查询结果变成结构化 Trace 指标用于导出和跨 Trace 分析。该节点不改变结果中的数据——只是用 trace summary 基础设施所需的 schema 对结果做注解。配置项Metric ID prefix该指标族的短标识符如memory_per_process用作导出 spec 中的基础名必须在同一 Trace Summary 内的所有 Metrics 节点间唯一Dimensions维度标识一行描述对象的列——指标的类别轴如process_name、thread_name。任何非数值列都可用作维度Value columns值列作为实际测量的数值列。每个值列配置Unit单位测量单位如 bytes、milliseconds、percentage从标准列表选择或输入自定义字符串Polarity极性数值越高越好、越低越好或不适用。分析工具用它标记回归Display name / help text可选的人类可读输出标签Dimension uniqueness维度唯一性每个维度值组合是恰好出现一次UNIQUE还是可能多次NOT_UNIQUE。设置正确可让下游工具做更精确的聚合。节点显示计算出的指标数据实时预览。若只有一个指标也可直接从节点导出.pbtxttextproto 规格文件无需 Trace Summary 节点。将此节点连接到 Trace Summary 节点可与其他指标打包合并导出。Trace Summary把一个或多个 Metrics 节点打包成单一 trace summary 规格。这是产出可复用、可移植指标规格的最后一步——该规格可在 UI 之外对任意 Trace 运行。任意数量的 Metrics 节点连接到 Trace Summary 节点的输入端口——每个指标一个端口。所有连接节点的 Metric ID 前缀必须唯一。结果在节点面板中展示每个指标一个标签页。点击Export下载trace_summary_spec.pbtxt文件。该文件可随后用 Trace Processor CLI 或 Python API 对任意 Trace 运行命令行方式trace_processor_shell summarize --metrics-v2 IDS \ trace.pftrace spec.pbtxtPython API 方式tp.trace_summary(specs, metric_ids, metadata_query_id)导出的 spec 如何在下游使用参见 Trace Summarization 的完整文档。内置示例导航面板的Tutorials和Solutions下列出了一组精选预构建查询图覆盖图基础操作、join、基于时间的查询和 slice 分析管道是搭建自己查询的良好起点。预构建图的源码定义见 example_graphs.ts。小结Data Explorer 把 Perfetto 最强大的 SQL 分析能力包装成了可视化节点管道从 Smart Graph 自动盘点 Trace 数据到 Filter/Aggregation/Add Columns 逐步精炼结果再到 Interval Intersect/Create Slices 处理 Trace 特有的时间语义最后通过 Metrics Trace Summary 产出可跨 Trace 复用的指标规格。它既适合不熟悉 SQL 的开发者快速上手也让资深用户把 SQL 场景收敛为可分享、可持久化的图形化管道——而需要完整表达能力时Query 节点和生成的 SQL 始终触手可及。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表