Open
Description
Bug Report
List of all OpenTelemetry NuGet
packages and version that you are
using (e.g. OpenTelemetry 1.0.2
):
- OpenTelemetry - 1.7.0-alpha.1
- OpenTelemetry.Exporter.Console - 1.7.0-alpha.1
- OpenTelemetry.Exporter.OpenTelemetryProtocol - 1.7.0-alpha.1
- OpenTelemetry.Instrumentation.EntityFrameworkCore - 1.0.0-beta.8
- OpenTelemetry.Instrumentation.SqlClient - 1.6.0-beta.2
Runtime version (e.g. net462
, net48
, netcoreapp3.1
, net6.0
etc. You can
find this information from the *.csproj
file):
- net6.0
- net7.0
Symptom
Using AddSqlClientInstrumentation
and AddEntityFrameworkCoreInstrumentation
at the same time leads to miss parent span.
What is the expected behavior?
Exports two spans:
- EF Core span
- SQL Client span, with EF Core span as parent
What is the actual behavior?
- EF Core span is missed in the output
- SQL Client span, with EF Core span as parent
Output from console exporter - I have only SQL Client span, which has ParentSpanId of EF Core span.
Activity.TraceId: 916f8741531547a078d9966039e4f905
Activity.SpanId: 96a036d8982f1155
Activity.TraceFlags: Recorded
Activity.ParentSpanId: 8580d5d7086bf8c8
Activity.ActivitySourceName: OpenTelemetry.Instrumentation.SqlClient
Activity.DisplayName: lsnext_domain
Activity.Kind: Client
Activity.StartTime: 2023-10-31T13:33:26.4747510Z
Activity.Duration: 00:00:13.8057920
Activity.Tags:
db.system: mssql
db.name: lsnext_domain
peer.service: srv2.local,1433
db.statement_type: Text
Resource associated with Activity:
service.name: some-service-name
service.instance.id: d597a313-eeed-4e9e-a32c-79bb4a1538e8
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.7.0-alpha.1
We can see both expected spans using Enrich methods (pay attention to Id
and ParentSpanId
), so I guess that both spans are exist and looks like the first one just doesnt stop:
Reproduce
using Microsoft.EntityFrameworkCore;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.ConfigureResource(r => r.AddService("some-service-name"))
.AddSqlClientInstrumentation()
.AddEntityFrameworkCoreInstrumentation()
.AddConsoleExporter()
.Build();
var dbContextOptions = new DbContextOptionsBuilder<SomeDbContext>()
.UseSqlServer("localhost").Options;
{
await using var dbContext = new SomeDbContext(dbContextOptions);
await dbContext.Database.ExecuteSqlAsync($"select 1");
}
await Task.Delay(2000);
Console.ReadKey();
public class SomeDbContext : DbContext
{
public SomeDbContext(DbContextOptions<SomeDbContext> options) : base(options)
{
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.13" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.13" />
<PackageReference Include="OpenTelemetry" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0-alpha.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.8" />
<PackageReference Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.6.0-beta.2" />
</ItemGroup>
</Project>
Additional Context
- Other exporters have the same behavior (tested on OpenTelemetry.Exporter.OpenTelemetryProtocol 1.6.0)