dianping / cat

CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。
Apache License 2.0
18.69k stars 5.43k forks source link

为什么docker部署后LogView总显示Sorry, the message is not there. It could be missing or archived. #2242

Open mgsky1 opened 2 years ago

mgsky1 commented 2 years ago

使用最新的master分支进行docker部署,并没有开启HDFS,希望日志使用本地存储,服务端xml配置如下

这里的ip为容器ip

<?xml version="1.0" encoding="utf-8"?>
<server-config>
   <server id="default">
      <properties>
         <property name="local-mode" value="true"/>
         <property name="job-machine" value="false"/>
         <property name="send-machine" value="false"/>
         <property name="alarm-machine" value="false"/>
         <property name="hdfs-enabled" value="false"/>
         <property name="remote-servers" value="172.20.0.3:8080"/>
      </properties>
      <storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="2" local-logivew-storage-time="15" har-mode="true" upload-thread="5">
         <hdfs id="dump" max-size="128M" server-uri="hdfs://127.0.0.1/" base-dir="/user/cat/dump"/>
         <harfs id="dump" max-size="128M" server-uri="har://127.0.0.1/" base-dir="/user/cat/dump"/>
         <properties>
            <property name="hadoop.security.authentication" value="false"/>
            <property name="dfs.namenode.kerberos.principal" value="hadoop/dev80.hadoop@testserver.com"/>
            <property name="dfs.cat.kerberos.principal" value="cat@testserver.com"/>
            <property name="dfs.cat.keytab.file" value="/data/appdatas/cat/cat.keytab"/>
            <property name="java.security.krb5.realm" value="value1"/>
            <property name="java.security.krb5.kdc" value="value2"/>
         </properties>
      </storage>
      <consumer>
         <long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
            <domain name="cat" url-threshold="500" sql-threshold="500"/>
            <domain name="OpenPlatformWeb" url-threshold="100" sql-threshold="500"/>
         </long-config>
      </consumer>
   </server>
   <server id="172.20.0.3">
      <properties>
         <property name="job-machine" value="true"/>
         <property name="send-machine" value="true"/>
         <property name="alarm-machine" value="true"/>
      </properties>
   </server>
</server-config>

在项目中,使用SpringBoot进行Transaction打点

    public boolean foo(String param1, String param2) {
        Transaction transaction = Cat.newTransaction("DataServiceImpl", "foo");
        try {
            // 业务逻辑
            logger.info("param1:{}, param2:{}", param1, param2);
            Cat.logEvent("URL.Server", "serverIp", Event.SUCCESS, "ip=${serverIp}");
            transaction.setStatus(Transaction.SUCCESS);
            return collection != null ? true: false;
        } catch (Exception e) {
            Cat.logError(e);
            return false;
        } finally {
            transaction.complete();
        }

    }

运行时控制台输出

[2022-08-07 10:55:06.063] [INFO] CAT home: /Users/xxx/.cat
[2022-08-07 10:55:06.064] [INFO] User dir: /Users/xxxxxxx
[2022-08-07 10:55:06.080] [INFO] Thread group(Cat) created.
[2022-08-07 10:55:06.082] [INFO] CAT client configuration: 
domain: com.test.xxxx
host: 192.168.1.2(mgsky1)
servers: 192.168.1.2:2280/8080
[2022-08-07 10:55:06.082] [INFO] Starting thread(Cat-ConfigureRefresher) ...
[2022-08-07 10:55:06.137] [INFO] Starting thread(Cat-ChannelManager) ...
[2022-08-07 10:55:06.137] [INFO] Starting thread(Cat-MessageTransporter) ...
[2022-08-07 10:55:06.138] [INFO] Starting thread(Cat-StatusUpdateTask) ...
[2022-08-07 10:55:06.191] [INFO] Connected to CAT server /192.168.1.2:2280, [id: 0xfa064a25, L:/192.168.1.2:61582 - R:/192.168.1.2:2280]

这里的ip是宿主机ip,我用了一些手段使得它可以与容器联通

在我的CAT home下有如下文件

mgsky1@mgsky1dembp .cat % pwd
/Users/mgsky1/.cat
mgsky1@mgsky1dembp .cat % ls
client.xml  mark

docker部署这边讲的也不是特别多,还希望能够帮助一下~

mgsky1 commented 2 years ago

感觉是日志根本没有生成,既然这里用了CAT home,还需要建立/data/appdatas和/data/applogs吗?

CherryRum commented 2 years ago

一样问题,不知道为啥

CherryRum commented 2 years ago

image 查看了/data/appdatas/cat/bucket/report 发现容器里面是有的

mgsky1 commented 2 years ago

这个确实是有,但是我改了storage标签的base-dir,似乎没有起作用...

image 查看了/data/appdatas/cat/bucket/report 发现容器里面是有的

CherryRum commented 2 years ago

你尝试没 实机部署,我也没找到log日志

mgsky1 commented 2 years ago

你尝试没 实机部署,我也没找到log日志

似乎搞不定...

mgsky1 commented 2 years ago

你尝试没 实机部署,我也没找到log日志

稍微梳理了一下: 我本地部署的话,是有日志dump出来的

mgsky1@mgsky1deMacbookPro bucket % pwd
/Users/mgsky1/.cat/bucket
mgsky1@mgsky1deMacbookPro bucket % ls  
dump    report
mgsky1@mgsky1deMacbookPro bucket % cd dump 
mgsky1@mgsky1deMacbookPro dump % ls
20220811
mgsky1@mgsky1deMacbookPro dump % ls 20220811/19 
cat-172.25.130.18.dat   cat-172.25.130.18.idx

