Problembehandlung bei fehlender Anwendungstelemetrie in Azure Monitor Application Insights
Dieser Artikel hilft Ihnen, den Schritt in der Verarbeitungspipeline zu identifizieren, der dazu führt, dass Telemetrie fehlt, indem Sie die Konnektivität und Telemetrieaufnahme mithilfe von PowerShell oder Curl testen.
Schritte, die dazu führen können, dass Telemetrie fehlt
Die folgende Abbildung zeigt Schritte, bei denen Telemetrie während der Aufnahme und des Verbrauchs fehlen kann:
Wenn die Anwendungstelemetrie im Azure-Portal nicht angezeigt wird, können Fehler in den schritten in der Verarbeitungspipeline die Ursache sein:
- Das Application Insights SDK oder Agent ist falsch konfiguriert und sendet keine Anwendungstelemetrie an den Aufnahmeendpunkt.
- Das SDK oder agent ist ordnungsgemäß konfiguriert, aber das Netzwerk blockiert Aufrufe an den Aufnahmeendpunkt.
- Der Aufnahmeendpunkt legt die eingehende Telemetrie ab oder drosselt sie.
- Die Aufnahmepipeline sinkt oder verlangsamt die Telemetrie im Rahmen der Verarbeitung aufgrund des Dienststatus stark.
- (Ungewöhnlich) Log Analytics steht beim Speichern von Telemetriedatensätzen vor Dienstintegritätsproblemen.
- (Ungewöhnlich) Fehler bei der Abfrage-API
api.applicationinsights.io
beim Abfragen von Datensätzen aus Log Analytics. - Die Azure-Portal die Datensätze, die Sie anzeigen möchten, nicht abrufen oder rendern.
Identifizieren eines Schritts durch Senden eines Beispiel-Telemetriedatensatzes
Konfigurationsprobleme oder vorübergehende Probleme können überall im Applications Insights-Dienst auftreten. Um den Schritt in der Verarbeitungspipeline zu identifizieren, der Symptome von keinen Daten oder fehlenden Daten verursacht, senden Sie einen Beispiel-Telemetriedatensatz mithilfe von PowerShell oder Curl. Wechseln Sie für das PowerShell-Skript oder den Curl-Befehl zu den folgenden Abschnitten:
- PowerShell-Skript zum Senden des Verfügbarkeitstestergebnisses
- Befehl 'Curl', um das Verfügbarkeitstestergebnis zu senden
- PowerShell-Skript zum Senden von Anforderungs-Telemetriedatensatz
Wenn die Web-App auf einem lokalen Server oder einem virtuellen Azure-Computer ausgeführt wird, stellen Sie eine Verbindung mit dem Server oder virtuellen Computer her, und senden Sie mithilfe von PowerShell einen einzelnen Telemetriedatensatz an die Applications Insights-Dienstinstanz. Wenn die Web-App mit Problemen beim Senden von Telemetrie auf Kudu ausgeführt wird, führen Sie das folgende Skript über die PowerShell-Debugkonsole von Kudu in Azure Web-Apps aus.
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing
Notiz
- Stellen Sie vor dem Ausführen des Cmdlets
Invoke-WebRequest
das Cmdlet aus$ProgressPreference = "SilentlyContinue"
. - Sie können dies nicht verwenden
-Verbose
oder-Debug
. Verwenden Sie stattdessen-UseBasicParsing
.
Nachdem Sie einen Beispiel-Telemetriedatensatz mithilfe von PowerShell gesendet haben, navigieren Sie im Azure-Portal zur Registerkarte "Application Insights Logs", und überprüfen Sie, ob er eintrifft. Wenn der Telemetriedatensatz des Beispiels angezeigt wird, wird ein großer Teil der Verarbeitungspipeline entfernt.
Ein Telemetriedatensatz, der ordnungsgemäß gespeichert und angezeigt wird, bedeutet:
- Der lokale Server oder der virtuelle Computer verfügt über DNS, der in die richtige IP-Adresse aufgelöst wird.
- Das Netzwerk hat das Beispiel ohne Blockieren oder Ablegen an den Aufnahmeendpunkt übermittelt.
- Der Aufnahmeendpunkt akzeptierte die Beispielnutzlast und verarbeitete sie über die Aufnahmepipeline.
- Log Analytics hat den Beispieldatensatz richtig gespeichert.
- Die Registerkarte Azure-Portal Protokolle kann die API (
api.applicationinsights.io
) abfragen und den Beispieldatensatz im Azure-Portal rendern.
Wenn der generierte Beispieldatensatz bei Ihrer Application Insights-Instanz eingeht und Sie den Beispieldatensatz mithilfe des Ressourcenmenüs "Protokolle " abfragen können, behandeln Sie die Problembehandlung beim Application Insights SDK oder Agent. Anschließend können Sie mit dem Sammeln von SDK-Protokollen, Selbstdiagnoseprotokollen oder Profilerablaufverfolgungen fortfahren, je nachdem, was für die SDK- oder Agentversion geeignet ist.
Die folgenden Abschnitte enthalten Informationen zum Senden eines Telemetriedatensatzes mithilfe von PowerShell oder Curl.
PowerShell-Skript zum Senden des Verfügbarkeitstestergebnisses
Verfügbarkeitstestergebnisse sind der ideale Telemetrietyp zum Testen. Der Grund dafür ist, dass die Aufnahmepipeline niemals Die Verfügbarkeitstestergebnisse auswählese. Wenn Sie einen Anforderungs-Telemetriedatensatz senden, kann er bei aktiviertem Aufnahmesampling abgesampt werden. Beginnen Sie mit einem Beispiel für ein Verfügbarkeitstestergebnis, und probieren Sie dann nach Bedarf andere Telemetrietypen aus.
Hier ist ein PowerShell-Beispielskript, das ein Verfügbarkeitstestergebnis sendet:
# Info: Provide either the connection string or ikey for your Application Insights resource
$ConnectionString = ""
$InstrumentationKey = ""
function ParseConnectionString {
param ([string]$ConnectionString)
$Map = @{}
foreach ($Part in $ConnectionString.Split(";")) {
$KeyValue = $Part.Split("=")
$Map.Add($KeyValue[0], $KeyValue[1])
}
return $Map
}
# If ikey is the only parameter supplied, we'll send telemetry to the global ingestion endpoint instead of regional endpoint found in connection strings
If (($InstrumentationKey) -and ("" -eq $ConnectionString)) {
$ConnectionString = "InstrumentationKey=$InstrumentationKey;IngestionEndpoint=https://dc.services.visualstudio.com/"
}
$map = ParseConnectionString($ConnectionString)
$url = $map["IngestionEndpoint"] + "v2/track"
$ikey = $map["InstrumentationKey"]
$lmUrl = $map["LiveEndpoint"]
$time = (Get-Date).ToUniversalTime().ToString("o")
$availabilityData = @"
{
"data": {
"baseData": {
"ver": 2,
"id": "SampleRunId",
"name": "Microsoft Support Sample Webtest Result",
"duration": "00.00:00:10",
"success": true,
"runLocation": "Region Name",
"message": "Sample Webtest Result",
"properties": {
"Sample Property": "Sample Value"
}
},
"baseType": "AvailabilityData"
},
"ver": 1,
"name": "Microsoft.ApplicationInsights.Metric",
"time": "$time",
"sampleRate": 100,
"iKey": "$ikey",
"flags": 0
}
"@
# Uncomment one or more of the following lines to test client TLS/SSL protocols other than the machine default option
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing
Dieses Skript erstellt eine unformatierte REST-Anforderung, um ein einzelnes Verfügbarkeitstestergebnis an die Application Insights-Komponente zu liefern. Wenn Sie dieses Skript verwenden, geben Sie den Parameter oder $InstrumentationKey
den $ConnectionString
Parameter an.
- Wenn nur der parameter Verbindungszeichenfolge angegeben wird, wird telemetrie an den regionalen Endpunkt im Verbindungszeichenfolge gesendet.
- Wenn nur der Parameter "Instrumentation Key" (ikey) angegeben wird, wird telemetrie an den globalen Aufnahmeendpunkt gesendet.
- Wenn sowohl Verbindungszeichenfolge- als auch ikey-Parameter angegeben werden, sendet das Skript Telemetrie an den regionalen Endpunkt im Verbindungszeichenfolge.
Notiz
- Testen Sie die Verbindung, die von Ihrer Anwendung hergestellt wurde. Wenn Sie Application Insights in der Azure-Portal aktivieren, verlassen Sie sich wahrscheinlich auf Verbindungszeichenfolge mit regionalen Endpunkten.
https://<region>.in.applicationinsights.azure.com
Wenn Ihre SDK-Konfiguration nur den ikey bereitstellt, verlassen Sie sich auf den globalen Endpunkt.https://dc.applicationinsights.azure.com
Stellen Sie sicher, dass Sie den Skriptparameter auffüllen, der Ihrer Webanwendungs-SDK-Konfiguration entspricht, entweder die Verbindungszeichenfolge oder den ikey bereitstellen. - Am 31. März 2025 wird der Support für die auf Instrumentierungsschlüsseln basierende Erfassung eingestellt. Die Erfassung von Instrumentierungsschlüsseln funktioniert zwar weiterhin, wir stellen jedoch keine Updates und keinen Support mehr für das Feature bereit. Wechseln Sie zu Verbindungszeichenfolgen, damit Sie neue Funktionen nutzen können.
Es ist am einfachsten, dieses Skript aus der PowerShell ISE-Umgebung auf einer IaaS- oder Azure-VM-Skalierungssatzinstanz auszuführen. Sie können das Skript auch in die PowerShell-Debugkonsole der App Service Kudu-Schnittstelle kopieren und einfügen und dann ausführen.
Wenn das Skript ausgeführt wird, suchen Sie nach einer HTTP 200-Antwort, und überprüfen Sie die Antwortdetails. Im Rahmen der JSON-Nutzlast der Antwort werden die folgenden Details erwartet:
- Die
itemsReceived
Anzahl entspricht deritemsAccepted
. - Der Aufnahmeendpunkt informiert den Client: Sie haben einen Telemetriedatensatz gesendet, und wir haben einen Telemetriedatensatz akzeptiert.
Sehen Sie sich den folgenden Screenshot als Beispiel an:
Befehl 'Curl', um das Verfügbarkeitstestergebnis zu senden
Wenn Sie Linux-VMs ausführen, verwenden Sie curl anstelle von PowerShell, um eine ähnliche REST-Anforderung zu senden. Sie müssen den Hostnamen des Aufnahmeendpunkts, den iKey
Wert und die time
Werte anpassen. Der Application Insights-Aufnahmeendpunkt akzeptiert keine Datensätze, die älter als 48 Stunden sind.
Hier sind Beispiel-Curl-Befehle, die ein einzelnes Verfügbarkeitstestergebnis senden:
Curl-Befehl für Linux/MacOS:
curl -H "Content-Type: application/json" -X POST -d '{"data":{"baseData":{"ver":2,"id":"SampleRunId","name":"MicrosoftSupportSampleWebtestResultUsingCurl","duration":"00.00:00:10","success":true,"runLocation":"RegionName","message":"SampleWebtestResult","properties":{"SampleProperty":"SampleValue"}},"baseType":"AvailabilityData"},"ver":1,"name":"Microsoft.ApplicationInsights.Metric","time":"2022-09-01T12:00:00.0000000Z","sampleRate":100,"iKey":"########-####-####-####-############","flags":0}' https://dc.applicationinsights.azure.com/v2.1/track
Befehl "Curl" für Windows:
curl -H "Content-Type: application/json" -X POST -d {\"data\":{\"baseData\":{\"ver\":2,\"id\":\"SampleRunId\",\"name\":\"MicrosoftSupportSampleWebtestResultUsingCurl\",\"duration\":\"00.00:00:10\",\"success\":true,\"runLocation\":\"RegionName\",\"message\":\"SampleWebtestResult\",\"properties\":{\"SampleProperty\":\"SampleValue\"}},\"baseType\":\"AvailabilityData\"},\"ver\":1,\"name\":\"Microsoft.ApplicationInsights.Metric\",\"time\":\"2021-10-05T22:00:00.0000000Z\",\"sampleRate\":100,\"iKey\":\"########-####-####-####-############\",\"flags\":0} https://dc.applicationinsights.azure.com/v2/track
PowerShell-Skript zum Senden von Anforderungs-Telemetriedatensatz
Um Probleme mit fehlender Anforderungs-Telemetrie zu beheben, verwenden Sie das folgende PowerShell-Skript, um das Senden eines einzelnen Anforderungs-Telemetriedatensatzes zu testen. Dieser Telemetrietyp ist anfällig für die serverseitige Aufnahmesamplingkonfiguration. Vergewissern Sie sich, dass das Aufnahmesampling deaktiviert ist, um zu bestätigen, ob der Testdatensatz ordnungsgemäß gespeichert wurde.
# Info: Provide either the connection string or ikey for your Application Insights resource
$ConnectionString = ""
$InstrumentationKey = ""
function ParseConnectionString {
param ([string]$ConnectionString)
$Map = @{}
foreach ($Part in $ConnectionString.Split(";")) {
$KeyValue = $Part.Split("=")
$Map.Add($KeyValue[0], $KeyValue[1])
}
return $Map
}
# If ikey is the only parameter supplied, we'll send telemetry to the global ingestion endpoint instead of regional endpoint found in connection strings
If (($InstrumentationKey) -and ("" -eq $ConnectionString)) {
$ConnectionString = "InstrumentationKey=$InstrumentationKey;IngestionEndpoint=https://dc.services.visualstudio.com/"
}
$map = ParseConnectionString($ConnectionString)
$url = $map["IngestionEndpoint"] + "v2/track"
$ikey = $map["InstrumentationKey"]
$lmUrl = $map["LiveEndpoint"]
$time = (Get-Date).ToUniversalTime().ToString("o")
$requestData = @"
{
"data": {
"baseType": "RequestData",
"baseData": {
"ver": 2,
"id": "22093920382029384",
"name": "GET /msftsupport/requestdata/",
"starttime": "$time",
"duration": "00:00:01.0000000",
"success": true,
"responseCode": "200",
"url": "https://localhost:8080/requestData/sampleurl",
"httpMethod": "GET"
}
},
"ver": 1,
"iKey": "$ikey",
"name": "Microsoft.ApplicationInsights.Request",
"time": "$time",
"sampleRate": 100,
"flags": 0
}
"@
# Uncomment one or more of the following lines to test client TLS/SSL protocols other than the machine default option
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $requestData -UseBasicParsing
Problembehandlung bei der SSL- oder TLS-Konfiguration
Wenn die obigen Skripts fehlschlagen, beheben Sie die SSL- oder TLS-Konfiguration. Die meisten Aufnahmeendpunkte erfordern Clients die Verwendung von TLS 1.2 und spezifischen Verschlüsselungssammlungen. Passen Sie in diesem Fall an, wie PowerShell als Client im SSL- oder TLS-Protokoll teilnimmt. Schließen Sie die folgenden Codeausschnitte ein, wenn Sie einen sicheren Kanal als Teil der Verbindung zwischen dem virtuellen Clientcomputer und den Aufnahmeendpunkten diagnostizieren müssen.
Option 1: Steuern, welches SSL- oder TLS-Protokoll von PowerShell verwendet wird, um eine Verbindung mit dem Aufnahmeendpunkt herzustellen.
Entfernen Sie eine der folgenden Zeilen, indem Sie das
#
Zeichen entfernen und vor demInvoke-WebRequest
Cmdlet in Ihrem PowerShell-Skript hinzufügen, um das protokoll zu steuern, das in der REST-Testanforderung verwendet wird:# Uncomment one or more of these lines to test TLS/SSL protocols other than the machine default option # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3 # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11 # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12 # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
Option 2: Ignorieren Sie alle SSL-Zertifikatüberprüfungsprobleme.
Wenn Sie über eine Firewall oder einen Proxyserver verfügen, der am Offloading von SSL-Zertifikaten teilnimmt, ignorieren Sie alle SSL-Zertifikatprobleme, indem Sie den folgenden Codeausschnitt direkt vor dem
Invoke-WebRequest
Cmdlet hinzufügen:# Ignore mismatched SSL certificate add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
Wenn die Anwendung standardmäßig die Tls-Standardeinstellungen des Systems oder Servers aufweist, ändern Sie diese Standardeinstellungen in der Registrierung auf Windows-Computern. Ausführliche Informationen finden Sie unter TLS-Registrierungseinstellungen (Transport Layer Security).
Wenn Sie das von einer .NET-Anwendung verwendete Standardprotokoll TLS/SSL ändern müssen, befolgen Sie die Anleitungen in den bewährten Methoden für Transport Layer Security (TLS) mit .NET Framework.
Problembehandlung bei der Einrichtung oder Konfiguration von Application Insights SDK oder Agent
Wenn das Senden von Telemetrie über den Hostcomputer Ihrer Anwendung mithilfe von PowerShell oder Curl erfolgreich ist, ist die fehlende Telemetrie wahrscheinlich aufgrund von Setup- oder Konfigurationsproblemen des Application Insights SDK oder Agents zurückzuführen. Aktivieren Sie die Application Insights-Überwachung für Ihren Anwendungshost und die Programmiersprache, um zu überprüfen, ob alle Konfigurationen oder Code den richtigen Anleitungen und Beispielen folgen.
Wenn tests, die mithilfe von PowerShell oder curl durchgeführt wurden, telemetrie nicht an den Aufnahmeendpunkt senden, überprüfen Sie einige häufige clientseitige probleme, die zu dem Problem beitragen können:
- DNS in Ihrem Netzwerk kann den Aufnahmeendpunkt nicht in die richtige IP-Adresse auflösen.
- Die TCP-Verbindung von Ihrem Anwendungsserver zum Aufnahmeendpunkt kann durch Firewalls oder Gatewaygeräte blockiert werden.
- Der Aufnahmeendpunkt, mit dem das SDK eine Verbindung herstellt, erfordert möglicherweise TLS 1.2, ihre Anwendung verwendet jedoch standardmäßig TLS 1.0 oder TLS 1.1.
- Möglicherweise haben Sie mehrere Azure Monitor Private Link Auswirkungen auf Ihr privates Netzwerk, wodurch Ihre DNS-Einträge überschrieben werden können, um den Aufnahmeendpunkt auf die falsche private IP-Adresse aufzulösen.
Kontaktieren Sie uns für Hilfe
Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.