当 .NET 5 赶上OpenTelemetry,会碰撞出怎样的火花?

OpenTelemetry 介绍

我在以前的几篇文章都介绍了 OpenTelemetry, 你能够在这里找到html

OpenTelemetry - 云原生下可观测性的新标准git

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

OpenTelemetry是谷歌和微软共同推动的云原生监控的新规范, 兼容OpenTracing和OpenCensusweb

OpenTelemetry的终极目标是:实现Metrics、Tracing、Logging的融合及大一统,做为APM的数据采集终极解决方案。docker

由于如今正式版本尚未发布,咱们如今只能使用rc版本,因此在Nuget开启 包括预发行版,你能够在这里看到里程碑,https://github.com/open-telemetry/opentelemetry-dotnet/milestonesapi

在webapi中接入OpenTelemetry服务

建立一个webapi项目,.NET 版本选5.0, 建立完成后,须要安装下边几个包,选最新版本就好微信

OpenTelemetry.Extensions.Hosting 提供服务扩展
OpenTelemetry.Instrumentation.AspNetCore 采集AspNetCore诊断数据
OpenTelemetry.Instrumentation.Http 采集Http诊断数据dom

安装完成后,修改Startup.cs的 ConfigureServices() 方法async

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和监控相关的技术。

相关文章
相关标签/搜索