false
29. November 2023
 | 
29 Minuten Lesedauer

Splunk-Checkliste: Abfrage, SPL, RegEx und Befehle

In dieser Splunk-Schnellreferenz werden wichtige Begriffe und Features, Grundlagen der Splunk-Suchsprache SPL sowie häufig verwendete Befehle und Funktionen von Splunk Cloud und Splunk Enterprise beschrieben.



Begriffe

Ereignisse (auch: Events)

Ein Ereignis besteht aus einem Satz von Werten, denen ein Zeitstempel zugeordnet ist. Es handelt sich um einen einzelnen Dateneintrag, der ein- oder mehrzeilig sein kann. Ein Ereignis kann ein

Textdokument, eine Konfigurationsdatei oder auch eine komplette Stack Trace-Datei etc. sein. Dies ist ein Beispiel für ein Ereignis in einem Weblog:

173.26.34.223 - - [01/ Mar/2021:12:05:27 -0700] “GET /trade/ app?action=logout HTTP/1.1” 200 2953

Ihr könnt auch Transaktionen für die Suche und Gruppierung von Ereignissen definieren, die konzeptionell zusammenhängen, jedoch über eine gewisse Zeitspanne stattfinden. Transaktionen können aus mehreren Schritten bestehende, geschäftliche Aktivitäten darstellen, beispielsweise alle Ereignisse im Zusammenhang mit einer einzelnen Kundensitzung auf der Website eines Online-Händlers.

Metriken

Ein Metrikdatenpunkt besteht aus einem Zeitstempel und einem oder mehreren Messwerten. Er kann auch Dimensionen beinhalten. Ein Messwert ist ein Metrikname und ein zugehöriger numerischer Wert. Dimensionen liefern weitere Informationen über die Messwerte. Beispiel für einen Metrikdatenpunkt:

Zeitstempel: 08-05-2020 16:26:42.025-0700

Messwert: metric_name:os.cpu. user=42.12, metric_name:max.size. kb=345

Dimensionen: hq=us-west-1, group=queue, name=azd

Metrikdatenpunkte und Ereignisse können gemeinsam durchsucht und korreliert werden, obwohl sie in separaten Indexarten gespeichert werden.

Als Host bezeichnet man das physische oder virtuelle Gerät, von dem ein Ereignis stammt. Darüber lassen sich alle Daten ermitteln, die von einem bestimmten Gerät stammen. Die Quelle ist der Name der Datei, des Verzeichnisses, des Datenstreams oder einer sonstigen Eingabe, aus der ein bestimmtes Ereignis stammt. Quellen werden als Sourcetypen klassifiziert. Diese sind entweder schon als bekannte Formate vordefiniert oder können vom Benutzer individuell definiert werden. Beispiele für gängige Sourcetypen sind HTTP-Webserverlogs und Windows-Ereignisprotokolle.

Host, Quelle und Sourcetyp

Ereignisse mit demselben Sourcetyp können aus unterschiedlichen Quellen stammen. Ereignisse aus der Datei

source=/var/log/messages

und von einem Syslog-Eingabeport

source=UDP:514

haben z. B. oftmals denselben Sourcetyp, nämlich

sourcetype=linux_syslog


Felder

Felder sind durchsuchbare Name-Wert-Paare, die Ereignisse voneinander unterscheiden.  Nicht alle Ereignisse haben dieselben Felder und Feldwerte. Mit Feldern lassen sich individuell zugeschnittene Suchen erstellen, um exakt die gewünschten Ereignisse abzurufen. Wenn Splunk-Software bei der Indizierung und Suche Ereignisse verarbeitet, extrahiert die Software Felder auf der Grundlage von Definitionen in der Konfigurationsdatei und benutzerdefinierten Mustern.

Mit dem Feldextraktor-Tool könnt ihr bei der Suche reguläre Ausdrücke oder Trennzeichen wie Leerzeichen, Kommas oder andere Zeichen verwenden, um automatisch Feldextraktionen zu generieren und zu validieren.

Tags

Ein Tag ist ein Wissensobjekt, mit dem ihr nach Ereignissen suchen könnt, die bestimmte Feldwerte enthalten. Ihr könnt einer Feld-Wert-Kombination, einschließlich Eventtypen, Hosts, Quellen und Sourcetypen, ein oder mehrere Tags zuordnen. Mit Tags könnt ihr zusammengehörige Feldwerte gruppieren oder abstrakte Feldwerte wie IP-Adressen oder IDs nachverfolgen, indem ihr ihnen aussagekräftige Bezeichnungen zuordnet.

Indizierungs- und Suchzeitpunkt

Bei der Indexverarbeitung (also zum Indizierungszeitpunkt) werden Daten aus einer Quelle auf einem Host gelesen und als Sourcetyp klassifiziert. Es werden Zeitstempel extrahiert und die Daten in einzelne Ereignisse geparst. Zum Segmentieren der Ereignisse für die Anzeige in den Suchergebnissen werden Zeilenumbruchregeln angewandt. Jedes Ereignis wird in einen Index auf der Festplatte geschrieben, aus dem es später bei Suchanfragen abgerufen wird.

Beim Starten einer Suche, also zum Suchzeitpunkt, werden indizierte Ereignisse von der Festplatte abgerufen. Felder werden aus dem Rohtext des Ereignisses extrahiert.

