webサービスのログ運用について Athena + kinesis firehose + redash
この記事はAltplus Advent Calendar 2017の9日目のエントリです。
こんにちは、サービスのインフラ周りの対応をしている橋本です。
ログの可視化や集計などで、複数サービスに適用を始めたので、
現在のログ運用の構成を書きたいと思います。
ログ運用について
構成
- fluend
- KinesisFirehose
- S3
- Athena + redash
ログ流れ
fluentd -> KinesisFirehose -> S3
ログ参照
redash -> athena -> s3
aws-cli -> athena -> s3
web -> athena
監視について
fluentd -> KinesisFirehose -> S3
redash -> athena -> s3
aws-cli -> athena -> s3
web -> athena
アラート用でボトルネックになる部分とAWSサービス側障害用で下記を監視しております。
- kinesisFirehose
- レコード取り込み数
- fluentd
- リトライ数
ログフォーマットについて
他のところにも使うかもしれなかったので加工複数の環境に対応できるよう、JSONフォーマットでの書き出しを行っています。
集計時
- DBのデータとのJOINしたいとき
- DBデータをTSV出力し、S3アップ後、Athenaのテーブル作成
テーブル
- kinesisFirehoseでS3保存時に作成されるディレクトリの日付毎でパーティションを何年分かを設定しています。
困ったところ
Athenaのテーブル設定でパーティションを始め、年、月、日で分けていたのですが、クエリを書きずらかったため、
20171212 などひとつのカラムに年月日の形で入れたほうがクエリが簡単になり便利でした
懸念
今後、Athenaで参照するデータがだいぶ増えた場合にクエリにだいぶ時間がかかるようにならないか心配で、
なったときは、bigqueryのほうに引っ越しを考えています。
クエリ
はじめ bigquery で運用していて、S3のログをGCS転送後そちらを bigqueryにロードするよう設定していました。
Athena側に移行する際に、日付パーティションの指定部分の違いとタイムゾーンの切り替えのところで少し悩んでいたので
where句のところをメモで残せればと思います。
- athena
# タイムゾーンのほう
SELECT date_format(time AT TIME ZONE 'Asia/Tokyo' , '%Y%m%d') as event_at,
# パーティションのほう
dt(パーティションのカラム) >= date_format((now() + interval '-30' DAY) AT TIME ZONE 'Asia/Tokyo' , '%Y-%m-%d') )
- bigquery
# タイムゾーンのほう
SELECT FORMAT_TIMESTAMP('%Y%m', time, 'Asia/Tokyo') AS date_time
# パーティションのほう
_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 365 DAY))
所感
- ログを集約して転送する部分のサーバがなく少し運用が楽になりました
- まだそこまでのログ量はないのですが、S3にデータを保存するのだと、 圧縮した状態で配置できるので、bigqueryに保存するよりもログ量が増えた際にお得になっていきそうに思います。
Author And Source
この問題について(webサービスのログ運用について Athena + kinesis firehose + redash), 我々は、より多くの情報をここで見つけました https://qiita.com/teeeeeeeeeeeeeeeee/items/687c9584cbff7f253cc1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .