1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        不只是日志收集,項目監(jiān)控工具Sentry的安裝、配置、使用

        共 6947字,需瀏覽 14分鐘

         ·

        2022-07-25 10:07

        前言

        上一篇文章介紹了ExceptionLess這個日志收集系統(tǒng):ExceptionLess的安裝、配置、使用

        由于ExceptionLess官方提供的客戶端只有.Net/.NetCore平臺和js的,本文繼續(xù)介紹另一個日志收集系統(tǒng):Sentry

        Sentry 是一個實時事件日志記錄和聚合平臺。(官方說的是錯誤監(jiān)控 Error Monitor)它專門用于監(jiān)視錯誤和提取執(zhí)行適當?shù)氖潞蟛僮魉璧乃行畔ⅲ鵁o需使用標準用戶反饋循環(huán)的任何麻煩。

        Sentry使用Python(Django)開發(fā),功能非常豐富,相比起ExceptionLess來說也重得多(這也是我們在.NetCore平臺使用ExceptionLess的原因),其支持的平臺很全,基本主流編程語言/框架都有,看圖

        image

        除了.NetCore項目,其他的我都使用Sentry來收集日志和報錯信息,整體使用下來還是非常不錯的,(就是有點耗內(nèi)存),請準備好一臺內(nèi)存足夠大的服務器,起碼8G吧~

        安裝

        和ExceptionLess一樣,Sentry也可以在線使用,只需要注冊一個賬號就行了

        不過既然是開源免費的,還是自己部署一套比較自由,速度也比較快(Sentry服務器在國外)

        老規(guī)矩,使用docker做本地部署,最開始用這玩意的時候安裝折騰得很,后來官方自己出了個方便的安裝腳本,現(xiàn)在安裝應該是很容易了。

        首先拉取這個項目到本地:https://github.com/getsentry/self-hosted

        然后進入項目目錄,執(zhí)行./install.sh,經(jīng)過漫長的pull和build,根據(jù)提示輸入管理員的用戶名和密碼,就完事了

        官方提供的這個方案也是通過docker-compose管理容器的,以后我們也可以通過docker-compose相關的命令來手動啟停系統(tǒng)。

        跑起來后訪問http://ip:9000就可以看到登錄界面(端口根據(jù)實際配置可能不一樣)

        image

        用剛才創(chuàng)建的用戶名密碼登錄就行了

        配置

        Sentry的配置項是真的多,到現(xiàn)在大部分我都還沒搞清楚,我只是簡單的配置了郵件、端口這些,就可以用得飛起了

        接上面的,把官方提供的那個self-host項目clone下來之后,可以看到里面有個sentry文件夾,配置文件就在這目錄里。

        郵件配置在config.yml文件中,(比ExceptionLess好的一點是郵箱地址終于不需要轉義了)

        這里以騰訊企業(yè)郵箱配置為例,在配置中找到# Mail Server #這個“節(jié)點”

        mail.backend: 'smtp'  # Use dummy if you want to disable email entirely
        mail.host: 'smtp.exmail.qq.com'
        mail.port: 465
        mail.username: '[email protected]'
        mail.password: 'password'
        mail.use-tls: false
        # mail.use-ssl: false
        mail.from: '[email protected]'

        這樣就可以正常發(fā)郵件了~

        那么端口要怎么改呢,舊版的onpremise(也就是這個self-host項目)是直接在docker-compose.yml里改的,不過現(xiàn)在不推薦修改這個文件了(官方的這個compose配置文件我甚至看不懂)

        現(xiàn)在通過環(huán)境變量設置,使用ll -a列出項目目錄下所有文件,可以發(fā)現(xiàn)有個.env文件,環(huán)境變量就在這文件里配置,里面有一行配置端口的

        SENTRY_BIND=9000

        直接修改就完事了~

        使用

        Sentry的界面比ExceptionLess的復雜很多,里面的信息也更多,讓人看得眼花繚亂

        作為日志收集工具的話,主要就是看“問題”頁面,可以篩選某個項目,也可以看全部,這點比ExceptionLess直觀一些

        image

        點擊某一個問題進去可以看到錯誤詳情

        image

        如果是Python這類動態(tài)語言,甚至可以直接看到是哪段代碼報錯,太方便了

        image

        然后性能頁面可以細化到每個請求的相應時間、錯誤頻率、訪問的用戶數(shù)量等

        image

        然后再點進去某一個URL還能看到訪問這個URL的用戶的一些信息,包括IP地址,用戶名(如果已登錄),頁面停留時間,用戶都是哪些時間段訪問啥的,指標太多了,有些不太懂,反正功能是很強的就對了~

        image

        大概就這些吧,其他功能我還沒有深入,等后續(xù)繼續(xù)學習后再來更新博客。

        項目集成

        首先可以看官網(wǎng)文檔,還是比較全的,而且大部分語言都提供了集成的Demo。

        文檔地址:https://docs.sentry.io/

        一些Demo:https://github.com/getsentry/sentry-dotnet/tree/main/samples

        直接上幾個項目集成的例子吧

        本身在Sentry中創(chuàng)建項目時,系統(tǒng)也會顯示一個簡單的集成指引,這里把我魔改的代碼放上來

        Django項目

        首先根據(jù)指引需要安裝一個pip包

        pip install sentry-sdk

        我習慣將項目配置settings.py放在config包下,然后把拆分出來的配置一個個都列在這個包中,方便管理

        config下創(chuàng)建sentry.py,代碼如下

        import logging

        import sentry_sdk
        from sentry_sdk.integrations.django import DjangoIntegration
        from sentry_sdk.integrations.logging import LoggingIntegration
        from sentry_sdk.integrations.redis import RedisIntegration

        sentry_logging = LoggingIntegration(
            level=logging.INFO,  # Capture info and above as breadcrumbs
            event_level=logging.ERROR  # Send errors as events
        )

        sentry_sdk.init(
            # 反正dsn這行無腦復制sentry上顯示的就行
            dsn="http://key@sentry地址/id",
            integrations=[DjangoIntegration(), RedisIntegration(), sentry_logging],

            # 這里設置為1代表捕捉100%的transaction 用于性能監(jiān)控
            traces_sample_rate=1,
            send_default_pii=True,
        )

        然后在settings.py里引入就完事了

        from config import sentry

        Flutter項目

        根據(jù)指引首先要添加依賴

        dependencies:
          sentry_flutter: ^5.1.0

        PS:現(xiàn)在這個依賴出了6.x版本了,初始化的時候是用異步操作的,我還沒更新,就先用5.x版本了

        這是原本main.dart中的App初始化代碼

        void main() {
          WidgetsFlutterBinding.ensureInitialized();
          if (Platform.isAndroid) {
              // 以下兩行 設置android狀態(tài)欄為透明的沉浸。
              SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
              SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
          }
          Global.init().then((value) => runApp(MyApp()));
        }

        引入Sentry之后,需要包裝一層

        import 'package:sentry_flutter/sentry_flutter.dart';

        void main() {
          WidgetsFlutterBinding.ensureInitialized();

          SentryFlutter.init(
            (options) {
              options.dsn = 'http://[email protected]:9800/9';
            },
            appRunner: () {
              if (Platform.isAndroid) {
                SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
                SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
              }
              Global.init().then((value) => runApp(MyApp()));
            }
          );
        }

        也就是把原本啟動App的代碼放在SentryFlutter的appRunner里執(zhí)行。

        AspNetCore項目

        雖然AspNetCore項目我們使用ExceptionLess來采集日志,不過在切換到ExceptionLess之前,也用了一段時間的Sentry,Sentry支持的平臺那么豐富,在AspNetCore中使用自然也是沒問題的。

        根據(jù)官方指引首先安裝依賴

        dotnet add package Sentry.AspNetCore -v 3.19.0

        然后將sentry的配置寫在appsettings.json

        "Sentry": {
          "Dsn""https://[email protected]/0",
          "MaxRequestBodySize""Always",
          "SendDefaultPii"true,
          "MinimumBreadcrumbLevel""Debug",
          "MinimumEventLevel""Warning",
          "AttachStackTrace"true,
          "Debug"true,
          "DiagnosticsLevel""Error"
        }

        跟ExceptionLess不同,sentry不用注冊服務和添加中間件的方式,而是實現(xiàn)了IWebHostBuilder的擴展方法,在ConfigureWebHostDefaults時就hook到系統(tǒng)中,理論上功能會更強,ExceptionLess通過中間件只能捕捉到類似URL不存在這類HTTP異常,如果是程序中報錯是需要手動catch后submit的;而sentry是采用hook的形式(官網(wǎng)說的),可以捕捉到未處理的異常并且上報。(根據(jù)微軟文檔中AspNetCore的啟動過程推測出的,理解得不深如果有錯誤請大佬們指正~)

        所以對于AspNetCore3.1項目,修改Program.cs文件,添加一行代碼 webBuilder.UseSentry();

        public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
          .ConfigureWebHostDefaults(webBuilder => {
            webBuilder.UseSentry();
            webBuilder.UseStartup<Startup>();
          });

        對于AspNetCore6項目,也是Program.cs文件(.Net6也只有這文件)

        var builder = WebApplication.CreateBuilder(args);
        builder.WebHost.UseSentry();

        搞定,然后sentry就會捕捉異常并提交

        也可以手動提交,比如

        void Demo([FromServices] IHub sentry) {
          // 提交普通信息
          sentry.CaptureMessage("hello", SentryLevel.Debug);
          
          try {
            // 會出錯的代碼
          }
          catch (Exception err) {
              sentry.CaptureException(err);
          }
        }

        當然根據(jù)文檔也可以不用依賴注入

        using Sentry;

        try {
            // 會出錯的代碼
        }
        catch (Exception err) {
            SentrySdk.CaptureException(err);
        }

        OK,先這些吧,其他例子直接看官網(wǎng)就行~


        瀏覽 140
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日本亲与子乱人妻hd | 亚洲无码黄色电影 | 国产一级a毛一级a看… | 黄色视频h | 亚洲高清视屏 | 麻豆电影在线看 | 香蕉久久国产亚洲-V666AV | 少妇年轻交换电影院 | 91干干| 国产又爽 又黄 免费视频 |