1. 什么是 OpenObserve?

  • OpenObserve 是一个开源的可观测性平台(支持日志、指标、追踪),旨在成为 Elasticsearch/Datadog 的轻量级替代方案。

  • 它支持通过 OpenTelemetry(OTLP)协议接收数据。

2. 搭建 OpenObserve

  • docker 本地运行或部署 OpenObserve(参考 官方文档):

  • docker run -d --name openobserve -p 5080:5080 -e ZO_ROOT_USER_EMAIL="root@example.com" -e ZO_ROOT_USER_PASSWORD="root123" public.ecr.aws/zinclabs/openobserve:latest

  • 访问 http://localhost:5080(默认账号:root@example.com,密码:root123)。

3. .NET Core 的 OpenTelemetry 配置

  • 安装必要的 NuGet 包:

    <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.10.0" />
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.10.0" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.10.0" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.10.0" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.10.0" />

4. 在 .NET Core 中配置 OpenTelemetry

var builder = WebApplication.CreateBuilder(args);
//base
var credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes("root@example.com:root123"));
// 配置OpenTelemetry 日志Log
builder.Logging.ClearProviders(); var resourceBuilder = ResourceBuilder.CreateDefault()
.AddService("xxxapi")
.AddAttributes(new Dictionary<string, object>
{
["environment"] = "development",
["service.version"] = "1.0.0"
}); builder.Logging.AddOpenTelemetry(logging => {
logging.IncludeFormattedMessage = true;
logging.SetResourceBuilder(resourceBuilder)
.AddConsoleExporter() // Keep console logging for debugging
.AddOtlpExporter(otlpOptions => {
otlpOptions.BatchExportProcessorOptions = new BatchExportProcessorOptions<Activity>
{
MaxQueueSize = 100, // 减小队列避免堆积
MaxExportBatchSize = 10, // 减小批量大小
ScheduledDelayMilliseconds = 500, // 更频繁导出
};
otlpOptions.Endpoint = new Uri("http://localhost:5080/api/default/v1/logs");
otlpOptions.Headers = $"Authorization=Basic {credentials}";
otlpOptions.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;
});
}); // Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "xxx API", Version = "v1" });
});
builder.Services.AddHttpClient(); // 配置 OpenTelemetry 追踪Tracing
builder.Services.AddOpenTelemetry()
.WithTracing(builder => builder
.SetResourceBuilder(resourceBuilder)
.AddSource("xxxapi")
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddOtlpExporter(opts =>
{
opts.Endpoint = new Uri("http://localhost:5080/api/default/v1/traces");
opts.Headers = $"Authorization=Basic {credentials}";
opts.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf;
})); var app = builder.Build(); // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "xxx API v1"));
} app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers(); app.Run();

5. 关键细节

  • OTLP 端点:OpenObserve 使用 /api/default/接收 OTLP 数据。

  • 认证:默认使用基本认证(账号 root@example.com,密码 root123)。需将凭据编码为 Base64:

    // 将 "root@example.com:root123" 转为 Base64
    var credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes("root@example.com:root123"));
    opt.Headers = $"Authorization=Basic {credentials}";
  • 数据类型:上述配置会向 OpenObserve 发送追踪(Traces)、指标(Metrics)和日志(Logs)。

6. 在 OpenObserve 中验证数据

  • 访问 http://localhost:5080

    • 日志:在 Logs Explorer 中查看。

    • 追踪:在 Traces Explorer 中查看。

    • 指标:在 Metrics Explorer 中查看。

7. 故障排除

  • 确保 OpenObserve 正在运行。

  • 检查 OTLP 端点和认证头是否正确。

  • 启用 OpenTelemetry 的诊断输出(调试用):

    logging.AddConsoleExporter() //将追踪数据输出到控制台

    tracing.AddConsoleExporter() //将追踪数据输出到控制台

     

更多参考:

