GetMetricData APIでAmazon Connectの履歴メトリクスを取得する！

## 1. はじめに
こんにちは！:grin:

先日、エージェントのパフォーマンスを分析する為にAmazon Connectの履歴メトリクスを半年分取得する事になり、その経験で色々と学んだ事があったので、ここに残したいと思います。

結論から言うと、目的によってはGetMetricData APIは使い物になりません！:sweat_smile:

と言う所で早速本題に入っていきたいと思います。

## 2. やりたい事の概要
以下3つの履歴メトリクスを取得する
| 履歴メトリクス種別 | 期間 | 間隔 | タイムゾーン |
| --- | --- | --- | --- |
| 電話番号 | 2022年1月～2022年7月 | 30分 | Japan |
| 電話番号 | 2022年1月～2022年7月 | 日別 | Japan |
| エージェント | 2022年1月～2022年7月 | 30分 | Japan |

## 3. 履歴メトリクスを取得する方法
1. Amazon Connectの画面から手動で取得する
2. GetMetricData APIを用いて取得する ← **今回ご紹介するやり方（まぁ、結論できないんですが。**
3. Amazon Connectの画面から履歴メトリクスをスケジュールでS3に吐き出させたデータを用いて取得する

:::note info
ちなみに、手動で30分間隔の履歴メトリクスを画面から取得する際は、1度に最大3日間までしか履歴メトリクスを取得できない（日別の場合は1月分）為、7ヶ月分のメトリクスを取得しようとすると、単純計算で、70回CSVのダウンロードを繰り返す必要があります。。なので、上記やりたい事を手動でやると6〜7時間かかります。。:joy:
:::

## 4. GetMetricData APIについて
では、早速今回の目的である、GetMetricData APIを用いて履歴メトリクスを取得する方法をご紹介します！

### 4-1. 特徴
| 履歴メトリクス種別 | APIで取得かどうか |
| --- | --- |
| キュー | :o: |
| 電話番号 | :heavy_multiplication_x: |
| エージェント | :heavy_multiplication_x: |

電話番号やエージェント毎にグルーピングして履歴メトリクスを取得したい場合は、GetMetricData APIは使い物になりません！
おそらくこの使い方が一番多いような気もするのですが、今後改善される事を願うばかりですね。

### 4-2. APIとGUIとで取得できるメトリクスの違い
![0017-640x544 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620968/9e869569-f547-47c4-d54e-700c1d3dac24.png)

### 4-3. 使い方
GASからAPIを叩く場合を扱っています。
※LambdaからAPIを叩く場合も基本的に書き方は同じですが、参考文献をご覧いただけますと幸いです。
ちょっと中途半端で可読性の悪いコードですが、参考程度に載せておきます〜

