在 Windows 事件跟踪中跟踪事件

EtwTracking 示例演示如何在工作流服务上启用 Windows Workflow Foundation (WF) 跟踪并在 Windows 事件跟踪(ETW)中发出跟踪事件。 若要向 ETW 发出工作流跟踪记录,此示例使用 ETW 跟踪参与者(EtwTrackingParticipant)。

示例中的工作流接收请求,将输入数据的倒数分配给输入变量,并将该倒数返回给客户端。 当输入数据为 0 时,将发生零除异常,该异常未经处理,导致工作流中止。 启用跟踪后,错误跟踪记录将发送到 ETW,这有助于稍后排查错误。 ETW 跟踪参与者通过跟踪配置文件配置为订阅跟踪记录。 跟踪配置文件在 Web.config 文件中定义,作为配置参数提供给 ETW 跟踪参与者。 ETW 跟踪参与者在工作流服务的 Web.config 文件中进行配置,并作为服务行为应用于该服务。 在此示例中,使用事件查看器查看事件日志中的跟踪事件。

工作流跟踪详细信息

Windows Workflow Foundation 提供跟踪基础结构来跟踪工作流实例的执行。 跟踪运行时创建一个工作流实例,用于发出与工作流生命周期相关的事件、工作流活动和自定义事件的事件。 下表详细介绍了跟踪基础结构的主要组件。

组件 DESCRIPTION
跟踪运行时 提供用于发出跟踪记录的基础结构。
跟踪参与者 访问跟踪记录。 .NET Framework 4.6.1 附带了一个跟踪参与者,它作为 Windows 跟踪记录 (ETW) 事件写入跟踪记录。
跟踪配置文件 一种筛选机制,允许跟踪参与者订阅从工作流实例发出的跟踪记录的子集。

下表详细介绍了工作流运行时发出的跟踪记录。

跟踪记录 DESCRIPTION
工作流实例跟踪记录。 描述工作流实例的生命周期。 例如,在工作流启动或完成时发出实例记录。
活动状态跟踪记录。 详细说明活动执行情况。 这些记录指示工作流活动的状态,例如,当安排活动时、活动完成时或引发错误时。
书签恢复记录。 当工作流实例中的书签被恢复时,将发出信号。
自定义跟踪记录。 工作流作者可以创建自定义跟踪记录,并在自定义活动中发出这些记录。
ActivityScheduledRecord 当某个活动安排其他活动时会发出此记录。
FaultPropagationRecord 当从某个活动传播错误时会发出此记录。
CancelRequestedRecord 当活动被另一个活动取消时,将发出此记录。

跟踪参与者使用跟踪配置文件来订阅发出的跟踪记录的子集。 跟踪配置文件包含允许订阅特定跟踪记录类型的跟踪查询。 可以在代码或配置中指定跟踪配置文件。

