らくがきちょう

なんとなく

CentOS7 に netdata をインストールしてリアルタイムでリソース監視する

知人に教えて頂いてサーバのリソース監視ツールである netdata を試してみたのでメモしておきます。 今回は CentOS7 環境で試しました。

注意点

関連ファイルをまとめておきたい場合はインストールパスを指定する

インストールパスを指定せずに netdata をインストルすると、関連ファイルが様々なディレクトリに配置されます。 「一箇所にまとめておきたい」場合はインストール時に --install オプションでインストールパスを明示的に指定するようにします。

自動アップロードを利用する場合はソースコードを削除せず、保存しておく

後述しますが cron を使って netdata の自動アップロードを行う場合はインストールが完了しても GitHub からクローンしたソースコードは削除せず、保存したディレクトリ位置も覚えておきます。

キックスタートでインストールするとインストールパスを指定出来ない

キックスタートスクリプトを使うと非常に手軽に、ワンライナーで netdata をインストールすることが可能です。 但し、キックスタートではインストールパスを選択するオプションが無いようで、デフォルトパスにインストールされてしまいます。 『デフォルトパスにインストールされても特に問題無い』場合には、キックスタートでインストールするのが簡単です。

自動インストールスクリプトを使ってインストールする

キックスタートスクリプトを使って自動インストールするには以下を実行するだけです。 しばらく待つだけで netdata そのものがインストールされるだけでなく、`/etc/cron.daily/netdata-updaterに自動アップデートスクリプトもインストールされます。--dont-waitオプションを指定しないと途中で一度、ENTERキーの入力を求められる為、今回は--dont-wait` オプションを指定しています。

bash <(curl -Ss https://my-netdata.io/kickstart.sh) all --dont-wait

手動でインストールする

以下ではキックスタートスクリプトを使わず、手動でインストールする手順を説明します。 この方法であればインストールパスを指定することが可能です。

インストールパラメータ

今回は以下のパラメータに従ってインストールを進めていきます。

項目
ソースコードの保存パス /opt/src/netdata/
インストールパス /opt/netdata/
アドレス 0.0.0.0/0
ポート 19999/TCP

依存関係のあるソフトウェアのインストール

netdata そのものをインストールする前に、依存関係のあるソフトウェアをインストールしておきます。

yum -y install epel-release
yum -y install \
  autoconf \
  automake \
  curl \
  gcc \
  git \
  libmnl-devel \
  libuuid-devel \
  lm-sensors \
  make \
  MySQL-python \
  nc \
  pkgconfig \
  python \
  python-psycopg2 \
  PyYAML \
  zlib-devel

netdata のインストール

GitHub からソースコードを取得します。 冒頭の 注意点 に記載しましたが、cron を使った自動アップデートを設定したい場合はインストールが完了してもソースコードは削除せず、ダウンロードしたディレクトリ位置も覚えておくようにします。 今回は /opt/src というディレクトリを作成し、ここにソースコードを保存することにしました。

mkdir -p /opt/src/
cd /opt/src/
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata

インストールパスを指定しない場合

インストールパスを指定せずにインストーラを起動してみます。

./netdata-installer.sh

すると、netdata は以下のディレクトリにインストールされます。

# ./netdata-installer.sh

  ^
  |.-.   .-.   .-.   .-.   .  netdata
  |   '-'   '-'   '-'   '-'   real-time performance monitoring, done right!
  +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->


  You are about to build and install netdata to your system.

  It will be installed at these locations:

   - the daemon     at /usr/sbin/netdata
   - config files   in /etc/netdata
   - web files      in /usr/share/netdata
   - plugins        in /usr/libexec/netdata
   - cache files    in /var/cache/netdata
   - db files       in /var/lib/netdata
   - log files      in /var/log/netdata
   - pid file       at /var/run/netdata.pid
   - logrotate file at /etc/logrotate.d/netdata

  This installer allows you to change the installation path.
  Press Control-C and run the same command with --help for help.

Press ENTER to build and install netdata to your system >

インストールパスを指定した場合 (/opt/netdata)

/opt/netdata にインストールする場合は --install /opt オプションを指定します。 netdata ディレクトリは自動的に作成される為、--install /opt としてすれば /opt/netdata ディレクトリにインストールされることになります。 通常、netdata-installer.sh を実行した場合はインストール予定のパス一覧が表示され、問題が無ければ ENTER を押すことでインストールを続行、Ctrl + C を押すことで中止することが出来ます。

# ./netdata-installer.sh --install /opt

  ^
  |.-.   .-.   .-.   .-.   .  netdata
  |   '-'   '-'   '-'   '-'   real-time performance monitoring, done right!
  +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->


  You are about to build and install netdata to your system.

  It will be installed at these locations:

   - the daemon     at /opt/netdata/usr/sbin/netdata
   - config files   in /opt/netdata/etc/netdata
   - web files      in /opt/netdata/usr/share/netdata
   - plugins        in /opt/netdata/usr/libexec/netdata
   - cache files    in /opt/netdata/var/cache/netdata
   - db files       in /opt/netdata/var/lib/netdata
   - log files      in /opt/netdata/var/log/netdata
   - pid file       at /opt/netdata/var/run/netdata.pid
   - logrotate file at /etc/logrotate.d/netdata

  This installer allows you to change the installation path.
  Press Control-C and run the same command with --help for help.

Press ENTER to build and install netdata to '/opt/netdata' >

ENTER を入力せず、非対話的にインストールする為には --dont-wait オプションも付与します。

./netdata-installer.sh --dont-wait --install /opt

起動&自動起動の設定

今回、インストールした際は systemd にも登録されており、起動&自動起動設定もされていました。 --dont-start-it オプションを指定してインストールした場合はインストール後に netdata が起動されません。 こういった場合に手動で起動&自動起動設定を行う場合は以下のように設定します。

systemctl daemon-reload
systemctl enable netdata
systemctl start netdata

初期設定では 19999/TCP を Listen する

初期設定のままだと netdata は「全てのインターフェイス (*) の TCP/19999」を Listen します。 lsof で確認すると以下のように表示されます。

# lsof -i tcp:19999
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
netdata 5423 netdata    3u  IPv4  29025      0t0  TCP *:dnp-sec (LISTEN)
netdata 5423 netdata    4u  IPv6  29026      0t0  TCP *:dnp-sec (LISTEN)

Listen するアドレス / ポートの設定を変更するには /opt/netdata/etc/netdata/netdata.conf[web] セクションにある default portbind to 設定を修正します。 初期状態では以下のようにコメントアウトされています。

変更前

[web]
        # mode = multi-threaded
        # listen backlog = 4096
        # default port = 19999
        # bind to = *

例えば『127.0.0.1:8080』を Listen するように変更する場合は以下のように修正します。

変更後

[web]
        # mode = multi-threaded
        # listen backlog = 4096
        default port = 8080
        bind to = 127.0.0.1

設定ファイルの修正が完了したら netdata を再起動し、変更を反映します。

systemctl restart netdata.service

これで設定が反映されました。 lsofTCP/8080 を Listen しているプロセスを確認すると netdata になっていることが分かります。

# lsof -i tcp:8080
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
netdata 5856 netdata    3u  IPv4  32797      0t0  TCP 172-020-000-166:webcache (LISTEN)

ログ・ローテーションの設定

インストールする以下のように、ログ・ローテーションも設定されていました。

# cat /etc/logrotate.d/netdata
/var/log/netdata/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
                /bin/kill -HUP `pidof netdata 2>/dev/null` 2>/dev/null || true
        endscript
}

