.NET程序对接 OpenTelemetry logs

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,其他两个 tracesmetrics 因为概念上有点复杂所以放到后面再说。

首先,我们需要在 .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。这可以使我们做设计跟开发产品或项目的时候轻松跟第三方可观测组件进行解耦。

关注我的公众号一起玩转技术

相关推荐
黑贝是条狗3 天前
对.net 的改变
.net core
小吴同学·8 天前
NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL
中间件·c#·.net·.netcore·.net core
坐望云起9 天前
ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新
前端·后端·asp.net·mvc·.net core·razor pages
西京刀客10 天前
云原生之开源遥测框架OpenTelemetry(在 Gin 框架中使用 OpenTelemetry 进行分布式追踪和监控)
gin·trace·可观测性·opentelemetry
代码拾光21 天前
.NET Core 中如何实现缓存的预热?
.net core
EdisonZhou1 个月前
基于Microsoft.Extensions.AI核心库实现RAG应用
llm·aigc·.net core
时光追逐者1 个月前
一个开源且免费的 .NET CMS 和应用程序框架
开源·c#·.net·cms·.net core
EdisonZhou1 个月前
基于Microsoft.Extensions.VectorData实现语义搜索
llm·aigc·.net core
时光追逐者1 个月前
推荐几款开源免费的 .NET MAUI 组件库
microsoft·开源·c#·.net·.net core·maui