Indizes

Beim Hinzufügen von Daten parst Splunk-Software die Daten in einzelne Ereignisse, extrahiert den Zeitstempel, wendet Zeilenumbruchregeln an und speichert die Ereignisse in einem Index. Ihr könnt neue Indizes für unterschiedliche Eingaben erstellen. Standardmäßig werden die Daten im Index „main“ gespeichert. Bei einer Suche werden Ereignisse aus einem oder mehreren Indizes abgerufen.


Hauptfunktionen

Berichte

Die Suche ist für Benutzer die Hauptmethode, um in Splunk-Software durch Daten zu navigieren. Ihr könnt eine Suche schreiben, um Ereignisse aus einem Index abzurufen, Statistikbefehle zum Berechnen von Metriken und Erstellen von Berichten auszuführen, innerhalb eines rollenden Zeitfensters nach bestimmten Bedingungen zu suchen, Muster innerhalb eurer Daten zu erkennen, künftige Trends zu prognostizieren und vieles mehr. Mithilfe der Splunk Search Process Language (SPL™) werden die Ereignisse transformiert. Suchen können als Berichte gespeichert und für die Anzeige in Dashboards verwendet werden.

Berichte

Bei Berichten handelt es sich um gespeicherte Suchen. Ihr könnt Berichte ad-hoc oder nach einem Zeitplan in regelmäßigen Intervallen ausführen und für einen geplanten Bericht festlegen, dass Benachrichtigungen ausgelöst werden, wenn die Ergebnisse bestimmte Bedingungen erfüllen. Berichte können als Dashboard-Teilfenster zu Dashboards hinzugefügt werden.

Dashboards

Dashboards bestehen aus Teilfenstern, die bestimmte Module wie Suchfelder, Felder und Datenvisualisierungen enthalten. Dashboard-Teilfenster sind meist mit gespeicherten Suchen verknüpft. In den Teilfenstern werden die Ergebnisse abgeschlossener Suchen sowie Daten aus Echtzeitsuchen angezeigt.

Benachrichtigungen

Benachrichtigungen werden ausgelöst, wenn Suchergebnisse bestimmte Bedingungen erfüllen. Ihr könnt Benachrichtigungen bei historischen und Echtzeitsuchen verwenden. Benachrichtigungen können so konfiguriert werden, dass sie Aktionen auslösen, z. B das Senden von Benachrichtigungsinformationen an bestimmte E-Mail-Adressen oder das Posten von Benachrichtigungsinformationen in einer Webressource.

Weitere Funktionen

Datensets

Mit Splunk könnt ihr unterschiedliche Arten von Datensets erstellen und verwalten, darunter Lookups, Datenmodelle und Tabellen-Datensets. Tabellen-Datensets sind spezielle kuratierte Sammlungen von Ereignisdaten, die für einen bestimmten geschäftlichen Zweck erstellt werden. Mit Table Views, einem Tool, das komplexe Suchbefehle in einfache UI-Editor-Interaktionen übersetzt, könnt ihr leistungsstarke Tabellen-Datensets definieren und verwalten. Das Tool ist wirklich benutzerfreundlich und erfordert nur minimale Kenntnisse von Splunk SPL.

Datenmodell

Ein Datenmodell ist eine hierarchisch organisierte Sammlung von Datensets. Ihr könnt ganze Datenmodelle oder bestimmte Datensets innerhalb von Datenmodellen in Suchen referenzieren. Außerdem könnt ihr auf Datenmodelle die Datenmodellbeschleunigung anwenden. Mit beschleunigten Datenmodellen lässt sich die Suchleistung drastisch steigern. Daher werden sie häufig für die Anzeige in Dashboard-Teilfenstern und wichtigen On-Demand-Berichten verwendet.

Apps

Bei Apps handelt es sich um eine Sammlung von Konfigurationen, Wissensobjekten und von Kunden entworfenen Ansichten und Dashboards. Apps erweitern die Splunk-Umgebung, um sie an spezifische Anforderungen operativer Teams wie etwa Administratoren von Unix- und Windows-Systemen, Experten für Netzwerksicherheit, Website-Manager, Business-Analysten usw. anzupassen. Innerhalb einer Splunk Enterprise- oder Splunk Cloud-Installation können mehrere Apps gleichzeitig ausgeführt werden.

Verteilte Suche

Eine verteilte Suche bietet die Möglichkeit, eure Bereitstellung zu skalieren, indem die Suchverwaltungs- und Darstellungsebene von der Indizierungs- und Suchabrufebene getrennt wird.  Die verteilte Suche wird verwendet, um eine horizontale Skalierung und damit eine Performance-Steigerung zu ermöglichen, den Zugriff auf indizierte Daten zu steuern und geografisch verteilte Daten zu verwalten.

Systemkomponenten

Forwarder

Eine Splunk-Instanz, die Daten an eine andere Splunk-Instanz weiterleitet, wird als Forwarder bezeichnet.

Indexer

Ein Indexer ist die Splunk-Instanz, die Daten indiziert. Der Indexer wandelt die Rohdaten in Ereignisse um und speichert die Ereignisse in einem Index. Außerdem durchsucht der Indexer die indizierten Daten bei Suchanforderungen. Die Such-Peers sind Indexer, die Suchanforderungen seitens des Search Head erfüllen.

