Application Insights SDK'sında telemetri verilerini filtreleme ve ön işlemeden geçirme
Application Insights hizmetine gönderilmeden önce telemetriyi nasıl zenginleştirdiğini ve işlenebileceğinizi özelleştirmek için Application Insights SDK 'sı için eklentiler yazabilir ve yapılandırabilirsiniz.
- Örnekleme , istatistiklerinizi etkilemeden telemetri hacmini azaltır. Bir sorunu tanılarken bunlar arasında gezinebilmeniz için ilgili veri noktalarını birlikte tutar. Portalda toplam sayımlar, örnekleme için telafi ile çarpılır.
- Telemetri işlemcileriyle filtreleme, SDK 'da, sunucuya gönderilmeden önce Telemetriyi filtrelemenizi sağlar. Örneğin, robotlardan gelen istekleri dışlayarak telemetri hacmini azaltabilirsiniz. Filtreleme, trafiği örneklemeden azaltmak için daha temel bir yaklaşımdır. İletilen Özellikler üzerinde daha fazla denetim sağlar, ancak istatistiklerinizi etkiler. Örneğin, tüm başarılı istekleri filtreleyebilirsiniz.
- Telemetri başlatıcıları, uygulamanız tarafından gönderilen ve standart modüllerden Telemetriyi içeren herhangi bir telemetriye Özellikler ekler veya değiştirir . Örneğin, portalda verilerin filtreleneceği Hesaplanmış değerler veya sürüm numaraları ekleyebilirsiniz.
- SDK API 'si özel olayları ve ölçümleri göndermek için kullanılır.
Başlamadan önce:
- uygulamanız için uygun SDK 'yı ( ASP.NET, ASP.NET Core, .net/.net Core veya JavaScript için HTTP olmayan/çalışan) yüklemeyi yapın.
Filtreleme
Bu teknik, telemetri akışından dahil edilen veya hariç tutulan Özellikler üzerinde doğrudan denetim sağlar. filtreleme, telemetri öğelerini Application Insights gönderilmeden bırakmak için kullanılabilir. Süzmeyi, örneklemeyle veya ayrı olarak kullanabilirsiniz.
Telemetriyi filtrelemek için bir telemetri işlemcisi yazın ve bunu ile kaydedin TelemetryConfiguration . Tüm telemetri işlemcinizde gider. Akıştan bırakmayı veya zincirde bir sonraki işlemciye vermenizi seçebilirsiniz. HTTP istek toplayıcısı ve bağımlılık toplayıcısı gibi standart modüllerden alınan telemetri ve kendi kendinize izlenen telemetri dahil edilmiştir. Örneğin, robots veya başarılı bağımlılık çağrılarından gelen istekler hakkında telemetri filtreleyebilirsiniz.
Uyarı
İşlemciler kullanılarak SDK 'dan gönderilen telemetrinin filtrelenmesi, portalda gördüğünüz istatistikleri eğebilir ve ilgili öğeleri izlemeyi zorlaştırır.
Bunun yerine örneklemekullanmayı düşünün.
Telemetri işlemcisi oluşturma (C#)
Filtre oluşturmak için uygulamasını uygulayın
ITelemetryProcessor.Telemetri işlemcileri bir işlem zinciri oluşturur. Bir telemetri işlemcisini örneklediğinizde, zincirdeki bir sonraki işlemciye bir başvuru vermiş olursunuz. Bir telemetri veri noktası işlem yöntemine geçirildiğinde, işi çalışır ve sonra zincirde bir sonraki telemetri işlemcisini çağırır (veya çağırmaz).
using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.Extensibility; public class SuccessfulDependencyFilter : ITelemetryProcessor { private ITelemetryProcessor Next { get; set; } // next will point to the next TelemetryProcessor in the chain. public SuccessfulDependencyFilter(ITelemetryProcessor next) { this.Next = next; } public void Process(ITelemetry item) { // To filter out an item, return without calling the next processor. if (!OKtoSend(item)) { return; } this.Next.Process(item); } // Example: replace with your own criteria. private bool OKtoSend (ITelemetry item) { var dependency = item as DependencyTelemetry; if (dependency == null) return true; return dependency.Success != true; } }İşlemcinizi ekleyin.
ASP.NET uygulamalar
Bu kod parçacığını ApplicationInsights.config ekleyin:
<TelemetryProcessors>
<Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9">
<!-- Set public property -->
<MyParamFromConfigFile>2-beta</MyParamFromConfigFile>
</Add>
</TelemetryProcessors>
Sınıfınıza ortak adlandırılmış özellikler sağlayarak .config dosyadaki dize değerlerini geçirebilirsiniz.
Uyarı
Tür adı ve .config dosyadaki herhangi bir özellik adını, koddaki sınıf ve özellik adlarına eşleştirmek için dikkatli olmak. .config dosyası varolmayan bir tür veya özelliğe başvuruyorsa, SDK hiçbir Telemetriyi sessizce gönderemeyebilir.
Alternatif olarak, kodda filtreyi başlatabilirsiniz. Uygun bir başlatma sınıfında, örneğin, AppStart içinde, Global.asax.cs işlemcisini zincirine ekleyin:
var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
builder.Use((next) => new SuccessfulDependencyFilter(next));
// If you have more processors:
builder.Use((next) => new AnotherProcessor(next));
builder.Build();
Bu noktadan sonra oluşturulan telemetri istemcileri, işlemcinizi kullanacaktır.
çekirdek/çalışan hizmeti uygulamalarını ASP.NET
Not
veya kullanarak bir işlemci eklemek ApplicationInsights.config TelemetryConfiguration.Active ASP.NET Core uygulamalar için geçerli değildir veya Microsoft. applicationınsights. workerservice SDK 'sını kullanıyorsanız.
ASP.NET Core veya workerservicekullanılarak yazılan uygulamalar için yeni bir telemetri işlemcisi eklemek, ' de AddApplicationInsightsTelemetryProcessor gösterildiği gibi, üzerindeki genişletme yöntemi kullanılarak yapılır IServiceCollection . Bu yöntem, ConfigureServices sınıfınızın yönteminde çağrılır Startup.cs .
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddApplicationInsightsTelemetry();
services.AddApplicationInsightsTelemetryProcessor<SuccessfulDependencyFilter>();
// If you have more processors:
services.AddApplicationInsightsTelemetryProcessor<AnotherProcessor>();
}
Örnek filtreler
Yapay istekler
Botları ve Web testlerini filtreleyin. Ölçüm Gezgini yapay kaynakları filtreleme seçeneği sunmakla birlikte bu seçenek, trafiği ve alma boyutunu SDK 'da filtreleyerek azaltır.
public void Process(ITelemetry item)
{
if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
// Send everything else:
this.Next.Process(item);
}
Kimlik doğrulaması başarısız
İstekleri "401" yanıtıyla filtreleyin.
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null &&
request.ResponseCode.Equals("401", StringComparison.OrdinalIgnoreCase))
{
// To filter out an item, return without calling the next processor.
return;
}
// Send everything else
this.Next.Process(item);
}
Hızlı uzak bağımlılık çağrılarını filtrele
Yalnızca yavaş olan çağrıları tanılamak istiyorsanız hızlı bir şekilde filtreleyin.
Not
Bu filtreleme, portalda gördüğünüz istatistikleri çarpıtacaktır.
public void Process(ITelemetry item)
{
var request = item as DependencyTelemetry;
if (request != null && request.Duration.TotalMilliseconds < 100)
{
return;
}
this.Next.Process(item);
}
Bağımlılık sorunlarını Tanıla
Bu blog , bağımlılıklara otomatik olarak ping göndererek bağımlılık sorunlarını tanılamaya yönelik bir projeyi açıklar.
JavaScript Web uygulamaları
Ilemetrybaşlatıcısı kullanarak filtrele
Telemetri başlatıcısı geri çağırma işlevi oluşturun. Geri çağırma işlevi
ITelemetryItem, işlenen olay olan bir parametre olarak alır.falseBu geri aramadan geri dönmek için telemetri öğesinin filtrelenme sonucu olur.var filteringFunction = (envelope) => { if (envelope.data.someField === 'tobefilteredout') { return false; } return true; };Telemetri başlatıcısı geri aramasını ekleyin:
appInsights.addTelemetryInitializer(filteringFunction);
Özellik Ekle/Değiştir: ıtelemetrybaşlatıcısı
Telemetri başlatıcıları 'nı kullanarak ek bilgilerle telemetri zenginleştirin veya standart telemetri modülleri tarafından ayarlanan telemetri özelliklerini geçersiz kılabilirsiniz.
örneğin, bir web paketi için Application Insights HTTP istekleri hakkında telemetri toplar. Varsayılan olarak, yanıt kodu >= 400 olan herhangi bir istek başarısız olarak işaretler. Ancak, 400 ' i başarılı olarak değerlendirmek istiyorsanız, başarı özelliğini ayarlayan bir telemetri başlatıcısı sağlayabilirsiniz.
Bir telemetri başlatıcısı sağlarsanız, her bir Track * () yöntemi çağrıldığında çağırılır. Bu Track() , standart telemetri modülleri tarafından çağrılan yöntemleri içerir. Kurala göre, bu modüller zaten bir başlatıcı tarafından ayarlanmış herhangi bir özelliği ayarlanmamış. Telemetri başlatıcıları, telemetri işlemcileri çağrılmadan önce çağrılır. Bu nedenle, başlatıcıların yaptığı her türlü zenginleştirme işlemciler tarafından görülebilir.
Başlatıcısını tanımlama
C#
using System;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
namespace MvcWebRole.Telemetry
{
/*
* Custom TelemetryInitializer that overrides the default SDK
* behavior of treating response codes >= 400 as failed requests
*
*/
public class MyTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
// Is this a TrackRequest() ?
if (requestTelemetry == null) return;
int code;
bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code);
if (!parsed) return;
if (code >= 400 && code < 500)
{
// If we set the Success property, the SDK won't change it:
requestTelemetry.Success = true;
// Allow us to filter these requests in the portal:
requestTelemetry.Properties["Overridden400s"] = "true";
}
// else leave the SDK to set the Success property
}
}
}
ASP.NET uygulamalar: başlatıcısını yükleyin
ApplicationInsights.config:
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
...
</TelemetryInitializers>
</ApplicationInsights>
Alternatif olarak, örneğin Global. aspx. cs içinde, kodda Başlatıcı örneği oluşturabilirsiniz:
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
Bu örnektendaha fazla bilgi görüntüleyin.
çekirdek/çalışan hizmeti uygulamalarını ASP.NET: başlatıcısını yükleyin
Not
veya kullanarak bir başlatıcı eklemek ApplicationInsights.config TelemetryConfiguration.Active ASP.NET Core uygulamalar için geçerli değildir veya Microsoft. applicationınsights. workerservice SDK 'sını kullanıyorsanız.
ASP.NET Core veya workerservicekullanılarak yazılan uygulamalar için yeni bir telemetri başlatıcısı eklemek, bunu gösterildiği gibi bağımlılık ekleme kapsayıcısına ekleyerek yapılır. Bu, Startup.ConfigureServices yönteminde yapılır.
using Microsoft.ApplicationInsights.Extensibility;
using CustomInitializer.Telemetry;
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}
JavaScript telemetri başlatıcıları
JavaScript
Bir telemetri başlatıcısı ekleme onInit geri çağırma:
<script type="text/javascript">
!function(T,l,y){<!-- Removed the Snippet code for brevity -->}(window,document,{
src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js",
crossOrigin: "anonymous",
onInit: function (sdk) {
sdk.addTelemetryInitializer(function (envelope) {
envelope.data.someField = 'This item passed through my telemetry initializer';
});
}, // Once the application insights instance has loaded and initialized this method will be called
cfg: { // Application Insights Configuration
instrumentationKey: "YOUR_INSTRUMENTATION_KEY"
}});
</script>
telemetri öğesinde kullanılabilen özel olmayan özelliklerin bir özeti için bkz. Application Insights dışa aktarma veri modeli.
İstediğiniz kadar fazla sayıda Başlatıcı ekleyebilirsiniz. Bunlar eklendikleri sırayla çağırılır.
OpenCensus Python telemetri işlemcileri
OpenCensus Python 'da telemetri işlemcileri, yalnızca Telemetriyi işlemek için çağrılan geri çağırma işlevleridir. Geri çağırma işlevi, parametresi olarak bir Envelope veri türü kabul etmelidir. Telemetriyi dışarı aktarma işleminden filtrelemek için geri çağırma işlevinin döndürdüğünden emin olun False . Azure Izleyici veri türleri için şemayı, GitHub üzerindekizarflarda görebilirsiniz.
Not
cloud_RoleNameAlanındaki özniteliğini değiştirerek ' i değiştirebilirsiniz ai.cloud.role tags .
def callback_function(envelope):
envelope.tags['ai.cloud.role'] = 'new_role_name'
# Example for log exporter
import logging
from opencensus.ext.azure.log_exporter import AzureLogHandler
logger = logging.getLogger(__name__)
# Callback function to append '_hello' to each log message telemetry
def callback_function(envelope):
envelope.data.baseData.message += '_hello'
return True
handler = AzureLogHandler(connection_string='InstrumentationKey=<your-instrumentation_key-here>')
handler.add_telemetry_processor(callback_function)
logger.addHandler(handler)
logger.warning('Hello, World!')
# Example for trace exporter
import requests
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.trace import config_integration
from opencensus.trace.samplers import ProbabilitySampler
from opencensus.trace.tracer import Tracer
config_integration.trace_integrations(['requests'])
# Callback function to add os_type: linux to span properties
def callback_function(envelope):
envelope.data.baseData.properties['os_type'] = 'linux'
return True
exporter = AzureExporter(
connection_string='InstrumentationKey=<your-instrumentation-key-here>'
)
exporter.add_telemetry_processor(callback_function)
tracer = Tracer(exporter=exporter, sampler=ProbabilitySampler(1.0))
with tracer.span(name='parent'):
response = requests.get(url='https://www.wikipedia.org/wiki/Rabbit')
# Example for metrics exporter
import time
from opencensus.ext.azure import metrics_exporter
from opencensus.stats import aggregation as aggregation_module
from opencensus.stats import measure as measure_module
from opencensus.stats import stats as stats_module
from opencensus.stats import view as view_module
from opencensus.tags import tag_map as tag_map_module
stats = stats_module.stats
view_manager = stats.view_manager
stats_recorder = stats.stats_recorder
CARROTS_MEASURE = measure_module.MeasureInt("carrots",
"number of carrots",
"carrots")
CARROTS_VIEW = view_module.View("carrots_view",
"number of carrots",
[],
CARROTS_MEASURE,
aggregation_module.CountAggregation())
# Callback function to only export the metric if value is greater than 0
def callback_function(envelope):
return envelope.data.baseData.metrics[0].value > 0
def main():
# Enable metrics
# Set the interval in seconds in which you want to send metrics
exporter = metrics_exporter.new_metrics_exporter(connection_string='InstrumentationKey=<your-instrumentation-key-here>')
exporter.add_telemetry_processor(callback_function)
view_manager.register_exporter(exporter)
view_manager.register_view(CARROTS_VIEW)
mmap = stats_recorder.new_measurement_map()
tmap = tag_map_module.TagMap()
mmap.measure_int_put(CARROTS_MEASURE, 1000)
mmap.record(tmap)
# Default export interval is every 15.0s
# Your application should run for at least this amount
# of time so the exporter will meet this interval
# Sleep can fulfill this
time.sleep(60)
print("Done recording metrics")
if __name__ == "__main__":
main()
İstediğiniz kadar çok işlemci ekleyebilirsiniz. Bunlar eklendikleri sırayla çağırılır. Bir işlemci bir özel durum oluşturursa, aşağıdaki işlemcileri etkilemez.
Örnek TelemetryInitializers
Özel özellik ekleme
Aşağıdaki örnek başlatıcı, İzleyen her telemetriye özel bir özellik ekler.
public void Initialize(ITelemetry item)
{
var itemProperties = item as ISupportProperties;
if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
{
itemProperties.Properties["customProp"] = "customValue";
}
}
Bulut rolü adı ekleme
Aşağıdaki örnek başlatıcı, bulut rolü adını her izlenilen telemetriye ayarlar.
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
telemetry.Context.Cloud.RoleName = "MyCloudRoleName";
}
}
HttpContext'den bilgi ekleme
Aşağıdaki örnek başlatıcı, verilerini kaynağından HttpContext okur ve bir örneğine RequestTelemetry ekler. , IHttpContextAccessor oluşturucu bağımlılık eklemesi aracılığıyla otomatik olarak sağlanır.
public class HttpContextRequestTelemetryInitializer : ITelemetryInitializer
{
private readonly IHttpContextAccessor httpContextAccessor;
public HttpContextRequestTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor =
httpContextAccessor ??
throw new ArgumentNullException(nameof(httpContextAccessor));
}
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
if (requestTelemetry == null) return;
var claims = this.httpContextAccessor.HttpContext.User.Claims;
Claim oidClaim = claims.FirstOrDefault(claim => claim.Type == "oid");
requestTelemetry.Properties.Add("UserOid", oidClaim?.Value);
}
}
ITelemetryProcessor ve ITelemetryInitializer
Telemetri işlemcileri ile telemetri başlatıcıları arasındaki fark nedir?
- Bu türlerle neler yapaların çakışmaları vardır. Telemetri özelliklerini eklemek veya değiştirmek için her ikisi de kullanılabilir, ancak bu amaç için başlatıcıları kullanmamız önerilir.
- Telemetri başlatıcıları her zaman telemetri işlemcileri öncesinde çalıştır.
- Telemetri başlatıcıları birden çok kez çağrılmış olabilir. Kural gereği, önceden ayarlanmış herhangi bir özellik ayarlamaz.
- Telemetri işlemcileri bir telemetri öğesini tamamen değiştirmenizi veya atmanizi sağlar.
- Tüm kayıtlı telemetri başlatıcıların her telemetri öğesi için çağrılma garantisi vardır. SDK, telemetri işlemcileri için ilk telemetri işlemcisini çağırmayı garantiler. Diğer işlemcilerin çağrılıp çağrılmamalarının önceki telemetri işlemcileri tarafından karara varıp varmayacakları.
- Telemetri başlatıcılarını kullanarak telemetri verilerini ek özelliklerle zenginleştirin veya var olan bir özelliği geçersiz kılın. Telemetri işlemcisini kullanarak telemetri filtresini kullanın.
Not
JavaScript'in yalnızca ITelemetryInitializer kullanarak olayları filtreleyene telemetri başlatıcıları vardır
Sorun ApplicationInsights.config
- Tam tür adının ve derleme adının doğru olduğunu onaylayın.
- Dosyanın applicationinsights.config dizininde olduğunu ve son değişiklikleri içerdiğini onaylayın.