Npgsql中Activity.Duration远低于实际耗时的原因是什么?
关于Npgsql的Duration计算与Stopwatch耗时差异问题
我搞不懂Npgsql是怎么计算Duration的,用Stopwatch捕获的耗时比它高一个数量级,原本以为这两个测量结果应该接近得多。
在我的机器上得到如下时间:
Activity.Duration: 00:00:00.0174913 Stopwatch duration: 00:00:00.1394318
复现步骤
1. 创建.NET控制台应用代码
using System.Diagnostics; using Npgsql; using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("npgsql-tester")) .SetSampler(new AlwaysOnSampler()) .AddSource("MyApp") .AddNpgsql() .AddConsoleExporter() .Build(); var connectionString = "Host=localhost;Database=db;Username=dbuser;Password=dbpassword;"; await using var dataSource = NpgsqlDataSource.Create(connectionString); await using var cmd = dataSource.CreateCommand("SELECT 1"); var timer = new Stopwatch(); timer.Start(); await cmd.ExecuteScalarAsync(); timer.Stop(); Console.WriteLine($"Stopwatch duration: {timer.Elapsed}");
2. 添加依赖包
dotnet add package Npgsql -v 7.0.2 dotnet add package Npgsql.OpenTelemetry -v 7.0.2 dotnet add package OpenTelemetry.Exporter.Console -v 1.4.0 dotnet add package OpenTelemetry.Instrumentation.SqlClient -v 1.0.0-rc9.13
3. 启动本地Postgres实例(Docker)
docker run --name npgsql-duration -p 5432:5432 -e POSTGRES_DB=db -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=dbpassword -d postgres
内容的提问来源于stack exchange,提问作者Couper
相关产品推荐
相关产品推荐

