客户端容器节点
举例说明具体的含义,表达是 cartservice 服务访问 redis-cart 服务,在 cartservice 对应 POD 所在的容器节点上采集到的访问数据,然后聚合的指标量。上图查看的指标量为响应时延
,不难看出瓶颈在服务端容器网络,判断过程如下:客户端名称
、服务端名称
、指标量
以及时间范围
作为 API 的搜索条件即可获得全栈路径拓扑
数据。客户端服务及服务端名称
,根据需求明确需要查看的指标量
及查看的时间范围
SELECT Avg(`request`), /* 需要查看的指标量 */
pod_service_0, /* 客户端服务名称,客户端为 POD,则替换为 pod_0 */
tap_side,
pod_service_1 /* 服务端服务名称,服务端为 POD,则替换为 pod_1 */
FROM vtap_app_edge_port /* 查看应用指标使用 vtap_app_edge_port;查看网络指标切换到 vtap_flow_edge_port */
WHERE time>=1678760220 AND time<=1678762020 AND
pod_service_0='deepflow-server' AND /* 过滤客户端 */
pod_service_1='deepflow-server' /* 过滤服务端 */
GROUP BY pod_service_0,
tap_side,
pod_service_1,
c-app/app/c-p/c/c-nd/c-hv/c-gw-hv/c-gw/local/rest/s-gw/s-gw-hv/s-hv/s-nd/s/s-p/s-app
从左到右排序,每个节点独立显示指标数据
。服务名称
、指标量
以及时间范围
作为 API 的搜索条件即可获得全景上下游拓扑
数据,需要两次调用的 DeepFlow API,分别获取到上游和下游的数据如下:SELECT Avg(`request`), /* 需要查看的指标量 */
pod_service_0, /* 客户端服务名称,客户端为 POD,则替换为 pod_0 */
tap_side,
pod_service_1 /* 服务端服务名称,服务端为 POD,则替换为 pod_1 */
FROM vtap_app_edge_port /* 查看应用指标使用 vtap_app_edge_port;查看网络指标切换到 vtap_flow_edge_port */
WHERE time>=1678760220 AND time<=1678762020 AND
pod_service_1='deepflow-server' /* 需要查看上游数据的服务 */
GROUP BY pod_service_0,
tap_side,
pod_service_1,
获取下游数据
SELECT Avg(`request`), /* 需要查看的指标量 */
pod_service_0, /* 客户端服务名称,客户端为 POD,则替换为 pod_0 */
tap_side,
pod_service_1 /* 服务端服务名称,服务端为 POD,则替换为 pod_1 */
FROM vtap_app_edge_port /* 查看应用指标使用 vtap_app_edge_port;查看网络指标切换到 vtap_flow_edge_port */
WHERE time>=1678760220 AND time<=1678762020 AND
pod_service_0='deepflow-server' /* 需要查看下游数据的服务 */
GROUP BY pod_service_0,
tap_side,
pod_service_1,
图中 A 表示应用 Span(来源传统 APM);S 表示网络 Span(来源 DeepFlow);N 表示网络 Span(来源 DeepFlow)
图中黑色部分为发起全栈调用追踪的的应用 Span,后续统称为 应用 Span Y
图中蓝色部分为通过 应用 Span Y
追踪的路径中的系统和网络 Span
图中绿色部分为通过 应用 Span Y
追踪的下游未插码的 Span
图中红色部分为通过 应用 Span Y
追踪的上游未插码的 Span
SELECT response_duration,
start_time,
end_time,
resource_gl0_0, /* 客户端 */
resource_gl0_1, /* 服务端 */
tap_port_type, /* eBPF、NIC ... */
tap_port, /* NIC Name */
trace_id,
span_id
FROM l7_flow_log
WHERE trace_id = 'c5ad367da7ed41fc97921d91a0584bd8.63.16620935428909473' AND
span_id = 'e05ee7a06d674085a16dfea36ed11b98.169.16620935428971714-2' AND /* 非必须,精确搜索 */
time >= 1662093572 AND time <= 1662095372 /* 加速搜索 */
应用 Span Y
的 TraceID + SpanID 追踪 DeepFlow 的系统 Span,此时可能会得到多个系统 Span,只需要获取与应用 Span Y
紧邻的系统 Span X
继续往下追踪即可(可通过总时延最长来判断)系统 Span X
的 syscall_trace_id_request 作为其他系统 Span 的搜索条件,得到系统 Span Z
SELECT response_duration, /* SELECT 字段可以根据需求自定义即可*/
l7_protocol,
Enum(request_type),
request_resource,
process_kname_0,
process_kname_1,
tap_side,
req_tcp_seq,
resp_tcp_seq,
Enum(auto_instance_type_0) AS `client_Enum(auto_instance_type_0)`,
auto_instance_0,
Enum(auto_instance_type_1) AS `server_Enum(auto_instance_type_1)`,
auto_instance_1,
FROM l7_flow_log
WHERE time>=1678764261 AND /*追踪开始时间,建议设置比系统 Span X 的开始时间早 3min*/
time<=1678767861 AND /*追踪结束时间,建议设置比系统 Span X 的结束时间晚 3min*//
(syscall_trace_id_request=16787489195430278) /* 16787489195430278 为 系统 Span Y 的 syscall_trace_id_request */
ORDER BY `end_time`
③ 获取系统 Span Z
的 req_tcp_seq/resp_tcp_seq 作为其他系统 Span 和网络 Span 的搜索条件,得到网络 Span Z.1/Z.2 以及系统 Span Q
,此处逻辑特别注意:req_tcp_seq !=0 & resp_tcp_seq !=0 则需要同时满足 req_tcp_seq 和 resp_tcp_seq;如果其中一个为 0,则任意满足一个即可
SELECT response_duration, /* SELECT 字段可以根据需求自定义即可*/
l7_protocol,
Enum(request_type),
request_resource,
process_kname_0,
process_kname_1,
tap_side,
req_tcp_seq,
resp_tcp_seq,
Enum(auto_instance_type_0) AS `client_Enum(auto_instance_type_0)`,
auto_instance_0,
Enum(auto_instance_type_1) AS `server_Enum(auto_instance_type_1)`,
auto_instance_1,
FROM l7_flow_log
WHERE time>=1678764261 AND
time<=1678767861 AND
(type=2 AND
req_tcp_seq=3575241005 AND /* 3575241005 为系统 Span Z 的 req_tcp_seq*/
resp_tcp_seq=995863176) /* 995863176 为系统 Span Z 的 resp_tcp_seq*/
ORDER BY `end_time`
④ 接下来可继续追踪系统 Span Q
的上游系统 Span,这里将分两种情况,如果上游的系统 Span 与系统 Span Q
在同一个线程,则重复步骤 [2]/[3] 即可,如果在不同线程/进程中,目前仅支持网关设置了 X-Request-ID 的情况下继续追踪,获取系统 Span Q
的 x-request-id 作为查询其他系统 Span 和网络 Span 的搜索条件,得到其上游的系统 Span M
SELECT response_duration, /* SELECT 字段可以根据需求自定义即可*/
l7_protocol,
Enum(request_type),
request_resource,
process_kname_0,
process_kname_1,
tap_side,
req_tcp_seq,
resp_tcp_seq,
Enum(auto_instance_type_0) AS `client_Enum(auto_instance_type_0)`,
auto_instance_0,
Enum(auto_instance_type_1) AS `server_Enum(auto_instance_type_1)`,
auto_instance_1,
FROM l7_flow_log
WHERE time>=1678764261 AND
time<=1678767861 AND
x_request_id=6e903947-5ef0-4c63-91a8-a2a599171633 /* 6e903947-5ef0-4c63-91a8-a2a599171633 为系统 Span Q 的 x_request_id*/
ORDER BY `end_time`
⑤ 到此,已经根据上述步骤追踪得到所有的上游 Span,接下来将确定父子关系,可直接根据总的响应时延,按从大到小降序排列即可
红色部分
非常相似,仅步骤 ② 中的syscall_trace_id_request
换成syscall_trace_id_response
即可,此处不在赘述。统计位置的说明参考 DeepFlow 官网的线上文档: https://deepflow.io/docs/zh/auto-metrics/metrics-without-instrumentation/
[2]SQL 调用参考 DeepFlow 官网的线上文档: https://deepflow.io/docs/zh/server-integration/query/sql/
[3]DeepFlow 让 SkyWalking 分布式追踪无盲点: https://deepflow.io/blog/007-skywalking-distributed-tracing-without-blind-spots/#0x1-DeepFlow-SQL-API
[4]DeepFlow: https://github.com/deepflowys/deepflow
[5]DeepFlow Demo: https://deepflow.yunshan.net/docs/zh/install/overview/
https://deepflow.yunshan.net/community.html
https://github.com/deepflowys/deepflow
https://deepflow.yunshan.net/docs/about/overview/
关于 DeepFlow
DeepFlow 是云杉网络开源的一款高度自动化的可观测性平台,是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术,创新的实现了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心机制,帮助开发者提升埋点插码的自动化水平,降低可观测性平台的运维复杂度。利用 DeepFlow 的可编程能力和开放接口,开发者可以快速将其融入到自己的可观测性技术栈中。
DeepFlow 企业版自2016年起已在中国移动、中国联通、中国电信、国家电网、招商银行、民生银行、光大银行、中国人保财险、平安科技、兴业数金、国泰君安、海通证券、上汽集团、深航货运、东方明珠、中保信等超过50家企业级数据中心落地部署,帮助客户构建多维度、一体化的可观测性平台。
点击「阅读原文」前往博客观看完整内容