<?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=Erlang_OpenTelemetry</id>
	<title>Erlang OpenTelemetry - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=Erlang_OpenTelemetry"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=Erlang_OpenTelemetry&amp;action=history"/>
	<updated>2026-05-02T12:05:58Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=Erlang_OpenTelemetry&amp;diff=5862&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «В этом пошаговом руководстве показано, как добавить наблюдаемость в ваше приложение '''Erl...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=Erlang_OpenTelemetry&amp;diff=5862&amp;oldid=prev"/>
		<updated>2025-10-15T15:55:03Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «В этом пошаговом руководстве показано, как добавить наблюдаемость в ваше приложение &amp;#039;&amp;#039;&amp;#039;Erl...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В этом пошаговом руководстве показано, как добавить наблюдаемость в ваше приложение '''Erlang''' с помощью библиотек и инструментов '''OpenTelemetry''' '''Erlang'''.&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;
=== Определение базового URL API ===&lt;br /&gt;
Подробную информацию о том, как собрать базовый '''URL-адрес''' конечной точки '''OTLP''', см. в разделе [[Экспорт с помощью OTLP]].&lt;br /&gt;
&lt;br /&gt;
'''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;
== Настройка OpenTelemetry ==&lt;br /&gt;
1. Добавьте текущие версии следующих [https://hex.pm/packages?search=opentelemetry&amp;amp;sort=recent_downloads зависимостей]﻿ в &amp;lt;code&amp;gt;rebar.config&amp;lt;/code&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{deps, [&lt;br /&gt;
&lt;br /&gt;
  %TODO add any additional dependancies here&lt;br /&gt;
&lt;br /&gt;
  opentelemetry_api,&lt;br /&gt;
&lt;br /&gt;
  opentelemetry,&lt;br /&gt;
&lt;br /&gt;
  opentelemetry_exporter&lt;br /&gt;
&lt;br /&gt;
]}.&lt;br /&gt;
|}&lt;br /&gt;
2. Добавьте следующие зависимости в ваш файл &amp;lt;code&amp;gt;.app.src&amp;lt;/code&amp;gt; в каталоге &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{applications, [kernel,&lt;br /&gt;
&lt;br /&gt;
                stdlib,&lt;br /&gt;
&lt;br /&gt;
                opentelemetry_api,&lt;br /&gt;
&lt;br /&gt;
                opentelemetry,&lt;br /&gt;
&lt;br /&gt;
                opentelemetry_exporter]}&lt;br /&gt;
