Application Analizler .NET SDK ile özel işlemleri izleme
Uygulama Analizler SDK'ları, HTTP istekleri ve SQL sorguları gibi bağımlı hizmetlere gelen HTTP isteklerini ve çağrılarını otomatik olarak izler. İsteklerin ve bağımlılıkların izlenmesi ve bağıntılanması, bu uygulamayı birleştiren tüm mikro hizmetlerde uygulamanın yanıt hızı ve güvenilirliği hakkında görünürlük sağlar.
Genel olarak desteklenemez bir uygulama desenleri sınıfı vardır. Bu tür desenlerin düzgün izlenmesi için el ile kod izleme gerekir. Bu makale, özel kuyruk işleme ve uzun süre çalışan arka plan görevleri çalıştırma gibi el ile izleme gerektirebilecek birkaç deseni kapsar.
Bu makalede, Uygulama Analizler SDK'sı ile özel işlemleri izleme hakkında yönergeler sağlanır. Bu belgeler aşağıdakiler için geçerlidir:
- .NET (Temel SDK olarak da bilinir) sürüm 2.4+ için uygulama Analizler.
- Web uygulamaları (çalışan ASP.NET) sürüm 2.4+ için uygulama Analizler.
- ASP.NET Core sürüm 2.1+ için uygulama Analizler.
Not
Aşağıdaki belgeler, Uygulama Analizler klasik API'sine dayanır. Uygulama Analizler için uzun vadeli plan, OpenTelemetry kullanarak veri toplamaktır. Daha fazla bilgi için bkz . .NET, Node.js, Python ve Java uygulamaları için Azure İzleyici OpenTelemetry'yi etkinleştirme.
Genel bakış
İşlem, bir uygulama tarafından çalıştırılan mantıksal bir iş parçasıdır. Ad, başlangıç zamanı, süre, sonuç ve kullanıcı adı, özellikler ve sonuç gibi yürütme bağlamı vardır. A işlemi B işlemi tarafından başlatıldıysa, B işlemi A için üst öğe olarak ayarlanır. Bir işlemin yalnızca bir üst öğesi olabilir, ancak birçok alt işlemi olabilir. İşlemler ve telemetri bağıntısı hakkında daha fazla bilgi için bkz. Uygulama Analizler telemetri bağıntısı.
Uygulama Analizler .NET SDK'sında, işlem OperationTelemetry soyut sınıfı ve onun alt öğeleri RequestTelemetry ve DependencyTelemetry tarafından açıklanmıştır.
Gelen işlemleri izleme
Application Analizler web SDK'sı, bir IIS işlem hattında ve tüm ASP.NET Core uygulamalarında çalışan ASP.NET uygulamalar için HTTP isteklerini otomatik olarak toplar. Diğer platformlar ve çerçeveler için topluluk tarafından desteklenen çözümler vardır. Uygulama standart veya topluluk tarafından desteklenen çözümlerden herhangi biri tarafından desteklenmiyorsa, uygulamayı el ile izleyebilirsiniz.
Özel izleme gerektiren bir diğer örnek de kuyruktan öğe alan çalışandır. Bazı kuyruklarda, bu kuyruğa ileti ekleme çağrısı bağımlılık olarak izlenir. İleti işlemeyi açıklayan üst düzey işlem otomatik olarak toplanmaz.
Şimdi bu tür işlemlerin nasıl izlendiğini görelim.
Yüksek düzeyde, görev bilinen özellikleri oluşturmak RequestTelemetry
ve ayarlamaktır. İşlem tamamlandıktan sonra telemetriyi izlersiniz. Aşağıdaki örnekte bu görev gösterilmektedir.
Owin şirket içinde barındırılan uygulamada HTTP isteği
Bu örnekte, bağıntı için HTTP Protokolü'ne göre izleme bağlamı yayılır. Burada açıklanan üst bilgileri almayı beklemeniz gerekir.
public class ApplicationInsightsMiddleware : OwinMiddleware
{
// You may create a new TelemetryConfiguration instance, reuse one you already have,
// or fetch the instance created by Application Insights SDK.
private readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
private readonly TelemetryClient telemetryClient = new TelemetryClient(telemetryConfiguration);
public ApplicationInsightsMiddleware(OwinMiddleware next) : base(next) {}
public override async Task Invoke(IOwinContext context)
{
// Let's create and start RequestTelemetry.
var requestTelemetry = new RequestTelemetry
{
Name = $"{context.Request.Method} {context.Request.Uri.GetLeftPart(UriPartial.Path)}"
};
// If there is a Request-Id received from the upstream service, set the telemetry context accordingly.
if (context.Request.Headers.ContainsKey("Request-Id"))
{
var requestId = context.Request.Headers.Get("Request-Id");
// Get the operation ID from the Request-Id (if you follow the HTTP Protocol for Correlation).
requestTelemetry.Context.Operation.Id = GetOperationId(requestId);
requestTelemetry.Context.Operation.ParentId = requestId;
}
// StartOperation is a helper method that allows correlation of
// current operations with nested operations/telemetry
// and initializes start time and duration on telemetry items.
var operation = telemetryClient.StartOperation(requestTelemetry);
// Process the request.
try
{
await Next.Invoke(context);
}
catch (Exception e)
{
requestTelemetry.Success = false;
requestTelemetry.ResponseCode;
telemetryClient.TrackException(e);
throw;
}
finally
{
// Update status code and success as appropriate.
if (context.Response != null)
{
requestTelemetry.ResponseCode = context.Response.StatusCode.ToString();
requestTelemetry.Success = context.Response.StatusCode >= 200 && context.Response.StatusCode <= 299;
}
else
{
requestTelemetry.Success = false;
}
// Now it's time to stop the operation (and track telemetry).
telemetryClient.StopOperation(operation);
}
}
public static string GetOperationId(string id)
{
// Returns the root ID from the '|' to the first '.' if any.
int rootEnd = id.IndexOf('.');
if (rootEnd < 0)
rootEnd = id.Length;
int rootStart = id[0] == '|' ? 1 : 0;
return id.Substring(rootStart, rootEnd - rootStart);
}
}
Bağıntı için HTTP Protokolü de üst bilgiyi bildirir Correlation-Context
. Basitlik için burada atlanır.
Kuyruk izleme
Bağıntı için W3C İzleme Bağlamı ve HTTP Protokolü, bağıntı ayrıntılarını HTTP istekleriyle geçirir, ancak her kuyruk protokolü aynı ayrıntıların kuyruk iletisi boyunca nasıl geçirildiğini tanımlamalı. AMQP gibi bazı kuyruk protokolleri daha fazla meta veri geçirilmesine izin verir. Azure Depolama Kuyruğu gibi diğer protokoller, bağlamın ileti yüküne kodlanmış olmasını gerektirir.
Not
Bileşenler arası izleme henüz kuyruklar için desteklenmemektedir.
HTTP ile, üreticiniz ve tüketiciniz farklı Uygulama Analizler kaynaklarına telemetri gönderiyorsa, işlem tanılama deneyimi ve Uygulama Haritası işlemleri gösterir ve uçtan uca eşler. Kuyruklar söz konusu olduğunda, bu özellik henüz desteklenmemektedir.
Service Bus kuyruğu
İzleme bilgileri için bkz . Azure Service Bus mesajlaşması aracılığıyla dağıtılmış izleme ve bağıntı.
Azure Depolama kuyruğu
Aşağıdaki örnekte, Azure Depolama kuyruk işlemlerinin nasıl izlenip üretici, tüketici ve Azure Depolama arasında telemetrinin nasıl ilişkilendirilme işlemi gösterilmektedir.
Depolama kuyruğunun bir HTTP API'si vardır. Kuyruğa yapılan tüm çağrılar HTTP istekleri için Uygulama Analizler Bağımlılık Toplayıcısı tarafından izlenir. ASP.NET ve ASP.NET Core uygulamalarında varsayılan olarak yapılandırılır. Diğer uygulama türlerinde Konsol uygulamaları belgelerine bakın.
Uygulama Analizler işlem kimliğini Depolama istek kimliğiyle ilişkilendirmek de isteyebilirsiniz. Depolama istek istemcisi ve sunucu isteği kimliği ayarlama ve alma hakkında bilgi için bkz. Azure Depolama izleme, tanılama ve sorunlarını giderme.
Enqueue
Depolama kuyrukları HTTP API'sini desteklediğinden, kuyrukla yapılan tüm işlemler Uygulama Analizler tarafından otomatik olarak izlenir. Çoğu durumda, bu izleme yeterli olmalıdır. Tüketici tarafındaki izlemeleri üretici izlemeleriyle ilişkilendirmek için, bağıntı için HTTP Protokolü'nde yaptığımıza benzer bir bağıntı bağlamı geçirmeniz gerekir.
Bu örnekte işlemin nasıl izlenir gösterilmektedir Enqueue
. Şunları yapabilirsiniz:
- Yeniden denemeleri bağıntılı (varsa): Hepsinin ortak bir üst öğesi vardır ve bu işlemdir
Enqueue
. Aksi takdirde, bunlar gelen isteğin alt öğeleri olarak izlenir. Kuyruğa birden çok mantıksal istek varsa, hangi çağrının yeniden denemelere neden olduğunu bulmak zor olabilir. - Depolama günlükleri (gerekirse ve gerektiğinde) ilişkilendirin: Bunlar Uygulama Analizler telemetrisiyle ilişkilendirildi.
İşlem Enqueue
, üst işlemin alt öğesidir. Bir örnek, gelen HTTP isteğidir. HTTP bağımlılık çağrısı, işlemin alt öğesi Enqueue
ve gelen isteğin torunlarıdır.
public async Task Enqueue(CloudQueue queue, string message)
{
var operation = telemetryClient.StartOperation<DependencyTelemetry>("enqueue " + queue.Name);
operation.Telemetry.Type = "Azure queue";
operation.Telemetry.Data = "Enqueue " + queue.Name;
// MessagePayload represents your custom message and also serializes correlation identifiers into payload.
// For example, if you choose to pass payload serialized to JSON, it might look like
// {'RootId' : 'some-id', 'ParentId' : '|some-id.1.2.3.', 'message' : 'your message to process'}
var jsonPayload = JsonConvert.SerializeObject(new MessagePayload
{
RootId = operation.Telemetry.Context.Operation.Id,
ParentId = operation.Telemetry.Id,
Payload = message
});
CloudQueueMessage queueMessage = new CloudQueueMessage(jsonPayload);
// Add operation.Telemetry.Id to the OperationContext to correlate Storage logs and Application Insights telemetry.
OperationContext context = new OperationContext { ClientRequestID = operation.Telemetry.Id};
try
{
await queue.AddMessageAsync(queueMessage, null, null, new QueueRequestOptions(), context);
}
catch (StorageException e)
{
operation.Telemetry.Properties.Add("AzureServiceRequestID", e.RequestInformation.ServiceRequestID);
operation.Telemetry.Success = false;
operation.Telemetry.ResultCode = e.RequestInformation.HttpStatusCode.ToString();
telemetryClient.TrackException(e);
}
finally
{
// Update status code and success as appropriate.
telemetryClient.StopOperation(operation);
}
}
Uygulama raporlarınızın telemetri miktarını azaltmak için veya işlemi başka nedenlerle izlemek Enqueue
istemiyorsanız API'yi Activity
doğrudan kullanın:
- Uygulama Analizler işlemini başlatmak yerine yeni
Activity
bir oluşturma (ve başlatma). İşlem adı dışında üzerinde herhangi bir özellik atamanız gerekmez. - yerine ileti yükünü
operation.Telemetry.Id
seri hale getirmeyourActivity.Id
. komutunu da kullanabilirsinizActivity.Current.Id
.
Kuyruktan Çıkarma
benzer şekildeEnqueue
, Depolama kuyruğuna yönelik gerçek bir HTTP isteği, Uygulama Analizler tarafından otomatik olarak izlenir. İşlem Enqueue
büyük olasılıkla gelen istek bağlamı gibi üst bağlamda gerçekleşir. Uygulama Analizler SDK'ları, bu tür bir işlemi ve HTTP bölümünü, üst istek ve diğer telemetri verilerinin aynı kapsamda bildirildiği şekilde otomatik olarak ilişkilendirilir.
İşlem Dequeue
biraz karmaşık. Uygulama Analizler SDK'sı HTTP isteklerini otomatik olarak izler. Ancak ileti ayrıştırılana kadar bağıntı bağlamını bilmez. özellikle birden fazla ileti alındığında, iletiyi almak için HTTP isteğini telemetrinin geri kalanıyla ilişkilendirmek mümkün değildir.
public async Task<MessagePayload> Dequeue(CloudQueue queue)
{
var operation = telemetryClient.StartOperation<DependencyTelemetry>("dequeue " + queue.Name);
operation.Telemetry.Type = "Azure queue";
operation.Telemetry.Data = "Dequeue " + queue.Name;
try
{
var message = await queue.GetMessageAsync();
}
catch (StorageException e)
{
operation.telemetry.Properties.Add("AzureServiceRequestID", e.RequestInformation.ServiceRequestID);
operation.telemetry.Success = false;
operation.telemetry.ResultCode = e.RequestInformation.HttpStatusCode.ToString();
telemetryClient.TrackException(e);
}
finally
{
// Update status code and success as appropriate.
telemetryClient.StopOperation(operation);
}
return null;
}
İşlem
Aşağıdaki örnekte, gelen bir ileti gelen HTTP isteğine benzer şekilde izlenir:
public async Task Process(MessagePayload message)
{
// After the message is dequeued from the queue, create RequestTelemetry to track its processing.
RequestTelemetry requestTelemetry = new RequestTelemetry { Name = "process " + queueName };
// It might also make sense to get the name from the message.
requestTelemetry.Context.Operation.Id = message.RootId;
requestTelemetry.Context.Operation.ParentId = message.ParentId;
var operation = telemetryClient.StartOperation(requestTelemetry);
try
{
await ProcessMessage();
}
catch (Exception e)
{
telemetryClient.TrackException(e);
throw;
}
finally
{
// Update status code and success as appropriate.
telemetryClient.StopOperation(operation);
}
}
Benzer şekilde, diğer kuyruk işlemleri de izlenebilir. Bir göz atma işlemi, dequeue işlemine benzer bir şekilde izlenmelidir. Kuyruk yönetimi işlemlerini izleme gerekli değildir. Uygulama Analizler HTTP gibi işlemleri izler ve çoğu durumda yeterlidir.
İleti silme işlemini işaretlerken işlem (bağıntı) tanımlayıcılarını ayarladığınızdan emin olun. Alternatif olarak API'yi Activity
kullanabilirsiniz. Ardından, Uygulama Analizler SDK'sı bunu sizin için yaptığı için telemetri öğelerinde işlem tanımlayıcıları ayarlamanız gerekmez:
- Kuyruktan bir öğe aldıktan sonra yeni
Activity
bir öğe oluşturun. - Tüketici ve üretici günlüklerini ilişkilendirmek için kullanın
Activity.SetParentId(message.ParentId)
. Activity
öğesini başlatın.- Yardımcıları kullanarak
Start/StopOperation
sorguları kaldırma, işleme ve silme işlemlerini izleyin. Bunu aynı zaman uyumsuz denetim akışından (yürütme bağlamı) yapın. Bu şekilde, düzgün bir şekilde bağıntılı olurlar. Activity
nu durdurun.- Telemetriyi el ile kullanın
Start/StopOperation
veya çağırabilirsinizTrack
.
Bağımlılık türleri
Uygulama Analizler, kullanıcı arabirimi deneyimlerini özelleştirmek için bağımlılık türünü kullanır. Kuyruklar için İşlem tanılama deneyimini geliştiren aşağıdaki türlerini DependencyTelemetry
tanır:
Azure queue
Azure Depolama kuyrukları içinAzure Event Hubs
Azure Event Hubs içinAzure Service Bus
Azure Service Bus için
Toplu işleme
Bazı kuyruklarla, tek bir istekle birden çok iletinin sırasını kaldırabilirsiniz. Bu tür iletilerin işlenmesi büyük olasılıkla bağımsızdır ve farklı mantıksal işlemlere aittir. İşlemin işlenmekte olan belirli bir iletiyle bağıntılı Dequeue
olması mümkün değildir.
Her ileti kendi zaman uyumsuz denetim akışında işlenmelidir. Daha fazla bilgi için Giden bağımlılıkları izleme bölümüne bakın.
Uzun süre çalışan arka plan görevleri
Bazı uygulamalar, kullanıcı isteklerinin neden olabileceği uzun süre çalışan işlemler başlatır. İzleme/izleme perspektifinden, istek veya bağımlılık izlemesinden farklı değildir:
async Task BackgroundTask()
{
var operation = telemetryClient.StartOperation<DependencyTelemetry>(taskName);
operation.Telemetry.Type = "Background";
try
{
int progress = 0;
while (progress < 100)
{
// Process the task.
telemetryClient.TrackTrace($"done {progress++}%");
}
// Update status code and success as appropriate.
}
catch (Exception e)
{
telemetryClient.TrackException(e);
// Update status code and success as appropriate.
throw;
}
finally
{
telemetryClient.StopOperation(operation);
}
}
Bu örnekte bağıntı telemetryClient.StartOperation
bağlamını oluşturur DependencyTelemetry
ve doldurur. İşlemi zamanlayan gelen istekler tarafından oluşturulmuş bir üst işleminiz olduğunu varsayalım. Gelen istekle aynı zaman uyumsuz denetim akışında başladığı sürece BackgroundTask
, bu üst işlemle bağıntılıdır. BackgroundTask
ve tüm iç içe telemetri öğeleri, istek sona erdikten sonra bile buna neden olan istekle otomatik olarak ilişkilendirilir.
Görev, kendisiyle ilişkilendirilmiş herhangi bir işlemi (Activity
) olmayan arka plan iş parçacığından başladığında üst BackgroundTask
öğe yoktur. Ancak, iç içe işlemlere sahip olabilir. Görevden bildirilen tüm telemetri öğeleri içinde BackgroundTask
oluşturulan ile DependencyTelemetry
ilişkilendirilir.
Giden bağımlılıkları izleme
Kendi bağımlılık türünüzü veya Uygulama Analizler tarafından desteklenmeyen bir işlemi izleyebilirsiniz.
Enqueue
Service Bus kuyruğundaki veya Depolama kuyruğundaki yöntem, bu tür özel izleme için örnek olarak kullanılabilir.
Özel bağımlılık izleme için genel yaklaşım:
- Bağıntı
TelemetryClient.StartOperation
için gereken özellikleri ve başlangıç, zaman damgası ve süre gibi diğer bazı özellikleri dolduranDependencyTelemetry
(uzantı) yöntemini çağırın. - üzerinde
DependencyTelemetry
ad ve ihtiyacınız olan diğer bağlam gibi diğer özel özellikleri ayarlayın. - Bir bağımlılık çağrısı yapın ve bekleyin.
- İşlem tamamlandığında ile
StopOperation
işlemini durdurun. - Özel durumları işleme.
public async Task RunMyTaskAsync()
{
using (var operation = telemetryClient.StartOperation<DependencyTelemetry>("task 1"))
{
try
{
var myTask = await StartMyTaskAsync();
// Update status code and success as appropriate.
}
catch(...)
{
// Update status code and success as appropriate.
}
}
}
Bir işlemin atılması işlemin durmasına neden olur, bu nedenle çağrısı StopOperation
yapmak yerine bunu yapabilirsiniz.
Uyarı
Bazı durumlarda, işlenmeyen bir özel durum çağrılmasını engelleyebilirfinally
, bu nedenle işlemler izlenmeyebilir.
Paralel işlemler işleme ve izleme
Çağrısı StopOperation
yalnızca başlatılan işlemi durdurur. Geçerli çalışan işlem durdurmak istediğiniz işlemle eşleşmiyorsa hiçbir StopOperation
şey yapmaz. Aynı yürütme bağlamında paralel olarak birden çok işlem başlatırsanız bu durum oluşabilir.
var firstOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 1");
var firstTask = RunMyTaskAsync();
var secondOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 2");
var secondTask = RunMyTaskAsync();
await firstTask;
// FAILURE!!! This will do nothing and will not report telemetry for the first operation
// as currently secondOperation is active.
telemetryClient.StopOperation(firstOperation);
await secondTask;
Paralel çalışan işlemleri yalıtmak için işlemi her zaman aynı zaman uyumsuz yöntemde çağırdığınızdan StartOperation
ve işlediğinize emin olun. İşlem zaman uyumluysa (veya zaman uyumsuz değilse), işlemi sarmalayıp ile Task.Run
izleyin.
public void RunMyTask(string name)
{
using (var operation = telemetryClient.StartOperation<DependencyTelemetry>(name))
{
Process();
// Update status code and success as appropriate.
}
}
public async Task RunAllTasks()
{
var task1 = Task.Run(() => RunMyTask("task 1"));
var task2 = Task.Run(() => RunMyTask("task 2"));
await Task.WhenAll(task1, task2);
}
Application Analizler operations vs. System.Diagnostics.Activity
System.Diagnostics.Activity
dağıtılmış izleme bağlamını temsil eder ve çerçeveler ve kitaplıklar tarafından işlemin içinde ve dışında bağlam oluşturup yaymak ve telemetri öğelerini ilişkilendirmek için kullanılır. Activity
gelen veya giden istekler ve özel durumlar gibi ilginç olayları bildirmek için çerçeve/kitaplık arasında bildirim mekanizması olarak birlikte System.Diagnostics.DiagnosticSource
çalışır.
Etkinlikler Uygulama Analizler birinci sınıf vatandaşlardır. Otomatik bağımlılık ve istek koleksiyonu, olaylarla DiagnosticSource
birlikte bunlara yoğun bir şekilde güvenir. Uygulamanızda oluşturduysanız Activity
Uygulama Analizler telemetrisi oluşturulmaz. Uygulama Analizler telemetriye çevrilmesi Activity
için olayları alması DiagnosticSource
ve olay adlarını ve yüklerini bilmesi gerekir.
Her Uygulama Analizler işlemi (istek veya bağımlılık) içerirActivity
. Çağrıldığında StartOperation
, altında oluşturur Activity
. StartOperation
, istek veya bağımlılık telemetrilerini el ile izlemenin ve her şeyin bağıntılı olduğundan emin olmak için önerilen yoldur.
Sonraki adımlar
- Uygulama Analizler telemetri bağıntısının temellerini öğrenin.
- bağıntılı verilerin işlem tanılama deneyimini ve Uygulama Eşlemesi'ne nasıl güç kattıklarına göz atın.
- Bkz. Uygulama Analizler türleri ve veri modeli için veri modeli.
- Özel olayları ve ölçümleri Uygulama Analizler'ne bildirin.
- Bağlam özellikleri koleksiyonu için standart yapılandırmaya göz atın.
- Telemetriyi nasıl ilişkilendirdiğimize bakmak için System.Diagnostics.Activity Kullanıcı Kılavuzu'na bakın.