#可观测
Datafusion 学习(0)
记录一些 datafusion 的学习内容。
·1min·李岩
Datafusion 学习(0)无侵入观测服务拓扑四元组的一种实现
最近有了些时间,继续整理下之前的项目。服务四元组的信息对于故障处置、根因定位等都有重要意义。使用eBPF可以做到无侵入用户代码获取服务四元组信息的功能。这一点在工程应用上很有意义。笔者在这方面投入了一些精力,这里做一下简单的总结。
服务四元组指的是[caller, caller_func, callee, callee_func]四元组。如下图是一个调用示例,站在服务A的角度,就存在如下两个四元组: [A, /a, B, /b],[A, /a, C, /c]。站在服务B, C的角度,也存在两个四元组(可能有不同的理解): [B, /b, none, none], [C, /c, none, none]。
service call
,-------. ,-. ,-. ,-.
|outisde| |A| |B| |C|
`---+---' `+' `+' `+'
| /a | | |
|-------------->| | |
| | | |
| | /b | |
| |----------->| |
| | | |
| | /c |
| |------------------------>|
,---+---. ,+. ,+. ,+.
|outisde| |A| |B| |C|
`-------' `-' `-' `-'
在弄清楚四元组是什么之后,下面进入今天的话题:如何使用BPF来采集四元组。需要说明的是,笔者这里的语言使用的是golang-1.16。golang不同语言版本间的区别,见:golang-1.17+调用规约。
值得注意的是,关于观测服务数据,是有很多解决方案的。本文仅是笔者实践的一种解决方案,在文末会简单提到这种方案的优缺点。
按照惯例,先看下效果吧:
# 启动采集
bpftrace ./http.bt
Attaching 2 probes... # 未触发请求前,停止在这里
caller: # 触发请求后,输出
caller_path: /handle
callee:
method: GET
host: 0.0.0.0:9932
url: /echo
caller:
caller_path: /echo
callee: none
# 开始服务
./http_demo &
# 触发请求
curl http://0.0.0.0:9932/handle
·6min·李岩
无侵入观测服务拓扑四元组的一种实现