2016-08-25 12 views
1

私はEventHub、そこから読み込むwebjobに書き込みAspNetCoreのWebアプリを持っています。私は、このトランザクションの両方の部分のテレメトリーがApplication Insightの同じ操作IDを持つことを望みます。だから、Application Insightsの操作IDはいつ入手できますか?

、私はEventHubにデータを送信しようとしている時、私は、例えば、TelemetryClientのうち、操作IDを引っ張ってみてください

var myOperationId = MyTelemetryClient.Context.Operation.Id; 

しかし、これは常に私にnullを与えます。私はこれを見つけたarticleと使用しようとしました

var request.HttpContext.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry; 

もう一度null。私はそれが必要なときに私はこの値を抽出することができる方法上の任意のポインタ?

私のコードは次のようになります。

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection IServices) 
    { 
     var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; 
     builder.Use((next) => new MyTelemetryProcessor(next)); 
     builder.Build(); 

     var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions(); 
     aiOptions.EnableQuickPulseMetricStream = true; 

     IServices.AddApplicationInsightsTelemetry(Configuration, aiOptions); 
     IServices.AddMvc(); 
     IServices.AddOptions(); 

     TelemetryClient AppTelemetry = new TelemetryClient(); 
     AppTelemetry.InstrumentationKey = InsightsInstrumentationKey; 
     IServices.AddSingleton(typeof(TelemetryClient), AppTelemetry); 
    } 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseApplicationInsightsRequestTelemetry(); 
     app.UseApplicationInsightsExceptionTelemetry(); 

     app.UseMvc(); 

     var configuration = app.ApplicationServices.GetService<TelemetryConfiguration>(); 
     configuration.TelemetryInitializers.Add(new MyTelemetryInitializer()); 
    } 
} 

[Route("[controller]")] 
public class MyController 
{ 
    private readonly TelemetryClient mTelemetryClient; 

    public MyController(
     TelemetryClient TelemetryClientArg) 
    { 
     mTelemetryClient = TelemetryClientArg; 
    } 

    [HttpPost] 
    public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData) 
    { 
     string telemetryId = mTelemetryClient.Context.Operation.Id; // this is null 

     return Ok(); 
    } 
} 

答えて

0

あなたはテレメトリの作品を送信して、遠隔測定対象からの操作IDを読み戻すことで、この値を得ることができます。エレガントではありませんが、機能します。

[HttpPost] 
public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData) 
{ 
    var dummyTrace = new TraceTelemetry("hello", SeverityLevel.Verbose); 
    mTelemetryClient.TrackTrace(dummyTrace); 
    string opId = dummyTrace.Context.Operation.Id; 

    return Ok(); 
} 
+0

これは、操作IDを取得するためだけに存在するトレースでテレメトリを汚染していることを意味しますか?私はまだソースを掘り下げていますが、コンテキストに操作IDがない場合は、新しいものが作成され、そのトレースを送信するとすぐに設定されるという感覚があります。現在nullの場合は、明示的に何かに明示的に設定するだけで、同じ動作を得ることができますか? –

0

Asp.Netのコアパッケージが要求からこれを設定しようとOperationIdTelemetryInitializersee github)を持っています。あなたは、要求の追跡と、このテレメトリ初期化子を持っている場合、仮にその要求で起こるすべてが Operation.Idセットを持っている必要があり、オン。

これはあなたのために働いていない場合は、必要に応じてそれを設定する独自のカスタムTelemetryInitializerを作成することができますか、またはあなたがそれがnullになる場所では、そのコンテキスト内のものはそのIDを持つ必要があります。

+0

私TelemetryInitializer内で操作IDが正しくセットアップされているが、私はコントローラレベルでTelemetryClientにアクセスした場合、それはまだヌルです。コンテキストは、2つの異なるレベルで異なります。 私はnetcoreパッケージを使用しています。私はOperationIdTelemetryInitializerを無効にするために何もしていないので、動作していると仮定します。実際のテレメトリーには操作IDがあります。私が望むところではプログラムではアクセスできません。 –

+0

これは動作しますが、それは少し不格好だと無意味なテレメトリを生成します。 'VARのdummyTrace =新TraceTelemetry( "こんにちは"、SeverityLevel.Verbose);' ' mTelemetryClient.TrackTrace(dummyTrace);' ' 文字列OPID = dummyTrace.Context .Operation.Id; ' –

+0

odd。 'TrackTrace'メソッドがそのトレースに' TelemetryClient'のコンテキストを割り当てていることを意味しますが、それが本当であれば 'TrackTrace'を呼び出さずに(操作ID)*を含む同じコンテキストを取得できたはずです'TelemetryClient'自体です。 –

2

私は最終的に不要なテレメトリを作成せずにこれをクラックしたと考えてください。以下はAspNetCoreのためですが、限り翻訳しなければならないオペレーションID初期化子が利用可能であるよう:

var operationId = default(string); 
try 
{ 
    var telemetry = new RequestTelemetry(); 

    TelemetryConfiguration 
     .Active 
     .TelemetryInitializers 
     .OfType<OperationIdTelemetryInitializer>() 
     .Single() 
     .Initialize(telemetry); 

    operationId = telemetry.Context.Operation.Id; 

} 
catch { } 
+0

AspNetCoreを使用していない場合は、代わりに 'OperationCorrelationTelemetryInitializer'を使用できます。 – Markus

関連する問題