WEB サーバへのアクセス数をもとに将来のアクセス数を予測するグラフを Sumo Logic で作成してみた

Sumo Logic の LogSearch 機能の predict 演算子についてご紹介します。
2023.07.26

最初に

将来の値を知ることは、次のプロビジョニングやスケーリングの予測に役立ちます。

Sumo Logic では、実測値に基づいた予測を行うための predict という演算子が用意されています。こちらの使い方と、可視化した時の見え方についてご紹介させていただきます。

将来の値を予測してみる

_sourceCategory=Labs/Apache/Accessを対象に検索します。 すると下記のようなログが出力されました。

※ 要所でマスキングしておりますが、今回は隠れている部分のデータを使いません。

それではこのログを加工して、データを分析します。

predict 演算子でアクセス数をもとに将来の値を予測

predict 演算子は、任意の期間で集計されたログデータの数をもとに将来のログデータ量の推移を予測する演算子です。

予測モデルは2つあります。1つは Linear regression といい、特定の期間内のデータを使用して線形回帰モデル(後述します)に基づいてグラフとして落とし込むものです。2つ目は Auto-regressive といい、過去の特定の期間内で出力されるログのパターンを学習させてデータ化します。その学習データをもとに予測をするというものです。

次に必須の要件として、集計演算子(count, min, max, sum)timeslice 演算子を使用する必要があります。

ここまでを具体的にイメージしていただくために実際に書いてみます。

① 予測モデル:Linear regression の場合

_sourceCategory=Labs/Apache/Access "HTTP/1.1"
| timeslice 5m
| count by _timeslice
| predict _count by 5m

1行目は、"HTTP/1.1"の部分で、HTTP/1.1 という文字列を含むキーワード検索をしています。これにより、HTTP/1.1 という文字列が含まれないログは除外されます。先ほどのログ出力結果で、HTTP/1.1 の後ろ 200 というのが HTTP ステータスコードになるので、ステータスが含まれるログを対象とするためにキーワード検索をしました。

2行目は、timeslice という演算子を使用して、1行目の検索結果を 5分ごとに区切っています。

3行目は、2行目で 5分ごとに区切られた_timesliceというフィールドの数をそれぞれ数えています。アンダースコアの付いた_timesliceというのは、2行目の様に timeslice を使用した時に暗黙的に生成されるフィールドになります。フィールドの中身は、timeslice データになります。

4行目で、予測演算子 predict を使用しています。3行目でカウントした_timesliceの数を 5分間隔で線形回帰分析にかけています。

下図が出力結果になります。_count は、5分ごとに区切られた_timesliceごとのデータの数を表示しています。_count_predictedは、線形回帰モデルによって予測された値になります。_count_errorは、_count_predictedの値を_countの値で減算した値になります。グラフ化するときにこれら 3つの値を表現します。

線形回帰というのは、予測するために算出されたデータの値とのギャップが最小限になるように推定をすることをいいます。

このグラフを作成したのが、2023/07/26 11:30 なので、11:30 以降に表示されている棒グラフは、_count_predictedの予測値になります。

② 予測モデル:Auto-regressive の場合

_sourceCategory=Labs/Apache/Access "HTTP/1.1"
| timeslice 5m
| count by _timeslice
| predict _count by 5m model=ar, ar.window=150, forecast=5

1~3行目までは、Linear regression と同意です。

4行目で、model=ar, ar.window=150, forecast=5が追加されています。

model=arは、Auto-regressive の使用を宣言するパラメータです。

ar.window=150は、任意のオプションです。予測するために使用する時系列データの数を選択します。このデータをもとに予測を立てます。設定しない場合は、自動的に予測に必要な数を暗黙的に割り当てられます。

forecast=5は、任意のオプションです。実際に予測するデータの範囲を指定します。forecast=5であれば、将来の 5つのデータポイントを予測。forecast=5mであれば、5分先のデータを予測します。設定しない場合は、forecast=3となります。

下図が出力結果になります。_countは、5分ごとに区切られた_timesliceごとのデータの数を表示しています。_count_predictedは、自己回帰アルゴリズム(後述します)によって予測された値になります。_count_linearは、線形回帰モデルによって予測された値になります。_count_errorは、_count_linearの値を_countの値で減算した値になります。グラフ化するときにこれら 4つの値を表現します。2023-07-26 12:15:00.000 PM +0900以降、値が抜けているのは、未来時間なためです。なので、_count_predicted_count_linearしか表示されていません。

自己回帰というのは、過去の値が現在の値に影響を与えて発生する将来の値を仮定することを言います。グラフ化すると下記の様になります。

右側、12:00 PM 以降の濃い青色の部分が_count_predictedとして予測値を可視化したものになります。このグラフでは、将来の時間ごとの変動する値を知ることが出来ます。

まとめ

いかがでしたでしょうか。今回は一例なので実際には Apache サーバ以外で使用することもあると思います。例えば、今回の例を使って URL のキャッシュ率を計算して将来の値を予測したり、Disk 使用回数をもとに交換時期の予測、DB Read/Write キャパシティ予測などです。特に繁忙期には注目するデータとして可視化することが出来るかもしれません。

セキュリティの面で言えば、ログインや重要サーバへのアクセスの傾向などをグラフとして実測値と予測値データを並べて、増加傾向をベースに早期にセキュリティ対策を強化するということも狙えるかと思います。

本記事がどなたかの一助になれば幸いです。