zoukankan      html  css  js  c++  java
  • [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 Filespython_virtualestatelibs
        :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.其他

  • 相关阅读:
    牢固你的人际关系三十六计
    Google 将携手大众,开发新一代汽车导航系统
    C++图书热点观察[转]
    Qt程序http报错 TLS initialization failed
    基于kinova jaco2机械臂的仿真模拟
    IfcBuild2Axes
    threejs绘制多边形2
    QAction
    java Math.pow
    yolov5模型地址
  • 原文地址:https://www.cnblogs.com/justaman/p/12452369.html
Copyright © 2011-2022 走看看