本主题介绍 Windows Communication Foundation (WCF) 跟踪模型中的活动跟踪。 活动是处理单元,可帮助用户缩小故障范围。 同一活动中发生的错误直接相关。 例如,操作失败,因为消息解密失败。 操作和消息解密失败的跟踪都出现在同一活动中,表明解密错误与请求错误之间的直接关联。
配置活动跟踪
WCF 提供用于处理应用程序的预定义活动(请参阅 活动列表)。 还可以以编程方式定义活动以对用户跟踪进行分组。 有关详细信息,请参阅发出用户代码跟踪。
若要在运行时发出活动跟踪,请对 System.ServiceModel
跟踪源或其他 WCF 或自定义跟踪源使用 ActivityTracing
设置,如以下配置代码所示。
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
若要详细了解正在使用的配置元素和属性,请参阅 “配置跟踪 ”主题。
查看活动
可以在 服务跟踪查看器工具(SvcTraceViewer.exe)中查看活动及其实用工具。 启用 ActivityTracing 后,此工具会获取跟踪并根据活动对其进行排序。 您还可以查看跟踪传输。 跟踪传输指示不同的活动相互关联的方式。 可以看到特定活动导致另一个活动启动。 例如,消息请求启动安全握手以获取安全对话令牌。
在服务跟踪查看器中关联活动
服务跟踪查看器工具提供两个活动视图:
列表 视图,其中活动 ID 用于直接关联进程之间的跟踪。 不同进程的跟踪(例如客户端和服务)如果具有相同的活动 ID,则会被归类到同一个活动中。 因此,服务上发生的错误会导致客户端上的错误,并且这两个错误都会显示在工具中的同一活动视图中。
图形 视图,其中活动按进程分组。 在此视图中,具有相同活动 ID 的客户端和服务在不同的活动中各自有其跟踪记录。 为了将活动与不同进程中的相同活动 ID 相关联,该工具显示跨相关活动的消息流。
有关详细信息,以及查看服务跟踪查看器工具的图形视图,请参阅 服务跟踪查看器工具(SvcTraceViewer.exe) 以及 使用服务跟踪查看器查看相关跟踪和故障排除。
定义活动的范围
活动在设计时定义,表示逻辑工作单元。 所发出的具有相同活动标识符的跟踪直接相关,它们都属于同一个活动。 由于活动可以跨越终结点边界(请求),因此定义了活动的两个范围。
Global
范围,每个应用程序。 在此范围内,活动由其 128 位全局唯一活动标识符 gAId 标识。 gAid 是跨越终结点传播的内容。Local
范围,每个终结点。 在此范围内,活动由其 gAId 以及发出活动跟踪的跟踪源名称和进程 ID 标识。此三部分构成本地活动 ID、lAId。 lAId 用于定义活动的(本地)边界。
跟踪架构
可以使用任何架构以及跨 Microsoft 平台发出跟踪。 “e2e”(对于“端到端”)是常用的架构。 此架构包括 128 位标识符(gAId)、跟踪源名称和进程 ID。 在托管代码中,XmlWriterTraceListener 可在 E2E 架构中发出跟踪。
开发人员可以通过使用线程本地存储 (TLS) 上的 Guid 设置 ActivityId 属性来设置随跟踪发出的 AID。 下面的示例演示这一操作。
// set the current Activity ID to a new GUID.
CorrelationManager.ActivityId = Guid.NewGuid();
使用跟踪源发出跟踪时,设置 TLS 中的 gAId 非常简单,如下面的示例所示。
TraceSource traceSource = new TraceSource("myTraceSource");
traceSource.TraceEvent(TraceEventType.Warning, eventId, "Information");
发出的跟踪将包含当前处于 TLS 中的 gAId、作为参数传递给跟踪源构造函数的跟踪源名称以及当前进程的 ID。
活动生命周期
用最严格的术语表述,活动的证据从第一次在发出的跟踪中使用活动 ID 时开始,到最后一次在发出的跟踪中使用活动 ID 时结束。 提供了一组预定义的跟踪事件类型System.Diagnostics,包括“启动”和“停止”,用于明确标识活动生命周期的边界。
开始:指示活动的开头。 “开始”跟踪提供开始一个新的处理里程碑的记录。 它包含给定进程中给定跟踪源的新活动 ID,但是,当活动 ID 跨越终结点传播时除外 — 在这种情况下,我们会在每个终结点中看到一个“开始”跟踪。 启动新活动的示例包括创建新线程进行处理或输入新的公共方法。
停止:指示活动的结束。 “停止”跟踪提供结束现有处理里程碑的记录。 它包含给定进程中给定跟踪源的现有活动 ID,但在终结点之间传播活动 ID 时除外。在这种情况下,我们会在每个终结点中看到一个“停止”跟踪。 停止活动的示例包括终止处理线程或退出以“开始”跟踪表示开始的方法。
暂停:指示暂停处理活动。 “挂起”跟踪包含一个现有活动 ID,其处理预期稍后将继续。 在“挂起”和“恢复”事件之间,不会从当前跟踪源发出具有此 ID 的跟踪。 示例包括暂停调用外部库函数时的活动,或者在等待 I/O 完成端口等资源时暂停活动。
恢复:指示继续处理活动。 “恢复”跟踪包含一个现有活动 ID,从当前跟踪源发出的最后一个有关它的跟踪是“挂起”跟踪。 示例包括从对外部库函数的调用返回或发出让资源(如 I/O 完成端口)恢复处理的信号。
传输:由于某些活动是由其他人引起的,或者与其他活动相关,因此活动可以通过“传输”跟踪与其他活动相关。 转换跟踪记录了活动之间的定向关系。
启动和停止跟踪对于关联并不重要。 但是,它们有助于提高性能、分析和活动范围验证。
使用这些类型,这些工具可以优化导航跟踪日志,以查找同一活动的立即相关事件;如果工具遵循传输跟踪,则查找相关活动中的事件。 例如,当工具看到启动/停止跟踪时,工具将停止分析给定活动的日志。
这些跟踪类型也可用于分析。 在开始和停止标记之间消耗的资源表示活动的全部时间,包括所包含的逻辑活动时间。 减去“暂停”和“恢复”跟踪之间的时间间隔可提供实际活动时间。
停止跟踪功能也特别适用于验证已实施活动的范围。 如果某些处理跟踪出现在“停止跟踪”之后,而不是出现在给定活动中,则这表明代码缺陷。
使用活动跟踪指南
下面是使用 ActivityTracing 跟踪(启动、停止、暂停、恢复和传输)的准则。
跟踪是一个定向循环图,而不是树。 可以将控制返回到生成活动的活动。
活动表示一种处理边界,这对于系统管理员或在支持性方面来说可能具有意义。
无论是在客户端上还是在服务器上,每个 WCF 方法都由开始一个新活动、然后(工作完成后)结束该新活动并返回到环境活动来限定。
长时间运行的(持续)活动(例如侦听连接或等待消息)由相应的启动/停止标记表示。
由接收或处理消息触发的活动由跟踪边界表示。
活动表示的是活动,不一定是具体事物。 应该将活动理解为“这是在 . . . (发出有意义的跟踪)时发生的”。