<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=.NET_OpenTelemetry</id>
	<title>.NET OpenTelemetry - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=.NET_OpenTelemetry"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=.NET_OpenTelemetry&amp;action=history"/>
	<updated>2026-05-02T12:06:00Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=.NET_OpenTelemetry&amp;diff=5860&amp;oldid=prev</id>
		<title>IKuznetsov в 09:35, 15 октября 2025</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=.NET_OpenTelemetry&amp;diff=5860&amp;oldid=prev"/>
		<updated>2025-10-15T09:35:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 09:35, 15 октября 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l121&quot;&gt;Строка 121:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 121:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private const string activitySource = &amp;quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dynatrace&lt;/del&gt;.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private const string activitySource = &amp;quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l137&quot;&gt;Строка 137:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 137:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        try {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        try {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l312&quot;&gt;Строка 312:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 312:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private const string activitySource = &amp;quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dynatrace&lt;/del&gt;.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;private const string activitySource = &amp;quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l336&quot;&gt;Строка 336:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 336:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                          &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        try {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;        try {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=.NET_OpenTelemetry&amp;diff=5859&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше '''.NET-п...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=.NET_OpenTelemetry&amp;diff=5859&amp;oldid=prev"/>
		<updated>2025-10-15T09:34:25Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше &amp;#039;&amp;#039;&amp;#039;.NET-п...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше '''.NET-приложение''' с помощью библиотек и инструментов '''.NET''' '''OpenTelemetry'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Особенность&lt;br /&gt;
!Поддержка&lt;br /&gt;
|-&lt;br /&gt;
|Автоматические инструменты&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Трассировки&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Метрики&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Логи&lt;br /&gt;
|Да&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Предустановка ==&lt;br /&gt;
&lt;br /&gt;
* Ключ-АСТРОМ версии '''1.254+'''&lt;br /&gt;
* Для трассировки включен '''контекст трассировки''' '''W3C'''.&lt;br /&gt;
*# Перейдите в '''Настройки &amp;gt; Предпочтения &amp;gt; Функции ЕдиногоАгента'''.&lt;br /&gt;
*# Включите опцию '''Отправлять HTTP-заголовки контекста трассировки W3C'''.&lt;br /&gt;
&lt;br /&gt;
== Получение данных для доступа к Ключ-АСТРОМ ==&lt;br /&gt;
&lt;br /&gt;
=== Определение базовых URL API ===&lt;br /&gt;
Подробную информацию о сборке базового '''URL-адреса''' конечной точки '''OTLP''' см. в разделе [[Экспорт с помощью OTLP]]. '''URL-адрес''' должен заканчиваться на &amp;lt;code&amp;gt;/api/v2/otlp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Получение токена доступа API ===&lt;br /&gt;
Токен доступа для сбора трассировок, логов и метрик можно создать в разделе [[Токен доступа|Токены доступа]].&lt;br /&gt;
&lt;br /&gt;
Экспорт с помощью '''OTLP''' содержит более подробную информацию о формате и необходимых областях доступа.&lt;br /&gt;
&lt;br /&gt;
== Выберите, как вы хотите инструментировать свое приложение ==&lt;br /&gt;
Для '''.NET OpenTelemetry''' поддерживает автоматическое и ручное инструментирование (или их комбинацию).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;u&amp;gt;Какой инструментарий выбрать?&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекомендуется начать с автоматического измерения и добавить ручное измерение, если автоматический подход не работает или не дает достаточно информации.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Автоматическое инструментирование приложения (необязательно) ==&lt;br /&gt;
Автоматизированное инструментирование '''.NET''' можно настроить как во время разработки, так и позже, после развертывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;u&amp;gt;Расширение с помощью ЕдиногоАгента&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В настоящее время невозможно автоматически дополнять сервисы информацией, относящейся к хосту. Для этого потребуется перейти на ручное инструментирование.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== В процессе разработки ===&lt;br /&gt;
1. Установите &amp;lt;code&amp;gt;[https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting OpenTelemetry.Extensions.Hosting]&amp;lt;/code&amp;gt;.﻿&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|dotnet add package OpenTelemetry.Extensions.Hosting&lt;br /&gt;
|}&lt;br /&gt;
2. Установите соответствующую библиотеку инструментов для вашей платформы '''.NET''' (полный список доступен [https://www.nuget.org/packages?q=OpenTelemetry.Instrumentation здесь]﻿).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|dotnet add package OpenTelemetry.Instrumentation.[FRAMEWORK_NAME]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== После развертывания ===&lt;br /&gt;
&lt;br /&gt;
# Загрузите [https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest последнюю версию автоматического установщика]﻿ для целевой операционной системы.&lt;br /&gt;
# [https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation#shell-scripts Запустите (в Unix)]﻿ или [https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation#powershell-module-windows импортируйте (в Windows)]﻿ автоматический установщик, чтобы установить и настроить все необходимые библиотеки автоматического инструментирования.&lt;br /&gt;
# Запустите ваше приложение.&lt;br /&gt;
&lt;br /&gt;
Помимо описанной выше настройки инструментария, необходимо также настроить соответствующие параметры экспорта с помощью переменных среды. Это включает '''URL''' конечной точки, токен аутентификации и временные настройки для метрик.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|OTEL_EXPORTER_OTLP_ENDPOINT=[URL]&lt;br /&gt;
&lt;br /&gt;
OTEL_EXPORTER_OTLP_HEADERS=&amp;quot;Authorization=Api-Token [TOKEN]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Инструментирование приложения вручную (необязательно) ==&lt;br /&gt;
&lt;br /&gt;
=== Настройка ===&lt;br /&gt;
Шаги настройки немного различаются в зависимости от того, инструментируете ли вы обычное приложение '''.NET''' или приложение '''ASP.NET'''.&lt;br /&gt;
&lt;br /&gt;
==== .NET ====&lt;br /&gt;
1. Установите следующие пакеты.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|dotnet add package Microsoft.Extensions.Logging&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Extensions.Hosting&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Api&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol&lt;br /&gt;
|}&lt;br /&gt;
2. Добавьте следующие операторы &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; в класс запуска, который инициирует загрузку вашего приложения.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|using OpenTelemetry;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Trace;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Exporter;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Metrics;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Logs;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Resources;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Context.Propagation;&lt;br /&gt;
&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
using System.Diagnostics.Metrics;&lt;br /&gt;
&lt;br /&gt;
using Microsoft.Extensions.Logging;&lt;br /&gt;
|}&lt;br /&gt;
3. Добавьте эти поля в класс запуска, причем первые два должны содержать данные о доступе, если вы используете экспорт '''OTLP'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static string DT_API_URL = &amp;quot;&amp;quot;; // TODO: Provide your SaaS/Managed URL here&lt;br /&gt;
&lt;br /&gt;
private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;br /&gt;
&lt;br /&gt;
private const string activitySource = &amp;quot;Dynatrace.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;br /&gt;
&lt;br /&gt;
public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;br /&gt;
&lt;br /&gt;
private static ILoggerFactory loggerFactoryOT;&lt;br /&gt;
|}&lt;br /&gt;
4. Добавьте метод &amp;lt;code&amp;gt;initOpenTelemetry&amp;lt;/code&amp;gt; в класс запуска и вызовите его как можно раньше при запуске приложения. Это инициализирует '''OpenTelemetry''' для бэкенда Ключ-АСТРОМ и создаст поставщиков трассировки и метрик по умолчанию.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static void initOpenTelemetry(IServiceCollection services)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;KeyValuePair&amp;lt;string, object&amp;gt;&amp;gt; dt_metadata = new List&amp;lt;KeyValuePair&amp;lt;string, object&amp;gt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
                                          &amp;quot;/var/lib/dynatrace/enrichment/dt_metadata.properties&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
                                          &amp;quot;/var/lib/dynatrace/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            foreach (string line in System.IO.File.ReadAllLines(name.StartsWith(&amp;quot;/var&amp;quot;) ? name : System.IO.File.ReadAllText(name))) { &lt;br /&gt;
&lt;br /&gt;
                var keyvalue = line.Split(&amp;quot;=&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                dt_metadata.Add( new KeyValuePair&amp;lt;string, object&amp;gt;(keyvalue[0], keyvalue[1]));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        catch { }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    Action&amp;lt;ResourceBuilder&amp;gt; configureResource = r =&amp;gt; r&lt;br /&gt;
&lt;br /&gt;
        .AddService(serviceName: &amp;quot;dotnet-quickstart&amp;quot;) //TODO Replace with the name of your application&lt;br /&gt;
&lt;br /&gt;
        .AddAttributes(dt_metadata);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    services.AddOpenTelemetry()&lt;br /&gt;
&lt;br /&gt;
        .ConfigureResource(configureResource)&lt;br /&gt;
&lt;br /&gt;
        .WithTracing(builder =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
            builder&lt;br /&gt;
&lt;br /&gt;
                .SetSampler(new AlwaysOnSampler())&lt;br /&gt;
&lt;br /&gt;
                .AddSource(MyActivitySource.Name)&lt;br /&gt;
&lt;br /&gt;
                .AddOtlpExporter(options =&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
&lt;br /&gt;
                    options.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/traces&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                    options.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        .WithMetrics(builder =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
            builder&lt;br /&gt;
&lt;br /&gt;
                .AddMeter(&amp;quot;my-meter&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                .AddOtlpExporter((OtlpExporterOptions exporterOptions, MetricReaderOptions readerOptions) =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                {&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/metrics&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                    readerOptions.TemporalityPreference = MetricReaderTemporalityPreference.Delta;&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    var resourceBuilder = ResourceBuilder.CreateDefault();&lt;br /&gt;
&lt;br /&gt;
    configureResource!(resourceBuilder);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    loggerFactoryOT = LoggerFactory.Create(builder =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
        builder&lt;br /&gt;
&lt;br /&gt;
            .AddOpenTelemetry(options =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
                options.SetResourceBuilder(resourceBuilder).AddOtlpExporter(options =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
                    options.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/logs&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    options.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    options.ExportProcessorType = OpenTelemetry.ExportProcessorType.Batch;&lt;br /&gt;
&lt;br /&gt;
                    options.Protocol = OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            })&lt;br /&gt;
&lt;br /&gt;
            .AddConsole();&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Sdk.CreateTracerProviderBuilder()&lt;br /&gt;
&lt;br /&gt;
        .SetSampler(new AlwaysOnSampler())&lt;br /&gt;
&lt;br /&gt;
        .AddSource(MyActivitySource.Name)&lt;br /&gt;
&lt;br /&gt;
        .ConfigureResource(configureResource);&lt;br /&gt;
&lt;br /&gt;
    // add-logging&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;u&amp;gt;Расширение данных Ключ-АСТРОМ&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Операции чтения файлов, анализирующие файлы &amp;lt;code&amp;gt;dt_metadata&amp;lt;/code&amp;gt; в примере кода, пытаются прочитать файлы данных ЕдиногоАгента, чтобы расширить запрос '''OTLP''' и гарантировать, что вся соответствующая информация о топологии доступна в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
==== ASP.NET ====&lt;br /&gt;
1. Установите следующие пакеты.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|dotnet add package Microsoft.Extensions.Logging&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Extensions.Hosting&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Api&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Instrumentation.AspNetCore&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Instrumentation.Http&lt;br /&gt;
&lt;br /&gt;
dotnet add package OpenTelemetry.Instrumentation.Runtime&lt;br /&gt;
|}&lt;br /&gt;
2. Добавьте следующие операторы &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt; в класс запуска, который инициирует загрузку вашего приложения.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|using OpenTelemetry;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Trace;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Exporter;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Metrics;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Logs;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Resources;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Context.Propagation;&lt;br /&gt;
&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
using System.Diagnostics.Metrics;&lt;br /&gt;
&lt;br /&gt;
using Microsoft.Extensions.Logging;&lt;br /&gt;
&lt;br /&gt;
using OpenTelemetry.Instrumentation.AspNetCore;&lt;br /&gt;
|}&lt;br /&gt;
3. Добавьте эти поля в класс запуска, причем первые два должны содержать данные о доступе, если вы используете экспорт '''OTLP'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static string DT_API_URL = &amp;quot;&amp;quot;; // TODO: Provide your SaaS/Managed URL here&lt;br /&gt;
&lt;br /&gt;
private static string DT_API_TOKEN = &amp;quot;&amp;quot;; // TODO: Provide the OpenTelemetry-scoped access token here&lt;br /&gt;
&lt;br /&gt;
private const string activitySource = &amp;quot;Dynatrace.DotNetApp.Sample&amp;quot;; // TODO: Provide a descriptive name for your application here&lt;br /&gt;
&lt;br /&gt;
public static readonly ActivitySource MyActivitySource = new ActivitySource(activitySource);&lt;br /&gt;
&lt;br /&gt;
private static ILoggerFactory loggerFactoryOT;&lt;br /&gt;
|}&lt;br /&gt;
4. Добавьте метод &amp;lt;code&amp;gt;initOpenTelemetry&amp;lt;/code&amp;gt; в класс запуска и вызовите его как можно раньше при запуске приложения. Это инициализирует '''OpenTelemetry''' для бэкенда Ключ-АСТРОМ и создаст поставщиков трассировки и метрик по умолчанию.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static void initOpenTelemetry(){&lt;br /&gt;
&lt;br /&gt;
    var port = System.Environment.GetEnvironmentVariable(&amp;quot;PORT&amp;quot;) ?? &amp;quot;8080&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    var appBuilder = WebApplication.CreateBuilder();&lt;br /&gt;
&lt;br /&gt;
    appBuilder.WebHost.ConfigureKestrel(options =&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
        options.ListenAnyIP(Convert.ToInt32(port)); // hardcoding the port&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;KeyValuePair&amp;lt;string, object&amp;gt;&amp;gt; dt_metadata = new List&amp;lt;KeyValuePair&amp;lt;string, object&amp;gt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    foreach (string name in new string[] {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
                                          &amp;quot;/var/lib/dynatrace/enrichment/dt_metadata.properties&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
                                          &amp;quot;/var/lib/dynatrace/enrichment/dt_host_metadata.properties&amp;quot;}) {&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            foreach (string line in System.IO.File.ReadAllLines(name.StartsWith(&amp;quot;/var&amp;quot;) ? name : System.IO.File.ReadAllText(name))) { &lt;br /&gt;
&lt;br /&gt;
                var keyvalue = line.Split(&amp;quot;=&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                dt_metadata.Add( new KeyValuePair&amp;lt;string, object&amp;gt;(keyvalue[0], keyvalue[1]));&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        catch { }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Action&amp;lt;ResourceBuilder&amp;gt; configureResource = r =&amp;gt; r&lt;br /&gt;
&lt;br /&gt;
        .AddService(serviceName: &amp;quot;dotnetManual&amp;quot;) //TODO Replace with the name of your application&lt;br /&gt;
&lt;br /&gt;
        .AddAttributes(dt_metadata);&lt;br /&gt;
&lt;br /&gt;
    appBuilder.Services.AddOpenTelemetry()&lt;br /&gt;
&lt;br /&gt;
        .ConfigureResource(configureResource)&lt;br /&gt;
&lt;br /&gt;
        .WithTracing(builder =&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
            appBuilder.Services.Configure&amp;lt;AspNetCoreTraceInstrumentationOptions&amp;gt;(appBuilder.Configuration.GetSection(&amp;quot;AspNetCoreInstrumentation&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
            builder&lt;br /&gt;
&lt;br /&gt;
                .AddSource(MyActivitySource.Name)&lt;br /&gt;
&lt;br /&gt;
                .SetSampler(new AlwaysOnSampler())&lt;br /&gt;
&lt;br /&gt;
                .AddHttpClientInstrumentation()&lt;br /&gt;
&lt;br /&gt;
                .AddAspNetCoreInstrumentation()&lt;br /&gt;
&lt;br /&gt;
                .AddOtlpExporter(otlpOptions =&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/traces&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        .WithMetrics(builder =&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
            builder&lt;br /&gt;
&lt;br /&gt;
                .AddMeter(&amp;quot;my-meter&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                // .AddMeter(Instrumentation.MeterName)&lt;br /&gt;
&lt;br /&gt;
                .AddRuntimeInstrumentation()&lt;br /&gt;
&lt;br /&gt;
                .AddHttpClientInstrumentation()&lt;br /&gt;
&lt;br /&gt;
                .AddAspNetCoreInstrumentation()&lt;br /&gt;
&lt;br /&gt;
                .AddOtlpExporter((OtlpExporterOptions exporterOptions, MetricReaderOptions readerOptions) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/metrics&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    exporterOptions.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                    readerOptions.TemporalityPreference = MetricReaderTemporalityPreference.Delta;&lt;br /&gt;
&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            appBuilder.Logging.ClearProviders();&lt;br /&gt;
&lt;br /&gt;
            appBuilder.Logging.AddOpenTelemetry(options =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
                var resourceBuilder = ResourceBuilder.CreateDefault();&lt;br /&gt;
&lt;br /&gt;
                configureResource(resourceBuilder);&lt;br /&gt;
&lt;br /&gt;
                options.SetResourceBuilder(resourceBuilder);&lt;br /&gt;
&lt;br /&gt;
                options.AddOtlpExporter(otlpOptions =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Endpoint = new Uri(Environment.GetEnvironmentVariable(&amp;quot;DT_API_URL&amp;quot;)+ &amp;quot;/v1/logs&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Headers = $&amp;quot;Authorization=Api-Token {Environment.GetEnvironmentVariable(&amp;quot;DT_API_TOKEN&amp;quot;)}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.ExportProcessorType = OpenTelemetry.ExportProcessorType.Batch;&lt;br /&gt;
&lt;br /&gt;
                    otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            appBuilder.Services.AddControllers();&lt;br /&gt;
&lt;br /&gt;
            appBuilder.Services.AddEndpointsApiExplorer();&lt;br /&gt;
&lt;br /&gt;
            var app = appBuilder.Build();&lt;br /&gt;
&lt;br /&gt;
            app.MapControllers();&lt;br /&gt;
&lt;br /&gt;
            app.Run();&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;u&amp;gt;Расширение данных Ключ-АСТРОМ&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Операции чтения файлов, анализирующие файлы &amp;lt;code&amp;gt;dt_metadata&amp;lt;/code&amp;gt; в примере кода, пытаются прочитать файлы данных ЕдиногоАгента, чтобы расширить запрос '''OTLP''' и гарантировать, что вся соответствующая информация о топологии доступна в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
=== Добавление трассировки ===&lt;br /&gt;
Используя шаг настройки &amp;lt;code&amp;gt;MyActivitySource&amp;lt;/code&amp;gt;, теперь мы можем начать новые действия (трассировки):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|using var activity = Startup.MyActivitySource.StartActivity(&amp;quot;Call to /myendpoint&amp;quot;, ActivityKind.Consumer, parentContext.ActivityContext);&lt;br /&gt;
&lt;br /&gt;
activity?.SetTag(&amp;quot;http.method&amp;quot;, &amp;quot;GET&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
activity?.SetTag(&amp;quot;net.protocol.version&amp;quot;, &amp;quot;1.1&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
В приведенном выше коде мы:&lt;br /&gt;
&lt;br /&gt;
* Создали новое действие (span) и назвали его «'''Call to /myendpoint'''».&lt;br /&gt;
* Добавили два тега (атрибута), следуя [https://opentelemetry.io/docs/specs/semconv/general/trace/ семантическому соглашению об именовании]﻿, специфичному для действия этого диапазона: информация о методе '''HTTP''' и версии&lt;br /&gt;
&lt;br /&gt;
Активность будет автоматически установлена ​​как текущая и активная область до тех пор, пока поток выполнения не выйдет за пределы области действия текущего метода. Последующие активности автоматически станут дочерними областями.&lt;br /&gt;
&lt;br /&gt;
=== Сбор метрик ===&lt;br /&gt;
1. Для создания новых метрических инструментов нам сначала нужен объект метрики.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static readonly Meter meter = new Meter(&amp;quot;my-meter&amp;quot;, &amp;quot;1.0.0&amp;quot;);  //TODO Replace with the name of your meter&lt;br /&gt;
|}&lt;br /&gt;
2. С помощью &amp;lt;code&amp;gt;meter&amp;lt;/code&amp;gt; мы теперь можем создавать отдельные инструменты, например, метрики.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private static readonly Counter&amp;lt;long&amp;gt; counter = meter.CreateCounter&amp;lt;long&amp;gt;(&amp;quot;request_counter&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
3. Теперь мы можем вызвать метод &amp;lt;code&amp;gt;Add()&amp;lt;/code&amp;gt; для записи новых значений &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt; с помощью нашей метрики и сохранения дополнительных атрибутов (например, &amp;lt;code&amp;gt;action.type&amp;lt;/code&amp;gt;).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|counter.Add(1, new(&amp;quot;ip&amp;quot;, &amp;quot;an ip address here&amp;quot;), new(&amp;quot;some other key&amp;quot;, &amp;quot;some other value&amp;quot;));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Подключение логов ===&lt;br /&gt;
Используя переменную &amp;lt;code&amp;gt;loggerFactoryOT&amp;lt;/code&amp;gt;, которую мы инициализировали в разделе «'''Настройка'''», мы теперь можем создавать отдельные экземпляры регистратора, которые будут передавать регистрируемую информацию напрямую в настроенную конечную точку '''OpenTelemetry''' в Ключ-АСТРОМ.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|var logger = loggerFactoryOT.CreateLogger&amp;lt;Startup&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
services.AddSingleton&amp;lt;ILoggerFactory&amp;gt;(loggerFactoryOT);&lt;br /&gt;
&lt;br /&gt;
services.AddSingleton(logger);&lt;br /&gt;
&lt;br /&gt;
logger.LogInformation(eventId: 123, &amp;quot;Log line&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Обеспечение распространения контекста (необязательно) ===&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, '''REST''').&lt;br /&gt;
&lt;br /&gt;
Если вы используете автоматическое инструментирование и ваши сетевые библиотеки также им охватываются, то это будет автоматически реализовано библиотеками инструментирования. В противном случае ваш код должен это учитывать.&lt;br /&gt;
&lt;br /&gt;
==== Извлечение контекста при получении запроса ====&lt;br /&gt;
В следующем примере мы предполагаем, что получили сетевой вызов через &amp;lt;code&amp;gt;System.Web.HttpRequest&amp;lt;/code&amp;gt;, и определяем экземпляр &amp;lt;code&amp;gt;CompositeTextMapPropagator&amp;lt;/code&amp;gt; для извлечения контекстной информации из '''HTTP-заголовков'''. Затем мы передаем этот экземпляр в &amp;lt;code&amp;gt;Extract()&amp;lt;/code&amp;gt;, возвращая объект контекста, что позволяет нам продолжить предыдущую трассировку с нашими интервалами.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private CompositeTextMapPropagator propagator = new CompositeTextMapPropagator(new TextMapPropagator[] {&lt;br /&gt;
&lt;br /&gt;
    new TraceContextPropagator(),&lt;br /&gt;
&lt;br /&gt;
    new BaggagePropagator(),&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
private static readonly Func&amp;lt;HttpRequest, string, IEnumerable&amp;lt;string&amp;gt;&amp;gt; valueGetter = (request, name) =&amp;gt; request.Headers[name];&lt;br /&gt;
&lt;br /&gt;
var parentContext = propagator.Extract(default, HttpContext.Request, valueGetter);&lt;br /&gt;
&lt;br /&gt;
using var activity = MyActivitySource.StartActivity(&amp;quot;my-span&amp;quot;, ActivityKind.Consumer, parentContext.ActivityContext);&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Внедрение контекста при отправке запросов ====&lt;br /&gt;
В следующем примере мы отправляем '''REST-запрос''' к другой службе и предоставляем наш существующий контекст как часть '''HTTP-заголовков''' нашего запроса.&lt;br /&gt;
&lt;br /&gt;
Для этого мы определяем экземпляр &amp;lt;code&amp;gt;TextMapPropagator&amp;lt;/code&amp;gt;, который добавляет соответствующую информацию. После создания экземпляра '''REST-объекта''' мы передаём его вместе с контекстом и экземпляром сеттера в &amp;lt;code&amp;gt;Inject()&amp;lt;/code&amp;gt;, который добавит необходимые заголовки к запросу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|private CompositeTextMapPropagator propagator = new CompositeTextMapPropagator(new TextMapPropagator[] {&lt;br /&gt;
&lt;br /&gt;
    new TraceContextPropagator(),&lt;br /&gt;
&lt;br /&gt;
    new BaggagePropagator()&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
private static Action&amp;lt;HttpRequestMessage, string, string&amp;gt; _headerValueSetter =&amp;gt; (request, name, value) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
    request.Headers.Remove(name);&lt;br /&gt;
&lt;br /&gt;
    request.Headers.Add(name, value);&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
propagator.Inject(new PropagationContext(activity!.Context, Baggage.Current), request, _headerValueSetter);&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Настройка сбора данных в соответствии с требованиями конфиденциальности (необязательно) ==&lt;br /&gt;
Хотя Ключ-АСТРОМ автоматически собирает все атрибуты '''OpenTelemetry''', в веб-интерфейсе Ключ-АСТРОМ сохраняются и отображаются только значения атрибутов, указанные в списке разрешенных. Это предотвращает случайное сохранение персональных данных, позволяя вам соблюдать требования к конфиденциальности и контролировать объем хранимых данных мониторинга.&lt;br /&gt;
&lt;br /&gt;
Чтобы просматривать пользовательские атрибуты, необходимо сначала разрешить их использование в веб-интерфейсе Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
== Проверка загрузки данных в Ключ-АСТРОМ ==&lt;br /&gt;
После завершения инструментирования вашего приложения выполните несколько тестовых действий для создания и отправки демонстрационных трассировок, метрик и логов, а также проверьте, что они были правильно загружены в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать это для трассировок, перейдите в раздел '''Трассировки''' и выберите вкладку '''Распределенные трассировки'''. Если вы используете ЕдиныйАгент, выберите '''PurePaths''' .&lt;br /&gt;
&lt;br /&gt;
Для просмотра метрик и логов перейдите в раздел '''Метрики''' или '''Логов''' или '''Логи и события'''.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>