Google Apps Script から Queue-it と mPulse の API を 呼び出し、仮想待合室とユーザー体験の状況をリアルタイムに把握する

# 仮想待合室とユーザー体験の状況をリアルタイムに把握する理由


仮想待合室は Web サイトのピークトラフィック時に有効です。オリジンサーバーに過度なリクエストを通さないために、ユーザーを仮想的な待合室に誘導します。アカマイのパートナーである [Queue-it](https://queue-it.com/jp/) 社は代表的な仮想待合室を提供するサービス・プロバイダーであり、``Queue-it`` というソリューションを提供しています。

Queue-it を導入する多くのサービス提供者が最も大切にしていることはサービスを停止させないことです。さらに、もうひとつ重要なことがあります。それはお客様がストレスなくショッピングをしたりブラウジングできているかです。ユーザー体験とも表現されます。オリジンサーバーが落ちなくても、ユーザー体験が悪ければ本当の意味での顧客満足度を高めることに成功していません。ユーザー体験を計測するには Google 社が開発した [Core Web Vitals](https://web.dev/i18n/ja/vitals/) が一般的となっていますが、仮想待合室を導入したときに分かりやすい指標が [Time to First Byte (TTFB)](https://web.dev/ttfb/) です。TTFB は Core Web Vitals のようにインテリジェントに計算される指標ではありませんが、負荷の上がったサーバーを監視するには有効な指標です。

Queue-it を導入するとき、重要なしきい値として Max Outflow があります。Max Outflow は、オリジンサーバーに分間毎に何セッションを通すかを決定するパラメータです。オリジンの負荷試験の実績をみたり、過去の経験値から算出することが一般的です。導入後も容易にパラメータを変更することができるので、本番イベント中でもチューニングすることができます。

:::note 
セッションはデバイスやブラウザが異なると、それぞれカウントされます。
:::

以下のグラフは興味深い例です。Max Outflow  (一分間にサイトに新規に入れるセッション数）を 3,000 に固定しています（青色）。実際に訪れているユーザー数（正確にはセッション数）は分間 3,000 を超えていません（緑線）。しかし、ある時間から TTFB （赤色）が劣化し、訪れている顧客全体がストレスを抱えながらサイトを利用していることが分かります。

![GS_graph1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/9b9d947b-0f41-8508-9cd3-9664da766209.jpeg)

リアルタイムにデータが見えれば、Max Outflow を 2,000 などに落とし、訪れるユーザーの多くを待合室に誘導することでオリジンサーバーの負荷を下げ、待合室から抜け出したユーザーがストレスなくサイトを楽しむようにすることができます。一切待たせたくないというサイトのオーナー様も多数いますが、ユーザーはページが遅延することでエラー画面を見たりするほうを嫌うものです。Queue-it は待ち時間も表示することもできますので、どれだけ待てば良いのかを教えてくれます。人は予測不能なことを避けたいので、待ち時間が分かればその時間を待つ心理的ストレスは軽減されます。

次のグラフは別の例です。17:00 に仮想待合室が全ての新規訪問者に表示されているケースです（グラフを見やすくするために Max Outflow は表示していません）。同時に TTFB が遅くなり、ユーザー体験が悪くなっています。この例でも Max Outflow をもう少し絞ったほうがよいことを教えてくれます。

![GS-Graph2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/8f12f37c-d659-bc12-625f-5de2c020c07d.jpeg)

２つのグラフの例とも仮想待合室の導入によってオリジンサーバーを停止させないという主目的を達成させているものの、エンドユーザー目線で考えるともっと改善する余地があることを教えてくれます。

アカマイが提供するユーザー体験を可視化するリアルタイムモニタリング (RUM) ツールの mPulse を使えば、Core Web Vitals や TTFB だけでなく、複雑な分析も容易にリアルタイムに表示することができます。アカマイ CDN を利用している顧客は mPulse を簡単に導入できます。

:::note
仮想待合室の設定は Queue-it のポータルで設定します。待合室に誘導されるセッションは Queue-it 社の SaaS 側で待機します。サイトに戻る権利を獲たユーザーはアカマイで保護されたサイトに誘導されます。Queue-it ではサイトに入ったユーザーの体感を見ることはできませんので、mPulse のようなソリューションが必要となります。
:::

アカマイが提供している Visitor Prioritization Cloudlet と mPulse を利用して待合室とユーザー体験を同一のダッシュボードで表示して運用するケースが Akamai Blog で紹介されています。すでに多くのお客様が利用されています。

https://www.akamai.com/blog/security/visualize-visitor-prioritization-in-real-time-with-mpulse

Queue-it を使う場合は、仮想待合室のステータスが Queue-it のポータル(GO Queue-it 管理プラットフォーム)上に表示されるため、紹介したように mPulse の UI で表現することができません。

Queue-it 社は導入を容易にするために、アカマイとのインテグレーションに力を入れています。Queue-it 社が開発した Akamai EdgeWorkers のコネクターを使えば、アカマイ CDN と Qeueu-it を容易に統合することができます。下記の記事に設定方法の例が紹介されています。

https://qiita.com/isss802/items/fc45ed5c06b6d735f4c0

前振りが長くなってしまいましたが、本記事は最初に示したグラフを Google Sheets (スプレッドシート) で簡単に作成する方法を紹介します。Queue-it と mPulse を利用することが前提となっています。
![Akamai_Queue-it.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/62782ef9-fcd8-7273-87af-873000fe1e63.jpeg)
Google Sheets は下図のように単なる表形式のデータです。このデータから Google Sheets のグラフ機能を使って生成します。
![google-sheet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/c6eec561-529d-8496-4871-50b6922be23d.jpeg)

Google Sheets (スプレッドシート） の中では Google Apps Script のコードを利用し、Queue-it と mPulse のそれぞれの API を定期的に呼び出し、スプレッドシートのデータを更新、追記します。Apps Script の Trigger(トリガー) 機能を使えば、呼び出し頻度を自由に設定できます。

# Google Apps Script (GAS) のサンプルコード
Google Sheets は Google Apps Script と統合され、スクリプト言語で記述された命令に従ってスプレッドシートのセルを操作できます。Apps Script から Queue-it API と mPulse API を呼び出し、実行単位でスプレッドシートの行を新規追加するサンプルコードが GitHub で公開されています。

https://github.com/110hideki/GAS_Queue-it-mPulse/tree/main

``Code.js`` が Google Sheets に割り当てる Apps Script のコードです。

# Google Sheets のサンプル
Google のアカウントを取得し、Google Sheets (スプレッドシート）を起動し、新しいファイルを作成します。以下のサンプルコードを参照してください。

https://docs.google.com/spreadsheets/d/12UAdfrDYa8aFVTOHcSST3Ln6jM6slH_41HbKJdinFbc/edit?usp=sharing

::: note warn
作成したスプレッドシートのタブは ``Q_mPulse`` としてください。変更する場合は、Apps Script の下記のコードを変更してください。
```
var sheet = spreadsheet.getSheetByName('Q_mPulse');
```
:::

作成したスプレッドシートに Apps Script を登録する作業を次に説明します。

# Google Sheets に Apps Script を登録する
スプレッドシートの Extensions (拡張）から ``Apps Script`` を選択します。
![gas-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/b2549fbc-c0ca-346a-6589-77f6ddb52125.jpeg)

エディターが起動するので、``Code.js`` に先に紹介した GitHub の ``Code.js`` をコピー＆ペーストします。
![gas-code.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/391d6f4b-033f-eb32-515d-420d0d6d3b8c.jpeg)

## Script Properties の設定
API を使うためにはクリティカルな情報が含まれます。それらのクリティカルな情報は外部変数として Code.js の中に含めないようにしてあります。Apps Script では Script Properties を使って環境変数を設定できます。以下、必要となる環境変数の設定例です。

Project Settings　を開きます。
![gas-project-setting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/c8e0a380-f1ca-7900-4241-416495daa5ec.jpeg)

Script Properties に 4 つの Property を設定します。
![GAS-Script_Propeties.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/8e0abdcf-227f-8823-8744-4d954a226e72.jpeg)

4 つの Property は Code.js から呼び出されます。それぞれ、次の用途で使われます。
| Script Property | 説明 |
|:-:|:-:|
| mpulse_APIKEY  | mPulse を利用するための API キー  |
| mpulse_Authentication  | mPulse API を利用するためのトークン  |
| queueit_ACCOUNT_DOMAIN | Queue-it 社から提供されるドメイン名。例：company_name.api2.queue-it.net  |
| queueit_APIKEY  | Queue-it の API を利用するためのキー  |

### mpulse_APIKEY
mPulse を利用するための API キーです。mPulse のポータルにログインし、監視対象の Web App の設定画面にある API Key を使います。
![mpulse-apikey-jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/5245a04c-8048-ad19-91fa-a02cddc488f6.jpeg)

### mpulse_Authentication
mPulse API を利用するためのトークンです。
```
curl --location --request PUT 'https://mpulse.soasta.com/concerto/services/rest/RepositoryService/v1/Tokens' \
--header 'Content-Type: application/json' \
--data-raw '{"apiToken":"<YOUR TOKEN>"}'
```


API の仕様は以下にあります。

https://techdocs.akamai.com/mpulse/reference/put-token

:::note warn
２つ以上テナントを持つ環境をお持ちの方は、次のように Tenant 名を指定します。通常は２つ以上持たないので省略できます。
:::

```
curl --location --request PUT 'https://mpulse.soasta.com/concerto/services/rest/RepositoryService/v1/Tokens' \
--header 'Content-Type: application/json' \
--data-raw '{"apiToken":"<YOUR TOKEN>", "tenant": "<YOUR mPulse TENANT NAME>"}'
```

``<YOUR TOKEN>`` は mPulse のユーザーアカウントで発行される API Token を使います。mPulse のポータル画面から My Settings を選択します。
![mpulse-mysettings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/3c49aca1-8ddf-a8ed-da03-fcab699a5770.jpeg)
アカウント画面で API Token を発行します。その文字列を使います。
![mpulse-mysettings-account.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/df78f971-49f5-8d80-8771-1d00a22dfe40.jpeg)



### queueit_ACCOUNT_DOMAIN
Queue-it 社から提供されるドメイン名を指定します。次のような API 名となります。 Queue-it Go 管理プラットフォームにログインし、Custoemer Id の文字列をこの変数に設定します。
```
{YOUR-CUSTOMER-ID}.api2.queue-it.net
```
![queue-it-customerID.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/fe4226cc-547a-4eff-941e-aeb8fc04f6d8.jpeg)


### queueit_APIKEY
Queue-it の API を利用するためのキーです。以下のメニューから入手します。
![queueit-api-key.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/4757f9b9-50a3-a5c1-fc1e-4b71c5cd7d40.jpeg)


#### Queue-it Developer Page
Apps Script コードでは複数の Queue-it API をコールしています。データを追加する場合は以下の Developer サイトを参照し、Code.js を変更してください。

https://queue-it.com/developers/rest-api/#getting-started


# Apps Script の実行
Google Sheets に Apps Script を割り当て、Script Properties を設定完了すれば、後は実行するだけです。Apps Script の画面で 実行 (Run) をクリックします。

![GAS-Run.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/9fdeb190-7013-6e25-8b1c-5c573494129b.jpeg)

成功すれば、``Q_mPulse`` タブのシートの 3行目に最新のデータが追記されます。

![GAS-add-newline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/fdd34bac-660d-4a05-4e74-62ae977ced6e.jpeg)

1、２行目がヘッダーとなりますが、ヘッダーの位置を変えるときは、``Code.js`` の下記のコード周辺を変更してくだださい。
```
  // 入力列の設定(行を挿入して設定)
  sheet.insertRowBefore(3);
  var dateCell = sheet.getRange(3, 1);
```

## トリガー (Trigger)
トリガーを使えば、コードを定期的に起動して、シートの内容を最新に更新してくれます。Apps Script の Trigger メニューから設定します。
![GAS_Trigger.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/731b05b7-d2cc-f5d5-fbce-8e9e6f673976.jpeg)

初めて使う場合は何もトリガーが設定されていません。``create a new trigger.`` を選択します。
![GAS-Create-new-trigger.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/241634b7-6274-db42-851d-a4dae22decc3.jpeg)

設定画面では、必要な項目を選択します。function ではコードの中のどの関数を呼び出すかを指定します。``myFunction`` を設定してください。あとは起動するタイミングを設定するだけです。以下は、１分毎に起動する例です。
![GAS-add-trigger.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/d21ac293-458c-d1e5-96e6-6db4eddf9d53.jpeg)
最後に保存します。Save ボタンをおしてください。
![GAS-add-tigger-save.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/6efd0c67-bd27-864c-3caa-a4ea2a819bf9.jpeg)


# Google Cloud Platform の認証
Apps Script を登録するときに、認証が行われます。認証が行われていない場合は、本作業を行う必要があります。Apps Script は Google Cloud Platform (GCP) 上で動作するので、GCP に対して認証認可を行う必要があります。

:::note
Apps Sciript で API を実行するだけであれば、GCP 上にユーザーアカウントを作成する必要はありません。
:::

起動するアカウントを選択します。
![Google-Cloud_project-auth1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/e6ce72bc-1139-7a7c-98e2-bd7753c3d60f.jpeg)

Google アカウントでログインします。
![Google-Cloud_project-auth2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/e5bbd806-f41b-8f12-39b8-6cba6ae2a23d.jpeg)

GCP に対して、Apps Script のコードが信頼できることを確認し、許可します。
![Google-Cloud_project-auth3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/f832b050-0980-76d4-272e-63fd312424f7.jpeg)


# API 参考情報


## Queue-it API

https://api2.queue-it.net/swagger/index.html

## mPulse API

https://techdocs.akamai.com/mpulse/reference/api

# Grafana を使った可視化
Google Sheets のグラフ化は簡単ですが、Grafana のようなツールを使えば、グラフと現在のリアルタイムの情報をテキストで表示するなど、より感覚的に分かる画面を作成できます。データに対して色で意味をもたせるなど様々表現ができます。警告を赤で表示したり、アラートを飛ばすこともできます。
![grafana-qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/d6ab8459-15f6-e8e5-0572-9b738d27e811.jpeg)
上記は、Grafana のデータソースを Google Sheets とした例です。今回紹介したデータをソースとして、リアルタイムに可視化することもできます。Grafana には Google Sheets のプラグインが提供されています。
![grafana-plugin-googlesheets.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/625f5ea1-a5eb-8747-2a10-f80ee7557ee2.jpeg)
認証情報の設定ができれば、読み込み範囲を指定するだけです。
![grafana-explore-explain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/3e261bbf-a7ca-ee7b-73e8-2eeb5af8fdda.jpeg)

Akamai Connected Cloud の[クラウドサービス](https://www.linode.com/)を使えば、マーケットプレイスから簡単に Grafana をインストールできます。Grafana 化を簡単に安価にやってみたいという方にはおすすめです。
![linode-marketplace-grafana.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/8b385037-22e0-0f28-d121-074a17ef212d.jpeg)
インストールは数十分で完了します。設定後のアクセスについては下記のページが参考になります。

https://www.linode.com/ja/marketplace/apps/linode/grafana/

Google スプレッドシートの一週間分のデータを取り込むくらいであれば、Linode の一番安いプランで十分です。インスタンスを可視化する Longview の表示は以下となります。一番安価なプランでも CPU も RAM も十分です。
![linode-grafana-longview-mask.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/f66c2c41-587d-5beb-d2bd-1a693056ad4d.jpeg)


# まとめ
仮想待合室は特にコロナウイルス感染者が増加してから、世界中でワクチン接種の予約サイトや給付金関連サイトで導入が加速しました。当時、多くの政府関連のサイトでは、アクセス集中による過大なトラフィックを想定しておらず、オリジンの処理能力を超えたアクセスによって、サーバーにアクセスできなくなったというニュースも目にしました。しかしその一方で、仮想待合室の導入でアクセスを容易に捌き切ったサイトもありました。

eコマースやチケット販売などのサービスでもキャンペーンや新製品の発売時期に通常を遥かに超えるアクセスが発生します。サーバーの処理能力を上げても、瞬間的なピークトラフィックは発生しうるので、多くのケースで仮想待合室の導入はサーバー増設と比較してもコスト面での効果が得られます。仮想待合室の導入で平時においても余分なサーバーの処理能力も下げるなどして、適正な値にすることも可能です。そのときに、ユーザー体験となるデータが得られれば、確信をもって意思決定を行い易くなります。mPulse のようなリアルタイムモニタリングはユーザー体験を把握するにはとても有効な手段です。


![Akamai_Queue-it_external_1page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/35fff707-15e6-6271-ddc2-d202a8bbf3b0.jpeg)

今回は Queue-it と mPulse の API を Google Apps Script から呼び出し、Google スプレッドシートでグラフ化することを紹介しました。他にも応用できると思いますので、是非お試しください。