当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?
OpenTelemetry 介绍
我在之前的几篇文章都介绍了 OpenTelemetry, 你可以在这里找到
OpenTelemetry是谷歌和微软共同推进的云原生监控的新规范, 兼容OpenTracing和OpenCensus
OpenTelemetry的终极目标是:实现Metrics、Tracing、Logging的融合及大一统,作为APM的数据采集终极解决方案。
因为现在正式版本还没有发布,我们现在只能使用rc版本,所以在Nuget开启 包括预发行版,你可以在这里看到里程碑,https://github.com/open-telemetry/opentelemetry-dotnet/milestones
在webapi中接入OpenTelemetry服务
创建一个webapi项目,.NET 版本选5.0, 创建完成后,需要安装下边几个包,选最新版本就好
OpenTelemetry.Extensions.Hosting
提供服务扩展
OpenTelemetry.Instrumentation.AspNetCore
采集AspNetCore诊断数据
OpenTelemetry.Instrumentation.Http
采集Http诊断数据
安装完成后,修改Startup.cs的 ConfigureServices() 方法
public void ConfigureServices(IServiceCollection services)
{
services.AddOpenTelemetryTracing((builder) => builder
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
);
....
}
接下来,修改 WeatherForecastController, 来模拟简单的接口调用
[HttpGet]
public async Task<IActionResult> Get()
{
HttpClient client = new HttpClient();
await Task.Delay(new Random().Next(1000, 3000));
_ = await client.GetStringAsync("http://www.baidu.com");
await Task.Delay(new Random().Next(1000, 3000));
_ = await client.GetStringAsync("http://www.baidu.com");
return Ok();
}
上面的工作完成以后,我们还需要一个导出 Exporter 的组件,把数据导出到外部平台,比如Jaeger, Zipkin, Prometheus 等,然后这些平台会处理数据,然后展示出来。
ConsoleExporter
ConsoleExporter 是最简单的导出数据的实现,它会把诊断数据输出到控制台
安装包 OpenTelemetry.Exporter.Console
,然后修改 ConfigureServices 如下:
services.AddOpenTelemetryTracing((builder) => builder
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddConsoleExporter()
);
然后启动我们的项目,访问 http://localhost:5000/WeatherForecast 接口,控制台会输出下面的信息:
这些是诊断数据的基础格式,如果你了解OpenTracing,你会发现,为什么这里是 Activity,而不是 Span,这不符合规范。 确实是这样,因为.NET 中已经有了 Activity 类型,所以.NET 团队决定重用它,并且在 .NET 5增强为 ActivitySource, 所以在.NET 中,你可以把 Span 和 Activity 概念互换。
JaegerExporter
Jaeger 是Uber推出的一款开源分布式追踪系统。
安装包 OpenTelemetry.Exporter.Jaeger
,然后修改 ConfigureServices 如下:
services.AddOpenTelemetryTracing((builder) => builder
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("webapi-demo"))
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddJaegerExporter(options => {
options.AgentHost = "localhost";
options.AgentPort = 6831;
})
);
在Docker中,执行下边的命令,安装Jaeger
docker run -d --name jaeger \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
jaegertracing/all-in-one:1.21
稍等片刻,安装完成以后,访问 http://localhost:16686 可以看到Jaeger的页面
然后启动我们的项目,访问几次 http://localhost:5000/WeatherForecast 接口,然后再访问Jaeger的页面,选择我们的服务查询,可以看到下边的请求信息:
ZipkinExporter
Zipkin 是Twitter推出的一款开源分布式追踪系统。
安装包 OpenTelemetry.Exporter.Zipkin
,然后修改 ConfigureServices 如下:
services.AddOpenTelemetryTracing((builder) => builder
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddZipkinExporter(options => {
options.ServiceName = "webapi-demo";
options.Endpoint = new Uri("http://localhost:9411/api/v2/spans");
})
);
在Docker中,执行下边的命令,安装Zipkin
docker run -d -p 9411:9411 openzipkin/zipkin
安装完成后,访问 http://localhost:9411 可以看到Zipkin的首页:
然后启动我们的项目,访问几次 http://localhost:5000/WeatherForecast 接口,然后再回到Zipkin的页面, 可以看到下面的请求信息:
trace的页面:
总结
本文尝试在.NET 5 中引入了 OpenTelemetry,可以看到使用起来非常的方便,对接第三方的分布式追踪平台,我们只需要改动极少的代码,这就是OpenTelemetry大一统的标准。
最后
欢迎扫码关注我们的公众号 【全球技术精选】,可以加入到.NET APM Group 微信群, 一起来交流APM和监控相关的技术。
当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?的更多相关文章
- 当 RocketMQ 遇上 Serverless,会碰撞出怎样的火花?
作者 | 元毅 阿里巴巴高级开发工程师 阿里巴巴云原生公众号后台回复 Knative,免费下载<Knative 云原生应用开发指南>电子书! 想必大家都比较了解 RocketMQ 消息服 ...
- MVC遇上bootstrap后的ajax表单模型验证
MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...
- 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...
- 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)
邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...
- 初识genymotion安装遇上的VirtualBox问题
想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...
- SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案
SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...
- 当创业遇上O2O,新一批死亡名单,看完震惊了!
当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)
当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...
随机推荐
- Android——几种数据存储应用浅谈
(1)android中的数据存储主要有五种方式: 第一种.sharedPreferences存储数据, 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配 ...
- 常用的Git命令清单
目录 名词解释 开卷必读 一. 新建代码库 二.配置 三. 忽略某个文件的改动 四. 增加/删除文件 五. 代码提交 六. 分支 七. 标签 八. 查看信息 九. 远程同步 十. 撤销 十一. Git ...
- Redis学习之路(一)Redis简介
一.Redis简介 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求.(区别于MYSQL的二维表格的形式存储).和Memcache类似,但是很大程度上拟补 ...
- Ubuntu 18.04 使用docker 部署gitlab并且使用自定义端口号
搭建原因 两个月前我搭建了公司的docker(无法自定义端口,),当初只想着把托管在GitHub的项目代码放在公司的服务器上面,后来忙着修改人脸服务器代码,忘记了,这个月由于领导提的需求比较多,还是托 ...
- linux + svn提交日志不能显示 日期一直都是1970-01-01
网上很多都是说将svn安装目录下的svnserve.conf文件中的anon-access 设置为read,但是 经查阅并测试, 设置为: anon-access = none 是正确的,设置成 r ...
- MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败.在MySQL中,事务至此是在引擎层实现的,但并不是所有的MySQL引擎都支持事务,这也是MyISAM被InnoDB取代的原因之一. ...
- 【Linux】make编译的小技巧
------------------------------------------------------------------------------------------------- | ...
- java创建线程安全的类
如果一个对象想要被多个线程安全的并发访问,那么这个对象必须是或线程安全的或事实不可变的或由锁来保护的. 1.java监视器模式 大多数对象都是组合对象.当从头开始构建一个类,或者将多个非线程安全的类组 ...
- XSS - Labs 靶场笔记(上)
上周在网上看到的一个XSS平台,刷一波<doge Less - 1: 1.进入主界面,由图二可知是GET请求,提交name=test,回显在页面 2.查看源代码可知 没有做任何过滤,显然存在反射 ...
- 汇编学习笔记——DOS及DEBUG介绍
转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验 ...