```index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
        適宜スタイルを書く
    </style>
  </head>
  <body>
    <div class="wrapper">
    <button id="btn">履歴メトリクスの取得</button>
    </div>
    <div id="status"></div>
    <div id="result"></div>
  </body>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1219.0.min.js"></script>
  <script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
  <script type="text/javascript">
  $(function()
  {
    $("#btn").on('click', function(){
      
      // getSpreadsheetData SuccessHandler
      function onSuccess(body){
        AWS.config.region = 'ap-northeast-1';
        AWS.config.update({
          accessKeyId: "アクセスキー",
          secretAccessKey: "シークレットキー",
        });
        // Create GetMetricData object
        const connect = new AWS.Connect();
        const historicalMetrics = [
          {Name: "ABANDON_TIME",Unit: "SECONDS",Statistic: "AVG"},  // 平均キュー中止時間
          {Name: "AFTER_CONTACT_WORK_TIME",Unit: "SECONDS",Statistic: "AVG"},  // 連絡作業後の時間
          {Name: "API_CONTACTS_HANDLED",Unit: "COUNT",Statistic: "SUM"},  // 対応したAPIのお問い合わせ
          {Name: "CALLBACK_CONTACTS_HANDLED",Unit: "COUNT",Statistic: "SUM"},  // 対応した問い合わせのコールバック
          {Name: "CONTACTS_ABANDONED",Unit: "COUNT",Statistic: "SUM"},  // 中止された問い合わせ
          {Name: "CONTACTS_AGENT_HUNG_UP_FIRST",Unit: "COUNT",Statistic: "SUM"},  // エージェントが先に切断した問い合わせ
          {Name: "CONTACTS_CONSULTED",Unit: "COUNT",Statistic: "SUM"},  // 相談した問い合わせ
          {Name: "CONTACTS_HANDLED",Unit: "COUNT",Statistic: "SUM"},  // 対応した問い合わせ
          {Name: "CONTACTS_HANDLED_INCOMING",Unit: "COUNT",Statistic: "SUM"},  // 対応した着信問い合わせ
          {Name: "CONTACTS_HANDLED_OUTBOUND",Unit: "COUNT",Statistic: "SUM"},  // 対応した発信問い合わせ
          {Name: "CONTACTS_HOLD_ABANDONS",Unit: "COUNT",Statistic: "SUM"},  // 保留中に顧客が切断した問い合わせ
          {Name: "CONTACTS_MISSED",Unit: "COUNT",Statistic: "SUM"},  // 問い合わせの不在着信
          {Name: "CONTACTS_QUEUED",Unit: "COUNT",Statistic: "SUM"},  // キューに保存された問い合わせ
          {Name: "CONTACTS_TRANSFERRED_IN",Unit: "COUNT",Statistic: "SUM"},  // 内部転送された問い合わせ
          {Name: "CONTACTS_TRANSFERRED_IN_FROM_QUEUE",Unit: "COUNT",Statistic: "SUM"},  // キューから転送された問い合わせ
          {Name: "CONTACTS_TRANSFERRED_OUT",Unit: "COUNT",Statistic: "SUM"},  // 外部転送された問い合わせ
          {Name: "CONTACTS_TRANSFERRED_OUT_FROM_QUEUE",Unit: "COUNT",Statistic: "SUM"},  // キューから転送された問い合わせ
          {Name: "HANDLE_TIME",Unit: "SECONDS",Statistic: "AVG"},  // 平均処理時間
          {Name: "HOLD_TIME",Unit: "SECONDS",Statistic: "AVG"},  // 顧客の平均保留時間
          {Name: "INTERACTION_AND_HOLD_TIME",Unit: "SECONDS",Statistic: "AVG"},  // エージェントの応答時間と顧客の保留時間
          {Name: "INTERACTION_TIME",Unit: "SECONDS",Statistic: "AVG"},  // エージェントの平均対応時間
          {Name: "OCCUPANCY",Unit: "PERCENT",Statistic: "AVG"},  // 利用率
          {Name: "QUEUE_ANSWER_TIME",Unit: "SECONDS",Statistic: "AVG"},  // 平均キュー応答時間
          {Name: "QUEUED_TIME",Unit: "SECONDS",Statistic: "MAX"},  // キューに入っている最大時間
          {Name: "SERVICE_LEVEL",Unit: "PERCENT",Statistic: "AVG", Threshold: { Comparison: "LT",ThresholdValue: 60}},  // サービスレベルX
        ];

        let starttime = new Date(2022,9-1,20,9,00,0);
        let endtime = new Date(2022,9-1,20,22,30,0);

        let params = {
          EndTime: endtime,
          Filters: { /* required */
            Queues: [
              "キューのIDを入れる",
              /* more items */
            ]
          },
          HistoricalMetrics: historicalMetrics, /* required */
          InstanceId: "インスタンスID", /* required */
          StartTime: starttime,
          Groupings: [
            "QUEUE" | "Channel"
          ],
        };

        connect.getMetricData(params, function(err, data){
          if(err){
            alert(JSON.stringify(err));
          }else{
            alert(JSON.stringify(data.MetricResults[0]));
          }
        });
      }

      // getSpreadsheetData FailureHandler
      function onFailure(e){
        console.log(e, 'getSpreadsheetData()');
      } 
      // End of onFailure()
      google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).getSpreadsheetData();
    });
  });
  </script>
</html>

```

```main.gs
const settings_name = "Settings"; 
const sheet_name = "GetMetricData";

// スプレッドシートデータの取得
const app = SpreadsheetApp;
const ss = app.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheet_name);
const setting_sheet = ss.getSheetByName(settings_name);

// 実行ボタン表示
function GetMetricData(e){
  const html = HtmlService.createHtmlOutputFromFile('btn').setWidth(240).setHeight(200);
  app.getActiveSpreadsheet().show(html);
}

function getSpreadsheetData(){
  // ここには色々な処理をかく。
  return true;
}
```


## 5. 最後に
GetMetricData APIを用いて履歴メトリクス：電話番号及び履歴メトリクス：エージェントを効率的に取得しようとしたのですが、そもそも取得できないと言う残念な結果になってしまいました。
履歴メトリクス：キューを取得する場合は、上記方法でGAS又はLambdaからAPIを叩けばできると思うので、やってみてください〜
私は、また別の方法で試してみようと思います！

出来次第、近日アップデートしようと思います〜

### 5-1. 参考文献
https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/historical-metrics.html

https://dev.classmethod.jp/articles/amazon-connect-getmetricdata/