Search Head

In einer verteilten Suchumgebung ist der Search Head die Splunk-Instanz, die Suchanforderungen an eine Reihe von Such-Peers verteilt und die Ergebnisse beim Benutzer zusammenführt. Eine Instanz, die nur für Suchen, nicht jedoch für Indizierungen verwendet wird, wird in der Regel als dedizierter Search Head bezeichnet.

Search Processing Language (SPL)

Eine Splunk-Suche besteht aus einer Reihe von Befehlen und Argumenten. Befehle werden mit einem „|“ (Pipe-Zeichen) verkettet, welches angibt, dass das Ergebnis eines Befehls an den nächsten Befehl auf der rechten Seite weitergegeben wird.

search | command1 arguments1 | command2 arguments2 | ...

Am Anfang der Suchpipeline steht ein impliziter Suchbefehl zum Abrufen von Ereignissen aus dem Index. Suchanforderungen werden mit Schlüsselwörtern, Ausdrücken in Anführungszeichen, booleschen Ausdrücken, Platzhaltern, Feldname-Wert-Paaren und Vergleichsausdrücken geschrieben. Der AND-Operator wird zwischen Suchbegriffen impliziert. Zum Beispiel:

sourcetype=access_combined error | top 5 uri

Diese Suche ruft indizierte Webaktivitätsereignisse ab, die den Begriff „error“ enthalten. Für diese Ereignisse werden die fünf häufigsten URI-Werte zurückgegeben.

Suchbefehle werden verwendet, um unerwünschte Ereignisse zu filtern, weitere Informationen zu extrahieren, Werte zu berechnen, zu transformieren und die indizierten Daten statistisch zu analysieren.  Die aus dem Index abgerufenen Suchergebnisse könnt ihr euch als dynamische Tabelle vorstellen. Jedes indizierte Ereignis ist eine Zeile. Die Feldwerte sind Spalten. Durch jeden Suchbefehl wird die Form dieser Tabelle neu definiert. Durch Suchbefehle, die Ereignisse filtern, werden beispielsweise Zeilen entfernt, während durch Suchbefehle, die Felder extrahieren, Spalten hinzugefügt werden.

Zeitmodifikatoren

Mit den Suchmodifikatoren „latest“ und „earliest“ könnt ihr einen Zeitraum angeben, in dem Ereignisse in Übereinstimmung mit eurer Suche abgerufen werden sollen.Relative Zeiten werden in einer Zeichenkette spezifiziert, die die Zeit (Ganzzahl und Einheit) angibt und optional eine „snap to“-Zeiteinheit enthalten kann. Die Syntax lautet:

[+|-]<integer><unit>@<snap_time_ unit>

Die Suche

“error earliest=-1d@d latest=h@h”

ruft Ereignisse ab, die „error“ enthalten und von gestern ab Mitternacht (00:00:00) bis zur letzten vollen Stunde des heutigen Tages aufgetreten sind.


Mit „snap to“ wird die Zeit auf die letzte volle angegebenen Einheit abgerundet. Wenn es zum Beispiel 11:59:00 ist und ihr „snap to hours“ (@h) angebt, wird 11:00:00 verwendet, nicht 12:00:00. Ihr könnt für „snap to“ auch bestimmte Wochentage angeben, indem ihr @w0 für Sonntag, @w1 für Montag verwendet usw.

Untergeordnete Suchen 

Eine untergeordnete Suche (auch Subsuche) führt eine eigene Suche aus und gibt die Ergebnisse als Argumentwert an den übergeordneten Befehl zurück. Die untergeordnete Suche wird zuerst ausgeführt und ist in eckige Klammern eingeschlossen. Bei der folgenden Suche wird zum Beispiel eine untergeordnete Suche verwendet, um alle Syslog-Ereignisse des Benutzers zu finden, bei dem der letzte Anmeldefehler aufgetreten ist:

sourcetype=syslog [ search login error | return 1 user ]

Suchen optimieren 

Entscheidend für schnelle Suchen ist die Beschränkung der Daten, die von der Festplatte abgerufen werden müssen, auf ein absolutes Minimum. Dann kommt es darauf an, die Daten möglichst früh im Suchvorgang zu filtern, sodass nur das erforderliche Minimum an Daten verarbeitet wird.

Wenn ihr nur selten Suchen in mehreren Datentypen durchführt, solltet ihr die Daten auf separate Indizes aufteilen. Beispielsweise könnt ihr Webdaten in einem Index speichern und Firewalldaten in einem anderen.

Beschränkt den Zeitraum auf den erforderlichen Rahmen. Beispiel: -1h nicht -1w  oder  earliest=-1d.

Gestaltet die Suche so spezifisch wie möglich. Beispiel: fatal_error   und nicht   *error*. In Dashboards empfiehlt sich die Verwendung von Post-Processing-Suchen.

Nutzt die Features für Zusammenfassungsindizierung, Berichte und Datenmodellbeschleunigung.

Machine Learning-Funktionen

Die Machine Learning-Funktionen von Splunk sind in unser gesamtes Portfolio integriert und

durch Angebote wie das Splunk Machine Learning Toolkit, das Streaming ML-Framework und das Splunk Machine Learning Environment in unsere Lösungen eingebettet.

SPL2

