[補足] Apdex スコアの意味とは？閾値やアラートの設定の参考まで。

New Relic Advent Calendar 2017 ４日目。2日、３日に引き続き、今日も Apdex の話。

- ２日目: [Apdex って何？スコアの意味は？閾値やアラートに何を設定するべき？全部答えます。](https://qiita.com/kumatronik/items/71815c823255cf84dd79)
- 3日目: [複数アプリのパフォーマンス品質(SLA)の管理、監視、改善に便利な Apdex の使い方](https://qiita.com/kumatronik/private/c1a692f6345783f894b0)

そこそこ実践的な話をしたけど、今日は理屈だけ。前回、前々回の話の補足です。前回とかも Apdex スコア(要は、0.95 とは何を意味するのか？)の意味を書いたけど、そこまで詳しく書いていないので、今日はそこを掘り下げていく。

---

まず、大きく分けて、アプリを通常運用した場合に表示されるスコアと通常と異なるパフォーマンスになった場合(例えば、特定の処理にバグがあった、DB処理が異常に遅くなって、パフォーマンスが落ちたとか)では、スコアの意味が変わってくる。というか、後者の方が、意味する範囲が広くなる。

「[翻訳: Apdex T の決め方 : 決定版](https://newrelic.degica.com/blog/2017-07-06-how-to-choose-apdex-t)」にも書いてあるように一般的なウェブのトラフィックは以下のようなアーラン分布に従う。よって、通常、Apdex スコアはこの分布に当てはめて考えることができる。（もちろん、異なる分布になることはあるが、平均をとるとそうなるという意味）。しかし、異常の場合はそうなる場合もあるし、そうならない場合もある。

これが、何を意味するかというと、通常のトラフィックに関するスコアは、Apdex T (閾値)を設定する場合の参考になり、異常の場合のスコアの意味は、アラート条件の閾値の参考になる。つまり、Apdex T を決める際に、スコアの意味を考慮して、期待するスコア(状態）にあるような閾値を設定できる。

ちなみに、最初に Apdex アライアンスという Apdex を定義したところが出している Apdex スコアの評価を載せておく(細かいスコアの意味は書いてない。)

<img src="http://apdex.org/images/apdex_faq_tower.gif">

(引用: http://apdex.org/apdexfaq.html)

## 通常のトラフィックにおける Apdex スコアの意味

上でも述べたが、通常のトラフィックは統計的にアーラン分布に従うので、それを前提で進めていく。

前回でも言及したように、New Relic APM で日々運用しているアプリの理想とするスコアは 0.95。

ここで簡単に、Apdex スコアの求め方についておさらいしておく。

`Apdex スコア = 満足のリクエスト数 + (許容範囲内のリクエスト数/2) / 全リクエスト`

上記の式の変数の意味は、以下。閾値である Apdex T を基準に考える。

- 満足リクエストの秒数 < Apdex T 
- Apdex T < 許容範囲内のリクエストの秒数 < Apdex T x 4
- Apdex T x 4 < 我慢できないリクエストの秒数

上記の式から求めたスコアが 0.95 になるには、Apdex T に一定時間に発生したリクエストの 90 パーセンタイルの秒数を設定するとなる(統計的に)。詳しくは、[翻訳: Apdex T の決め方 : 決定版](https://newrelic.degica.com/blog/2017-07-06-how-to-choose-apdex-t)を参照。

つまり、0.95 というスコアは、リクエストが100個あった場合、満足のリクエストは90個あることを示している。ということは、

`0.95 = 90 + (そこそこ/2) / 100`

許容範囲のリクエスト = ((0.95 * 100) - 90) * 2  = (95 -90) *2 = (5)*2 = 10

つまり、0.95 というスコアは、満足のリクエスト: 9割。許容範囲内のリクエスト:1割という状態である。New Relic が実際のデータからまとめた結果は以下のようになるらしい。式から導くと、不満は0だが、下の図では少数は存在することはある。無視できる程度。

<img width="334" alt="スクリーンショット 2017-12-04 23.27.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/f574a598-e088-6b68-b774-277f8624433b.png">

ということで、なかなかこの状態を一言で言い表すのが難しいが、ほぼみんな満足しており、パフォーマンス上非常に優れたアプリである。という言えるのではないだろうか。

こんな感じで、アーラン分布に従っていると仮定すると、スコアの意味は以下のようになる。

| Apdex スコア | Apdex アライアンスの評価 | 概要 |
| ----- | ----- | ----- | ----- | ------|
| 0.98 | Excellent | 9割満足 / 1割が許容範囲 |
| 0.96 | Excellent | 9割満足 / 1割が許容範囲 |
| 0.95 | Excellent | 9割満足 / 1割が許容範囲 |
| 0.94 | Excellent | 8.8割満足 / 1.2割が許容範囲 |
| 0.92 | Good | 8.4割満足 / 1.6割が許容範囲 |
| 0.90 | Good | 8割満足 / 2割が許容範囲 |
| 0.88 | Good | 7.6割満足 / 2.4割が許容範囲 |
| 0.85 | Good | 7割満足 / 3割が許容範囲 |
| 0.80 | Fair | 6割満足 / 4割が許容範囲 |
| 0.70 | Fair | 4割満足 / 6割が許容範囲 |
| 0.60 | Poor | 2割満足 / 8割が許容範囲 |
| 0.50 | Poor | 全て許容範囲 |

確かに、Good より下だとかなり、微妙な状態と言えそう。最低でも、0.85 以上は確保しておきたい感じではないだろうか。

## パフォーマンス低下時における Apdex スコアの意味

次に、パフォーマンス低下時のスコアの意味を掘り下げたいと思う。これは、通常の場合と何が違うのかっていうと、通常の場合は、何度も言っているけどアーラン分布に従うとしているので、このパターン以外の分布にはならないとしている(現実には、他のパターンにもなりうるけど、数が多ければ収束していくので、そう考える）。しかし、パフォーマンス低下ってことは、いつもと違う何かが起きているってことなので、必ずしもアーラン分布に従うとは仮定できない。よって、この場合のスコアの意味は、もっと説明しづらいものになる。一部は、上記で説明したスコアの意味だけど、それ以外の意味を表していることもある。

異常時なので高いスコアより、低いスコアに焦点を当ててまとめてみた。

| Apdex スコア | Apdex アライアンスの評価 | 概要 |
| ----- | ----- | ----- | ----- | ------|
| 0.90 | Good | 8割から9割が満足 / 最大2割が許容範囲 / 最大 1割が不満 |
| 0.85 | Good | 7割から8.5割が満足 / 最大3割が許容範囲 / 最大 1.5 割が不満 |
| 0.80 | Fair | 6割から8割が満足 / 最大4割が許容範囲 / 最大 2割が不満 |
| 0.70 | Fair | 4割満足で6割許容範囲か、7割満足で3割不満か、その間 |
| 0.60 | Fair | 2割満足で8割許容範囲か、6割満足で4割不満か、その間 |
| 0.50 | Poor | 満足なしで全員許容範囲か、5割満足で5割不満か、その間 |
| 0.40 | Poor | 満足なしで8割許容範囲で2割不満か、4割満足で6割不満か、その間 |

前々回でも書いたが、0.85 は、New Relic のアラートで Warning (警告）の閾値として、0.7 は Critical(重大な問題）の閾値としてアラート条件に設定を推奨している値である。

上記のように解釈がわかりづらいけど、実際にどのようなヒストグラム(パターン)になるかは、そのスコアになった場合に、[APM のメインチャートでヒストグラム表示に切り替えれば](https://newrelic.degica.com/blog/2016-10-13-histograms-percentiles-new-relic-style)知ることができる。それを見れば、全体的に遅くなっているのか、特定のトランザクションが以上に遅く(外れ値）、それによってスコアが低下しているのか判断できる。

## まとめ

前回、前々回の補足として、Apdex スコアの意味をまとめてみた。多少、設定する際や品質評価する際の参考にはなるかと思う。是非、Apdex を活用して、品質向上を成し遂げてください。