OpenTelemetry 是一个由 CNCF(Cloud Native Computing Foundation)托管的开源项目,旨在为观察性(Observability)提供一套全面的工具,包括度量(Metrics)、日志(Logs)和追踪(Traces)。它的目标是为所有类型的遥测数据提供一种标准化的方法。
OpenTelemetry 提供了一套 API 和 SDK,使得开发者可以在他们的应用程序中生成和收集遥测数据。此外,OpenTelemetry 还提供了一套收集器(Collector),可以接收、处理和导出遥测数据,以便于后续的分析和可视化。
本文不是用来介绍 OpenTelemetry 的,所以更多的细节就不提了。
OpenTelemetry 的主要优点是其广泛的兼容性和灵活性。它支持多种编程语言,包括 Java、Python、Go、JavaScript 和 .NET 等。此外,它还可以与多种后端服务进行集成,包括但不限于 Prometheus、Jaeger、Zipkin 和 Grafana 等。
总的来说 OpenTelemetry 最大的优点是他的 “标准化”。在数字的世界里,标准才是王道,比如 TCP, Http。OpenTelemetry 定义了 Otlp(OpenTelemetry Protocol) 协议。通过 Otlp 对接其他组件。因为大家都知道市面上做观测的产品有很多,有 Elastic APM 这种全家桶,有专注于 Traceing 的 Jaeger,有专注日志的 loki 跟 Seq。
按照传统,当我们要对接这些组件的时候我们需要导入特定的包,这样其实是让我们的产品跟某个第三方的组件做了深度绑定。比如 AgileConfig 如果对接了 Seq,那么当你想看日志的时候你必须安装一个 Seq。
但是现在使用 Otlp 的话,问题就不存在了。我们的应用程序不需要对接特定的三方组件。我们只需要对接 Otlp 就行了。因为他是标准的协议,所以只要是实现了 Otlp 协议的组件后面都可以很方便的跟应用程序做对接。
这一点对做公共组件的项目非常有用。比如 AgileConfig 你不能要求用户非要安装一个 Seq。用户的生产环境可能是 Elastic。
Seq 是一款使用现代化技术(.NET)构建的结构化日志存储,查询,分析工具。比起 ELK 这种组合要轻量级许多。只需要一个安装包就具有数据存储,查询,图表分析功能。它对 windows 友好,直接提供了安装包。当然也可以使用 docker 来部署。Seq 对于单个用户是免费的,比较遗憾的是并不开源。Seq 一个比较强大的功能是提供了类似 Sql 语句的数据查询及处理能力,使得用户可以直接写 Select from 来得到自己想要的数据。
下面让我们来演示一下 .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 相关的包。
http://xxx:5341/ingest/otlp/v1/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 应用程序中记录日志了。
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。这可以使我们做设计跟开发产品或项目的时候轻松跟第三方可观测组件进行解耦。