pinpoint 原始碼解析,怎樣監控tornado 協程中的函式?
阿新 • • 發佈:2020-05-22
## 協程中監控函式,為啥比較特殊!
首先需要明白pinpoint 怎樣做監控的。
1. python中通過包裝器,實現函式/方法包裝
2. pinpoint內部維持一個呼叫棧的關係,內部通過棧來實現。這個棧的生命期和函式執行的生命期繫結在一起。
然而, 協程函式可以被yeild,await 中斷。導致監控棧丟失。
內部術語叫 trace missing.
值得慶幸的是,python提供了棧的追蹤。https://www.python.org/dev/peps/pep-0567/
## 解決思路
通過使用python 協程內建 Context 管理介面,儲存呼叫棧,就可以實現在協程中恢復呼叫棧。
``` c
static void* get_coro_local(void)
{
if(PyContextVar_Get(coro_local,NULL,&obj)<0){
pp_trace("get coro local failed");
return NULL;
}
...
# do something on context variable
...
}
```
## 一個完整的監控 tornado 非同步的例子
https://github.com/naver/pinpoint-c-agent/tree/master/Example/PY/