.NET ve .NET Core'da özel ölçüm koleksiyonu
Azure İzleyici Application Insights .NET ve .NET Core SDK'larının özel ölçümleri toplamak için iki farklı yöntemi vardır: TrackMetric()
ve GetMetric()
. Bu iki yöntem arasındaki temel fark yerel toplamadır. yönteminde TrackMetric()
önceden toplama yok. GetMetric()
yönteminde önceden toplama vardır. Toplama kullanmanızı öneririz, bu nedenle TrackMetric()
artık özel ölçümleri toplamak için tercih edilen yöntem değildir. Bu makale, yöntemini ve nasıl çalıştığının ardındaki nedenlerden bazılarını kullanma GetMetric()
konusunda size yol gösterir.
Not
Aşağıdaki belgeler Application Insights klasik API'sine dayanır. Application Insights 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 ve OpenTelemetry Yol Haritamız. Geçiş kılavuzu .NET, Node.js ve Python için kullanılabilir.
Önceden toplama ve önceden toplama olmayan API karşılaştırması
yöntemi, TrackMetric()
bir ölçümü belirten ham telemetri gönderir. Her değer için tek bir telemetri öğesi göndermek verimsizdir. Yöntemi TrackMetric()
performans açısından da verimsizdir çünkü her TrackMetric(item)
biri telemetri başlatıcılarının ve işlemcilerinin tam SDK işlem hattından geçer.
'nin aksine TrackMetric()
, GetMetric()
sizin için yerel ön toplamayı işler ve ardından yalnızca bir dakikalık sabit bir aralıkta toplu özet ölçümü gönderir. Bazı özel ölçümleri ikinci ve hatta milisaniye düzeyinde yakından izlemeniz gerekiyorsa, bunu yalnızca dakikada bir izlemenin depolama ve ağ trafiği maliyetine neden olurken yapabilirsiniz. Toplanan ölçüm için gönderilmesi gereken telemetri öğelerinin toplam sayısı büyük ölçüde azaldığından bu davranış azaltma riskini de büyük ölçüde azaltır.
Application Insights'ta, aracılığıyla TrackMetric()
toplanan ve GetMetric()
örneklemeye tabi olmayan özel ölçümler. Önemli ölçümleri örneklemek, bu ölçümlerin etrafında oluşturabileceğiniz uyarıların güvenilir olmadığı senaryolara yol açabilir. Özel ölçümlerinizi hiçbir zaman örneklemediğinizde, genellikle uyarı eşikleriniz ihlal edildiğinde uyarının tetiklendiğinden emin olabilirsiniz. Özel ölçümler örneklenmemiş olduğundan bazı olası endişeler vardır.
Bir ölçümde her saniye veya daha ayrıntılı bir aralıkta eğilim izleme aşağıdakilere neden olabilir:
- Artan veri depolama maliyetleri. Azure İzleyici'ye ne kadar veri gönderdiğinizle ilişkili bir maliyet vardır. Ne kadar çok veri gönderirseniz izlemenin genel maliyeti o kadar yüksek olur.
- Artan ağ trafiği veya performans yükü. Bazı senaryolarda bu ek yükün hem parasal hem de uygulama performansı maliyeti olabilir.
- Alma azaltma riski. Uygulamanız kısa bir zaman aralığında yüksek oranda telemetri gönderdiğinde Azure İzleyici veri noktalarını bırakır ("kısıtlar").
Azaltma, uyarıların yanıtsız olmasına neden olabileceği için bir sorundur. Bir uyarıyı tetikleme koşulu yerel olarak gerçekleşebilir ve çok fazla veri gönderildiği için alım uç noktasına bırakılabilir. Kendi yerel toplama mantığınızı uygulamadığınız sürece .NET ve .NET Core için kullanılmasını TrackMetric()
önermeyiz. Belirli bir zaman aralığında gerçekleşen her örneği izlemeye çalışıyorsanız, bunun daha uygun olduğunu TrackEvent()
fark edebilirsiniz. Özel ölçümlerden farklı olarak özel olayların örneklemeye tabi olduğunu unutmayın. Kendi yerel ön toplamanızı yazmadan bile kullanabilirsiniz TrackMetric()
. Ama bunu yaparsanız, tuzakların farkında olun.
Özetle, ön toplama yaptığı için tüm Track()
çağrılardan değerleri birikmesi ve dakikada bir özet/toplama göndermesi önerilirGetMetric()
. Yöntem, GetMetric()
tüm ilgili bilgileri toplamaya devam ederken daha az veri noktası göndererek maliyet ve performans ek yükünü önemli ölçüde azaltabilir.
Not
Yalnızca .NET ve .NET Core SDK'larının bir GetMetric()
yöntemi vardır. Java kullanıyorsanız bkz . Mikrometre kullanarak özel ölçümler gönderme. JavaScript ve Node.js için kullanmaya devam TrackMetric()
edebilirsiniz, ancak önceki bölümde açıklanan uyarıları aklınızda bulundurun. Python için OpenCensus.stats kullanarak özel ölçümler gönderebilirsiniz, ancak ölçüm uygulaması farklıdır.
GetMetric'i kullanmaya başlama
Örneklerimiz için temel bir .NET Core 3.1 çalışan hizmeti uygulaması kullanacağız. Bu örneklerle kullanılan test ortamını çoğaltmak istiyorsanız, çalışan hizmetini izleme makalesindeki 1-6 arası adımları izleyin. Bu adımlar, Application Insights'ı temel çalışan hizmeti proje şablonuna ekler. Kavramlar, web uygulamaları ve konsol uygulamaları da dahil olmak üzere SDK'nın kullanabildiği tüm genel uygulamalar için geçerlidir.
Ölçümleri gönderme
Dosyanızın worker.cs
içeriğini aşağıdaki kodla değiştirin:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;
namespace WorkerService3
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private TelemetryClient _telemetryClient;
public Worker(ILogger<Worker> logger, TelemetryClient tc)
{
_logger = logger;
_telemetryClient = tc;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ // The following line demonstrates usages of GetMetric API.
// Here "computersSold", a custom metric name, is being tracked with a value of 42 every second.
while (!stoppingToken.IsCancellationRequested)
{
_telemetryClient.GetMetric("ComputersSold").TrackValue(42);
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
}
Örnek kodu çalıştırdığınızda, Visual Studio çıkış penceresinde telemetri gönderilmeden döngünün art arda yürütülmekte olduğunu görürsünüz while
. Tek bir telemetri öğesi yaklaşık 60 saniye işareti tarafından gönderilir ve bu da testte şöyle görünür:
Application Insights Telemetry: {"name":"Microsoft.ApplicationInsights.Dev.00000000-0000-0000-0000-000000000000.Metric", "time":"2019-12-28T00:54:19.0000000Z",
"ikey":"00000000-0000-0000-0000-000000000000",
"tags":{"ai.application.ver":"1.0.0.0",
"ai.cloud.roleInstance":"Test-Computer-Name",
"ai.internal.sdkVersion":"m-agg2c:2.12.0-21496",
"ai.internal.nodeName":"Test-Computer-Name"},
"data":{"baseType":"MetricData",
"baseData":{"ver":2,"metrics":[{"name":"ComputersSold",
"kind":"Aggregation",
"value":1722,
"count":41,
"min":42,
"max":42,
"stdDev":0}],
"properties":{"_MS.AggregationIntervalMs":"42000",
"DeveloperMode":"true"}}}}
Bu tek telemetri öğesi 41 ayrı ölçüm ölçümünün toplamını temsil eder. Aynı değeri tekrar tekrar gönderdiğimiz için, aynı maksimum () 0
ve en düşük (stDev
max
) değerlerle standart sapması (min
) vardır. özelliği, value
toplanan tüm tek tek değerlerin toplamını temsil eder.
Not
yöntemi, GetMetric
son değeri izlemeyi (örneğin, gauge
) veya histogramları veya dağıtımları izlemeyi desteklemez.
Application Insights kaynağımızı Günlükler (Analiz) deneyiminde incelediğimizde, tek tek telemetri öğesi aşağıdaki ekran görüntüsüne benzer olacaktır.
Not
Ham telemetri öğesi alındıktan sonra açık bir sum özelliği/alanı içermese de sizin için bir tane oluştururuz. Bu durumda hem value
ve valueSum
özelliği aynı şeyi temsil eder.
Ayrıca portalın Ölçümler bölümünden özel ölçüm telemetrinize hem günlük tabanlı hem de özel ölçüm olarak erişebilirsiniz. Aşağıdaki ekran görüntüsü günlük tabanlı ölçüm örneğidir.
Yüksek aktarım hızı kullanımı için önbellek ölçümü başvurusu
Ölçüm değerleri bazı durumlarda sık sık gözlemlenebilir. Örneğin, saniyede 500 istek işleyen yüksek aktarım hızına sahip bir hizmet, her istek için 20 telemetri ölçümü yaymak isteyebilir. Sonuç, saniyede 10.000 değeri izleme anlamına gelir. Bu tür yüksek aktarım hızı senaryolarında kullanıcıların bazı aramalardan kaçınarak SDK'ya yardımcı olması gerekebilir.
Örneğin, önceki örnekte ölçüm ComputersSold
için bir tanıtıcı için bir arama gerçekleştirildi ve ardından gözlemlenen değeri 42
izlendi. Bunun yerine, tanıtıcı birden çok izleme çağrısı için önbelleğe alınmış olabilir:
//...
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// This is where the cache is stored to handle faster lookup
Metric computersSold = _telemetryClient.GetMetric("ComputersSold");
while (!stoppingToken.IsCancellationRequested)
{
computersSold.TrackValue(42);
computersSold.TrackValue(142);
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(50, stoppingToken);
}
}
Önceki örnek, ölçüm tutamacını önbelleğe almanın yanı sıra döngünün daha sık yürütülmesi için 50 milisaniyeye indi Task.Delay
. Sonuç 772 TrackValue()
çağrıdır.
Çok boyutlu ölçümler
Önceki bölümdeki örneklerde sıfır boyutlu ölçümler gösterilmektedir. Ölçümler çok boyutlu da olabilir. Şu anda en fazla 10 boyutu destekliyoruz.
Tek boyutlu ölçüm oluşturma örneği aşağıda verilmişti:
//...
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// This is an example of a metric with a single dimension.
// FormFactor is the name of the dimension.
Metric computersSold= _telemetryClient.GetMetric("ComputersSold", "FormFactor");
while (!stoppingToken.IsCancellationRequested)
{
// The number of arguments (dimension values)
// must match the number of dimensions specified while GetMetric.
// Laptop, Tablet, etc are values for the dimension "FormFactor"
computersSold.TrackValue(42, "Laptop");
computersSold.TrackValue(20, "Tablet");
computersSold.TrackValue(126, "Desktop");
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(50, stoppingToken);
}
}
Örnek kodun en az 60 saniye çalıştırılması, Azure'a üç ayrı telemetri öğesinin gönderilmesine neden olur. Her öğe, üç form faktöründen birinin toplamasını temsil eder. Daha önce olduğu gibi Günlükler (Analiz) görünümünde daha fazla inceleme yapabilirsiniz.
Ölçüm gezgininde:
Ölçümü yeni özel boyutunuzla bölemezseniz veya ölçümler görünümüyle özel boyutunuzu görüntüleyemezsiniz.
Varsayılan olarak, ölçüm gezginindeki çok boyutlu ölçümler Application Insights kaynaklarında açılmaz.
Çok boyutlu ölçümleri etkinleştirme
Application Insights kaynağında çok boyutlu ölçümleri etkinleştirmek için Kullanım ve tahmini maliyetler Özel Ölçümler>>Özel ölçüm boyutlarında>uyarıyı etkinleştir Tamam'ı seçin. Daha fazla bilgi için bkz . Özel ölçüm boyutları ve önceden toplama.
Bu değişikliği yaptıktan ve yeni çok boyutlu telemetri gönderdikten sonra Bölme uygula'yı seçebilirsiniz.
Not
Yalnızca portalda özellik açıldıktan sonra yeni gönderilen ölçümlerin boyutları depolanır.
Her FormFactor
boyut için ölçüm toplamalarınızı görüntüleyin.
Üçten fazla boyut olduğunda MetricIdentifier kullanma
Şu anda 10 boyut desteklenmektedir. Üçten fazla boyut kullanılması MetricIdentifier
gerekir:
// Add "using Microsoft.ApplicationInsights.Metrics;" to use MetricIdentifier
// MetricIdentifier id = new MetricIdentifier("[metricNamespace]","[metricId],"[dim1]","[dim2]","[dim3]","[dim4]","[dim5]");
MetricIdentifier id = new MetricIdentifier("CustomMetricNamespace","ComputerSold", "FormFactor", "GraphicsCard", "MemorySpeed", "BatteryCapacity", "StorageCapacity");
Metric computersSold = _telemetryClient.GetMetric(id);
computersSold.TrackValue(110,"Laptop", "Nvidia", "DDR4", "39Wh", "1TB");
Özel ölçüm yapılandırması
Ölçüm yapılandırmasını değiştirmek istiyorsanız, ölçümün başlatıldığı yerde değişiklikler yapmanız gerekir.
Özel boyut adları
Ölçümler, bunlara erişmek için kullanılan telemetri bağlamını TelemetryClient
kullanmaz. Sınıfında sabit olarak kullanılabilen özel boyut adlarının MetricDimensionNames
kullanılması, bu sınırlama için en iyi geçici çözümdür.
Aşağıdaki Special Operation Request Size
ölçüm tarafından gönderilen ölçüm toplamaları olarak Special Operation
ayarlanmadıContext.Operation.Name
. TrackMetric()
yöntemi veya başka TrackXXX()
bir yöntem olarak doğru Special Operation
ayarlanmış olacaktırOperationName
.
//...
TelemetryClient specialClient;
private static int GetCurrentRequestSize()
{
// Do stuff
return 1100;
}
int requestSize = GetCurrentRequestSize()
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//...
specialClient.Context.Operation.Name = "Special Operation";
specialClient.GetMetric("Special Operation Request Size").TrackValue(requestSize);
//...
}
}
Bu durumda, değerleri belirtmek TelemetryContext
için sınıfında listelenen MetricDimensionNames
özel boyut adlarını kullanın.
Örneğin, bir sonraki deyimden elde edilen ölçüm toplaması Application Insights bulut uç noktasına gönderildiğinde, Context.Operation.Name
veri alanı olarak Special Operation
ayarlanır:
_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");
Bu özel boyutun değerleri içine kopyalanır TelemetryContext
ve normal boyut olarak kullanılmaz. Normal ölçüm keşfi için bir işlem boyutunu da korumak istiyorsanız, bu amaç için ayrı bir boyut oluşturmanız gerekir:
_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Boyut ve zaman serisi sınırlaması
Telemetri alt sisteminin kaynaklarınızı yanlışlıkla kullanmasını önlemek için ölçüm başına en fazla veri serisi sayısını denetleyebilirsiniz. Varsayılan sınırlar, ölçüm başına en fazla 1.000 toplam veri serisi ve boyut başına en fazla 100 farklı değerdir.
Önemli
Azaltmayı önlemek için boyutlar için düşük kardinal değerleri kullanın.
Boyut ve zaman serisi kısıtlaması bağlamında, sınırların dikkate alındığından emin olmak için kullanırız Metric.TrackValue(..)
. Sınırlara zaten ulaşıldıysa, Metric.TrackValue(..)
döndürür False
ve değer izlenmez. Aksi takdirde döndürür True
. Bu davranış, bir ölçümün verileri kullanıcı girişinden kaynaklanıyorsa yararlıdır.
Oluşturucu, MetricConfiguration
ilgili ölçüm içinde farklı serileri yönetmeye ilişkin bazı seçenekleri ve ölçümün her bir serisi için toplama davranışını belirten bir sınıfın IMetricSeriesConfiguration
nesnesini alır:
var metConfig = new MetricConfiguration(seriesCountLimit: 100, valuesPerDimensionLimit:2,
new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));
Metric computersSold = _telemetryClient.GetMetric("ComputersSold", "Dimension1", "Dimension2", metConfig);
// Start tracking.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value1");
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value2");
// The following call gives 3rd unique value for dimension2, which is above the limit of 2.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3");
// The above call does not track the metric, and returns false.
seriesCountLimit
bir ölçümün içerebileceği en fazla veri zaman serisi sayısıdır. Bu sınıra ulaşıldığında, bu sınıraTrackValue()
yapılan çağrılar normalde yeni bir seri döndürülmesiyle sonuçlanırfalse
.valuesPerDimensionLimit
boyut başına ayrı değerlerin sayısını benzer şekilde sınırlar.restrictToUInt32Values
yalnızca negatif olmayan tamsayı değerlerinin izlenip izlenmeyeceğini belirler.
Burada, sınır sınırlarının aşılıp aşılmadığını öğrenmek için bir ileti gönderme örneği verilmişti:
if (! computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3"))
{
// Add "using Microsoft.ApplicationInsights.DataContract;" to use SeverityLevel.Error
_telemetryClient.TrackTrace("Metric value not tracked as value of one of the dimension exceeded the cap. Revisit the dimensions to ensure they are within the limits",
SeverityLevel.Error);
}
Sonraki adımlar
- Ölçümler - Get - REST API
- Özel olaylar ve ölçümler için Application Insights API
- Çalışan hizmeti uygulamalarını izleme hakkında daha fazla bilgi edinin.
- Günlük tabanlı ve önceden toplanmış ölçümleri kullanın.
- Ölçüm gezgini ile ölçümleri analiz etme.
- ASP.NET Core uygulamaları için Application Insights'ı etkinleştirmeyi öğrenin.
- ASP.NET uygulamaları için Application Insights'ı etkinleştirmeyi öğrenin.