Aracılığıyla paylaş


.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.

Ö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 (stDevmax) 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.

Log Analytics sorgu görünümünü gösteren ekran görüntüsü.

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.

Ölçüm gezgini görünümünü gösteren ekran görüntüsü.

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 42izlendi. 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.

Çok boyutlu ölçümün Log Analytics görünümünü gösteren ekran görüntüsü.

Ölçüm gezgininde:

Özel ölçümleri gösteren ekran görüntüsü.

Ölçümü yeni özel boyutunuzla bölemezseniz veya ölçümler görünümüyle özel boyutunuzu görüntüleyemezsiniz.

Bölme desteğini gösteren ekran görüntüsü.

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.

Bölmenin uygulanmasını gösteren ekran görüntüsü.

Her FormFactor boyut için ölçüm toplamalarınızı görüntüleyin.

Form faktörlerini gösteren ekran görüntüsü.

Üçten fazla boyut olduğunda MetricIdentifier kullanma

Şu anda 10 boyut desteklenmektedir. Üçten fazla boyut kullanılması MetricIdentifiergerekir:

// 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 OperationayarlanmadıContext.Operation.Name. TrackMetric() yöntemi veya başka TrackXXX() bir yöntem olarak doğru Special Operationayarlanmış 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 Operationayarlanı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ıra TrackValue() yapılan çağrılar normalde yeni bir seri döndürülmesiyle sonuçlanır false.
  • 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