.net core-利用OpenObserve 实现OpenTelemetry可观测性标准(Logs,Traces,Metrics)的更多相关文章

  1. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

    前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...

  2. EF Core利用Transaction对数据进行回滚保护

    What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...

  3. ASP.NET Core - 利用Windsor Castle实现通用注册

    问题引入 在ASP.NET Core - 依赖注入这篇文章里面,我们知道了如何利用ASP.NET Core原生的容器来实现依赖注入的,那我们为什么要替换掉默认的 IoC容器呢?从ASP.NET Cor ...

  4. .net core 利用日志查看ef生成的SQL语句

    EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...

  5. EF Core创建实体的Code First标准方法

    针对关系型数据库,实体之间的关系最常见的就是通过外键关联的一对一.一对多和多对多的关系,新的EF Core通过注释和Fluent API 能够做到接近于数据库通过DML创建模型的效果了.实际上,通过D ...

  6. .net core利用MySqlBulkLoader大数据批量导入MySQL

    最近用core写了一个数据迁移小工具,从SQLServer读取数据,加工后导入MySQL,由于数据量太过庞大,数据表都过百万,常用的dapper已经无法满足.三大数据库都有自己的大数据批量导入数据的方 ...

  7. 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件

    背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...

  8. .Net Core利用反射动态加载类库的方法(解决类库不包含Nuget依赖包的问题)

    在.Net Framework时代,生成类库只需将类库项目编译好,然后拷贝到其他项目,即可引用或动态加载,相对来说,比较简单.但到了.Net Core时代,动态加载第三方类库,则稍微麻烦一些. 一.类 ...

  9. .NET Core 利用委托进行动态流程组装

    引言 在看.NET Core 源码的管道模型中间件(Middleware)部分,觉得这个流程组装,思路挺好的,于是就分享给大家.本次代码实现就直接我之前写的动态代理实现AOP的基础上直接改了,就不另起 ...

  10. .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载

    在.net core中所有的请求都会被请求中间件所处理,所以我们可以通过在中间件里边添加对应的功能然后在服务中添加注入来实现对应的功能 文件位置:Startup.cs=>Configure方法, ...

随机推荐

  1. .NET 中管理 Web API 文档的两种方式

    前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性.可维护性和一致性的关键.今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学. ...

  2. c# WPF convert photo to Sketch effects

    using the online website https://imagetosketch.com/ <Window x:Class="WpfMosaic.PhotoSketchWi ...

  3. CentOS扩容boot分区并升级内核

    本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swa ...

  4. Kotlin:【List集合】安全索引取值函数、可变列表、mutator函数、removeIf函数、list集合遍历、解构(过滤不需要的元素赋值)

  5. FastReport实现遍历Dataset数据集计算

    delphi在使用fastreport进行打印时,需要对数据进行计算求和. 在打印文本框的OnBeforePrint事件中进行以下代码即可实现效果 procedure Memo7OnBeforePri ...

  6. react中类似vue的插槽this.props.children的用法

    父组件 <TestHanderClick bg="blue"> <p> 如果我要显示的话,父组件是双标签,子组件中有this.props.children& ...

  7. 【译】MongoDB EF Core 提供程序:有什么新功能?

    原文 | Rishit, Luce 翻译 | 郑子铭 这是 Rishit Bhatia 和 Luce Carter 的客座文章.Rishit 是 MongoDB 的高级产品经理,专注于 .NET 开发 ...

  8. MTV和MVC模式,初识模板

    MTV和MVC模式,初识模板1.MTV和MVC模式:分层级进行管理 说到框架模式我们有必要简单的说下设计模式,了解下设计模式这个概念,因为有人对设计模式和框架模式的概念经常混淆 设计模式: 是一套被反 ...

  9. Excel中使用VLOOKUP对两个单元格关联

    一.背景 exl中需要关联两个Excel,根据主键合并两个单元格数据 二.使用方法 1.表1---列包含在id.姓名.年龄 2.表2---列包含姓名.性别 3.期望根据[姓名]列为主键,关联两个表数据 ...

  10. Flink mysql-cdc同步主键分布不均匀的mysql表

    一.背景 1.遇到问题描述 通过Flink同步mysql到iceberg中,任务一直在运行中,但是在目标表看不到数据.经排查发现job manager一直在做切片工作,切了一小时还没开始同步数据,日志 ...