Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Elastic APM + ML(Machine Learning) でwebアプリの異常検知をしてみる

こんにちは。
今年もバレンタインチョコがもらえなかった
新人エンジニアの佐々木@です。

Elasticsearch 6.0で Elastic APM が追加され、前回(※)6.0の時点で alpha 版の概要やセットアップ方法を説明しました。
(※前回については当社、樋口の記事を参照ください)

APMはアプリケーションのパフォーマンス状況を収集して、分析するソフトウェアです。
収集対象は、nodejs,flask,Django,Ruby on rails(beta),Rack(beta),Javascript(alpha)が今はサポートされています。

2018/02/10 時点の最新である 6.2では、Elastic APMもGA になり、
画面が改善されパフォーマンスの分析がしやすくなっています。

そこで、今回も動かして試してみたいのですが、樋口と同じでは芸がないので、
Elastic ML(Machine Learning)と組み合わせて異常検知を試してみたいと思います。

後でも説明しますが、APMで取得するデータは Elasticsearch の index に入っているので、
APMの結果を Alerting や Elastic ML の対象にすることが可能です。

今回の対象Webアプリは去年悔しい思いをしたISUCONの参照実装を使用したいと思います。
(※ISUCONについてはこちらを参照してください)
構成イメージとしてはこのようになります。
f:id:acro-engineer:20180211234231p:plain

今回はあくまで異常検知ですので、Webアプリのリクエスト数を見て
「いつものパターンと異なる場合」に検知させたいと思います。
(使用する題材はISUCONでも、チューニング目的ではありませんので、あしからず)

そこで、今回はElastic APMとMLを組み合わせて、Webアプリの異常検知をしてみます。

ISUCONのwebアプリにElastic APMを適用する

ISUCONの参照実装にElastic APMを適用させます。
まず、この環境ですが、Vagrantが配布されているので簡単にセットアップすることができます。
github.com

ISUCON7予選1台構成を今回使用します。
APMのagentを適用するためには、ソースコード(webapp/nodejs/index.js)の先頭に次のコードを挿入します。

var apm = require('elastic-apm-node').start({
  appName: 'isubata',

  secretToken: '',
})

試しに、Webアプリを起動させてベンチマークを回してみます。
Kibanaからこのようにリクエストの頻度やレスポンスにかかった時間などが見ることができます。

f:id:acro-engineer:20180129081415p:plain
f:id:acro-engineer:20180129081405p:plain

また、それぞれのパスへのリクエストの詳細を、トランザクションとしてみることができます。

f:id:acro-engineer:20180130145925p:plain

KibanaからWebアプリのパフォーマンス情報を見ることができます。
冒頭で説明したように、APMで取得したデータは、 Elasticsearch の index に入っています。
デフォルトの設定の場合、apm-<バージョン番号>-<日付>という形の index で登録されています。

f:id:acro-engineer:20180210142414p:plain

そのため、APMの結果にAlertingやMachineLearningを実行することが可能です。
次の章では、実際にElastic MLを使って、APMのデータに対して異常検知を行います。

Elastic MLで異常検知

まず、Elastic MLの対象にするために、Kibanaのindex-patternにapm-*を追加する必要があります。
そして、Elastic MLの設定としては、Single Metricの
 aggregation: high count
 bucket span: 15m
としました。

その次に、Elastic MLで異常検知するために、まずは正常なパターンを学習させます。
今回は、一定周期でアクセス数が増減するようなクライアントを用意して、
一定時間Webアプリにリクエストを発行します。
すると、こんな感じに正常な値の範囲を学習してくれます。

f:id:acro-engineer:20180210115429p:plain

青い部分が正常な値の範囲です。本当は周期も学習させたかったんですが、学習データが足りなかったですね。
それでも、正常なリクエスト数の範囲を学習して収束するしていることがわかります。

それでは、大量にリクエストを発行して異常を起こしてみましょう。
するとElastic MLからは以下のように急増したアクセスを検知している様子が見えます。
f:id:acro-engineer:20180210115828p:plain

まとめ

Elastic APMとElastic MLを使って、Webアプリの異常検知にチャレンジしてみたところ、
無事大量のリクエストを検知することができました。

今回は、アクセス数から異常検知をしてみましたが、
レスポンスタイムなど、別の観点からでも異常検知できそうですね。
それではまた。

Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com