In mehreren Splunk-Produkten kommt bereits eine neue Version der Suchsprache SPL namens SPL2 zum Einsatz, die sich durch größere Benutzerfreundlichkeit auszeichnet, selten verwendete Befehle entfernt und die Konsistenz der Befehlssyntax optimiert.  Weitere Informationen findet ihr in der Referenzdokumentation zur SPL2-Suche.

Häufig verwendete Suchbefehle

Befehl

Beschreibung

chart/ timechart

Gibt Ergebnisse in einer tabellarischen Ausgabe für (Zeitreihen-)Diagramme zurück.

dedup

Entfernt nachfolgende Ergebnisse, die einem angegebenen Kriterium entsprechen.

eval

Berechnet einen Ausdruck.  Siehe HÄUFIG VERWENDETE EVAL-FUNKTIONEN.

Felder

Entfernt Felder aus den Suchergebnissen.

head/tail

Gibt die ersten/letzten N Ergebnisse zurück.

lookup

Fügt Feldwerte aus einer externen Quelle hinzu.

rename

Benennt ein Feld um. Platzhalter verwenden, um mehrere Felder anzugeben.

rex

Gibt mit regulären Ausdrücken benannte Gruppen an, um Felder zu extrahieren.

search

Filtert Ergebnisse heraus, die mit dem Suchausdruck übereinstimmen.

Sortieren

Sortiert die Suchergebnisse nach den angegebenen Feldern.

stats

Stellt Statistiken bereit, die optional nach Feldern gruppiert werden können.  Siehe HÄUFIG VERWENDETE STATISTIKFUNKTIONEN.

mstats

Ähnlich wie stats, wird jedoch auf Metriken statt auf Ereignisse angewendet.

table

Gibt Felder an, die im Ergebnissatz verbleiben sollen. Speichert Daten in einem Tabellenformat.

top/rare

Zeigt die häufigsten/seltensten Werte eines Feldes an.

transaction

Gruppiert Suchergebnisse in Transaktionen.

where

Filtert Suchergebnisse mithilfe von Eval-Ausdrücken. Wird verwendet, um zwei verschiedene Felder zu vergleichen.




Häufig verwendete Eval-Funktionen

Der Eval-Befehl berechnet einen Ausdruck und fügt den resultierenden Wert in ein Feld ein (z. B. "...| eval force = mass * acceleration"). In der folgenden Tabelle sind einige Funktionen aufgelistet, die mit dem Eval-Befehl verwendet werden. Ihr könnt auch einfache arithmetische Operatoren (+ - * / %), Zeichenfolgenverkettung (z. B. "...| eval name = last . "," . first") und boolesche Operatoren (AND OR NOT XOR < > <= >= != = == LIKE) verwenden.

Funktion

Beschreibung

Beispiele

abs(X)

Gibt den absoluten Wert von X zurück.

abs(number)

case(X,"Y",…)

Verwendet Argumentpaare von X und Y, wobei die X-Argumente boolesche Ausdrücke sind. Wenn diese als TRUE ausgewertet werden, geben sie das entsprechende Y-Argument zurück.

case(error == 404, "Not found", error ==500,"Internal Server Error", error == 200, "OK")

ceil(X)

Obergrenze einer Zahl X.

ceil(1.9)

cidrmatch("X",Y)

Identifiziert IP-Adressen, die zu einem bestimmten Subnetz gehören.

cidrmatch("123.132.32.0/25",ip)

coalesce(X,…)

Gibt den ersten Wert zurück, der nicht NULL ist.

coalesce(null(), "Returned val", null())

cos(X)

Berechnet den Kosinus von X.

n=cos(0)

exact(X)

Wertet einen Ausdruck X mit Gleitkommaarithmetik mit doppelter Genauigkeit aus.

exact(3.14*num)

exp(X)

Gibt eX zurück.

exp(3)

if(X,Y,Z)

Wenn X als TRUE ausgewertet wird, ist das Ergebnis das zweite Argument Y. Wenn X als FALSE ausgewertet wird, ist das Ergebnis das dritte Argument Z.

if(error==200, "OK", "Error")

in(field,valuelist)

Gibt TRUE zurück, wenn ein Wert in der Werteliste („valuelist“) mit einem Wert im angegebenen Feld („field“) übereinstimmt. Die Funktion „in“ ist innerhalb der Funktion „if“ zu verwenden.

if(in(status, “404”,”500”,”503”),”true”,”false”)

isbool(X)

Gibt TRUE zurück, wenn X ein boolescher Wert ist.

isbool(field)

isint(X)

Gibt TRUE zurück, wenn X eine Ganzzahl ist.

isint(field)

isnull(X)

Gibt TRUE zurück, wenn X NULL ist.

isnull(field)

isstr()

Gibt TRUE zurück, wenn X eine Zeichenfolge ist.

isstr(field)

len(X)

Diese Funktion gibt die Zeichenlänge einer Zeichenfolge X zurück.

len(field)

like(X,"Y")

Gibt TRUE nur dann zurück, wenn X dem SQLite-Muster in Y entspricht.

like(field, "addr%")

log(X,Y)

Gibt den Logarithmus des ersten Arguments X zurück, wobei das zweite Argument Y als Basis dient. Y ist standardmäßig auf 10 eingestellt.

log(number,2)

lower(X)

Gibt X in Kleinbuchstaben zurück.

