美团链路追踪cat集成遇到的坑

文章列举了在部署CAT监控系统时遇到的几个坑,包括LogView异常,原因是客户端与服务端版本不一致,Docker部署Tomcat因数据库连接失败导致的TcpSocketReceiver异常,以及通过环境变量设置datasources.xml和高版本MySQL兼容问题。解决方案涉及版本匹配、手动修改配置和调整数据库驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坑1:Log View点开异常

在windows下部署的。

1.首先,下载的源码,用的是master分支,并通过maven打包。

2.修改配置文件/data/appdatas/cat目录下的client.xml和datasources.xml文件

3.修改/data/appdatas/cat目录权限,改完读写执行权限。

4.然后将war包,放到Tomcat的webapps目录下,启动Tomcat。

5.登录cat,并修改配置。因为都是在本地部署,所以都用127.0.0.1的地址,所以都不需进行修改。

6.客户端集成,用的是官网提供的集成插件,在integration目录下。我用的是dubbo集成。所以用dubbo插件,通过maven进行编译打包。

7.将上面打的包,再客户端项目上进行引用。

<!-- 集成链路追踪cat -->
<dependency>
   <groupId>net.dubboclub</groupId>
   <artifactId>cat-monitor</artifactId>
   <version>0.0.6</version>
</dependency>

8.启动项目

9.刷新cat服务端页面,能够发现,正常显示项目,证明集成成功了。

正当我高兴的时候,我点击了一下Log View时,异常了。

都是用的官方提供的为啥会异常呢。百思不得其解。各种排查加百度。都没找到问题。

一开始为为啥特别强调用的是master分支呢。因为最后我发现问题了。master分支下的dubbo集成插件用的cat-client是用的其他版本的。不是最新的4.0-RC版本。而master分支是这个4.0-RC版本。

所以说:我打包部署的cat服务端是4.0-RC版本。而集成的客户端是cat-V3.1.0版本的。版本冲突导致的这个原因。

这里是个大坑。因为都是同一个分支,却版本不一致。

所以:强烈建议,安装cat是要用3.1.0分支。

 

坑2:Docker部署后,Tomcat启动异常

 Unable to get component: class com.dianping.cat.analysis.TcpSocketReceiver.

这个原因主要是数据库连接失败。

问题原因分析:

用的是官方提供的Dockerfile文件和docker-compose文件,官方提供的是在docker-compose里面配置了连接MySQL的环境变量,通过datasources.sh脚本替换datasources.xml定义的环境变量。

再docker启动执行datasources.sh脚本时,发生了异常。异常信息在/data/applogs/cat目录下查看

{"log":"sed: can't move '/data/appdatas/cat/datasources.xmlOlohei' to '/data/appdatas/cat/datasources.xml': Resource busy\n","stream":"stderr","time":"2023-07-19T13:06:40.419148982Z"}
{"log":"sed: can't move '/data/appdatas/cat/datasources.xmlAFLabB' to '/data/appdatas/cat/datasources.xml': Resource busy\n","stream":"stderr","time":"2023-07-19T13:06:40.419821155Z"}
{"log":"sed: can't move '/data/appdatas/cat/datasources.xmlKhLLPb' to '/data/appdatas/cat/datasources.xml': Resource busy\n","stream":"stderr","time":"2023-07-19T13:06:40.420463023Z"}
{"log":"sed: can't move '/data/appdatas/cat/datasources.xmlDDgmFa' to '/data/appdatas/cat/datasources.xml': Resource busy\n","stream":"stderr","time":"2023-07-19T13:06:40.421803972Z"}
{"log":"sed: can't move '/data/appdatas/cat/datasources.xmlMAmfAj' to '/data/appdatas/cat/datasources.xml': Resource busy\n","stream":"stderr","time":"2023-07-19T13:06:40.422388276Z"}

根据错误日志 sed: can't move '/data/appdatas/cat/datasources.xmlOlohei' to '/data/appdatas/cat/datasources.xml': Resource busy,似乎是无法将临时文件重命名为 /data/appdatas/cat/datasources.xml 文件,因为该文件正在被占用。

这可能是由于多个线程或进程同时尝试修改 /data/appdatas/cat/datasources.xml 文件而导致的。为了避免这种情况,建议在执行脚本之前先检查一下目标文件是否已经存在,并等待它变为可写状态。

尝试了很多方式,也使用其他命令,还是不行。用的都是官方提供的,为啥会报这个错误。到现在一直想不明白。

最终解决方案:

既然无法用变量的形式,那就简单粗暴写。直接修改datasources.xml的变量值,手动替换掉变量。

替换后,再次启动,发现不报错了。启动成功。

坑3:配置完,还是报出:问题CAT的服务端[****]

1.检查client.xml配置,由于是docker部署,配置的是宿主机的ip

<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
    <servers>
        <server ip="192.168.43.238" port="2280" http-port="8080"/>
    </servers>
</config>

2.如果client.xml没问题,登录cat服务端(默认用户名密码都是admin),检查客户端路由配置,都配置成宿主机的ip。修改完之后,点击提交。

在这里插入图片描述

 3. 再检查服务端配置,也都配置成宿主机的ip。修改完之后,点击提交。

在这里插入图片描述

以上都检查完,还是报错。包括一切都是按照官方的配置进行部署的,而且官网及其他博客都只配置了这些,但是自己部署还是有问题。所以这里是个很大的坑。 

原因是什么,并且如何修复。仔细查找的话,其实官方也有处理方案。

 所以就有了第四步。

4. 通过docker-compose增加环境变量,或者通过Dockerfile增加也一样。二选其一就行。

version: '3'

services:
  myapp:
    image: example/app:latest
    environment:
      - JAVA_OPTS=-Dhost.ip=xxxx

-Dhost.ip 配置成宿主机的ip。配置好之后,如果用Dockerfile,则重新build。如果用docker-compose的话,重新执行docker-compose即可。

此刻,问题完美解决。

说明:有些博客,说要添加server.xml配置。其实不用这个配置,一样可以解决。

坑4:Docker部署,通过环境变量给datasources.xml赋值异常

同坑2.

坑5:数据库用的高版本,导致无法连接

Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
…
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
…
[02-03 17:08:26.724] [ERROR] [StandardWrapper] Servlet initializing failed. javax.servlet.ServletException: java.lang.RuntimeException: Error when initializing modules! Exception: java.lang.RuntimeException: Unable to get component: class com.dianping.cat.analysis.TcpSocketReceiver.
javax.servlet.ServletException: java.lang.RuntimeException: Error when initializing modules! Exception: java.lang.RuntimeException: Unable to get component: class com.dianping.cat.analysis.TcpSocketReceiver.

1. 如果是mysql8.x版本, 需要修改git拉取/下载的原码中, pom.xml中的mysql-connecor-java版本到8.x, 默认是5.x. 然后修改配置driver为com.mysql.cj.jdbc.Driver
2. 确认datasources.xml的jdbc相关配置没有填写错误.
3. 正确配置实例: mysql8.x版本

<?xml version="1.0" encoding="utf-8"?>
<data-sources>
    <data-source id="cat">
        <maximum-pool-size>3</maximum-pool-size>
        <connection-timeout>1s</connection-timeout>
        <idle-timeout>10m</idle-timeout>
        <statement-cache-size>1000</statement-cache-size>
        <properties>
        	
            <driver>com.mysql.cj.jdbc.Driver</driver>
            <url><![CDATA[jdbc:mysql://localhost:3306/cat]]></url>
            <user>root</user>
            <password>123456</password>
            <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
        </properties>
    </data-source>
</data-sources>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h_and_g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值