ログ + grafana
意外と面倒だったからsshしてログを集計するスクリプト書いた
for zone, instance, dir in instances:
# command = f'cd {dir} && docker-compose logs --since 24h 2>&1 | grep ERROR'
# jq ".CONTAINER_NAME"
command = f'sudo journalctl -u docker -o json --since "24 hour ago" | (grep ERROR || true)'
error_logs = check_output([
'gcloud', 'compute', 'ssh',
'--zone', zone, f'{user}@{instance}',
'--project', project_id,
'--', command,
])
# error_logs = gzip.decompress(error_logs)
counter = defaultdict(int)
for line in error_logs.splitlines():
# line = re.sub(r'[^A-Za-z0-9_-]+', '', str(line))
# counter[line] += 1
try:
error_log = json.loads(line)
counter[error_log['CONTAINER_NAME']] += 1
except json.JSONDecodeError:
continue
for key in counter:
print(f'{key} {counter[key]}')
古い-----------------------
モチベーション
定期的にcompute engineにsshしてログ見るのが面倒
grafanaでエラーの量とか、未知のエラーとか見れたら良い
こういうのをやってみた
dockerのlog driverでjournaldはdocker logs使えるらしい
https://docs.docker.jp/v19.03/config/container/logging/configure.html
結論
docker-composeでlogをjournaldに変更
promtailをdocker-composeに追加
prometheusをdocker-composeに追加
grafanaにprometheusデータソース追加
journald
最大サイズ
https://b.fugenjikko.com/archlinux/archlinux-journal-maxsize
圧縮
container optimized osの初期設定
SystemMaxUse=1G
SystemMaxFileSize=100M
#Compress=yes
Compress=yesにしておいた
docker logsそのままで行けるらしい
https://grafana.com/docs/loki/latest/send-data/promtail/configuration/