Ayant mis les logs de container docker en json, j'ai installé filebeat pour shipper directement ceux-ci à elasticsearch. Seul bémol, c'est que filebeat met comme timestamp source, l'heure à laquelle il à récolté (harvest) les logs.

Pour corriger ceci, il faut passer par un process d'ingest spécifique qui modifiera le document.

Nous créons notre ingest avec la commande suivante :

curl -XPUT pvalois:xxxxxxxxx@10.10.31.60:9200/_ingest/pipeline/json_timestamp \
-H "Content-type: application/json" \
-d '{
    "processors": [
      {
        "set": {
          "field": "_source.@timestamp",
          "value": "{{json.time}}",
	  "ignore_failure": true
        }
      }
    ]
}'

Comme ou le voir celle-ci crée un ingest préprocesseur nommé "json_timestamp" qui copie le content de json.time dans _source.@timestamp, corrigeant ainsi l'heure de réception du message.

Cependant la création de cet ingest ne suffit pas, il faut notifier a filebeat de l'utiliser lors de la communication avec elasticsearch. Pour cela, nous configurons le /etc/filebeat/filebeat.yml comme suit :

output.elasticsearch:
  hosts: [pvalois:xxxxxxxx@10.10.31.60:9200]
  pipeline: json_timestamp

Et voila, nos messages envoyés via filebeat seront maintenant livré à notre processor json.timestamp et tout sera propre à l'importation, même si celle-ci est faite à posteriori.