Leistungsfähige Abfragen zum Suchen und Exportieren von Logs schreiben

Hier werden einige der wichtigen Aspekte erläutert, die Sie beim Erstellen der Abfragen zum Suchen und Exportieren von Logs berücksichtigen müssen.

Themen:

Index verstehen

Während der Logaufnahme wird der Logdatensatz mit dem Parser geparst, die Logquelle, die Felder und erweiterten Felder sowie die Labels werden extrahiert. Alle diese Werte werden in einem abfrageneffizienten Index gespeichert. Darüber hinaus werden die Schlüsselwörter im gesamten Logdatensatz ebenfalls indiziert. Die Abfragen, die den Index verwenden, sind mehrfach schneller als die Abfragen, die den Index nicht verwenden. Wenn Sie eine große Datenmenge abfragen, müssen Sie sicherstellen, dass der Index verwendet wird.

Wann wird der Index nicht verwendet?

Ein Index wird nicht verwendet, wenn eine Abfrage Platzhalter verwendet oder wenn ein Feld mit einer der Zeichenfolgenverarbeitungsfunktionen bearbeitet wird. Beispiele:

  • Platzhalter in der Abfrage vermeiden

    Ein gängiger Anwendungsfall besteht darin, wie folgt nach einem bestimmten Muster in einem Feld zu suchen:

    'Error Text' like '%NullPointerException%'

    Die obige Abfrage verwendet den Index nicht, da Platzhalter verwendet werden. Wenn das Feld Fehlertext große Datenmengen enthält oder wenn die Abfrage über eine große Anzahl von Datensätzen ausgeführt wird, wird die Zeit am Ende überschritten. Um dies zu vermeiden, fügen Sie eine Bedingung in der Logquelle hinzu, um dieses Muster zu erkennen und ein Feld festzulegen. Dann können Sie dieses Feld direkt in der Abfrage verwenden.

    Beispiel: Sie können ein Feld mit dem Namen Fehlertyp in der Logquelle basierend auf verschiedenen Bedingungen auffüllen und dann die Abfrage aktualisieren, um dieses Feld zu verwenden:

    'Error Type' = NullPointerException

    Wenn Sie das Muster nicht zur Logquelle hinzufügen können, besteht eine Alternative darin, wie folgt zu einer Stichwortsuche zu wechseln:

    NullPointerException

    Dadurch wird nach dem Wort NullPointerException im Feld Ursprünglicher Loginhalt gesucht, das den Rohlogdatensatz darstellt. Dies ist nützlich, wenn Sie keine genaue Übereinstimmung benötigen, da diese Abfrage mehrmals schneller ist als die vorherige Abfrage mit den Platzhaltern.

    Hinweis

    Die Verwendung von Platzhaltern für ein Feld, in dem eine große Anzahl von Feldern gespeichert ist, ist schlechter als für ein kleines Feld. Wenn jedoch die Anzahl der Logdatensätze groß ist, sind auch Platzhalter für ein kleines Feld langsam.
  • Vermeiden Sie teure Zeichenfolgenoperatoren

    Ein Index wird nicht für Felder verwendet, die mit Zeichenfolgenvorgängen wie substr(), extract und jsonExtract generiert wurden. Im Folgenden finden Sie einige Beispiele, in denen der Index übersprungen wird:

    * | eval Prefix = substr('Host Name (Server)', 1, 3) | where Prefix = DBC
    
    * | where indexOf('Host Name (Server)', 'DBC') != -1

    Wenn Sie häufig Zeichenfolgenoperatoren verwenden müssen, sollten Sie diese in den Parser oder die Logquelle verschieben und separate Felder erstellen.

Lange Zeitbereiche

Die Abfrage großer Datenmengen über einen langen Zeitraum ist ebenfalls teuer. Versuchen Sie, den Zeitraum zu reduzieren, oder fügen Sie weitere Suchkriterien hinzu, um die zu verarbeitende Datenmenge zu reduzieren.

Mehrere Logsets verwenden

Wenn für Ihren Mandanten die Logpartitionierung aktiviert ist, wählen Sie einen Teil der Logdaten mit einem Logset aus. Logsets werden optimiert, um die Systemlast zu reduzieren. Wenn Sie eine Abfrage für ein einzelnes Logset durchführen, wird die Abfrage auf einem kleineren Server-Set gespeichert. Eine Abfrage mit einer großen Anzahl von Logsets führt jedoch zu mehr Datenübertragung und -abfrage bei einer größeren Anzahl von Services. Dies kann dazu führen, dass sich die Abfragen erheblich verlangsamen.

Vermeiden Sie die Verwendung von mehr als fünf Logsets in einer Abfrage, um die beste Performance zu erzielen.

Andere teure Operationen

Im Folgenden sind einige der anderen kostspieligen Vorgänge aufgeführt, die Abfragen mit einer großen Datenmenge verlangsamen können:

  • sort
  • head- oder tail-Befehle
  • Befehle stats oder timestats mit Feldern mit hoher Kardinalität. Diese Felder haben eine große Anzahl unterschiedlicher Werte. Transaktions-ID, ECID usw. sind Beispiele für solche Felder.