lower(username)

ltrim(X,Y)

Gibt X zurück, wobei die in Y angegebenen Zeichen auf der linken Seite entfernt werden. Die Standardangabe für Y sind Leerzeichen und Tabulatoren.

ltrim(" ZZZabcZZ ", " Z")

match(X,Y)

Wird zurückgegeben, falls X dem Regex-Muster Y entspricht.

match(field, "^\d{1,3}\.\d$")

max(X,…)

Gibt das Maximum zurück.

max(delay, mydelay)

md5(X)

Gibt den MD5-Hash eines Zeichenfolgenwerts X zurück.

md5(field)

min(X,…)

Gibt das Minimum zurück.

min(delay, mydelay)

mvcount(X)

Gibt die Anzahl der Werte von X zurück.

mvcount(multifield)

mvfilter(X)

Filtert ein Multiwertfeld basierend auf dem booleschen Ausdruck X.

mvfilter(match(email, "net$"))

mvindex(X,Y,Z)

Gibt eine Teilmenge des Multiwertfelds X von der Startposition (nullbasiert) Y bis Z (optional) zurück.

mvindex(multifield, 2)

mvjoin(X,Y)

Ausgehend von einem Multiwertfeld X und einem Zeichenfolgentrennzeichen Y werden die einzelnen Werte von X unter Verwendung von Y verknüpft.

mvjoin(address, ";")

now()

Gibt die aktuelle Zeit zurück, angegeben in Unix-Zeit.

now()

null()

Diese Funktion akzeptiert keine Argumente und gibt NULL zurück.

null()

nullif(X,Y)

Ausgehend von zwei Argumenten, den Feldern X und Y, wird X zurückgegeben, wenn die Argumente ungleich sind. Andernfalls wird NULL zurückgegeben.

nullif(fieldA, fieldB)

random()

Gibt eine Pseudozufallszahl von 0 bis 2147483647 zurück.

random()

relative_time (X,Y)

Ausgehend von der Epoch-Zeit X und der relativen Zeitangabe Y, wird der Epoch-Zeitwert von Y angewendet auf X zurückgegeben.

relative_time(now(),"-1d@d")

replace(X,Y,Z)

Gibt eine Zeichenfolge zurück, die durch das Ersetzen jedes Vorkommens der Regex-Zeichenfolge Y in der Zeichenfolge X durch die Zeichenfolge Z gebildet wird.

Gibt das Datum mit vertauschten Monats- und Tageszahlen zurück. Bei einer Eingabe von 4/30/2021 wäre der Rückgabewert also 30/4/2021: replace(date,"^(\d{1,2})/(\d{1,2})/", "\2/\1/")

round(X,Y)

Gibt X zurück, gerundet auf die Anzahl der Dezimalstellen, die durch Y angegeben werden. Standardmäßig wird auf eine Ganzzahl gerundet.

round(3.5)

rtrim(X,Y)

Gibt X zurück, wobei die in Y angegebenen Zeichen auf der rechten Seite entfernt werden. Wenn Y nicht angegeben ist, werden Leerzeichen und Tabulatoren entfernt.

rtrim(" ZZZZabcZZ ", " Z")

split(X,"Y")

Gibt X als Multiwertfeld zurück, aufgeteilt durch das Trennzeichen Y.

split(address, ";")

sqrt(X)

Gibt die Quadratwurzel von X zurück.

sqrt(9)

strftime(X,Y)

Gibt den Epoch-Zeitwert X im durch Y angegebenen Format zurück.

strftime(_time, "%H:%M")

strptime(X,Y)

Gibt ausgehend von einer Zeit, die durch die Zeichenfolge X dargestellt wird, den aus dem Format Y geparsten Wert zurück.

strptime(timeStr, "%H:%M")

substr(X,Y,Z)

Gibt ein Teilzeichenfolgenfeld X von der Startposition (einsbasiert) Y für Z (optional) Zeichen zurück.

substr("string", 1, 3)

time()

Gibt die Wanduhrzeit mit Mikrosekundengenauigkeit zurück.

time()

tonumber(X,Y)

Konvertiert die Eingabezeichenfolge X in eine Zahl, wobei Y (optional, Standardwert ist 10) die Basis der Zahl definiert, in die konvertiert werden soll.

tonumber("0A4",16)

tostring(X,Y)

Gibt einen Feldwert X als Zeichenfolge zurück. Wenn der Wert von X eine Zahl ist, wird X als Zeichenfolge neu formatiert. Wenn X ein boolescher Wert ist, wird X als „True“ oder „False“ neu formatiert. Wenn X eine Zahl ist, ist das zweite Argument Y optional und kann entweder „hex“ (konvertiert X in eine Hexadezimalzahl), „commas“ (formatiert X mit Kommas und zwei Dezimalstellen) oder „duration“ (konvertiert X aus einem Zeitformat in Sekunden in ein lesbares Zeitformat: HH:MM:SS) sein.

Rückgabe dieses Beispiels: foo=615 and foo2=00:10:15:… | eval foo=615 | eval foo2 = tostring(foo, “duration”)

typeof(X)

Gibt eine Zeichenfolgendarstellung des Feldtyps zurück.

Rückgabe dieses Beispiels: “NumberStringBoolInvalid”: typeof(12)+ typeof(“string”)+