自動アップデートの設定

GitHub からクローンしたソースコードの中には netdata をアップデートするスクリプトも含まれています。 これを cron に設定することで自動的に netdata をアップデートさせることが出来ます。 毎朝 6:00 に netdata のアップデートを確認 / アップデートがあれば更新するには /etc/cron.d/netdata-updater を以下の内容で新規作成します。

0 6 * * * /opt/src/netdata/netdata-updater.sh

自動アップデートが上手く起動していない場合は直接、netdata-updater.sh を実行して、結果を確認します。 下記の例ではアップデートが無い為、Nothing to be done! と表示され、スクリプトが正常終了しています。

# /opt/src/netdata/netdata-updater.sh
Fri Nov  3 16:10:21 JST 2017 : INFO:  Running on a terminal - (this script also supports running headless from crontab)

Fri Nov  3 16:10:21 JST 2017 : INFO:  Updating netdata source from github...
Already up-to-date.
Fri Nov  3 16:10:22 JST 2017 : INFO:  Nothing to be done! (use -f to force re-install)

ブラウザでアクセスする

netdata は初期設定のままであれば 19999/TCP を Listen しますので、Web ブラウザから「http://xxx.xxx.xxx.xxx:19999」にアクセスします。 netdata が正常にインストールされていれば以下のように表示されるはずです。

f:id:sig9:20171103163748p:plain

参考

/opt/netdata へインストールするスクリプト

現状のキックスタートスクリプトにはインストールパスを指定出来るオプションが無いらしく、インストールパスを指定出来ません。 インストールパスを指定してインストールするには以下のようなスクリプトを使います。 (手抜きしたので…) このスクリプトでは /opt/netdata ディレクトリ決め打ちで netdata をインストールします。 下記の内容を install-netdata.sh のような名前で作成し、/bin/sh ./install-netdata.sh のように実行します。

#!/bin/sh

echo '### Install dependencies.'
yum -y install epel-release
yum -y install \
  autoconf \
  automake \
  curl \
  gcc \
  git \
  libmnl-devel \
  libuuid-devel \
  lm-sensors \
  make \
  MySQL-python \
  nc \
  pkgconfig \
  python \
  python-psycopg2 \
  PyYAML \
  zlib-devel

echo '### Clone from GitHub.'
mkdir -p /opt/src/
cd /opt/src/
git clone https://github.com/firehol/netdata.git --depth=1

echo '### Install netdata.'
cd /opt/src/netdata
./netdata-installer.sh --dont-wait --install /opt

