{"id":348996,"date":"2023-06-19T09:01:43","date_gmt":"2023-06-19T09:01:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=348996"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=348996","title":{"rendered":"<span>\u0422\u0440\u0435\u0439\u0441\u0438\u043c .NET \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0447\u0435\u0440\u0435\u0437 OpenTelemetry<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0430\u0436\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0443\u0434\u0435\u043b\u044f\u044e\u0442 Observability &#8212; \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043a\u0430\u043a 3 \u0440\u0443\u043a\u0443.<br \/> \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0417\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0433\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0438\u0441\u0442\u0435\u043c, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e.<br \/> \u0412\u0440\u0435\u043c\u044f \u0448\u043b\u043e \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f OpenCensus \u0438 OpenTracing \u0432 2019 \u0433\u043e\u0434\u0443 \u0440\u043e\u0434\u0438\u043b\u0441\u044f OpenTelemetry.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0448\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OpenTelemetry \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043f\u0440\u043e\u0435\u043a\u0442 + \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 OpenTelemetry<\/h2>\n<p>\u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e Observability \u0441\u0438\u0441\u0442\u0435\u043c.<br \/> \u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 2019 \u0433\u043e\u0434\u0443 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c <a href=\"https:\/\/opentelemetry.io\/\" rel=\"noopener noreferrer nofollow\">OpenTelemetry<\/a> &#8212; \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438.<br \/> \u041f\u043e\u0437\u0436\u0435 \u043e\u043d\u0430 \u043e\u0431\u0440\u043e\u0441\u043b\u0430 \u0446\u0435\u043b\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 API, SDK \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0436\u0435 <a href=\"https:\/\/opentelemetry.io\/ecosystem\/vendors\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443<\/a> OpenTelemetry: AWS, Azure, Google Could, Grafana, Oracle<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/843\/d61\/99a\/843d6199a1ca4a2f94f01f45acd040bb.jpg\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 OpenTelemetry\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/843\/d61\/99a\/843d6199a1ca4a2f94f01f45acd040bb.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 OpenTelemetry<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 3 \u0441\u043b\u043e\u044f:<\/p>\n<ol>\n<li>\n<p>\u0425\u043e\u0441\u0442<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u043d\u0434\u043e\u0440<\/p>\n<\/li>\n<\/ol>\n<h3>\u0425\u043e\u0441\u0442<\/h3>\n<p>\u0425\u043e\u0441\u0442 &#8212; \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>API &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>SDK &#8212; \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e API<\/p>\n<\/li>\n<li>\n<p>Exporter &#8212; \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core:<\/p>\n<ol>\n<li>\n<p>API &#8212; Microsoft.Extensions.Logging<\/p>\n<\/li>\n<li>\n<p>SDK &#8212; Serilog, NLog, log4net<\/p>\n<\/li>\n<li>\n<p>Exporter &#8212; Console, Serilog, ELK<\/p>\n<\/li>\n<\/ol>\n<h3>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0440\u043e\u0432\/\u0442\u0440\u0435\u0439\u0441\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u0443<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0410\u0433\u0435\u043d\u0442), \u0442\u0430\u043a \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 (\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440)<\/p>\n<h3>\u0412\u0435\u043d\u0434\u043e\u0440<\/h3>\n<p>\u0412\u0435\u043d\u0434\u043e\u0440 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Jaeger (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 OLTP \u043f\u043e\u0440\u0442) \u0438\u043b\u0438 Zipkin (\u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c <a href=\"https:\/\/opentelemetry.io\/docs\/specs\/otel\/trace\/sdk_exporters\/zipkin\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440)<\/p>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 OpenTelemetry \u0438 System.Diagnostics<\/h2>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 .NET 5 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0438\u043f\u044b \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 <code>System.Diagnostics<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<br \/> \u0420\u0435\u0447\u044c \u043e <code>Activity<\/code>, <code>ActivitySource<\/code>, <code>ActivityListener<\/code>.<br \/> \u041e\u043d\u0438 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 OpenTelemetry<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">.NET<\/p>\n<\/th>\n<th>\n<p align=\"left\">OpenTelemetry<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Activity<\/p>\n<\/td>\n<td>\n<p align=\"left\">Span<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u0430\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c (\u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u0437\u0430\u043f\u0440\u043e\u0441\u044b)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivitySource<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tracer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c Activity\/Span<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Tag<\/p>\n<\/td>\n<td>\n<p align=\"left\">Attribute<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0430\u043d\u0430\/\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityKind<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanKind<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0441\u043f\u0430\u043d\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u0430\u043d\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityLink<\/p>\n<\/td>\n<td>\n<p align=\"left\">Link<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0430\u043d<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044e \u0432 OpenTelemetry \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 System.Diagnostics, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u0438\u0437 OpenTelemetry. \u042d\u0442\u0438 \u0442\u0438\u043f\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c <code>Tracing shim<\/code><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">System.Diagnostics<\/p>\n<\/th>\n<th>\n<p align=\"left\">Tracing shim<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Activity<\/p>\n<\/td>\n<td>\n<p align=\"left\">TelemetrySpan<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivitySource<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tracer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanContext<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u043e \u0432\u0441\u0435 \u0436\u0435, \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>System.Diagnostics<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>Tracing shim<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>System.Diagnostics<\/code><\/p>\n<h2>\u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0432 System.Diagnostics<\/h2>\n<p>\u0414\u043b\u044f \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 \u0432 .NET \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Activity API, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 <code>System.Diagnostics<\/code>.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>ActivitySource<\/code><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">private static readonly AssemblyName CurrentAssembly = typeof(Tracing).Assembly.GetName(); private static string Version => CurrentAssembly.Version!.ToString(); private static string AssemblyName => CurrentAssembly.Name!; public static readonly ActivitySource ConsumerActivitySource = new(AssemblyName, Version); <\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">public const string KafkaMessageProcessing = \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0430\u0444\u043a\u0438\";  public Activity StartActivity() {     var activity = ConsumerActivitySource.StartActivity(KafkaMessageProcessing);     \/\/ ...     return activity; } <\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">\/\/ https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/semantic_conventions\/trace\/general.yaml activity?.SetTag(\"thread.id\", Environment.CurrentManagedThreadId); activity?.SetTag(\"thread.name\", Thread.CurrentThread.Name); activity?.SetTag(\"enduser.id\", Thread.CurrentPrincipal?.Identity?.Name); SetLineNumber(activity);  void SetLineNumber(Activity? a, [CallerLineNumber] int lineNumber = 0) {     a?.SetTag(\"code.lineno\", lineNumber); } <\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p>\u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">span.Stop(); \/\/ span.Dispose(); - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 span.Stop(), \u0442.\u0435. \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 <\/code><\/pre>\n<p>\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 <code>Activity<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f &#8212; \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 <code>ActivityListener<\/code>, \u043d\u043e \u044d\u0442\u043e <s>\u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f<\/s> \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>StartActivity<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>null<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. <em>\u041f\u0440\u0438 \u0432\u0441\u0435\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 <\/em><code><em>null<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><code>Activity<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>IDisposable<\/code>. <em>\u041c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <\/em><code><em>Stop<\/em><\/code><em> \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <\/em><code><em>using<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><code>Activity<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445: <code>activity.AddEvent(new ActivityEvent(\"\u0427\u0442\u043e-\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c\"))<\/code>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439: <code>activity.RecordException(ex)<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0438\u0434\u0430\u0442\u044c\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043d\u0430\u0434\u043e \u0443\u043c\u0435\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0431\u0440\u043e\u0448\u0435\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u043f\u0430\u043d\u0430: <code>activity.SetStatus(ActivityStatusCode.Error, ex.Message)<\/code>. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, <code>activity.RecordException(ex)<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434. (\u041a\u0440\u043e\u043c\u0435 <code>Error<\/code> \u0435\u0441\u0442\u044c <code>Ok<\/code> \u0438 <code>Unset<\/code>, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c <code>Baggage<\/code> &#8212; \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>Baggage<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 (\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f), \u0430 <code>Tag<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432. \u0414\u043e\u0441\u0442\u0443\u043f \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: <code>activity.Baggage<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0437\u044f\u0442\u044b \u043d\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b. \u0418\u0445 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e <a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/tree\/main\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/a>. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/database.md\" rel=\"noopener noreferrer nofollow\"><code>db.system<\/code><\/a> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0421\u0423\u0411\u0414, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 (<code>mssql<\/code>, <code>postgresql<\/code>, <code>clickhouse<\/code>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/http.md\" rel=\"noopener noreferrer nofollow\"><code>http.request.method<\/code><\/a> &#8212; HTTP \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 (<code>GET<\/code>, <code>POST<\/code>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/rpc.md#common-attributes\" rel=\"noopener noreferrer nofollow\"><code>rpc.system<\/code><\/a> &#8212; \u0442\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e RPC \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (<code>grpc<\/code>, <code>dotnet_wcf<\/code>, <code>java_rmi<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">public async Task&lt;IActionResult> ProcessRequest() {     using var activity = MyActivitySource.StartActivity(ActivityName);     var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);     activity?.SetTag(\"enduser.id\", userId);     try     {         \/\/ \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430     }     catch (Exception ex) when (activity is not null)     {         activity.RecordException(ex);         activity.SetStatus(ActivityStatusCode.Error);         throw;     } }  <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>ActivityKind &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043f\u0430\u043d\u0430\u043c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p><code>ActivityKind<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0438\u043f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0441\u043f\u0430\u043d\u0430\u043c\u0438. \u0415\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u0432 OpenTelemetry &#8212; <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-specification\/blob\/main\/specification\/trace\/api.md#span\" rel=\"noopener noreferrer nofollow\"><code>SpanKind<\/code><\/a><\/p>\n<pre><code class=\"cs\">public enum ActivityKind {     \/\/\/ &lt;summary>     \/\/\/ Default value.     \/\/\/ Indicates that the Activity represents an internal operation within an application, as opposed to an operations with remote parents or children.     \/\/\/ &lt;\/summary>     Internal = 0,      \/\/\/ &lt;summary>     \/\/\/ Server activity represents request incoming from external component.     \/\/\/ &lt;\/summary>     Server = 1,      \/\/\/ &lt;summary>     \/\/\/ Client activity represents outgoing request to the external component.     \/\/\/ &lt;\/summary>     Client = 2,      \/\/\/ &lt;summary>     \/\/\/ Producer activity represents output provided to external components.     \/\/\/ &lt;\/summary>     Producer = 3,      \/\/\/ &lt;summary>     \/\/\/ Consumer activity represents output received from an external component.     \/\/\/ &lt;\/summary>     Consumer = 4, } <\/code><\/pre>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0447\u0442\u043e \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">ActivityKind<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Internal<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Client<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Server<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Producer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Consumer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0438\u043f \u0441\u043f\u0430\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>span.kind<\/code><\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>ActivityKind.Server<\/code><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/eeb\/434\/db4\/eeb434db44dbccb90b59a902d0c03cbc.png\" alt=\"\u0421\u043f\u0430\u043d \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a TemperatureApi\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/eeb\/434\/db4\/eeb434db44dbccb90b59a902d0c03cbc.png\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0430\u043d \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a TemperatureApi<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u043a\u043e\u0433\u0434\u0430 <code>HttpClient<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e <code>ActivityKind.Client<\/code><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/507\/35d\/a80\/50735da80d086dbfeffc7f3fd44d19da.png\" alt=\"\u0421\u043f\u0430\u043d \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 SystemApi\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/507\/35d\/a80\/50735da80d086dbfeffc7f3fd44d19da.png\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0430\u043d \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 SystemApi<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OpenTelemetry<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c OpenTelemetry \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>\u0412\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenTelemetry \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>OpenTelemetry<\/code> (\u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d).<br \/> \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c:<\/p>\n<pre><code>dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Extensions.Hosting  <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c OpenTelemetry, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f &#8212; \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<blockquote>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenTelemetry \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 <code>prerelease<\/code> \u0441\u0442\u0430\u0442\u0443\u0441\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f &#8212; \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c OpenTelemetry \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432)<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>AddOpenTelemetry()<\/code><\/p>\n<p>\u041d\u043e \u043e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 SDK \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e: <code>AddOpenTelemetry().WithTracing(...)<\/code><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u043e\u0432 \u0442\u0440\u0435\u0439\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0447\u0435\u043c-\u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 <code>Resource<\/code>.<br \/> \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<br \/> \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e.<br \/> \u0422\u043e\u0447\u043d\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 <code>ResourceBuilder<\/code>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Build()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 <code>Resource<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\/\u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><code>SetResourceBuilder(ResourceBuilder builder)<\/code> &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e <code>ResourceBuilder<\/code> \u0441 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><code>ConfigureResource(Action&lt;ResourceBuilder> configure)<\/code> &#8212; \u043b\u044f\u043c\u0431\u0434\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <code>ResourceBuilder<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>AddService<\/code> &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0432\u0435\u0440\u0441\u0438\u044e, ID \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p><code>AddAttributes<\/code> &#8212; \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p><code>AddDetector<\/code> &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p><code>AddEnvironmentVariableDetector<\/code> &#8212; \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f: <code>OTEL_RESOURCE_ATTRIBUTES<\/code>, <code>OTEL_SERVICE_NAME<\/code><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0432\u0435\u0437\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>AddDetector<\/code>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 &#8212; \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IResourceDetector<\/code><\/p>\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ An interface for Resource detectors. \/\/\/ &lt;\/summary> public interface IResourceDetector {     \/\/\/ &lt;summary>     \/\/\/ Called to get a resource with attributes from detector.     \/\/\/ &lt;\/summary>     \/\/\/ &lt;returns>An instance of &lt;see cref=\"Resource\"\/>.&lt;\/returns>     Resource Detect(); } <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 <code>Resource<\/code> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>Detect()<\/code> &#8212; \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>.AddEnvironmentVariableDetector()<\/code>,<br \/> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0430\u043a\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c\u0438\u043c.<br \/> \u0412 <code>TemperatureApi<\/code> \u0435\u0441\u0442\u044c <code>RandomSeedDetector<\/code> &#8212; \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0434 \u0434\u043b\u044f <code>Random<\/code>.<\/p>\n<pre><code class=\"cs\">public class RandomSeedDetector: IResourceDetector {     private readonly IOptions&lt;RandomOptions> _options;      public RandomSeedDetector(IOptions&lt;RandomOptions> options)     {         _options = options;     }          public Resource Detect()     {         return new Resource(new KeyValuePair&lt;string, object>[]         {             new(\"random.seed\", _options.Value.RandomSeed)         });     } } <\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>IOptions<\/code>.<br \/> \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 <code>IServiceProvider<\/code> &#8212; \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0435\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430.<br \/> \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<pre><code class=\"cs\">tracing.ConfigureResource(rb => {     rb.AddDetector(sp =>         new RandomSeedDetector(sp.GetRequiredService&lt;IOptions&lt;RandomOptions>>())); }); <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>TemperatureApi<\/code>:<\/p>\n<pre><code class=\"cs\">tracing.ConfigureResource(rb => {    var name = typeof(TemperatureController).Assembly.GetName();    rb.AddService(        serviceName: name.Name!,        serviceVersion: name.Version!.ToString(),        autoGenerateServiceInstanceId: true);    rb.AddDetector(sp =>        new RandomSeedDetector(sp.GetRequiredService&lt;IOptions&lt;RandomOptions>>())); }) <\/code><\/pre>\n<h3>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u044b<\/h3>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 &#8212; \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\/\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u043c\u0443.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c <code>HttpClient<\/code>.<br \/> \u0414\u043b\u044f \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>OpenTelemetry.Instrumentation.Http<\/code>.<br \/> \u041e\u043d\u0430 \u0437\u0430 \u0432\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 <code>HttpClient<\/code>.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 &#8212; \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"cs\">tracing.AddHttpClientInstrumentation(); <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>OpenTelemetry.Instrumentation.GrpcNetClient<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.Instrumentation.AspNetCore<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.Instrumentation.EntityFrameworkCore<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.Instrumentation.Runtime<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.Instrumentation.StackExchangeRedis<\/code><\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h3>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 &#8212; \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 <code>ActivitySource<\/code>.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a OpenTelemetry \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u0445 \u0441\u043b\u0443\u0448\u0430\u0442\u044c.<br \/> \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>AddSource(params string[] names)<\/code>.<br \/> \u041d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f <code>ActivitySource<\/code>.<\/p>\n<p>\u041c\u043e\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 <code>ActivitySource<\/code> (\u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e <code>Tracing<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c &#8212; \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438: <code>using var activity = Tracing.ApplicationActivity.StartActivity(SampleOperation);<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 <code>AddSource<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 <code>ActivitySource<\/code> \u0438\u0437 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 &#171;\u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u0440\u0435\u0435\u0441\u0442\u0440\u043e\u0432&#187;:<\/p>\n<pre><code class=\"cs\">tracing.AddSource(     FirstModule.Tracing.ApplicationActivity.Name,      SecondModule.Tracing.AnotherActivity.Name); <\/code><\/pre>\n<h3>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u044b<\/h3>\n<p>\u0421\u043f\u0430\u043d\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f &#8212; \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u043a\u0443\u0434\u0430-\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<br \/> \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u044b.<\/p>\n<p>\u0425\u043e\u0442\u044c \u044d\u0442\u043e \u0438 OpenTelemetry \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 OTEL \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<br \/> \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 (\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e):<\/p>\n<ul>\n<li>\n<p>Jaeger &#8212; <a href=\"https:\/\/www.nuget.org\/packages\/OpenTelemetry.Exporter.Jaeger\" rel=\"noopener noreferrer nofollow\">OpenTelemetry.Exporter.Jaeger<\/a><\/p>\n<\/li>\n<li>\n<p>Zipkin &#8212; <a href=\"https:\/\/www.nuget.org\/packages\/OpenTelemetry.Exporter.Zipkin\" rel=\"noopener noreferrer nofollow\">OpenTelemetry.Exporter.Zipkin<\/a><\/p>\n<\/li>\n<li>\n<p>Stackdriver &#8212; <a href=\"https:\/\/www.nuget.org\/packages\/OpenTelemetry.Exporter.Stackdriver\" rel=\"noopener noreferrer nofollow\">OpenTelemetry.Exporter.Stackdriver<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OpenTelemetry \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430:<\/p>\n<ol>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u043a\u0435\u0442 \u0441 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u043e\u043c<\/p>\n<\/li>\n<\/ol>\n<pre><code>dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol <\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">tracing.AddOltpExporter(); <\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">tracing.AddOltpExporter(oltp =>  {     oltp.Endpoint = new Uri(\"http:\/\/oltp:4317\"); }); <\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043e\u0435\u0434\u0438\u043d\u043e:<\/p>\n<pre><code class=\"cs\">builder.Services        .AddOpenTelemetry()        .WithTracing(tracing =>         {             tracing.AddAspNetCoreInstrumentation()                    .AddOtlpExporter(oltp =>                     {                         oltp.Endpoint = new Uri(\"http:\/\/oltp:4317\");                     })                    .ConfigureResource(rb =>                     {                         var name = typeof(TemperatureController).Assembly.GetName();                         rb.AddService(                             serviceName: name.Name!,                             serviceVersion: name.Version!.ToString(),                             autoGenerateServiceInstanceId: true);                         rb.AddDetector(sp =>                             new RandomSeedDetector(sp.GetRequiredService&lt;IOptions&lt;RandomOptions>>()));                     });         }); <\/code><\/pre>\n<h2>\u0420\u0435\u0446\u0435\u043f\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0435\u043d\u0434 \u0438\u0437 3 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c):<\/p>\n<ul>\n<li>\n<p><code>OpenTelemetry.SystemApi.Web<\/code> &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u0435\u043b\u0430\u0435\u0442 HTTP \u0437\u0430\u043f\u0440\u043e\u0441 \u043a <code>TemperatureApi<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u0430\u0444\u043a\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>SystemApi<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.TemperatureApi.Web<\/code> &#8212; \u043f\u0440\u043e\u0441\u0442\u043e\u0439 HTTP API \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0443\u0447\u043a\u043e\u0439 <code>temperature\/current<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443). \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>TemperatureApi<\/code><\/p>\n<\/li>\n<li>\n<p><code>OpenTelemetry.RecordSaver.Worker<\/code> &#8212; \u0434\u0435\u043c\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u0430\u0444\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 <code>SystemApi<\/code>, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 Postgres \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e EF Core. \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>RecordSaver<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Jaeger.<br \/> \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 OLTP \u043d\u0430 4317 \u043f\u043e\u0440\u0442\u0443 (\u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>COLLECTOR_OLTP_ENABLED=true<\/code>)<\/p>\n<h3>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443<\/h3>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 &#8212; \u043e\u0442 <code>SystemApi<\/code> \u043a <code>TemperatureApi<\/code>.<br \/> \u041e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>HttpClient<\/code>.<br \/> \u0414\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 <code>SystemApi<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 <code>HttpClient<\/code>, \u0430 \u0432 <code>TemperatureApi<\/code> &#8212; <code>ASP.NET Core<\/code> \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 <code>SystemApi<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ITemperatureService.GetTemeratureAsync()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 HTTP \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <code>Temperature.Api<\/code>.<\/p>\n<p>\u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0432 \u0442\u0440\u0435\u0439\u0441\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/ff3\/f4b\/1ff\/ff3f4b1ffa42f5c53df990699c3d7d06.png\" alt=\"\u0422\u0440\u0435\u0439\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ff3\/f4b\/1ff\/ff3f4b1ffa42f5c53df990699c3d7d06.png\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0435\u0439\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0443 <code>HttpClient<\/code> \u043d\u0430 <code>SystemApi<\/code>, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f &#8212; \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0443 <code>AspNetCore<\/code> \u043d\u0430 <code>TemperatureApi<\/code><\/p>\n<h3>\u041f\u0440\u043e\u0431\u0440\u043e\u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438<\/h3>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0430?<br \/> \u041a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442?<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d <code>Propagators API<\/code>.<br \/> \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<br \/> \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0434\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0448\u044c.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Propagator<\/code>.<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>TextMapPropagator<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430<\/p>\n<\/blockquote>\n<ol start=\"2\">\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>Inject&lt;T>(PropagationContext context, T carrier, Action&lt;T,string,string> setter)<\/code><\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p><code>T carrier<\/code> &#8212; \u044d\u0442\u043e \u0442\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0430 <code>Action&lt;T,string,string> setter<\/code> &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<\/blockquote>\n<ol start=\"3\">\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Propagator<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>Extract&lt;T>(PropagationContext context, T carrier, Func&lt;T,string,IEnumerable&lt;string>> getter)<\/code><\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p><code>getter<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/p>\n<\/blockquote>\n<ol start=\"4\">\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 <code>Activity<\/code>: <\/p>\n<ul>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <code>Baggage<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0425\u0432\u0430\u0442\u0438\u0442 \u0442\u0435\u043e\u0440\u0438\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e (\u0438\u043b\u0438 \u0441\u0447\u0430\u0441\u0442\u044c\u044e), \u0434\u043b\u044f \u043a\u0430\u0444\u043a\u0438 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0430.<br \/> \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0438 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u041f\u0440\u043e\u0434\u044c\u044e\u0441\u0435\u0440:<\/p>\n<pre><code class=\"cs\">public class TracingProducerDecorator&lt;TKey, TValue>: IProducer&lt;TKey, TValue> {     private readonly IProducer&lt;TKey, TValue> _producer;      public TracingProducerDecorator(IProducer&lt;TKey, TValue> producer)     {         _producer = producer;     }      private const string ProducingActivity = \"Kafka.Producer.Produce\";      private Activity? StartActiveSpan(Message&lt;TKey, TValue> message)     {         var activity = Tracing.WebActivitySource.StartActivity(ProducingActivity, ActivityKind.Producer);         if (activity is not null)         {             var propagationContext = new PropagationContext(activity.Context, Baggage.Current);             Propagators.DefaultTextMapPropagator.Inject(propagationContext, message.Headers ??= new Headers(),                 (headers, key, value) => headers.Add(key, Encoding.UTF8.GetBytes(value)));         }         return activity;     }      public async Task&lt;DeliveryResult&lt;TKey, TValue>> ProduceAsync(string topic, Message&lt;TKey, TValue> message, CancellationToken cancellationToken = new CancellationToken())     {         using var activity = StartActiveSpan(message);         try         {             var result = await _producer.ProduceAsync(topic, message, cancellationToken);             activity?.SetTag(\"kafka.topic\", result.Topic);             activity?.SetTag(\"kafka.partition\", result.Partition.Value);             activity?.SetTag(\"kafka.offset\", result.Offset.Value);             return result;         }         catch (Exception e)         {             activity.RecordException(e);             activity.SetStatus(Status.Error);             throw;         }     }      public void Produce(string topic, Message&lt;TKey, TValue> message, Action&lt;DeliveryReport&lt;TKey, TValue>> deliveryHandler = null!)     {         var span = StartActiveSpan(message);         try         {             _producer.Produce(topic, message, (r) =>             {                 try                 {                     if (r.Error.IsError)                     {                         span?.SetStatus(ActivityStatusCode.Error, $\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u0430\u0444\u043a\u0438: {r.Error.Reason}\");                     }                     else                     {                         span?.SetTag(\"kafka.topic\", r.Topic);                         span?.SetTag(\"kafka.partition\", r.Partition.Value);                         span?.SetTag(\"kafka.offset\", r.Offset.Value);                     }                     span?.Dispose();                 }                 catch (ObjectDisposedException)                 { }                 deliveryHandler(r);             });         }         catch (Exception e)         {             span?.RecordException(e);             span?.SetStatus(Status.Error);             span?.Dispose();             throw;         }     } } <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cs\">private static IEnumerable&lt;string> GetValuesFromHeadersSafe(Headers headers, string key)     => headers.Where(x => x.Key == key)                 .Select(b =>                 {                     try                     {                         return Encoding.UTF8.GetString(b.GetValueBytes());                     }                     catch (Exception)                     {                         return null;                     }                 })                 .Where(x => x is not null)!;   private Activity? StartActivity(ConsumeResult&lt;Null, string> result) {     var propagationContext = Propagators.DefaultTextMapPropagator.Extract(default, result.Message.Headers,         GetValuesFromHeadersSafe);      var span = Tracing.ConsumerActivitySource.StartActivity(         Tracing.KafkaMessageProcessing,          kind: ActivityKind.Consumer,         parentContext: propagationContext.ActivityContext);      Baggage.Current = propagationContext.Baggage;          return span; } <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <code>Baggage<\/code> \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435.<br \/> \u0414\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 \u0441\u0442\u0435\u043d\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>TRACING_SEND_RANDOM_BAGGAGE=true<\/code> \u0434\u043b\u044f <code>SystemApi<\/code>, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u043b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p><code>TRACING_LOG_BAGGAGE=true<\/code> \u0434\u043b\u044f <code>RecordSaver<\/code>, \u0447\u0442\u043e\u0431\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 <code>Baggage<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u041b\u043e\u0433\u0438 <code>SystemApi<\/code>: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/57b\/445\/661\/57b445661b3df7fe8d08208387fcb79c.png\" alt=\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 Baggage\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/57b\/445\/661\/57b445661b3df7fe8d08208387fcb79c.png\"\/><\/p>\n<div><figcaption>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 Baggage<\/figcaption><\/div>\n<\/figure>\n<p>\u041b\u043e\u0433\u0438 <code>RecordSaver<\/code>: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/723\/672\/402\/7236724024769a50c8e2239b3e95581a.png\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 Baggage\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/723\/672\/402\/7236724024769a50c8e2239b3e95581a.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 Baggage<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>getter<\/code> \u0438 <code>setter<\/code> \u0443 <code>Propagator<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/blockquote>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u043e\u0432 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e Activity<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e <code>Activity<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<br \/> \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u0430\u043a \u043a \u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c.<\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442 &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>Activity.Current<\/code>. \u041e\u043d\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 <code>Activity<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 <code>null<\/code>.<\/p>\n<blockquote>\n<p>\u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f <code>Activity<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u0442\u0438\u043f\u0430 <code>AsyncLocal&lt;Activity><\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0435\u0440\u043d\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 <code>Activity<\/code><\/p>\n<\/blockquote>\n<pre><code class=\"cs\">private static readonly AsyncLocal&lt;Activity?> s_current = new AsyncLocal&lt;Activity?>(); public static Activity? Current {     get { return s_current.Value; }     set     {         if (ValidateSetCurrent(value))         {             SetCurrent(value);         }     } } <\/code><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"cs\">public class JsonExceptionEventRecorderServiceDecorator: ITemperatureService {     private readonly ITemperatureService _service;      public async Task&lt;double> GetTemperatureAsync(CancellationToken token)     {         try         {             return await _service.GetTemperatureAsync(token);         }         catch (JsonException e) when (Activity.Current is {} activity)         {             var @event = new ActivityEvent(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON\",                 tags: new ActivityTagsCollection(new KeyValuePair&lt;string, object?>[]                 {                     new(\"json.error.path\", e.Path)                 }));             activity.AddEvent(@event);             throw;         }     } } <\/code><\/pre>\n<h3>\u0414\u0440\u043e\u0431\u043b\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043d\u044c\u0448\u0438\u0445<\/h3>\n<p>\u0411\u0430\u0442\u0447 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0434\u0440\u043e\u0431\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043d\u044c\u0448\u0435.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e <code>IProducer&lt;TKey, TValue><\/code> \u0441 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u043d\u0435\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b \u043d\u043e\u0432\u0443\u044e \u0440\u0443\u0447\u043a\u0443 <code>System\/state\/batch<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>Task.WhenAll()<\/code><\/p>\n<pre><code class=\"cs\">var measurements = Enumerable.Range(0, amount)                              .Select(_ => new WeatherForecast()                              {                                  Id = Guid.NewGuid(),                                  Date = DateTime.Now,                                  Summary = Faker.Random.Words(5),                                  TemperatureC = temp                              })                              .ToArray();  await Task.WhenAll(measurements.Select(m => _producer.ProduceAsync(\"weather\", new Message&lt;Null, string>() {     Value = JsonSerializer.Serialize(m) }, token))); <\/code><\/pre>\n<p>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043f\u0430\u043d\u0430\u043c\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/e91\/dd0\/9d3\/e91dd09d3746bfa7b4b5c6e4fbfb4c66.png\" alt=\"\u0421\u043f\u0430\u043d\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e91\/dd0\/9d3\/e91dd09d3746bfa7b4b5c6e4fbfb4c66.png\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0430\u043d\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>.Select()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 (<code>.Select(async m => {await ...; await ...;})<\/code>) \u0442\u043e \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/p>\n<\/blockquote>\n<h3>\u0421\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043a\u0430\u0444\u043a\u043e\u0439.<br \/> \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439.<br \/> \u041f\u0443\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0443\u0434\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u043c \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0442\u0440\u0435\u0439\u0441\u0443\/\u0441\u043f\u0430\u043d\u0443?<br \/> \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439.<br \/> \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0440\u0435\u0439\u0441 \u0437\u0430\u043c\u0443\u0441\u043e\u0440\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0432 OpenTelemetry \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d <a href=\"https:\/\/opentelemetry.io\/docs\/concepts\/signals\/traces\/#span-links\" rel=\"noopener noreferrer nofollow\"><code>Link<\/code><\/a>.<br \/> \u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0430\u044f \u043e \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438\/\u0441\u0432\u044f\u0437\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u043f\u0430\u043d\u043e\u043c.<\/p>\n<p>\u0412 .NET \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u043c <code>ActivityLink<\/code>.<br \/> \u042d\u0442\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>Activity<\/code>.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 <code>RecordSaver<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>TRACING_USE_LINK=true<\/code>.<br \/> \u0415\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>Activity<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0430 \u0441\u0441\u044b\u043b\u043a\u0430<\/p>\n<pre><code class=\"cs\">ActivityLink[]? links = null; ActivityContext parentContext = default;  if (useLink) {     links = new ActivityLink[]     {         new(propagationContext.ActivityContext)     }; } else {     parentContext = propagationContext.ActivityContext; }  var span = Tracing.ConsumerActivitySource.StartActivity(     Tracing.KafkaMessageProcessing,      kind: ActivityKind.Consumer,     parentContext: parentContext,     links: links); <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 <code>SystemApi<\/code>, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043b\u0438\u0441\u044c 2 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u0439\u0441\u0430: <code>SystemApi<\/code> + <code>TemperatureApi<\/code> \u0438 <code>RecordSaver<\/code><\/p>\n<\/li>\n<\/ol>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/4a1\/0c0\/857\/4a10c085764e824339572098de8fb9c0.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0439\u0441\u0430 SystemApi \u0438 TemperatureApi\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4a1\/0c0\/857\/4a10c085764e824339572098de8fb9c0.png\"\/><\/p>\n<div><figcaption>\u0417\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0439\u0441\u0430 SystemApi \u0438 TemperatureApi<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/823\/d80\/cc9\/823d80cc9a46ae1922d27054d6475612.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0439\u0441\u0430 RecordSaver\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/823\/d80\/cc9\/823d80cc9a46ae1922d27054d6475612.png\"\/><\/p>\n<div><figcaption>\u0417\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0439\u0441\u0430 RecordSaver<\/figcaption><\/div>\n<\/figure>\n<ol start=\"2\">\n<li>\n<p>\u0412 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u043f\u0430\u043d <code>RecordSaver<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043f\u0430\u043d \u043f\u0440\u043e\u0434\u044c\u044e\u0441\u0435\u0440\u0430<\/p>\n<\/li>\n<\/ol>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/757\/3f7\/934\/7573f7934944da8212895ce1d40b0d55.png\" alt=\"\u0421\u0441\u044b\u043b\u043a\u0430 \u0438\u0437 RecordSaver \u043d\u0430 \u0441\u043f\u0430\u043d \u0432 SystemApi\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/757\/3f7\/934\/7573f7934944da8212895ce1d40b0d55.png\"\/><\/p>\n<div><figcaption>\u0421\u0441\u044b\u043b\u043a\u0430 \u0438\u0437 RecordSaver \u043d\u0430 \u0441\u043f\u0430\u043d \u0432 SystemApi<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/806\/bee\/b9c\/806beeb9cec60a5e8516c306347df4ff.png\" alt=\"\u0421\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0439 \u0438\u0437 RecordSaver \u0441\u043f\u0430\u043d\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/806\/bee\/b9c\/806beeb9cec60a5e8516c306347df4ff.png\"\/><\/p>\n<div><figcaption>\u0421\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0439 \u0438\u0437 RecordSaver \u0441\u043f\u0430\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c <code>RecordSaver<\/code> &#171;\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c&#187; &#8212; \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>Trace Id<\/code>.<br \/> \u041e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h4>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u043a\u0442 \u0438\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. \u0422\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-specification\/blob\/v1.21.0\/specification\/trace\/exceptions.md\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a><\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 (\u0441\u0435\u0440\u0432\u0438\u0441 <code>SystemApi<\/code>)<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cs\">var tags = new ActivityTagsCollection(new KeyValuePair&lt;string, object?>[] {     new(\"exception.type\", exception.GetType().Name),      new(\"exception.message\", exception.Message),     new(\"exception.stacktrace\", exception.StackTrace) }); activity.AddEvent(new ActivityEvent(\"exception\", tags: tags)); <\/code><\/pre>\n<ul>\n<li>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u0437 OpenTelemetry (\u0441\u0435\u0440\u0432\u0438\u0441 <code>TemperatureApi<\/code>)<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cs\">activity.RecordException(e); <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<br \/> \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 <a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/semantic_conventions\/trace\/trace-exception.yaml\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <code>TemperatureApi<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>THROW_EXCEPTION=true<\/code>. \u0415\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u0442\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0435\u0439\u0441:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/433\/9a6\/4fe\/4339a64fee2eb45a29a9558123045220.png\" alt=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0442\u0440\u0435\u0439\u0441\u0435\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/433\/9a6\/4fe\/4339a64fee2eb45a29a9558123045220.png\"\/><\/p>\n<div><figcaption>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0442\u0440\u0435\u0439\u0441\u0435<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>P.S. \u0432 \u0442\u0440\u0435\u0439\u0441\u0435 <code>TemperatureApi<\/code> \u043d\u0435\u0442 <code>exception.stacktrace<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u044b\u0437\u0432\u0430\u043d <code>throw<\/code><\/p>\n<\/blockquote>\n<hr\/>\n<p>\u0414\u0443\u043c\u0430\u044e, \u044d\u0442\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430, OpenTelemetry \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a.<br \/> \u041f\u0440\u0438\u0447\u0435\u043c, \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>System.Diagnostics<\/code> \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 .NET&#8217;\u043e\u0432\u0441\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438.<br \/> \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0437\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f OpenTelemetry &#8212; <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-specification\/blob\/main\/specification\/trace\/api.md#span\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0435\u043d\u0434 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 &#8212; <a href=\"https:\/\/github.com\/ashenBlade\/habr-posts\/tree\/post\/opentelemetry-dotnet\/opentelemetry-dotnet\/project\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 OpenTelemetry \u0434\u043b\u044f .NET &#8212; <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-dotnet\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/742450\/\"> https:\/\/habr.com\/ru\/articles\/742450\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0430\u0436\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0443\u0434\u0435\u043b\u044f\u044e\u0442 Observability &#8212; \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043a\u0430\u043a 3 \u0440\u0443\u043a\u0443.<br \/> \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0417\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0433\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0438\u0441\u0442\u0435\u043c, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e.<br \/> \u0412\u0440\u0435\u043c\u044f \u0448\u043b\u043e \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f OpenCensus \u0438 OpenTracing \u0432 2019 \u0433\u043e\u0434\u0443 \u0440\u043e\u0434\u0438\u043b\u0441\u044f OpenTelemetry.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0448\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OpenTelemetry \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043f\u0440\u043e\u0435\u043a\u0442 + \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 OpenTelemetry<\/h2>\n<p>\u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e Observability \u0441\u0438\u0441\u0442\u0435\u043c.<br \/> \u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 2019 \u0433\u043e\u0434\u0443 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c <a href=\"https:\/\/opentelemetry.io\/\" rel=\"noopener noreferrer nofollow\">OpenTelemetry<\/a> &#8212; \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438.<br \/> \u041f\u043e\u0437\u0436\u0435 \u043e\u043d\u0430 \u043e\u0431\u0440\u043e\u0441\u043b\u0430 \u0446\u0435\u043b\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 API, SDK \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0436\u0435 <a href=\"https:\/\/opentelemetry.io\/ecosystem\/vendors\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443<\/a> OpenTelemetry: AWS, Azure, Google Could, Grafana, Oracle<\/p>\n<figure class=\"\">\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 OpenTelemetry<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 3 \u0441\u043b\u043e\u044f:<\/p>\n<ol>\n<li>\n<p>\u0425\u043e\u0441\u0442<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u043d\u0434\u043e\u0440<\/p>\n<\/li>\n<\/ol>\n<h3>\u0425\u043e\u0441\u0442<\/h3>\n<p>\u0425\u043e\u0441\u0442 &#8212; \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>API &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>SDK &#8212; \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e API<\/p>\n<\/li>\n<li>\n<p>Exporter &#8212; \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core:<\/p>\n<ol>\n<li>\n<p>API &#8212; Microsoft.Extensions.Logging<\/p>\n<\/li>\n<li>\n<p>SDK &#8212; Serilog, NLog, log4net<\/p>\n<\/li>\n<li>\n<p>Exporter &#8212; Console, Serilog, ELK<\/p>\n<\/li>\n<\/ol>\n<h3>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u0440\u043e\u0432\/\u0442\u0440\u0435\u0439\u0441\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u0443<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0410\u0433\u0435\u043d\u0442), \u0442\u0430\u043a \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 (\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440)<\/p>\n<h3>\u0412\u0435\u043d\u0434\u043e\u0440<\/h3>\n<p>\u0412\u0435\u043d\u0434\u043e\u0440 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Jaeger (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 OLTP \u043f\u043e\u0440\u0442) \u0438\u043b\u0438 Zipkin (\u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c <a href=\"https:\/\/opentelemetry.io\/docs\/specs\/otel\/trace\/sdk_exporters\/zipkin\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440)<\/p>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 OpenTelemetry \u0438 System.Diagnostics<\/h2>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 .NET 5 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0438\u043f\u044b \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 <code>System.Diagnostics<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<br \/> \u0420\u0435\u0447\u044c \u043e <code>Activity<\/code>, <code>ActivitySource<\/code>, <code>ActivityListener<\/code>.<br \/> \u041e\u043d\u0438 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 OpenTelemetry<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">.NET<\/p>\n<\/th>\n<th>\n<p align=\"left\">OpenTelemetry<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Activity<\/p>\n<\/td>\n<td>\n<p align=\"left\">Span<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u0430\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c (\u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u0437\u0430\u043f\u0440\u043e\u0441\u044b)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivitySource<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tracer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c Activity\/Span<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Tag<\/p>\n<\/td>\n<td>\n<p align=\"left\">Attribute<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0430\u043d\u0430\/\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityKind<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanKind<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0441\u043f\u0430\u043d\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u0430\u043d\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityLink<\/p>\n<\/td>\n<td>\n<p align=\"left\">Link<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0430\u043d<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044e \u0432 OpenTelemetry \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 System.Diagnostics, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u0438\u0437 OpenTelemetry. \u042d\u0442\u0438 \u0442\u0438\u043f\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c <code>Tracing shim<\/code><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">System.Diagnostics<\/p>\n<\/th>\n<th>\n<p align=\"left\">Tracing shim<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Activity<\/p>\n<\/td>\n<td>\n<p align=\"left\">TelemetrySpan<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivitySource<\/p>\n<\/td>\n<td>\n<p align=\"left\">Tracer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ActivityContext<\/p>\n<\/td>\n<td>\n<p align=\"left\">SpanContext<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u043e \u0432\u0441\u0435 \u0436\u0435, \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>System.Diagnostics<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>Tracing shim<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>System.Diagnostics<\/code><\/p>\n<h2>\u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u0432 System.Diagnostics<\/h2>\n<p>\u0414\u043b\u044f \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 \u0432 .NET \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Activity API, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 <code>System.Diagnostics<\/code>.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>ActivitySource<\/code><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">private static readonly AssemblyName CurrentAssembly = typeof(Tracing).Assembly.GetName(); private static string Version => CurrentAssembly.Version!.ToString(); private static string AssemblyName => CurrentAssembly.Name!; public static readonly ActivitySource ConsumerActivitySource = new(AssemblyName, Version); <\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">public const string KafkaMessageProcessing = \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0430\u0444\u043a\u0438\";  public Activity StartActivity() {     var activity = ConsumerActivitySource.StartActivity(KafkaMessageProcessing);     \/\/ ...     return activity; } <\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">\/\/ https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/semantic_conventions\/trace\/general.yaml activity?.SetTag(\"thread.id\", Environment.CurrentManagedThreadId); activity?.SetTag(\"thread.name\", Thread.CurrentThread.Name); activity?.SetTag(\"enduser.id\", Thread.CurrentPrincipal?.Identity?.Name); SetLineNumber(activity);  void SetLineNumber(Activity? a, [CallerLineNumber] int lineNumber = 0) {     a?.SetTag(\"code.lineno\", lineNumber); } <\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p>\u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cs\">span.Stop(); \/\/ span.Dispose(); - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 span.Stop(), \u0442.\u0435. \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 <\/code><\/pre>\n<p>\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 <code>Activity<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f &#8212; \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 <code>ActivityListener<\/code>, \u043d\u043e \u044d\u0442\u043e <s>\u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f<\/s> \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>StartActivity<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>null<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. <em>\u041f\u0440\u0438 \u0432\u0441\u0435\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 <\/em><code><em>null<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><code>Activity<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>IDisposable<\/code>. <em>\u041c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <\/em><code><em>Stop<\/em><\/code><em> \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <\/em><code><em>using<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><code>Activity<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445: <code>activity.AddEvent(new ActivityEvent(\"\u0427\u0442\u043e-\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c\"))<\/code>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439: <code>activity.RecordException(ex)<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0438\u0434\u0430\u0442\u044c\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043d\u0430\u0434\u043e \u0443\u043c\u0435\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0431\u0440\u043e\u0448\u0435\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u043f\u0430\u043d\u0430: <code>activity.SetStatus(ActivityStatusCode.Error, ex.Message)<\/code>. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, <code>activity.RecordException(ex)<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434. (\u041a\u0440\u043e\u043c\u0435 <code>Error<\/code> \u0435\u0441\u0442\u044c <code>Ok<\/code> \u0438 <code>Unset<\/code>, \u043d\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c <code>Baggage<\/code> &#8212; \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>Baggage<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 (\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f), \u0430 <code>Tag<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432. \u0414\u043e\u0441\u0442\u0443\u043f \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: <code>activity.Baggage<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u0437\u044f\u0442\u044b \u043d\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b. \u0418\u0445 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e <a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/tree\/main\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/a>. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432: <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/database.md\" rel=\"noopener noreferrer nofollow\"><code>db.system<\/code><\/a> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0421\u0423\u0411\u0414, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 (<code>mssql<\/code>, <code>postgresql<\/code>, <code>clickhouse<\/code>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/http.md\" rel=\"noopener noreferrer nofollow\"><code>http.request.method<\/code><\/a> &#8212; HTTP \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 (<code>GET<\/code>, <code>POST<\/code>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/open-telemetry\/semantic-conventions\/blob\/main\/specification\/trace\/semantic_conventions\/rpc.md#common-attributes\" rel=\"noopener noreferrer nofollow\"><code>rpc.system<\/code><\/a> &#8212; \u0442\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e RPC \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (<code>grpc<\/code>, <code>dotnet_wcf<\/code>, <code>java_rmi<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">public async Task&lt;IActionResult> ProcessRequest() {     using var activity = MyActivitySource.StartActivity(ActivityName);     var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);     activity?.SetTag(\"enduser.id\", userId);     try     {         \/\/ \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430     }     catch (Exception ex) when (activity is not null)     {         activity.RecordException(ex);         activity.SetStatus(ActivityStatusCode.Error);         throw;     } }  <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>ActivityKind &#8212; \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043f\u0430\u043d\u0430\u043c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p><code>ActivityKind<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0438\u043f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0441\u043f\u0430\u043d\u0430\u043c\u0438. \u0415\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u0432 OpenTelemetry &#8212; <a href=\"https:\/\/github.com\/open-telemetry\/opentelemetry-specification\/blob\/main\/specification\/trace\/api.md#span\" rel=\"noopener noreferrer nofollow\"><code>SpanKind<\/code><\/a><\/p>\n<pre><code class=\"cs\">public enum ActivityKind {     \/\/\/ &lt;summary>     \/\/\/ Default value.     \/\/\/ Indicates that the Activity represents an internal operation within an application, as opposed to an operations with remote parents or children.     \/\/\/ &lt;\/summary>     Internal = 0,      \/\/\/ &lt;summary>     \/\/\/ Server activity represents request incoming from external component.     \/\/\/ &lt;\/summary>     Server = 1,      \/\/\/ &lt;summary>     \/\/\/ Client activity represents outgoing request to the external component.     \/\/\/ &lt;\/summary>     Client = 2,      \/\/\/ &lt;summary>     \/\/\/ Producer activity represents output provided to external components.     \/\/\/ &lt;\/summary>     Producer = 3,      \/\/\/ &lt;summary>     \/\/\/ Consumer activity represents output received from an external component.     \/\/\/ &lt;\/summary>     Consumer = 4, } <\/code><\/pre>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0447\u0442\u043e \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">ActivityKind<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Internal<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Client<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Server<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Producer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Consumer<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0438\u043f \u0441\u043f\u0430\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>span.kind<\/code><\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>ActivityKind.Server<\/code><\/p>\n<figure class=\"\">\n<div><figcaption>\u0421\u043f\u0430\u043d \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a TemperatureApi<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u043a\u043e\u0433\u0434\u0430 <code>HttpClient<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e <code>ActivityKind.Client<\/code><\/p>\n<figure class=\"\">\n<div><figcaption>\u0421\u043f\u0430\u043d \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 SystemApi<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OpenTelemetry<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c OpenTelemetry \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>\u0412\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenTelemetry \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>OpenTelemetry<\/code> (\u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d).<br \/> \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c:<\/p>\n<pre><code>dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Extensions.Hosting  <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c OpenTelemetry, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f &#8212; \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<blockquote>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenTelemetry \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 <code>prerelease<\/code> \u0441\u0442\u0430\u0442\u0443\u0441\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f &#8212; \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c OpenTelemetry \u0432 <a href=\"http:\/\/ASP.NET\" rel=\"noopener noreferrer nofollow\">ASP.NET<\/a> Core (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432)<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>AddOpenTelemetry()<\/code><\/p>\n<p>\u041d\u043e \u043e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 SDK \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0422\u0440\u0435\u0439\u0441\u0438\u043d\u0433 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e: <code>AddOpenTelemetry().WithTracing(...)<\/code><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u044f\u043c\u0431\u0434\u0443 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0440\u0435\u0439\u0441\u0438\u043d\u0433\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u043e\u0432 \u0442\u0440\u0435\u0439\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0447\u0435\u043c-\u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 <code>Resource<\/code>.<br \/> \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<br \/> \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e.<br \/> \u0422\u043e\u0447\u043d\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 <code>ResourceBuilder<\/code>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Build()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 <code>Resource<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\/\u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><code>SetResourceBuilder(ResourceBuilder builder)<\/code> &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e <code>ResourceBuilder<\/code> \u0441 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<li>\n<p><code>ConfigureResource(Action&lt;ResourceBuilder> configure)<\/code> &#8212; \u043b\u044f\u043c\u0431\u0434\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <code>ResourceBuilder<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>AddService<\/code> &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0432\u0435\u0440\u0441\u0438\u044e, ID \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p><code>AddAttributes<\/code> &#8212; \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p><code>AddDetector<\/code> &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p><code>AddEnvironmentVariableDetector<\/code> &#8212; \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f: <code>OTEL_RESOURCE_ATTRIBUTES<\/code>, <code>OTEL_SERVICE_NAME<\/code><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0432\u0435\u0437\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>AddDetector<\/code>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 &#8212; \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>I<\/code><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-348996","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=348996"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348996\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=348996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=348996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=348996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}