Python(Django)アプリをInstanaで可視化・モニタリングする(1)【設定編】

# 1. はじめに
前回の投稿「 [IBM CloudのVPCの仮想インスタンス(Ubuntu)をInstanaを使って可視化する](https://qiita.com/daihiraoka/items/c6fd7cfa9e4a59b3038a)」では、IBM CloudのVirtual Private Cloud(VPC)の仮想インスタンス(Ubuntu)にInstana Agentをインストールをインストールすることによって、 Instanaのダッシュボードで、インフラ視点で可視化できることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/f8c7d981-0894-dd42-797d-a256c37d345d.png)

これからはアプリケーション視点で、Python(Django)の「簡単な投票 (poll) アプリケーション」を使って,
Instanaで可視化＆モニタリングできることを確認します。

なお、このアプリケーションの構築手順は、「 [IBM CloudのVPCでDjangoのアプリケーションを動かす](https://qiita.com/daihiraoka/items/bb0ea1d15f342493d850) 」にて解説してあります。

# 2. 今回の作業イメージ
今回は、Webサーバーの「 ①PythonとDjangoのモニタリングの設定 」を行い、
次の投稿で「 ②Instanaで可視化された収集データを確認」します。
![構成イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/d11bd6e1-52a7-e1fb-6712-c873ee6fec08.png)
２つの仮想インスタンスのスペックは下記の通りです。

- 仮想インスタンス1(外部アクセスからのアクセス可能)
    - 役割: Webサーバ
        - OS: Ubuntu 20.04 
        - Webサーバ : Djangoのrunserver
        - Python : 3.8.5
        - Django : 4.0.7

- 仮想インスタンス2(外部アクセスからのアクセス不可)
    - 役割: DBサーバ 
        - OS: Ubuntu 20.04 
        - PostgreSQL : 12

# 3. 動作するアプリケーションのイメージ
このアプリは、Djangoの「[はじめての Django アプリ作成](https://docs.Djangoproject.com/ja/4.1/intro/tutorial01/)」で作成する「簡単な投票 (poll) アプリケーション」で今日の天気を投票してもらうサンプルデータを作成して、実行しています。 実際にブラウザで投票すると、その投票結果は、PostgreSQLのデータベースに保存される仕組みになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/3c250bfa-09fd-97bb-e2f6-dbdd9bf7e268.png)

# 4. Python & Django のモニタリング設定

- Webサーバ作業
1. リモートサーバへのログイン
   まずはリモートサーバにログインします。

    ```console
    ssh -i [秘密鍵のファイル名] root@[WebサーバのIPアドレス]
    ```

1. 作業用ユーザーにスイッチ
   作業用ユーザーにスイッチします。
    ```console
    su - [ユーザー名]
    ```

1. アプリディレクトリの確認 
   /appのフォルダにDjangoのプロジェクトのファイルが配置されているので、ディレクトリを確認します。

    ```console
    $ ls -l /app
    total 24
    -rw-rw-r-- 1 dai dai 1079 Oct  2 02:50 LICENSE
    -rw-rw-r-- 1 dai dai 1359 Oct  2 02:50 README.md
    -rwxrwxr-x 1 dai dai  538 Oct  2 02:50 manage.py
    drwxrwxr-x 2 dai dai 4096 Oct  2 02:50 mysite
    drwxrwxr-x 5 dai dai 4096 Oct  2 02:50 polls
    drwxrwxr-x 3 dai dai 4096 Oct  2 02:50 templates
    ```
1. アプリディレクトリへの移動 
   /appのフォルダで作業するために /appフォルダに移動します。

    ```console
    $ cd /app
    ```

1. Instana Pythonモジュールのインストール
   Instanaで Pythonのアプリケーションをトレースするために、Instana Pythonモジュールをpipでインストールします。

    ```console
    $ sudo pip3 install instana
    ```
    ドキュメント: [モニター Python -Instana Python パッケージ]("https://www.ibm.com/docs/ja/instana-observability/current?topic=technologies-monitoring-python-instana-python-package")

1. settings.pyの設定(Djangoの設定ファイル)
   DjangoでInstanaでモニターするために、settings.pyにInstana Pythonモジュールをインポートするように設定します。

    - 変更前(１３行目)
    ```console
    import os
    ```

    - 変更後(１３〜14行目)
    ```console
    import os
    import instana
    ```

これで設定は、終了で、次からは動作確認を行います。

# 5. 動作確認 ( Webサーバの起動 : Python & Djangoのモニタリング )

環境構築時には、Djangoのrunserver[テスト用簡易サーバ]を使ってアプリケーションを動作させていました。この投稿でもrunserverで動作確認を行います。 (GunicornやuWsgi等は、別投稿でやりたいと思います。）

1. Instana Agentのデバックモードの有効化
   テストなので問題判別を早めるためにデバックモードを有効にします。方法は、環境変数を宣言します。

    ```console
    $ export INSTANA_DEBUG=true
    ```

1. Djangoのrunserver[テスト用簡易サーバ]の起動
    runserverを使って起動します。

    ```console
    $ python3 manage.py runserver 0.0.0.0:8000
    ```

1. runserver[テスト用簡易サーバ]から出力されるログの確認
   runserver[テスト用簡易サーバ]が起動を開始すると、 出力されるログには、 Instana関連のログとrunserverのログが出力されるようになります。
   
    ■以下、出力されるログの内容

   - Instana関連のログ (Pythonアプリケーションモニターできるように、必要なモジュールをインストルメントしている）
    
    ```console
    2022-10-04 14:25:38,721: 246994 INFO instana: Stan is on the scene.  Starting Instana instrumentation version: 1.38.0
    2022-10-04 14:25:38,721: 246994 DEBUG instana: Loading Host Collector
    2022-10-04 14:25:38,722: 246994 DEBUG instana: Initializing host agent state machine
    2022-10-04 14:25:38,726: 246994 DEBUG instana: Instrumenting asyncio
    2022-10-04 14:25:38,732: 246994 DEBUG instana: Instrumenting gevent: gevent not detected or loaded.  Nothing done.
    2022-10-04 14:25:38,734: 246994 DEBUG instana: Instrumenting logging
    2022-10-04 14:25:38,745: 246994 DEBUG instana: Instrumenting psycopg2
    2022-10-04 14:25:38,745: 246994 DEBUG instana: Instrumenting urllib3
    2022-10-04 14:25:38,746: 246994 DEBUG instana: Instrumenting django
    2022-10-04 14:25:38,816: 246994 DEBUG instana: uwsgi hooks: decorators not available: likely not running under uWSGI
    ```

    - runserver[テスト用簡易サーバ]の内容のログ
    ```console
    Django version 4.0.7, using settings 'mysite.settings'
    Starting development server at http://0.0.0.0:8000/
    Quit the server with CONTROL-C.
    ```

    - Instana関連のログ (Agent is ready.  Getting to work.で Instanaでモニター開始されているのを確認できる。）

    ```console
    2022-10-04 14:25:40,117: 246998 DEBUG instana: Instana host agent found on localhost:42699
    2022-10-04 14:25:40,117: 246998 DEBUG instana: Attempting to make an announcement to the agent on localhost:42699
    2022-10-04 14:25:40,122: 246998 DEBUG instana: Starting Host Collector
    2022-10-04 14:25:40,122: 246998 DEBUG instana: BaseCollector.start: launching collection thread
    2022-10-04 14:25:40,122: 246998 INFO instana: Instana host agent available. We're in business. Announced PID: 246998 (true pid: 246998)
    2022-10-04 14:25:40,122: 246998 DEBUG instana: Announced pid: 246998 (true pid: 246998).  Waiting for Agent Ready...
    2022-10-04 14:25:50,782: 246994 DEBUG instana: Agent is ready.  Getting to work.
    ```

1. Webサーバが起動したので、ブラウザで WebサーバのフローティングIPアドレスを使って次のURLで 「 http://(フローティングIPアドレス):8000/polls」アクセスして画面を確認します。

問題がなければブラウザに以下の画像のように「 今日の天気は？ 」とメッセージが表示されるはずです。下記、赤矢印に沿って画面遷移を続けてと投票を継続すると投票数が増えていくことを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/693dec40-5bfd-1f74-1fe5-1cf11a59e049.png)


ブラウザアクセスをしている時のrunserver[テスト用簡易サーバ]が出力しているログの中に、
通常のアクセスログに加えて、`DEBUG instana: Reporting 3 spans`が出力されていますが、 ３つの[スパン(Span)](https://www.ibm.com/docs/ja/instana-observability/current?topic=monitoring-traces#span)がInstana Agentに送信されているログです。

```console
[04/Oct/2022 14:45:16] "GET /polls/ HTTP/1.1" 200 549
[04/Oct/2022 14:45:16] "GET /static/polls/style.css HTTP/1.1" 404 179
2022-10-04 14:45:17,123: 246998 DEBUG instana: Reporting 3 spans
[04/Oct/2022 14:45:21] "GET /polls/1/ HTTP/1.1" 200 945
2022-10-04 14:45:22,123: 246998 DEBUG instana: Reporting 3 spans
[04/Oct/2022 14:45:27] "POST /polls/1/vote/ HTTP/1.1" 302 0
[04/Oct/2022 14:45:27] "GET /polls/1/results/ HTTP/1.1" 200 568
2022-10-04 14:45:27,123: 246998 DEBUG instana: Reporting 7 spans
```

Instana Agentをデバックモードにすることで、runserver[テスト用簡易サーバ]のログからInstanaがPython & Djangoをモニタリングしている事がわかりました。

# 6. 最後に
今回の投稿では、IBM CloudのVirtual Private Cloud(VPC)の仮想インスタンス(Ubuntu)で動作するPython&Djangoのアプリケーションに Instana Pythonモジュールを組み込みことで、Instanaが、Pythonアプリケーションの動向を計測し、計測したデータを、Instana Agentに送信しているところまでを確認しました。

次の投稿 [Python-DjangoアプリをInstanaで可視化・モニタリングする(2)【確認編】](https://qiita.com/daihiraoka/items/a49b7492a2da68c78a92)では、収集したデータがInstanaのダッシュボードで視覚化・モニタリングできる事を確認します。


この投稿は、下記、１〜４の流れで、IBM Cloudの Virtual Private Cloud(VPC)の仮想インスタンス作成、Python(Django)とPostgreSQLを使ったサンプルアプリの作成、インフラ、アプリの可視化・モニタリングの順番に構築設定を行った時の記録になります。　ぜひ、１〜４まで参考になれば幸いです。

1. Python(Django)アプリの環境構築
    - [IBM Cloud VPCの仮想インスタンスでPython(Django)アプリ作成](https://qiita.com/daihiraoka/items/bb0ea1d15f342493d850)

1. インフラの可視化・モニタリング設定・確認
    - [IBM CloudのVPCの仮想インスタンス(Ubuntu)をInstanaを使って可視化する](https://qiita.com/daihiraoka/items/c6fd7cfa9e4a59b3038a)

1. **(本投稿)Python(Django)アプリの可視化・モニタリング設定**
    - [Python(Django)アプリをInstanaで可視化・モニタリングする(1)【設定編】](https://qiita.com/daihiraoka/items/2e3f66a61e61afa60324)

1. 　Python(Django)アプリの可視化・モニタリング設定
    - 「[Python(Django)アプリをInstanaで可視化・モニタリングする(2)【確認編】](https://qiita.com/daihiraoka/items/a49b7492a2da68c78a92)」