当前位置: 首页 > wzjs >正文

云服务器 网站竞价托管优化公司

云服务器 网站,竞价托管优化公司,自己做物流网站,手机网站根目录ABP VNext OpenTelemetry Jaeger:分布式追踪与调用链可视化 🚀 📚 目录ABP VNext OpenTelemetry Jaeger:分布式追踪与调用链可视化 🚀背景与动机 🌟环境与依赖 📦必装 NuGet 包系统架构概览…

ABP VNext + OpenTelemetry + Jaeger:分布式追踪与调用链可视化 🚀


📚 目录

  • ABP VNext + OpenTelemetry + Jaeger:分布式追踪与调用链可视化 🚀
    • 背景与动机 🌟
    • 环境与依赖 📦
      • 必装 NuGet 包
    • 系统架构概览 🖥️
    • 跑通示例 🚀
      • `Program.cs`
      • `docker-compose.yml` 🐳
    • 自动 + 手动埋点 🔍
      • 自动埋点
      • 自定义业务 Span
    • 异常与状态码标记 ⚠️
    • 日志与 Metrics 关联 📑
    • Jaeger 部署与高可用 🏗️
    • 采样策略与性能优化 🛡️
    • 扩展:OTel Collector & Grafana Tempo 🔗


版本说明:本文基于 OpenTelemetry.Extensions.Hosting >=1.4.0 编写,推荐使用统一的 .AddOpenTelemetry().WithTracing(...).WithMetrics(...) API。

TL;DR

  1. 提供完整 Program.cs + docker-compose.yml 示例 🏃‍♂️
  2. 自动 + 手动埋点:支持 HTTP/gRPC、数据库、外部调用与自定义 Span 🔍
  3. 高性能采样:Parent-Based + TraceIdRatioBasedSampler,动态可配 ⚙️
  4. 生产级部署:Batch 模式、OTel Collector、日志/Metrics 关联、异常标记 🚀

背景与动机 🌟

在分布式微服务架构中,调用链横跨多个进程与网络节点,“谁调用了谁”、“哪些环节慢”成为痛点。
OpenTelemetry(OTel)与 Jaeger 提供了开源、无侵入的端到端分布式追踪解决方案,帮助我们:

  • 自动化采集:入站 HTTP/gRPC、数据库、外部 HTTP 等一键埋点 📡
  • 自定义业务 Span:灵活埋点关键业务逻辑 🛠️
  • 统一可视化:Jaeger UI 或 Grafana Tempo 展示完整调用链 📈

本文基于 ABP VNext 6.x + .NET 6+,演示从零搭建到生产级优化,涵盖自动/手动埋点、采样策略、异常与日志关联等最佳实践。


环境与依赖 📦

  • .NET SDK:6.0+
  • ABP Framework:vNext 6.x
  • OpenTelemetry.Extensions.Hosting:>=1.4.0
  • Jaeger:all-in-one(测试);独立 Agent/Collector/Storage(生产)
  • 可选:OpenTelemetry Collector、Grafana Tempo、Prometheus/Grafana

必装 NuGet 包

dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
dotnet add package OpenTelemetry.Instrumentation.Http
dotnet add package OpenTelemetry.Instrumentation.SqlClient
dotnet add package OpenTelemetry.Instrumentation.GrpcNetClient
dotnet add package OpenTelemetry.Instrumentation.GrpcAspNetCore
dotnet add package OpenTelemetry.Exporter.Jaeger
dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol

系统架构概览 🖥️

HTTP/gRPC
DB
HTTP
Metrics
Logs
Client
ABP Service A
SQL Server
ABP Service B
Jaeger Collector
Jaeger UI
Prometheus
Grafana Dashboard
OTel Collector
日志后端
Grafana Tempo
  • 采集:入站 HTTP/gRPC、EF Core/SqlClient、HttpClient、gRPC 客户端、日志、Metrics
  • 导出:Trace → Jaeger;Metrics → Prometheus;Logs → OTLP → 日志后端;(可选)Trace → Tempo

跑通示例 🚀

启动 Jaeger (docker-compose)
运行微服务 (dotnet run)
访问业务 API
生成 Trace/Metric/Log 数据
在 Jaeger UI 查看调用链
在 Prometheus 查看 Metrics
在日志后端查看日志

Program.cs

using OpenTelemetry;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Volo.Abp;var builder = WebApplication.CreateBuilder(args);// 1. ABP 模块注册
builder.Services.AddApplication<MyProjectHttpApiHostModule>();// 2. OpenTelemetry 注册(Tracing + Metrics)
builder.Services.AddOpenTelemetry()// Tracing.WithTracing(tracing => tracing.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("OrderService", serviceVersion: "1.0.0")).AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddSqlClientInstrumentation().AddGrpcAspNetCoreInstrumentation().AddGrpcClientInstrumentation().AddSource("MyCompany.MyProduct").AddJaegerExporter(opts =>{opts.AgentHost = builder.Configuration["Jaeger:Host"];opts.AgentPort = int.Parse(builder.Configuration["Jaeger:Port"]!);}, exportProcessorType: ExportProcessorType.Batch).SetSampler(new ParentBasedSampler(new TraceIdRatioBasedSampler(0.1))))// Metrics.WithMetrics(metrics => metrics.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddPrometheusExporter());// 3. 日志关联 TraceContext
builder.Logging.AddOpenTelemetry(logging =>
{logging.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("OrderService"));logging.IncludeFormattedMessage = true;logging.IncludeScopes = true;logging.ParseStateValues = true;logging.AddOtlpExporter(); // 需要 OpenTelemetry.Exporter.OpenTelemetryProtocol
});var app = builder.Build();// 4. Prometheus 默认抓取端点(/metrics),无需额外配置
app.MapPrometheusScrapingEndpoint();// 5. 启动 ABP 应用
app.InitializeApplication();
app.Run();

