Ubuntuでcollectdのapacheプラグインを使おうとするとfile not foundと言われる

サーバの各種メトリクスを収集する[collectd](https://collectd.org/)というソフトウェアがあります。収集対象ごとにプラグインが用意されていて、その中にApache用の[apacheプラグイン](https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_apache)があります。このプラグインをUbuntu 14.02で普通に使おうとするとなぜかエラーになり使えません。

collectdのapacheプラグインはApacheのmod_statusの機能を使うので、まずは以下のコマンドでmod_statusを有効にします。

```
a2enmod status
service apache2 restart
```

つづいてapacheプラグイン用の設定ファイルを追加します。

```apache:/etc/collectd/plugins/apache.conf
LoadPlugin apache
<Plugin apache>
  URL "http://localhost/server-status?auto"
</Plugin>
```

そしてcollectdを再起動すると以下のようなエラーが表示されます。

```shell-session
# service collectd restart
Restarting statistics collection and monitoring daemon: collectdlt_dlopen (/usr/lib/collectd/apache.so) failed: file not found
lt_dlopen (/usr/lib/collectd/apache.so) failed: file not found
Unable to load plugin apache.
Found a configuration for the `apache' plugin, but the plugin isn't loaded or didn't register a configuration callback.
lt_dlopen (/usr/lib/collectd/apache.so) failed: file not found
lt_dlopen (/usr/lib/collectd/apache.so) failed: file not found
Unable to load plugin apache.
Found a configuration for the `apache' plugin, but the plugin isn't loaded or didn't register a configuration callback.
.
```

プラグインの実体である`apache.so`が見つからないと言われていますが、以下のように存在します。

```shell-session
# file /usr/lib/collectd/apache.so
/usr/lib/collectd/apache.so: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0f860725fd69ec754142c93f3cd66011b198d852, stripped
```

こういう場合はおおむねファイルの読み込みに失敗したときのエラーメッセージが「file not found」固定になっているというしょっぱい実装になっている可能性が高く、ファイルが存在しない以外の原因で失敗していることが考えられます。とはいえ何の手がかりも無いので原因究明の難度が高すぎます……

と思ったら、collectdのFAQにそのものずばりなものがありました。

https://collectd.org/faq.shtml#faq:missing_dependency
> I installed the Debian package of collectd. Now I get the error “lt_dlopen (foo.so) failed: file not found” – but the file exists!

「but the file exists!」という叫びに非常に共感を覚えますが、それはともかく、どうやらプラグインの依存ライブラリが全部そろっていないのが原因のようです。

`ldd`コマンドで調べろとあるのでapache.soの依存ライブラリを見てみます。

```shell-session
# ldd /usr/lib/collectd/apache.so
        linux-vdso.so.1 =>  (0x00007fff1b5c7000)
        libcurl-gnutls.so.4 => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ae41b0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8ae4784000)
```

libcurl-gnutls.so.4が「not found」になっているので、これが不足しているようです。
libcurl4-gnutlsはなぜかdevじゃないバージョンのパッケージが無かったのでdevを入れます。

```
apt-get install -y libcurl4-gnutls-dev
```

無事「not found」が無くなりました。依存ライブラリが激しく増えているのはlibcurl-gnutls.so.4の依存ライブラリのせいです。

```shell-session
# ldd /usr/lib/collectd/apache.so
        linux-vdso.so.1 =>  (0x00007fffb8963000)
        libcurl-gnutls.so.4 => /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 (0x00007f854ff06000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f854fb41000)
        libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007f854f90d000)
        librtmp.so.0 => /usr/lib/x86_64-linux-gnu/librtmp.so.0 (0x00007f854f6f3000)
        libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f854f473000)
        libgnutls.so.26 => /usr/lib/x86_64-linux-gnu/libgnutls.so.26 (0x00007f854f1b4000)
        libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f854ef6e000)
        liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f854ed5f000)
        libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f854eb0d000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f854e8f4000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f854e6d6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8550377000)
        libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f854e4d0000)
        libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f854e2bc000)
        libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f854e07a000)
        libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f854ddae000)
        libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f854db7f000)
        libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f854d97b000)
        libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f854d76f000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f854d554000)
        libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f854d339000)
        libgssapi.so.3 => /usr/lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007f854d0fa000)
        libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f854cef2000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f854ccee000)
        libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f854cae9000)
        libheimntlm.so.0 => /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007f854c8e0000)
        libkrb5.so.26 => /usr/lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007f854c657000)
        libasn1.so.8 => /usr/lib/x86_64-linux-gnu/libasn1.so.8 (0x00007f854c3b6000)
        libhcrypto.so.4 => /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007f854c183000)
        libroken.so.18 => /usr/lib/x86_64-linux-gnu/libroken.so.18 (0x00007f854bf6d000)
        libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007f854bd44000)
        libheimbase.so.1 => /usr/lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007f854bb35000)
        libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007f854b8ec000)
        libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f854b633000)
        libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f854b3f9000)
```

ということで無事apacheのメトリクスが取得できるようになりました。yumの方ではプラグインごとに別パッケージになっているようですが、こういうことにならない為だったわけですね。