urldecode(X)

Gibt die URL X decodiert zurück.

urldecode("http%3A%2F%2Fwww.splunk.com%2Fdownload%3Fr%3Dheader")

validate| (X,Y,…)

Gibt ausgehend von Argumentpaaren, booleschen Ausdrücken X und Zeichenfolgen Y, die Zeichenfolge Y zurück, die dem ersten Ausdruck X entspricht, der als FALSE ausgewertet wird. Wird standardmäßig auf NULL gesetzt, wenn alle Werte TRUE sind.

validate(isint(port), "ERROR: Port is not an integer", port >= 1 AND port <= 65535, "ERROR:Port is out of range")




Häufig verwendete Statistikfunktionen

Allgemeine Statistikfunktionen, die mit den Befehlen chart, stats und timechart verwendet werden. Feldnamen können mit Platzhaltern versehen werden, sodass avg(*delay) den Durchschnitt der Felder delay und xdelay berechnen kann.

avg(X)

Gibt den Mittelwert der Werte des Felds X zurück.

count(X)

Gibt die Anzahl der Vorkommen des Felds X zurück. Um einen bestimmten Feldwert anzugeben, der übereinstimmen soll, formatiert ihr X als eval(field="value").

dc(X)

Gibt die Anzahl der eindeutigen Werte des Felds X zurück.

earliest(X)

Gibt den chronologisch frühesten Wert von X zurück.

latest(X)

Gibt den chronologisch spätesten Wert von X zurück.

max(X)

Gibt den Maximalwert des Felds X zurück. Wenn die Werte von X nicht numerisch sind, wird der Maximalwert aus der alphabetischen Reihenfolge ermittelt.

median(X)

Gibt den mittleren Wert des Felds X zurück.

min(X)

Gibt den Minimalwert des Felds X zurück. Wenn die Werte von X nicht numerisch sind, wird der Minimalwert aus der alphabetischen Reihenfolge ermittelt.

mode(X)

Gibt den am häufigsten vorkommenden Wert des Felds X zurück.

perc<X>(Y)

Gibt den X-ten Perzentilwert des Felds X zurück. Beispielsweise gibt perc5(total) den fünften Perzentilwert des Felds „total“ zurück.

range(X)

Gibt die Differenz zwischen dem Maximal- und Minimalwert des Felds X zurück.

stdev(X)

Gibt die Standardabweichung einer Stichprobe des Felds X zurück.

stdevp(X)

Gibt die Standardabweichung der Population des Felds X zurück.

sum(X)

Gibt die Summe der Werte des Felds X zurück.

sumsq(X)

Gibt die Quadratsumme der Werte des Felds X zurück.

values(X)

Gibt die Liste aller eindeutigen Werte des Felds X als Eintrag mit mehreren Werten zurück. Die Reihenfolge der Werte ist alphabetisch.

var(X)

Gibt die Stichprobenvarianz des Felds X zurück.



Beispielsuchen

Ergebnisse filtern


Gibt X zurück, gerundet auf die Anzahl der Dezimalstellen, die durch Y angegeben werden. Standardmäßig wird auf eine Ganzzahl gerundet.

round(3.5)

Gibt X zurück, wobei die in Y angegebenen Zeichen auf der rechten Seite entfernt werden. Wenn Y nicht angegeben ist, werden Leerzeichen und Tabulatoren entfernt.

rtrim(" ZZZZabcZZ ", " Z")

Gibt X als Multiwertfeld zurück, aufgeteilt durch das Trennzeichen Y.

split(address, ";")

Gibt ausgehend von Argumentpaaren, booleschen Ausdrücken X und Zeichenfolgen Y, die Zeichenfolge Y zurück, die dem ersten Ausdruck X entspricht, der als FALSE ausgewertet wird. Wird standardmäßig auf NULL gesetzt, wenn alle Werte TRUE sind.

validate(isint(port), "ERROR: Port is not an integer", port >= 1 AND port <= 65535, "ERROR: Port is out of range")




Ergebnisse gruppieren


Ergebnisse clustern, nach ihren „cluster_count“-Werten sortieren und dann die 20 größten Cluster (in Bezug auf die Datengröße) zurückgeben.

… | cluster t=0.9 showcount=true | sort limit=20 -cluster_count

Ergebnisse, die den gleichen

„host“ und „cookie“ aufweisen, innerhalb von 30 Sekunden auftreten und bei denen zwischen den einzelnen Ereignissen keine Pause von mehr als 5 Sekunden liegt, in einer Transaktion gruppieren.

… | transaction host cookie maxspan=30s maxpause=5s

Ergebnisse mit der gleichen IP-Adresse (clientip) gruppieren, bei denen das erste Ergebnis „signon“ und das letzte Ergebnis „purchase“ enthält.

… | transaction clientip startswith="signon" endswith="purchase"




Ergebnisse sortieren


Die ersten 20 Ergebnisse zurückgeben.

… | head 20

Die Reihenfolge eines Ergebnissatzes umkehren.

… | reverse

Die Ergebnisse nach „ip“-Wert (in aufsteigender Reihenfolge) sortieren und dann nach „url“-Wert (in absteigender Reihenfolge).

… | sort ip, -url

Die letzten 20 Ergebnisse in umgekehrter Reihenfolge zurückgeben.

… | tail 20




