如何扩展分布式日志组件(Exceptionless)的日志通知?

作者:justmine
头条号:大数据与云原生
微信公众号:大数据与云原生
创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
为了方便阅读,微信公众号已按分类排版,后续的文章将在移动端首发,想学习云原生相关知识,请关注我

写在前面

从上一篇博客高并发、低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症。

最近一周升级了微服务项目使用的分布式日志组件Exceptionless到最新的版本,随着项目的不断迭代上线,我们总是想要第一时间知晓线上程序是否正常运行,特别是采用微服务架构的项目,不然心里总感觉有一块石头不知道啥时候落地。前期都是人工时不时地查看,其中有一次,异常都报了几个小时了,但是由于当时我正在专注地做另外的事情,直到线上出现服务不可用时才发现,于是决定暂时放下手头所有的事情,接入Exceptionless的事件通知机制,当抛出异常、或者发生错误的日志时,发送消息了钉钉办公群,做到实时感知运维报警提醒,所以需要接入Exceptionless的Webhook通知类型。

话外音:Exceptionless的webhook通知类型不支持实时Error、Log级别的Error,故需要扩展来满足自身需求。

什么是webhook?

WebHook,是一种HTTP交互的增强模式,是用户定义的http回调,这些回调由第三方的用户、开发人员自己定义、维护、管理,就好像允许别人挂载一条带钩的线到你的Web网站或者应用程序的上,然后通过这条线实时地给你推送信息,这条带钩的线就叫web钩子。也可以将webhook看作是一种简洁的Sub/pub模式,只不过此时事件的载体是一个Http Post请求。

一言以蔽之,web钩子就是一种http回调,由于一般都采用post的方式来推送信息,更直接、简单地说web钩子就是一种http post回调

正是由于它的简洁性,很多主流的Saas系统都暴露有自己的Webhook,其中包括Dropbox, GitHub, GitLab, Instagram, MailChimp, PayPal, Slack, Trello等等,例如,我们可以为github代码提交定义一个web钩子;为Paypal的支付状态定义一个Web钩子;这样就能够实时地收到来自应用的推送信息,而不必要不断地轮训来请求信息。

一图胜千言:

有了上面的铺垫,那么与Exceptionless的集成就如下图所示:

定义Exceptionless的web钩子

从上图可以看到,web钩子就是一个能够处理http post请求的web server后端,决定采用aspnet core来实现,首先调研了微软的项目WebHooks,它并没有对接Exceptionless,而且还是采用MVC开发,最终找到了另外一个开源项目,采用中间件拦截,我在其基础上进行了如下扩展:

  1. 添加容器化部署脚本,支持docker、kubernetes,迎合云原生。

  2. 扩展事件模型,添加环境、来源等信息,方便追溯。

  3. 升级项目为netcoreapp2.1。

  4. 优化httpclient使用方式。

  5. 本地化事件时间、容器时间、序列化时间。

并添加详细的部署、配置说明。有兴趣同学欢迎查看我的项目exceptionless-webhooks 。

最终的钉钉群消息:

今日正题

完成了上面的准备工作,现在开始进入正题,扩展Exceptionless的通知类型。

浅析Exception工作机制

Exceptionless逻辑上采用完全异步化的设计,当收到日志事件时,首先写到缓存队列(redis),然后再启动各种job来消费消息,最终写到elasticsearch数据库,所以说Exceptionless是一个准实时的分布式日志组件,事件的处理管道如图所示:

首先对事件进行守卫检查、分配到Stack(分类聚合事件)、打标记(比如:关键错误)等,然后保存事件,更新统计信息,最后发送各种通知,大致流程就是这样子。那么自然而然与通知(包括Email、Slack即时通讯、Web钩子等)相关的处理逻辑就在都在步骤070中。
扩展新的事件通知类型

  • Error
    未知的异常

  • LogError
    错误的日志信息

1. 添加新的事件类型元数据。

2. 添加新的事件类型扩展方法。

3. 修改步骤070中的逻辑。

到目前为止,Exceptionless的后端修改工作圆满完成,接下来修改它的Argular前端,具体的修改代码就不贴了,最终的界面如下:

到这里所有的工作都已经完成了,通过选择配置项控制Webhook的事件通知类型,达到了预期目的。

总结

本篇我们先以白话文的方式讲解了什么是webhook,为后面与Exceptionless的集成做好铺垫,然后编写了web钩子程序,最后通过为Exceptionless扩展新的事件通知类型来满足我们的需求,希望把从分析到最后完工的整个过程分享给大家。

最新的代码
后端:https://github.com/justmine66/Exceptionless。
前端:https://github.com/justmine66/Exceptionless.UI。

写在最后

如果有什么疑问和见解,欢迎评论区交流。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
如果你也对Exceptionless感兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程

一、搭建环境的前提条件环境:Linux系统Hadoop-2.6.0MySQL 5.6apache-hive-2.3.7这里的环境不一定需要和我一样,基本版本差不多都ok的,所需安装包和压缩包自行下载即可。但是注意hive和hadoop都是2.x系列版本的。这里提供一个我下载的hive版本…

cg word List 3

