web-dev-qa-db-fra.com

Amazon Cloudwatch Logs Insights avec des champs JSON

J'essaie d'utiliser Logs Insights avec des données contenant du JSON dans l'un des champs et d'analyser les champs JSON.

Mes données ressemblent à ce qui suit lorsque je les ai renseignées avec le code de démarrage

fields @timestamp, @message
| sort @timestamp desc
| limit 25

Comment puis-je facilement extraire la variable path dans mon JSON imbriqué pour y effectuer des agrégations? En regardant certains documents, je pensais que @message.path fonctionnerait, mais cela ne semble pas être le cas. Quelqu'un at-il interprété avec succès les journaux JSON dans Insights?

 enter image description here

EDIT: exemple de mes données

#
@timestamp
@message
1
2018-12-19 23:42:52.000
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"user,tags,promotions,company_sector,similar_professionals.tags,similar_professionals.user","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@logStream  i-05d1d61ab853517a0
@message  I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@timestamp  1545262972000
2
2018-12-19 23:42:16.000
I, [2018-12-19T23:42:16.723472 #851] INFO -- : [ea712503-eb86-4a6e-ab38-ddbcd6c2b4d0] {"method":"GET","path":"/api/v1/heartbeats/new","format":"json","controller":"API::V1::Public::HeartbeatsController","action":"new","status":201,"duration":9.97,"view":3.2,"time":"2018-12-19T23:42:16.712+00:00","params":{"format":"json","compress":false},"@timestamp":"2018-12-19T23:42:16.722Z","@version":"1","message":"[201] GET /api/v1/heartbeats/new (API::V1::Public::HeartbeatsController#new)"}
5
Cyril Duchon-Doris

En me basant sur @pyb insights , j’ai pu utiliser parse @message '"path":"*"' as path pour extraire le chemin à partir de n’importe quel emplacement du @message

Vous pouvez continuer à obtenir votre méthode en pipillant un autre parse @message '"method":"*"' as method sans vous soucier de commander car il s'agit d'une deuxième recherche globale en texte brut sur @message

Dans le cas où votre @message est:

I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}

En utilisant:

parse @message '"path":"*"' as path | parse @message '"method":"*"' as method

donnera les champs: path = '/api/v1/professionals/ID' et method = 'GET'

Notez qu’il s’agit toujours simplement d’une analyse syntaxique de chaînes et qu’en tant que tel, il n’a pas de concept de clés imbriquées comme params.format ne trouverait pas json, mais l’utilisation de format suffirait, tant qu’il n’y aurait pas d’autre chaîne format dans votre @message.

Notez également que cela s’applique au cas où Insights ne découvre pas votre JSON dans le message. Je crois que c'est le cas auquel @pyb faisait référence dans cette réponse . Mes journaux ne sont pas découverts en utilisant le format suivant

info - Request: {"method":"POST","path":"/auth/login/","body":{"login":{"email":"[email protected]","password":"********"}},"uuid":"36d76df2-aec4-4549-8b73-f237e8f14e23","ip":"*.*.*.*"}
4
GusGold

Vous pouvez utiliser la commande parse pour extraire des champs.

Si @message est

I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}

Ensuite, vous extrayez les champs comme suit:

fields @timestamp, @message
| parse "I, [*T*] INFO -- : {"method":"*"}" as @date, @time, @method
| filter method=GET
| sort @timestamp desc
| limit 20

La documentation est plutôt légère pour le moment. Je peux obtenir des résultats en remplaçant le caractère générique * par une expression régulière, mais l'analyse échoue.

2
pyb

CloudWatch Insights Logs découvre automatiquement les champs pour les types de journaux suivants:

Bûches lambda

CloudWatch Logs Insights découvre automatiquement les champs de journal dans les journaux Lambda, mais uniquement pour le premier fragment JSON incorporé dans chaque événement de journal (Remarque: l'emphase mine). Si un événement de journal Lambda contient plusieurs fragments JSON, vous pouvez analyser et extraire les champs de journal à l'aide de la commande d'analyse. Pour plus d'informations, voir Champs dans les journaux JSON.

Journaux CloudTrail

Voir champs dans les journaux JSON .

Source:Journaux pris en charge et champs découverts

Si @message est I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}

Ensuite, vous pouvez sélectionner et filtrer les champs comme suit:

fields @timestamp, @message, method
| filter method = "GET"
| sort @timestamp desc

Cela fonctionne aussi avec les champs imbriqués, à savoir params.format = "json" ou results.0.firstName = "Paul".

0
pyb