InstanaバックエンドのREST API叩いてみた

# はじめに

[Instana Observability Advent Calendar 2023](https://qiita.com/advent-calendar/2023/instana) の7日目ですね！

Instanaには素敵なGUIが備わっていますが、時にはデータを取ってきて手元でゴニョゴニョしたい…なんてことありますよね。
なので、今日はREST APIを叩いてInstanaバックエンドからデータを取得してみようと思います！

:::note info
下記ドキュメント(執筆時点で最新のv263)を参照しています。
必要に応じて最新のバージョンを参照してお試しください。
- [IBM Document](https://www.ibm.com/docs/ja/instana-observability/current?topic=apis-web-rest-api)
- [Instana API docs](https://instana.github.io/openapi/)
:::

ちなみに、[Instana リンク集](https://qiita.com/LgmQue/items/68773c9a14406f610509)なるページを定期的に更新しております。
今回のアドベントカレンダー後により充実したまとめページへ更新するのでぜひご覧ください！

# APIを叩くための準備

まずはInstanaのコンソール画面でAPIトークンを作成しましょう。

ホーム画面から[設定] > [チーム設定] > [APIトークン] > [新規APIトークン]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/142dec7c-3374-a5ed-db25-985b909e3022.png)

新規APIトークンの作成画面が表示されたら、任意のトークン名を指定し、必要な権限を有効化します。
設定が完了したら画面下までスクロールし、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/5822d448-d3c5-a849-ab1c-4ed92e9b1efd.png)

無事に作成できたら、作成したAPIトークンの名前で検索してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/04ae843a-b4e7-0e8b-0dd9-9f172541b67e.png)

:::note info
権限の変更が必要な場合は、トークン名をクリックすることで編集画面を開くことができます。
また、削除する場合には右端のゴミ箱マークをクリックして削除することが可能です。
:::

# いざ、検証

こちらの画面に表示されている依存関係(Topology)をREST APIで取得してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/30e4132e-5b0b-517e-a021-63eea9df78d9.png)

利用するエンドポイントは[こちら](https://instana.github.io/openapi/#operation/getServicesMap)です。

ターミナルで実行する際は、下記コマンドになります。
ご自身の環境に合わせてパラメータを置き換えて実行してください。
```cmd
$ curl -H "Authorization: apiToken {APIトークン}" \
  "https://{ホスト名}/api/application-monitoring/topology/services?applicationId={アプリケーションID}"
```

|パラメータ|設定値|
|--|--|
|{APIトークン}|先ほど作成したAPIトークン<br>トークンは初期表示はマスキングされているため、目のアイコンをクリックしてトークンを表示します。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/8a65037e-6f5d-9b51-0142-46bd93c746ba.png)|
|{ホスト名}|利用環境のホスト名|
|{アプリケーションID}|今回はサクッと試したかったため、ブラウザのURLバーから取得しています。<br>例）Instanaで任意のアプリケーションの画面を開き、`https://~~/#/application/appId=XXX/~~`から`XXX`の部分を取得<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/d7dce0f2-7f38-6053-9eed-dc82a45ac048.png)|


正しくリクエストを投げられると以下の様なレスポンスが取得できます。
```json
{
	"services": [
		{
			"id": "12dea96fec20593566ab75692c9949596833adc9",
			"label": "user",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"nodeJsRuntimePlatform"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "e86256b2787ee7ff0c33d0d4c6159cd922227b79",
			"label": "payment",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"pythonRuntimePlatform"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "4d4ca94400bf5ca2eda49612213361a4e17cd28d",
			"label": "shipping service",
			"types": [
				"HTTP"
			],
			"technologies": [
				"jvmRuntimePlatform",
				"kubernetesService",
				"springbootApplicationContainer"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "7bb083edad4751b79c6b2a9a76f28d0181ae8973",
			"label": "ratings",
			"types": [
				"HTTP"
			],
			"technologies": [
				"phpRuntimePlatform",
				"kubernetesService",
				"httpd"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "8bfb4e1aa590eab8f08f837b97acf5803a5737ed",
			"label": "cart",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"nodeJsRuntimePlatform"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "ce4b152bac7b99744d8314838e49b799afd6dd96",
			"label": "nginx-web",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"nginx"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
		{
			"id": "1b946f915590dec37acb127a573c8cdd9ea99697",
			"label": "catalogue",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"nodeJsRuntimePlatform"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		}
	],
	"connections": []
}
```

`Robotshop1 Test`を構成するコンポーネントたちの詳細が取得できていることが確認できますね。

例えば、UI上Warningが発生している（黄色の丸）`payment`は、Pythonのアプリケーションであると表示されており、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/1ba5681d-7119-cd90-552b-7b5615b6743e.png)

レスポンスでもPythonのアプリケーション(`technologies: pythonRuntimePlatform`)であることが確認できます。
```json
{
	"services": [
        (省略)
		{
			"id": "e86256b2787ee7ff0c33d0d4c6159cd922227b79",
			"label": "payment",
			"types": [
				"HTTP"
			],
			"technologies": [
				"kubernetesService",
				"pythonRuntimePlatform"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		},
        (省略)
	],
    (省略)
}
```

※`connections`ではどのコンポーネントが依存関係にあるかのデータやその依存関係間のコール数、レイテンシー、エラー率などが含まれているのですが、今回検証に使用したアプリケーションでは空欄になっているため、サンプルを記載しておきます↓
```json:サンプル
{
	"connections": [
		{
			"from": "8bfb4e1aa590eab8f08f837b97acf5803a5737ed",
			"to": "f17e7efb3b9b2d62bfec6b07905759fb81e99797",
			"calls": 2179,
			"latency": 1.6103717301514455,
			"errorRate": 0
		}
	],
	"services": [
		{
			"id": "f17e7efb3b9b2d62bfec6b07905759fb81e99797",
			"label": "robot-shop",
			"types": [
				"MESSAGING"
			],
			"technologies": [
				"kubernetesService",
				"rabbitMq"
			],
			"snapshotIds": [],
			"entityType": "SERVICE"
		}
	]
}
```

# まとめ

**InstanaバックエンドのREST APIを叩いてみた** は以上となります。

必要な事前準備は **APIトークンの作成** のみとなります。

他にも色々なAPIがありますので、試してみていただけると幸いです。

:::note info
どんなエンドポイントがあるかは[Instana API docs](https://instana.github.io/openapi/)から確認が可能です
:::

それでは、良いInstanaライフを〜！