[QA] Skywalking接入Deepflow后,试用问题汇总(持续更新)
Search before asking
- [X] I had searched in the issues and found no similar feature requirement.
DeepFlow Component
Server
What you expected to happen
我们的业务微服务,之前是使用skywalking做apm,为了体验deepflow的全链路追踪能力,以及对trace数据进行标准化,我们将apm架构改造为skywalking-agent->otel-collector-> deepflow 。现在已经参考https://www.deepflow.io/docs/zh/integration/input/tracing/skywalking/ 将skywalking-agent采集到的业务trace数据,传到了deepflow,然后我尝试做一次业务请求,业务日志如下:
使用traceid=2044a11911124f94882c1e30351fdd51.121.17252493541140007,去deepflow查询,查到了几十条链路数据
然后点击“Trace ID”,画出火焰图,但是火焰图显示上,如下图,每条链路间调用是断开的,没有办法直观的查看链路调用的整体情况
烦请研发老师,帮忙看一下,是哪里的问题,非常感谢。
How to reproduce
No response
DeepFlow version
[root@staging-cetccx-master1 ~]# kubectl exec -it -n deepflow deploy/deepflow-server -- deepflow-server -v Name: deepflow-server community edition Branch: v6.5 CommitID: https://github.com/deepflowio/deepflow/commit/9bb16a8ff644a9279300aa7220edcc2f21321d80 RevCount: 10821 Compiler: go version go1.21.13 linux/amd64 CompileTime: 2024-08-12 06:11:31 [root@staging-cetccx-master1 ~]# kubectl exec -it -n deepflow ds/deepflow-agent -- deepflow-agent -v 10805-c6a440e933afb1de0242f55c7aecaa6e6086e69a Name: deepflow-agent community edition Branch: v6.5 CommitId: https://github.com/deepflowio/deepflow/commit/c6a440e933afb1de0242f55c7aecaa6e6086e69a RevCount: 10805 Compiler: rustc 1.77.1 (7cf61ebde 2024-03-27) CompileTime: 2024-08-07 05:01:34 [root@staging-cetccx-master1 ~]#
DeepFlow agent list
No response
Kubernetes CNI
calico ipip模式
Operation-System/Kernel version
[root@staging-cetccx-master1 ~]# more /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@staging-cetccx-master1 ~]# uname -a Linux staging-cetccx-master1 5.16.13-1.el7.elrepo.x86_64 #1 SMP PREEMPT Tue Mar 8 08:32:26 EST 2022 x86_64 x86_64 x86_64 GNU/Linux [root@staging-cetccx-master1 ~]#
Anything else
No response
Are you willing to submit a PR?
- [ ] Yes I am willing to submit a PR!
Code of Conduct
- [X] I agree to follow this project's Code of Conduct
clickhouse里,traceid=2044a11911124f94882c1e30351fdd51.121.17252493541140007的数据,我导出为html了,有需要可以下载,见附件: 20240902-134026.zip
今天将deepflow部署到了预发布环境(离上产线又近了一步),预发布环境的服务器配置比之前的测试环境高,部署架构也更贴近产线环境。今天试用了一下deepflow,发现一些问题(也可能是配置问题),还请研发老师协助排查一下,非常感谢~ 具体问题如下:
1 产生的火焰图,中间有空行,如下图所示。是什么原因导致程序绘制火焰图时,产生空行呢 ?
2 我的k8s环境使用的ingress-nginx,deepflow-agent捕获到了nginx上的请求,很厉害,但是deepflow捕获到的url是/msg/v1/messages/835735839043648,而实际业务发起的请求url是/v1/messages/835735839043648,二者不一致,这是为何?
3 火焰图中,个别链路的start_time不准,使得整个火焰图被拆分成两部分。
如图,右侧部分,其中一个链路的start_time=2024-09-04 19:06:44.141000 , 而从elk日志平台上看,cx-im-message-processor这个微服务,traceid=1b52dd588d164d639b7e1e2663061545.116.17254480018150159 的链路调用时间是2024-09-04 19:06:41,不是19:06:44,为何有这个时间差呢?
以上问题,是基于traceid=1b52dd588d164d639b7e1e2663061545.116.17254480018150159进行的总结,该traceid的所有链路信息,已导出为csv,供研发分析使用。 1b52dd588d164d639b7e1e2663061545.116.17254480018150159.csv
4 如果有个别非核心的微服务,不想采集他的链路信息,请问deepflow如何配置呢
5 helm方式安装的deepflow套件,会被k8s随机编排到集群的某个节点上运行,如果我想用一台单独的k8s节点,运行deepflow套件,用helm方式如何安装?
6 clickhouse重启报错
helm方式部署的deepflow,部署后clickhouse启动正常,但是当手动重启clickhouse pod时,报错:
<Error> CertificateReloader: Cannot obtain modification time for certificate file /etc/clickhouse-server/server.crt, skipping update. errno: 2, strerror: No such file or directory
我到ck 容器的/etc/clickhouse-server/下确认,/etc/clickhouse-server/server.key文件确实不存在,但是重启前他也是不存在的
下面是clickhouse-console的日志
deepflow_deepflow-clickhouse-0_clickhouse.log
7 使用Distributed Tracing,查询火焰图时,绘图很慢
【答复】该问题,研发正则优化。https://github.com/deepflowio/deepflow/issues/7816
@yujianweilai
Q1: 这里的 csv 不包含空行前的 span,可以确认下。
这里断开有个空行,一般是因为空行上下的 span 没有字段关联。可以确认下这里上下两个 span 的 [span_id, parent_span_id] 是否没有任何一个关系是相等的
Q2: 可以实际抓流确认下就行。一般抓的就是 http 流的内容,因为也不可能编一个 /msg/。估计是 nginx 配的入向路径 (location) 是 /msg,可以看看
Q3:
如图,右侧部分,其中一个链路的start_time=2024-09-04 19:06:44.141000 , 而从elk日志平台上看,cx-im-message-processor这个微服务,traceid=1b52dd588d164d639b7e1e2663061545.116.17254480018150159 的链路调用时间是2024-09-04 19:06:41,不是19:06:44,为何有这个时间差呢?
这里注意下是 trace 的启动时间为 [2024-09-04 19:06:41],经过三秒发生 [2024-09-04 19:06:44.141000] 这个 span,前者是整个 trace 的启动时间,后者是单个 span 的发生时间,逻辑上没有矛盾
如果是想说左右两侧时间差异太大,可以看下这里消息队列的 span 是否异步的,即:左边接收请求,请求结束,产生左侧的 span,然后生成一个写队列任务,3s 后被调度,产生右侧的 span。如果是这种模型那图里呈现也符合逻辑
@taloric
感谢您的回复。
Q1: 因为昨天的数据清理掉了,所以traceid=1b52dd588d164d639b7e1e2663061545.116.17254480018150159的记录现在查不到了,我重新做了一个业务请求(traceid=1b52dd588d164d639b7e1e2663061545.125.17255223575910235),也有类似空行的问题。
按您提供的方式查了一下,空行上面的_id=7411062091836839336 下面的_id=7411062091836889697, 两个span信息,确实对应不上,
这是什么原因?
Q2: 是我这边的问题,ng里用了rewrite,所以有msg。该问题,不是问题,请忽略。
Q3: 我咨询了一下我们研发,如您所说,我们确认有个“历史数据保存”的异步操作。
另外,Q4-6 也请您有时间给看看,谢谢。
@taloric 感谢您的回复。 Q1: 因为昨天的数据清理掉了,所以traceid=1b52dd588d164d639b7e1e2663061545.116.17254480018150159的记录现在查不到了,我重新做了一个业务请求(traceid=1b52dd588d164d639b7e1e2663061545.125.17255223575910235),也有类似空行的问题。
按您提供的方式查了一下,空行上面的_id=7411062091836839336 下面的_id=7411062091836889697, 两个span信息,确实对应不上,
这是什么原因?
Q2: 是我这边的问题,ng里用了rewrite,所以有msg。该问题,不是问题,请忽略。
Q3: 我咨询了一下我们研发,如您所说,我们确认有个“历史数据保存”的异步操作。
另外,Q4-6 也请您有时间给看看,谢谢。
Q4:DeepFlow 默认为全量采集,不支持去除指定资源的采集,但可以去除部分数据类型,例如: 拉黑某个端口,不要对应端口的 eBPF 数据: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L1307
拉黑调用日志 uri,可以忽略一些健康检测的探测: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L1073
忽略部分协议采集 https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L1020
关掉 l4 的部分采集点: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L423
关掉 l7 的部分采集点: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L453
或者可以单方面全部关掉 l4/7 的采集点: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L416 https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L423
关闭指定端口采集 cbpf 数据: https://github.com/deepflowio/deepflow/blob/main/server/agent_config/example.yaml#L135
Q5:可在提供的 helm chart 包中 value 文件开启allInOneLocalStorage: true功能
@yujianweilai
空行上面的_id=7411062091836839336 下面的_id=7411062091836889697, 两个span信息,确实对应不上,
确认一下,这里【空行上面】的 span 是一个什么样的 span?即它在哪个服务里采集的? 按你上面提供的信息,初步看它应该是在 ingress-nginx 内采集的客户端 span 。(如理解错误请纠正我)
如果是 nginx ,确认下插码(即 skywalking-agent 的启动位置)是从什么位置开始的,这里看 nginx 有 trace_id 却没有 span_id,是否从更前的位置发起请求产生 trace_id,但不完整遵循 sw8 协议?
@taloric
@yujianweilai
空行上面的_id=7411062091836839336 下面的_id=7411062091836889697, 两个span信息,确实对应不上,
确认一下,这里【空行上面】的 span 是一个什么样的 span?即它在哪个服务里采集的? 按你上面提供的信息,初步看它应该是在 ingress-nginx 内采集的客户端 span 。(如理解错误请纠正我)
如果是 nginx ,确认下插码(即 skywalking-agent 的启动位置)是从什么位置开始的,这里看 nginx 有 trace_id 却没有 span_id,是否从更前的位置发起请求产生 trace_id,但不完整遵循 sw8 协议?
目前我们研发,只在自研的业务容器里使用了skywalking-agent插装,没有使用sky给nginx插装(对于ng的插装,我理解运维可以通过配置实现,后期我会完善),但是ng服务器上是部署了deepflow-agent的,所以nginx上的trace_id 会不会是deepflow-agent产生的呢?
@yujianweilai
目前我们研发,只在自研的业务容器里使用了skywalking-agent插装,没有使用sky给nginx插装(对于ng的插装,我理解运维可以通过配置实现,后期我会完善),但是ng服务器上是部署了deepflow-agent的,所以nginx上的trace_id 会不会是deepflow-agent产生的呢?
deepflow-agent 不会产生 trace_id,也不会在采集过程中获取到后续链路 trace_id。总结下来如果插桩了就不会有这个空行,如果能实现这是比较直接简单的解决方案
8 Grafana相关视图使用问题
8.1 Network - Flow Log 视图
【问题】
Network - Flow Log视图中,有一些异常报错数据中,他们的send 和Rece 都是0,推测是连接长时间没有数据传递,超时断开了。这些错误信息过多,会干扰正常信息显示。因为这两列数据都是metric,我无法再where语句中进行条件判断,请问有什么办法能过滤掉这部分数据?
【解决方案】
使用 close_type 过滤 WHERE !: Timeout
8.2 Applicaiton - Service List 视图
【问题】
auto_service的下来菜单中,展示的容器服务、云主机信息不全或信息重复
【解决方案】
研发待排查
【问题】
Endpoint属性值是类似29999564u 这样的内容,这是什么意思?
【解决方案】
gRPC协议的属性。
【问题】
如何理解Client Error Ratio 和 Server Error Ratio,一下图的第一行为例,我是否可以理解成:cx-application-admin这个容器,他作为server端接受请求时,错误率是21.22% ;他作为client去向外发出请求时,自己出错的概率是0%,说明他主动发出去的请求,都得到成功的返回。
【解决方案】
Client Error Ratio:表示服务端返回的4xx错误码占比(属于客户端错误)
Server Error Ratio:表示服务端返回的5xx错误码占比(属于服务端错误)
8.3 Application - Request Log 视图
【问题】
k8s集sta编排服务,在workload下拉菜单中,找不到。比如下图中,minio这个daemonset类型的服务,在下拉菜单中找不到
![image]tps://github.com/user-attachments/assets/341c5b13-b795-447c-ac1c-6187667a91ba)
【解决方案】
使用了主机网络的编排服务,deepflow会认为该服务是云主机,需要从“Application - Request Log - Cloud 视图”查询信息。
8.4 Application - Request Log - Cloud 视图
【问题】
发现 Application - Request Log - Cloud 视图中,主机的DNS信息采集不全
【解决方案】
研发在排查。。。
【问题】
有关数据库的错误信息,是如何探测到的,我们业务数据库版本是mysql5.7 ,比如SHOW ALL SLAVES STATUS 这类命令,在我们mysql上无法正常运行
【解决方案】
怀疑是数据库自身问题,deepflow不会主动向数据库发起查询请求。
8.5 Application - K8s Pod视图
【问题】Client error与Server error 含义不明
【解决方案】
Client Error :表示服务端返回的4xx错误码占比(属于客户端错误)
Server Error :表示服务端返回的5xx错误码占比(属于服务端错误)
【问题】Protocol列是N/A,是何原因,如何进行问题排查?
【解决方案】
略
8.6 IO Event视图
【问题】大部分k8s pod 或者 服务的IO数据是没有的
【解决方案】
可以看下 deepflow ns 下面有没有数据,如果有的话,就说明你现在选择的这个服务,没有 io 事件。
8 Grafana相关视图使用问题
8.1 Network - Flow Log 视图
【问题】 Network - Flow Log视图中,有一些异常报错数据中,他们的send 和Rece 都是0,推测是连接长时间没有数据传递,超时断开了。这些错误信息过多,会干扰正常信息显示。因为这两列数据都是metric,我无法再where语句中进行条件判断,请问有什么办法能过滤掉这部分数据?
8.2 Applicaiton - Service List 视图
【问题】 auto_service的下来菜单中,展示的容器服务、云主机信息不全或信息重复
![]()
![]()
【问题】 Endpoint属性值是类似29999564u 这样的内容,这是什么意思?
【问题】 如何理解Client Error Ratio 和 Server Error Ratio,一下图的第一行为例,我是否可以理解成:cx-application-admin这个容器,他作为server端接受请求时,错误率是21.22% ;他作为client去向外发出请求时,自己出错的概率是0%,说明他主动发出去的请求,都得到成功的返回。
8.3 Application - Request Log 视图
【问题】 k8s集sta编排服务,在workload下拉菜单中,找不到。比如下图中,minio这个daemonset类型的服务,在下拉菜单中找不到 ![image]tps://github.com/user-attachments/assets/341c5b13-b795-447c-ac1c-6187667a91ba)
![]()
8.4 Application - Request Log - Cloud 视图
【问题】 发现 Application - Request Log - Cloud 视图中,主机的DNS信息采集不全
【问题】 有关数据库的错误信息,是如何探测到的,我们业务数据库版本是mysql5.7 ,比如SHOW ALL SLAVES STATUS 这类命令,在我们mysql上无法正常运行
8.5 Application - K8s Pod视图
【问题】Client error与Server error 含义不明
【问题】Protocol列是N/A,是何原因,如何进行问题排查?
8.6 IO Event视图
【问题】大部分k8s pod 或者 服务的IO数据是没有的
-
如果觉得 timeout 是干扰项的话,直接用 close_type 过滤
WHERE !: *Timeout*就好了 -
确认下没搜到的服务当前时间段是否有流量,如果有的话直接去 l7 flow log 过滤对应的 pod,然后看看他的 aotu_service 值; 用 l7_protocol 看协议,去官网找对应 endpoint 协议对应的字段即可
-
确认这个时间段,此应用是否有流量经过
-
如果时间范围没问题的话,看 DeepFlow Alert Analysis 这个面板是否有数据
-
没识别到这些协议,不在目前可以识别的协议中
-
可以看下 deepflow ns 下面有没有数据,如果有的话,就说明你现在选择的这个服务,没有 io 事件
按您提供的方式查了一下,空行上面的_id=7411062091836839336 下面的_id=7411062091836889697, 两个span信息,确实对应不上,
这是什么原因?

【问题】 如何理解Client Error Ratio 和 Server Error Ratio,一下图的第一行为例,我是否可以理解成:cx-application-admin这个容器,他作为server端接受请求时,错误率是21.22% ;他作为client去向外发出请求时,自己出错的概率是0%,说明他主动发出去的请求,都得到成功的返回。 

【问题】 有关数据库的错误信息,是如何探测到的,我们业务数据库版本是mysql5.7 ,比如SHOW ALL SLAVES STATUS 这类命令,在我们mysql上无法正常运行 
【问题】Protocol列是N/A,是何原因,如何进行问题排查? 