使用此示例

  1. 使用 Visual Studio 打开EtwTrackingParticipantSample.sln解决方案文件。

  2. 要生成解决方案,按 Ctrl+Shift+B。

  3. 若要运行解决方案,请按 F5。

    默认情况下,服务正在侦听端口 53797 (http://localhost:53797/SampleWorkflowService.xamlx)。

  4. 使用文件资源管理器打开 WCF 测试客户端。

    WCF 测试客户端(WcfTestClient.exe)位于 <Visual Studio 安装文件夹>\Common7\IDE\ 文件夹中。

    默认的 Visual Studio 安装文件夹为 C:\Program Files\Microsoft Visual Studio 10.0。

  5. 在 WCF 测试客户端中,从“文件”菜单中选择“添加服务”。

    在输入框中添加终结点地址。 默认值为 http://localhost:53797/SampleWorkflowService.xamlx

  6. 打开事件查看器应用程序。

    在调用服务之前,请从 “开始” 菜单启动事件查看器,选择“ 运行 ”并键入 eventvwr.exe。 确保事件日志正在监听从工作流服务发出的跟踪事件。

  7. 在事件查看器的树视图中,导航到 事件查看器应用程序和服务日志,并 Microsoft。 右键单击 Microsoft 并选择“ 查看 ”,然后 显示分析和调试日志 以启用分析和调试日志

    确保选中“ 显示分析和调试日志 ”选项。

  8. 在事件查看器中的树视图中,导航到 事件查看器应用程序和服务日志MicrosoftWindowsApplication Server-Applications。 右键单击 “分析 ”,然后选择“ 启用日志 ”以启用 分析 日志。

  9. 双击 GetDataWCF 测试客户端来测试服务。

    这会打开 GetData 方法。 请求接受一个参数,并确保值为 0,这是默认值。

    单击“ 调用”。

  10. 观察工作流产生的事件。

    切换回事件查看器并导航到 事件查看器应用程序和服务日志MicrosoftWindowsApplication Server-Applications。 右键单击 “分析 ”,然后选择“ 刷新”。

    工作流事件显示在事件查看器中。 请注意,将显示工作流执行事件,其中一个事件是与工作流中的错误相对应的未经处理的异常。 此外,还会从工作流活动发出一个警告事件,指示活动正引发错误。

  11. 重复步骤 9 和 10,使用非 0 的数据作为输入,以确保不引发错误。

通过跟踪配置文件,可以订阅运行时在工作流实例的状态发生更改时发出的事件。 根据监视需求,可以创建一个非常粗陋的配置文件,用于订阅对工作流进行的一小组高级状态更改。 另一方面,可以创建一个非常精确的配置文件,其输出足够丰富,可在以后重新构造执行。 该示例使用发出一小组事件的 HealthMonitoring Tracking Profile,演示从工作流运行时向 ETW 发出的事件。 Web.config 中还提供了另一个发出更多工作流跟踪事件的配置文件,该文件名为 Troubleshooting Tracking Profile。 安装 .NET Framework 4.6.1 后,将在 Machine.config 文件中配置一个空名称的默认配置文件。 当未指定配置文件名称或指定了空配置文件名称时,此配置文件由 ETW 跟踪行为配置使用。

运行状况监视跟踪配置文件发出工作流实例记录和活动错误传播记录。 通过将以下跟踪配置文件添加到 Web.config 配置文件来创建此配置文件。

<tracking>
  <profiles>
    <trackingProfile name="HealthMonitoring Tracking Profile">
      <workflow activityDefinitionId="*">
        <workflowInstanceQueries>
          <workflowInstanceQuery>
            <states>
              <state name="Started"/>
              <state name="Completed"/>
              <state name="Aborted"/>
              <state name="UnhandledException"/>
            </states>
          </workflowInstanceQuery>
        </workflowInstanceQueries>
        <faultPropagationQueries>
          <faultPropagationQuery faultSourceActivityName ="*" faultHandlerActivityName="*"/>
        </faultPropagationQueries>
      </workflow>
    </trackingProfile>
  </profiles>
</tracking>

可以通过将 EtwTrackingParticipant 配置更改为以下内容来更改该配置文件。

<behaviors>
  <serviceBehaviors>
    <behavior>
      <etwTracking profileName="HealthMonitoring Tracking Profile"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

清理(可选)

  1. 打开事件查看器。

  2. 导航到 事件查看器应用程序和服务日志MicrosoftWindowsApplication Server-Applications。 右键单击 “分析 ”,然后选择“ 禁用日志”。

  3. 导航到 事件查看器应用程序和服务日志MicrosoftWindowsApplication Server-Applications。 右键单击 “分析 ”并选择“ 清除日志”。

  4. 选择“ 清除 ”选项以清除事件。

已知问题

注释

事件查看器中存在一个已知问题,其中可能无法解码 ETW 事件。 你可能会看到如下所示的错误消息。

无法找到来自源“Microsoft-Windows-应用程序服务器-应用程序”的事件 ID <id> 的描述。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复该组件。

如果遇到此错误,请点击操作窗格中的刷新。 事件现在应能正确解码。

另请参阅