Node.js APMエージェントをどうしても試してみたいので、Node-Redにエージェント導入を試みる

:::note info
このアップデートの詳細はこちら
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

# はじめに
Node.jsが大好きだ。だけど、ガリガリとNode.jsを使ってアプリケーションを開発できるほどのスキルは持っていないので、いままで[Node.jsにAPMエージェント](https://docs.newrelic.com/jp/docs/apm/agents/nodejs-agent/getting-started/introduction-new-relic-nodejs/)を導入して遊んでみることができなかった。(**がんばれ自分!!**)

もしかしたら、Node.jsやっているエンジニアにとっては知っていて当たり前のことなのかもしれないけど、[Node-Red](https://nodered.org/)という**神**の様なNode.jsベースのソリューションがあることを知人に教えてもらいました。(**感謝感謝**)
<iframe width="445" height="250" src="https://www.youtube.com/embed/ksGeUD26Mw0" title="Introduction - Node-RED Essentials" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
Node.jsやJavaScriptに詳しくなくても、さまざまなロジックをUIベースで作れるようなので、ここにNode.js APMエージェントを導入して、いろいろなロジックを組み込んで遊んでみることにした。

# やってみる
早速、開始・・・といきたいが、遊ぶための環境は以下のものが必要だったので、情報の整理。
### 必要なもの
- [Docker Desktop](https://www.docker.com/)
- New Relicプラットフォーム
    - もしまだ持っていない人は[こちら](https://newrelic.com/jp/sign-up-japan)から永久無料アカウントの取得をお願いします。

## ステップ(準備) ##
1. 任意のフォルダを作成し、ターミナルでそのフォルダに移動する
1. Dockerhubの[nodered/node-red](https://hub.docker.com/r/nodered/node-red/)イメージを取得し、任意名でコンテナの起動を行う(以下の例は、コンテナ名を **mynodered** として起動しています)
    ```
    docker run -it -p 1880:1880 -v .:/data --name mynodered nodered/node-red
    ```
1. コンテナ起動後、Webブラウザを起動し、`http://localhost:1880`にアクセスする(localhostのタイポに気をつけて!!)
    **補足:** 以下の画面が表示されれば成功です。このUIからさまざまなロジックを作成することができます**ワクワク**
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534647/9ad2914d-7971-3243-a677-0890a9e64425.png" width="70%">
1. 新しいターミナルを起動し、以下のコマンドを実行し、コンテナ内で作業を行う(以下の例では、コンテナ名を **mynodered** としています。作成したコンテナ名に置き換えて試して下さい。)
    ```
    docker exec -it mynodered /bin/bash
    ```
1. 一旦、新たに起動したターミナルから離れて、[New Relicプラットフォーム](https://login.newrelic.com)にアクセスし、**Add Data**ボタンをクリックする
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534647/d44e2864-50f3-9104-6028-1de03628cbcf.png" width="80%">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534647/8bf5c3ef-f33d-4300-d543-8d690724d76c.png" width="30%">

1. さまざまなデータタイプのタイルが表示されるので、**Node.js**のタイルをクリックする
    <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534647/7023195b-9568-8f9e-d72a-d45452adb896.png'>

1. 導入方法の選択肢が表示されるので **On a host** を選択し、**npm**を用いて導入を行う
    以下の手順に従い、進めます
    1. **Give your application a name**: New Relicプラットフォーム上で表示される名前を指定する
        **補足:** ここで指定した名前は後続で利用しますが、設定上意味はありません
    1. 先ほど2番目に起動したターミナル上で以下のコマンドを実行する
        ```
        npm install newrelic --save
        ```
    1. 続いて以下のコマンドをコピーし、手元のテキストファイルに貼り付ける
        **補足:** コマンド内の<上記のGive your application a nameで指定した名前>や<ライセンスキー>は、自動で補完されているので、そのまま利用します
        ```
        NEW_RELIC_APP_NAME=<上記のGive your application a nameで指定した名前> NEW_RELIC_LICENSE_KEY=<ライセンスキー> node -r newrelic YOUR_MAIN_FILENAME.js
        ```
    1. 以下のコマンドを実施する(Node-Redのルートディレクトリにnewrelic.jsをコピーする)
        ```
        cp /usr/src/node-red/node_modules/newrelic/newrelic.js /usr/src/node-red
        ```
        **重要:** **newrelic.js**ファイルは、Node.js APMエージェントの設定ファイルです。今回の利用以外にもさまざまな目的で編集するファイルとなります。
    1. コンテナ内の`/usr/src/node-red/newrelic.js`を編集する
        コマンド例: `vi newrelic.js`
        

        - **newrelic.js**内の**app_name**の値を<上記のGive your application a nameで指定した名前>に変更する
            **変更例:** `app_name: ['qiita_nodered'],`
        - **newrelic.js**内の**license_key**の値を<ライセンスキー>に変更する
            **変更例:** `license_key: '1234567890...abcdefg...'`
    1. 変更後、ファイルを保存する
1. Node-Redの起動スクリプト`/usr/src/node-red/entrypoint.sh`を編集し、Node-Redが起動する際に、Node.js APMエージェントを含めるようにする
    コマンド例: `vi entrypoint.sh`
    **補足:** 変更箇所は、nodeコマンドに`-r newrelic`が追加されている部分のみになります
    ```diff_shell
    #!/bin/bash
    
    trap stop SIGINT SIGTERM
    
    function stop() {
            kill $CHILD_PID
            wait $CHILD_PID
    }
    
    -/usr/local/bin/node $NODE_OPTIONS node_modules/node-red/red.js --userDir /data $FLOWS "${@}" &
    +/usr/local/bin/node $NODE_OPTIONS -r newrelic node_modules/node-red/red.js --userDir /data $FLOWS "${@}" &
    
    CHILD_PID="$!"
    
    wait "${CHILD_PID}"
    ```
1.  **entrypoint.sh**ファイルを更新後、Node-Redコンテナを再起動する(以下の例では、コンテナ名を **mynodered** としています。作成したコンテナ名に置き換えて試して下さい。)
    ```
    docker restart mynodered
    ```
1. New Relicプラットフォームに戻り、**APM & Services**メニューを選択した際に、設定したアプリケーションの名前が一覧に表示されます(以下に表示しているスクリーンショットは、さらにその収集データの詳細を確認している画面です)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534647/2eb84f52-37b7-53c4-dcb3-299e32b0aa4c.png">

# まとめ
上記の数ステップで、無事にNode.js APMエージェントの導入が完了できました。もっと早くNode-Redの存在に気づていていれば、遊び倒していたのにという複雑な気持ちです。
(気持ちをサクッと切り替えて)今後は、**外部のアプリケーションへの連携**や**DB連携**などAPMならではの構成を試してみようと思います。どの様な情報を得られるかを試して、Qiitaにアップできればと思いますので、続報をお待ちくださいませ!!

### 最後にお仕事っぽく ###
New Relicを使い倒すための情報をこれからもどんどん発信していければと思います。また、New Relicを触ったことはないけれど、いろいろ触ってみたい興味をお持ちの方は、是非[こちら](https://newrelic.com/jp/sign-up-japan)から永久無料アカウントを作成して下さい。

:::note info
永久無料アカウントの詳細は[こちら](https://docs.newrelic.com/jp/docs/accounts/accounts-billing/account-setup/create-your-new-relic-account/)です。
:::