APIを公開したら利用状況を分析しよう

## はじめに
[ "API Management: An Architect's Guide to Developing and Managing APIs for Your Organization" ](https://www.oreilly.com/library/view/api-management-an/9781484213056/)の作者Brajesh De氏によると、公開したAPIの利用状況を分析することがAPI公開の成功の鍵と言った主旨が以下のように述べられています。

>API analytics provide data and trends about APIs. API traffic flowing through an API management platform can provide lot of useful insights to businesses, which can help to effectively govern an enterprise API program. It is important for an enterprise to measure the success of its API program.

API公開するための基盤ソフトやサービスは様々なものがありますが、API利用状況をどれだけ簡単にかつ詳細に取得できるかという観点も、ソフトやサービスを選定する上で重要なポイントになるかと思います。
本記事ではAPI Connectの分析機能がどんなものか見てみます。
※ 機能紹介的でQiitaの本来の趣旨から少しずれているのは自覚してます。

## IBM API Connectでは
API Connectの場合、デフォルトで様々なメトリクスを取得することができます。これはAPI Managerと呼ばれるAPIを作成・公開・運用するコンポーネントからも見れますし、開発者ポータルと呼ばれるAPI利用者向けのコンポーネントからも、自分の利用登録したアプリが使うAPIがどれだけ呼ばれているかを見ることができます。

## API Managerから見た場合
利用状況はカタログ単位で確認できます。
カタログとはざっくり言うとAPIのデプロイ（公開）先の論理的単位です。本番環境カタログ・開発テスト環境とか、参照系カタログ・更新系カタログなど、要件に応じた種別でカタログを作ることができます。

カタログに公開されたAPIが、どのクライアント・アプリからどれくらい呼び出され、応答時間やエラー率がどれくらいかをAPI単位で見ることができます。
また週や月単位などで呼び出し回数トップ5のAPI製品や、今週サブスクライブされたAPI製品なども見ることができるので、どのAPIが人気であるとか、どのAPIがパフォーマンスに問題が出ているか、などを簡単に把握することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/0803c899-855d-ec3f-6cc6-e127126fc4d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/cb5e2828-5f43-6989-fb14-528f64b84370.png)


またこの分析画面の元となる情報はCSVとしてエクスポートでき、生の情報をさらに細かく見ることができます。リクエスト時刻や呼び出されたAPIのパス、ヘッダー、ボディ、メソッド、レート制限値、応答時間、クライアントID、アプリ名、ステータスコードなど項目は多岐に渡ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/d30a4829-04a7-14b6-93dd-071c2779415c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/b756f02e-4c32-0cfe-3296-fc3df19e1255.png)

以下のサンプルにようにCSVデータには、latency_infoとlatency_info2という項目が含まれます。ここにはAPI Gateway内で処理したルール（アセンブルと呼ばれます）でどれくらい処理時間（Latency）を要したかを見ることができます。

例えばここでは、GatewayScript（JavaScriptベースのDataPower Gatewayの処理をカスタマイズするためのスクリプト）の処理に6msかかったことがわかります。これはlantency_infoにあるstartedの時間(76ms)と、latency_info2にあるended(82ms)の時間の差分です。同様に1つ目のXSLTでは35ms、2つ目のXSLTでは28msと少々時間がかかっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/8299e235-4411-1dcc-12e6-8ddc7bda9947.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/b475c1fa-5a79-9829-0829-fce299366ba9.png)
こういったXSLTやGatewayScriptなどを中心としたユーザー定義のルールは、作り込むほどパフォーマンスに影響を与えるため、応答時間が芳しくない場合は、こう言ったルールでどれくらい処理時間が発生しているか確認することも、パフォーマンス改善に向けて役立つかと思います。

## 開発者ポータルから見た場合
開発者とはここではAPI利用者を指します。API利用者は開発者ポータル上でクライアント・アプリケーションの登録を行うことでクライアントIDを払い出します。このクライアントIDを使ってAPIを呼び出す、つまり自分のクライアント・アプリがどれくらい使われているかを把握することができます。

開発者ポータルはあくまで利用者のためのものなので、API Managerのようなカタログ単位で全てのAPIの利用状況や詳細が見えるわけではなく、あくまで自分が使っているAPIがどれくらい呼ばれたかを把握するためにあります。そのため取得できるメトリクスはAPI Managerで取得できるもの比べると少ないですが、それでも呼び出し回数とそこにおける成功・エラー率、データ量、処理時間が取得できるので、利用者として必要な情報は概ね揃っていると言えそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/38fb51af-e692-9c44-9523-f84c9d81474f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/df9136e0-bfd5-4f6e-4271-cd13d869c4c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/c4862d77-e1bd-4fdc-5c50-2a15c8a699fb.png)

## まとめ
このようにしてIBM API Connectの場合、監視などの追加サービスやソフトを連携などをすることなく、ビルトインで多種多様なメトリクスを取得しています。ここではデフォルトで見られるメトリクスを紹介していますが、要件に応じて作り込むことも可能です（API Managerのダッシュボードの場合）。
基盤運用者およびAPI提供者の観点からも、API利用者の観点からも、簡単に様々なメトリクスを取得して利用状況分析に繋げられることがわかります。
ここではIBM Cloud版のAPI Managerおよび開発者ポータルのコンソール上のみでメトリクスを視覚的に確認しましたが、外部のログサーバーに連携したり（オンプレ版のみ）、ダウンロードしたCSVを別ツールに取り込むといったことも可能です。

## 参考資料
* https://learning.oreilly.com/library/view/api-management-an/9781484213056/A340883_1_En_10_Chapter.html
* https://www.ibm.com/support/knowledgecenter/en/SSFS6T/com.ibm.apic.apionprem.doc/capim_analytics_apianalytics.html
* https://www.ibm.com/support/knowledgecenter/en/SSFS6T/com.ibm.apic.apionprem.doc/tapim_analytics_viewexportanalyticsdata.html
* https://ibm-apiconnect.github.io/pot/lab8_overview.html