ログ + 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/