J'ai un script bash qui ressemble à ceci :

tail -f -n +1 my.log | \
  awk -f influx.awk | \
  xargs \
  -I '{}' \
  curl \
  -XPOST 'http://influxdb/write?db=foo' \
  --data-binary '{}'

Que puis-je changer pour qu'au lieu de créer une demande curl pour chaque ligne, elle les regroupe en 100 lignes (voir influx curl docs) ?

Le problème que j'ai est que chaque "point" InfluxDB doit être séparé par une nouvelle ligne, qui est également le délimiteur pour xargs, par ex. l'ajout de -L 100 à xargs ne fonctionne pas.

Bonus : comment pourrais-je également mettre fin à cela si aucune nouvelle ligne n'a été ajoutée au fichier après, disons, 10 s ?

1
Graham Russell 8 oct. 2020 à 10:53

1 réponse

Meilleure réponse

Plutôt que xargs, vous souhaitez utiliser split, avec son option --filter. Par exemple, les lignes de lots suivantes en groupes de deux :

$ seq 5 | split -l 2 --filter='echo begin; cat; echo end'
begin
1
2
end
begin
3
4
end
begin
5
end

Dans votre cas, vous pouvez essayer quelque chose comme

tail -f -n +1 my.log | \
  awk -f influx.awk | \
  split -l 100 --filter='\
    curl \
      -XPOST "http://influxdb/write?db=foo" \
      --data-binary @-'

Le @- permet à curl de lire les données à partir de l'entrée standard.

1
Jon 8 oct. 2020 à 14:30