Cara menggunakan DEMISIONS pada JavaScript

Lompati ke konten utama

Browser ini sudah tidak didukung.

Mutakhirkan ke Microsoft Edge untuk memanfaatkan fitur, pembaruan keamanan, dan dukungan teknis terkini.

Kumpulan metrik kustom di .NET dan .NET Core

  • Artikel
  • 09/23/2022
  • 9 menit untuk membaca

Dalam artikel ini

Azure Monitor Application Insights .NET dan .NET Core SDK memiliki dua metode berbeda untuk mengumpulkan metrik kustom, TrackMetric[] dan GetMetric[]. Perbedaan utama antara kedua metode ini adalah agregasi lokal. TrackMetric[] tidak memiliki pra-agregasi sementara GetMetric[] memiliki pra-agregasi. Pendekatan yang direkomendasikan adalah menggunakan agregasi, oleh karena itu TrackMetric[] bukan lagi metode yang disukai untuk mengumpulkan metrik kustom. Artikel ini akan memandu Anda menggunakan metode GetMetric[], dan beberapa alasan di balik cara kerjanya.

API pra-agregasi vs non pra-agregasi

TrackMetric[] mengirimkan telemetri mentah yang menunjukkan metrik. Tidak efisien untuk mengirim satu item telemetri untuk setiap nilai. TrackMetric[] juga tidak efisien dalam hal performa karena setiap TrackMetric[item] melalui alur SDK penuh inisialisasi dan prosesor telemetri. Tidak seperti TrackMetric[], GetMetric[] menangani pra-agregasi lokal untuk Anda kemudian hanya mengirimkan metrik ringkasan agregat pada interval tetap satu menit. Jadi, jika Anda perlu memantau dengan cermat beberapa metrik khusus pada tingkat kedua atau bahkan milidetik, Anda dapat melakukannya sambil hanya mengeluarkan biaya penyimpanan dan lalu lintas jaringan hanya untuk memantau setiap menit. Perilaku ini juga sangat mengurangi risiko terjadinya pembatasan karena jumlah total item telemetri yang perlu dikirim untuk metrik yang diagregat jauh berkurang.

Dalam Application Insights, metrik kustom yang dikumpulkan melalui TrackMetric[] dan GetMetric[] tidak terpengaruh oleh pengambilan sampel. Pengambilan sampel metrik penting dapat menyebabkan skenario di mana peringatan yang mungkin telah Anda buat di sekitar metrik tersebut bisa menjadi tidak dapat diandalkan. Dengan tidak pernah mengambil metrik kustom, Anda biasanya dapat yakin bahwa ketika ambang batas peringatan dilanggar, peringatan akan aktif. Tetapi karena metrik kustom tidak diambil sampelnya, ada beberapa masalah yang berpotensi terjadi.

Pelacakan tren dalam metrik setiap detik, atau pada interval yang lebih terperinci dapat menyebabkan:

  • Peningkatan biaya penyimpanan data. Ada biaya yang terkait dengan jumlah data yang Anda kirim ke Azure Monitor. [Semakin banyak data yang Anda kirim semakin besar biaya pemantauan secara keseluruhan.]
  • Peningkatan lalu lintas jaringan/overhead performa. [Dalam beberapa skenario biaya tambahan ini dapat memiliki biaya performa moneter dan aplikasi.]
  • Risiko pembatasan penyerapan. [Layanan Azure Monitor menghilangkan ["membatasi"] titik data saat aplikasi Anda mengirim telemetri dengan laju yang tinggi dalam jarak waktu singkat.]

Pembatasan menjadi perhatian karena dapat menyebabkan pemberitahuan yang terlewatkan. Kondisi untuk memicu peringatan dapat terjadi secara lokal, kemudian dihilangkan pada titik akhir penyerapan akibat jumlah data yang dikirimkan terlalu banyak. Kami tidak merekomendasikan penggunaan TrackMetric[] untuk .NET dan .NET Core kecuali Anda telah menerapkan logika agregasi lokal Anda sendiri. Jika Anda mencoba melacak setiap instans terjadinya peristiwa selama periode waktu tertentu, Anda mungkin menemukan bahwa TrackEvent[] lebih cocok. Meskipun perlu diingat bahwa tidak seperti metrik kustom, peristiwa kustom akan diambil sampelnya. Anda masih dapat menggunakan TrackMetric[] bahkan tanpa menulis pra-agregasi lokal sendiri, tetapi jika Anda melakukannya, waspadalah terhadap perangkapnya.

Singkatnya GetMetric[] adalah pendekatan yang direkomendasikan karena melakukan pra-agregasi, pendekatan ini mengakumulasi nilai dari semua panggilan Track[] dan mengirim ringkasan/agregat setiap menit. GetMetric[] dapat secara signifikan mengurangi biaya dan pengeluaran tambahan performa dengan mengirim lebih sedikit titik data, sambil tetap mengumpulkan semua informasi yang relevan.

