當前位置: 妍妍網 > 碼農

.NET 程式透過 OpenTelemetry Logs 對接 Seq

2024-05-18碼農

OpenTelemetry 簡介

OpenTelemetry 是一個由 CNCF(Cloud Native Computing Foundation)托管的開源計畫,旨在為觀察性(Observability)提供一套全面的工具,包括度量(Metrics)、日誌(Logs)和追蹤(Traces)。它的目標是為所有型別的遙測數據提供一種標準化的方法。OpenTelemetry 提供了一套 API 和 SDK,使得開發者可以在他們的應用程式中生成和收集遙測數據。此外,OpenTelemetry 還提供了一套收集器(Collector),可以接收、處理和匯出遙測數據,以便於後續的分析和視覺化。
本文不是用來介紹 OpenTelemetry 的,所以更多的細節就不提了。

OpenTelemetry 的優點

OpenTelemetry 的主要優點是其廣泛的相容性和靈活性。它支持多種程式語言,包括 Java、Python、Go、JavaScript 和 .NET 等。此外,它還可以與多種後端服務進行整合,包括但不限於 Prometheus、Jaeger、Zipkin 和 Grafana 等。

Otlp

總的來說 OpenTelemetry 最大的優點是他的 「標準化」。在數位的世界裏,標準才是王道,比如 TCP, Http。OpenTelemetry 定義了 Otlp(OpenTelemetry Protocol) 協定。透過 Otlp 對接其他元件。因為大家都知道市面上做觀測的產品有很多,有 Elastic APM 這種全家桶,有專註於 Traceing 的 Jaeger,有專註日誌的 loki 跟 Seq。
按照傳統,當我們要對接這些元件的時候我們需要匯入特定的包,這樣其實是讓我們的產品跟某個第三方的元件做了深度繫結。比如 AgileConfig 如果對接了 Seq,那麽當你想看日誌的時候你必須安裝一個 Seq。
但是現在使用 Otlp 的話,問題就不存在了。我們的應用程式不需要對接特定的三方元件。我們只需要對接 Otlp 就行了。因為他是標準的協定,所以只要是實作了 Otlp 協定的元件後面都可以很方便得跟應用程式做對接。
這一點對做公共元件的計畫非常有用。比如 AgileConfig 你不能要求使用者非要安裝一個 Seq。使用者的生產環境可能是 Elastic。

Seq

Seq 是一款使用現代化技術(.NET)構建的結構化日誌儲存,查詢,分析工具。比起 ELK 這種組合要輕量級許多。只需要一個安裝包就具有數據儲存,查詢,圖表分析功能。它對 windows 友好,直接提供了安裝包。當然也可以使用 docker 來部署。Seq 對於單個使用者是免費的,比較遺憾的是並不開源。Seq 一個比較強大的功能是提供了類似 Sql 語句的數據查詢及處理能力,使得使用者可以直接寫 Select from 來得到自己想要的數據。 我曾經在介紹微服務的時候寫過一篇介紹:


範例:在 .NET 中使用 OpenTelemetry logs 對接 Seq

下面讓我們來演示一下 .NET 計畫如何對接 OpenTelemetry。註意這次我們只演示如何對接 logs ,其他兩個 traces metrics 因為概念上有點復雜所以放到後面再說。
首先,我們需要在 .NET 計畫中安裝 OpenTelemetry。你可以透過 NuGet 包管理器來安裝。

  • 在你的計畫檔中添加以下包:

  • <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />

    以上我們可以看到我們並不依賴任何 Seq 相關的包。

  • 獲取 Seq 的 otlp logs endpoint,透過查詢 Seq 文件,得知 logs 的 endpoint 如下:

  • http://xxx:5341/ingest/otlp/v1/logs

  • 接下來,我們需要在 Program.cs 檔中配置 OpenTelemetry logs:

  • var builder = WebApplication.CreateBuilder(args);
    builder.Logging.AddOpenTelemetry(options =>
    {
    options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(builder.Environment.ApplicationName));
    options.IncludeScopes = true;
    options.AddOtlpExporter(otlpOptions =>
    {
    otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
    otlpOptions.Endpoint = new Uri("http://xxx:5341/ingest/otlp/v1/logs");
    });
    });

    現在,我們可以開始在 .NET 應用程式中記錄日誌了。

  • 你可以使用 ILogger 介面來記錄日誌,如下所示:

  • using Microsoft.AspNetCore.Mvc;
    namespace WebApplication2.Controllers
    {
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
    private static readonly string[] Summaries = new[]
    {
    "Freezing""Bracing""Chilly""Cool""Mild""Warm""Balmy""Hot""Sweltering""Scorching"
    };
    private readonly ILogger<WeatherForecastController> _logger;
    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
    _logger = logger;
    }
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
    _logger.LogInformation("Hi......");
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
    Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
    TemperatureC = Random.Shared.Next(-20, 55),
    Summary = Summaries[Random.Shared.Next(Summaries.Length)]
    })
    .ToArray();
    }
    }
    }



    每次存取介面的時候我們都可以在 Seq 裏查詢到對應的日誌內容。這說明透過 Otlp 對接 Seq 成功了。

    總結

    透過使用 OpenTelemetry,你可以輕松地收集和分析你的應用程式的遙測數據,從而更好地理解和最佳化你的應用程式的效能和行為。OpenTelemetry 提供了一套通用的傳輸協定 Otlp。這可以使我們做設計跟開發產品或計畫的時候輕松跟第三方可觀測元件進行解耦。

    關註我的公眾號一起玩轉技術