NextcloudをモニタリングしてNew Relic APMのexternal serviceを理解する。

#目的
OSSのクラウドストレージソフト、Nextcloudをモニタリング対象にして
New Relic APMのexternal serviceがどのように見えるか確認していきます。
NextcloudはバックエンドストレージとしてS3を利用したり、機能追加にGithubを利用するLAMP構成のアプリケーションのため、

New Relic APMのPHPエージェントと外部サービスとの関係を理解する参考になります。

#nextcloud構築
##インスタンス作成

UserDataを入力してAmazon Linux 2 でインスタンスを作成します。

```bash:userdata
#!/bin/bash
#環境変数
dbname=nextcloud #DB名
dbuser=nextadmin #DBユーザ名
dbpassword=nextpass #DBパスワード

#パッケージインストール
yum update -y
amazon-linux-extras install epel redis4.0 lamp-mariadb10.2-php7.2 -y
yum install  httpd mariadb mariadb-server php-gd php-mbstring php-intl php-pecl-apcu php-mysqlnd php-pecl-redis php-opcache php-imagick php-zip php-dom -y
yum update -y

#mariadb起動
systemctl start mariadb.service

#MySql root ランダムパスワード生成
vMySQLRootPasswd="$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16 | tee -a /home/ec2-user/.mysql.secrets)"

#MySql_secure_installation
mysql -u root --password= -e "
    UPDATE mysql.user SET Password=PASSWORD('${vMySQLRootPasswd}') WHERE User='root';
    DELETE FROM mysql.user WHERE User='';
    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
    DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
    FLUSH PRIVILEGES;"

#DB初期設定
echo [mysql] >> /home/ec2-user/my.cnf 
echo host = localhost >> /home/ec2-user/my.cnf
echo user = root >> /home/ec2-user/my.cnf
dbrootpass() {
cat /home/ec2-user/.mysql.secrets
}
dbrootpass=`dbrootpass`
echo password = ${dbrootpass} >> /home/ec2-user/my.cnf
echo "create database ${dbname} character set utf8 collate utf8_bin; grant all privileges on ${dbname}.* to ${dbuser}@localhost identified by '${dbpassword}';" > /tmp/create.sql
mysql --defaults-extra-file=/home/ec2-user/my.cnf < /tmp/create.sql


#自動起動設定
systemctl enable httpd.service
systemctl enable mariadb.service
systemctl enable redis.service

reboot
```

##nextcloudインストール
nextcloudパッケージをインストールします。

```bash
$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip
$ unzip nextcloud-17.0.0.zip
$ sudo mv nextcloud /var/www/html/
$ sudo chown apache.apache /var/www/html/nextcloud/ -R
```

##初期設定
http://<IPアドレス>/nextcloudにアクセスして初期設定を行います。
![2019-12-09_00h26_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/c2fc4479-8374-c74b-d258-10e301d2422d.png)

管理者ユーザを作成し
環境変数で設定したDB情報を入力します。

```bash:DB情報
dbname=nextcloud #DB名
dbuser=nextadmin #DBユーザ名
dbpassword=nextpass #DBパスワード
```

#New relic インストール
## new relic apm インストール
New relic APMの画面でadd more から言語を選択するとインストール手順が表示されます。
![2019-12-09_00h32_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/10e1f301-4ab7-e5ff-aa52-ddc7da38cbb0.png)

```bash:new_relic_apm_php_install
$ sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
$ sudo yum install newrelic-php5
$ sudo newrelic-install install
New Relic PHP Agent Installation (interactive mode)
===================================================

   Enter New Relic license key (or leave blank):<ライセンスキーを入力>

$ sudo vi /etc/php.d/newrelic.ini
以下の内容を編集
newrelic.appname = "nextcloud" #アプリケーション名
newrelic.distributed_tracing_enabled = true #分散トレーシング有効
```

設定が終わったら一度再起動します。

nextcloudのパフォーマンス収集が開始されます。
![2019-12-09_00h54_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/76a053d1-0ffd-2bb2-6e7a-1540a986816f.png)

#nextcloudの外部連携
##S3連携
S3と連携するために＋アプリからExternal Storage Supportを有効化します。
![2019-12-09_00h55_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/ed8577e8-943d-fb55-cf24-f5597c0ad30f.png)
![2019-12-09_00h56_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/0099eed8-3540-d27d-227b-01d74a1b78fd.png)
![2019-12-09_00h56_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/b9ac481d-06b8-a915-7419-a99e7d17a2ed.png)

設定-管理-外部ストレージを選択し、S3バケットを選択します。
バケット名、リージョン、アクセスキー、シークレットアクセスキー情報を入力して接続します。
![2019-12-09_01h07_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/867bc6a1-c6ab-100d-53ea-7aa9d41d5e24.png)

#その他のサービスの追加
カンバンボードやカレンダーなども追加してみます。

#New Relic APMでの可視化
S3アクセスや、nextcloudのアプリケーションサービスインストールは `Web external` として表示されます。
![2019-12-09_01h15_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/54c8f0b5-ef5a-346d-98fd-dddb07551fec.png)

外部サービスの詳細はExternal Serviceで確認できます。
NextcloudやS3、githubにアクセスしていることが確認出来ます。
![2019-12-09_01h15_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/f73be994-01e9-9f60-9e31-09e008886245.png)

サービスマップでも同じように表示されます。
![2019-12-09_01h25_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/81513928-abcc-5b6c-7229-f7e6cfa68d63.png)

#外部サービスの可視化
自分で開発したサービスはもちろん、OSSなどから導入したサービスでもNew Relicで可視化することによって、動作に必要な依存関係にある外部サービスの確認やそのパフォーマンスの確認が出来るようになります。

外部サービスとの依存関係が把握出来れば、例えば追加機能のインストールが出来ない場合にOSSの相性を疑うのかあるいは外部サービスのダウンを疑うのか

問題切り分けが的確に行えるようになります。