Reporting


Mittelwert und Anzahl unter Verwendung einer 30-Sekunden-Spanne aller Metriken, die mit cpu.percent enden, aufgeschlüsselt nach Metriknamen zurückgeben.

| mstats avg(_value), count(_value) WHERE metric_name=”*.cpu.percent” by metric_name span=30s

max(delay) für jeden Wert von foo aufgeschlüsselt nach dem Wert von bar zurückgeben.

… | chart max(delay) over foo by bar

max(delay) für jeden Wert von foo zurückgeben.

… | chart max(delay) over foo

Anzahl der Ereignisse nach „host“.

… | stats count by host

Eine Tabelle mit der Anzahl der Ereignisse und einem kleinen Liniendiagramm erstellen.

… | stats sparkline count by host

Zeitdiagramm für die Anzahl der „web“-Quellen nach „host“ erstellen.

… | timechart count by host

Mittelwert von

„CPU“ pro Minute pro „host“ berechnen.

… | timechart span=1m avg(CPU) by host

Mittelwert für jede Stunde eines eindeutigen Felds zurückgeben, das mit der Zeichenfolge „lay“ endet (z. B. delay, xdelay, relay usw.)

… | stats avg(*lay) by date_hour

Die 20 häufigsten Werte des Felds „url“ zurückgeben.

… | top limit=20 url

Die seltensten Werte des Felds „url“ zurückgeben.

… | rare url




Erweitertes Reporting


Durchschnittliche Gesamtdauer berechnen und „avgdur“ als neues Feld zu jedem Ereignis hinzufügen, für das das Feld „duration“ existiert.

... | eventstats avg(duration) as avgdur

Kumulative Summe der Bytes ermitteln.

... | streamstats sum(bytes) as bytes_total | timechart max(bytes_ total)

Anomalien im Feld „Close_Price“ während der letzten zehn Jahre finden.

sourcetype=nasdaq earliest=-10y | anomalydetection Close_Price

Diagramm erstellen, das die Anzahl der Ereignisse mit einem prognostizierten Wert und Bereich zeigt, die für jedes Ereignis in der Zeitreihe hinzugefügt wurden.

... | timechart count | predict count

Einen einfachen gleitenden Mittelwert über fünf Ereignisse für das Feld „count“ berechnen und in das neue Feld „smoothed_ count“ schreiben.

“... | timechart count | trendline sma5(count) as smoothed_count”




Metriken


Alle Metriknamen im Metrikindex „_metrics“ auflisten.

| mcatalog values(metric_ name) WHERE index=_ metrics

Beispiele für die Metrikdatenpunkte anzeigen, die im Metrikindex „_metrics“ gespeichert sind.

| mpreview index=_ metrics target_per_ timeseries=5

Den Mittelwert einer Metrik im Metrikindex „_metrics“ zurückgeben. Die Ergebnisse werden in Zeitspannen von 30 Sekunden zusammengefasst.

| mstats avg(aws.ec2. CPUUtilization) WHERE index=_metrics span=30s




Felder hinzufügen


Geschwindigkeit auf Entfernung/Zeit einstellen.

… | eval velocity=distance/time

Die Felder „from“ und „to“ mit regulären Ausdrücken extrahieren. Wenn ein Rohereignis „From: Susan To: David“ enthält, dann ist from=Susan und to=David.

… | rex field=_raw "From: (?<from>.*) To: (?<to>.*)"

Die laufende Summe von „count“ in einem Feld namens „total_count“ speichern.

… | accum count as total_count

Für jedes Ereignis, bei dem „count“ vorhanden ist, die Differenz zwischen count und seinem vorherigen Wert berechnen und das Ergebnis in „countdiff“ speichern.

… | delta count as countdiff




Felder filtern


Nur die Felder „host“ und „ip“ beibehalten und in dieser Reihenfolge anzeigen.

… | fields + host, ip

Die Felder „host“ und „ip“ aus den Ergebnissen entfernen.

… | fields - host, ip




Lookup-Tabellen (nur Splunk Enterprise)

Für jedes Ereignis die Lookup-Tabelle usertogroup nutzen, um den übereinstimmenden „user“-Wert aus dem Ereignis zu lokalisieren. Den Wert des Gruppenfelds im Ereignis ausgeben.

… | lookup usertogroup user output group

In der Lookup-Tabelle usertogroup lesen, die in der Datei transforms.conf definiert ist.

… | inputlookup usertogroup

Die Suchergebnisse in die Lookup-Datei „users.csv“ schreiben.

… | outputlookup users.csv




Felder modifizieren


Das Feld „ip“ in „IPAddress“ umbenennen.

… | rename _ip as IPAddress




Reguläre Ausdrücke (Regexe)

Reguläre Ausdrücke sind in vielen Bereichen nützlich, z. B. bei den Suchbefehlen regex und rex, Eval-Funktionen match() und replace() und in der Feldextraktion.

Regex

Kommentar

Beispiel

Erläuterung

\s

Leerraum

\d\s\d

Ziffer Leerraum Ziffer

\S

kein Leerraum

\d\S\d

Ziffer Nicht-Leerraum Ziffer

\d

Ziffer

\d\d\d-\d\d-

\d\d\d\d

Sozialversicherungsnummer (USA)

\D

keine Ziffer

\D\D\D

