zoukankan      html  css  js  c++  java
  • 当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?

    OpenTelemetry 介绍

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

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

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

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

  • 相关阅读:
    读书笔记——吴军《态度》
    JZYZOJ1237 教授的测试 dfs
    NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论
    [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
    POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
    POJ2157 Check the difficulty of problems 概率DP
    HDU3853 LOOPS 期望DP 简单
    Codeforces 148D. Bag of mice 概率dp
    POJ3071 Football 概率DP 简单
    HDU4405 Aeroplane chess 飞行棋 期望dp 简单
  • 原文地址:https://www.cnblogs.com/myshowtime/p/14363735.html
Copyright © 2011-2022 走看看