tldr: это возможно, отключив встроенное отслеживание зависимостей в. NET Core and App Insights и обработав его самостоятельно. В большинстве случаев лучше всего позволить. NET Core и App Insights отслеживают.
Я загрузил простое приложение WebAPI с кодом, который собираюсь go, на Github: https://github.com/SamaraSoucy-MSFT/customoperationid
Есть две вещи, которые необходимо переопределить, чтобы получить как заголовки, так и App Insights для получения идентификатора настраиваемой операции. Первый - это Activity, который обертывает HttpClient, поскольку он управляет заголовками корреляции. Второй - это отслеживание зависимостей в App Insights.
Можно полностью отключить действия в ваших HttpClients, но для минимизации побочных эффектов вы можете просто удалить один в клиенте, установив Activity.Current = null
var operationId = "CR" + Guid.NewGuid().ToString();
var url = "https://www.microsoft.com";
using (var client = new HttpClient())
{
using (var requestMessage =
new HttpRequestMessage(HttpMethod.Get, url))
{
//Makes the headers configurable
Activity.Current = null;
//set correlation header manually
requestMessage.Headers.Add("Request-Id", operationId);
await client.SendAsync(requestMessage);
}
}
Следующим шагом является удаление отслеживания App Insights по умолчанию для этого запроса . Опять же, вы можете полностью отключить отслеживание зависимостей или отфильтровать телеметрию по умолчанию для этого запроса. Процессоры регистрируются внутри класса Startup точно так же, как инициализаторы.
services.AddApplicationInsightsTelemetryProcessor<CustomFilter>();
public class CustomFilter : ITelemetryProcessor
{
private ITelemetryProcessor Next { get; set; }
// next will point to the next TelemetryProcessor in the chain.
public CustomFilter(ITelemetryProcessor next)
{
this.Next = next;
}
public void Process(ITelemetry item)
{
// To filter out an item, return without calling the next processor.
if (!OKtoSend(item)) { return; }
this.Next.Process(item);
}
// Example: replace with your own criteria.
private bool OKtoSend(ITelemetry item)
{
var dependency = item as DependencyTelemetry;
if (dependency == null) return true;
if (dependency.Type == "Http"
&& dependency.Data.Contains("microsoft.com")
//This key is just there to help identify the custom tracking
&& !dependency.Context.GlobalProperties.ContainsKey("keep"))
{
return false;
}
return true;
}
}
Наконец, в методе, который выполняет удаленный вызов, вам необходимо внедрить клиент телеметрии и вызвать TelemetryClient.TrackDependency()
var operationId = "CR" + Guid.NewGuid().ToString();
//setup telemetry client
telemetry.Context.Operation.Id = operationId;
if (!telemetry.Context.GlobalProperties.ContainsKey("keep"))
{
telemetry.Context.GlobalProperties.Add("keep", "true");
}
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
//continue setting up context if needed
var url = "https:microsoft.com";
using (var client = new HttpClient())
{
//Makes the headers configurable
Activity.Current = null;
using (var requestMessage =
new HttpRequestMessage(HttpMethod.Get, url))
{
//Makes the headers configurable
Activity.Current = null;
//set header manually
requestMessage.Headers.Add("Request-Id", operationId);
await client.SendAsync(requestMessage);
}
}
//send custom telemetry
telemetry.TrackDependency("Http", url, "myCall", startTime, timer.Elapsed, true);