Flask Sentry 獲取原始請求報(bào)文

Flask Sentry

Sentry

Users and logs provide clues. Sentry provides answers.

What's Sentry?

Sentry fundamentally is a service that helps you monitor and fix crashes in realtime. The server is in Python, but it contains a full API for sending events from any language, in any application.
https://github.com/getsentry/sentry

這里我們就不詳細(xì)介紹,具體內(nèi)容見官網(wǎng),簡單理解是一個(gè)面向主流語言的開源錯(cuò)誤日志收集服務(wù)

Flask use Sentry

flask 如何使用 Sentry?
官網(wǎng),基本接入非常簡單块差,兩行代碼級(jí)別就搞定

Problem

接入 Sentry 之后我們發(fā)現(xiàn)使用原先 flask.Request.get_data 方法無法獲取原始報(bào)文!

get_data(cache=True, as_text=False, parse_form_data=False)

This reads the buffered incoming data from the client into one bytestring. By default this is cached but that behavior can be changed by setting cache to False.

Usually it’s a bad idea to call this method without checking the content length first as a client could send dozens of megabytes or more to cause memory problems on the server.

Note that if the form data was already parsed this method will not return anything as form data parsing does not cache the data like this method does. To implicitly invoke form data parsing function set parse_form_data to True. When this is done the return value of this method will be an empty string if the form parser handles the data. This generally is not necessary as if the whole data is cached (which is the default) the form parser will used the cached data to parse the form data. Please be generally aware of checking the content length first in any case before calling this method to avoid exhausting server memory.

If as_text is set to True the return value will be a decoded unicode string.

查看 Flask Sentry 的源碼發(fā)現(xiàn),在每個(gè)請求之前 Sentry 會(huì)記錄請求信息柜去,想想他要實(shí)現(xiàn)的功能也應(yīng)該可以預(yù)見這個(gè)實(shí)現(xiàn)。
實(shí)現(xiàn)中會(huì)訪問 request.form 或者 request.data 源碼

werkzeug.wrappers.BaseRequest.data

Contains the incoming request data as string in case it came with a mimetype Werkzeug does not handle.

那也就是說 Sentry 會(huì)先于我們自己的代碼獲取 request.data拆宛,同時(shí)當(dāng) request.data 無法被 utf8 編碼的情況下嗓奢,拋棄掉這些內(nèi)容,之后我們獲取的內(nèi)容就為空了胰挑。

Resolve

方案一

https://github.com/getsentry/raven-python/issues/457, 我們一定不是第一個(gè)遇到這個(gè)問題的人

@app.before_request
def enable_form_raw_cache():
  if request.path.startswith('/redacted'):
    if request.content_length > 1024 * 1024:  # 1mb
      abort(413)  # Payload too large
    request.get_data(parse_form_data=False, cache=True)

方案二

@app.before_request
def enable_form_raw_cache():
    cache_path_list = [
        '/PATH_FOO',
        '/PATH_BAR',
    ]
    path = request.path
    if any([path.startswith(i) for i in cache_path_list]):
        request.get_data(parse_form_data=False, cache=True)

總體思路都是在 Sentry 訪問 request.data 之前把它先緩存起來蔓罚,并且是選擇性的緩存起來

N more things

更多的思考

  • 為什么會(huì)有不是 utf8 編碼的數(shù)據(jù)椿肩?

    • 這個(gè)是開玩笑了瞻颂,因?yàn)槲覀円邮?GBK 編碼的 XML 數(shù)據(jù)豺谈,這個(gè)的根本原因我們就不細(xì)談了。
  • 為什么 flask 不緩存所有的原始對(duì)象贡这?

    • 這應(yīng)該是個(gè)好問題茬末,可能的原因,太多的原始對(duì)象消耗內(nèi)存盖矫。同時(shí)因?yàn)橐呀?jīng)將請求數(shù)據(jù)從流對(duì)象中讀出丽惭,然后結(jié)構(gòu)化了,也就沒有必要保存原始對(duì)象了

原文地址: http://caimaoy.com/caimaoy_gitbook/flask/sentry.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辈双,一起剝皮案震驚了整個(gè)濱河市责掏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湃望,老刑警劉巖换衬,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異证芭,居然都是意外死亡瞳浦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門废士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叫潦,“玉大人,你說我怎么就攤上這事官硝〈H铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵氢架,是天一觀的道長傻咖。 經(jīng)常有香客問我,道長达箍,這世上最難降的妖魔是什么没龙? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缎玫,結(jié)果婚禮上硬纤,老公的妹妹穿的比我還像新娘。我一直安慰自己赃磨,他們只是感情好筝家,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邻辉,像睡著了一般溪王。 火紅的嫁衣襯著肌膚如雪腮鞍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天莹菱,我揣著相機(jī)與錄音移国,去河邊找鬼。 笑死道伟,一個(gè)胖子當(dāng)著我的面吹牛迹缀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜜徽,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祝懂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拘鞋?” 一聲冷哼從身側(cè)響起砚蓬,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盆色,沒想到半個(gè)月后灰蛙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傅事,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年缕允,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹭越。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡障本,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出响鹃,到底是詐尸還是另有隱情驾霜,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布买置,位于F島的核電站粪糙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏忿项。R本人自食惡果不足惜蓉冈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轩触。 院中可真熱鬧寞酿,春花似錦、人聲如沸脱柱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榨为。三九已至惨好,卻和暖如春煌茴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背日川。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蔓腐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逗鸣。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓合住,卻偏偏與公主長得像绰精,于是被迫代替她去往敵國和親撒璧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,451評(píng)論 0 13
  • 英文文檔笨使,一開始我也是抗拒的卿樱,邊翻譯邊看,也就花費(fèi)了1個(gè)小時(shí)基本就閱讀過了硫椰,我的英文基礎(chǔ)其實(shí)很差繁调。附上鏈接:鏈接:...
    lonecolonel閱讀 9,900評(píng)論 3 1
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc閱讀 2,850評(píng)論 0 0
  • Quickstart http://flask.pocoo.org/docs/0.12/quickstart/ Q...
    icewinde閱讀 1,845評(píng)論 0 2
  • 青春是什么 青春是拙裝生長的小樹 艷陽高照 照不走它的那份堅(jiān)強(qiáng) ...
    露潔閱讀 234評(píng)論 0 1