1

WCF を使用するアプリケーションで、OpenTelemetry をコンソール エクスポーターと統合しようとしています。問題は、現在のトレース ID がSystem.Diagnostics.DiagnosticSource.Activity反対側に伝播されないことです。したがって、反対側では親情報が欠落しており、トレースが壊れています。

ログを調べるときに動作しているWCFでActivityPropagationをオンにしました。

問題は、反対側のアクティビティにアクティビティ ID がない/間違っていることです。


現時点では、 System.Diagnostics.DiagnosticSource.Activity.IdWCFを介して伝播するために何ができるかわかりません

  • アクティビティ ID/コンテキストを伝達するために OpenTelemetry または WCF を正しく設定するにはどうすればよいですか?




コードは基本的に Microsoft WCF Calculator Tutorialのみです。OpenTelemetry を統合しようとしています。

これらは、私が OpenTelemetry に使用している部分です

クライアント:

public class Program
{
    private static readonly ActivitySource MyActivitySource = new ActivitySource("MyCompany.MyProduct.MyClient");

    public static void Main(string[] args)
    {
        var tracerProvider = Sdk.CreateTracerProviderBuilder()
            .AddSource("MyCompany.MyProduct.MyClient")
            .AddConsoleExporter()
            .Build();

        using (var activity_wcf_session = MyActivitySource.StartActivity("WCF_Session"))
        {
            activity_wcf_session?.SetTag("index", 0);

            //Step 1: Create an instance of the WCF proxy.
            CalculatorClient client = new CalculatorClient();

            // Step 2: Call the service operations.
            // Call the Add service operation.
            using (var activity = MyActivitySource.StartActivity("Client_call_add()"))
            {
                activity?.SetTag("msg", "foo");
                double result = client.Add(100.00D, 15.99D);
            }
            
            // Step 3: Close the client to gracefully close the connection and clean up resources.
            Console.WriteLine("\nPress <Enter> to terminate the wcf client.");
            Console.ReadLine();
            client.Close();
        }
    }
}

サービス:

public class CalculatorService : ICalculator
    {
        private static readonly ActivitySource MyActivitySource = new ActivitySource(
            "MyCompany.MyProduct.CalculatorService");

        private TracerProvider tracerProvider;

        public CalculatorService()
        {
            tracerProvider = Sdk.CreateTracerProviderBuilder()
            .AddSource("MyCompany.MyProduct.CalculatorService")
            .AddConsoleExporter()
            .Build();
        }


        public double Add(double n1, double n2)
        {
            Console.WriteLine("Activity.Current is null: " + (Activity.Current == null)); // is always null

            using (var activity = MyActivitySource.StartActivity("CalculatorService_add()", ActivityKind.Server))
            {
                // activity.parent is not set

                double result = n1 + n2;
                return result;
            }
        }
        
        // ...
    }
}

これは、プロジェクトでActivity-Propagationを有効にした方法です(ホストでも同じです)

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information,ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="C:\logs\GettingStarted_Client.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="xml" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>
4

1 に答える 1