云原生ASP.NET Core程序的可监测性和可观察性

Posted 微软中国MSDN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生ASP.NET Core程序的可监测性和可观察性相关的知识,希望对你有一定的参考价值。

分布式应用程序很复杂,给开发人员调试和修复生产问题带来了一系列挑战。尽管微服务架构可帮助维持一支规模较小,可以自主工作并专注于独立业务团队,但由于其分布式性质,它带来了新的挑战。例如,在业务交易过程中出现问题的情况下,需要端到端跟踪请求,该请求可能跨越多个服务和基础架构。解决问题时可能遇到的挑战有:


  • 管理已知和未知故障

  • 故障也是分布式的

  • 传统监控系统不适用

 

这是可监测性和可观察性出现的地方。可监测性记录应用程序的总体运行状况,而可观察性则可以帮助您更深入地了解上下文数据。在.NET大会上,我和Cecil 已经深入讨论了云原生应用程序中的可监测性和可观察性。



以上视频中,我们着眼于可观察性和可监测性的关键点,例如日志(Logging),衡量指标(Metrics),链路追踪(Tracing),并深入分析了运行状况检查(Health checks)。


云原生ASP.NET Core程序的可监测性和可观察性


以下是视频中讨论的一些基本概念:

 

运行状况检查(Health Checks)


微服务实现了运行状况检查,最理想的情况是使用HTTP endpoints,以便各种实时监控系统可以查询状态。 运行状况检查端点至少应做出以下响应:


  • 系统正在运行吗?

  • 它可以执行任务吗?


在Kubernetes世界中,这些分别直接转换为livenessreadiness它们定义在Kubernetes的YAML部署配置文件中。


云原生ASP.NET Core程序的可监测性和可观察性


  • liveness路径是Kubernetes定期查询以检查故障的端点。 Kubernetes提供了liveness探针来监测失败的应用程序,并在它们不返回成功代码时重新启动它们。

  • readiness路径是Kubernetes查询以了解服务何时就绪,可以开始接受流量的终端。 当所有注册的检查都成功时,它将返回HTTP状态代码200。

 

ASP.NET Core提供用于向可监测性系统报告运行状况的中间件和库,来提供运行状况检查。 相关文档请查阅ASP.NET Core中的运行状况检查


ASP.NET Core中的运行状况检查:

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?WT.mc_id=friends-0000-NANIL&view=aspnetcore-5.0


日志


无论您使用什么工具调查生产环境中的问题,最终都会是以日志的形式反应问题的根本原因。 在分布式环境中,您需要确保日志记录包含有助于调试的深入信息。 可以从一个集中的地方查询它们。 每个日志记录都需要有一个关联ID,以便进行跟踪以了解全局。


结构化日志


使用结构化日志,您可以将序列化的对象添加到日志中,日志监视系统可以高效地查询这些对象。 例如,您可以根据customerID或trasnsactionID查询整个事务日志。 在ASP.NET Core应用程序中,可以使用提供结构化日志记录的Serilog。请查阅.NET Core和ASP.NET Core中的日志入门,以及Serilog了解结构化日志。


.NET Core和ASP.NET Core中的日志:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?WT.mc_id=friends-0000-NANIL&view=aspnetcore-5.0

Serilog:

https://serilog.net/


集中式日志和关联ID


在传统应用程序中,日志文件存储在本地计算机上。在分布式环境中,把日志记录在某一台计算机中的纯文本文件中是没有帮助的。生成日志的应用程序可能无法访问本地磁盘,或者当容器在虚拟机中移动时,本地磁盘可能是高度瞬态的。由于在Cloud-native应用程序中使用基于文件的日志会遇到一些问题,因此首选集中式日志。日志由应用程序收集并传送到一个集中的日志应用程序,该应用程序对日志进行索引和存储。这类系统每天可以接收数十GB的日志。Serilog提供了向集中式系统(如Azure Application Insights,Azure Monitor的一项功能)写入日志事件的接收器。在构建跨多个服务的日志记录时,遵循一些标准做法也很有帮助。例如,在事务开始时生成一个关联ID,然后将其记录到与该事务相关的每条消息中,这样可以更容易地从集中式日志系统中搜索所有相关消息。


接收器:

https://github.com/serilog/serilog/wiki/Provided-Sinks

关联ID:

https://www.rapid7.com/blog/post/2016/12/23/the-value-of-correlation-ids/


分布式跟踪


云原生ASP.NET Core程序的可监测性和可观察性


分布式跟踪等效于现代云和微服务体系结构的调用堆栈,并添加了性能分析器。分布式跟踪或分布式请求跟踪有助于端到端查看请求,并使您能够从整体上识别问题。跟踪可以为您提供有关问题的详细答案,例如事件发生在什么时候?它花了多少时间?为什么要花这么长时间?哪些微服务处理了它?等等,像openzipkin / zipkin之类的开源分布式跟踪系统,在该领域非常流行。

 

为您的应用程序启用分布式跟踪就跟将相应的分布式跟踪提供商的SDK添加到每个微服务中一样简单。例如,在您的应用中安装并配置了Application Insights SDK后,SDK依赖关系自动收集器会自动收集流行框架,库和技术的跟踪信息。

 

在几个不同的系统和工具之间,需要有一套标准以便于观察。OpenTelemetry标准化了不同的应用程序和框架如何收集和发出可观测性遥测。OpenTelemetry提供了一个与供应商无关的规范、一组api、sdk和工具以及用于可观测性遥测(分布式跟踪、度量等)的集成。查看博客文章OpenTelemetry .net reachs v1.0以获取详细信息。


openzipkin/zipkin:

https://github.com/openzipkin/zipkin/?WT.mc_id=friends-0000-NANIL

Application Insights SDK:

https://docs.microsoft.com/en-us/azure/azure-monitor/app/distributed-tracing

OpenTelemetry:

https://opentelemetry.io/

OpenTelemetry.net reachs v1.0:

https://devblogs.microsoft.com/dotnet/opentelemetry-net-reaches-v1-0/?WT.mc_id=friends-0000-NANIL


动手模块


我们已经构建了一系列模块来帮助您学习构建.NET微服务和云原生技术。 查看以下模块,这些模块将帮助您了解可监测性和可观察性相关技术。


  • 行运行状况检查:创建和部署.Net微服务和云原生技术

  • 可监测性和可观察性:测试cloud-native ASP.NET Core微服务

  • 有关其他主题,请查看https://aka.ms/aspnet-microservices

创建和部署.Net微服务和云原生技术:

https://docs.microsoft.com/learn/modules/microservices-aspnet-core/?WT.mc_id=friends-0000-NANIL&ns-enrollment-type=Collection&ns-enrollment-id=8mq4i2mzgjwn10

测试cloud-native ASP.NET Core微服务:

https://docs.microsoft.com/en-us/learn/modules/microservices-logging-aspnet-core/?WT.mc_id=friends-0000-NANIL&ns-enrollment-type=Collection&ns-enrollment-id=8mq4i2mzgjwn10


云原生ASP.NET Core程序的可监测性和可观察性





欢迎订阅微软开发者月刊
获取微软最新技术资讯



以上是关于云原生ASP.NET Core程序的可监测性和可观察性的主要内容,如果未能解决你的问题,请参考以下文章

云原生架构中Kubernetes可观察性的挑战

asp.net core 读写任意文件

在mac中找不到匹配命令“dotnet-aspnet-codegenerator”asp.net core 2.1项目的可执行文件

创建 Github CI/CD Pipeline 并部署到 Azure 云 Asp.net core 和 React Project

Azure 云服务上的 Asp.Net Core MVC?

ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题