使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC

本文主要是介绍使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenTelemetry介绍

OpenTelemetry是一组标准和工具的集合,旨在管理观测类数据,如 trace、metrics、logs 等。

通过标准化不同的应用程序和框架如何收集和发出可观察性遥测数据,OpenTelemetry旨在解决这些环境带来的一些挑战。

OpenTelemetry包括:

  • 可观察性遥测(分布式跟踪、指标等)的供应商中立规范

  • 实现用于检测的公共接口的API

  • 应用程序使用SDK为插件作者配置工具和接口以编写导出器

  • 使你能够将数据发送到你选择的遥测后端的导出器

随着OpenTelemetry对可观察性遥测集合的标准化,你可以选择遥测后端而无需更改检测代码。你可以自由选择可为你提供最有效数据分析的平台。

在本文中,我们选择的是Zipkin。

Zipkin介绍

Zipkin是一个分布式追踪系统。它有助于收集对服务架构中的延迟问题进行故障排除所需的计时数据。功能包括收集和查找这些数据。

下面,我们就来演示,如何使用OpenTelemetry搭配Zipkin来追踪ASP.NET Core服务之间的WebAPI和gRPC请求。

Demo

创建3个应用程序,WebApplication1使用Web API调用WebApplication2,WebApplication2使用gRPC调用GrpcService1。

WebApplication1

引用Nuget包,包括预发行版:

OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Exporter.Zipkin

新增配置,Endpoint对应Zipkin部署地址:

"Zipkin": {"ServiceName": "WebApplication1","Endpoint": "http://192.168.1.11:9411/api/v2/spans"
}

修改Startup.cs:

public void ConfigureServices(IServiceCollection services)
{...services.AddOpenTelemetryTracing((builder) => builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions =>{zipkinOptions.Endpoint = new Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));}));
}

修改WeatherForecastController.cs,访问WebApplication2:

[HttpGet]
public async Task<string> Get()
{var response = await _httpClientFactory.CreateClient().GetStringAsync("http://localhost:5200/WeatherForecast");return response;
}

WebApplication2

引用Nuget包,包括预发行版:

OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Exporter.Zipkin
Grpc.Net.Client
OpenTelemetry.Instrumentation.GrpcNetClient

新增配置,Endpoint对应Zipkin部署地址:

"Zipkin": {"ServiceName": "WebApplication2","Endpoint": "http://192.168.1.11:9411/api/v2/spans"
}

修改Startup.cs:

public void ConfigureServices(IServiceCollection services)
{...services.AddOpenTelemetryTracing((builder) => builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddGrpcClientInstrumentation().AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions =>{zipkinOptions.Endpoint = new Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));}));
}

修改WeatherForecastController.cs,访问GrpcService1:

[HttpGet]
public async Task<string>  Get()
{var channel = GrpcChannel.ForAddress("http://localhost:5300");var client = new Greeter.GreeterClient(channel);var response = await client.SayHelloAsync(new HelloRequest { Name = "World" });return response.Message;
}

GrpcService1

引用Nuget包,包括预发行版:

OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Exporter.Zipkin

新增配置,Endpoint对应Zipkin部署地址:

"Zipkin": {"ServiceName": "GrpcService1","Endpoint": "http://192.168.1.11:9411/api/v2/spans"
}

修改Startup.cs:

private IConfiguration Configuration { get; }public Startup(IConfiguration configuration)
{Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{...services.AddOpenTelemetryTracing((builder) => builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions =>{zipkinOptions.Endpoint = new Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));}));
}

运行效果

启动3个应用程序:

  • WebApplication1 http://localhost/5100

  • WebApplication2 http://localhost/5200

  • GrpcService1        http://localhost/5300

访问WebApplication1后,即可在Zipkin上查看调用链:

2d36ef2dd68fa6f500d2d65a2787efeb.png

结论

使用OpenTelemetry搭配Zipkin,可以轻松实现监控WebAPI/gRPC调用链。

这篇关于使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352230

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使