Wir freuen uns, Ihnen heute ein paar Parsing- und Transformationsfunktionen vorstellen zu können, mit denen Sie die zum Zeitpunkt einer Abfrage benötigten Daten leichter finden und schneller Dashboards und Alerts erstellen können, ganz gleich, wie unstrukturiert Ihre Daten sind.
Seien wir ehrlich: Daten sehen nicht immer gut aus. Daten werden häufig so gespeichert, dass sie nicht sofort verwendet werden können. Beispielweise kann es sein, dass ein Zeitstempel, eine Entity-GUID oder eine Store-ID tief in einem Datensatz versteckt ist. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, die Daten vor ihrer Aufnahme zu bereinigen. Allerdings sind die Teams, die die Daten verarbeiten und analysieren (z. B. DevOps), nicht immer diejenigen, die dafür verantwortlich sind, wie die Daten überhaupt dorthin gelangt sind. Deshalb machen wir Ihnen das Leben jetzt leichter. Wir haben der New Relic Query Language (NRQL) die folgenden Funktionen hinzugefügt, die von allen verwendet werden können, die Zugriff auf New Relic haben:
- JSON zum Abfragezeitpunkt parsen: jparse(), mapKeys(), mapValues()
- Zeitstempel konvertieren: toTimestamp(), toDatetime()
- IP-Adressen zuordnen: cidrAddress()
- Base64 codieren und decodieren: encode(), decode()
- Einheiten umrechnen: convert()
Nachfolgend finden Sie ausführliche Beschreibungen und Beispiele zu den einzelnen Themen.
JSON zum Abfragezeitpunkt parsen
Daten kommen in vielen Formaten vor, eines der gebräuchlichsten ist JSON. Zum Parsen dieser Daten müssen Sie normalerweise eine komplizierte RegEx- oder Anchor-Parsing-Methode verwenden, was keinen Spaß macht. Mit jparse() gibt es nun einen Parser, der speziell auf diesen Datentyp zugeschnitten ist:
jparse(attribute, [path])
Nehmen wir an, wir haben eine Lognachricht, die nach dem Text „Order response:“ JSON enthält, wie im folgenden Beispiel:
Order response: {"timestamp":1709938901291,"status":500...
Als Erstes können wir Anchor-Parsing verwenden, um das JSON zu erhalten. Mit der Funktion jparse() extrahieren wir dann die gewünschten Felder:
WITH aparse(message, 'Order response: *') AS json
FROM Log
SELECT jparse(json, 'timestamp'), jparse(json, 'status'), message
WHERE message LIKE 'Order response: {%'
Sie sehen, dass das Extrahieren des Zeitstempels und des Statuscodes aus dem JSON mit dieser neuen Funktion viel einfacher ist.
Es gibt zwei weitere Funktionen, die gut mit der JSON-Parse-Methode funktionieren und die wir ebenfalls kürzlich veröffentlicht haben:
- mapKeys() extrahiert eine Liste aller Schlüssel, wenn als Eingabe eine Map übergeben wird.
- Im obigen Beispiel wäre das ['timestamp', 'status' usw.]
- mapValues() extrahiert eine Liste aller Werte, wenn als Eingabe eine Map übergeben wird
- ['1709938901291', '500' usw.]
Weitere Informationen finden Sie in der Dokumentation zu den einzelnen Funktionen hier: jparse(), mapKeys(), mapValues()
Zeitstempel konvertieren
Angenommen, Sie haben (endlich) einen Zeitstempel aus Ihrem JSON geparst, haben jetzt aber eine Epochenzeit „1709938901291“, die nicht lesbar ist. Auch das Gegenteil kann passieren: Sie extrahieren ein Datum im Stringformat, z. B. „8. März 2024, 23:01:41“, und haben keine Möglichkeit, diesen Zeitstempel mit anderen Zeitstempeln zu vergleichen.
Um dies zu beheben, verwenden Sie die neuen Funktionen zur Zeitstempelkonvertierung, sodass Sie Zeitstempel beliebig formatieren können.
toTimestamp(datestring [, pattern [, timezone]])
toTimestamp()
– alternativ bekannt als fromDateTime()
– nimmt einen Datums-/Uhrzeitstring und übersetzt ihn in einen Zeitstempel, der in Epochen-Millisekunden dargestellt wird.
Beispiel:
FROM Log
SELECT toTimestamp('2023-10-18 15:27', 'yyyy-MM-dd HH:mm', timezone: 'America/Los_Angeles')
Dies ergibt die Epochenzeit: 1697668020000
Hinweis: Die New Relic UI übersetzt dies in ein lesbares Datum.
toDatetime(timestamp [, pattern [, timezone]])
toDatetime()
– alternativ bekannt als fromTimestamp()
– nimmt einen numerischen Zeitstempel und übersetzt ihn in einen Datums-/Uhrzeitstring Ihrer Wahl. Beachten Sie, dass das Standardformat lautet: yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX].
Zum Interpretieren des Datumsstring-Parameters kann ein optionaler Zeitzonenwert verwendet werden.
Beispiel:
FROM Log
SELECT toDatetime(1697668020000, 'yyyy-MM-dd HH:mm', timezone: 'America/Los_Angeles')
Die obige Abfrage gibt „2023-10-18 15:27“ zurück.
Weitere Informationen finden Sie in der Dokumentation zu den einzelnen Funktionen hier: toTimestamp(), toDatetime()
IP-Adressen zuordnen
IP-Adressen können ein entscheidender Datenpunkt in Ihrem System sein und die Gruppierung nach Basisnetzwerk hilft Ihnen dabei, einen umfassenden Überblick über die Herkunft der Daten zu erhalten. Bisher war die Konvertierung einer IP-Adresse in ihr Basisnetzwerk sehr knifflig, mit cidrAddress ist dieses Problem nun jedoch gelöst:
cidrAddress(<attribute>[, <number> [ ,cidrFormat:true|false]])
cidrAddress()
nimmt eine CIDR-IP-Adresse und gibt die entsprechende Basisnetzwerkadresse aus. Das Attribut kann eine IP-Adresse allein oder mit einer Präfixlänge in CIDR-Notation sein. Die Zahl stellt die Präfixlänge dar und hat, wenn das Attribut in CIDR-Notation vorliegt, Vorrang vor der im CIDR-String angegebenen Präfixlänge.
Angenommen, wir haben eine Lognachricht mit einer IP-Adresse und einem in die Nachricht eingebetteten Port:
...{id:"etcd-events-a" endpoints:"172.20.44.143:3997" }...
Wir verwenden erneut Anchor-Parsing , um die IP-Adresse zu extrahieren. Anschließend können wir ihre Basisadresse mithilfe unserer neuen Funktion finden.
WITH aparse(message, '%endpoints:"*:*"%') AS (IP, Port)
FROM Log SELECT count(*)
FACET cidrAddress(IP, 24)
WHERE message LIKE '%etcdClusterPeerInfo%'
Weitere Informationen finden Sie in der Dokumentation zu dieser Funktion hier: cidrAddress()
Base64 codieren und decodieren
Daten können auch im Base64-Format ankommen, was zu Problemen führen kann, wenn Sie sie nicht decodieren können. Um dies zu beheben, verwenden Sie encode() und decode(), um Ihre Daten jederzeit neu zu formatieren:
encode(input, encoding)
encode()
führt Base64-Konvertierungen an einem bereitgestellten String durch und befolgt dabei den im zweiten Parameter angegebenen Base64-Standard. encode()
unterstützt „base64“, „base64mime“ und „base64url“ als Parameter. encode()
wird für Blobs nicht unterstützt.
Beispiel:
FROM Event SELECT encode('Hello World', 'base64')
Die obige Abfrage gibt „SGVsbG8gV29ybGQ=“ zurück.
decode()
decode()
führt Base64-Konvertierungen an Strings und Blobs durch und folgt dabei dem im zweiten Parameter angegebenen Base64-Standard. decode()
unterstützt „base64“, „base64mime“ und „base64url“ als Decodierungsparameter.
Beispiel:
FROM Event SELECT decode(‘SGVsbG8gV29ybGQ=', ‘base64’)
Die obige Abfrage gibt „Hello World“ zurück.
Weitere Informationen finden Sie in der Dokumentation zu den einzelnen Funktionen hier: encode(), decode()
Einheiten umrechnen
Es ist so einfach, wie es klingt. Wenn Sie Daten beispielsweise in Millisekunden gespeichert haben und diese in Sekunden umrechnen möchten, ist diese Funktion für Sie geeignet:
convert(attribute, fromUnits, toUnits)
Beispiel 1:
FROM Transaction
SELECT duration, convert(duration, 's', 'ms')
Diese Funktion ist besonders hilfreich, wenn für Ihre OpenTelemetry(OTel)-Metriken eine Einheit festgelegt ist, wodurch die Konvertierung dynamisch wird.
Beispiel 2:
FROM FROM Metric
SELECT average(convert(apm.service.transaction.duration, unit, 'ms')) AS 'Response time'
Weitere Informationen finden Sie in der Dokumentation zu dieser Funktion hier: convert()
Fazit
Durch die Hinzufügung aller dieser Funktionen zum Parsen und Konvertieren haben wir es für Sie wesentlich einfacher gemacht, Ihre Daten zu verstehen, egal wie versteckt oder verschlüsselt sie sind. Aufgaben, die früher mühsam waren, können heute mit nur einer Funktion erledigt werden. Wir sind gespannt, wie Sie diese neuen Funktionen nutzen, um Ihre Daten weiter zu visualisieren und tiefere Einblicke zu gewinnen.
Nächste Schritte
- Sehen Sie sich das Lehrvideo „Data Bytes“ zu diesen Parse- und Transformationsfunktionen an.
- Lesen Sie die Dokumentation zu NRQL-Unterabfragen-JOINs.
Falls Sie New Relic noch nicht nutzen, können Sie sich direkt hier registrieren. Das Einstiegskonto ist komplett kostenlos und beinhaltet 100 GB zur Datenerfassung sowie eine Komplettlizenz und unbegrenzte Basic-Lizenzen.
Die in diesem Blog geäußerten Ansichten sind die des Autors und spiegeln nicht unbedingt die Ansichten von New Relic wider. Alle vom Autor angebotenen Lösungen sind umgebungsspezifisch und nicht Teil der kommerziellen Lösungen oder des Supports von New Relic. Bitte besuchen Sie uns exklusiv im Explorers Hub (discuss.newrelic.com) für Fragen und Unterstützung zu diesem Blogbeitrag. Dieser Blog kann Links zu Inhalten auf Websites Dritter enthalten. Durch die Bereitstellung solcher Links übernimmt, garantiert, genehmigt oder billigt New Relic die auf diesen Websites verfügbaren Informationen, Ansichten oder Produkte nicht.