Instanaを使ってOpenShift上で動作するアプリのパフォーマンスを監視する (2)

# はじめに
Qiita記事「[Instanaを使ってOpenShift上で動作するアプリのパフォーマンスを監視する (1)](https://qiita.com/daihiraoka/items/b8591a07ec74b51c97ea)」の後続の記事になります。

この回では、Bee TravelsのマイクロサービスにInstanaで監視できるようにコードを埋め込み、OpenShiftクラスターにBee Travelsをデプロイするところまで取り扱います。

## 情報をクイックに把握されたい方向け
これからAPMやInstanaについて情報だけクイックに把握されたい方は、
`Instanaで各言語をWebSite監視・トレースするために必要なこと` をインプットされると良いと思います。
特に、Node.js 、Pythonについては、コードにポインタをつけて、どの部分を挿入すべきなのか、画像で視覚化しています。

以下の3つをサクッと見て雰囲気だけ掴んでもらえればと思います。

3. [InstanaでのWebsite監視設定-End User Monitoring-EUM](#3-instana%E3%81%A7%E3%81%AEwebsite%E7%9B%A3%E8%A6%96%E8%A8%AD%E5%AE%9A-end-user-monitoring---eum)
4. [Instanaでのトレース](#4-instana%E3%81%A7%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)
5. [Instanaの組み込み例：BeeTravelsアプリケーション](#5-instana%E3%81%AE%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E4%BE%8Bbeetravels%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)


# そもそもInstanaとは？
[Instana](https://www.instana.com/)はアプリケーション・パフォーマンス管理(APM)ツールの１つでサービスに問題が発生した時に、インフラからアプリまでの依存関係を視覚化し、どこのサービスで、ソースコードの何行目が問題があるのか原因究明コストを大幅に削減できるのが特徴なツールです。可観測性(observability)という領域のツールです。

# 手順

1. [事前準備](#1-%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
2. [リポジトリのfork](#2-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AEfork)
3. [InstanaでのWebsite監視設定-End User Monitoring-EUM](#3-instana%E3%81%A7%E3%81%AEwebsite%E7%9B%A3%E8%A6%96%E8%A8%AD%E5%AE%9A-end-user-monitoring---eum)
4. [Instanaでのトレース](#4-instana%E3%81%A7%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)
5. [Instanaの組み込み例：BeeTravelsアプリケーション](#5-instana%E3%81%AE%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E4%BE%8Bbeetravels%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
6. [OpenShiftへアプリケーションのデプロイ](#6-openshift%E3%81%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)
7. [アプリケーションの接続確認](#7-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%8E%A5%E7%B6%9A%E7%A2%BA%E8%AA%8D)

## 1. 事前準備
* OpenShiftクラスターを用意する。
* Docker HubのID。
* 作業用端末 に以下の２つが導入されていること
    * [OpenShift CLI (oc)](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift-cli#cli_oc)
    * [Docker](https://www.docker.com/products/docker-desktop)
* [Instana](https://www.instana.com/trial/)へのアクセス。
    * SaaS版の14日間フリートライアルを上記サイトで申請して使用します。

## 2. リポジトリのfork

1. Git Hubリポジトリ： [https://github.com/IBM/instana-openshift](https://github.com/IBM/instana-openshift)にアクセスし、右上の **Fork** ボタンをクリックしてリポジトリをフォークします。

## 3. InstanaでのWebsite監視設定( End User Monitoring - EUM)

Instanaで、Website監視設定を行うためには、 クライアントのブラウザからInstanaのバックエンドサーバにデータを送信するために、アプリケーションにJavaScriptを組み込む必要があります。

まず、Instanaのフリートライアル申請行い、Instanaのデプロイが終了したら
Instanaにログインしダッシュボードに接続します。 赤枠の `Add Website` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/a1a27aad-6b5d-237f-d175-66e4d252201b.png)

そして 赤枠の Website Nameに、任意の名前を入力し(今回は ` Tok04 Bee Travels` )し `Add Website`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/77d3afbc-7005-57f0-b156-fe9db15a37bc.png)

Websiteをモニタリングするためのスクリプトが表示されます。保存を行うために`Copy to clipboard`ボタンをクリックしクリップボードに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/091504d8-de8d-655d-4b7b-63e874056c8b.png)

クリップボードにコピーしたスクリプトをHTMLファイル: " [/src/services/ui/frontend/public/index.html](https://github.com/IBM/instana-openshift/blob/main/src/services/ui/frontend/public/index.html)  "の`<head>`タグの間に挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/0afe457a-dacd-a61a-919e-9aa7584cbe57.png)

これで、InstanaでフロントエンドアプリケーションのWebsite監視ができるようになりました。
これにより、アプリケーションのフロントエンドでページの読み込みやトラフィックなどを分析できるようになります。

## 4. Instanaでのトレース

Instanaでアプリケーションの各サービス間のトレースを行うために、以下の４つの方法を提供しています。

1.  [ソースコードへの変更なしにトレースできる言語](https://www.instana.com/docs/tracing/#automatic-instrumentation) - [Instana AutoTrace]()という独自技術
    - Java、PHP、Python、.NET、Scala、Clojure
   
1.  [最低限の変更`ライブラリのimportなど` でトレースできる言語](https://www.instana.com/docs/tracing/#automatic-instrumentation)
    - .NET Core、NGINX、Node.js

1.  [Instanaが提供するSDKを使用してトレースできる言語](https://www.instana.com/docs/tracing/#instana-sdks)

1.  [他のトレース技術との統合](https://www.instana.com/docs/tracing/#opentelemetry)
    - OpenTracing、OpenCensus、Jaeger、Zipkin

Instanaでアプリケーションをトレースできるようになるとサービスに対して行われた呼び出しに関する分散トレース、テレメトリ、およびその他の情報をInstanaに送信できます。さらに、個々のトレースコールを分析して、サービスが互いにどのように通信しているかを示すことができます。

以下にアクセスすると、Instanaが各BeeTravelsサービスにどのように組み込まれているかを確認できます。

## 5. Instanaの組み込み例：BeeTravelsアプリケーション

リポジトリをForkした段階で、BeeTravelsアプリケーションではInstanaのライブラリが組み込まれた状態になってます。

**Destination Service**

* Source code: [src/services/destination-v1/src/app.js](https://github.com/IBM/instana-openshift/blob/main/src/services/destination-v1/src/app.js) (lines 14-17)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/e3eaa79e-0f97-5007-2c04-e7e79c4cf26f.png)
> Instanaのドキュメント: [Node.js Collector Configuration](https://www.instana.com/docs/ecosystem/node-js/configuration/)

* Deployment yaml: [config/destination-v1-deploy.yaml](https://github.com/IBM/instana-openshift/blob/main/config/destination-v1-deploy.yaml) (lines 53-64)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/1f35eb8b-a040-4f7c-3cc9-a7cf8eab9f70.png)

**Car Rental Service**

* Source code: [src/services/car-rental-v1/src/app.js](https://github.com/IBM/instana-openshift/blob/main/src/services/car-rental-v1/src/app.js) (lines 15-18)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/c12be2a7-1f5f-0193-bc54-661222fe20b6.png)

* Deployment yaml: [config/carrental-v1-deploy.yaml](https://github.com/IBM/instana-openshift/blob/main/config/carrental-v1-deploy.yaml) (lines 53-64)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/abba4e6c-68ab-b668-967b-5c254e096475.png)

**Hotel Service**

* Source code: [src/services/hotel-v1-python/app/\__init__.py](https://github.com/IBM/instana-openshift/blob/main/src/services/hotel-v1-python/app/__init__.py) (lines 11-12, 28)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/73464cfb-0583-175c-617a-5ab265928634.png)

Pythonは Instanaでは[Autotrace](https://www.instana.com/docs/ecosystem/python/configuration/#autotrace)対応なので、ソースコードの変更なしにトレース可能なのですが、Frameworkを使ったり、WSGIを利用する場合は、 上記の様にソースコードの変更が必要です。
 
>Instanaドキュメント:[WSGI & ASGI Stacks](https://www.instana.com/docs/ecosystem/python/configuration/#wsgi--asgi-stacks) 

* Deployment yaml: [config/hotel-v1-python-deploy.yaml](https://github.com/IBM/instana-openshift/blob/main/config/hotel-v1-python-deploy.yaml) (lines 53-64)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/e56241f8-880e-cd2a-21a0-c62a6bdc3a83.png)

**Currency Exchange Service**

* Source code: [src/services/currency-exchange/src/app.js](https://github.com/IBM/instana-openshift/blob/main/src/services/currency-exchange/src/app.js) (lines 14-17)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/57d321e3-3e3d-9df3-e928-8199ae6deb31.png)

* Deployment yaml: [config/currencyexchange-deploy.yaml](https://github.com/IBM/instana-openshift/blob/main/config/currencyexchange-deploy.yaml) (lines 51-62)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/99927c0c-6731-8446-1cb6-2075f4ba63b2.png)

これで、Bee TravelsアプリケーションにInstanaのコードが組み込まれていることを確認し、アプリケーションのデプロイをするだけになりました。ついに、　OpenShiftに Instana Agentを導入して、モニタリングできるようにします。

## 6. OpenShiftへアプリケーションのデプロイ

１. OpenShiftコンソールを開き、`Copy Login Command` から OpenShiftクラスタにログインするためのコマンド(`oc login...`)をコピーします。![openshift_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/9f9e0b29-e820-55e6-bed9-dd2ca0bef4d1.png)

２. 前の手順でコピーしたログインするためのコマンドをTerminalでペーストしOpenShiftクラスタにログインします。

```console
oc login --token=sha256~xyz --server=https://aaa.bbb.ccc:111
You have access to xx projects, the list has been suppressed. You can list all projects with ' projects'

Using project "default".
Welcome! See 'oc help' to get started.
```

３. Terminalで `build-and-deploy.sh` スクリプトを実行してBee Travelsアプリケーションをビルドし、OpenShiftクラスターにデプロイします。
> 注1: Terminalを起動している環境でDockerが起動している必要があります。
> 注2: 変数： <DOCKERHUB_USERNAME>はDocker HubのIDを入力します。

```console
cd instana-openshift
./build-and-deploy.sh -d <DOCKERHUB_USERNAME>
```

`build-and-deploy.sh` スクリプトの実行が完了したら、
Openshiftコンソールで `Workloads` -> `Pods` といどうして、Openshiftクラスターでアプリケーションが実行していることを確認します。下図の様に bee-travelsプロジェクトにPodが作成されていることを確認します。![openshift_pods.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/0de5dd3f-c92a-8753-8403-eba6049304d6.png)

４. Bee TravelsアプリケーションがOpenShiftにデプロイしたので、RouteをしようしてUIを外部に公開します。OpenShiftコンソールで `Networking` -> `Routes` の順番に移動し、 `Create Route` ボタンをクリックします。![openshift_route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/74e1954d-7de2-a5a7-eb45-664b2003316f.png)

５．次に、下図のように入力して、Routeを作成します。![openshift_routespecs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/1af00f9e-30f0-a499-51b3-a73163d6984c.png)

６．そして、新しく作成されたRouteのLocationのURLをメモをしておいてください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/17d71767-d5d1-af60-007e-44dabc7b59c4.png)

## 7. アプリケーションの接続確認
ブラウザでURLにアクセスすると、下図のようなBee Travelsのアプリケーションが表示されます。`tokyo`と入力し、表示された`Tokyo, Japan`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/41eb219e-bf7a-f6f3-fd57-5dc0eb34358d.png)

Tokyoの案内が表示され、Hotelsの `Date From` から `Date To`に日程を入力すると、東京に存在しないホテルの一覧が表示されます。(サンプルデータなので)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/06129825-ae9c-123c-48c9-f69e1660cdd8.png)

# 最後に
これで、Bee Travelsアプリケーションが利用できる様になりました。
次の回では、OpenShitftクラスターに Instana Agentを導入し、Bee TravelsのアプリケーションをInstanaを使ってモニタリングしたいと思います。