Npgsql:为什么 `Activity.Duration` 比实际运行时间低很多?

问题描述 投票:0回答:0

我不明白

Npgsql
是怎么计算持续时间的,因为用
Stopwatch
捕获的经过时间要高一个数量级。 我期待两次测量之间的持续时间更短。

在我的机器上我有这个时间:

Activity.Duration:   00:00:00.0174913
Stopwatch duration:  00:00:00.1394318

您可以通过创建 .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}");

添加依赖项

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

使用 Docker 启动本地 Postgres 实例

docker run --name npgsql-duration -p 5432:5432 -e POSTGRES_DB=db -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=dbpassword -d postgres
.net npgsql open-telemetry
© www.soinside.com 2019 - 2024. All rights reserved.