drei Nicht-Ziffern

\w

Wortzeichen (Buchstabe, Zahl oder _)

\w\w\w

drei Wortzeichen

\W

kein Wortzeichen

\W\W\W

drei Nicht-Wortzeichen

[...]

beliebiges enthaltenes Zeichen

[a-z0-9#]

beliebiges Zeichen von a bis z, 0 bis 9 oder #

[^...]

nicht enthaltenes Zeichen

[^xyz]

jedes Zeichen außer x, y oder z

*

null oder mehr

\w*

null oder mehr Wortzeichen

+

eins oder mehr

\d+

Ganzzahl

?

null oder eins

\d\d\d-?\d\d-

?\d\d\d\d

Sozialversicherungsnummer (USA) mit optionalen Bindestrichen

|

oder

\w|\d

Wort- oder Ziffernzeichen

(?P<var>

...)

benannte Extraktion

(?P<ssn>\d\d\d-

\d\d-\d\d\d\d)

Sozialversicherungsnummer (USA) extrahieren und dem Feld „ssn“ zuweisen

(?: ...

)

logische oder atomare Gruppen

(?:[a-zA-Z]|\d)

Buchstabe ODER Ziffer

^

Zeilenanfang

^\d+

Zeile beginnt mit mindestens einer Ziffer

$

Zeilenende

\d+$

Zeile endet mit mindestens einer Ziffer

{...}

Anzahl der Wiederholungen

\d{3,5}

zwischen 3 und 5 Ziffern

\

Escape

\[

das [-Zeichen escapen




Multiwertfelder


Die multiplen Werte des Felds „recipients“ zu einem einzigen Wert kombinieren

… | nomv recipients

Werte des Feld „recipients“ in mehrere Feldwerte trennen und die Top-Empfänger anzeigen

… | makemv delim="," recipients | top recipients

Neue Ergebnisse für jeden Wert des Multiwertfelds „recipients“ erstellen

… | mvexpand recipients

Anzahl der Empfängerwerte ermitteln

… | eval to_count = mvcount(recipients)

Erste E-Mail-Adresse im Empfängerfeld („recipients“) finden

… | eval recipient_first = mvindex(recipient,0)

Alle „recipient“-Werte finden, die mit .net oder .org enden

… | eval netorg_ recipients = mvfilter match(recipient,"\.net$") OR match(recipient,"\.org$"))

Index des ersten Empfängerwerts finden, der mit “\.org$” übereinstimmt

… | eval orgindex = mvfind(recipient, "\.org$")




Häufige Datums- und Zeitformate

Diese Werte verwendet ihr für die Eval-Funktionen strftime() und strptime() und für Zeitstempel von Ereignisdaten.

Zeit

%H

24 Stunden (führende Nullen) (00 bis 23)

%I

12 Stunden (führende Nullen) (01 bis 12)

%M

Minute (00 bis 59)

%S

Sekunde (00 bis 61)

%N

Subsekunden mit Größenangabe (%3N = Millisekunden, %6N = Mikrosekunden, %9N = Nanosekunden)

%p

AM oder PM

%Z

Zeitzone (CET)

%z

Zeitzonenabweichung von der UTC in Stunden und Minuten: +hhmm oder -hhmm (+0100 für CET)

%s

Sekunden seit dem 01.01.1970 (1308677092)

Tage

%d

Tag des Monats (führende Nullen) (01 bis 31)

%j

Tag des Jahres (001 bis 366)

%w

Wochentag (0 bis 6)

%a

Abgekürzter Wochentag (So)

%A

Wochentag (Sonntag)

Monate

%b

Abgekürzter Monatsname (Jan)

%B

Monatsname (Januar)

%m

Monatsnummer (01 bis 12)

Jahre

%y

Jahr ohne Jahrhundert (00 bis 99)

%Y

Jahr (2021)

Beispiele

%Y-%m-%d

2021-12-31

%y-%m-%d

21-12-31

%b %d, %Y

Jan 24, 2021

%B %d, %Y

Januar 24, 2021

q|%d %b '%y= %Y-%m-%d

q|25 Feb '21 = 2021-02-25|


 

Ihr habt einen Fehler entdeckt oder eine Anregung? Bitte lasst es uns wissen und schreibt eine E-Mail an ssg-blogs@splunk.com.

 

Dieser Beitrag spiegelt nicht zwingend die Position, Strategie oder Meinung von Splunk wider.

 

Stephen Watts Picture

Stephen Watts works in growth marketing at Splunk. Stephen holds a degree in Philosophy from Auburn University and is an MSIS candidate at UC Denver. He contributes to a variety of publications including CIO.com, Search Engine Journal, ITSM.Tools, IT Chronicles, DZone, and CompTIA.

Ähnliche Artikel

Über Splunk

Weltweit führende Unternehmen verlassen sich auf Splunk, ein Cisco-Unternehmen, um mit unserer Plattform für einheitliche Sicherheit und Observability, die auf branchenführender KI basiert, kontinuierlich ihre digitale Resilienz zu stärken.

 

Unsere Kunden vertrauen auf die preisgekrönten Security- und Observability-Lösungen von Splunk, um ihre komplexen digitalen Umgebungen ungeachtet ihrer Größenordnung zuverlässig zu sichern und verbessern.

Erfahrt hier mehr über Splunk