.net core 集成 sentry 进行异常报警

intro

sentry 是一个实时事件日志记录和汇集的平台。其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈。它分为客户端和服务端,客户端(目前客户端有 c#, python, php, javascript, ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web页方便查看。

sentry 是 python 写的一个开源的项目 而且可以满足私有部署的需求

官方介绍:

sentry is cross-platform application monitoring, with a focus on error reporting.

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

使用效果

sentry 里每一个错误/异常被视为一个 issue,在 sentry 的后台可以看到对应项目的错误信息,并且会受到 sentry 的邮件推送

dotnetcore 集成

针对 asp.net core 的集成,分为两种方式,sentry 提供了一个底层一点的基于 microsoft.extensions.logging 的集成方式(sentry.extensions.logging)和基于 asp.net core 框架的集成方式(sentry.aspnetcore),我目前在用基于 logging 方式的集成方式(基于 asp.net core 的集成是后来才有的,后面也没有再修改),如果要集成 asp.net core 项目可以直接使用 sentry.aspnetcore

我目前用的是 sentry.extensions.logging 基本配置如下:

loggerfactory
    .addsentry(options =>
        {
            options.dsn = configuration.getappsetting("sentryclientkey");
        });

dsn 是创建项目之后在项目的配置里可以看得到

more config

loggerfactory
    .addserilog()
    .addsentry(options =>
    {
        options.dsn = configuration.getappsetting("sentryclientkey");
        options.environment = env.environmentname; // 设置环境
        options.minimumeventlevel = loglevel.error; // 设置 sentry event 级别
    });

修改 sentry event 信息,对于发生的错误异常可以在发送到 sentry 服务器端之前做修改,对于要忽略的异常也可以在这个事件中做,比如系统中的 taskcanceledexception ,我在使用异步查询方法的时候会传递一个 cancellationtoken ,客户端中断了请求就会导致这个 token 的 cancel 事件被触发,ef 就会报一个 taskcanceledexception 前段时间,sentry 经常会给我发一些异常邮件,全都是 taskcanceledexception,我们可以在这个事件里判断如果异常时 taskcanceledexception 就返回一个 null, 这样这个异常就不会被提交到 sentry 服务器端了

options.beforesend = (sentryevent) =>
{
    // ignore taskcanceledexception/operationcanceledexception
    if (sentryevent.exception is taskcanceledexception ||
        sentryevent.exception is operationcanceledexception)
    {
        return null;
    }

    return sentryevent;
};

more

除了基本的异常信息的展示和推送,sentry 还会做异常信息的聚合,相同的异常信息只会展示为一个,还可以做 issue 的分发指派,还可以和 github、gitlab 等第三方服务集成,在 github 中创建 issue 等,更多用法等待着你去发现

reference