使用 StreamInsight 事件流调试器

 

制造和流程控制、公用事业、金融贸易、Web 和 IT 监控等领域内的操作系统可以生成具有复杂相互关系和较短滞后时间要求的事件流。 鉴于处理此类事件流所涉及的临时因素,这些系统中的一个主要难点是确定在多样的动态流行为下的结果的有效性,以及如何排除可能出现的故障。

这种需要催生了查询分析工具,用来满足以下要求:

  • 处理大量数据,同时缩小问题搜索空间。

  • 处理严格的一致性要求。

  • 对用户足够直观,便于其快速得出诊断结果或解决方案。

Microsoft StreamInsight 提供了独立的事件流调试器图形用户界面 (GUI)。 使用 StreamInsight 事件流调试器,您可作为复杂事件处理 (CEP) 应用程序的开发人员或管理员通过 StreamInsight 查询来检查、调试和推断事件流。 本主题说明事件流调试器的功能,并提供快速掌握此调试和分析工具的用法所需的过程。

了解事件流调试

介绍事件流调试器之前,需要明确控制流调试器(例如 C# 或 C++ 调试器)和事件流调试器之间的根本区别,这一点很重要。

在控制流调试中,开发人员在调试模式中采用特定语言“构建”某个程序,支持该程序控制流中特定语句或联接处的断点,将该程序“运行”到这些特定断点位置,推断代码和系统状态,进入或略过函数和过程,检查变量等内容,直到执行完毕。 “数据”变量的临时推断(即通过时间通道分析这些变量的转换)是有限的或不存在的。

相比之下,事件流调试涉及在事件从 CEP 查询的某一阶段前进到下一阶段的过程中,以及在事件从查询阶段中的某一运算符前进到下一运算符的过程中,通过时间通道对该事件进行分析。 在此,调试涉及理解在事件从给定运算符进入时对某个流的影响,以及如何通过对输入运算符的事件的计算来生成新事件。 事件流调试强调运算符的语义(筛选、投影、联接、聚合、多播等)如何影响事件,而不是强调运算符本身如何控制流的执行。 因此,该调试器有助您理解给定事件对其他事件的影响,以及其他事件对所分析事件的影响。

调试模式和监视模式

事件流调试器是一个基于事件跟踪的独立调试工具。 该调试器有两种用途:

  • 调试事件流跟踪。 调试会话可基于:

    • 从特定操作查询的实时记录生成的跟踪,这需要将调试器连接到某一处于活动状态的服务器。

    • 使用命令行实用工具在该调试器外部生成的跟踪文件,该文件随后加载到该调试器中。

  • 监视服务器。 在此模式下,调试器提供一个可列出系统和应用程序对象的对象资源管理器。 您可以获取其中每个实体的操作诊断信息。 该对象资源管理器还可充当接口,通过它可启用和禁用查询跟踪,并且还支持启动和停止查询执行等操作。

为了能够使用事件流调试器,该用户必须是 Windows Performance Log Users 组的成员。 这使得该用户能够使用 trace.cmd 收集调试器外的跟踪,或者在该调试器内操作时记录来自某一查询的事件。 有关操作步骤,请参阅 Windows 管理和操作部分。

如果已成功安装 StreamInsight,建议您启动该调试器,并查看**“开始”页以了解该工具的基本功能。 要启动该调试器,请单击“开始”按钮,指向“所有程序”,单击 Microsoft StreamInsight 2.0,然后单击“StreamInsight 事件流调试器”**。

调试 StreamInsight 查询

可以将该调试器作为本地或远程客户端应用程序连接到 StreamInsight 服务器,并记录和重播一个或多个查询的事件流跟踪。 或者,也可以将该调试器用作与服务器断开连接的独立客户端应用程序,并且基于脱机收集的事件跟踪来分析查询。 这样,您可以灵活地调试正在运行的特定查询,或者基于查询各次运行的历史跟踪记录重新测试该查询。

实时查询事件记录

要记录来自正在运行的查询的事件,必须将事件流调试器连接到某一处于活动状态的 StreamInsight 服务器。 以下过程介绍如何连接到某一处于活动状态的服务器,打开正在运行的查询,并对该查询启用跟踪。

System_CAPS_ICON_note.jpg 注意


“事件流调试器”只能记录本地服务器上的事件。 也就是说,运行它的物理计算机必须与 StreamInsight 服务器是同一台。 将“事件流调试器”连接到远程服务器端点并不会导致错误,但将不会记录任何事件。

  1. 作为一项前提条件,您(或服务器管理员)必须对该服务器启用 Web 服务。 有关启用 Web 服务的详细信息,请参阅发布到和连接到 StreamInsight 服务器

  2. 确认客户端用户有权通过成为相应 StreamInsight 用户组中的成员来连接到服务器。 有关详细信息,请参阅安装 (StreamInsight) 中的“StreamInsight 用户组”部分。

  3. 在该调试器中,单击**“文件”,然后单击“连接到服务器”**。 输入该服务器的端点地址。 已安装 StreamInsight 服务器的默认端点为 https://localhost/StreamInsight/<instance_name>。

    如果已正确设置服务器连接,该调试器将在左窗格中显示对象资源管理器。

  4. 在**“对象资源管理器”**中,单击对象层次结构,直到显示要调试的查询。 双击该查询对象。 这将打开如下图所示的查询图。 该图显示示例查询“Deltas”当前正在运行。

    查看查询图中的查询
    图 1 - 查看查询图中的查询。

  5. 要记录在查询中正在处理的事件,请单击**“开始记录”按钮。 这将启动如下图所示的记录进程。 花几分钟记录事件,然后单击“停止”**。

    在运行的查询中记录事件
    图 2 - 记录正在运行的查询中的事件。

这将使调试器处于图 1 所示的状态。 此时,可以使用调试器中提供的查询分析工具。 分析功能将在下一节中说明。

加载事件流跟踪 (EFT) 或 Windows 事件跟踪 (ETW) 文件

StreamInsight 支持独立和嵌入式服务器部署。 如果应用程序嵌入在服务器中且未启用 Web 服务,则调试器之类的客户端应用程序将无法连接到该服务器。 您需要一种机制来调试和诊断在这类情况下运行的查询中的问题。

要为正在运行的 StreamInsight 服务器收集事件跟踪日志,可以使用 StreamInsight 安装中提供的**“trace.cmd”**实用工具。 以下过程介绍如何创建跟踪文件并将该文件加载到事件流调试器中。

  1. 在服务器和相关的一个或多个查询正在运行时,在 Windows 命令提示符下,键入以下语句。 在命名跟踪文件时,一定要使用文件扩展名 .etl。

trace.cmd start <filename>.etl

  1. 让查询运行足够长的一段时间后,使用以下语句停止跟踪:

trace.cmd stop <filename>.etl

  1. 要将生成的文件加载到调试器中,请单击**“文件”,然后单击“打开”。 在“打开”对话框中,浏览到 <filename>.etl 的位置,然后单击“打开”**。 查询图将如下图所示显示出来。

    查看从跟踪文件加载的查询
    图 3 - 查看从跟踪文件加载的查询。

与图 1 中所示的对象相比,本图显示的对象资源管理器中的实体较少。 这是因为调试器未连接到服务器。 特别是,在调试器未连接到服务器时,无法显示服务器级的诊断对象(如计划程序)。

请注意,本图在状态栏中显示一个进度指示条,用来指示 ETL 文件的加载进度。 作为加载过程的一部分,调试器会将 ETL 文件转换为其专有的压缩 EFT 格式。

特别要注意的是,trace.cmd 实用工具是基于 Windows Logman 命令的脚本。 Logman 又使用针对 Windows (ETW) 基础结构的事件跟踪来用于事件收集。 在跟踪日志加载过程中,调试器可能会警告您已丢失若干事件。 这是由于 ETW 缓冲区不足和会话设置不当造成的。 若要解决此问题,请在 trace.cmd 文件中编辑 Logman 命令并且增加在 -bs 选项中指定的缓冲区大小(例如 -bs 3000)或者增加在 -nb 选项中指定的缓冲区数目。 有关详细信息和示例,请参阅 Logman documentation(Logman 文档)。

使用事件流调试器工具分析查询

事件流调试器提供以下用于查询分析的重要功能。

  • 支持查看给定查询的查询计划、查询运算符和事件流。 这有助您通过查看查询中的基础事件流和事件流中的处理节点来了解语言集成查询 (LINQ)。

  • 支持检查复杂事件流的输入和输出上的所有事件,以及每个计算阶段的中间结果; 其中包括以开始和结束时间戳表示的事件元数据以及负载字段。

  • 支持查看为扩展而进行分区的复杂事件流。 调试器可以显示如何通过 Group and Apply 运算符的分组运算对事件进行分区,以及如何在 Apply 运算符中转换事件。

  • 支持执行一组全局分析,目的是缩小问题搜索空间或跨事件流的多个阶段建立事件关联。

  • 支持通过时间通道单步执行查询跟踪,并了解事件如何通过流式查询传播。

  • 支持分析事件并了解它们如何到达给定状态。即:其他事件或运算符如何影响了它们的事件时间和负载。

  • 支持分析任何给定事件对来自当前运算符下游的事件的影响。 最关键的是预计将来对事件的处理,直到该事件最终影响输出。

要实现这些功能,该调试器提供了三种分析功能:

  • 重播 - 使用此功能可以单步执行事件流,一次一个事件,并查看从一个运算符到下一个运算符的进度。 或者,可以在查询图中的特定运算符处设置断点,并“运行”调试器(即:激活事件流),直到遇到该运算符或该运算符中的特定条件。

  • 根源分析 - 使用此功能可以“寻根溯源”,或是回顾导致事件达到现有状况的运算序列或更改。

  • 事件传播分析 – 使用此功能可以分析此事件对下游的影响,影响可能是特定事件本身所经历的更改,也可能是特定事件如何影响其他事件或如何导致生成新事件。 此功能与“根源分析”完全相反。

使用重播

事件一旦通过实时记录或从跟踪日志文件加载到调试器中,下一步就是发现这些事件。 为此,需要通过单击**“时钟”图标重播这些事件。 单击后将显示一个事件播放器。 可以通过单击“前进”图标单步执行这些事件。 或者,可以通过单击运算符左侧的单选按钮在任意运算符处设置断点,然后在事件播放器中单击“进入下一个断点”**。

在下图中,在多播运算符中设置了一个断点,而且已激活事件流。 多播运算符中以绿色突出显示的线条显示到这个点时事件流的进度。

在聚合运算符中设置断点
图 4 - 在聚合运算符中设置断点。

由于事件在查询中流动,您可以通过单击每个运算符右侧的三角形图标展开各个运算符。 可以继续单步执行事件并查看事件进度。

使用根源分析

使用根源分析,您可以分析事件是如何进入当前状态的。 从任何运算符的事件网格中,可以通过右键单击相关事件并选择**“根源分析”**来启动根源分析。

若选择**“根源分析”,调试器将显示包含可能导致所分析事件进入当前状态的事件的所有运算符的展开视图。 例如,下图演示具有给定开始和结束时间戳的avgCount** 值 18 是如何形成的。 为此,请从**“上下文”菜单中右键单击突出显示的事件,然后选择“根源分析”**。 调试器将通过在选项卡式的查询画布的标题处放置另一个箭头,显示叠放的根源分析“重播”。 下图显示了这一操作。 导致此事件在查询处理中处于此阶段的状态的因素是:在 SensorInput 运算符中插入了 VehicularCount 值 38。

使用��源分析
图 5 - 使用根源分析。

使用事件传播分析

根源分析关注的是了解其他事件或处理步骤对某事件的影响,而事件传播分析是一种前瞻式分析,目的在于了解当前事件对下游事件的影响。 从任何运算符的事件网格中,可以通过右键单击相关事件并选择**“事件传播分析”来启动“事件传播分析”**。

叠放分析

多个分析可以逐个叠放在一起。 可通过使用“重播”启动调试功能。 在此分析中的某个点处,可以开始针对特定事件的根源分析。 从此视图中,您还可能挑选另一事件进行传播分析。 以这种方式,可以将两个分析叠放在一起。

还可以在多个选项卡中打开同一查询,但在不同选项卡中具有不同的分析和视图,从而支持您灵活地比较不同分析中的相同或不同的查询段。

运算符

查询图中的每个长方框都表示一个运算符(即 StreamInsight 查询中的计算节点)。查询代数支持若干运算符,如 Select (Filter)、Project、Import、Export、Group-and-Apply、Join、Multicast、Union、Top-K、AlterLifetime、Advancetime 和 Cleanse。 每个运算符都标有其在服务器元数据中的给定名称以及该运算符所属的类型。

务须注意的是:您在查询图中看到的“运算符”与构成 LINQ 查询的“运算”不一定是一一对应的关系。 例如,Import 运算符表示一个输入适配器实例,Export 运算符表示输出适配器实例。 Cleanse 是由查询优化器引入的用来处理无序数据的内部运算符,但在 LINQ 查询中并不存在该运算符。 同样,AdvanceTimeAlterLifetime 表示由指定 LINQ 扩展 AlterEventDurationAlterEventLifeTime 或者在查询中执行开窗操作而生成的查询代数中的核心临时操作。 不过,将 LINQ 查询关联到生成的查询图并非难事。

每个事件网格都具有以下部分。

运算符标签

网格的标题由查询提供的运算符名称和运算符类型构成。

筛选器

在此文本框中,可以指定条件 C# 表达式以筛选感兴趣的事件。 例如,您可能只想检查符合或超过特定值或时间的事件。

事件字段

事件网格窗口的其余部分显示事件字段。 这些字段包括用户指定的事件类型(Insert 或 CTI),以及内部事件(Retract 和 Expand)。 默认显示的字段列包括事件的 EventKind、StartTime、EndTime 和负载字段。 可以在事件网格中添加或删除字段,方法是右键单击标题栏以查看上下文菜单,或者依次单击**“视图”“列”**,然后选择或清除字段名称。 请注意,所有时间戳字段均以协调世界时 (UTC) 显示。 上下文菜单提供了更改时区的方法。

可用字段以下表所列顺序显示。 可以通过右键单击运算符标题栏并选择选项**“将事件写出到文件”**,将任何给定运算符中的事件导出到某个文件。 通常,这样做是为了导出文件以便在其他程序中进一步处理。

字段名称 说明
EventKind Insert、CTI、Retract 或 Expand。
StartTime 事件的开始时间。
EndTime 事件的结束时间。
NewEndTime 某些特殊系统事件类型的事件的已修改结束时间。 应忽略此列中的值。
Latency 给定时点的事件的系统滞后时间。 这是导致生成此事件的传入事件进入系统的时间与系统生成此事件的时间之间的时长。
EnqueueTime 运算符生成事件时的系统时间。
一个或多个负载字段 事件中可用的用户定义数据字段。

Group-and-Apply 运算符

Group-and-Apply 运算符是一种特殊运算符,它包含作为入口点的 Grouping 运算符,一组 Apply 分支运算符,以及一个作为退出时的绑定运算符的 Group Union 运算符。 展开分组节点将显示在相应的分组键值上定位的所有应用分支。 您可以展开(或折叠)Group-and-Apply 运算符,只需简单地将相关分支从分组节点拖到画布上即可。 现在可以展开分支中的每个运算符,以便进一步分析。 单击每个分支中的 X 标记会将其折叠回主 Group-and-Apply 流子图形。 下图显示了事件流调试器中的 Group-and-Apply 节点。

Group_and_Analysis
图 6 - 查看 Group-and-Apply 节点。

其他可用性功能

该调试器提供以下可用性功能:

  • 可以将查询图画布从运算符放大到与完整的查询图一般大小。

  • 通过图标提供的所有功能也可通过从上下文菜单中选择相应选项来提供。

  • 在调试器连接到服务器时,从服务器返回的所有错误都采用 en-US(美国英语)区域设置,不论安装的是哪一种区域设置。 对于非英语区域设置,这些错误消息可用于进一步的支持和诊断。

  • 可以通过使用**“全部展开”“全部折叠”**功能相应展开或折叠所有运算符。

  • 使用**“工具”**菜单中提供的选项可以设置各种调试器设置的默认值。 可以选择读取事件流跟踪文件中特定大小的片断。 这样有利于预测,同时更方便调试。 可以对查询图的所有运算符指定 DateTime 格式和 TimeZone。 此外,还可以在调试器连接到服务器的情况下,指定最大和最小事件流记录持续时间。

监视

事件流调试器不仅是一种调试工具,还可充当 StreamInsight 服务器的监视工具。 可以使用上文所述的步骤将该调试器连接到某一处于活动状态的服务器。 调试器将显示包含所有服务器实体的对象资源管理器。 最顶层显示的是事件管理器、查询管理器和计划程序的汇总统计信息。 要显示上述任一对象的运行时诊断,请右键单击相关对象的图标,然后选择**“诊断”**。

还可以在对象层次结构中一直单击,并选择已在服务器中注册的某个查询。 可以开始或停止查询。 此外,如果查询正在运行,则可以获取该查询的运行时诊断信息。 使用此界面可以监视所生成和使用的事件的有关信息、滞后时间和吞吐量特征以及查询的内存要求。

可以枚举已在应用程序中创建的所有源、接收器、主题和进程。 也可以删除源、接收器、主题和进程。

查看应用程序创建的实体
图 7 - 查看由应用程序创建的实体

也可以使用诊断视图 API 以编程方式检索这些指标。 有关可用于每个实体的诊断信息的说明,请参阅监视 StreamInsight 服务器和查询

请参阅

开发人员指南 (StreamInsight)
操作 (StreamInsight)