Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Laravelのログにエラーが吐き出されたら自動的にBacklogにログ内容を記載したチケットを作成する #sa_study

69 views

Published on

2019/04/19に行ったスタジオ・アルカナ社内勉強会で使用したスライドです。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Laravelのログにエラーが吐き出されたら自動的にBacklogにログ内容を記載したチケットを作成する #sa_study

  1. 1. Laravelのログにエラーが吐き出されたら自動的にBacklogにロ グ内容を記載したチケットを作成する 20190419ARCANAMeetup#49 HikariFukasawa@hico00
  2. 2. 依頼されました リーダー 「CloudWatchから発行されるバグチケットが見辛いから、 エラー内容とか追記されるようにしてっ!」
  3. 3. 当時の通知仕様 1.エラーが発生すると、laravel.logにstacktraceが吐き出される。 2.CloudWatchで"stacktrace"の文字列がログファイルに吐き出されると、アラートが発生するよ うなアラームを設定。 3.アラートが発生すると、Backlogにメール(AWSSNS)でチケット登録する。 4.チケットが登録されたら、CloudWatch上で該当時間のログファイルを確認。(余裕があれば、 チケットの件名を書き換えたり)
  4. 4. 確かに見辛いというか、めんどかった
  5. 5. やりましょう すでにCloudWatchでアラームは設定されているので、AWSSDKを使ってログ内容を取得する ようなLambda関数を作成します。 laravel.logにstacktraceが吐き出されているので、それの内容をすべて抽出。
  6. 6. 構成 CloudWatch‑>SNS‑>Lambda‑>SNS(Backlogのメール課題登録)
  7. 7. CloudWatchから渡されるデータ { AlarmName: 'php7app-stg20-ERROR', AlarmDescription: null, AWSAccountId: '217903947487', NewStateValue: 'ALARM', NewStateReason: 'Threshold Crossed: 1 datapoint [1.0 (20/03/19 09:27:00)] was StateChangeTime: '2019-03-20T09:42:59.895+0000', Region: 'Asia Pacific (Tokyo)', OldStateValue: 'OK', Trigger: { MetricName: 'php7app-stg20-ERROR', Namespace: 'LogMetrics', StatisticType: 'Statistic', Statistic: 'SUM', ・・・省略 } }
  8. 8. AWSSDK(JS) 使うメソッド 1.describeMetricFilters() 2.filterLogEvents()
  9. 9. describeMetricFilters 指定されたメトリクスフィルタの一覧を取得する https://docs.aws.amazon.com/ja_jp/AmazonCloudWatchLogs/latest/APIReference/API_Delete MetricFilter.html CloudWatchから渡される情報だけだと足りないので、詳細を取得する。 metricNameとmetricNamespaceの2つをパラメーターで渡す。
  10. 10. describeMetricFiltersのレスポンス { metricFilters: [{ filterName: 'stg20-ERROR', filterPattern: 'stacktrace', metricTransformations: [Array], creationTime: 1553058610295, logGroupName: 'kimisuka-stg-20/php7app/srv/current/storage/logs/laravel.log' }] }
  11. 11. filterLogEvents 指定されたロググループからのログイベント一覧を取得する https://docs.aws.amazon.com/ja_jp/AmazonCloudWatchLogs/latest/APIReference/API_FilterL ogEvents.html describeMetricFiltersで取得したデータを元に取得する。 logGroupName,filterPettern... limit:取得件数 startTime/endTime:時間範囲をUnixタイムスタンプ(ミリ秒)で指定
  12. 12. filterLogEventsのレスポンス { events: [ { logStreamName: 'php7app1', timestamp: 1553249141154, message: '[2019-03-22 19:05:40] staging.ERROR: Undefined variable: input { ingestionTime: 1553249146221, eventId: '34638613326711879619236554788766527172305841119978192896' }, { logStreamName: 'php7app1', timestamp: 1553249141154, message: '[stacktrace]', ingestionTime: 1553249146221, eventId: '34638613326711879619236554788766527172305841119978192897' }, ...省略 ] }
  13. 13. request.logの取得 laravel.logと同じディレクトリに存在しているので、logGroupNameの"laravel.log"箇所を書き 換えて取得。
  14. 14. おわりに AWSLambda関数を作成するとき、ブラウザ上で直接コードを書くことはおすすめしません… (ブラウザで開きっぱなしとかにしてると、セッションが切れて強制的にログインし直す必要が 出てきた時、保存されてない変更内容は…(お察し))
  15. 15. 参考 CloudWatchでエラーログの内容を通知させたい|Qiita https://qiita.com/onooooo/items/f59c69e30dc5b477f9fd
  16. 16. ご静聴ありがとうございました。

×