Catatan

Hanya SDK Inti .NET dan .NET yang memiliki metode GetMetric[]. Jika Anda menggunakan Java, lihat mengirim metrik kustom menggunakan mikrometer. Untuk JavaScript dan Node.js Anda masih akan menggunakan TrackMetric[], tetapi perlu diingat peringatan yang diuraikan di bagian sebelumnya. Untuk Python Anda dapat menggunakan OpenCensus.stats untuk mengirim metrik kustom tetapi penerapan metriknya berbeda.

Mulai menggunakan GetMetric

Untuk contoh, kami akan menggunakan aplikasi layanan pekerja .NET Core 3.1 dasar. Jika Anda ingin mereplikasi lingkungan pengujian yang digunakan dengan contoh ini, ikuti langkah 1-6 dari artikel memantau layanan pekerja. Langkah-langkah ini akan menambahkan Application Insights ke templat proyek layanan pekerja dasar dan konsep tersebut berlaku untuk aplikasi umum apa pun di mana SDK dapat digunakan termasuk aplikasi web dan aplikasi konsol.

Mengirim metrik

Ganti isi file worker.cs Anda dengan kode berikut:

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 _logger;
        private TelemetryClient _telemetryClient;

        public Worker[ILogger 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];
            }
        }
    }
}

Saat menjalankan kode sampel, Anda akan melihat saat perulangan berulang kali dijalankan tanpa telemetri yang dikirim di jendela output Visual Studio. Satu item telemetri akan dikirim sekitar setiap 60 detik, yang dalam pengujian kami terlihat sebagai berikut:

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"}}}}

Item telemetri tunggal ini mewakili agregat 41 pengukuran metrik yang berbeda. Karena kami mengirim nilai yang sama berulang-ulang, kami memiliki simpangan baku [stDev] 0 dengan nilai maksimum [maks] dan minimum [menit] yang identik. Properti nilai menunjukkan jumlah semua nilai terpisah yang dikumpulkan.

Catatan

GetMetric tidak mendukung pelacakan nilai terakhir [yaitu "pengukur"] atau melacak histogram/distribusi.

Jika kami memeriksa sumber daya Application Insights kami di pengalaman Logs [Analytics], item telemetri terpisah ini akan terlihat sebagai berikut:

Catatan

Meskipun item telemetri mentah tidak berisi properti/bidang jumlah eksplisit setelah diserap, kami membuatnya untuk Anda. Dalam hal ini baik properti value dan valueSum mewakili hal yang sama.

Anda juga dapat mengakses telemetri metrik kustom di bagian Metrik di portal. Sebagai metrik berbasis log, dan kustom. [Cuplikan layar di bawah ini adalah contoh berbasis log.]

Pembuatan cache referensi metrik untuk penggunaan throughput tinggi

Nilai metrik dapat sering diamati dalam beberapa kasus. Misalnya, layanan throughput tinggi yang memproses 500 permintaan/detik mungkin ingin mengeluarkan 20 metrik telemetri untuk setiap permintaan. Hasilnya berarti melacak 10.000 nilai per detik. Dalam skenario throughput tinggi seperti itu, pengguna mungkin perlu membantu SDK dengan menghindari beberapa pencarian.

Misalnya, contoh di atas melakukan pencarian handel untuk metrik "ComputersSold", kemudian melacak nilai yang diamati 42. Sebaliknya, handel dapat di-cache untuk beberapa pemanggilan trek:

//...

        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];
            }
        }

Selain pembuatan cache handel metrik, contoh di atas juga mengurangi Task.Delay hingga 50 milidetik sehingga loop akan lebih sering dieksekusi menghasilkan 772 TrackValue[] pemanggilan.

Metrik multi-dimensi

Contoh di bagian sebelumnya memperlihatkan metrik tanpa dimensi. Metrik juga bisa multidimensi. Saat ini kami mendukung hingga 10 dimensi.

Berikut contoh cara membuat metrik satu dimensi:

//...

        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];
            }
        }

Menjalankan kode sampel ini setidaknya selama 60 detik akan menghasilkan tiga item telemetri berbeda yang dikirim ke Azure, masing-masing mewakili agregasi salah satu dari tiga faktor bentuk. Seperti sebelumnya, Anda dapat memeriksanya lebih jauh dalam tampilan Logs [Analytics]:

Dalam pengalaman Penjelajah metrik:

Namun, Anda akan melihat bahwa Anda tidak dapat membagi metrik berdasarkan dimensi kustom baru Anda, atau melihat dimensi kustom dengan tampilan metrik:

Secara default metrik multidimensi dalam pengalaman Penjelajah metrik tidak diaktifkan di sumber daya Application Insights.

Mengaktifkan metrik multidimensi

