New Relic Now Sie träumen von mehr Innovation? Machen Sie Ihren Traum im Oktober wahr.
Jetzt registrieren

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:

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: {%'

jparse

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

toTimestamp

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. 

toDatetime

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%'

cidrAddress

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')

convert

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.