# Початок роботи

> Отримайте телеметрію для вашого застосунку менш ніж за 5 хвилин!

---

LLMS index: [llms.txt](/llms.txt)

---

Ця сторінка покаже вам, як почати роботу з автоматичним інструментуванням OpenTelemetry .NET.

Якщо ви шукаєте спосіб вручну інструментувати ваш застосунок, перегляньте [цей посібник](/docs/languages/dotnet/getting-started).

Ви дізнаєтеся, як можна автоматично інструментувати простий .NET застосунок, так, щоб [трейси][], [метрики][] та [логи][] виводилися в консоль.

## Попередні вимоги {#prerequisites}

Переконайтеся, що у вас встановлено:

- [.NET SDK](https://dotnet.microsoft.com/download/dotnet) 6+

## Демонстраційний застосунок {#example-application}

Наступний приклад використовує базовий [Мінімальний API з ASP.NET Core](https://learn.microsoft.com/aspnet/core/tutorials/min-web-api) застосунок. Якщо ви не використовуєте ASP.NET Core, це не проблема — ви все одно можете використовувати автоматичне інструментування OpenTelemetry .NET.

Для складніших випадків дивіться [приклади](/docs/languages/net/examples/).

### Створення та запуск HTTP сервера {#create-and-launch-an-http-server}

Для початку створіть нову теку з назвою `dotnet-simple`. У цій теці виконайте наступну команду:

```sh
dotnet new web
```

У тій же теці замініть вміст файлу `Program.cs` наступним кодом:

```csharp
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var logger = app.Logger;

int RollDice()
{
    return Random.Shared.Next(1, 7);
}

string HandleRollDice(string? player)
{
    var result = RollDice();

    if (string.IsNullOrEmpty(player))
    {
        logger.LogInformation("Anonymous player is rolling the dice: {result}", result);
    }
    else
    {
        logger.LogInformation("{player} is rolling the dice: {result}", player, result);
    }

    return result.ToString(CultureInfo.InvariantCulture);
}

app.MapGet("/rolldice/{player?}", HandleRollDice);

app.Run();
```

У вкладеній теці `Properties` замініть вміст файлу `launchSettings.json` на наступний:

```json
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:8080",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
```

Зберіть та запустіть застосунок за допомогою наступної команди, потім відкрийте <http://localhost:8080/rolldice> у вашому вебоглядачі, щоб переконатися, що він працює.

```sh
dotnet build
dotnet run
```

## Інструментування {#instrumentation}

Далі ви будете використовувати [автоматичне інструментування OpenTelemetry .NET](../) застосунку під час запуску. Хоча ви можете [налаштувати автоматичне інструментування .NET][configure .NET Automatic Instrumentation] різними способами, нижче наведені кроки для Unix-shell або PowerShell скриптів.

> **Примітка**: Команди PowerShell вимагають підвищених (адміністративних) привілеїв.

1. Завантажте скрипти встановлення з [Releases][] репозиторію `opentelemetry-dotnet-instrumentation`:

      <ul class="nav nav-tabs" id="tabs-0" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
          data-td-tp-persist="unix-shell" aria-controls="tabs-00-00" aria-selected="true">
        Unix-shell
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
          data-td-tp-persist="powershell" aria-controls="tabs-00-01" aria-selected="false">
        PowerShell
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-0-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl -L -O https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$module_url</span> <span class="p">=</span> <span class="s2">&#34;https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/OpenTelemetry.DotNet.Auto.psm1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$download_path</span> <span class="p">=</span> <span class="nb">Join-Path</span> <span class="nv">$env:temp</span> <span class="s2">&#34;OpenTelemetry.DotNet.Auto.psm1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Invoke-WebRequest</span> <span class="n">-Uri</span> <span class="nv">$module_url</span> <span class="n">-OutFile</span> <span class="nv">$download_path</span> <span class="n">-UseBasicParsing</span>
</span></span></code></pre></div>
    </div>
</div>


2. Виконайте наступний скрипт для завантаження автоматичного інструментування для вашого середовища розробки:

      <ul class="nav nav-tabs" id="tabs-1" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
          data-td-tp-persist="unix-shell" aria-controls="tabs-01-00" aria-selected="true">
        Unix-shell
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
          data-td-tp-persist="powershell" aria-controls="tabs-01-01" aria-selected="false">
        PowerShell
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-1-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">./otel-dotnet-auto-install.sh
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Import-Module</span> <span class="nv">$download_path</span>
</span></span><span class="line"><span class="cl"><span class="nb">Install-OpenTelemetryCore</span>
</span></span></code></pre></div>
    </div>
</div>


3. Встановіть та експортуйте змінні, що вказують на [консольний експортер][], потім виконайте скрипт, що налаштовує інші необхідні змінні середовища, використовуючи нотацію, відповідну для вашого shell/терміналу &mdash; ми ілюструємо нотацію для bash-подібних shell та PowerShell:

      <ul class="nav nav-tabs" id="tabs-2" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
          data-td-tp-persist="unix-shell" aria-controls="tabs-02-00" aria-selected="true">
        Unix-shell
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
          data-td-tp-persist="powershell" aria-controls="tabs-02-01" aria-selected="false">
        PowerShell
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-2-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">OTEL_TRACES_EXPORTER</span><span class="o">=</span>console <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">OTEL_METRICS_EXPORTER</span><span class="o">=</span>console <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="nv">OTEL_LOGS_EXPORTER</span><span class="o">=</span>console
</span></span><span class="line"><span class="cl">  <span class="nv">OTEL_SERVICE_NAME</span><span class="o">=</span>RollDiceService
</span></span><span class="line"><span class="cl">. <span class="nv">$HOME</span>/.otel-dotnet-auto/instrument.sh
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$env:OTEL_TRACES_EXPORTER</span><span class="p">=</span><span class="s2">&#34;console&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$env:OTEL_METRICS_EXPORTER</span><span class="p">=</span><span class="s2">&#34;console&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$env:OTEL_LOGS_EXPORTER</span><span class="p">=</span><span class="s2">&#34;console&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Register-OpenTelemetryForCurrentSession</span> <span class="n">-OTelServiceName</span> <span class="s2">&#34;RollDiceService&#34;</span>
</span></span></code></pre></div>
    </div>
</div>


4. Запустіть ваш **застосунок** ще раз:

   ```sh
   dotnet run
   ```

   Зверніть увагу на вивід з `dotnet run`.

5. З _іншого_ терміналу, надішліть запит за допомогою `curl`:

   ```sh
   curl localhost:8080/rolldice
   ```

6. Через приблизно 30 секунд зупиніть процес сервера.

На цьому етапі ви повинні побачити вивід трейсів та логів з сервера та клієнта, який виглядає приблизно так (вивід перенесено для зручності читання):

<details>
<summary>Трейси та Логи</summary>

```log
LogRecord.Timestamp:               2023-08-14T06:44:53.9279186Z
LogRecord.TraceId:                 3961d22b5f90bf7662ad4933318743fe
LogRecord.SpanId:                  93d5fcea422ff0ac
LogRecord.TraceFlags:              Recorded
LogRecord.CategoryName:            simple-dotnet
LogRecord.LogLevel:                Information
LogRecord.StateValues (Key:Value):
    result: 1
    OriginalFormat (a.k.a Body): Anonymous player is rolling the dice: {result}

Resource associated with LogRecord:
service.name: simple-dotnet
telemetry.auto.version: 0.7.0
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.4.0.802

info: simple-dotnet[0]
      Anonymous player is rolling the dice: 1
Activity.TraceId:            3961d22b5f90bf7662ad4933318743fe
Activity.SpanId:             93d5fcea422ff0ac
Activity.TraceFlags:         Recorded
Activity.ActivitySourceName: OpenTelemetry.Instrumentation.AspNetCore
Activity.DisplayName:        /rolldice
Activity.Kind:               Server
Activity.StartTime:          2023-08-14T06:44:53.9278162Z
Activity.Duration:           00:00:00.0049754
Activity.Tags:
    net.host.name: localhost
    net.host.port: 8080
    http.method: GET
    http.scheme: http
    http.target: /rolldice
    http.url: http://localhost:8080/rolldice
    http.flavor: 1.1
    http.user_agent: curl/8.0.1
    http.status_code: 200
Resource associated with Activity:
    service.name: simple-dotnet
    telemetry.auto.version: 0.7.0
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.4.0.802
```

</details>

Також при зупинці сервера ви повинні побачити вивід всіх зібраних метрик (приклад уривка показано):

<details>
<summary>Метрики</summary>

```log
Export process.runtime.dotnet.gc.collections.count, Number of garbage collections that have occurred since process start., Meter: OpenTelemetry.Instrumentation.Runtime/1.1.0.2
(2023-08-14T06:12:05.8500776Z, 2023-08-14T06:12:23.7750288Z] generation: gen2 LongSum
Value: 2
(2023-08-14T06:12:05.8500776Z, 2023-08-14T06:12:23.7750288Z] generation: gen1 LongSum
Value: 2
(2023-08-14T06:12:05.8500776Z, 2023-08-14T06:12:23.7750288Z] generation: gen0 LongSum
Value: 6

...

Export http.client.duration, Measures the duration of outbound HTTP requests., Unit: ms, Meter: OpenTelemetry.Instrumentation.Http/1.0.0.0
(2023-08-14T06:12:06.2661140Z, 2023-08-14T06:12:23.7750388Z] http.flavor: 1.1 http.method: POST http.scheme: https http.status_code: 200 net.peer.name: dc.services.visualstudio.com Histogram
Value: Sum: 1330.4766000000002 Count: 5 Min: 50.0333 Max: 465.7936
(-Infinity,0]:0
(0,5]:0
(5,10]:0
(10,25]:0
(25,50]:0
(50,75]:2
(75,100]:0
(100,250]:0
(250,500]:3
(500,750]:0
(750,1000]:0
(1000,2500]:0
(2500,5000]:0
(5000,7500]:0
(7500,10000]:0
(10000,+Infinity]:0
```

</details>

## Що далі? {#whats-next}

Докладніше:

- Щоб налаштувати експортери, семплери, ресурси та інше, дивіться [Конфігурація та налаштування](../configuration)
- Дивіться список [доступного інструментування](../instrumentations)
- Якщо ви хочете поєднати автоматичне та ручне інструментування, дізнайтеся, як ви [можете створювати власні трейси та метрики](../custom)
- Якщо у вас виникли проблеми, перегляньте [Посібник з усунення несправностей](../troubleshooting)

[трейси]: /docs/concepts/signals/traces/
[метрики]: /docs/concepts/signals/metrics/
[логи]: /docs/concepts/signals/logs/
[configure .NET Automatic Instrumentation]: ../configuration
[консольний експортер]: https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/blob/main/docs/config.md#internal-logs
[releases]: https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases
