坑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>