|}&lt;br /&gt;
3. Добавьте следующую конфигурацию &amp;lt;code&amp;gt;config/sys.config&amp;lt;/code&amp;gt; и замените &amp;lt;code&amp;gt;[URL]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[TOKEN]&amp;lt;/code&amp;gt; соответствующими значениями для '''URL-адреса''' Ключ-АСТРОМ и токена доступа .&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[&lt;br /&gt;
&lt;br /&gt;
  {otel_getting_started, []},&lt;br /&gt;
&lt;br /&gt;
  {opentelemetry,&lt;br /&gt;
&lt;br /&gt;
    [{span_processor, batch},&lt;br /&gt;
&lt;br /&gt;
      {traces_exporter, otlp},&lt;br /&gt;
&lt;br /&gt;
      {resource,&lt;br /&gt;
&lt;br /&gt;
        [{service,&lt;br /&gt;
&lt;br /&gt;
          #{name =&amp;gt; &amp;quot;erlang-quickstart&amp;quot;, version =&amp;gt; &amp;quot;1.0.1&amp;quot;} %%TODO Replace with the name and version of your application&lt;br /&gt;
&lt;br /&gt;
        }]&lt;br /&gt;
&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      {resource_detectors, [&lt;br /&gt;
&lt;br /&gt;
        otel_resource_env_var,&lt;br /&gt;
&lt;br /&gt;
        otel_resource_app_env,&lt;br /&gt;
&lt;br /&gt;
        extra_metadata&lt;br /&gt;
&lt;br /&gt;
      ]}&lt;br /&gt;
&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  {opentelemetry_exporter,&lt;br /&gt;
&lt;br /&gt;
    [{otlp_protocol, http_protobuf},&lt;br /&gt;
&lt;br /&gt;
      {otlp_traces_endpoint, &amp;quot;[URL]&amp;quot;}, %%TODO Replace [URL] to your SaaS/Managed URL as mentioned in the next step&lt;br /&gt;
&lt;br /&gt;
      {otlp_headers, [{&amp;quot;Authorization&amp;quot;, &amp;quot;Api-Token [TOKEN]&amp;quot;}]} %%TODO Replace [TOKEN] with your API Token as mentioned in the next step&lt;br /&gt;
&lt;br /&gt;
    ]}&lt;br /&gt;
&lt;br /&gt;
].&lt;br /&gt;
|}&lt;br /&gt;
4. Сохраните следующий код в &amp;lt;code&amp;gt;src/extra_metadata.erl&amp;lt;/code&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-module(extra_metadata).&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-behaviour(otel_resource_detector).&lt;br /&gt;
&lt;br /&gt;
-export([get_resource/1]).&lt;br /&gt;
&lt;br /&gt;
get_resource(_) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Metadata = otel_resource:create(otel_resource_app_env:parse(get_metadata(&amp;quot;/var/lib/astromkey/enrichment/dt_metadata.properties&amp;quot;)), []),&lt;br /&gt;
&lt;br /&gt;
    {ok, MetadataFilePath} = file:read_file(&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
    Metadata2 = otel_resource:create(otel_resource_app_env:parse(get_metadata(MetadataFilePath)), []),&lt;br /&gt;
&lt;br /&gt;
    Metadata3 = otel_resource:create(otel_resource_app_env:parse(get_metadata(&amp;quot;/var/lib/astromkey/enrichment/dt_host_metadata.properties&amp;quot;)), []),&lt;br /&gt;
&lt;br /&gt;
    otel_resource:merge(otel_resource:merge(Metadata, Metadata2), Metadata3),&lt;br /&gt;
&lt;br /&gt;
    otel_resource:merge(Metadata, Metadata2).&lt;br /&gt;
&lt;br /&gt;
get_metadata(FileName) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
    {ok, MetadataFile} = file:read_file(FileName),&lt;br /&gt;
&lt;br /&gt;
    Lines = binary:split(MetadataFile, &amp;lt;&amp;lt;&amp;quot;\n&amp;quot;&amp;gt;&amp;gt;, [trim, global]),&lt;br /&gt;
&lt;br /&gt;
    make_tuples(Lines, [])&lt;br /&gt;
&lt;br /&gt;
catch _:_ -&amp;gt; &amp;quot;Metadata not found, safe to continue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
make_tuples([Line|Lines], Acc) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    [Key, Value] = binary:split(Line, &amp;lt;&amp;lt;&amp;quot;=&amp;quot;&amp;gt;&amp;gt;),&lt;br /&gt;
&lt;br /&gt;
    make_tuples(Lines, [{Key, Value}|Acc]);&lt;br /&gt;
&lt;br /&gt;
make_tuples([], Acc) -&amp;gt; Acc.&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;
&lt;br /&gt;
=== Добавление трассировки ===&lt;br /&gt;
Спектры запускаются с помощью макроса и принимают необязательный список атрибутов, а также блок кода для этого span. Спектры автоматически завершатся после возврата управления из блока кода &amp;lt;code&amp;gt;[https://hexdocs.pm/opentelemetry_api/OpenTelemetry.Tracer.html#with_span/3 with_span]&amp;lt;/code&amp;gt;.﻿&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-export([init/2]).&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-include_lib(&amp;quot;opentelemetry_api/include/otel_tracer.hrl&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
-include_lib(&amp;quot;opentelemetry/include/otel_resource.hrl&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
init( Req, State ) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ?with_span(&amp;lt;&amp;lt;&amp;quot;parent_span&amp;quot;&amp;gt;&amp;gt;, #{attributes =&amp;gt; [ %%TODO Add span name&lt;br /&gt;
&lt;br /&gt;
      {&amp;lt;&amp;lt;&amp;quot;my-key-1&amp;quot;&amp;gt;&amp;gt;, &amp;lt;&amp;lt;&amp;quot;my-value-1&amp;quot;&amp;gt;&amp;gt;}] %%TODO Add attributes at span creation&lt;br /&gt;
&lt;br /&gt;
    }, fun child_function/1),&lt;br /&gt;
&lt;br /&gt;
    %% Your code goes here&lt;br /&gt;
&lt;br /&gt;
child_function(_SpanCtx) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ?with_span(&amp;lt;&amp;lt;&amp;quot;child_span&amp;quot;&amp;gt;&amp;gt;, #{},&lt;br /&gt;
&lt;br /&gt;
               fun(_ChildSpanCtx) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                ?set_attributes([{&amp;lt;&amp;lt;&amp;quot;child-key-1&amp;quot;&amp;gt;&amp;gt;, &amp;lt;&amp;lt;&amp;quot;child-value-1&amp;quot;&amp;gt;&amp;gt;}]) %%TODO Add attributes after span creation&lt;br /&gt;
&lt;br /&gt;
               end).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сбор метрик ===&lt;br /&gt;
Примера пока нет, поскольку '''OpenTelemetry''' для '''Erlang''' пока не имеет стабильной поддержки метрик.&lt;br /&gt;
&lt;br /&gt;
=== Подключение логов ===&lt;br /&gt;
Примера пока нет, поскольку '''OpenTelemetry''' для '''Erlang''' пока не имеет стабильной поддержки логов.&lt;br /&gt;
&lt;br /&gt;
В зависимости от статуса '''OpenTelemetry''' '''SDK''' предварительная версия может уже разрешать прием ваших логов.&lt;br /&gt;
&lt;br /&gt;
=== Обеспечение распространения контекста (необязательно) ===&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, '''REST''').&lt;br /&gt;
&lt;br /&gt;
==== Извлечение контекста при получении запроса ====&lt;br /&gt;
Для извлечения информации о существующем контексте мы передаем заголовки функции &amp;lt;code&amp;gt;otel_propagator_text_map.extract&amp;lt;/code&amp;gt;, которая анализирует предоставленную заголовками контекстную информацию и устанавливает текущий контекст на ее основе.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|%% Get Headers from incoming request&lt;br /&gt;
&lt;br /&gt;
Headers = maps:get(headers, Req),&lt;br /&gt;
&lt;br /&gt;
otel_propagator_text_map:extract(maps:to_list(Headers)),&lt;br /&gt;
&lt;br /&gt;
SpanCtx = ?start_span(&amp;lt;&amp;lt;&amp;quot;span-name&amp;quot;&amp;gt;&amp;gt;),&lt;br /&gt;
&lt;br /&gt;
%% As we used `otel_propagator_text_map` the current context is from the parent span&lt;br /&gt;
&lt;br /&gt;
Ctx = otel_ctx:get_current(),&lt;br /&gt;
&lt;br /&gt;
proc_lib:spawn_link(fun() -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    %% Start span and set as current&lt;br /&gt;
&lt;br /&gt;
    otel_ctx:attach(Ctx),&lt;br /&gt;
&lt;br /&gt;
    ?set_current_span(SpanCtx),&lt;br /&gt;
&lt;br /&gt;
    %% Create response&lt;br /&gt;
&lt;br /&gt;
    Resp = cowboy_req:reply(&lt;br /&gt;
&lt;br /&gt;
        200,&lt;br /&gt;
&lt;br /&gt;
        #{&amp;lt;&amp;lt;&amp;quot;content-type&amp;quot;&amp;gt;&amp;gt; =&amp;gt; &amp;lt;&amp;lt;&amp;quot;application/json&amp;quot;&amp;gt;&amp;gt;},&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;&amp;lt;&amp;quot;{\&amp;quot;message\&amp;quot;: \&amp;quot;hello world\&amp;quot;}&amp;quot;&amp;gt;&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
        Req&lt;br /&gt;
&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
    {ok, Resp, State},&lt;br /&gt;
&lt;br /&gt;
    ?end_span(SpanCtx)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Внедрение контекста при отправке запросов ====&lt;br /&gt;
В следующем примере мы используем &amp;lt;code&amp;gt;otel_propagator_text_map:inject&amp;lt;/code&amp;gt; для предоставления заголовков '''HTTP''' (необходимых для распространения контекста) в &amp;lt;code&amp;gt;NewHeaders&amp;lt;/code&amp;gt;, которые мы в конечном итоге объединяем с существующим объектом заголовка &amp;lt;code&amp;gt;Headers&amp;lt;/code&amp;gt; и передаем в вызов &amp;lt;code&amp;gt;httpc:request&amp;lt;/code&amp;gt;, что позволяет принимающей конечной точке продолжить трассировку с предоставленной информацией.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|?with_span(&amp;lt;&amp;lt;&amp;quot;span-name&amp;quot;&amp;gt;&amp;gt;, #{},&lt;br /&gt;
&lt;br /&gt;
    fun(_ChildSpanCtx) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        %% A custom header example&lt;br /&gt;
&lt;br /&gt;
        Headers = [{&amp;quot;content-type&amp;quot;, &amp;quot;application/json&amp;quot;}, {&amp;quot;X-Custom-Header&amp;quot;, &amp;quot;some-value&amp;quot;}],&lt;br /&gt;
&lt;br /&gt;
        %% We convert the traceparent information and merge the 2 headers as&lt;br /&gt;
&lt;br /&gt;
        %% Httpc:request requires tuples of strings&lt;br /&gt;
&lt;br /&gt;
        Tmp = [],&lt;br /&gt;
&lt;br /&gt;
        NewHeaders = headers_list(otel_propagator_text_map:inject(opentelemetry:get_text_map_injector(), Tmp)),&lt;br /&gt;
&lt;br /&gt;
        MergedHeaders = lists:append(Headers, NewHeaders),&lt;br /&gt;
&lt;br /&gt;
        {ok, Res} = httpc:request(get, {URL, MergedHeaders}, [], []),&lt;br /&gt;
&lt;br /&gt;
        io:format(&amp;quot;Response: ~p~n&amp;quot;, [Res])&lt;br /&gt;
&lt;br /&gt;
    end).&lt;br /&gt;
&lt;br /&gt;
headers_list(Headers) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    [{binary_to_list(Name), binary_to_list(Value)} || {Name, Value} &amp;lt;- Headers].&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>