Event Tracing for Windows(ETW) - 进行事件跟踪 译(3)

About Event Tracing

原文链接
作者:Microsoft
译者:塔塔塔塔塔

ETW是高性能的内核级跟踪工具,它让我们记录内核或应用定义的事件到一个日志文件。你可以是实时或从日志文件中使用Event去调试应用程序或确定应用程序的性能问题的位置。

ETW可以让我们来动态的Enable 或Disable事件跟踪,从而在生产环境执行详细的跟踪而不需要重启电脑或应用程序。
事件跟踪分为三个部分:

  • Controllers,开启和停止Event Tracing Session 和 Enable Providers(提供者,三个部分的其中一个)。
  • Providers,提供事件。
  • Consumers,消耗事件。

译ps: Providers 可以理解为生产者,Consumers可以理解为消费者,Controllers是为生产者提供场地以及启用生产的。

可以参考下面Microsoft提供的Event Tracing Model
在这里插入图片描述

Controllers

Controllers应用 包含 ①定义日志文件大小和位置,②开始和停止事件跟踪会话(Event Tracing Session),③启用Providers是它可以记录Evnet到Session中,④管理缓冲区大小,⑤Session的执行统计信息。Session统计包含使用过的buffer数目,已传送buffer的数目,事件数目,丢失数目。

详细信息查看Controlling Event Tracing Sessions

Providers

Providers应用 包含事件跟踪检测(Event Tracing Instrumentation). 当Provider注册它本身时,Controller 可以启用或停用Provider中的事件跟踪(Event Tracing),Provider 定义解释Enable和Disable。通常Enable Provider会产生Event,Disable Provider则不产生。这样让我们可以在应用里添加Event Tracing而用总生成Event。

尽管ETW将Provider和Controller分为两个独立的应用,但也可以在同一个程序包含这两个组件。

详细信息查看Providing Events

Providers的类型

Provider有主要的4种类型:MOF(经典)、WPP、Manifest-Based(基于清单)、TraceLogging。如果你是为了编写Windows Vista或更高的版本且不需要支持低版本系统的应用时,你应该使用Manifest(基于清单)或TraceLogging类型的Providers。

MOF(classic) Providers:
  • 使用RegisterTraceGuids 和TraceEvent函数去注册和写Event。
  • 使用MOF类定义事件以便Consumers知道如何去消耗它们。
  • 一次只可以启用一个跟踪Session。
WPP Providers:
  • 使用RegisterTraceGuids 和TraceEvent函数去注册和写Event。
  • 具有关联的TMF文件(编译为二进制文件的.pdb),其中包含从预处理程序对WPP工具的源代码扫描中得出的解码信息。
  • 一次只可以启用一个跟踪Session。
Manifest-based providers:
  • 使用RegisterTraceGuids 和TraceEvent函数去注册和写Event。
  • 使用Manifest-based定义事件以便Consumers知道如何去消耗它们。
  • 最多同时可以启用Enable 8个 Session。
TraceLogging providers:
  • 使用TraceLoggingRegister 和TraceLoggingWrite去注册和写Session。
  • 使用Self-Describing Event以便消耗本身包含的所需信息。
  • 最多同时可以启用Enable 8个 Session。
    所有Event Providers 底层都是使用的Event Tracing 系列APIs(对应传统技术调用EventWrite,对于较新技术调用EventWriteEx)。Event Providers只是在 Event Payloads中的不同字段和相关Event解码信息的存储位置不同。

Consumers

Consumers应用 是选择一个或多个事件跟踪Session作为使用Event的源头。一个Consumer可以同时请求来自多个跟踪事件Session。Consumer可以接受Event存储记录到文件中,也可实时的从Event Trace Session中接收。在处理Event时,Consumer可以指定接受开始时间和结束时间,并且Provider只传输在时间范围内发生的事件。

Event丢失

平台,系统诊断程序和其他系统工具可能会报告事件日志中丢失的事件,并指示Windows事件跟踪(ETW)的设置可能不是最佳的。导致事件丢失的原因有很多:

  • 当Event的总大小大于64K时,这包括 ETW 头部信息 + data 或 payload。因为用户是不可以在应用配置这些丢失事件的大小。
  • 当ETW buffer大小小于总事件大小。用户无法控制这些丢失的事件,因为事件大小是由记录事件的应用程序配置的
  • 对于实时日志记录,实时使用者没有足够快地使用事件或不需要的事件导致备份文件被填充满时。如果在记录事件时停止并启动事件日志服务,则可能会导致这种情况。用户无法控制这些丢失的事件。
  • 记录到文件时,磁盘太慢,无法跟上记录频率。

由于以上任何原因,请将这些问题报告给生成事件的应用程序或服务的Provider。 这些问题只能由应用程序开发人员或记录事件的服务来解决。 如果在事件日志服务中报告了丢失的事件,则可能表明事件日志服务的配置存在问题。 用户可能有限地增加了事件日志服务要使用的最大磁盘空间,这可能会减少丢失事件的数量。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解你的问题是关于在Spring Boot 3中使用Micrometer Tracing Bridge Brave进行RabbitMQ链路追踪时遇到的问题。 首先,你需要在你的项目中添加以下依赖: ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-zipkin</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> ``` 然后,在你的配置文件中,你需要启用Micrometer和Zipkin: ``` management.metrics.export.zipkin.enabled=true management.metrics.export.zipkin.uri=http://localhost:9411 ``` 接下来,你需要配置RabbitMQ,以便将跟踪信息添加到消息头中: ``` @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Tracer tracer) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setBeforePublishPostProcessors(message -> { Span span = tracer.currentSpan(); if (span != null) { message.getMessageProperties().setHeader("X-B3-TraceId", span.context().traceIdString()); message.getMessageProperties().setHeader("X-B3-SpanId", span.context().spanIdString()); } return message; }); return rabbitTemplate; } ``` 最后,你需要在你的应用程序中创建一个跨度: ```java @Autowired private Tracer tracer; public void sendMessage() { Span span = tracer.nextSpan().name("sendMessage").start(); try (Tracer.SpanInScope ws = tracer.withSpan(span)) { // 发送消息 } finally { span.finish(); } } ``` 如果你的链路追踪仍然无效,可能是因为你的RabbitMQ配置不正确或你的Zipkin服务器没有启动。你可以使用Zipkin UI查看跟踪信息,或者使用Zipkin API查询跟踪信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值