1. 程式人生 > >pinpoint 原始碼解析,怎樣監控tornado 協程中的函式?

pinpoint 原始碼解析,怎樣監控tornado 協程中的函式?

## 協程中監控函式,為啥比較特殊! 首先需要明白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/