Untuk mengaktifkan metrik multi-dimensi untuk sumber daya Application Insights, Pilih Penggunaan dan perkiraan biaya>Metrik Kustom>Aktifkan pemberitahuan pada dimensi metrik kustom>OK. Detail selengkapnya mengenai hal ini dapat ditemukan di sini.

Setelah Anda membuat perubahan itu dan mengirim telemetri multidimensi baru, Anda akan dapat Menerapkan pemisahan.

Catatan

Hanya metrik yang baru dikirim setelah fitur dinyalakan di portal yang akan memiliki dimensi yang disimpan.

Dan lihat agregasi metrik Anda untuk setiap dimensi FormFactor:

Cara menggunakan MetricIdentifier ketika ada lebih dari tiga dimensi

Saat ini 10 dimensi didukung namun, lebih besar dari tiga dimensi membutuhkan penggunaan MetricIdentifier:

// 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"];

Konfigurasi metrik kustom

Jika ingin mengubah konfigurasi metrik, Anda perlu membuat perubahan di tempat metrik diinisialisasi.

Nama dimensi khusus

Metrik tidak menggunakan konteks telemetri TelemetryClient yang digunakan untuk mengaksesnya, nama dimensi khusus yang tersedia sebagai konstanta di kelas MetricDimensionNames adalah solusi terbaik untuk batasan ini.

Agregat metrik yang dikirim oleh metrik "Ukuran Permintaan Operasi Khusus" di bawah ini tidak akan Context.Operation.Name diatur ke "Operasi Khusus". Sedangkan TrackMetric[] atau TrackXXX[] lainnya akan OperationName diatur dengan benar ke "Operasi Khusus".

        //...
        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];
                //...
            }
                   
        }

Dalam keadaan ini, gunakan nama dimensi khusus yang tercantum dalam kelas MetricDimensionNames guna menentukan nilai TelemetryContext.

Misalnya, ketika agregat metrik yang dihasilkan dari pernyataan berikutnya dikirim ke titik akhir cloud Application Insights, bidang Context.Operation.Name datanya akan diatur ke "Operasi Khusus":

_telemetryClient.GetMetric["Request Size", MetricDimensionNames.TelemetryContext.Operation.Name].TrackValue[requestSize, "Special Operation"];

Nilai dimensi khusus ini akan disalin ke dalam TelemetryContext dan tidak akan digunakan sebagai dimensi 'normal'. Jika Anda ingin juga menyimpan dimensi operasi untuk eksplorasi metrik normal, Anda perlu membuat dimensi terpisah untuk tujuan tersebut:

_telemetryClient.GetMetric["Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name].TrackValue[requestSize, "Special Operation", "Special Operation"];

Pembatasan dimensi dan rangkaian waktu

Untuk mencegah subsistem telemetri tidak sengaja menggunakan sumber daya, Anda dapat mengontrol jumlah maksimum seri data per metrik. Batas default tidak lebih dari 1.000 total seri data per metrik, dan tidak lebih dari 100 nilai berbeda per dimensi.

Penting

Gunakan nilai kardinal rendah untuk dimensi guna menghindari pembatasan.

Dalam konteks pembatasan dimensi dan rangkaian waktu, kami menggunakan Metric.TrackValue[..] untuk memastikan bahwa batas diamati. Jika batas sudah tercapai, Metric.TrackValue[..] akan mengembalikan "False" dan nilainya tidak akan dilacak. Jika tidak, itu akan mengembalikan "True". Perilaku ini berguna jika data untuk metrik berasal dari input pengguna.

Konstruktor MetricConfiguration mengambil beberapa opsi tentang cara mengelola rangkaian yang berbeda dalam metrik masing-masing dan objek dari penerapan kelas IMetricSeriesConfiguration yang menentukan perilaku agregasi untuk setiap rangkaian masing-masing metrik:

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 adalah jumlah maksimum rangkaian waktu data yang dapat dimuat metrik. Setelah batas ini tercapai, panggilan ke TrackValue[] yang biasanya akan menghasilkan rangkaian baru akan mengembalikan false.
  • valuesPerDimensionLimit membatasi jumlah nilai yang berbeda per dimensi dengan cara sama.
  • restrictToUInt32Values menentukan apakah hanya nilai bilangan bulat non-negatif yang harus dilacak atau tidak.

Berikut contoh cara mengirim pesan untuk mengetahui apakah batas terlampaui:

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];
}

Langkah berikutnya

  • Pelajari selengkapnya tentang memantau aplikasi layanan pekerja.
  • Untuk detail lebih lanjut tentang metrik berbasis log dan pra-agregat.
  • Penjelajah Metrik
  • Cara mengaktifkan Application Insights untuk ASP.NET Core Applications
  • Cara mengaktifkan Application Insights untuk ASP.NET Applications

Bài mới nhất

Chủ Đề