echo '### Configure auto-update.'
echo "0 6 * * * /opt/src/netdata/netdata-updater.sh" > /etc/cron.d/netdata-updater

echo '### Installed.`

netdata-installer.sh のヘルプ表示

netdata-installer.sh のヘルプ表示は以下の通りです。 『netdata をインストールするがデーモンは開始しない』等、幾つかのオプションが用意されています。

# ./netdata-installer.sh --help

  ^
  |.-.   .-.   .-.   .-.   .-.   .  netdata                          .-.   .-
  |   '-'   '-'   '-'   '-'   '-'   installer command line options  '   '-'
  +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->


./netdata-installer.sh <installer options>

Valid <installer options> are:

   --install /PATH/TO/INSTALL

        If you give: --install /opt
        netdata will be installed in /opt/netdata

   --dont-start-it

        Do not (re)start netdata.
        Just install it.

   --dont-wait

        Do not wait for the user to press ENTER.
        Start immediately building it.

   --auto-update | -u

        Install netdata-updater to cron,
        to update netdata automatically once per day
        (can only be done for installations from git)

   --enable-plugin-freeipmi
   --disable-plugin-freeipmi

        Enable/disable the FreeIPMI plugin.
        Default: enable it when libipmimonitoring is available.

   --enable-plugin-nfacct
   --disable-plugin-nfacct

        Enable/disable the nfacct plugin.
        Default: enable it when libmnl and libnetfilter_acct are available.

   --enable-lto
   --disable-lto

        Enable/disable Link-Time-Optimization
        Default: enabled

   --zlib-is-really-here
   --libs-are-really-here

        If you get errors about missing zlib,
        or libuuid but you know it is available,
        you have a broken pkg-config.
        Use this option to allow it continue
        without checking pkg-config.

Netdata will by default be compiled with gcc optimization -O2
If you need to pass different CFLAGS, use something like this:

  CFLAGS="<gcc options>" ./netdata-installer.sh <installer options>

For the installer to complete successfully, you will need
these packages installed:

   gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
   uuid-dev (or libuuid-devel)

For the plugins, you will at least need:

   curl, bash v4+, python v2 or v3, node.js

キックスタートでインストールされる自動アップデートスクリプト

キックスタート(自動インストールスクリプト)を使った場合にインストールされる自動アップデートスクリプト /etc/cron.daily/netdata-updater は以下の内容になっていました。

#!/usr/bin/env bash

force=0
[ "${1}" = "-f" ] && force=1

export PATH="${PATH}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
export CFLAGS="-O2"
export NETDATA_CONFIGURE_OPTIONS=""

# make sure we have a UID
[ -z "${UID}" ] && UID="$(id -u)"
INSTALL_UID="0"
if [ "${INSTALL_UID}" != "${UID}" ]
    then
    echo >&2 "This script should be run as user with uid ${INSTALL_UID} but it now runs with uid ${UID}"
    exit 1
fi

# make sure we cd to the working directory
cd "/usr/src/netdata.git" || exit 1

# make sure there is .git here
[ ${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: /usr/src/netdata.git (use -f for force re-install)" && exit 1

# signal netdata to start saving its database
# this is handy if your database is big
pids=$(pidof netdata)
[ ! -z "${pids}" ] && kill -USR1 ${pids}

tmp=
if [ -t 2 ]
    then
    # we are running on a terminal
    # open fd 3 and send it to stderr
    exec 3>&2
else
    # we are headless
    # create a temporary file for the log
    tmp=$(mktemp /tmp/netdata-updater.log.XXXXXX)
    # open fd 3 and send it to tmp
    exec 3>${tmp}
fi

info() {
    echo >&3 "$(date) : INFO: " "${@}"
}

emptyline() {
    echo >&3
}

error() {
    echo >&3 "$(date) : ERROR: " "${@}"
}

# this is what we will do if it fails (head-less only)
failed() {
    error "FAILED TO UPDATE NETDATA : ${1}"

    if [ ! -z "${tmp}" ]
    then
        cat >&2 "${tmp}"
        rm "${tmp}"
    fi
    exit 1
}

get_latest_commit_id() {
        git rev-parse HEAD 2>&3
}

update() {
    [ -z "${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)"

    emptyline

    if [ -d .git ]
        then
        info "Updating netdata source from github..."

        last_commit="$(get_latest_commit_id)"
        [ ${force} -eq 0 -a -z "${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)"

        git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)"

        new_commit="$(get_latest_commit_id)"
        if [ ${force} -eq 0 ]
            then
            [ -z "${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)"
            [ "${new_commit}" = "${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0
        fi
    elif [ ${force} -eq 0 ]
        then
        failed "CANNOT FIND GIT STRUCTURES IN $(pwd) (use -f for force re-install)"
    fi

    emptyline
    info "Re-installing netdata..."
    ./netdata-installer.sh -u  --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA"

    [ ! -z "${tmp}" ] && rm "${tmp}" && tmp=
    return 0
}

# the installer updates this script - so we run and exit in a single line
update && exit 0
###############################################################################
###############################################################################