深入研究.NET 5的开放式遥测

OpenTelemetry 介绍

OpenTelemetry是一种开放的源代码规范,工具和SDK,用于检测,生成,收集和导出遥测数据(指标,日志和跟踪),开放遥测技术得到了Cloud Native Computing Foundation(CNCF)的支持,该基金会支持一系列流行的优秀的开源项目,你可以去看一下CNCF景观图,https://landscape.cncf.io/ ,就明白了我的意思,这个SDK支持所有主要的编程语言,包括C#和ASP.NET Core。

在这篇文章中,我将讨论OpenTelemetry的全部含义,为什么要使用它以及如何在.NET中使用,对于典型的应用程序,通常需要记录三组数据:指标,日志和跟踪。

Logging 日志

可以监听程序的进程发出的消息日志,在.NET应用程序中,如果您使用NuGet包ILogger中的日志记录功能,就可以轻松的让OpenTelemetry支持 Microsoft.Extensions.Logging, 如果要构建ASP.NET Core应用程序,通常已经使用了此功能。

Metrics 指标

提供运行进程的指标信息,包括计数器,仪表盘和直方图,对OpenTelemetry中指标的支持仍在开发中, 但是已经确定下来了,指标包括以下:

•CPU 使用百分比•进程内存使用量•Http的请求数量

Tracing 追踪

也叫做分布式跟踪,它记录单个操作的开始和结束时间以及与该操作相关的参数,比如在ASP.NET Core中记录HTTP请求的跟踪,您可能会记录请求和响应的开始和结束时间,参数将是 Http的请求方式,请求参数,请求地址等,请求调用会形成链路,您可以深入了解时间耗费在哪个服务,或者服务中有异常报错发生。

Jaeger

收集指标,日志,追踪信息只是一部分,如何进行数据处理,展示是APM系统的功能,因为收集的数据遵循OpenTelemetry标准,所以可以和APM系统完美结合。

Jaeger和Zipkin是可以收集和显示并且与Open Telemetry兼容APM, Zipkin的话比较久了,并且没有很好的UI,因此我个人推荐Jaeger,看起来像这样:

上图显示了应用程序的跟踪,您可以看到它如何使用HTTP请求对MySQL,Redis和外部API进行调用, 每行的长度显示了执行所需的时间,您可以轻松地从头到尾查看跟踪中执行的所有主要操作,您还可以深入研究每一行,并查看与该部分跟踪有关的其他信息。

Spans 跨度

上面Jaeger图中的每一行都称为 Span,在.NET中的每一行均由System.Activities.Activity类型表示,它也具有唯一的标识符,开始和结束时间以及父范围的唯一标识符,所以这些可以形成调用链,并且Span还可以包含其他参数。

不幸的是,.NET团队的命名大大偏离了官方的OpenTelemetry规范,我有点疑惑,不过我现在已经明白了大概。

我的理解是.NET已经包含一个Activity的类型,因此.NET团队决定重用它,而不是重新创建一个 Span的新类型,这意味着很多命名与open-telemetry规范不匹配,在.NET中,你现在可以把 Span 和 Activity身份互换。

注意:在.NET 5中才有ActivitySource,在之前可以用 Activity。

使用Span记录行为非常简单,首先,我们必须创建一个ActivitySource可以记录Span或活动的对象:

private static ActivitySource activitySource = new ActivitySource("companyname.product.library","semver1.0.0");

然后,我们可以调用StartActivity开始记录,最后调用Dispose停止记录Span:

using (var activity = activitySource.StartActivity("ActivityName")
{// Pretend to do some work.await LongRunningAsync().ConfigureAwait(false);
} // Activity gets stopped automatically at end of this block during dispose.

Events 事件

当Span开启记录后,我们也可以在这期间记录事件,这些事件包含了时间戳信息:

using (var activity = activitySource.StartActivity("ActivityName")
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log timestamped events that can take place during an activity. Activity.Current?.AddEvent(new ActivityEvent("Something happened."));
}

在LongRunningOperationAsync方法中,有一个问题是,如何把activity传入这个方法,如果我们定义了一个参数,这体验也太差了,但是,将两个操作分离的一个好的方法是使用Activity.Current。

一个常见的错误,我可以预见的是,Activity.Current可能是null,所以这里我加了null判断。

Attributes 属性

属性是数据的键值对,您可以将其记录为单个Span的一部分,比如Http的请求方式,请求状态码等。

注意,在Open Telemetry规范中叫 Attributes,在 我们.NET 中叫Tag

using (var activity = activitySource.StartActivity("ActivityName")
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log an attribute containing arbitrary data.Activity.Current?.SetTag("http.method", "GET");
}

IsRecording 记录

IsRecording是Span上的一个标志,如果返回false,表明该Span已结束,另外,如果你的数据量比较大的话,你需要抽样采集,比如10%,那么你也可以手动把这些span设置为false,它不会采集。

注意:在open-telemetryg规范中叫IsRecording,在.NET Core 3.1中是 Recorded,在.NET 5 中是 IsAllDataRequested。

using (var activity = activitySource.StartActivity("ActivityName")
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// It's possible to optionally request more data from a particular span.var activity = Activity.Current;if (activity != null && activity.IsAllDataRequested){activity.SetTag("http.url", "http://www.mywebsite.com");}
}

Trace的语义约定

注意属性名称http.method,http.url,我在以上示例中使用了该属性,因为在open-telemetry规范中已经标准化了某些常用的属性名称,标准化常用属性名称可以在Jaeger等APM中很好的展示它们,属性名称已分类为几个不同的类别,你可以花点时间看一下:

•General: 可用于描述不同种类的操作的常规语义属性•HTTP: 客户端和服务器的Http调用•Database: SQL 和 NoSql的调用•RPC/RMI: 远程调用,比如gRPC等•Messaging: 用于与消息传递系统(队列,发布/订阅等)•Exceptions: 用于记录与Span关联的异常的属性

Exporting 导出

有很多用于导出使用OpenTelemetry收集的数据的插件,我将在我的下一篇博客文章中讨论有关在ASP.NET Core中使用Open Telemetry的信息, 可以很方便的处理这些数据,您可以轻松地订阅然后消费OpenTelemetry数据,如下所示:

using var subscriber = DiagnosticListener.AllListeners.Subscribe(listener =>{Console.WriteLine($"Listener name {listener.Name}");listener.Subscribe(kvp => Console.WriteLine($"Received event {kvp.Key}:{kvp.Value}"));});

跨进程的追踪

为什么这些程序会形成调用链,它们是不同的进程,这个怎么实现的呢?

这就是W3C跟踪上下文标准,它定义了一系列HTTP Header,这些Header将有关当前正在记录的任何跟踪的信息从一个进程传递到另一个进程,它通过Http的Header来传递信息,规范中定义了两个HTTP Header:

traceparent-包含version,trace-id,parent-id和trace-flags

•version - 在open-telemetry规范中,它始终是00•trace-id - 跟踪的唯一标识符。•parent-id -作为当前 patent span 的唯一标识符。•trace-flags -当前跟踪的一组标志,用于确定是否正在采样当前跟踪以及跟踪级别。

tracestate -由一组名称/值对表示的特定于供应商的数据。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: asp=00f067aa0ba902b7,redis=t61rcWkgMzE

Baggage

与Attributes类似,Baggage是我们可以将数据作为键值对添加到跟踪的另一种方式,不同之处在于,Baggage使用W3C规范中baggage定义的HTTP Header跨进程边界传递,但是Attributes的值数据只在当前Span中可用

baggage: userId=alice,serverNode=DF:28,isProduction=false

使用的话,也有些相同之处:

using (var activity = activitySource.StartActivity("ActivityName")
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log an attribute containing arbitrary data.Activity.Current?.AddBaggage("http.method", "GET");
}

它的用途在于,比如说我需要传递一个订单ID,我就可以放到 Baggage 数据中,它在整个请求链路中都可以访问。

总结

.NET团队对OpenTelemetry非常重视,你可以看到Activity类型在.NET 5 中的增强,并且默认 HttpClient 调用时,它会自动传输W3C跟踪上下文HTTP Header, 基于ILogger的统一日志,也可以很好的收集和OpenTelemetry兼容的日志。

原文作者: Rehan Saeed 原文链接:https://rehansaeed.com/deep-dive-into-open-telemetry-for-net/

最后

欢迎扫码关注我们的公众号 【全球技术精选】,专注国外优秀博客的翻译和开源项目分享,也可以添加QQ群 897216102

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

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

相关文章

python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...

优化这种方法的方法不是找出更快的方式来生成排列,而是生成尽可能少的排列。 首先,如果您只想要按排序顺序的组合,您将如何做到这一点? 您不需要生成0到100的所有可能组合,然后对其进行过滤。第一个数字a可以是0到100之…

登陆xp系统,无法显示桌面

症状登录到 Windows xp 后,可能会看到空白桌面或看不到桌面。出现这种情况时,可以按下 CtrlAltDelete 键启动任务管理器,但正在运行的任务或进程列表中却没有列出 Explorer.exe。启动 Explorer.exe 的新实例也无法解决问题。 原因…

孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项

怀孕期间孕妇使用电脑有电磁辐射吗?孕妇当然可以使用电脑,经科学研究发现在电脑前工作对孕妇不会产生什么影响!孕妇既然是特别保护对象,那么怀孕妈妈在使用电脑时也会有一些注意事项。第一宝宝小编为准妈妈搜集了十二条注意事项。…

python类和函数_构建程序. Python中的类和函数

如果希望mainfunc的所有实例都使用相同的KeySeq对象,则可以使用默认参数值技巧: def mainfunc(ksKeySeq()): key ks.next() 只要您实际上没有传递ks值,对mainfunc的所有调用都将使用在定义函数时创建的KeySeq实例. 如果您不知道,这就是为什么:函数是一个…

CCDP-思科认证网络设计高级工程师

CCDP是Cisco售前设计支持工程师的最高级认证。获得CCDP认证证书应能够运用应具有的网络知识、对设备安装、配置和操作技巧对复杂的LAN、WAN和交换式局域网进行设计。 CCDP认证必备条件必须先获取CCNA和CCDA证书CCDP考试642-801 BSCI 642-811 BCMSN 642-871 ARCH CCDP 重新认证C…

.NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!

在移动互联网时代掉队的.NET,当下正凭借着.NET5的开源跨平台以及容器友好,在云原生时代正在重铸辉煌。而作为.NET开发者,新年跳槽季的高并发问题会更多了,因为高并发能牵扯出太多问题,接口响应超时、CPU负载升高、GC频…

html点击按钮计算两个输入框的和_小程序计算报价功能介绍

一、使用场景用户可在管理后台设置计算值和运算公式,访客输入对应计算值,即可实现自动计算出结果,并提供相关的咨询入口,适用于装修、建材、房贷、车险等行业的报价行为。二、功能版本限制小程序至尊版可开启和使用计算报价功能。…

中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理程序及图像...

数字图像处理实验课 matlab实验程序 以及图像结果 附带有命名图仅供参考 定有错误 木有绝对正确实验11—1close all;clear;fzeros(40,40);%f(10:30,10:30)1;subplot(1,3,1);%imshow(f);%Ffft2(f)subplot(1,3,2);%imshow(F);%Dlog(1abs(F));%subplot(1,3,3);imshow(D);1——2clc…

用python画树_Python+Turtle动态绘制一棵树实例分享

本文实例主要是对turtle的使用,实现Pythonturtle动态绘制一棵树的实例,具体代码: # drawtree.py from turtle import Turtle, mainloop def tree(plist, l, a, f): """ plist is list of pens l is length of branch a is hal…

[ASP.NET2.0] asp.net在ie7中使用FileUpload上传前预览图片 [ZT]

asp.net在ie7中使用FileUpload上传前预览图片 因为安全性问题&#xff0c;IE7禁用了image控件引用本地图片&#xff0c;为了这个问题郁闷了好几天&#xff0c;终于找到了解决方案&#xff0c;好东西要与大家分享&#xff0c;代码如下&#xff1a;此段代码放于<head> ....…

如何在 ASP.Net Core 使用 内存缓存

ASP.NET Core 是一个轻量级&#xff0c;模块化的框架&#xff0c;常用来在 Windows&#xff0c;Linux 和 MacOS 上构建高性能&#xff0c;现代化的web框架&#xff0c;不像过去的 Asp.NET&#xff0c;在 ASP.NET Core 中并没有内置 Cache 对象&#xff0c;不过你可以通过 nuget…

360浏览器5兼容模式吗_个独模式真能将企业总体税负降低至5%吗,为何大家都热衷核定征收...

个独模式真的能将企业总体税负降低至5%吗&#xff0c;为何大家都热衷选择申请核定征收企业性质不同&#xff0c;结构不同&#xff0c;体量不同&#xff0c;业务模式不同&#xff0c;自然纳税方式和税负也有差别。不同的纳税对象应该采取不同的节税方式&#xff0c;用合理合法的…

五年级计算机下册工作计划,五年级下学期工作计划

指导思想&#xff1a;五年级组2009年下学期工作计划是坚持"以人为本,以德为先"的宗旨,以课堂教学为阵地,以课改为中心工作,努力培养本年级学生良好的学习风尚,努力建设一支团结协作,努力进取,敢于创新的教师团队.年级情况&#xff0e;五年级组共有十名教师,其中四个班…

python3 for循环_从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列

《从零开始PYTHON3》第六讲 几乎但凡接触过一点编程的人都知道for循环&#xff0c;在大多数语言的学习中&#xff0c;这也是第一个要学习的循环模式。 但是在Python中&#xff0c;我们把for循环放到了while循环的后面。原因是&#xff0c;Python中的for循环已经完全不是你知道的…

Yahoo Mail,慢功出细活〔转载〕

Yahoo Mail&#xff0c;慢功出细活2007年08月31日13:59 原文链接&#xff1a;http://chinese.wsj.com/gb/20070831/ptk141709.asp?sourcechannel用两年时间测试一款软件可真算费功夫&#xff0c;但雅虎公司(Yahoo! Inc.)开发完成新版本的电子邮箱软件Yahoo Mail就花了这么长…

浅谈如何理解领域驱动设计

本文作者为长沙.NET社区开发者微笑刺客&#xff0c;转载已获得作者授权。前言什么是领域&#xff0c;我习惯描述的是制药领域、环境领域、建筑领域、金融领域等&#xff0c;而在领域内&#xff0c;各种业务规则、业务知识盛行&#xff0c;如何有效的把控规则的变化&#xff0c;…

lol战绩查询接口_LOL:莫名其妙被封号?3把躺赢局被说是代打

Hello&#xff0c;大家好&#xff0c;这里是小皮说电竞&#xff0c;每天都会为大家带来LOL有趣的资讯&#xff0c;喜欢的话记得点个关注哦~英雄联盟已经发展至S10了&#xff0c;这么久以来&#xff0c;许多小伙伴都碰到过一个问题&#xff0c;那就是封号。封号的原因有很多&…

计算机cnc键代表啥,计算器上的cnc键表示啥

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。计算器上的cnc键代表清除。计算器是现代人发明的可以进行数字运算的电子机器。现代的电子计算器能进行数学运算的手持电子机器&#xff0c;拥有集成电路芯片&#xff0c;但结构比电脑…

apk源码查看工具_如何查看Linux命令工具的源码?

点击上方「嵌入式大杂烩」&#xff0c;「星标公众号」第一时间查看精彩文章&#xff01;上一篇分享了两个使用的小工具&#xff1a;《如何同时输出调试信息到终端及文件&#xff1f;》。有位小伙伴留言问道tee工具的代码在哪&#xff1a;这篇文章我们就来简单分享一下。首先&am…

final类是否可以被代理_浅谈Java【代理设计模式】——看这篇文章就懂了

什么是代理模式为其他对象提供一种代理以控制对这个对象的访问。为什么使用代理模式中介隔离&#xff1a;在某些情况下&#xff0c;一个客户类不想或者不能直接引用一个委托对象&#xff0c;而代理类对象可以在客户类和委托对象之间起到中介的作用&#xff0c;其特征是代理类和…