New Relic のSQL Server オンホストインテグレーションをLinuxで動かす

先日の記事でSQL Serverのオンホストインテグレーションを紹介しました。

[New Relic オンホストインテグレーションでMicrosoft SQL Serverを監視する](https://qiita.com/takayoshitanaka/items/7455b52640c9680cb85e)

New Relicからサポート付きで提供しているのはWindows上のInfrastructureエージェントと一緒に動くWindows向けのバイナリなのですが、GitHubでソースが公開されており自分でビルドすることができます。今回Linux（Ubuntu18.04 LTS)上でビルドし、動作が確認できたのでご紹介したいと思います。

New Relicでも多数のリポジトリを公開しており、オンホストインテグレーションは先頭に`nri-`がついています。

https://github.com/newrelic?utf8=%E2%9C%93&q=nri&type=&language=

MSSQLを始め、多くがgo言語で書かれておりクロスプラットフォーム向けにビルドが可能になっているようです。

https://github.com/newrelic/nri-mssql

ビルド済みのバイナリは提供されていないようですが、このリポジトリは次のようにビルドできます。go言語の環境設定に疎いので、次の手順でビルドできることは確認しましたが、好ましくない手順があればコメントいただければ幸いです。

まず、Ubuntu 18.04 LTSにこちらの手順に従い、パッケージマネージャー経由でgo言語のSDKをインストールします。
https://github.com/golang/go/wiki/Ubuntu

次に`go env`コマンドを実行し、GOPATH、GOROOT、GOARCHが設定されていることを確認します。

```shell
$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/clouduser/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/clouduser/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/lib/go-1.12"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.12/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build312533019=/tmp/go-build -gno-record-gcc-switches"
```

`$GOPATH/bin`を`PATH`環境変数に追加します。
```shell
$ export PATH=$PATH:/home/clouduser/go/bin
```

そしてリポジトリをcloneしますが、`$GOPATH/src`の配下かつ次のディレクトリ構造となるようにします。

```shell
$ cd ~
$ mkdir -p go/src/github.com/newrelic/
$ cd  go/src/github.com/newrelic/
$ git clone https://github.com/newrelic/nri-mssql.git
$ cd nri-mssql
```

最新のリリースタグをチェックアウトしてビルドを実行します。正常に完了すると、`bin`の下に成果物が生成されます。

```shell
$ git checkout v2.0.2
$ make
$ file bin/nr-mssql
bin/nr-mssql: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, not stripped
```

これでビルドは完了です。ここからこのインテグレーションをInfrastrucutreエージェントに追加します。LinuxのInfrastrucutreエージェントをあらかじめインストールしておいてください。パッケージマネージャーを利用する場合の手順はこちらにあります。

https://docs.newrelic.co.jp/docs/infrastructure/install-configure-manage-infrastructure/linux-installation/install-infrastructure-linux-using-package-manager

またWindowsの場合と同様、監視対象のSQL Serverにログインとユーザーを作って、接続権限の設定を行っておきます。

```sql
USE master;
CREATE LOGIN newrelic WITH PASSWORD = '<password>';
CREATE USER newrelic FOR LOGIN newrelic;
GRANT CONNECT SQL TO newrelic;
GRANT VIEW SERVER STATE TO newrelic;

-- Goes through each user database and adds public permissions
DECLARE @name NVARCHAR(max)
DECLARE db_cursor CURSOR FOR
SELECT NAME
FROM master.dbo.sysdatabases
WHERE NAME NOT IN ('master','msdb','tempdb','model')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0
BEGIN
	EXECUTE('USE "' + @name + '"; CREATE USER newrelic FOR LOGIN newrelic;' );
	FETCH next FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
```

リポジトリにある`mssql-definition.yml`と、ビルド成果物の`bin/nri-mssql`を`/var/db/newrelic-infra/newrelic-integrations`にコピーします。`nri-mssql`は実行可能になっていることを確認してください。

```shell
$ sudo ls /var/db/newrelic-infra/newrelic-integrations/* -l
-rw-r--r-- 1 root root  214 Jul 31 03:07 /var/db/newrelic-infra/newrelic-integrations/mssql-definition.yml

/var/db/newrelic-infra/newrelic-integrations/bin:
total 8108
-rwxr-xr-x 1 root root 8302273 Jul 31 03:08 nr-mssql
```

リポジトリにある`mssql-config.yml.sample` ファイルを`/etc/newrelic-infra/integrations.d/mssql-config.yml`としてコピーし、次のように記載します。

```yml
integration_name: com.newrelic.mssql

instances:
  - name: mssql-server
    command: all_data
    arguments:
      hostname: localhost
      username: newrelic
      password: <Password>
    labels:
      env: production
      role: mssql
      type: linux
```

ここまで設定できれば、Infrastrucureエージェントを再起動します。

```shell
$ sudo systemctl restart newrelic-infra
```

あとはログをみて正常に動いていることを確認しましょう。

```shell
$ journalctl -u newrelic-infra.service -f
```

正常に動いていれば、数分すればMSSQL Dashboardに表示されるようになるはずです。
GitHubで公開されているコードは直接サポートするものではありませんが、このような使い方もできるのでぜひ参考にしてみてください。