docker-compose.yml 🐳

version: '3.8'
services:jaeger:image: jaegertracing/all-in-one:1.45ports:- "6831:6831/udp"- "16686:16686"- "14250:14250"

快速启动

  1. docker-compose up -d
  2. dotnet run --project src/MyProject.HttpApi.Host
  3. 访问 API & http://localhost:16686

自动 + 手动埋点 🔍

自动埋点

  • HTTP/gRPC.AddAspNetCoreInstrumentation().AddGrpcAspNetCoreInstrumentation()
  • 外部调用.AddHttpClientInstrumentation().AddGrpcClientInstrumentation()
  • 数据库.AddSqlClientInstrumentation()
ClientABP APISQL Server外部服务HTTP 请求SQL 查询HTTP 调用响应ClientABP APISQL Server外部服务

自定义业务 Span

public class OrderAppService : ApplicationService
{private static readonly ActivitySource Source = new("MyCompany.MyProduct");public async Task ProcessOrderAsync(Guid orderId){using var activity = Source.StartActivity("ProcessOrder");activity?.SetTag("order.id", orderId);try{await _orderManager.HandleOrderAsync(orderId);}catch (Exception ex){activity?.SetStatus(ActivityStatusCode.Error, ex.Message);activity?.RecordException(ex);throw;}}
}

💡 Tip:通过 ABP 拦截器统一埋点:

public class TraceInterceptor : IInterceptor
{private static readonly ActivitySource Source = new("MyCompany.MyProduct");public void Intercept(IInvocation invocation){using var activity = Source.StartActivity(invocation.Method.Name);activity?.SetTag("abp.service", invocation.TargetType.Name);try{invocation.Proceed();}catch (Exception ex){activity?.SetStatus(ActivityStatusCode.Error, ex.Message);activity?.RecordException(ex);throw;}}
}// 注册拦截器
Configure<AbpInterceptorsOptions>(opts =>opts.Interceptors.Add<TraceInterceptor>()
);

异常与状态码标记 ⚠️

  • activity?.SetStatus(ActivityStatusCode.Error, message) 标记失败 Span
  • activity?.RecordException(ex) 记录异常详情

在 Jaeger UI 中直观区分成功/失败调用链。


日志与 Metrics 关联 📑

TraceContext
OTLP
Metrics
ILogger
OpenTelemetryLogProvider
OTelCollector
LogStore
API
Prometheus
Grafana
  1. 日志

    builder.Logging.AddOpenTelemetry(logging =>logging.AddOtlpExporter());
    
  2. Metrics

    • 自动采集请求计数与时延
    • 自定义 Meter 导出 Prometheus

Jaeger 部署与高可用 🏗️

  • 测试:All-in-One 镜像,一键启动

  • 生产

    • 组件拆分:Agent/Collector/Query/UI 分离部署
    • 后端存储:Cassandra / Elasticsearch / Kafka
    • 安全:启用 TLS、鉴权(mTLS、Token),或通过 OTel Collector 做统一接入与流量控制
    • 多副本:水平扩展与高可用

采样策略与性能优化 🛡️

收到请求
父 Span 有采样?
遵从父决策
随机 < 0.1?
采样
丢弃
  • ParentBasedSampler:跨服务一致决策
  • Batch 模式:减少网络与 CPU 开销
  • 动态调整:环境变量 OTEL_TRACES_SAMPLER / OTEL_TRACES_SAMPLER_ARG
  • 环境差异:开发环境 AlwaysOnSampler;生产环境 5–10%

扩展:OTel Collector & Grafana Tempo 🔗

  • Collector:统一接入、Filter、Auth、转发至 Jaeger/Tempo/Prometheus
  • Grafana Tempo:专注 Trace 存储,结合 Prometheus、Loki 构建全栈 Observability

http://www.dtcms.com/wzjs/69284.html

相关文章:

  • 商城手机网站怎么做有效的网站推广方式
  • 福州做网站互联网公司推广app软件
  • 做 从哪个网站上下载图片武汉seo首页优化报价
  • 网站开发可以学吗成品视频直播软件推荐哪个好一点
  • 厦门外贸公司做网站seo服务的内容
  • it运维方案灯塔网站seo
  • 网站 产品图片 尺寸2021最近比较火的营销事件
  • 可以做go分析的网站seo优化工具有哪些
  • 网页制作的公司叫什么网页优化seo公司
  • 江苏省和城乡建设门户网站中国seo谁最厉害
  • 做商城网站需要什么公司网站推广运营
  • 高端h5网站开发汕头seo按天付费
  • 网站关键词如何做竞价西安危机公关公司
  • 通付盾 建设公司网站武汉网站开发公司
  • 校庆专题网站建设方案福建百度seo排名点击软件
  • js特效网站短视频营销的优势
  • 广州金将令做网站怎么样如何seo推广
  • 免费制作软件app的网站谷歌搜索广告
  • 查看网站有没有做301外贸电商平台哪个网站最好
  • 用口做love的网站郑州seo网站排名
  • 网页游戏网站大全免费软件关键词排名关键词优化
  • 视差效果网站网站关键词怎么设置
  • dw如何做网站推广小程序拿佣金
  • 上市公司网站建设报价青岛seo精灵
  • 深圳南山做网站的公司百度旗下产品
  • 许昌市住房和城乡建设厅网站百度浏览器下载安装
  • 租网站需要多少钱网页设计成品源代码
  • 怎么做返利网之类的网站谷歌seo网站推广怎么做优化
  • 电脑可以做网站服务器么全网最低价24小时自助下单平台
  • 鹰潭市网站建设公司营销网店推广的软文