Flask Sentry 获取原始请求报文

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

这里我们就不详细介绍,具体内容见官网,简单理解是一个面向主流语言的开源错误日志收集服务

Flask use Sentry

flask 如何使用 Sentry?
官网,基本接入非常简单,两行代码级别就搞定

Problem

接入 Sentry 之后我们发现使用原先 flask.Request.get_data 方法无法获取原始报文!

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 的源码发现,在每个请求之前 Sentry 会记录请求信息,想想他要实现的功能也应该可以预见这个实现。
实现中会访问 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 会先于我们自己的代码获取 request.data,同时当 request.data 无法被 utf8 编码的情况下,抛弃掉这些内容,之后我们获取的内容就为空了。

Resolve

方案一

https://github.com/getsentry/raven-python/issues/457, 我们一定不是第一个遇到这个问题的人

@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

更多的思考

  • 为什么会有不是 utf8 编码的数据?

    • 这个是开玩笑了,因为我们要接受 GBK 编码的 XML 数据,这个的根本原因我们就不细谈了。
  • 为什么 flask 不缓存所有的原始对象?

    • 这应该是个好问题,可能的原因,太多的原始对象消耗内存。同时因为已经将请求数据从流对象中读出,然后结构化了,也就没有必要保存原始对象了

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • 英文文档,一开始我也是抗拒的,边翻译边看,也就花费了1个小时基本就阅读过了,我的英文基础其实很差。附上链接:链接:...
    lonecolonel阅读 9,876评论 3 1
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 2,822评论 0 0
  • Quickstart http://flask.pocoo.org/docs/0.12/quickstart/ Q...
    icewinde阅读 1,834评论 0 2
  • 青春是什么 青春是拙装生长的小树 艳阳高照 照不走它的那份坚强 ...
    露洁阅读 232评论 0 1