cg word List 3 如果存在什么问题,欢迎批评指正!谢谢!

.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(上)

07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力这一节讲解使用第三方框架来扩展依赖注入容器什么情况下需要我们引入第三方容器组件?大部分情况下,默认的容器组件足够使用当需要一些非常特殊的场景如下&…

sql 对groupby 后的数据limit_SQL(三)——汇总分析

1. 汇总分析函数的3个功能:①功能;②输入(参数);③输出(返回值)查询课程编号为“0002”的总成绩:查询选了课程的学生人数:2.分组sql分组:group bygroup by 实现数据分组&…

cg word List4

cg word List4 如果存在什么问题,欢迎批评指正!谢谢!

通过 Serverless 加速 Blazor WebAssembly

Blazor ❤ Serverless我正在开发 Ant Design 的 Blazor 版本,预览页面部署在 Github Pages 上,但是加载速度很不理想,往往需要 1 分钟多钟才完成。项目地址:https://github.com/ElderJames/ant-design-blazor[1] 求 Star。当寻求解…

eclipse中tomcat启动不了_Eclipse怎样与Tomcat集成

1 打开eclipse2 打开Window -> Show View -> Servers3 点击No servers are available.Click this link to create a new server...4 选择 Apache -> Tomcat v9.0 Server,tomcat的版本可以根据本机安装的tomcat版本选择,然后点击Next5 Name不需要…

树的存储结构-双亲表示法

特点:找双亲容易&#xff0c;找孩子难 代码如下&#xff1a; #include <iostream> using namespace std; typedef char ElemType; #define MAX_Tree_size 100 typedef struct PTNode {ElemType data;int parent;//双亲位置域 }PTNode;typedef struct {PTNode nodes[MA…

cg word List5

## cg word List5 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

x509trustmanager怎么验证证书_GeoTrust通配符证书和多域名SSL证书对比评测

GeoTrust SSL证书类型很丰富&#xff0c;能够满足多样的需求&#xff0c;而GeoTrust通配符证书和多域名SSL证书都是支持多个域名的SSL证书&#xff0c;这时候就有网友问了&#xff0c;GeoTrust通配符证书和多域名SSL证书选择哪个好呢&#xff1f;接下来安信证书就为大家做个详细…

树的存储结构-孩子链表

特点:找孩子容易&#xff0c;找双亲难 代码如下&#xff1a; #include <iostream> using namespace std; typedef char ElemType; #define MAX_tree_size //孩子结构 typedef struct CTNode {int child;struct CTNode *next; }*ChildPtr; //双亲结点结构 typedef stru…

【视频教程】使用 ASP.NET Core 3.x 构建 RESTful Web API 已完结

使用 ASP.NET Core 3.x 构建 RESTful Web API 的视频教程已经完结&#xff0c;共50讲&#xff0c;约10.5小时。B站可看&#xff0c;点击原文链接。度娘盘可下载完整视频&#xff1a;https://pan.baidu.com/s/1VPE3bkAVQI_RO3tDrxod4w提取码: hsmj源码以及PPT&#xff1a;https:…

ASP.NET Core 借助 Helm 部署应用至 K8S

前言玩K8S也有一段时间了&#xff0c;借助云服务提供商的K8S控制台&#xff0c;已经可以很方便的快速部署应用至K8S。通过简单的点击&#xff0c;可以一次性帮忙创建K8S 对象&#xff1a;Deployment、Service、Ingress、ConfigMap等。但是当服务的规模上来后&#xff0c;这种方…

.Net Core中IOC容器的使用

本文由江北原创投稿&#xff0c;独家授权技术在于分享&#xff08;公众号ID&#xff1a;sharecore&#xff09;&#xff0c;未经许可&#xff0c;不得转载。作者&#xff1a;江北打代码之前先说一下几个概念,那就是什么是IOC、DI、DIP虽然网上讲这些的已经有很多了,我这里还是要…

qiankun 微前端_qiankun 微前端应用实践与部署(二)

下面是两种方案的简要描述。传统部署方式通过配置 nginx 端口到目录的转发。具体可查看上一篇文章特点需要对外开放子应用对应的端口&#xff0c;将编译好的应用文件放到对应的配置目录。docker 部署方式首先构建主应用与子应用的 docker 镜像&#xff0c;通过 docker run 或者…

在树莓派上使用 PowerShell 调用 Azure 上的 .NET Core API 获取疫情数据

点击上方蓝字关注“汪宇杰博客”导语最近因为疫情被关在家里&#xff0c;做了个无聊成就&#xff1a;我们将在树莓派上用 PowerShell 调用 Azure 上的一个 .NET Core 写的 API 来获取疫情数据。疫情数据API疫情数据来源于腾讯新闻的一个实时更新的页面&#xff0c;原始 API 地址…

gitlab 删除分支_初识gitlab工作流

git对我来说挺难理解的&#xff0c;平时遇到问题也是绕着走&#xff0c;倒也没啥大问题&#xff0c;但基于git软件的工作流却很重要&#xff0c;尤其对于一个组织来说。git工作流、github工作流、gitlab工作流都属于特性分支(feature branches)的类别&#xff0c;今天主要理解g…