En mi última publicación de blog, presenté una forma de correlacionar la telemetría de Application Insights con aquellos de nosotros que usamos Hangfire para ejecutar trabajos.
Pero incluso si realiza sus trabajos programados en función del marco de trabajo programado de Optimizely, aún puede correlacionar toda la telemetría generada mientras ejecuta un trabajo.
Creé una clase simple, JobTelemetryScope
, que ajusta fácilmente la telemetría de una operación durante la duración del trabajo. Se parece a esto:
using System;
using EPiServer.ServiceLocation;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;namespace SampleSite.ScheduledJobs;
public sealed class JobTelemetryScope : IDisposable
{
private readonly Injected_telemetryClientInjected;
private readonly IOperationHolder_operationHolder; public bool Success { get; set; }
public JobTelemetryScope(string jobName)
{
var telemetryClient = _telemetryClientInjected.Service;
if (!telemetryClient.IsEnabled())
{
return;
}_operationHolder = telemetryClient.StartOperation
($"JOB {jobName}");
}public void Dispose()
{
if (_operationHolder == null)
{
return;
}_operationHolder.Telemetry.Success = Success;
_operationHolder.Dispose();
}
}
Esto se puede usar en un trabajo programado personalizado, como este:
using System; using EPiServer.PlugIn; using EPiServer.Scheduler; namespace SampleSite.ScheduledJobs; [ScheduledPlugIn( DisplayName = "Test job", GUID = "F62C2AC3-A775-40E1-8F7D-62056E6E7C5E")] public class TestJob : ScheduledJobBase { public TestJob() { IsStoppable = true; } public override string Execute() { // Use in a try-catch-finally block. var telemetryScope = new JobTelemetryScope("TestJob"); try { // TODO: Add your own code here. Remember to set Success to true. telemetryScope.Success = true; } catch (Exception ex) { // Success is false by default. No need to set it explicitly. return "Not OK"; } finally { // End the telemetry correlation scope. telemetryScope.Dispose(); } // Or a using statement. using var telemetryScope2 = new JobTelemetryScope("TestJob"); try { // TODO: Add your own code here. Remember to set Success to true. telemetryScope2.Success = true; } catch (Exception ex) { return "Not OK"; } return "OK"; } }
Tenga en cuenta que esto solo funciona para sus propios trabajos programados, donde puede agregar el bloque de alcance. No se puede (todavía) aplicar a los trabajos programados de Optimizely integrados.