tomcat会有对应的日志打印

[08-11 19:20:51.689] [INFO] [DefaultBlockDumperManager] Create block dumper 2022-08-11 19:00:00
[08-11 19:20:51.692] [INFO] [DefaultMessageDumperManager] create message dumper 2022-08-11 19:00:00
[08-11 19:20:51.730] [INFO] [Period] Starting 12 tasks in period [2022-08-11 19:00:00, 2022-08-11 19:59:59]

至于LogView为什么不会展示,是因为默认它会去请求一个远程连接,像这样

http://127.0.0.1:8080/cat/r/model/logview/cat/CURRENT?op=xml&messageId=cat-ac198212-461171-406&waterfall=false&timestamp=1660215600000

这个链接你访问的话,是空的

关注一下RemoteLogViewService.java的invoke方法

InputStream in = Urls.forIO().connectTimeout(1000).readTimeout(5000).openStream(url.toExternalForm());
GZIPInputStream gzip = new GZIPInputStream(in);
String xml = Files.forIO().readFrom(gzip, "utf-8");

可以发现,这个链接返回的应该是一个xml,然后这个代码块被一个try...catch包裹,很显然,在这种情况下,肯定会有异常,源代码把异常吞掉了,所以我们是无感的。

       @Override
    public ModelResponse<String> invoke(ModelRequest request) {
        ModelResponse<String> response = new ModelResponse<String>();
        Transaction t = newTransaction("ModelService", getClass().getSimpleName());

        try {
            URL url = buildUrl(request);

            t.addData(url.toString());

            InputStream in = Urls.forIO().connectTimeout(1000).readTimeout(5000).openStream(url.toExternalForm());
            GZIPInputStream gzip = new GZIPInputStream(in);
            String xml = Files.forIO().readFrom(gzip, "utf-8");

            int len = xml == null ? 0 : xml.length();

            t.addData("length", len);

            if (len > 0) {
                String report = buildModel(xml);

                response.setModel(report);
                t.addData("hit", "true");
            }
            t.setStatus(Message.SUCCESS);
        } catch (Exception e) {
            t.setStatus(Message.SUCCESS);
        } finally {
            t.complete();
        }
        return response;
}

解决办法嘛,正在想...CAT用的是unidal,应该是老点评的框架了,官方给的Maven仓库也失效了(所以你会发现博客上很多人都是直接下war包,因为那个仓库404了啊!)...在想怎么解决

hzhswyz commented 2 years ago

看看docker容器里的/data/applogs/cat/cat_2022XXX.log是否有报错 我的报错如下: [/tmp/snappy-1.1.4-libsnappyjava.so Error loading shared library ld-linux-x86-64.so.2: No such file or directory]

如果和我一样的话,在容器里执行: ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 我是这样logview就有数据了。

mgsky1 commented 2 years ago

看看docker容器里的/data/applogs/cat/cat_2022XXX.log是否有报错 我的报错如下: [/tmp/snappy-1.1.4-libsnappyjava.so Error loading shared library ld-linux-x86-64.so.2: No such file or directory]

如果和我一样的话,在容器里执行: ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 我是这样logview就有数据了。

是用最新的版本吗?难道是我的环境是mac,出现了不兼容情况?

mgsky1 commented 2 years ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

这个确实,我也可以了!!感谢!

duishancunzhang commented 1 year ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

这个确实,我也可以了!!感谢!

我代码版本4.0.1-RC 使用Dockerfile构建后,出现logview问题,同时时区也有问题。 请问你这个解决方案的代码版本是?

mgsky1 commented 1 year ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

这个确实,我也可以了!!感谢!

我代码版本4.0.1-RC 使用Dockerfile构建后,出现logview问题,同时时区也有问题。 请问你这个解决方案的代码版本是?

没有用4.0,用得是3.x的版本

duishancunzhang commented 1 year ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

刚切换成3.x版本了,dump日志也生成了 bash-4.4# ls cat-springboot-demo-172.17.11.47.dat cat-springboot-demo-172.17.11.47.idx

我是配了集群版本,1个master节点和2个slave节点,刷新的时候debug了RemoteLogViewService的invoke,每次都是抛出EOFException image

mgsky1 commented 1 year ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

刚切换成3.x版本了,dump日志也生成了 bash-4.4# ls cat-springboot-demo-172.17.11.47.dat cat-springboot-demo-172.17.11.47.idx

我是配了集群版本,1个master节点和2个slave节点,刷新的时候debug了RemoteLogViewService的invoke,每次都是抛出EOFException image 集群的我没有配置过...[尴尬]

duishancunzhang commented 1 year ago

ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

刚切换成3.x版本了,dump日志也生成了 bash-4.4# ls cat-springboot-demo-172.17.11.47.dat cat-springboot-demo-172.17.11.47.idx 我是配了集群版本,1个master节点和2个slave节点,刷新的时候debug了RemoteLogViewService的invoke,每次都是抛出EOFException image 集群的我没有配置过...[尴尬]

![Uploading image.png…]() dump出来的dat文件格式是cat-springboot-demo-172.17.11.47.dat cat-springboot-demo-172.17.11.47.idx 其中172.17.11.47为k8s集群内部的容器随机ip,但是RemoteLogViewService的invoke是按照我配置的host.ip去进行访问,我怀疑是不是这个ip不一致引起的读不到dat文件