Hangfire使用ApplicationInsigts监控

起因

我司目前使用清真的ApplicationInsights来做程序级监控。(ApplicationInsights相关文档: https://azure.microsoft.com/zh-cn/services/application-insights/ )

其实一切都蛮好的,但是我们基于Hangfire的Job系统却无法被Ai所监控到,因为Ai它监控的原理是基于HttpModule对请求进行监控,而Hangfire则是通过轮询Storage(如Sql或者队列)来实现对Job的处理。

也就是说Hangfire理论上是没有任何对Hangfire站点本身的请求,它类似于自己一个while(true)死循环不断地轮询Storage拿到Job任务就执行。

关于Hangfire的系列可以参考官方的说明 http://docs.hangfire.io/en/latest/

虽说Hangfire自己有个Dashboard可以对Hangfire执行的任务进行监控,如下

但是一众的其他站点我全部在Azure的Portal里一目了然,就你一个Hangfire的要我跑到你自己家的Dashboard来看终归不爽,而且也容易忘,导致Hangfire站点常年处于被遗忘的角落。

最近发生了一个Hangfire站点因为某些外部原因没起来(宕掉)的事件之后更加速了要将Hangfire的监控统一到Ai里。

 

搜索

首先去github上找下有没相关解决方案,老实说觉得基于ApplicationInsights的第三方扩展还是蛮多的,在github搜ApplicationInsights相关的还是能搜索出好几页(https://github.com/topics/application-insights),但并没有找到我需要的。

然后google一下找到有人在hangfire论坛里问跟我类似的问题,然而也没有解决方案(https://discuss.hangfire.io/t/integrating-application-insights-appinsights-into-hangfire/3009)。

既然找不到,那干脆自己撸起袖子干。

 

开撸

首先我们回顾下ApplicationInsights默认自己监控的原理:

前文说了它有个HttpModule会在请求进来的创建一个RequestTelemetry,

并且会在线程上下文内创建个OperationId,然后在该Request的作用于内所有其他数据(如异常/Http请求/Sql请求)都会跟这个Id关联,

这个Id甚至会在你发送Http请求的时候附加在你的Http Header里,然后接收到该Http请求的站点假如也用了Ai的话会根据这个Header里的Id再进行二次关联(调用链路关联)。

 

先解决ApplicationInsights需要的相关基础知识

我们要自己在Hangfire里弄AI监控的话,其实重点就是怎么能让Request里的Id能传递到Hangfire里,然后在Hangfire一个操作的作用域里保持该Id一致(串联所有操作)。

那问题重点就清楚了,就是如何解决这个Id的问题。

 

那Ai自己是如何产生或者获取这个Id的呢,在Ai的2.4版本后引入了对System.Diagnostics.DiagnosticSource这个包的依赖。

所有的Id关联它都基于由此包提供的Activity这个类来事现,详情可以参考 http://apmtips.com/blog/2018/01/23/diagnosticssource-design-principles/ 

如果需要在自己系统里设置一个Id关联的系统的话也强烈推荐使用Activity这个类来进行处理。

别人实现的比自己弄的科学多了,之前我也自己用AsyncLocal来做过,但是后续也都替换成了Activity,

通过Activity.Current可以获取到当前的Activity实例,通过new Activity然后调用其Start方法也能快速启动一个Activity,

到此Ai相关所需要的知识就都准备妥当了。

 

然后解决Hangfire需要的相关基础知识

从Hangfire的角度来说,它只要提供2个功能支持就可以了。

在任务入队的时候,在数据里面要塞入在当前Request操作的Id,因为我要将Hangfire的操作能够跟Request里相关联起来。

在任务执行的时候,拿到任务数据的时候,要能取出这个Id,然后将这个Id通过Activity进行Start,然后再任务执行完之后要Stop掉这个Activity并释放掉。

(画的图”有点”丑,但大概就这个意思)

 

为了解决这个问题查找了下Hangfire全局过滤器相关的资料找到它有IServerFilter和IClientFilter这2个东西:

IServerFilter:服务端处理的过滤器,就是Hangfire Server在执行一个Job的时候要进行处理的过滤器,可在此位置给Hangfire的Job设置Ai的Id到上下文。

IClientFilter:客户端处理的过滤器,就是Hangfire Client在一个Job入队的时候要进行处理的过滤器,可在此位置将Request里的Id赋值给Job Data。

 

那在Client的时候如何解决每次都能自动塞个Id进去呢?

我的解决思路是定义个JobDtoBase,所有Hangfire任务的数据都要继承自这个类,里面就一个Id,然后通过IClientFilter在每次入队的时候都将当前Activity.Current.Id扔进去

(需要考虑Acitivity.Current为null的情况)

 

然后如何在Server端自动将这个Id来启动一个Activity并完成监控呢?

我是想着通过IServerFilter里通过PerformingContext里获取Job的参数然后用is来判断如果是JobDtoBase就取它的Id出来然后启动Activity并创建RequestTelemetry。

重点是在Server这边执行结束之后需要将RequestTelemetry和Activity释放掉,所以通过ThreadStatic的静态变量来对其保持引用。

 

效果

效果如何这个问题暂时我只能呵呵哒,因为也是刚折腾出来还没投入线上运行。

不过从测试环境来看,确实能抓到我hangfire的请求并在Ai里作为Request进行展示:

而且还能抓到依赖项跟”Request”的关联:

所以至少测试的情况来说应该是达到目的了,等之后投入线上后在看下最终具体效果。

原文地址 https://www.cnblogs.com/leolaw/p/8734822.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

NET主流ORM框架分析

接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异。这里和大家分享下我对ORM框架的理解及一些使用经验。ORM框架工作原理所有的ORM框架的工作原理都离不开下面这张图,只是每个框架的实现程度不同…

20、java中的类加载机制

1、类加载机制是什么? 类加载机制指的就是jvm将类的信息动态添加到内存并使用的一种机制。 2、那么类加载的具体流程是什么呢? 一般说类加载只有三步:加载、连接和初始化,其中连接包括验证、准备和解析,用于将运行时加…

【北京】BXUG第12期活动基于 .NET Core构建微服务和Xamarin

分享主题:基于 .NET Core构建微服务实战分享分享者:薛锋 北京切尔思科技架构师 兼任东北大学信息安全工程师和技术主播,行业内专注于研究 .NET Core和Web应用,具有比较扎实的技术基础和数年的从业经历。在GitHub上主持数个开…

谈谈ASP.NET Core中的ResponseCaching

前言前面的博客谈的大多数都是针对数据的缓存,今天我们来换换口味。来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存。在阅读本文内容之前,默认各位有HTTP缓存相关的基础,主要是Cache-…

使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

上一篇写的是使用静态基类方法的实现步骤: 使用dynamic (ExpandoObject)的好处就是可以动态组建返回类型, 之前使用的是ViewModel, 如果想返回结果的话, 肯定需要把ViewModel所有的属性都返回, 如果属性比较多, 就有可能造成性能和灵活性等问题. 而使用ExpandoObject(dynamic)就…

使用 BenchmarkDotnet 测试代码性能

先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派、勾心斗角)。这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧。顺便这段时间也算是比较闲,也能学习…

2017西安交大ACM小学期数论 [阅兵式]

阅兵式 发布时间: 2017年6月25日 12:53 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 阅兵式上,将士们排成一个整齐的方阵,每个将士面朝前方。问正中心的将士能向前看到几个将士?注意,一条直线上的将…

28、jdbc操作数据库(5)

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils,使用dbutils可以简化对数据库操作程序的开发。 API介绍 接下来通过实例的方式说一下dbutils的具体使用 添加jar包:commons-dbutils-1.7.jar 增、删、改 进行增、删、改操作,在…

2017西安交大ACM小学期数论 [等差数列]

等差数列 发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数n,试问存在多少个和为n的等差数列? 当然,等差数列中每一项要为非负整数,且不考虑降序的等差数列。…

上古时期(大雾)的数据结构pdf

分块点分治Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块,然后要处理的时候整块一起的加上局部的直接暴力。 如果将块的大小分配好一般每次都是O(n)O(\sqrt n)O(n​)的。 而且因为十分暴力,所以有很多优秀的性质。 实现方法 …

33、JAVA_WEB开发基础之会话机制

会话是什么 一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程就是会话,这些过程中产生的一系列信息就是会话信息,会话机制就是用于维护这些信息一致性的一种技术。通俗的说就是,一个A账号访问服务器,进行多次交互…

35、JAVA_WEB开发基础之过滤器

是什么 过滤器javaweb的一个重要组件,一种规范,可以对发送到serlvet的请求进行拦截和响应进行过滤。实际开发中可以使用过滤器来对访问服务器的请求进行过滤,以提高安全性 过滤器的原理 可以配置过滤器对指定的请求进行过滤,就…

2、安装和连接mysql

安装mysql 1、官网下载mysql 下载网址:https://www.mysql.com/ 2、解压并配置mysql 解压下载的(前提下载的zip版本的mysql)mysql安装包,放到指定磁盘 配置环境变量:将mysql下的bin目录的全路径名配置到环境变量的p…

6、mysql中字段

对数据表的操作是比较重要的,在实际开发中,日常做的主要工作就是对数据表的操作 对数据表的操作分为两大部分:操作数据表的结构、操作数据表中的数据 组成数据表的基本单元就是字段,所以,接下来先介绍一下mysql中的字…

在Linux环境下使用Apache部署ASP.NET Core

在前几篇文章中我们一起探讨了如何在Linux环境中安装ASP.NET Core运行时环境及将ASP.NET Core项目部署在Jexus中,这篇文章中我们将探讨如何将ASP.NET Core部署于Apache(阿帕奇)中。 很幸运能够和大家一起学习和探讨ASP.NET Core本文章运行…

傲娇码农的自我修养

一个热爱自己职业的人一定会对自己的工作充满自豪感,同样,也应该对自己的工作充满热情和自信。对自己的专业能力骄傲而不自满。身为一个码农,如果你热爱自己的工作,我想,你很有可能也是一位傲娇码农。在我的眼里&#…

中国到底有多少个.NET 程序员?都在哪个城市写代码?

中国到底多少个.NET 程序员,对于这个问题,似乎没有一个准确的答案,而且最近很多使用.NET 开发技术的老板在抱怨找不到.NET 开发人员,所以我想基于我的公众号粉丝数据给大家分享下中国的.NET程序员到底有多少,他们也都是…

微软西雅图总部DevOps交流总结

本文转自Study4台湾社区。Study4台湾社区,成立于2011/9/25,希望藉由社群推广的力量,让台下的朋友听到来自不同县市的大师讲课,也让台上年轻一辈的技术传教士能不断的琢磨并且追上大师这是一个社群,社区希望透过分享&am…

C# 快速高效率复制对象另一种方式 表达式树

一、需求在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍。比如:public class Student{public int Id { get; set; }public string Name { get; set; } public int Age { get; set; } }public class StudentSecond{public int Id { …

用C# (.NET Core) 实现抽象工厂设计模式

本文的概念性内容来自深入浅出设计模式一书.上一篇文章讲了简单工厂和工厂方法设计模式 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂.披萨店的需求变更现在披萨店在各地授权了很多连锁分店, 但是有的分店偷工减料, 使用劣质原料代替标准原料.披萨店老板现…