open-telemetry / opentelemetry-dotnet

The OpenTelemetry .NET Client
https://opentelemetry.io
Apache License 2.0
3.19k stars 754 forks source link

gRPC loading issue with OTLP Exporter on .NET Framework 4.8 #4999

Open ClumsyPenguin opened 11 months ago

ClumsyPenguin commented 11 months ago

Bug Report

OTel packages:

OpenTelemetry V1.6.0 OpenTelemetry.Api V1.6.0 OpenTelemetry.Api.ProviderBuilderExtensions V1.6.0 OpenTelemetry.Exporter.Console V1.6.0 OpenTelemetry.Exporter.OpenTelemetryProtocolV1.6.0 OpenTelemetry.Extensions.Hosting V1.6.0 OpenTelemetry.Instrumentation.AspNet V1.6.0-beta.1 OpenTelemetry.Instrumentation.AspNet.TelemetryHtppModule V1.6.0-beta.1 OpenTelemetry.Instrumentation.Http V1.5.1-beta.1 OpenTelemetry.Instrumentation.SqlClient V1.5.1-beta.1

gRPC packages:

Grpc.Core.Api V2.46.6 Grpc V2.46.6 Grpc.Core V2.46.6

Runtime version: net48

Symptom

StackTrace of the issue

System.IO.FileNotFoundException: Error loading native library. Not found in any of the possible locations: C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Grpc.Core\v4.0_2.0.0.0__d754f35622e28bad\grpc_csharp_ext.x64.dll,C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Grpc.Core\v4.0_2.0.0.0__d754f35622e28bad\runtimes/win-x64/native\grpc_csharp_ext.x64.dll,C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Grpc.Core\v4.0_2.0.0.0__d754f35622e28bad\../..\runtimes/win-x64/native\grpc_csharp_ext.x64.dll
   at Grpc.Core.Internal.UnmanagedLibrary.FirstValidLibraryPath(String[] libraryPathAlternatives)
   at Grpc.Core.Internal.UnmanagedLibrary..ctor(String[] libraryPathAlternatives)
   at Grpc.Core.Internal.NativeExtension.LoadNativeMethodsUsingExplicitLoad()
   at Grpc.Core.Internal.NativeExtension.LoadNativeMethods()
   at Grpc.Core.Internal.NativeExtension..ctor()
   at Grpc.Core.Internal.NativeExtension.Get()
   at Grpc.Core.Internal.NativeMethods.Get()
   at Grpc.Core.GrpcEnvironment.GrpcNativeInit()
   at Grpc.Core.GrpcEnvironment..ctor()
   at Grpc.Core.GrpcEnvironment.AddRef()
   at Grpc.Core.Channel..ctor(String target, ChannelCredentials credentials, IEnumerable`1 options)
   at Grpc.Core.Channel..ctor(String target, ChannelCredentials credentials)
   at OpenTelemetry.Exporter.OtlpExporterOptionsExtensions.CreateChannel(OtlpExporterOptions options)
   at OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.OtlpGrpcTraceExportClient..ctor(OtlpExporterOptions options, TraceServiceClient traceServiceClient)
   at OpenTelemetry.Exporter.OtlpExporterOptionsExtensions.GetTraceExportClient(OtlpExporterOptions options)
   at OpenTelemetry.Exporter.OtlpTraceExporter..ctor(OtlpExporterOptions exporterOptions, SdkLimitOptions sdkLimitOptions, IExportClient`1 exportClient)
   at OpenTelemetry.Trace.OtlpTraceExporterHelperExtensions.BuildOtlpExporterProcessor(OtlpExporterOptions exporterOptions, SdkLimitOptions sdkLimitOptions, IServiceProvider serviceProvider, Func`2 configureExporterInstance)
   at OpenTelemetry.Trace.OtlpTraceExporterHelperExtensions.<>c__DisplayClass2_0.<AddOtlpExporter>b__1(IServiceProvider sp)
   at OpenTelemetry.Trace.TracerProviderBuilderExtensions.<>c__DisplayClass8_0.<AddProcessor>b__0(IServiceProvider sp, TracerProviderBuilder builder)
   at OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureTracerProviderBuilderCallbackWrapper.ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder)
   at OpenTelemetry.Trace.TracerProviderSdk..ctor(IServiceProvider serviceProvider, Boolean ownsServiceProvider)
   at OpenTelemetry.Trace.TracerProviderBuilderBase.Build()
   at OpenTelemetry.Trace.TracerProviderBuilderBase.InvokeBuild()
   at OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(TracerProviderBuilder tracerProviderBuilder)

What is the expected behavior?

Working OTLP exporter in combination with .NET Framework 4.8

Reproduce

MVP reproducing the issue described above: https://github.com/ClumsyPenguin/OtelExporter

image

Additional context

I am using manual instrumentation through an interceptor in our common interfaces for Services, Repositories, Controllers, etc...

Previously i was using Jaeger exporter to view my traces in Jaeger UI. However since that package is deprecated i am trying to switch to the OTLP exporter at this moment.

Current workaround is to switch back to the deprecated Jaeger exporter for now.

Ticker originates from https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/issues/3044

ClumsyPenguin commented 11 months ago

Possible related prs/issues:

https://github.com/open-telemetry/opentelemetry-dotnet/pull/4860 https://github.com/open-telemetry/opentelemetry-dotnet/pull/4719 https://github.com/open-telemetry/opentelemetry-dotnet/issues/3421 https://github.com/open-telemetry/opentelemetry-dotnet/issues/4613

tarasevichvlad commented 8 months ago

Hi. Any info for this topic? Any workround?