WCF を使用するアプリケーションで、OpenTelemetry をコンソール エクスポーターと統合しようとしています。問題は、現在のトレース ID がSystem.Diagnostics.DiagnosticSource.Activity
反対側に伝播されないことです。したがって、反対側では親情報が欠落しており、トレースが壊れています。
ログを調べるときに動作しているWCFでActivityPropagationをオンにしました。
問題は、反対側のアクティビティにアクティビティ ID がない/間違っていることです。
現時点では、 System.Diagnostics.DiagnosticSource.Activity.Id
WCFを介して伝播するために何ができるかわかりません
- アクティビティ 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>