[web部署]sentry-日志采集-web服務監控


Sentry

概述

sentry是一個全平台支持,用Python編寫的一整套錯誤信息實時收集統計和報告的應用平台。

與項目整合關聯,對異常進行收集、分析、可視化、通知。

屬於C/S架構

  • 客戶端:在項目中集成sentry客戶端SDK
  • 服務端:
    • 使用sentry官方提供的,5000條異常信息內免費,之后收費;
    • 自行搭建服務端,可以通過docker和python進行搭建,
    • 由於sentry依賴的服務較多,所以后續使用docker搭建;

0.安裝

pip3 install sentry-sdk[flask]==0.14.2

注:不能pip3 install sentry,否則會報錯:You're trying to run a very old release of Beautiful Soup under Python 3.

1.整合-配置

sentry_logging = LoggingIntegration(
    level=logging.INFO,        # Capture info and above as breadcrumbs,只會抓取info及以上等級
    event_level=logging.ERROR  # Send errors as events,error及以上會被當做event而不再是breadcrumb
)

sentry_sdk.init(
    dsn="https://b2fd693327b4451d8d5691a513e1964b@sentry.io/3560845",
    integrations=[FlaskIntegration(), sentry_logging],
    # debug=True,
    request_bodies="never",     # 請求體不會被顯示在sentry中
    before_send=before_send,
    before_breadcrumb=before_breadcrumb
)

1.5 分類

  • 發送內容分為:event和breadcrumb
  • breadcrumb必須依附於event,無法單獨發送

2.兩個自定義異常信息方法

  • 自定義event和breadcrumbs
  • 如果before_send方法中不return,則不會調用before_breadcrumb方法
def before_send(event, hint):
    """
    {'level': 'error', 'exception': {'values': [{'module': 'json.decoder', 'type': 'JSONDecodeError', 'value': 'Extra data: line 1 column
    {'exc_info': (<class 'json.decoder.JSONDecodeError'>,
    :param event:異常事件,包含了異常對象的全部信息
    :param hint:包含3個對象,但不包含異常信息,僅是異常對象而已
    :return:
    """
    print("before_send------------------")
    # 這一句必須沒有,否則會導致capture_message生成的event為None,從而不會發送給sentry
    # exc_type, exc_value, tb = hint['exc_info']
    print(event)
    print(hint)
    try:
        # event字典的所有鍵共14個
        # 必須有event_id,否則sentry收不到異常
        # 如果沒有仍然可以收到但會提示的共9個:['level', 'exception', 'modules', 'timestamp', 'request', 'contexts', 'breadcrumbs', 'extra', 'sdk']
        exception = {
            'level': "error",
            'exception': "包含錯誤棧信息和參數,做處理",
            'event_id': "異常id",
            'timestamp': "時間戳",
            'transaction': "trigger_error,錯誤觸發方式",
            'breadcrumbs': "attach to this even",
            'contexts': "trace等信息(traceid),runtime信息",
            'modules': "當前項目依賴的python模塊",
            'extra': "運行主文件路徑",
            'request': "請求信息,url/headers/data等",
            'server_name': "當前主機名,發送請求or服務端所在主機名",
            'sdk': "當前sentry版本、整合信息",
            'platform': "python/java",
            '_meta': "其他信息"
        }
        # 控制是否要處理錯誤信息
        status = True
        if status:
            for key, value in event.items():
                if key == "exception":
                    values_list = event["exception"]["values"]
                    for value in values_list:
                        stacktrace_list = value["stacktrace"]["frames"]
                        for stacktrace in stacktrace_list:
                            stacktrace["vars"] = ""
                elif key in ["message", "level", "event_id", "timestamp", "transaction", "breadcrumbs"]:
                    pass
                else:
                    event[key] = ""
    except:
        pass
    return event


def before_breadcrumb(crumb, hint):
    """
    {'ty': 'log', 'level': 'info', 'category': 'werkzeug', 'message': '127.0.0.1 - - [06/Mar/2020 13:07:38] "GET /?data=12345. HTTP/1.1
    {'log_record': <LogRecord: werkzeug, 20, C:\Program Files\python_virtual\estate\lib\s
    :param crumb:捕獲到的breadcrumbs信息,即app.logger/logging信息
    :param hint:包含3個對象,但不包含異常信息,僅是異常對象而已
    :return:
    """
    print("before_breadcrumb------------------")
    print(crumb)
    print(hint)
    return crumb

3.四個捕獲方法

  • 3個發送異常event:
    • capture_exception:傳入異常對象,適合非自定義,直接發送錯誤stacktrace信息
    • capture_message:傳入異常字符串,適合自定義異常信息
    • capture_event:傳入異常字典,適合高度自定義event
  • 1個發送breadcrumb,add_breadcrumb
    • 使得不依賴logging而獨立對日志等級進行控制
    • 總會發送,而無論level是什么,只有展示圖標上的區別
    • 參數:catagory/message/data/level/type
    • level參數:fatal, error, warning, info, debug
    • type參數:default,http,error,由於default圖標一致,所以選擇
  • 由於capture_event傳入字典很便捷,所以選擇

4.異常信息的發送控制

  • 如果用add_breadcrumb,則sentry與flask日志控制完全分離
  • 如果使用app.logger,則無法做到分離
    • flask中日志是否記錄取決於app.logger.setLevel()的設置
    • sentry日志等級由flask和sentry共同決定,等級取二者最高的

5.注意點

  • before_send方法中不能有hint["exc_info"],否則會導致event為None,不會發送event

6.與flask自帶日志整合

  • 加入sentry不會對flask原有記錄造成任何影響
  • sentry的發送:
    • 異常對象event,沒有等級限制都會發送
    • breadcrumb,before_breadcrumb方法中必須return才會發送
      • add_breadcrumb都會發送
      • app.logger/logging則取決於flask和sentry日志level的最高者
      # info及之上等級都會發送
      app.logger.setLevel("DEBUG")
      
      # 僅對app.logger/logging起作用
      sentry_logging = LoggingIntegration(
          level=logging.INFO,        # Capture info and above as breadcrumbs,只會抓取info及以上等級
          event_level=logging.ERROR  # Send errors as events,error及以上會被當做event而不再是breadcrumb
      )
      

7.與scrapy進行整合,待測試

8.整合github

  • 關聯倉庫
    • 可以與github的issue互通,且可以自動關聯可能有問題的commit

    • Create Release and Associate Commits:In your release process, add a step to create a release object in Sentry and associate it with commits from your linked repository.

      # Assumes you're in a git repository
      export SENTRY_AUTH_TOKEN=...
      export SENTRY_ORG=my-org
      VERSION=$(sentry-cli releases propose-version)
      
      # Create a release
      sentry-cli releases new -p project1 -p project2 $VERSION
      
      # Associate commits with the release
      sentry-cli releases set-commits --auto $VERSION
      

9.整合釘釘機器人

  • 配置:TODO

10.其他


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM