建设网站分析报告商城网站建站
web/
2025/9/26 0:41:26/
文章来源:
建设网站分析报告,商城网站建站,网络整合营销理论是指什么,10个免费自学网OpenTelemetry 介绍OpenTelemetry是一种开放的源代码规范#xff0c;工具和SDK#xff0c;用于检测#xff0c;生成#xff0c;收集和导出遥测数据#xff08;指标#xff0c;日志和跟踪#xff09;,开放遥测技术得到了Cloud Native Computing Foundation#xff08;CN… OpenTelemetry 介绍OpenTelemetry是一种开放的源代码规范工具和SDK用于检测生成收集和导出遥测数据指标日志和跟踪,开放遥测技术得到了Cloud Native Computing FoundationCNCF的支持该基金会支持一系列流行的优秀的开源项目你可以去看一下CNCF景观图https://landscape.cncf.io/ 就明白了我的意思这个SDK支持所有主要的编程语言包括C#和ASP.NET Core。在这篇文章中我将讨论OpenTelemetry的全部含义为什么要使用它以及如何在.NET中使用对于典型的应用程序通常需要记录三组数据指标日志和跟踪。Logging 日志可以监听程序的进程发出的消息日志在.NET应用程序中如果您使用NuGet包ILogger中的日志记录功能就可以轻松的让OpenTelemetry支持 Microsoft.Extensions.Logging, 如果要构建ASP.NET Core应用程序通常已经使用了此功能。Metrics 指标提供运行进程的指标信息包括计数器仪表盘和直方图对OpenTelemetry中指标的支持仍在开发中 但是已经确定下来了指标包括以下•CPU 使用百分比•进程内存使用量•Http的请求数量Tracing 追踪也叫做分布式跟踪它记录单个操作的开始和结束时间以及与该操作相关的参数比如在ASP.NET Core中记录HTTP请求的跟踪您可能会记录请求和响应的开始和结束时间参数将是 Http的请求方式请求参数请求地址等请求调用会形成链路您可以深入了解时间耗费在哪个服务或者服务中有异常报错发生。Jaeger收集指标日志追踪信息只是一部分如何进行数据处理展示是APM系统的功能因为收集的数据遵循OpenTelemetry标准所以可以和APM系统完美结合。Jaeger和Zipkin是可以收集和显示并且与Open Telemetry兼容APM Zipkin的话比较久了并且没有很好的UI因此我个人推荐Jaeger看起来像这样上图显示了应用程序的跟踪,您可以看到它如何使用HTTP请求对MySQLRedis和外部API进行调用, 每行的长度显示了执行所需的时间,您可以轻松地从头到尾查看跟踪中执行的所有主要操作,您还可以深入研究每一行并查看与该部分跟踪有关的其他信息。Spans 跨度上面Jaeger图中的每一行都称为 Span,在.NET中的每一行均由System.Activities.Activity类型表示它也具有唯一的标识符开始和结束时间以及父范围的唯一标识符所以这些可以形成调用链并且Span还可以包含其他参数。不幸的是.NET团队的命名大大偏离了官方的OpenTelemetry规范我有点疑惑不过我现在已经明白了大概。我的理解是.NET已经包含一个Activity的类型因此.NET团队决定重用它而不是重新创建一个 Span的新类型这意味着很多命名与open-telemetry规范不匹配在.NET中你现在可以把 Span 和 Activity身份互换。注意在.NET 5中才有ActivitySource,在之前可以用 Activity。使用Span记录行为非常简单首先我们必须创建一个ActivitySource可以记录Span或活动的对象private static ActivitySource activitySource new ActivitySource(companyname.product.library,semver1.0.0);
然后我们可以调用StartActivity开始记录最后调用Dispose停止记录Spanusing (var activity activitySource.StartActivity(ActivityName)
{// Pretend to do some work.await LongRunningAsync().ConfigureAwait(false);
} // Activity gets stopped automatically at end of this block during dispose.
Events 事件当Span开启记录后我们也可以在这期间记录事件这些事件包含了时间戳信息using (var activity activitySource.StartActivity(ActivityName)
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log timestamped events that can take place during an activity. Activity.Current?.AddEvent(new ActivityEvent(Something happened.));
}
在LongRunningOperationAsync方法中有一个问题是如何把activity传入这个方法如果我们定义了一个参数这体验也太差了但是将两个操作分离的一个好的方法是使用Activity.Current。一个常见的错误我可以预见的是Activity.Current可能是null所以这里我加了null判断。Attributes 属性属性是数据的键值对您可以将其记录为单个Span的一部分比如Http的请求方式请求状态码等。注意在Open Telemetry规范中叫 Attributes在 我们.NET 中叫Tagusing (var activity activitySource.StartActivity(ActivityName)
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log an attribute containing arbitrary data.Activity.Current?.SetTag(http.method, GET);
}
IsRecording 记录IsRecording是Span上的一个标志如果返回false表明该Span已结束另外如果你的数据量比较大的话你需要抽样采集比如10%那么你也可以手动把这些span设置为false它不会采集。注意在open-telemetryg规范中叫IsRecording在.NET Core 3.1中是 Recorded在.NET 5 中是 IsAllDataRequested。using (var activity activitySource.StartActivity(ActivityName)
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Its possible to optionally request more data from a particular span.var activity Activity.Current;if (activity ! null activity.IsAllDataRequested){activity.SetTag(http.url, http://www.mywebsite.com);}
}
Trace的语义约定注意属性名称http.methodhttp.url我在以上示例中使用了该属性因为在open-telemetry规范中已经标准化了某些常用的属性名称标准化常用属性名称可以在Jaeger等APM中很好的展示它们属性名称已分类为几个不同的类别你可以花点时间看一下•General: 可用于描述不同种类的操作的常规语义属性•HTTP: 客户端和服务器的Http调用•Database: SQL 和 NoSql的调用•RPC/RMI: 远程调用比如gRPC等•Messaging: 用于与消息传递系统队列发布/订阅等•Exceptions: 用于记录与Span关联的异常的属性Exporting 导出有很多用于导出使用OpenTelemetry收集的数据的插件我将在我的下一篇博客文章中讨论有关在ASP.NET Core中使用Open Telemetry的信息, 可以很方便的处理这些数据您可以轻松地订阅然后消费OpenTelemetry数据如下所示using var subscriber DiagnosticListener.AllListeners.Subscribe(listener {Console.WriteLine($Listener name {listener.Name});listener.Subscribe(kvp Console.WriteLine($Received event {kvp.Key}:{kvp.Value}));});
跨进程的追踪为什么这些程序会形成调用链它们是不同的进程这个怎么实现的呢这就是W3C跟踪上下文标准它定义了一系列HTTP Header这些Header将有关当前正在记录的任何跟踪的信息从一个进程传递到另一个进程它通过Http的Header来传递信息规范中定义了两个HTTP Header•traceparent-包含versiontrace-idparent-id和trace-flags•version - 在open-telemetry规范中它始终是00•trace-id - 跟踪的唯一标识符。•parent-id -作为当前 patent span 的唯一标识符。•trace-flags -当前跟踪的一组标志用于确定是否正在采样当前跟踪以及跟踪级别。•tracestate -由一组名称/值对表示的特定于供应商的数据。traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: asp00f067aa0ba902b7,redist61rcWkgMzE
Baggage与Attributes类似Baggage是我们可以将数据作为键值对添加到跟踪的另一种方式不同之处在于Baggage使用W3C规范中baggage定义的HTTP Header跨进程边界传递但是Attributes的值数据只在当前Span中可用baggage: userIdalice,serverNodeDF:28,isProductionfalse
使用的话也有些相同之处using (var activity activitySource.StartActivity(ActivityName)
{await LongRunningOperation().ConfigureAwait(false);
}public async Task LongRunningOperationAsync()
{await Task.Delay(1000).ConfigureAwait(false);// Log an attribute containing arbitrary data.Activity.Current?.AddBaggage(http.method, GET);
}
它的用途在于比如说我需要传递一个订单ID我就可以放到 Baggage 数据中它在整个请求链路中都可以访问。总结.NET团队对OpenTelemetry非常重视你可以看到Activity类型在.NET 5 中的增强并且默认 HttpClient 调用时它会自动传输W3C跟踪上下文HTTP Header 基于ILogger的统一日志也可以很好的收集和OpenTelemetry兼容的日志。原文作者: Rehan Saeed 原文链接https://rehansaeed.com/deep-dive-into-open-telemetry-for-net/最后欢迎扫码关注我们的公众号 【全球技术精选】专注国外优秀博客的翻译和开源项目分享也可以添加QQ群 897216102
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81898.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!