Ключевым моментом здесь является использование структуры DI.Вы можете использовать его для передачи данных или сервисов в рамках запроса в ваши ITelemetryInitializer
.
(Эти примеры основаны на стандартной инфраструктуре внедрения зависимостей ASP.Net. Этот шаблон должен работать с любой структурой DI, но его необходимо немного отрегулировать.)
Сначала создайте класс для представления вашей телеметрии в области запросов.Я использовал простой DTO, но это также может быть сервис, который знает, как извлекать / генерировать данные самостоятельно.Зарегистрируйте его, используя AddScoped
.«Scoped» означает, что новый экземпляр будет создаваться для каждого HTTP-запроса, а затем этот экземпляр будет повторно использоваться в этом запросе.
Поскольку я использовал DTO, я не стал беспокоиться об интерфейсе-вы должны использовать интерфейс, если класс содержит любую логику, которую вы хотите смоделировать в модульных тестах.
public class RequestScopedTelemetry
{
public string MyCustomProperty { get; set; }
}
services.AddScoped<RequestScopedTelemetry>();
Теперь создайте ITelemetryInitializer
и зарегистрируйте его как одиночный.App Insights обнаружит и использует его через инфраструктуру DI.
class RequestScopedTelemetryInitializer : ITelemetryInitializer
{
readonly IHttpContextAccessor httpContextAccessor;
public RequestScopedTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
=> this.httpContextAccessor = httpContextAccessor;
public void Initialize(ITelemetry telemetry)
{
// Attempt to resolve the request-scoped telemetry from the DI container
var requestScopedTelemetry = httpContextAccessor
.HttpContext?
.RequestServices?
.GetService<RequestScopedTelemetry>();
// RequestScopedTelemetry is only available within an active request scope
// If no telemetry available, just move along...
if (requestScopedTelemetry == null)
return;
// If telemetry was available, add it to the App Insights telemetry collection
telemetry.Context.GlobalProperties[nameof(RequestScopedTelemetry.MyCustomProperty)]
= requestScopedTelemetry.MyCustomProperty;
}
}
services.AddSingleton<ITelemetryInitializer, RequestScopedTelemetryInitializer>();
Наконец, в методе вашего контроллера установите значения для каждого запроса.Эта часть не обязательна, если ваш класс телеметрии может самостоятельно получать или генерировать данные.
public class ExampleController : ControllerBase
{
readonly RequestScopedTelemetry telemetry;
public ValuesController(RequestScopedTelemetry telemetry)
=> this.telemetry = telemetry;
[HttpGet]
public ActionResult Get()
{
telemetry.MyCustomProperty = "MyCustomValue";
// Do what you want to
return Ok();
}
}