Dynatrace分布式跟踪之AMQP over RabbitMQ
最近有个客户想通过Dynatrace的PurePath技术来分布式跟踪基于AMQP协议的远程调用(RPC),询问我Dynatrace是否支持AMQP协议?回答是肯定的,Dynatrace默认支持AMQP协议。一般情况下 ,开启与AMQP协议相关的传感器组就可以监控从AMQP消息的生产者(Producer)到AMQP消息的消费者(Consumer)的消息传送过程,对AMQP协议实现跨进程的执行链路分布式跟踪。
为了验证Dynatrace支持AMQP协议的效果,我自己搭建了一个简单的,基于AMQP协议的应用程序。这个应用程序是由Spring AMQP的指导演变而来,它由一个AMQP消息的生产者(Producer)和AMQP消息的消费者(Consumer)组成,这两者之间通过本的RabbitMQ服务通信,生产者同时也是Web应用服务器,它接受用户的Web请求,并把Web请求通过AMQP协议发送给消费者,消费者接收并处理消息,将处理结果返回给生产者(Producer),Web应用服务器再将结果呈现给用户,其架构图如下。
图中,AMQP Sender是AMQP消息的生产者,AMQP Receiver是AMQP消息的消费者。
监控效果
当这个应用程序被Dynatrace监控后,在事务流图里,我们可以看到Dynatrace自动生产的逻辑架构图,以及AMQP消息在生产者和消费者之间的传递过程。你可能注意到了,图中并没有显示RabbitMQ服务,这是因为PurePath无需在RabbitMQ服务安装任何探针软件,而做到对AMQP消息的跨进程,跨消息中间件(RabbitMQ)的分布式跟踪。
PurePath树
那么Dynatrace如何做到自动发现和跟踪AMQP的消息传递的呢?答案在于Dynatrace的PurePath技术,下面我就和大家说说上图的代码执行链路——PurePath树。PurePath树展示了各个应用节点详细的方法执行情况,方法之间调用的关系,以及节点间的远程调用关系。如下图所示,Agent列代表了当前方法执行的节点,可以看到,AMQP Sender和AMQP Receiver的方法是按照它们之间的访问顺序执行的(Sender -> Receiver -> Sender)。在这个PurePath树中,黄色信封标识的方法代表了AMQP的API接口方法(或者其接口实现类的方法),蓝色M标识的方法代表了我们想要监控的业务代码,灰色的方法代表执行缓慢的方法(可以是任何方法),AMQP消息的传递链路则通过“异步路径(AMQP)“衔接起来,这些方法按照执行的时间顺序组合起来,就形成了一条跨越进程和消息中间件的代码执行链路。
AMQP接收入口点
由于AMQP的API只定义了如何来发送和接受AMQP消息,而没有定义在接受AMQP消息后,处理AMQP消息的统一接口,所以,Dynatrace不知道AMQP消息的消费者会如何来处理AMQP消息的,这就要求我们通过设置AMQP接收入口点()的方式来告诉Dynatrace,消费者的处理AMQP消息的起始方法,以便Dynatracece从这个起始方法开始,去监控应用处理AMQP消息的业务逻辑。例如,在下面的代码中,第一行代码从AMQP API中接收到了AMQP消息,然后被三个不同的方法处理,则可以把这三个方法都设置为AMQP接收入口点方法。
{ Message amqpMessage=receiveMessage(); handleMessage1(amqpMessage); handleMessage2(amqpMessage); handleMessage3(amqpMessage); }
如果Dynatrace没有检查到任何AMQP接收入口点的方法,就会在PurePath树中出现“未检测到执行路径(Execution Path not instrumented)”的提示。
在本案例应用中,MessagingMessageListenerAdapter.onMessage(Message, Channel)是Dynatracey已经默认配置的AMQP接收入口点方法。