Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FluentdとAWS Athenaでログ集約してみた

Avatar for YouYou YouYou
December 12, 2020

FluentdとAWS Athenaでログ集約してみた

Avatar for YouYou

YouYou

December 12, 2020
Tweet

More Decks by YouYou

Other Decks in Technology

Transcript

  1. ログの生データも検索できるようにしたい time: 1362020400 (28/Feb/2013:12:00:00 +0900) record: { "user" : nil,

    "method" : "GET", "code" : 200, "size" : 777, "host" : "192.168.0.1", "path" : "/", "referer": nil, "agent" : "Opera/12.0" } <parse> @type apache2 </parse> ApacheのログはFluentdのプラグインで 綺麗にパースできる。 ログの中身が加工されるが、場合によっては 生データが欲しい場合がある。 https://docs.fluentd.org/config uration/parse-section
  2. ログの生データも検索できるようにしたい 解決方法② raw_data(生データ)というレコードを末尾に追記した。 <filter td.apache.access**> @type record_transformer <record> raw_data ${record["host"]}

    ${record["user"]} ${record["time"]} ${record["method"]} ${record["path"]} ${record["code"]} ${record["size"]} ${record["referer"]} ${record["agent"]} </record> </filter>
  3. ログの生データも検索できるようにしたい time: 1362020400 (28/Feb/2013:12:00:00 +0900) record: { "user" : nil,

    "method" : "GET", "code" : 200, "size" : 777, "host" : "192.168.0.1", "path" : "/", "referer": nil, "agent" : "Opera/12.0" “raw_data” : 192.168.0.1 nil 28/Feb/2013:12:00:00 +0900 GET / 777 nil Opera/12.0 } raw_dataに全て のレコード情報が 書き込まれた
  4. クエリタイムでソートできるようにしたい 解決方法③ いい手が思いつかず… CWLにSlowQueryログが来たら→の Lambdaを実行してKinesisでS3に転送 import base64 import gzip import

    io import json def lambda_handler(event, context): records = [process_record(r) for r in event['records']] return {'records': records } def process_record(record): record_id = record['recordId'] data = base64.b64decode(record['data']) iodata = io.BytesIO(data) with gzip.GzipFile(fileobj=iodata, mode='r') as f: data = json.loads(f.read()) processed_data = process_data(data) + '\n' return { 'data': base64.b64encode(processed_data.encode('utf-8')).decode('utf-8'), 'result': 'Ok', 'recordId': record_id } def process_data(data): return '\n'.join([format_log_event(json) for json in data['logEvents']]) def format_log_event(j): return json.dumps({'timestamp': j['timestamp'], 'message': j['message']})
  5. クエリタイムでソートできるようにしたい 暫定的な対応策としてawslogsを使用(https://github.com/jorgebastida/awslogs) $ awslogs get <SlowQueryログ> --start='MM/DD/YYYY' --end=’MM/DD/YYYY’ <SlowQueryログ> <リージョン>

    # Time: 180606 15:00:02 # User@Host: rdsadmin[rdsadmin] @ localhost [] Id: 18 # Query_time: 0.507831 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 SET timestamp=1528297202; FLUSH SLOW LOGS ; 踏み台サーバにインストールして ターミナル上からSlowQueryログの 中身を表示 とは言えAthenaで他のログと 一緒に検索できないのは悔しい