Cactiの設定方法



●Cactiとは

 cactiはフリーソフトウェアです。
 cactiという良さげなページもあります。
 cactiの概要については下記のとおりです。
MRTGの代替ツール
グラフツールというとMRTGが有名ですね。cactiもMRTGと同じように、SNMPエージェントが取得した値や、プログラム/スクリプトの出力結果をグラフ化することが出来ます。MRTGよりも優れている点はいくつもありますが、まずはその操作性を体験してみましょう。ホストの追加やインタフェースの追加など、全てWEBのGUIを通してコンフィグレーション可能なので、慣れるととても楽です。
RRDToolのGUIフロントエンド
cactiはグラフデータの保存やグラフ生成に、MRTGより高機能なRRDToolを使っています。cactiではRRDToolの複雑なコマンドラインオプションと格闘することなく、RRDToolの便利な機能を使うことが出来ます。

cactiの利点

機器やインタフェースの追加・変更が簡単
ネットワーク機器の追加や変更があった場合、WEBのインタフェースから入力・クリックしますだけで新しいグラフを簡単に追加できること。それに、ルータのインタフェースが追加・削除されたときもクリックしますだけでグラフを更新出来てしまう。サブインタフェースを追加・削除したときも同じです。いちど使い始めると、このお手軽さがたまりません。
過去のグラフを参照できる
グラフの表示期間を指定することで、先週のグラフや昨日のグラフなど、過去にさかのぼってグラフを閲覧することが出来ます。
ベンダ特有のMIBも簡単に使える
ネットワーク機器によっては、ベンダ特有のMIBが提供されている場合があります。cactiなら、ベンダ特有のMIBもcactiで標準に対応しているインタフェースMIBと同じように使うことが出来ます。ベンダ特有のMIBをリストから選択してグラフ作成、といったことも可能です。これをするには、ちょっとしたXMLの設定ファイルを書いてあげる必要があるんですけどね。
ユーザ管理ができる
コンフィグレーションの変更といった全ての権限を持った管理者ユーザや、グラフを見ることしか出来ない一般ユーザといった具合に、ユーザごとの権限を管理することができます。しかも、ユーザ権限をグラフやネットワーク機器毎に設定できるので、ユーザによって見せるグラフを変えることが出来ます。ちなみに、LDAPを使ったユーザ管理にも対応しています。
グラフを分類して管理できる
作成される沢山のグラフをネットワーク機器の機種や用途などで分類し、ツリー構造で管理することが出来ます。これもHTMLファイルを修正したり、ディレクトリを作ったりする作業は必要なく、WEBのGUIからクリック・入力することで簡単に管理できます。
cactiを動かすために必要なもの
おなじみのフリーソフトウェア/オープンソースプロダクトが必要になります。
Apache <http://httpd.apache.org/>
PHP <http://www.php.net>
MySQL <http://www.mysql.com/>
RRDTool <http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/>
NET-SNMP <http://www.net-snmp.org/>
cacti <http://www.cacti.net/>

●yum-prioritiesのインストールと設定

 2019年6月時点では、この作業は不要です。2016年7月20日頃からRPMforgeのサーバに接続できなくなっています。

 yum-prioritiesをインストールし、設定します。
 RPMforgeリポジトリを導入して、標準リポジトリで提供されないパッケージをyumでインストールできるようにします。
 なお、標準リポジトリとRPMforgeリポジトリの両方で提供されるパッケージについて、yum-prioritiesプラグインを導入して標準リポジトリのパッケージがRPMforgeリポジトリのパッケージで上書きされてしまわないようにします。
# yum -y install yum-priorities
# vi /etc/yum.repos.d/CentOS-Base.repo ← CentOSにインストールしたので設定追加
 [base]など各設定セクションの最後に次の1行を追加します。
priority=1

●RPMforgeダウンロードとインストールと設定

 2019年6月時点では、この作業は不要です。2016年7月20日頃からRPMforgeのサーバに接続できなくなっています。

 RPMforgeをダウンロードし、インストール、設定します。
# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
または
# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
# yum -y update rpmforge-release ← rpmforge-releaseアップデート
 ※64ビット版や異なるバージョンを使用する場合は、下記のURLにアクセスしてファイルを取得して下さい。
http://pkgs.repoforge.org/rpmforge-release/

●非公式レポジトリDAG設定ファイルの作成

 2019年6月時点では、この作業は不要です。

 非公式レポジトリDAGを新規作成します。
# vi /etc/yum.repos.d/dag.repo
[dag]
name=RPMForge: Dag
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY.dag.txt
enabled=1

●GPG公開鍵のインポート

 2019年6月時点では、この作業は不要です。

 GPG公開鍵をインポートします。
# rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
# rpm --import http://centos.karan.org/RPM-GPG-KEY-karan.org.txt
# rpm --import http://kde-redhat.sourceforge.net/gpg-pubkey-ff6382fa-3e1ab2ca
# rpm --import http://ATrpms.net/RPM-GPG-KEY.atrpms
# rpm --import http://www.jpackage.org/jpackage.asc

●yumデータベースの初期化

 2019年6月時点では、この作業は不要です。

 yumデータベースを初期化します。
# yum clean all


●SELinuxの無効化

 SELinuxを無効化します。
# vi /etc/selinux/config
SELINUX=disabled
 設定を反映させるため、サーバを再起動します。
 SELinuxの設定方法については「●SELinuxの無効化・有効化」を参照してください。

●Firewallの無効化

 Firewallを無効化します。
# systemctl stop firewalld
# systemctl disable firewalld
 Firewallの設定方法については「Firewalldの設定方法」を参照してください。

●TCP Wrapper及びIPTABLESの除外設定

 2019年6月時点では、この作業は不要です。

 TCP WrapperやIPTABLESを利用している場合には、SNMPが利用できるように除外設定する必要があります。

 TCP Wrapperでの除外設定
# vi /etc/hosts.allow
snmpd : ALL ← 全ホストから接続可能
snmpd : 127.0.0.1、192.168.0.
 ↑ 127.0.0.1及び192.168.0.xにマッチするホストから接続可能

 IPTABLESでの除外設定
# vi /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 161 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT
 iptablesを再起動、設定を保存します。
# service iptables restart ← 再起動
# service iptables save ← 設定の保存


●Cactiインストールに必要なパッケージをインストール

 Cactiインストールに必要なパッケージをインストールします。
# yum -y install httpd php php-mysql php-snmp mariadb mariadb-server net-snmp rrdtool cacti
 Apache+PHPMySQLまたはMariaDBが必要です。それらの設定についてはここでは説明しませんので、事前にインストール・設定を完了しておいてください。

●Spine(Cactid)

 Spineのインストールが必要な場合はインストールします。
# yum -y install gcc gcc-c++ openssl-devel mariadb-devel net-snmp-devel help2man cacto-spine


 下記の作業は古い方法です。 
 https://www.cacti.net/downloads/spine/からダウンロードできます。
 make時にエラーが出力されたため、あらかじめ必要なパッケージをインストールします。
# yum -y install gcc gcc-c++ openssl-devel mariadb-devel net-snmp-devel help2man
# cd /usr/local/src
# tar zxvf cacti-spine-1.1.36.tar.gz
# cd cacti-spine-1.1.36/
# ./configure
# make
# make install
 Cactiの画面からログインし、[設定]-[パス]でspineのパスが通っていることを確認します。

 以上で作業は完了です。




 Cactiはデフォルトではcmd.phpというスクリプトを5分ごとに実行(設定ファイル/etc/cron.d/cacti)し、ターゲットからデータを収集(ポーリング)します。
大量の機器からデータを収集する場合、cmd.phpでは5分以内にすべての収集を終えることができない場合があります。
Spine(0.8.7からCactidはSpineと名付けられました)を使用するとデータ収集が高速化され、大量機器のポーリングも可能となります。
ターゲット(対象機器)が50を超えるような場合は、Spineを使用すると良い。
 Spineのインストールは「●グラフが途切れて表示される」を参照してください。
 実際には下記のような作業になります。
$ wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.8h.tar.gz
$ tar zxvf cacti-spine-0.8.8f.tar.gz
$ cd cacti-spine-0.8.8f
$ ./configure
$ make
# make install
# vi /usr/local/spine/etc/spine.conf    # DBにアクセスできるようにユーザとパスワードを設定
# /usr/local/spine/bin/spine -C /usr/local/spine/etc/spine.conf
SPINE: Using spine config file [/usr/local/spine/etc/spine.conf]
SPINE: Version 0.8.8h starting
cacti@127.0.0.1's password: (パスワードを入力)
SPINE: Time: 24.4985 s, Threads: 1, Hosts: 7


●プラグイン

 Cacti Usersで提供されているTholdプラグインを使用すると、取得したデータに対して閾値(Threshold)を設け、アラートメールを送信することができます。 Device(Host)ダウン、リカバリ時にもメールを送信します。このプラグインを利用してCactiに監視機能を追加します。
 0.8.7からTholdプラグインはTholdとSettingsに分かれたようです。Settingsプラグインのドキュメントがないため詳細はわかりませんが、これまで(0.8.6まで)と同様の使い方をする場合はインストールが必要です。
 また、Cacti管理コンソールからCactiおよびプラグインの最新バージョンを確認できるUpdateプラグインもあわせてインストールします。

 Plugin Architecture

 Cacti Usersのプラグインを使用するには、Cactiにパッチを適用する必要があります。Cacti UsersサイトからPlugin Architectureをダウンロードし、パッチを適用します。

●Net-SNMPの設定

 SNMPは「SNMPとは」に詳しく説明されています。

 net-snmpをインストールします。
# dnf install net-snmp net-snmp-utils net-snmp-devel -y
 Net-SNMP設定ファイルを編集します。
# vi /etc/snmp/snmpd.conf
#       sec.name  source          community
#com2sec notConfigUser  default       public ← コメントアウト
com2sec local localhost private ← 追加
com2sec mynetwork 192.168.1.0/24 public
 ↑ 追加(ネットワークアドレスは各自の環境に合わせること)
 セキュリティ名は接続元およびコミュニティ名の組み合わせを定義したもので、ここではlocalhostからの接続を「local」というセキュリティ名で、192.168.1.0/24からの接続を「mynetwork」というセキュリティ名で参照するよう指定しています。コミュニティ名はそれぞれ「private」、「public」と指定していますが、実際に設定を行う場合は適切な文字列に置き換えてほしい。
#       groupName      securityModel securityName
#group   notConfigGroup v1c           notConfigUser ← コメントアウト
#group   notConfigGroup v2c           notConfigUser ← コメントアウト
group MyROGroup v1 local ← 追加
group MyROGroup v2c local ← 追加
group MyROGroup v1 mynetwork ← 追加
group MyROGroup v2c mynetwork ← 追加
 1つ以上のセキュリティ名をまとめた「グループ」を定義する。これは「group」行で定義できます。ここでは「MyROGroup」というグループに先ほど作成したlocalやmynetworkを所属させるよう設定しています。
 このとき、セキュリティ名とともにSNMPの「セキュリティモデル」を指定する必要があります。ここでは「v1」、「v2c」を指定しています。
# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
#view    systemview    included   .1.3.6.1.2.1.1
 ↑ コメントアウト
#view    systemview    included   .1.3.6.1.2.1.25.1.1
 ↑ コメントアウト
view all included .1 80 ← 追加
 「view」行ではSNMPで取得できる情報の範囲(ビュー)を定義できます。ここではすべてのデータにアクセスできる「all」というビューを定義しています。
# Finally、grant the group read-only access to the systemview view.
#       group          context sec.model sec.level prefix read   write  notif
#access  notConfigGroup ""      any       noauth    exact  systemview none none
 ↑ コメントアウト
access MyROGroup "" any noauth exact all none none ← 追加
access MyRWGroup "" any noauth exact all all none ← 追加
 「access」行でグループとビューの関連付けを行う。ここではMyROGroupにallというビューを関連付けている。これにより、すべての情報を認証無しで取得できるようになる。
# Check the / partition and make sure it contains at least 10 megs.
#disk / 10000
disk / 10000 ← 追加(ディスク使用率表示用設定)
 最低10MBになったらsyscontactに通知 disk /boot // 最低10%になったら通知したければ、10%と追記

●Net-SNMP起動

 Net-SNMPを起動します。
# systemctl enable --now snmpd

or

# /etc/rc.d/init.d/snmpd start ← Net-SNMP起動
snmpd を起動中:                                            [  OK  ]
# chkconfig snmpd on ← Net-SNMP自動起動設定
# chkconfig --list snmpd ← Net-SNMP自動起動設定確認
snmpd   0:off   1:off   2:on   3:on   4:on   5:on   6:off
 ↑ ランレベル2~5のon確認
 これでSNMPを使用できます。

●SNMPの動作確認

 SNMPの設定が完了したら、SNMPが問題なく動作しているか確認します。
 SNMPで調査用によく利用するのは「snmpwalk」と「snmpget」です。
snmpwalk
OIDまたはMIBシンボルを入力すると、そのOIDツリー以下を展開して表示するコマンド。
snmpget
OIDまたはMIBシンボルを入力すると、そのOIDツリーに相当するオブジェクトの値を表示するコマンド。
 SNMPコマンドの主な共通オプションは下記のとおりです。
オプション 説明
-a 認証方式 SNMPv3の認証方法を設定します。MD5またはSHAです。
-A パスワード SNMPv3における認証パスワード指定します。
-c コミュニティ名 SNMPv1/SNMPv2cにおけるコミュニティ名を指定します。
-l セキュリティレベル SNMPv3において用いるセキュリティレベル。noAuthNoPriv(認証も暗号化もしない)、authNoPriv(認証するが暗号化はしない)、authPriv(認証も暗号化もする)のいずれかになります。
-x 暗号化プロトコル セキュリティレベルがauthPrivである場合に用いる暗号化プロトコル。DESかAESのいずれかになります。
-X 暗号化パスワード セキュリティレベルがauthPrivである場合に用いる暗号化パスワードです。
-v バージョン番号 SNMPバーションを指定する。「1」「2c」「3」のいずれかになります。
-O 表示オプション 表示オプションを指定する。例えば、「-On(OIDで出力する)」や「-Os(MIDシンボルで表示する」などがあります。

 確認方法は下記のとおりです(public及びprivateは設定したコミュニティ名です)。
※ローカルホスト上で確認
# snmpget -v1 -c public <ホスト名> .1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux <ホスト名>.bigbang.mydns.jp 2.6.32-71.29.1.el6.i686 #1 SMP Mon Jun 27 18:07:00 BST 2011 i686
# snmpget -v1 -c public <ホスト名> .1.3.6.1.2.1.1.4.0
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
# snmpwalk -v2c -c private localhost system 
SNMPv2-MIB::sysDescr.0 = STRING: Linux <ホスト名>.bigbang.mydns.jp 3.10.0-229.7.2.el7.x86_64 #1 SMP Tue Jun 23 22:06:11 UTC 2015 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (5878573) 16:19:45.73
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)

※リモートホストから確認
# snmpget -v1 -c public <調査対象ホスト名> .1.3.6.1.2.1.1.1.0
# snmpwalk -v2c -c public <調査対象ホスト名> system
 「コマンドがありません」というようなメッセージが表示された場合は「net-snmp-utils」をインストールしてください。
# dnf -y install net-snmp-utils

or

# yum -y install net-snmp-utils


●Cactiの設定

 Cacti用MySQL(または、MariaDB)データベース作成。
# mysql -u root -p ← MySQL(または、MariaDB)へrootでログイン
Enter password: ← MySQL(または、MariaDB)のrootパスワード応答
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 617
Server version: 5.1.52 Source distribution
Copyright (c) 2000、2010、Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database cacti; ← Cacti用データベース作成
Query OK、1 row affected (0.00 sec)
mysql> grant all privileges on cacti.* to cactiuser@localhost identified by '任意のパスワード';
 ↑ Cacti用データベースアクセスユーザ登録
Query OK、0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK、0 rows affected (0.00 sec)
mysql> exit ← MySQL(または、MariaDB)からログアウト
Bye
# mysql -u cactiuser -p cacti < /var/www/cacti/cacti.sql
または
# mysql -u cactiuser -p cacti < /usr/share/doc/cacti-1.2.3/cacti.sql
 ↑ Cacti用データベース初期化
Enter password: ← Cacti用データベースアクセスユーザのパスワード応答
 Cactiを設定します。
# vi /var/www/cacti/include/config.php ← Cactiデータベース設定ファイル編集
または
# vi /usr/share/cacti/include/config.php
(/usr/share/cacti/include/config.php -> /etc/cacti/db.php)
$database_type     = 'mysql';
$database_default  = 'cacti'; ← 必要に応じて変更
$database_hostname = 'localhost'; ← 必要に応じて変更
$database_username = 'cactiuser'; ← 必要に応じて変更
$database_password = 'cactiuser'; ← 必要に応じて変更
$database_port     = '3306';


●php.iniの設定

  php.iniを設定します。
# vi /etc/php.ini
下記部分を修正
date.timezone = 'Asia/Tokyo'
# /etc/rc.d/init.d/httpd restart


●cacti.confの編集

 Apacheを設定します。
# vi /etc/httpd/conf.d/cacti.conf ← Cacti用Apache設定ファイル編集
(下記はapache 2.2の設定例)
#Alias /cacti/ /var/www/cacti/
#<Directory /var/www/cacti/>
Alias /cacti/ /var/www/cacti/
<Directory /var/www/cacti/>
        DirectoryIndex index.php
        Options -Indexes
        AllowOverride all
        order deny,allow
        deny from all
        allow from 127.0.0.1
        allow from 192.168.1.0/24 ← 追加(内部からCactiにアクセスできるようにする)
        allow from xxx.xxx.xxx.0/24 ← 追加(インターネットからのCactiへのアクセスは限定する)
        AddType application/x-httpd-php .php
        php_flag magic_quotes_gpc on
        php_flag track_vars on
</Directory>
または
(下記はapache 2.4の設定例)
Alias /cacti    /usr/share/cacti
<Directory /usr/share/cacti/>
        <IfModule mod_authz_core.c>
                # httpd 2.4
                Require host localhost
                Require ip 192.168.1. ← 追加(内部からCactiにアクセスできるようにする)
                Require ip xxx.xxx.xxx. ← 追加(インターネットからのCactiへのアクセスは限定する)
        </IfModule>
        <IfModule !mod_authz_core.c>
                # httpd 2.2
                Order deny,allow
                Deny from all
                Allow from localhost
        </IfModule>
</Directory>
# systemctl reload httpd ← Apache設定反映


●MySQL(または、MariaDB)タイムゾーン等の設定

 MySQL(または、MariaDB)のタイムゾーンやmax_heap_table_size等を設定します。
 これを設定しないとGUIでの初期設定でWarningとなります。
# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Enter password: 
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
 Warningが出力されますが無視して問題ありません。
 MySQL(または、MariaDB)でcacti用に作成したユーザ(cactiuser)でタイムゾーンを読み取れるように設定します。
# mysql -u root -p
Enter password:
MariaDB [(none)]> grant select on mysql.time_zone_name to 'cactiuser'@'localhost' identified by '(cactiuser のパスワード)';
MariaDB [(none)]> exit
# mysql -u cactiuser -p
Enter password:
MariaDB [(none)]> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
MariaDB [(none)]> exit
 上記のように表示されれば問題ありません。
 server.cnfを設定します。
# vi /etc/my.cnf.d/server.cnf
[mysqld]
default-time-zone = 'Asia/Tokyo'
collation-server = utf8mb4_unicode_ci
character-set-client = utf8
character-set-server = utf8mb4
innodb_additional_mem_pool_size=80M
innodb_buffer_pool_size=3888M
innodb_doublewrite=OFF
innodb_file_format=Barracuda
innodb_file_per_table=ON
innodb_flush_log_at_trx_commit=2
innodb_large_prefix=1
join_buffer_size=512M
max_heap_table_size=412M
max_allowed_packet=16777216
tmp_table_size=256M
wait_timeout=14400
 MySQL(または、MariaDB)を再起動します。
# systemctl restart mysqld
# systemctl status mysqld
または
# systemctl restart mariadb
# systemctl status mariadb

 Cactiを初期設定します。Webブラウザからhttp://サーバ名/cacti/へアクセスします。
cacti_01.jpg

 [Next]をクリックします。

cacti_02.jpg

 [New Install]のまま[Next]をクリックします。

cacti_03.jpg

 各種コマンドへのパスが[FOUND]と表示されていることを確認して[Finish]をクリックします。

cacti_04.jpg

 User Nameに「admin」、Passwordに「admin」と入力して[Login]をクリックします。

cacti_05.jpg

 Passwordに任意の管理者パスワード、confirmに同じパスワードを入力して[Save]をクリックします。

cacti_06.jpg

 [Settings]をクリックします。
 SNMP Versionで「Version 1」を選択
 SNMP Communityに「private」と入力
 [save]をクリックします。

ネットワークトラフィックグラフ追加

 consoleタブ
 Devices⇒Localhost⇒Associated Data QueriesのAdd Data Query:でSNMP - Interface Statisticsを選択してadd
 New Graphs⇒Data Query [SNMP - Interface Statistics]-任意のName(IF-MIB)(例:eth0)をチェックしてcreate

ディスク使用状況グラフ追加

 consoleタブ
 New Graphs⇒Data Query [Unix - Get Mounted Partitions]-任意のMount Pointをチェックしてcreate

CPU使用率グラフ追加

 consoleタブ
 Devices⇒Localhost⇒Associated Graph TemplatesのAdd Graph Template:でucd/net - CPU Usageを選択してadd
 New Graphs⇒Graph TemplatesのCreate: ucd/net - CPU Usageをチェックしてcreate

不要グラフ削除

 consoleタブ
 Graph Management
 削除したいグラフ(例:Localhost - Logged in Users)をチェック
 Choose an action:でDeleteを選択してgo

●Cactiの設定確認

 約10分後graphsタブをクリックしてグラフが表示されることを確認します。

●HTML作成

 公開用にグラフをHTML化します。cactiのインストール先が/usr/share/cactiである場合、下記の作業は必要ありません。

Apache設定
# mkdir /var/www/cactihtml ← HTML作成先ディレクトリ作成
# chown cacti:cacti /var/www/cactihtml/ ← HTML作成先ディレクトリ所有者変更
# echo Alias /cactihtml /var/www/cactihtml > /etc/httpd/conf.d/cactihtml.conf
 ↑ Apache設定ファイル作成
# /etc/rc.d/init.d/httpd reload ← Apache設定反映
httpd を再読み込み中:                                      [  OK  ]

Cacti設定

 Webブラウザからhttp://サーバ名/cacti/へアクセスします。
 consoleタブ
 Settings
 Graph Export
 Export MethodでClassic(local path)を選択
 Export Directory(both local and ftp)に/var/www/cactihtmlと入力
 Export timingでClassic(export every x times)を選択
 save

●HTML確認

 約10分後Webブラウザからhttp://サーバー名/cactihtml/へアクセスしてグラフが表示されることを確認。

●デバイス(ホスト)の登録

 新規デバイス(ホスト)の登録方法は下記のようにします。
 [console]タブをクリック。
 Create->[New Graphs]リンクをクリック。
 [Create New Host]リンクをクリック。
 Devices->[Description]に 説明 を入力。
 Descriptionはグラフのヘッダに表示されます。Hostnameとあわせて登録してもよいと思います。
 Devices->[Hostname]に ホスト名(FQDN) または IPアドレス を入力。
 Devices->[Host Template]プルダウンメニューから
   Linuxの場合:「ucd/net SNMP Host」
   Windowsの場合:「Windows 2000/XP Host」
 を選択。
 SNMP Options->[SNMP Community]で
   Linuxの場合:private
   Windowsの場合:●CactiでのWindows監視で指定したコミュニティ名
を入力。
 [create]ボタンをクリック。
 実行後、SNMP Informationが表示されていればSNMP接続は問題ありません。SNMP接続エラーは赤字で SNMP error と表示されます。
 [Create Graphs for this Host]リンクをクリック。
 Graph Templates、Data Queryのチェックボックスをすべてチェック。
 チェックすると該当項目がオレンジ色に反転します。
 [create]ボタンをクリック

●グラフの登録

 Cactiはデバイス(ホスト)の登録とともにグラフ表示設定を行う必要があります。データ収集(ホスト登録)とグラフ表示の機能が独立しているため、柔軟にグラフを表示することができます。このあたりがMRTGとの大きな違い(メリット)です。

 新規にツリーを作成し、その中にホストを追加する場合

 [console]タブをクリック。
 Management->[Graph Trees]リンクをクリック。
 Graph Trees右の[Add]リンクをクリック。
 Graph Trees->[Name]に グラフツリー名 を入力。
 ホスト登録時のDescriptionとあわせると管理がしやすいと思います。
 [create]ボタンをクリック。
 Tree Items右の[Add]リンクをクリック。
 Tree Items->[Tree Item Type]プルダウンメニューから Host を選択。
 Tree Item Value->[Host]プルダウンメニューから 登録したホスト を選択。
 [create]ボタンをクリック。

 このまましばらくたてば、データ収集が行われグラフを表示([graphs]タブをクリックして表示)することができるようになります。

 既存ツリーにホストを追加する場合

 [console]タブをクリック。
 Management->[Graph Trees]リンクをクリック。
 Graph Trees内の既存Nameをクリック。
 Tree Items右の[Add]リンクをクリック。
 Tree Items->[Tree Item Type]プルダウンメニューから Host を選択。
 Tree Item Value->[Host]プルダウンメニューから 登録したホスト を選択。
 [create]ボタンをクリック。

 このまましばらくたてば、データ収集が行われグラフを表示([graphs]タブをクリックして表示)することができるようになります。

 既存ツリーに新たなツリーを入れ子にする場合

 [console]タブをクリック。
 Management->[Graph Trees]リンクをクリック。
 Graph Trees内の既存Nameをクリック。
 Tree Items右の[Add]リンクをクリック。
 Tree Items->[Tree Item Type]プルダウンメニューから Header を選択。
 Tree Item Value->[Title]に 新たなツリー名 を記載。
 [create]ボタンをクリック。

 入れ子になったツリーにホスト追加する場合

 [console]タブをクリック。
 Management->[Graph Trees]リンクをクリック。
 Graph Trees内の既存Nameをクリック。
 Tree Items右の[Add]リンクをクリック。
 Tree Items->Item->[既存ツリー名(Add)]の Add をクリック。
 Tree Items->[Tree Item Type]プルダウンメニューから Host を選択。
 Tree Item Value->[Host]プルダウンメニューから 登録したホスト を選択。
 [create]ボタンをクリック。

●Load Averageのグラフ表示変更について

 Load Averageのグラフ表示はデフォルトで塗り潰し、かつ、結果を上に積み上げる状態で表示されるので少し見難いことからGraph Templatesを変更します。
 Templates->[Graph Template]->[ucd/net - Load Average]
 Item # 1でGraph Item TypeをAREAからLINE1に変更し、Saveをクリックします。
 同様にItem # 3及びItem # 5もSTACKからLINE1に変更します。
 変更後、グラフを表示させて変更されていることを確認します。

●グラフの削除

 不必要なグラフや間違って作成したグラフを削除する方法です。

 デバイス単位で削除する場合

 [console]タブをクリック。
 Management->[Devices]をクリック。
 表示されたデバイスのリストから削除したいデバイスの一番右端にあるチェックボックスを選択。
 Choose an action:ドロップダウンリストから Delete を選択。
 [go]をクリック。
 Delete確認ボックスが表示されるので、以下の内容で選択し[yes]ボタンをクリック。

   Leave all graphs and data sources untouched.
    このデバイスで作成したグラフやデータソースを全てそのまま残しておく

   Delete all associated graphs and data sources.
    このデバイスで作成したグラフやデータソースを全て削除する

 グラフ単位で削除する場合

 [console]タブをクリック。
 Management->[Graph Management]をクリック。
 表示されたデバイスのリストから削除したいデバイスの一番右端にあるチェックボックスを選択。
 Choose an action:ドロップダウンリストから Delete を選択。
 [go]をクリック。
 Delete確認ボックスが表示されるので、以下の内容で選択し[yes]ボタンをクリック。

   Leave the data sources untouched.
  このグラフのデータソースをそのまま残しておく
   Delete all data sourcesrefercnced by these graphs.
   このグラフが参照しているデータソースを全て削除する

 データソース単位で削除する場合

 [console]タブをクリック。
 Management->[Data Sources]をクリック。
 表示されたデバイスのリストから削除したいデバイスの一番右端にあるチェックボックスを選択。
 Choose an action:ドロップダウンリストから Delete を選択。
 [go]をクリック。
 Delete確認ボックスが表示されるので、以下の内容で選択し[yes]ボタンをクリック。

   Leave the graphs untouched.
    このデータソースを参照しているグラフをそのまま残す
   Delete all graph items that reference these data sources.
    このデータソースを参照しているグラフアイテムを全て削除する
   Delete all graphs that reference these data sources.
    このデータソースを参照しているグラフを全て削除する

●CactiでのWindows監視

 WindowsにSNMPクライアント(正式名:SNMPサービス)をインストールします。
 Windowsの[サービス]一覧で「SNMP Service」が自動起動になっているか確認します。
 「SNMP Service」をダブルクリックしますと、プロパティが開きます。
 [セキュリティ]タブを選択、[認証トラップを送信する]にチェックを入れ下記のように設定します。
   コミュニティ名:public
   コミュニティの権利:読み取りのみ
   「すべてのホストからSNMPパケットを受け付ける」を選択

 WindowsのSNMPでは、ディスクの監視ができない場合があります。そのときは WTSC(Williams Technology Consulting Services) の「SNMP Informant」を使用します。
 [Downloads]をクリック、「SNMP Informat - Freeware Products」(ダウンロードページの下の方)にあります。
 「3. Press the DOWNLOAD button」の[DOWNLOAD]をクリックします。
 ダウンロードした「SNMP Informant-STD」を監視するWindowsマシンにインストールします。
 SNMP Informantを導入してもディスクの情報が取得できない場合は、以下のコマンドを実行してからWindowsを再起動します。
> diskperf -y 
 WinXP/Vista/Win7/Win2000/Win2003/Win2008 Templates x32/x64からCacti_SNMP_INFORMANT_STD_W32_Metrics.zipをダウンロードしてインストールします。

 なお、最新版はGitHubから、過去のバージョンは、Cacti Templates for Windowssからダウンロードできます。

 展開後、snmp_informant_*.xmlをpath-to-cacti/resource/snmp_queries/にコピーします。

 具体的には下記ファイルです。
 snmp_informant_cpu.xml
 snmp_informant_disk.xml
 snmp_informant_memory.xml
 snmp_informant_network.xml
 snmp_informant_objects.xml

 監視用ファイルとして下記ファイルも同様にコピーし、CactiのWebを使用してインポートします。
 cacti_data_query_w32_-_cpu_statistics.xml
 cacti_data_query_w32_-_disk_statistics.xml
 cacti_data_query_w32_-_memory_statistics.xml
 cacti_data_query_w32_-_network_statistics.xml
 cacti_data_query_w32_-_object_statistics.xml

●テンプレートのインポート

 [Import/Export]-[Import Templates]をクリック。
 [Import Template from Local File]で[参照]をクリックしてインポートするxmlファイルを選択します。
 [Import RRA Settings]及び[Associated RRA's]はデフォルトのままとします。
 [save]をクリックすればインポート完了です。
 Devicesの項目から対象ホストを開き、[Associated Data Queries]-[Add Data Query:]の項目から「W32・・」を選択出来るようになります。

●カスタマイズ

・Poller Typeの変更
 Cactiが監視機器からデータを取得するタイミングは、デフォルトで5分間隔です。この時、監視機器が多くなるとデータ取得が5分以内に終わらずに、グラフが作成されない事態に陥ります。これを防ぐ為にも、デフォルトで用意されているPollerのcmd.phpを、より高速なSpineに変更します。以下では、Spineを利用する為に必要なソフトウェアのインストール及び設定を説明します。
事前準備
Spineの動作に必要な為、 mysql-devel がインストールされている事を確認します。
    # rpm -qa | grep mysql-devel
    mysql-devel-5.0.77-4.el5_6.6
    
Spineのインストール
Spineの動作に必要な為、 mysql-devel がインストールされている事を確認します。
    # yum install cacti-spine
    
Cactiの画面から設定
Cactiの画面から、 [Settings] リンクを押下し、 [Path] タブを表示させます。
その後、 [Spine Poller File Path] の項目にSpineをインストールしたパスを追記して 「Save」 ボタンを押下します。
次に、 [Poller] タブを表示させ、 [Poller Type] の項目をに設定して 「Save」 ボタンを押下します。
最後に、設定から5分程度待って、cactiのログを確認し、Spine(Methodがspineになっている事)で実行されている事を確認します。
11/23/2011 08:15:00 AM - SYSTEM STATS: Time:298.0477
    \ Method:spine Processes:1 Threads:1 Hosts:5
    \ HostsPerProcess:5 DataSources:29 RRDsProcessed:0

●ログイン後の初期画面の変更

 [console]タブをクリック。
 [User Management]をクリック。
 「admin」をクリック。
 User Management [edit: admin]->[Login Options]->[Show the default graph screen]を選択。
 [Graph Settings]タブをクリック。
 [Tree View Mode]->[Default Graph Tree]でデフォルトで表示させたいツリーを選択。
 Tree Modeで1ページあたりのグラフ表字数を変更するには、[Graphs Per-Page]で表示させたい数を選択します。
 [save]をクリックすれば完了です。

●User Management

 ユーザの基本設定をします。詳細はUser Managementを参照してください。

●Realm Permissions

 メニューのアクセス権限を設定します。詳細はRealm Permissionsを参照してください。

●Graph Permissions

 グラフのアクセス権限を設定します。詳細はRealm Permissionsを参照してください。

●Graph Settings

 グラフ表示のカスタマイズをします。詳細はGraph Settingsを参照してください。

●アクセスするとPHP Warningが出力される

 Fedora 20にcactiをインストールしアクセスしたことろ、TIMEZONEがUTCで設定されていました。
 ログには、下記のようなエラーが表示されていました。

[Mon Sep 01 11:56:58.149176 2014] [:error] [pid 10002] [client 1.0.0.9:53716] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezon e setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning、you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now、but please set date.timezone to select your timezone. in /usr/share/cacti/i nclude/global_constants.php on line 170、referer: http://mercury.bigbang.mydns.jp/cacti/host.php [Mon Sep 01 11:56:58.149203 2014] [:error] [pid 10002] [client 1.0.0.9:53716] PHP Warning: strtotim e(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.ti mezone setting or the date_default_timezone_set() function. In case you used any of those methods an d you are still getting this warning、you most likely misspelled the timezone identifier. We selecte d the timezone 'UTC' for now、but please set date.timezone to select your timezone. in /usr/share/ca cti/include/global_constants.php on line 171、referer: http://mercury.bigbang.mydns.jp/cacti/host. php


 これを修正するため/etc/php.iniを編集します。
# vi /etc/php.ini
下記部分を修正
date.timezone = 'Asia/Tokyo'
# /etc/rc.d/init.d/httpd restart

●グラフが表示されない(cron関連)

 何かをきっかけにグラフが表示されなくなりました。iptablesの見直し、net-snmpの確認、cactiのデバイス設定でlocalhostのsnmpの設定の確認、cactiのバージョンアップ(0.8.7h→0.8.8b)、[console]-[configuretion:settings]-[General]-[Poller Specific Logging:Poller Logging Level]-[DEVEL]に設定変更後のcacti.logの確認等で対応しましたがどれも効果ありませんでした。
 いろいろ調べて下記のようなことを確認したところ原因が判明しました。
 コマンドを実行しcactiユーザーに変更します。
# su - cacti
 コマンドを実行しpollerを実行します。
$ php /var/www/cacti/poller.php
または
$ php /var/share/cacti/poller.php
 コマンドを実行し、cactiのrraディレクトリにsnmp関連のファイルが作成されているか確認します。
$ ls /var/www/cacti/rra
または
$ ls /usr/share/cacti/rra
 元々存在していたファイルが更新されていませんでした。
 よくよく確認するとファイルの所有者及びグループがrootとなっていました。更に/var/www/cacti/rraディレクトリも同様となっていました。
 所有者及びグループをcactiに修正したところ、正常にグラフが表示されるようになりました。
 上記でもグラフが更新されない場合、/etc/cron.d/cactiの内容を確認してください。
# */5 * * * *	cacti	/usr/bin/php /var/www/cacti/poller.php > /dev/null 2>&1
または
# */5 * * * *	cacti	/usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1
 デフォルトでコメントアウトされている場合がありますので、「#」を削除しcrondを再起動してください。
 スクリプト等で取得したいデータが取得でき、グラフ上に表示されない場合もあるようです。Data Template、Data Source等を確認しても問題ない場合やそれらを作成しなおしても同陽の症状となる場合は、[console]-[System Utilities]-[Rebuild Poller Cache]、該当のData Sourceを選択し[Save]してください。
 しばらく待つと、正常にグラフが表示されるようになりました。

●グラフが表示されない(DB関連)

 いつのまにかcactiのグラフが描画されていないことに気がつきました。ログは下記のとおりです。

# less /var/www/cacti/log/cacti.log または # less /usr/share/cacti/log/cacti.log
10/13/2015 10:15:01 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!、Error:'145'、SQL:"select poller_output.output、 poller_output.time、 UNIX_TIMESTAMP(poller_output.time) as unix_time、 poller_output.local_data_id、 poller_item.rrd_path、 poller_item.rrd_name、 poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) LIMIT 10000"
10/13/2015 10:15:01 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!、Error:'145'、SQL:"select poller_output.output、 poller_output.time、 UNIX_TIMESTAMP(poller_output.time) as unix_time、 poller_output.local_data_id、 poller_item.rrd_path、 poller_item.rrd_name、 poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) LIMIT 10000"


 下記コマンドで復旧しました。
# /usr/bin/php /var/lib/cacti/cli/repair_database.php 
Repairing All Cacti Database Tables
Repairing Table → 'cdef' Successful
Repairing Table → 'cdef_items' Successful
Repairing Table → 'colors' Successful
Repairing Table → 'data_input' Successful
Repairing Table → 'data_input_data' Successful
Repairing Table → 'data_input_fields' Successful
Repairing Table → 'data_local' Successful
Repairing Table → 'data_template' Successful
Repairing Table → 'data_template_data' Successful
Repairing Table → 'data_template_data_rra' Successful
Repairing Table → 'data_template_rrd' Successful
Repairing Table → 'graph_local' Successful
Repairing Table → 'graph_template_input' Successful
Repairing Table → 'graph_template_input_defs' Successful
Repairing Table → 'graph_templates' Successful
Repairing Table → 'graph_templates_gprint' Successful
Repairing Table → 'graph_templates_graph' Successful
Repairing Table → 'graph_templates_item' Successful
Repairing Table → 'graph_tree' Successful
Repairing Table → 'graph_tree_items' Successful
Repairing Table → 'host' Successful
Repairing Table → 'host_graph' Successful
Repairing Table → 'host_snmp_cache' Successful
Repairing Table → 'host_snmp_query' Successful
Repairing Table → 'host_template' Successful
Repairing Table → 'host_template_graph' Successful
Repairing Table → 'host_template_snmp_query' Successful
Repairing Table → 'plugin_config' Successful
Repairing Table → 'plugin_db_changes' Successful
Repairing Table → 'plugin_hooks' Successful
Repairing Table → 'plugin_realms' Successful
Repairing Table → 'poller' Successful
Repairing Table → 'poller_command' Successful
Repairing Table → 'poller_item' Successful
Repairing Table → 'poller_output' Successful
Repairing Table → 'poller_reindex' Successful
Repairing Table → 'poller_time' Successful
Repairing Table → 'rra' Successful
Repairing Table → 'rra_cf' Successful
Repairing Table → 'settings' Successful
Repairing Table → 'settings_graphs' Successful
Repairing Table → 'settings_tree' Successful
Repairing Table → 'snmp_query' Successful
Repairing Table → 'snmp_query_graph' Successful
Repairing Table → 'snmp_query_graph_rrd' Successful
Repairing Table → 'snmp_query_graph_rrd_sv' Successful
Repairing Table → 'snmp_query_graph_sv' Successful
Repairing Table → 'user_auth' Successful
Repairing Table → 'user_auth_perms' Successful
Repairing Table → 'user_auth_realm' Successful
Repairing Table → 'user_log' Successful
Repairing Table → 'version' Successful
NOTE: Checking for Invalid Cacti Templates
NOTE: No Invalid Cacti Template Records found in your Database

●グラフが表示されない(Windows関連)

 cacti-1.2.3-7.el6.noarchにアップデート後、対Windowsサーバの監視ができなくなりました。
 ●CactiでのWindows監視
での作業するsnmp_informant_*.xmlがpath-to-cacti/resource/snmp_queriesに存在していませんでした。
 これはこれまでの保存先が/var/www/cacti/resourceであったためと思われます。
 したがって、snmp_informant_*.xmlを/usr/share/cacti/resource/snmp_queriesにコピーすることにより解決します。
 また、上記でも表示されない場合は下記を実施してください。
 ・表示されないグラフそのものを削除
  Management
   → Devices
    → 該当ホスト
     → (右上の)Graph List → グラフのタイトル等を参考にしながら削除
 ・テンプレートのデータソースを削除
  Templates
   → Date Source
    → 削除
 ・表示されないグラフのテンプレートを削除
  Templates
   → Graph
    → 削除するテンプレートを選択(W32 - ・・・)
     → 削除
 ・必要のなくなったデータクエリーの削除
  Data Collection
  → Data Queries
 

●グラフが途切れて表示される

 Cactiを動作させているマシンでいつのころ頃からかグラフが途切れて表示されるようになりました。
 同じ頃にインストールした別のマシンでは問題なく表示されています。当初、インストール状態は2台とも関連するフィアるは全て同じバージョンでした。
 ログを見てみましたが特に異常はないようです。
 下記ログを見る限りpollerが動作した時の時間も非常に短時間でSNMPの応答も問題ないように感じられます。
 実際のところ、SNMPで監視していないグラフも途切れ途切れの表示されていました。

# tail -f /var/log/cacti/cacti.log
05/13/2016 12:50:01 AM - SYSTEM STATS: Time:0.1452 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:7 RRDsProcessed:6
05/13/2016 12:55:01 AM - SYSTEM STATS: Time:0.1439 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:7 RRDsProcessed:6
05/13/2016 01:00:01 AM - SYSTEM STATS: Time:0.1439 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:7 RRDsProcessed:6

 下記にとりあえずやったことを記載します。

 ・該当グラフを一度削除 ― グラフ再作成(結果:変化なし)
 ・該当ホストを一度削除 ― ホスト再作成 ― グラフ再作成(結果:変化なし)
 ・cactiを含め関連ファイルをアップデート(結果:アップデート前と変わらず)
 ・SNMPの応答タイムアウトを長くする
  Cacti でグラフが途切れて表示される場合の対応(参考)
 ・cacti監視画面 → System Utilities → Rebuild Poller Cache → 該当のDate Sourceを選択(結果:変化なし)
 ・spineをインストール(結果:変化なし)
  cactiのグラフが途切れたりするのでcacti-spineをいれてみた
  cactiでグラフがコマ切れになる
 

●一分ごとにグラフを更新する方法

 参考URL:1分間隔でグラフを更新する
 参考URL:1分平均のデータ取得

●保存期間の変更

 参考URL:1分平均のデータ取得
 参考URL:rrdtool resize して、cactiのデータ保存期間を延長する

 cactiではrrdにてデータを保存しており、古いデータから上書きされ、粒度の大きなデータに置き換えられます。もっとも大きな粒度のデータも指定された総数を超えたものから順に上書きされます。
 rrdでは指定された保存期間の中でデータをリングバッファ状に保存しており、 データサイズが際限なく膨れ上がることはありません。さらにデータの丸め込みに対応しており、より古いデータは、より粒度の大きなものを残すことでデータサイズの肥大化を抑えています。
 しかし、すでに作成済みのrrdファイルは変更されないため、別途rrdtoolコマンドでrrdファイルを修正する必要があります。
 cactiで取得したデータの保存期間のデフォルト値はManagement → Data Sources → RRAsから確認できます。
 平均取得間隔ごとにそれぞれの値がわかれており、それぞれの保存期間は以下の数式で求めることができます。

項目 参照単位 Rows データ保存期間
Hourly 1Min 500 1分(取得間隔)×500 Rows=500分(約8.3時間)
Daily 5Min 600 5分(取得間隔)×600 Rows=3000分(約50時間)
Weekly 30Min 700 30分(取得間隔)×700 Rows=21000分(約350時間)
Monthly 2Hour 775 120分(取得間隔)×775 Rows=93000分(約2ヶ月強)
Yearly 1Day 797 1440分(取得間隔)×797 Rows=1147680分(約2年強)


 上記の計算式からわかるように保存期間を長くしたい場合はROWSの値を増やしてやれば良いということになります。ROWSとは保存するデータの数を表します。例えば全ての項目を400日(576000分)保存したい場合、ROWSは以下のように設定すれば良いということになります。

項目 参照単位 ROWS 計算式
Hourly 1Min 576000 1X ROWS=576000分
Daily 5Min 115200 5X ROWS=576000分(576000÷5=115200)
Weekly 30Min 19200 30X ROWS=576000分(576000÷30=19200)
Monthly 2Hour 4800 120X ROWS=576000分(576000÷120=4800)
Yearly 1Day 400 1440X ROWS=576000分(576000÷1440=400)


 ちなみにTimespanはグラフの長さを表す秒数であり過去のものを見たいときはWeeklyやMonthlyから拡大を繰り返していけば、そのときの1分平均や5分平均を見ることができるため、こちらは特に変更の必要はありません。
 この変更作業も同様に、一旦生成されたrrdファイルには途中で変更しても無効となりますので、既存のrrdファイルを削除して新規に作成することで設定変更が適用されます。なるべくなら消したくない・・・。

 例えば、保存期間を下記のように変更するとします。

  5分毎のデータを3年間
  30分毎のデータを4.5年間
  2時間毎のデータを6.75年間
  24時間毎のデータを10.125年間

 5分毎の場合は、(3[年] * 365[日] * 24[時] * 60[分]) / 5[分毎] = 1576800 / 5 = 315360を指定します。
 Management → Data Sources → RRAsからRowsをそれぞれ変更することになります。
 ※cactiは(通常では)5分毎にしかデータを採取しませんので、Hourly(1 Minute Average)を変更しても特に意味はありません
 上記の設定によってデータ保存期間は3年~10年となり、この設定をした後に作成するrrdはそのように作成されるようになります。
 Rowsを変更した場合、既存のrrdファイルへの反映は無効となります。別手順で期間を延長する必要があります(一度削除して作成し直すのが楽ですが、現時点まで貯めたデータを消すこととなります)。
 rrdtool resize<rrdファイル名> <対象rra番号>.rows GROW <増差分>というコマンドで既存のrrdファイルの保存期間を変更できます。
 rra番号はrrdtool infoで確認できます。
 rrdファイルは、AVERAGE、MAX等のデータ種別、データ粒度別に複数のrraを含んでいます。
 GROWで指定するのが差分なので直感的に数字を指定しにくく、rra番号によって変わるため面倒すぎるのでshellscriptを自作して対応しました。

 これで安心・・・とはいかないのである。
 rrdtoolでresizeしてデータ期間を延ばした場合、それまで存在していなかった期間のデータはNaNになります。

 これがcacti(rrdtool系全般?)では面倒な事を引き起こします。
 データのレコードが存在し、データ自体はNaNの状態になるため、cactiでグラフ化するとその期間がデータなしとなります。
 粒度の大きいレコードにはデータが残っていても、cacti(rrdtool系?)ではより粒度の小さいレコードを参照するため、グラフが描写されません。

 とえば5日前のグラフを描写させたい場合、5分毎のデータはNaNになっており30分毎のデータはなんらかデータ残っていたとしても、5分毎のデータを参照してしまい、グラフが描写されません。
 粒度の大きな残されたデータを、延長した粒度の小さいレコードへコピーしてやればグラフは描写されるようになります。
 これをうまいことやってくれる手法を探したが見つからなかったためperlで自作しました。これでようやく既存rrdファイルの保存期間延長(&延長部分の既存データのグラフ表示)が出来るようになります。

 rrdデータ保存期間延長(rrdextend.sh)
 zshで動くように作ってありますがちょっと変えればbashでも動作するかもしれません。
 引数にrrdファイルを指定する。
 データの保存期間をファイル内に記載します。とりあえず先述の通り5分毎を3年間保存する設定にしました。それ以降の粒度は1.5倍増しの期間を設定するようにしました。

################
# settings
extended_year=3 # extended value for "pdp_per_row" is 1
extended_month=0 # extended value for "pdp_per_row" is 1
extended_day=0 # extended value for "pdp_per_row" is 1
extended_hour=0 # extended value for "pdp_per_row" is 1
step_extend_num=1.5 # coefficient num for next "php_per_row"
# end settings
################

# ex.
# extended_year=3 month,day,hour=0
# step_extend_num=1.5
# then
# 5mins data : 3 years hold
# 30mins data : 4.5 years hold
# 2hours data : 6.75 years hold
# 24hours data : 10.125 years hold
# (rrd step=300sec)

# ex.
# extended_year=3 month,day,hour=0
# step_extend_num=1
# then
# all data spans : 3 years hold


 念のためrrdファイルのバックアップを取ってから作業すると安全です。
$ cd <cacti_dir>/
$ tar czvf rra_backup.tgz ./rra
 cactiユーザで実行したいときはsudo -u cacti -s /bin/bashを使用します。
 findでrrdファイルを見つけてシェルスクリプトに渡すと便利です。
$ sudo -u cacti find ./rra -iname "*.rrd" -exec rrdextend.sh {} \;
rrdtool resize ./raspberrypi_load_1min_69.rrd	 ... ok
rrdtool resize ./raspberrypi_mem_free_74.rrd	 ... ok
rrdtool resize ./localhost_hdd_free_121.rrd	 ... ok
rrdtool resize ./localhost_hdd_free_120.rrd	 ... ok
rrdtool resize ./localhost_snmp_oid_20.rrd	 ... ok
<省略>
 rrdtool infoやcactiでrrdファイルとして問題ないものが生成されたことを確認しておきます。

 rrdデータ展開(rrdspread.pl)
 基本的な使い方はrrdextend.shと同じです。
 設定項目はrrdtoolコマンドへのpathを入れておくくらいです。pathが通っているならコマンド名だけでOKです。
################  
# settings  
our $RRDTOOL="rrdtool";  
# end settings  
################ 
 同じく、cactiユーザで実行したいときは下記のとおりです。
$ sudo -u cacti find ./rra -iname "*.rrd" -exec perl rrdspread.pl {} \;
rrdtool dump     : ./raspberrypi_load_1min_69.rrd \
                --> ./raspberrypi_load_1min_69.rrd_xml ... done
read dumpfile    : ./raspberrypi_load_1min_69.rrd_xml  ... done
data collectiong : ./raspberrypi_load_1min_69.rrd_xml  ... done
spread & output  : ./raspberrypi_load_1min_69.rrd_sprd ... done
rrdtool restore  : ./raspberrypi_load_1min_69.rrd_sprd \
                --> ./raspberrypi_load_1min_69.rrd_new ... done
rrd file backup  : ./raspberrypi_load_1min_69.rrd \
                --> ./raspberrypi_load_1min_69.rrd_BAK ... done
rrd file swap    : ./raspberrypi_load_1min_69.rrd_new \
                --> ./raspberrypi_load_1min_69.rrd     ... done
delete temporary : ./raspberrypi_load_1min_69.rrd_xml  ... done
delete temporary : ./raspberrypi_load_1min_69.rrd_sprd ... done
rrdtool dump     : ./raspberrypi_mem_free_74.rrd \
                --> ./raspberrypi_mem_free_74.rrd_xml ... done
read dumpfile    : ./raspberrypi_mem_free_74.rrd_xml  ... done
・・省略・・

 参考URL:CactiのRRD容量拡大スクリプト

 上記URLにもスクリプトがありましたので記載します。
 バッチ処理
  rrd_convert.pl
 リサイズ処理本体
  rra_resize.pl

 制限事項:
 期間を延ばした場合、過去の分については短い解像度のデータが存在しないため、普通にCactiで長期間のグラフを表示できなくなります。増やした過去の期間分、5分データに1日平均の値でもベタに突っ込んであげれば、とりあえずグラフは出るようになるはずです。
 rra_resizeの@resize_rraを、以下の順で増やしたい行数に変えてください。
   5分平均
   30分平均
   2時間平均
   1日平均
 例えば、標準で600行(5分×600行=2日ちょい)のものを、2年保存するようにしたければ、2*365*24*60/5=210240行必要になるので、増分は209640となり、これを上記スクリプトに記述します
 

●MIB情報を表示させる

 以下のコマンドを実行することにより、MIBのツリー構造一覧を表示させることができます。ただし、一覧は膨大になりますので注意してください。
$ snmptranslate -Tp
 コマンドで値を確かめる場合は、下記の書式でコマンドを入力します。
$ snmpwalk -v1 -c <コミュニティ名> <ホスト名> [ 検索範囲 ]
 以下は、ロードアベレージを取得してみた結果です。
$ snmpwalk -v1 -c public localhost .1.3.6.1.4.1.2021.10.1.3
UCD-SNMP-MIB::laLoad.1 = STRING: 1.02
UCD-SNMP-MIB::laLoad.2 = STRING: 1.22
UCD-SNMP-MIB::laLoad.3 = STRING: 1.00

●Disk I/Oを監視する

 まず、プラグインを下記URLからダウンロードします。
 http://docs.cacti.net/usertemplate:data:host_mib:diskio
 次に、データ取得のためのXMLを設置します。解凍したディレクトリ内のdisk_io.xmlを<cati_install_path>/cacti/resources/snmp_queries/配下に設置します。
 解凍したディレクトリ内のテンプレーcacti087d_data_query_snmp_-_get_disk_io.xmlを、cactiのページの左側メニューのImport Templatesページからブラウザ上でインポートします。
 Devicesページでローカルホストを選択、最下部のAssociated Data QueriesでSNMP – Get Disk IOを追加します。
 同じページのトップに記載されているCreate Graphs for this Hostをクリック、Data Query [SNMP - Get Disk IO] から監視したい対象を選択し保存します。
 追加したDiskIOのグラフの横幅が他と異なり不便なので変更します。
Graph Templates → Host MIB – Disk IO – Bytes per Second → “Widthを500に変更
Graph Templates → “Host MIB – Disk IO – Transactions per Second → “Widthを500に変更
以上でしばらく待つとグラフが表示されます。

●iostatを利用したDisk監視

 「cactiを使用した監視(Disk I/O)」を元に設定しました。

 テンプレートのダウンロード

 cactiには様々なテンプレートが用意されています。それを利用しiostatによるDisk監視を追加します。ここからcacti-iostat-1.3.tar.gzをダウンロードします。

 SNMPクライアントの設定

 iostatコマンドを利用するためsysstatをインストールします。
# yum install sysstat
 動作確認をします。
$ iostat -xkd 30 2
Linux 3.16.3-200.fc20.i686+PAE (server.bigbang.mydns.jp) 	2014年10月02日 	_i686_	(2 CPU)
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.11     2.08    0.39    5.73     8.30    54.19    20.42     0.39   63.28   30.27   65.54   2.70   1.65
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00   80.65   31.73  306.68   7.41   0.00
dm-1              0.00     0.00    0.41    6.45     7.67    42.65    14.67     0.43   62.39   48.39   63.29   1.69   1.16
dm-2              0.00     0.00    0.09    1.21     0.61    11.53    18.76     0.03   21.56   14.89   22.06   4.36   0.56
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     1.97    0.03    1.10     0.13    16.27    28.94     0.05   45.15    9.00   46.24   9.71   1.10
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.03    1.43     0.13     5.73     8.00     0.00    2.66    9.00    2.51   2.66   0.39
dm-2              0.00     0.00    0.00    1.50     0.00    10.53    14.04     0.05   31.51    0.00   31.51   4.73   0.71
 cronに以下を設定します。
# vi /etc/cron.d/iostat
* * * * * root cd /tmp && iostat -xkd 30 2 | sed 's/,/\./g' > io.tmp && mv io.tmp iostat.cache
 SNMPクライアント側での設定及び計測を行ないたいマシン(SNMPクライアント)に以下のファイルを設定します。今回は、iostat.plを/usr/local/bin/配下に保存しました。
cact-iostat-1.3
 |_scripts
     |_iostat.pl
 次にsnmpd.confに以下を追記します。
# vi /etc/snmp/snmpd.conf
pass .1.3.6.1.3.1 /usr/bin/perl /usr/local/bin/iostat.pl
 SNMPデーモンを再起動します。
# /etc/rc.d/init.d/snmpd restart
 以上でSNMPクライアント側の設定は終了です。

 cactiの設定

 SNMPサーバ側でファイルを設定します。設定するファイルは下記に存在します。
cacti-iostat-1.3
    |_snmp_queries
            |_linux
                |_iostat.xml
 このiostat.xmlを/var/www(または/usr/share)/cacti/resource/snmp_queries/配下に保存します。次に、cactiの画面を開いて「Import Templates」を選択します。参照ボタンをクリックして以下のディレクトリ内のファイルを全てをImportします。
cacti-iostat-1.3
     |_templates
            |_linux

 サーバで監視を追加

 cactiの画面でDeviceをクリックします。DiskI/Oを監視したいサーバをクリックします。「Add Data Query:」において「iostat-XXXX」を選択して「Add」ボタンをクリックします。

cacti03.GIF

 追加が終了したら「Save」ボタンをクリックします。

cacti04.GIF

 追加後にStatusの状態がSuccess [0 Items、0 Rows]と表示されている場合は、iostat.xmlを書き換える必要がありますので、下記のように修正してください。
<index_order>ioDescr:ioName:ioIndex</index_order>
  ↓
<index_order>ioDescr:ioIndex</index_order>
 次に左のメニューから「Create]-[New Graphes」をクリックして「Host:」から適用したいサーバを選択します。以下の画像のように''Data Query[iostat-XXXx]の右側にチェックを入れて一番下にある「Create」ボタンをクリックします。

cacti05.GIF

 左側のメニューより「Management」-「Graph Trees」を選択して右側の「Add」をクリックします。

cacti06.GIF

 [Tree Item Type]から[Graph]を[Graph]から追加したサーバのグラフを選択して「Create」を選択します。

cacti07.GIF

 後は、5分程度待ってグラフが作成されている事を確認します。
 グラフによって、グラフの横幅が狭いため文字が切れることからwidthの値を修正します。
 「Graph Management」−「該当のグラフを選択」−右上の「Edit Graph Template.」を選択-「Width (--width)の数値を変更」−右下の「Saveを 押下」し保存します。

●Disk Spaseを使用率で表示させる

 参考URL:cacti ディスク容量 Data Queries テンプレート 百分率表示への変更

 上記を参考に設定ししたが上手く表示されませんでしたので補足します。


 RRDTool Commandの結果を表示させるには、Console → Graph Management → 対象のグラフを選択します。

 結果に問題がなければ、グラフと実行結果が表示されます。
 結果に問題がある場合、グラフは表示されずコマンドの実行結果のみが表示されます。

ERROR: parameter '#FF00FFFF' does not represent a number in line LINE1:#FF00FFFF:Percent

 Console → Graph Templates → ucd/net - Available Disk Space → Graph Template Items

 Console → Graph Management → mercury - Disk Space - / → Supplemental Graph Template Data → Graph Item Fields → Data Source [hdd_percent] → 「None」を選択した場合、RRDTool Command:に異常は表示されない。「…(hdd_percent)」を選択すると下記のようなエラーが表示されグラフが作成されませんでした。

RRDTool Command:

/bin/rrdtool graph - \
--imgformat=PNG \
--start='-86400' \
--end='-60' \
--title='mercury - Disk Space - /' \
--rigid \
--base='1024' \
--height='120' \
--width='500' \
--alt-autoscale-max \
--lower-limit='0' \
--vertical-label='percent' \

  --slope-mode \
--font TITLE:10: \
--font AXIS:7: \
--font LEGEND:8: \
--font UNIT:7: \
DEF:a='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_used':AVERAGE \
DEF:b='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_free':AVERAGE \
DEF:c='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_percent':AVERAGE \
CDEF:cdefa='a,1024,*' \
CDEF:cdefe='b,1024,*' \
CDEF:cdefi='TIME,1463707373,GT,a,a,UN,0,a,IF,IF,TIME,1463707373,GT,b,b,UN,0,b,IF,IF,TIME,1463707373,GT,c,c,UN,0,c,IF,IF,+,+,1024,*' \ CDEF:cdefbc='c,1024,*' \
AREA:cdefa#F51D30FF:'Used' \
GPRINT:cdefa:LAST:' Current\:%8.2lf %s' \
GPRINT:cdefa:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefa:MAX:'Maximum\:%8.2lf %s\n' \
AREA:cdefe#002A97FF:'Available':STACK \
GPRINT:cdefe:LAST:'Current\:%8.2lf %s' \
GPRINT:cdefe:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefe:MAX:'Maximum\:%8.2lf %s\n' \
LINE2:cdefi#000000FF:'Total' \
GPRINT:cdefi:LAST:' Current\:%8.2lf %s' \
GPRINT:cdefi:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefi:MAX:'Maximum\:%8.2lf %s\n' \
LINE1:cdefbc#35962BFF:'Percent' \
GPRINT:cdefbc:LAST:' Current\:%8.2lf %s' \
GPRINT:cdefbc:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefbc:MAX:'Maximum\:%8.2lf %s\n'

RRDTool Says:

ERROR: No DS called 'hdd_percent' in '/usr/share/cacti/rra/mercury_hdd_free_292.rrd'

エラーとなっている/usr/share/cacti/rra/mercury_hdd_free_292.rrdを削除し、再確認したところ問題なくRRDコマンドが実行されエラーが解消されました。

また、値が正しいかどうかを確認するため下記コマンドを実行し、正しいことを確認しました。
$ snmpwalk -v1 -c [コミュニティ名] [サーバ名] .1.3.6.1.4.1.2021.9.1.9 UCD-SNMP-MIB::dskPercent.1 = INTEGER: 52
UCD-SNMP-MIB::dskPercent.2 = INTEGER: 45
UCD-SNMP-MIB::dskPercent.3 = INTEGER: 0


 cactiのディフォルトのData Queriesの"ucd/net - Get Monitored Partitions"はディスクの空き容量(hdd_free)とディスク利用容量(hdd_used)を取得するようになっています。閾値を設定してメール通知をしたいという思いがあり、どちらかというと使用率(%)をグラフで表示させ閾値を設定する方位が都合が良い。
 ディスクを監視できるようにするため/etc/snmp/snmpd.confを変更します。
# vi /etc/snmp/snmpd.conf
    :
disk / 10000
disk /boot 10000
disk /home 10000
    :
# systemctl restart snmpd
 snmpの再起動後、Console → Devices → [監視対象サーバ] → Associated Data Queries → ucd/net - Get Monitored Partitionsの右にある緑色の丸印をクリックしてクエリを再読み込みします(リモートサーバの場合)。
 Data Queries用のXMLファイルを確認します。
 Console → Collection Methods → Data Queries → ucd/net - Get Monitored Partitions をクリックします。
 XML Pathが/resource/snmp_queries/net-snmp_disk.xmlとなっています。
 自分の環境でのパスは/var/www/cacti/resource/snmp_queries/net-snmp_disk.xmlでした。
 cactiをインストールしているサーバにログインし、ファイルの内容を確認します。
$ cat /var/www/cacti/resource/snmp_queries/net-snmp_disk.xml
    :
  <dskPercent>
  <name>Used Percent</name>
  <method>walk</method>
  <source>value</source>
  <direction>output</direction>
  <oid>.1.3.6.1.4.1.2021.9.1.9</oid>
  </dskPercent>
    :
 既に定義済みであるので、cacti側の設定だけで対応可能です。

 Data Templatesを変更します。
 Console → Templates → Data Templates → ucd/net - Hard Drive Spaceを選択します。
 Data Source Itemに既に、hdd_free、hdd_usedが登録されていますので、新規のDSとしてhdd_percentを登録します。
 Data Source Itemの右端にあるでNewをクリックします。
 実際には下記のように設定しました。
Internal Data Source Name: hdd_percent
Minimum Value ('U' for No Minimum): 0
Maximum Value ('U' for No Maximum): 0
Data Source Type: GUAGE
Heartbeat: 600
各項目のチェックは入れていません。
 必要なければhdd_free、hdd_usedのDSは削除してしまっても構いません。×マークをクリックすれば削除されます。
 削除した場合、データベースが小さくなメリットがあるため、パーセント以外を利用しなければその方がいいかもしれません。

 Graph Templatesを変更します。
 Console → Templates → Graph Templates → ucd/net - Available Disk Spaceを選択します。
 Graph Template Itemsに新規アイテムを追加します。
 Graph Template Itemsの右端にあるAddをクリックし、Graph Template Items内で、Data Templates で設定した "ucd/net - Hard Drive Space - (hdd_percent)" を選択します。
 実際には下記のように設定しました。
※一つ目のItem
Color: 任意
Opacity/Alpha Channel: 100%
Graph Item Type: 任意(LINE1等)
Consolidation Function: AVERAGE
CDEF Function: None
Value: 空欄
GPRINT Type: Normal
Text Format: Percent
Insert Hard Return:  空欄
※二つ目のItem
Color: None
Opacity/Alpha Channel: 100%(選択できない)
Graph Item Type: GPRINT
Consolidation Function: LAST
CDEF Function: None
Value: 空欄
GPRINT Type: Normal
Text Format: Current:
Insert Hard Return: 空欄
※三つ目のItem
Color: None
Opacity/Alpha Channel: 100%(選択できない)
Graph Item Type: GPRINT
Consolidation Function: AVERAGE
CDEF Function: None
Value: 空欄
GPRINT Type: Normal
Text Format: Average:
Insert Hard Return: 空欄
※四つ目のItem
Color: None
Opacity/Alpha Channel: 100%(選択できない)
Graph Item Type: GPRINT
Consolidation Function: MAX
CDEF Function: None
Value: 空欄
GPRINT Type: Normal
Text Format: Maximum:
Insert Hard Return: チェックを入れる
 この時、既に設定済みのTotalを表示するグラフが残っているとグラフ内の縦軸の単位が「…k」となしまうため変更します。これを解消するのに結構苦労しました。
 設定を残したままTotalのグラフを表示させないようとCDEF Functionを「None」に変更しましたが下記のようにエラーとなってしまいグラフ自体が表示されなくなりました。


RRDTool Command:

/bin/rrdtool graph - \
--imgformat=PNG \
--start='-86400' \
--end='-60' \
--title='mercury - Disk Space - /' \
--rigid \
--base='1024' \
--height='120' \
--width='500' \
--alt-autoscale-max \
--lower-limit='0' \
--vertical-label='percent' \
--slope-mode \
--font TITLE:10: \
--font AXIS:7: \
--font LEGEND:8: \
--font UNIT:7: \
DEF:a='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_used':AVERAGE \
DEF:b='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_free':AVERAGE \
DEF:c='/usr/share/cacti/rra/mercury_hdd_free_292.rrd':'hdd_percent':AVERAGE \
CDEF:cdefa='a,1024,*' \
CDEF:cdefe='b,1024,*' \
CDEF:cdefbd='TIME,1463711260,GT,a,a,UN,0,a,IF,IF,TIME,1463711260,GT,b,b,UN,0,b,IF,IF,TIME,1463711260,GT,c,c,UN,0,c,IF,IF,+,+,1024,*' \
AREA:cdefa#F51D30FF:'Used' \
GPRINT:cdefa:LAST:' Current\:%8.2lf %s' \
GPRINT:cdefa:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefa:MAX:'Maximum\:%8.2lf %s\n' \
AREA:cdefe#002A97FF:'Available':STACK \
GPRINT:cdefe:LAST:'Current\:%8.2lf %s' \
GPRINT:cdefe:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefe:MAX:'Maximum\:%8.2lf %s\n' \
AREA:c#35962BFF:'Percent' \
GPRINT:c:LAST:' Current\:%8.2lf %s' \
GPRINT:c:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:c:MAX:'Maximum\:%8.2lf %s\n' \
LINE2:#000000FF:'Total' \
GPRINT:cdefbd:LAST:' Current\:%8.2lf %s' \
GPRINT:cdefbd:AVERAGE:'Average\:%8.2lf %s' \
GPRINT:cdefbd:MAX:'Maximum\:%8.2lf %s\n'

RRDTool Says:

ERROR: parameter '#000000FF' does not represent a number in line LINE2:#000000FF:Total


 Console → Graph Templates → [テンプレートを選択] → Graph Template Items → Data Sourceの「Total」と設定されているGraph Itemを選択 → CDEF Functionを「Total ALL Data Sources、Multiply by 1024」から「100% Line」に変更します。この変更は関連する全てのItemで実施してください。または、Data Sourceの「Total」と設定されているGraph Itemを全て削除します。
 Graph Item Inputsには自動で "Data Source [hdd_percent]" という項目が登録されます。
 また、Graph TemplateのVertical Labelをpercentに変更します。

 Data Queriesを変更します。
 Console → Collection Methods → Data Queries → ucd/net - Get Monitored Partitionsを選択します。
 Associated Graph TemplatesのAvailable/Used Disk Spaceをクリックします。
 Associated Data Templatesに追加したDSであるhdd_percentが増えています。dskPercent(Used Percent)を選択し、チェックを入れます。
 また、hdd_freeとhdd_usedのチェックは外しておいても構いません。

●ディスク温度の監視

 参考URL:Cacti システムの温度グラフ
 参考URL:Cactiによる温度監視(Ip Sensor 9216)
 参考URL:Self-Monitoring、Analysis and Reporting Technology(Wikipedia)

 グラフ化したいデータを収集するスクリプトを作成します。作成したスクリプトは、デフォルトのスクリプトと同様ににcactiのscriptsディレクトリ配下(/usr/share/cacti/scripts/)に設置します。
 出力データが単一の場合は、改行なしで [値] のみ出力し、複数データの場合は、[項目名1:値1 項目名2:値2 ・・・] のように、項目名と値を [:] ではさみ、項目間を半角スペース区切りで改行なしで出力します。
 作成したら単独で所定のデータが出力されるか確認しておきます。

 HDD温度測定検出用スクリプト

#!/bin/bash
temp1=`/bin/sudo /sbin/smartctl -i -d ata -a /dev/sda | grep "Temperature_Celsius" | /bin/awk '{print $10;}'`
temp2=`/bin/sudo /sbin/smartctl -i -d ata -a /dev/sdb | grep "Temperature_Celsius" | /bin/awk '{print $10;}'`
echo -n "HDD1:$temp1 HDD2:$temp2"


 smartctlを実行するにはroot権限が必要です。書きスクリプト実行時の権限はcactiになりますので、/etc/sudoersを下記のように変更します。
# vi /etc/sudoers
cacti ALL=NOPASSWD:/sbin/smartctl ← 追記

 参考URL:Cacti システムの温度グラフ
 参考URL:Cactiによる温度監視(Ip Sensor 9216)

 上記で作成したスクリプトを利用するため、Cactiの画面からData Input Methodsを追加します。パラメータは下記の通りです。名称などは適宜変更して下さい。

cacti-self-temp01.png

 上記設定を行い「create」を押下すると、新たに [Input Fields] と [Output Fields] が表示されるようになります。
 [Input Fields]はスクリプト実行時に渡す引数を定義し、[Output Fields]はスクリプトを実行した返り値を定義します。
 ここでは、スクリプト実行時に渡す引数はありませんので、[Input Fields]を設定する必要はありません。返り値のHDD温度を [Output Fields]に設定します。
 [Add]リンクを押下し、下記のように設定して下さい。

cacti-self-temp02.png

 新しいData Templatesを作成します。ここでは上記で作成したData Input MethodsをData Sourceに利用します。
 パラメータは下記の通りです。名称などは適宜変更下さい。

cacti-self-temp03.png

 Data Source Itemを追加します。

cacti-self-temp04.5.png

 新しいGraph Templatesを作成します。ここでは上記で作成したData Input Methodsを[Graph Template Items]のData Sourceに利用します。
 パラメータは下記の通りです。名称などは適宜変更下さい。

cacti-self-temp04.png

 上記の状態で一旦「create」を押下すると、新たに[Graph Template Items]、[Graph Item Inputs]が表示されるようになります。
 [Graph Template Items]を以下の通り設定して下さい。
 [Graph Item Inputs]は自動で生成されたものを利用しますので、ここでは特に設定しません。

cacti-self-temp05.png

cacti-self-temp06.png

cacti-self-temp07.png

 2台目のHDD温度監視のための追加設定です。
 上記で作成したData Templates(self - HDD Temperature)のData Source Itemで2台目HDD監視用のDSを作成します。

cacti-self-temp08.png

 上記で作成したGraph Template Items(self - HDD Temperature)で2台目HDD監視用のItemを作成します。

cacti-self-temp09.png

cacti-self-temp10.png

cacti-self-temp11.png

 2台目のHDD温度監視のための追加設定はここまでです。
 Host Templatesを新規作成します。
 [Host Templates]は、新規作成時[Name]フィールドしかありません。[Name]フィールドに適宜[Host Templates]を表す名称を入力し「Create」を押下します。
 押下後、新たに[Associated Graph Templates]が表示されるので、上記で選択したGraph Templatesを選択し「Add」で追加します。

cacti-self-temp12.png

 追加したいDeviceを選択し、Associated Graph Templates(Add Graph Template:)で上記で作成したHost Templatesを選択し「Add」で追加します。
 追加後、Create Graphs for this Hostをクリックします。
 Graph Templatesの中で「Create: self - HDD Temperature」が選択できる状態になっていますので、チェックしページ一番右下の「Create」を押下します。
 これでグラフの作成が開始されます。

●ディスク温度の監視(snmp、extend)

 参考URL:Self-Monitoring、Analysis and Reporting Technology(Wikipedia)

 上記で設定したら何故か値をうまく取得できずグラフ化できませんでしたので、snmp経由で取得するようにします。
 原因は、スクリプトが間違っていました)。
 スクリプト修正後もグラフは表示されません(2016.06.02現在 未解決)。

 temp1=`/sbin/smartctl -i -d ata -a /dev/sda | grep "Temperature_Celsius" | /bin/awk '{print $10}'`
   ↓
 temp1=`/bin/sudo /sbin/smartctl -i -d ata -a /dev/sda | grep "Temperature_Celsius" | /bin/awk '{print $10}'`

 ただし、snmp経由で送られてくるデータが多い場合、応答が遅くなるので注意が必要です。
 シェルスクリプトは下記のとおりです。
# vi /usr/share/cacti/scripts/hddtemp_snmp.sh
#!/bin/bash -f
SMARTCTL=/usr/sbin/smartctl
if [ "$1" = "" ];
then
    echo "Usage: $0 "
    echo "( ex.  $0 /dev/sda )"
    echo " "
    exit 1
fi
TEMP=`${SMARTCTL} -A -d sat $1 | \
       grep 'Temperature_Celsius' |   \
       sed 's/^/ /g'              |   \
       expand                     |   \
       tr -s " "                  |   \
       cut -f11 -d" " `
if [ $? -eq 0 ];
then
if [ "$TEMP" != "" ];
    then
        echo $TEMP
        exit
    fi
fi
exit 1
# chmod +x /usr/share/cacti/scripts/hddtemp_snmp.sh
 実行結果は下記のとおりとなります。
# /usr/share/cacti/scripts/hddtemp_snmp.sh /dev/sda
42 ← 返値(温度)のみ
 上記スクリプトの実行結果で得られる返り値をsnmp経由で受け取れるよう設定します。
※下記は複数のディスクを監視させる場合の例です。
# vi /etc/snmp/snmpd.conf
extend hddtemp_sda /usr/share/cacti/scripts/hddtemp_snmp.sh /dev/sda
extend hddtemp_sdb /usr/share/cacti/scripts/hddtemp_snmp.sh /dev/sdb
extend hddtemp_sdc /usr/share/cacti/scripts/hddtemp_snmp.sh /dev/sdc
# service restart snmpd
 snmpwalkコマンドを実行し、それらしい値が取れているか確認します。

# snmpwalk -v 2c -c public hoge_server .1.3.6.1.4.1.8072.1.3
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendCommand."hddtemp_sda" = STRING: /usr/share/cacti/scripts/hddtemp_snmp.sh
NET-SNMP-EXTEND-MIB::nsExtendArgs."hddtemp_sda" = STRING: /dev/sda
NET-SNMP-EXTEND-MIB::nsExtendInput."hddtemp_sda" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."hddtemp_sda" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendExecType."hddtemp_sda" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."hddtemp_sda" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendStorage."hddtemp_sda" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStatus."hddtemp_sda" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."hddtemp_sda" = STRING: 42
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."hddtemp_sda" = STRING: 42
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."hddtemp_sda" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."hddtemp_sda" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."hddtemp_sda".1 = STRING: 42


 cactiのconsoleタブから、Devicesを表示して該当するデバイスを選択します。
 右上にあるCreate Graphs for this Hostをクリックします。
 Graph Templatesの下にあるプルダウンメニューから、 SNMP - Generic OID Template を選択し、画面の一番右下にあるCreateをクリックします。

cacti-self-temp13.png

 Create Graphs for this Hostをクリックし、Graph TemplatesのCreate:SNMP - Generic OID Templateにチェックを入れ画面の一番右下にあるCreateをクリックします。OIDには、snmpから受け取れる「NET-SNMP-EXTEND-MIB::nsExtendOutputFull."hddtemp_sda"」を追記します。

cacti-self-temp14.png

 ただし、この方法の場合追加で「NET-SNMP-EXTEND-MIB::nsExtendOutputFull."hddtemp_sdb"」は選択できません。対応方法が不明です。

●ディスク温度等の監視(snmp、exec)

 参考URL:Linux/cactiで3ware 9650SEに接続されたHDDの情報を取得するテンプレートを作成する方法

 smartctlで必要な情報を得るためのスクリプトを作成します。
 今回は、Current_Pending_Sector、Reallocated_Sector_Ct、Temperature_Celsiusを監視対象とします。

 Current_Pending_Sector
  現在異常があり、代替処理を待つセクタの総数。もし後で読み込みに成功したセクタがあれば、この値は減少する。

 Reallocated_Sector_Ct
  代替処置(データを特別に予約した予備エリアに移動する)を施された不良セクタの数。

 Temperature_Celsius
  ハードディスクの現在の温度。一般的に動作が保障されている最高温度は55℃である。

 参考URL:Self-Monitoring、Analysis and Reporting Technology(Wikipedia)

 cacti関連のスクリプトなので全て実行権限を付与して/usr/share/cacti/scriptsに保存します。

 Temperature_Celsius監視用スクリプト
# vi /usr/share/cacti/scripts/hddtemp_snmp.sh
#!/bin/bash
temp1=`/sbin/smartctl -i -d ata -a /dev/sda | grep "Temperature_Celsius" | /bin/awk '{print $10;}'`
echo -n "$temp1"


 Current_Pending_Sector監視用スクリプト
# vi /usr/share/cacti/scripts/hddpndsector_snmp.sh
#!/bin/sh
pndsec1=`/sbin/smartctl -i -d ata -a /dev/sda | grep "Current_Pending_Sector " | /bin/awk '{print $10}'`
echo -n "$pndsec1"


 Reallocated_Sector_Ct監視用スクリプト
# vi /usr/share/cacti/scripts/hddsector_snmp.sh
#!/bin/sh
sect1=`/sbin/smartctl -i -d ata -a /dev/sda | grep "Reallocated_Sector_Ct" | /bin/awk '{print $10}'`
echo -n "$sect1"


 これらのスクリプトの実行結果は全て単純な値です。

 監視対象Linuxマシン上の/etc/snmp/snmpd.confを編集します。下記3行を最終行に追加します。
exec temp_sda /usr/share/cacti/scripts/hddtemp_snmp.sh /dev/sda
exec sector_sda /usr/share/cacti/scripts/hddsector_snmp.sh /dev/sdb
exec pndsector_sda /usr/share/cacti/scripts/hddpndsector_snmp.sh /dev/sda

 snmpd.confにexecステートメントを記述すると、特定のスクリプトを実行してOIDに割り当ててくれる機能があり、今回はこれを使用することとします。今回作成したスクリプトは単純な値を返します。この値は自動的に.1.3.6.1.4.1.2021.8に割り当てられます。
 snmpd.conf編集後、snmpdを再起動します。
 返り値とOIDの関係は下記の通りでした。

 Temperature_Celsius: .1.3.6.1.4.1.2021.8.1.101.1
 Reallocated_Sector_Ct: .1.3.6.1.4.1.2021.8.1.101.2
 Current_Pending_Sector: .1.3.6.1.4.1.2021.8.1.101.3

 3種類のData Templatesを新規作成します。
 今回は下記のように設定しました。名称等は適宜変更してください。

cacti-disk-temperature-snmp-exec01.png

cacti-disk-temperature-snmp-exec02.png

cacti-disk-temperature-snmp-exec03.png

 Graph Templatesを新規作成します。名称等は適宜変更してください。
 グラフ表示時の文字列が長いためWidthを600に変更し、Vertical LabelにHDD Informationを設定しました。

cacti-disk-temperature-snmp-exec04.png

 Host Templatesを新規作成します。名称等は適宜変更してください。

cacti-disk-temperature-snmp-exec05.png

 今回作成したテンプレートを適用したいDevicesを選択し、Associated Graph Templatesの下部にあるAdd Graph Template:で上記で作成したHost Templatesを選択します。

cacti-disk-temperature-snmp-exec06.png

 右上の*Create Graphs for this Hostをクリックし、Graph Templates内のCreate: self - HDD INFO snmp(exec)にチェックを入れ、ページ右下のCreateをクリックします。
 10分程度待てばグラフが表示されます。

●新規テンプレートの追加方法

 Cactiでは監視対象を追加する際に、登録してあるホストテンプレートから選択し適用します。例えば、Linux用テンプレートを選択すれば、CPU、ロードアベレージ、メモリなどのリソースをグラフ化できます。つまり監視対象に合わせたホストテンプレートが必要になります。
 インストール直後のHost Templateは、下記の7つしかありません。

 Cisco Router
 Generic SNMP-enabled Host
 Karlnet Wireless Bridge
 Local Linux Machine
 Netware 4/5 Serve
 ucd/net SNMP Host
 Windows 2000/XP Host

 テンプレートは下Cactiの記のページで探すことができます。
 Tmplates
 7つのテンプレートはOfficial Host Templatesとして公開されていますね。
 また、フォーラムのページでも探すことができます。
 Cacti: offical forums and support
 フォーラムのページの右上に[Search]がありすので、クリックし下記の検索条件を入力します。

 Search for keywords: temprature
 Search in forums: Scripts and Templates

 もし、欲しいテンプレートが見つかった場合は、ダウンロードしCactiのConsole → Import Templatesからアップします。

●自前のXMLファイルを作成し独自グラフを表示させる

 参考URL:http://alpha-netzilla.blogspot.jp/2011/01/cacti-data-query-xml.html
 参考URL:Cacti Data Query用 XMLファイルの作成方法
 参考URL:cactiでSNMPで取得した値を使い独自グラフを作成するメモ。
 参考URL:SNMP Data Query Walkthrough

 今回監視対象とするのはDELL製の共有ディスク装置内の個々のハードディスクです。
 DELLのMIB情報について、下記URLを参照しました。

 参考URL:Dell OpenManage SNMP Reference Guide Version 8.2
 OIDは1.3.6.1.4.1.674.10893.1.20.130.4.1です。MIBファイル名はdcstorag.mibです。OMSAがインストールされているサーバでは/opt/dell/srvadmin/etc/srvadmin-storageに保存されていました。

 SNMPを介して取得したい値を定義したXMLファイルを作成します。重要なのはinputとoutputという二つのカテゴリの定義です。

  XMLファイル内のinputの定義はグラフのタイトル等に利用する場合の文字列
  XMLファイル内のoutputの定義はグラフを描画するために必要な値
 と解釈すればいいと思います。

 作成したXMLファイルをData Queriesに設定します。作成したXMLファイルを<path_cacti>/resource/snmp_queries/に保存後、DataQueriesのaddでcactiに追加します。
 例:デルサーバのDiskに関する情報を取得する。
# snmpwalk -v2c node01 -c public .1.3.6.1.4.1.674.10893.1.20.130.4.1.4
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.1 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.2 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.3 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.4 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.5 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.6 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.7 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.8 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.9 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.10 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.11 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.12 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.13 = INTEGER: 3
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.4.14 = INTEGER: 3
これはoutputデータ。
# snmpwalk -v2c node01 -c public .1.3.6.1.4.1.674.10893.1.20.130.4.1.7
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.1 = STRING: "9XF3874J"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.2 = STRING: "9XF38775"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.3 = STRING: "Z1Z7W9WP"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.4 = STRING: "Z1Z7WBE1"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.5 = STRING: "Z1Z7WCHC"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.6 = STRING: "Z1Z7RJEV"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.7 = STRING: "Z1Z7WMJA"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.8 = STRING: "Z1Z7WC0P"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.9 = STRING: "Z1Z7VYRV"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.10 = STRING: "Z1Z7WC85"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.11 = STRING: "Z1Z7VNDQ"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.12 = STRING: "Z1Z7WDZP"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.13 = STRING: "Z1Z7X9A4"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.7.14 = STRING: "Z1Z7W9YV"
これはinputデータ。
# snmpwalk -v2c node01 -c public .1.3.6.1.4.1.674.10893.1.20.130.4.1.8
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.1 = STRING: "AS0B"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.2 = STRING: "AS0B"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.3 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.4 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.5 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.6 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.7 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.8 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.9 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.10 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.11 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.12 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.13 = STRING: "GS0F"
SNMPv2-SMI::enterprises.674.10893.1.20.130.4.1.8.14 = STRING: "GS0F"
これはinputデータ。
 上記に示した値を取得するために作成したXMLは下記のとおりです。
# vi /usr/share/cacti/resource/snmp_queries/dell_array_disk_info.xml
<interface>
        <name>Get Dell Array Disk Information</name>
        <index_order_type>numeric</index_order_type>
        <oid_index>.1.3.6.1.4.1.674.10893.1.20.130.4.1.4</oid_index>

        <fields>
                <arrayDiskState>
                        <name>DiskState</name>
                        <method>walk</method>
                        <source>value</source>
                        <direction>output</direction>
                        <oid>.1.3.6.1.4.1.674.10893.1.20.130.4.1.4</oid>
                </arrayDiskState>
                <arrayDiskSerialNo>
                        <name>DiskSerialNo</name>
                        <method>walk</method>
                        <source>value</source>
                        <direction>input</direction>
                        <oid>.1.3.6.1.4.1.674.10893.1.20.130.4.1.7</oid>
                </arrayDiskSerialNo>
                <arrayDiskEnclosureID>
                        <name>DiskEnclosureID</name>
                        <method>walk</method>
                        <source>value</source>
                        <direction>output</direction>
                        <oid>.1.3.6.1.4.1.674.10893.1.20.130.4.1.8</oid>
                </arrayDiskEnclosureID>
        </fields>
</interface>


 Cactiから定義したsnmp queryが実行出来るか確認します。

self-xml01.png

 「Successfully located XML file.」が表示され読み込み保存が完了後、一度deviceを作成し、Associated Data Queriesを実行してsnmpで値が問題なく取得できるか確認します。
 Associated Graph TemplatesはGraph Templates作成後に設定しますので、ここではスキップします。

self-xml02.png

self-xml03.png

 追加したクエリーのStatusが0 Itgems、0 Rows以外であればデータが取得できていることになります。
 もしデータが取得できない場合、Associated Data Queries → 該当クエリーを選択 → Verbose Queryをクリックします。
 そうすると画面が更新されData Query Debug Informationにその結果が表示されますので内容を確認してください。

self-xml04.png

 Data Templateを定義します。
 この時、Data SourceのData Input Methodは複数の項目を作成することになりますので、Get SNMP Data (Indexed)を選択します。
 Data Source ItemのItemInternal Data Source NameにXMLのoutputで定義した項目名を設定します。

 Graph Templatesを定義します。
 取得した値をどのようにグラフに描画するか定義します。
 再度Data Queriesで定義したGraph Templatesを設定します。

self-xml05.png

 保存後、Graph Template Itemsを追加できるようになりますので、追加します。

self-xml06.png

 これで定義したとおりのグラフが作成されます。基本的なこととして、Data Queries内のGraph Templatesの設定を確認し、Data Source:項目のチェックボックスにチェックが入っている事を確認します。チェックが入っていない場合、グラフは描画されません。

self-xml07.png

 監視対象とするDevicesを選択し、Associated Data Queriesに作成したData Queryに追加されているか確認します。追加されていない場合、追加します。

self-xml08.png

 Create Graphs for this Hostをクリックし、作成したい対象にチェックを入れ画面右下のCreateをクリックします。

self-xml09.png

 10分程度待てばグラフが作成されます。

●作成されるグラフのタイトルが同じとなってしまう現象の回避方法

 既にグラフを作成している場合

 作成されたグラフは後からでも名前の変更ができます。
 Devices → 該当Deviceを選択 → 右上のGraph List → グラフタイトルを変更したいものを選択 → Supplemental Graph Tempalte Data → Title (--title)に|host_description| - Disk - |query_arrayDiskSeriaNo|のように記載しSaveします。
 これでも変更できない場合、グラフ作成元のGraph Templates → Graph Tempalte → Title (--title)のUse Per-Data Source Value (Ignore this Value)のチェックボックスにチェックを入れSaveします。

 これからグラフを作成する場合

 CactiでData Queryからデバイスのインターフェイスやディスク情報のグラフを複数作成すると作成されるグラフのタイトルが同じ名前になってしまう場合があります。これは、Data Queries → 該当Data Queryの選択 → Associatee Graph Templates → 該当Nameの選択 → Suggested Values → Graph Templateのtitleが指定されていないため、参照しているGraph Templateのタイトルがそのまま使われてしまうことが原因です。
 グラフ作成後はこの方法では修正できません。一度グラフを削除し、再作成する必要がありますので注意が必要です。
 グラフ毎に別のタイトルを表示させるようにするには下記のように設定します。
 Data Queries → 該当Data Queryの選択 → Associatee Graph Templates → 該当Nameの選択 → Suggested Values → Graph Template

 例1 |host_description| - Disk - |query_arrayDiskSeriaNo| - |query_arrayDiskName|
 例2 |host_description| - Disk - |query_arrayDiskName|

 |query_(フィールド名)|と記載するとXMLで定義したOIDの値と置換できるようになります。
 複数のtitleを指定することができます。上位のタイトルから利用しますが、値が無い場合は次のタイトルを利用することになります。
 例2の場合、|query_arrayDiskSeriaNo|の値を取得できない場合、|host_description| - Disk - |query_arrayDiskName|を試みます。

●ThresholdsのNameが思ったとおりの名称にならない

 ある監視に対しThresholdを作成したところnode01 - Disk - Physical Disk 0と作成されました。
 これはThresholdを作成する際に参照するData Queries → 該当Data Queryの選択 → Associatee Graph Templates → 該当Nameの選択 → Suggested Values → Data Templateのname設定で
  |host_description| - Disk - |query_arrayDiskName|
  |host_description| - Disk - |query_arrayDisSerialNo|
 の順で設定していたためでした。これを入れ替えることに想定とおりのThresholdsのNameになりました。

●メール通知(0.X系)

 各種通知メールを送信できるよう設定します。
 事前にプラグインをダウンロードします。プラグインは下記サイトで最新のものを確認してダウンロードしてください。
 http://docs.cacti.net/plugins
# wget -P /usr/share/cacti/plugins http://docs.cacti.net/_media/plugin:settings-v0.71-1.tgz
# tar zxvf /usr/share/cacti/plugins/plugin:settings-v0.71-1.tgz -C /usr/share/cacti/plugins 
 Cactiの管理サイトにログインし、左メニューで「Plugin Management」をクリックし、右ペインの「Settings」横の↓アイコンをクリックします。

cacti-x01.png

 →ボタンをクリックしてプラグインを有効にします。

cacti-x02.png

 有効になると Active ステータスになります。

cacti-x03.png

 左メニューで「Settings」をクリックし、右ペインで「Mail/DNS」タブに移動し、以下のように最低限必要な項目を入力して「Save」ボタンをクリックします。
 その他は必要に応じて設定してください。

 Test Mail ⇒ テストメールの送信先
 Mail Services ⇒ メール送信に利用するサービス
 From Email Address ⇒ From のアドレス
 From Name ⇒ From の名前

 設定を保存したら、右上の「Send a Test Email」をクリックしてメール送信が正常にできるか確認します。
 正常にメール送信が完了するとSuccessと表示されます。設定したテストメールの宛先アドレスにメールが送信されているか確認してください。

●しきい値を有効にする(1.X系)

 参考URL:Cactiで監視アラートのプラグインを導入する

 Cacti本体及びプラグインのインストール方法が1.Xになってから変わり、gitからインストールするようになりました。
# yum -y install git
# cd /usr/share/cacti/plugins
# git clone https://github.com/Cacti/plugin_thold.git
# mv plugin_thold thold
 Cactiの監視コンソールにログインすると初期インストール画面が表示されます。
 上記プラグイン導入に伴うアップグレードを聞かれますので「次へ」を繰り返してアップグレードします。
 [Configuration]-[Plugin Management]にThold プラグインが表示されますので

  歯車アイコン → インストール
  チェックアイコン → 有効
  状態 → 操作
 下記のような状態であればプラグインが有効になっています。

cacti-1.x-plugin-01.png

 一度、管理コンソールからログアウトしログインしなおすと[Management]-[Thresholds]が追加されます。

 [Configuration]-[設定]-[Mail/Reporting/DNS]タブを選択して送信元アドレス、送信先アドレス、SMTPサーバアドレスの設定を行います。
 [Send a Test Email]をクリックするとテストメールを送信することができます。
 [Management]-[Notification Lists]をクリックして右上の[+]をクリックしてメール送信先リストを追加します。

 [Management]-[Thresholds]をクリックして右上の[+]をクリックして監視閾値を追加します
 ウィザードが表示されるので監視対象の[デバイス]閾値を設定する[グラフ][データソース]を選択して[作成]をクリックします。
 閾値の詳細を設定します。Threshold Enabledにチェックを入れ閾値、Notification Listsを入力して[保存]をクリックします。
 閾値を下げて設定すると対象が赤くなります。

●しきい値を有効にする(0.X系)

 しきい値が設定できるようにプラグインを有効にします。
 事前にしきい値用のプラグインをダウンロードしておきます。プラグインは下記サイトで最新のものを確認してダウンロードしてください。
 http://docs.cacti.net/plugins
# wget -P /usr/share/cacti/plugins http://docs.cacti.net/_media/plugin:thold-v0.5.0.tgz
# tar zxvf /usr/share/cacti/plugins/plugin:thold-v0.5.0.tgz -C /usr/share/cacti/plugins
 Cacti の管理サイトにログインし、左メニューで「Plugin Management」をクリックし、右ペインの「Thold」横の↓アイコンをクリックします。

cacti-x04.png

 →ボタンをクリックしてプラグインを有効にします。

cacti-x05.png

 有効になると Active ステータスになります。

cacti-x06.png

 左メニューで「Notification Lists」をクリックし、右ペイン上部の「Add」をクリックします。
 「Name」欄には任意の名前を、「Description」欄には任意の説明書きを、 「Email Address」欄には送信先のメールアドレスを入力して「Create」ボタンをクリックします。
 左メニューで「Settings」をクリックし、右ペインで「Thresholds」タブに移動します。
 画面を下へスクロールさせ、「Dead Host Notification Email」欄に、ホストダウン時の通知先メールアドレスを入力し、 画面を最下へスクロールさせて、「Save」ボタンをクリックします。
 なお、デバイスごとにメールの宛先を設定することもできます。
 [console]→[Devices]で、下図のような各デバイスごとのページを表示すると、[Thold Up/Down Email Notification]という設定項目が追加されています。この項目を使用すると、以下のように個別に通知先を設定できます。

 Disabled ・・・ 通知しない
 Global List ・・・ 上記 [console]→[Settings] で設定した宛先に通知
 List Below ・・・ 上記3.3で設定した宛先をメニューから選択して通知
 Global and List Below ・・・ Global List と List Below の両方へ通知

 以上でしきい値を設定するための事前設定は完了です。

●しきい値を設定する

 しきい値を設定します。
 メールの送信設定及びしきい値用プラグインを有効にしておく必要があります。
 例として、ディスクの空き容量にしきい値を設定します。
 Cacti の管理サイトにログインし、左メニューで「Thresholds」をクリックし、右ペインで「Add」をクリックします。
 「Host」,「Graph」,「Data Source」を順に選択していき、「Create」ボタンをクリックします。

cacti-x07.png

 Warning と Alert の場合のしきい値を入力します。 また、Notification List からしきい値を超えた場合のメール通知先を選択します。 全てよければ「Save」ボタンをクリックします。

cacti-x08.png

 以上で、しきい値の設定は終了です。
 異常状態等を検知した場合、下図のように表示されアラートメールが送信されます。

cacti-x09.png

●Percona Monitoring Pluginをインストールする

 参考URL:MySQLの監視はCacti+Percona Monitoring Pluginsがおすすめ(監視サーバ構築編)

 Percona Monitoring Pluginをインストールします。
# rpm -ivh https://www.percona.com/downloads/percona-monitoring-plugins/ \
percona-monitoring-plugins-1.1.7/binary/redhat/7/x86_64/percona-cacti-templates-1.1.7-2.noarch.rpm
https://www.percona.com/downloads/percona-monitoring-plugins/ \
percona-monitoring-plugins-1.1.7/binary/redhat/7/x86_64/percona-cacti-templates-1.1.7-2.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.oWNfPc: ヘッダー V4 DSA/SHA1 Signature、鍵 ID cd2efd2a: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:percona-cacti-templates-1.1.7-2  ################################# [100%]
Scripts are installed to /usr/share/cacti/scripts
Templates are installed to /usr/share/cacti/resource/percona
 Cacti管理画面からImport/Export → Import templatesを選択し、Import Template from Local Fileで以下を指定してImportボタンを押し、テンプレートファイルを読み込ませます。
/usr/share/cacti/resource/percona/cacti_host_template_percona_mysql_server_ht_0.8.6i-sver1.1.6.xml
 成功すると、それぞれの監視項目に対応したテンプレートごとに[success]と表示されます。

cacti-percona01.png

 あとはConsole → Devices → [監視対象ホスト] → Associated Graph Templates → Add Graph Template:で、監視したいPerconaのテンプレートを選択します。
 監視対象のMySQLにログインする際のアカウント情報を/usr/share/cacti/scripts/ss_get_mysql_stats.phpに書き込みます。
 もし、セキュリティ重視でcactiuserを使用する場合は、権限設定に注意して下さい。ss_get_mysql_stats.phpは内部的に、SHOW ENGINE INNODB STATUSなどのステータス取得コマンドを使用しますので、以下のようにSUPERとPROCESS権限を与えてください。
 ※Perconaの公式ページには、「SUPER、PROCESS権限が必要」と記載されていますが、MySQL 5.1.24以上のバージョンでは、PROCESS権限でSHOW INNODB STATUSコマンドの実行が可能となったため、SUPER権限は不要です。
# mysql -u root -p
MariaDB [(none)]>  GRANT SUPER,PROCESS ON *.* TO cactiuser@localhost ;
※上記のアクセス権ではグラフが表示されなかった
# mysql -u root -p
MariaDB [(none)]> grant super,process on *.* to cactiuser@localhost identified by 'cactipass';
MariaDB [(none)]> flush privileges;
※上記でもグラフが表示されなかった
※"localhost"部分を実IPアドレスで実行したところグラフが表示された
# mysql -u root -p
MariaDB [(none)]> grant super,process on *.* to cactiuser@192.168.0.1 identified by 'cactipass';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> SELECT user,password host FROM mysql.user;
 これでもグラフの枠のみが表示されデータ取得出来ない場合、下記URL(「PMP for Cacti」でMySQLのステータスを可視化する)の「データテンプレートの調整」を参考にしていただき、各データソースで「Password」「Port」「Username」を設定してください。

 Cacti移植後(192.168.110.1)等に移植前のmariadb(mysql)を監視するには下記のようにします。
 設定は監視される側のサーバで実施します。
# mysql -u root -p
MariaDB [(none)]> grant all privileges on cacti.* to cactiuser@"192.168.110.1" identified by 'パスワード' with grant option;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> select user,host from mysql.user;
+-----------+---------------------------+
| user      | host                      |
+-----------+---------------------------+
| cacti     | 192.168.110.1             |
+-----------+---------------------------+
16 rows in set (0.00 sec)
 上記のように設定されていればOKです。

 「PMP for Cacti」でMySQLのステータスを可視化する

 Percona Monitoring Plugins for Cactiは、監視対象のMySQLにログインして、色々な種類のshowコマンドを実行して得られた結果をグラフにするので、監視対象のMySQLにユーザを追加する必要があります。ここで指定するユーザ名とパスワードは、ss_get_mysql_stats.phpファイルに書いた、 $mysql_userと$mysql_passと一致させてください。
 Percona Monitoring Pluginsを使用して監視させたいサーバをDevicesから選択します。
 Host Templateで「Percona MySQL Server HT」を選択し、ページ下部の「Save」をクリックします。するとAssociated Graph TemplatesにPercona関連のテンプレートが追加されます。まだ、この状態ではグラフは作成されませんのでグラフを作成します。
 ページ右上にある「Create Graphs for this Host」をクリックします。Graph Templates内でPercona関連のグラフを作成できる状態になっているはずです。作成したいグラフをチェックしページ下部の「Create」をクリックします。
 ページ右上の「Edit this Host」をクリックし、Associated Graph Templates内で作成したグラフのStatusが「Is Being Graphed」が緑字に変わっていれば作業は完了です。自動的にグラフが作成されます。
 画像がリンク切れの場合、まだグラフを描画できる情報が集まっていないので、少し(5分おきの情報収集がデフォルトなので、2回分10分以上)待ってもう一度確認してみましょう。画像は表示されたのに、いくら待ってもグラフが表示されない場合は、監視対象から情報が取得できていない可能性がありますので、SNMPの設定やMySQLの設定(特にユーザ関連)を見直しましょう。

●cactiをアップデートしたら監視ページでアクセス拒否(Forbidden)された

 cactiをアップデート後、監視ページにアクセスしたら接続拒否(Forbideden)されました。ログを確認したところ下記のようなログが残っていました。
Directory index forbidden by Options directive: /var/www/cacti/
 調べたところcactiに関するファイルが/var/www/cactiではなく/usr/share/cactiに変更されていました。したがって、cacti.confを下記のとおり変更しました。
# vi /etc/httpd/conf.d/cacti.conf
#Alias /cacti/ /var/www/cacti/
#<Directory /var/www/cacti/>
Alias /cacti/ /usr/share/cacti/
<Directory /usr/share/cacti/>
    DirectoryIndex index.php
    Options -Indexes
    AllowOverride all
    order deny,allow
    deny from all
    allow from 127.0.0.1 ::1
    allow from 192.168.0.0/24
    AddType application/x-httpd-php .php
    php_flag magic_quotes_gpc on
    php_flag track_vars on
</Directory>
# systemctl restart httpd
 すると今度は下記のようなエラーが出力されました。
FATAL: Cannot connect to MySQL server on 'localhost'.Please make sure you have specified a valid MySQL database name in 'include/config.php' 
 どうもうまくMySQLに接続できていないようです。コマンドレベルでMySQLに接続できるかどうか確認してみます。
# mysql -u cactiuser --password=******
ERROR 1045 (28000): Access denied for user 'cactiuser'@'localhost' (using password: YES)
 あれ?接続できない・・・。こことかここを確認しましたがどうにもこうにも・・・。
 MySQLに管理者権限で確認したところ履歴が残っていて、パスワードが間違っていることが判明しました。

●cactiアップデート時に実施した作業内容

 グラフの保存場所が変わっているので旧フォルダから新フォルダにコピー。
# cp -p /var/www/cacti/rra/* /var/lib/cacti/rra/

 cactiのcron用ファイルは新規ファイルを使用するので該当行をコメントアウトを外す。
# vi /etc/cron.d/cacti
# */5 * * * *	cacti	/usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1
 ↓
*/5 * * * *	cacti	/usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1

 cactiのホームディレクトリの変更
# vi /etc/passwd
/var/www/cacti
 ↓
/usr/share/cacti

 Poller Cacheの再構成。console → System Utilities → Rebuild Poller Cacheをクリック。

 ログの出力先変更。console → Settings → Pathsをクリック。
Cacti Log File Path → /usr/share/cacti/log/cacti.log
 最後にSaveをクリック。

●valid MySQL database name in 'include/config.php'

 ある時cactiの管理画面に接続したところ、下記のようなエラーが表示され接続できない事象が発生しました。
FATAL: Cannot connect to MySQL server on '127.0.0.1'.Please make sure you have specified a valid MySQL database name in 'include/config.php'
 いろいろ確認しました。どうも正常に動作していないようだったので該当プロセスIDを強制的にkillしました。その後、mysqlを再起動したところ正常に動作するようになりました。

# mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
# service mysql status
mysql: unrecognized service
# service mysqld status
mysqld (pid 9009) is running...
# mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
# service mysqld stop
Timeout error occurred trying to stop MySQL Daemon.
Stopping mysqld: [FAILED]
# ls -l /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
# ps -ef | grep mysqld
root 8904 1 0 2015 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9009 8904 0 2015 ? 17:44:25 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 93186 52061 0 02:51 pts/2 00:00:00 grep mysqld
# kill -9 9009
# kill -9 8904
# ps -ef | grep mysqld mysql 93485 1 0 02:52 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 93588 52061 0 02:52 pts/2 00:00:00 grep mysqld
# kill -9 93485
# ps -ef | grep mysqld
root 93661 52061 0 02:52 pts/2 00:00:00 grep mysqld
# service mysqld start
Starting mysqld: [ OK ]


●pollerがタイムアウトする

 cactiの動作がおかしくリアルタイムで正常にグラフが表示されない状態(過去9時間前までは表示される)となっています。
 /var/log/cacti/cacti.logを調べたところ下記のような記録がありました。
 pollerの動作間隔(5分)より応答時間がかかっているようです。
 Host[17]のDS[700-763]に対して異常があるようです。

05/26/2016 01:50:02 AM - POLLER: Poller[0] WARNING: Cron is out of sync with the Poller Interval! The Poller Interval is '300' seconds、with a maximum of a '300' second Cron、but 601 seconds have passed since the last poll!
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[700] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[700] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[701] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[701] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[702] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[702] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[703] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[703] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[704] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[704] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[705] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[705] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[706] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[706] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[707] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[707] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[708] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[708] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[709] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[709] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[710] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[710] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[711] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[711] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[712] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[712] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[713] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[713] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[714] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[714] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[715] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[715] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[716] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[716] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[717] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[717] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[718] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[718] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[719] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[719] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[720] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[720] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[721] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[721] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[722] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[722] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[723] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[723] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[724] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[724] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[725] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[725] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[726] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[726] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[727] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[727] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[728] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[728] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[729] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[729] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[730] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[730] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[731] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[731] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[732] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[732] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[733] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[733] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[734] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[734] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[735] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[735] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[736] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[736] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[737] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[737] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[738] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[738] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[739] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[739] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[740] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[740] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[741] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[741] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[742] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[742] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[743] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[743] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[744] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[744] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[745] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[745] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[746] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[746] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[747] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[747] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[748] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[748] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[749] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[749] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[750] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[750] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[751] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[751] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[752] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[752] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[753] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[753] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[754] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[754] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[755] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[755] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[756] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[756] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[757] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[757] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[758] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[758] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[759] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[759] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[760] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[760] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[761] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[761] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[762] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[762] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[763] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - CMDPHP: Poller[0] Host[17] DS[763] WARNING: Result from SNMP not valid. Partial Result: U
05/26/2016 01:50:11 AM - SYSTEM STATS: Time:9.4046 Method:cmd.php Processes:1 Threads:N/A Hosts:16 HostsPerProcess:16 DataSources:1307 RRDsProcessed:712


 HDは、Console → Devices → 該当ID番号を確認します。
 DSは、Console → Graph Management → 該当ID番号を確認します。
 該当のグラフを確認したところデータ取得ができない状態でした。したがって、該当のグラフ全てを作成しないよう削除しました。
 それでも同じエラーログが記録されるようであれば、Console -> Data Sourcesで該当のData Sourcesを削除します。

●作成されるグラフの時刻が9時間ずれる

 OSの時刻設定はUTCなのに作成されるグラフは9時間前のものでした。
 cactiの再インストールやアップデートを実施しても状況は変わりませんでした。
 MariaDBの時刻を確認してみました。
# mysql -u root -p
※時刻が正常なサーバ
# mysql -u root -p
mysql> select curdate()、current_date()、current_date;
+------------+----------------+--------------+
| curdate()  | current_date() | current_date |
+------------+----------------+--------------+
| 2016-05-26 | 2016-05-26     | 2016-05-26   |
+------------+----------------+--------------+
1 row in set (0.00 sec)
mysql> select curtime()、current_time()、current_time;
+-----------+----------------+--------------+
| curtime() | current_time() | current_time |
+-----------+----------------+--------------+
| 06:27:03  | 06:27:03       | 06:27:03     |
+-----------+----------------+--------------+
1 row in set (0.00 sec)
※時刻が9時間遅れているサーバ
mysql> select curdate()、current_date()、current_date;
+------------+----------------+--------------+
| curdate()  | current_date() | current_date |
+------------+----------------+--------------+
| 2016-05-26 | 2016-05-26     | 2016-05-26   |
+------------+----------------+--------------+
1 row in set (0.00 sec)
mysql> select curtime()、current_time()、current_time;
+-----------+----------------+--------------+
| curtime() | current_time() | current_time |
+-----------+----------------+--------------+
| 15:26:47  | 15:26:47       | 15:26:47     |
+-----------+----------------+--------------+
1 row in set (0.00 sec)
 MariaDBのタイムゾーンを確認します。
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.05 sec)
 日本時間となっていました。UTCに修正します。/etc/my.cnfにdefault-time-zoneを追加または修正するまでもなく、MariaDBの再起動でUTCになりました。

●Maximum runtime of *** seconds exceeded. Exiting

 参考URL:cacti グラフの数値が反映されない

 cactiを移植後、cacti.logに下記のようなエラーが記録されグラフが一向に更新されませんでした。
11/01/2016 03:30:00 AM - POLLER: Poller[0] Maximum runtime of 298 seconds exceeded. Exiting.
11/01/2016 03:30:00 AM - SYSTEM STATS: Time:298.2780 Method:spine Processes:1 Threads:1 Hosts:7 HostsPerProcess:7 DataSources:688 RRDsProcessed:0
 Spineの設定を確認したところ設定ファイルがありませんでした。
# /usr/local/spine/bin/spine -C /usr/local/spine/etc/spine.conf
11/01/2016 10:35:20 AM - SPINE: Poller[0] ERROR: Could not read config file: /usr/local/spine/etc/spine.conf (Spine init)
 下記のようにSpineがcactiのデータベースにアクセス出来るようにユーザとパスワードを設定しました。
# cp /usr/local/spine/etc/spine.conf.dist /usr/local/spine/etc/spine.conf
# /usr/local/spine/bin/spine -C /usr/local/spine/etc/spine.conf
SPINE: Using spine config file [/usr/local/spine/etc/spine.conf]
11/01/2016 10:37:44 AM - SPINE: Poller[0] FATAL: Connection Failed, Error:'1045', \
Message:'Access denied for user 'cacti'@'localhost' (using password: YES)' (Spine init)
# vi /usr/local/spine/etc/spine.conf
# /usr/local/spine/bin/spine -C /usr/local/spine/etc/spine.conf
SPINE: Using spine config file [/usr/local/spine/etc/spine.conf]
SPINE: Version 0.8.8h starting
cacti@127.0.0.1's password: (パスワードの入力)
SPINE: Time: 24.4985 s, Threads: 1, Hosts: 7
 この後、無事にグラフが更新されるようになりました。

●WARNING: SNMP timeout detected [*** ms]

 cacti.logに下記のようなエラーが記録されていました。
11/01/2016 02:12:05 PM - SPINE: Poller[0] Host[1] TH[1] DS[35] WARNING: SNMP timeout detected [500 ms], ignoring host '192.168.0.1'
 Host[1]なので、cacti管理画面の「Management」-「Devices」からIDが「1」であるデバイスをクリックします。
 「SNMP Options」-「SNMP Timeout」の値を「500」から「1500」に変更したところ問題が解消しました。

●cactiの移植

 参考URL:Cactiサーバーのデータ移植

 上記ページを参照してcactiの移植を実施します。
 方法はserver01からserver02への移植です。OS等は同じですがIPアドレス・サーバ名は異なります。したがって細かな話になりますが、cactiの設定でIPアドレス等を変更する必要があります。このことによりどんな影響が生じるのか確認したいと思います。

 移植の手順
  1. 移植先のサーバでApache、MySQL(mariadb)、SNMP、Cactiをインストールし、Cactiの管理画面から初期化を行う手前の状態にします。
  2. データを移植します(DB、rrd、追加スクリプト、追加リソース、追加テンプレート、追加プラグイン)。
  3. 移植先のCactiの管理画面でアップグレードを選択して初期設定を進めます。
  4. 全てのグラフが更新できているか確認します。
  5. 全てのグラフが正常に更新されるようになったらもう一度rrdファイルを上書き移植します(一回で成功した場合は作業不要)。
  6. 移植先でCactiでのDevices内のIPアドレス等の変更、Settings -> Poller -> Poller Type、Poller Interval、Cron Interval等の変更、Mail / DNS -> From Email Address、From Mail等の変更、Thresholds -> Base URL、From Email Address、From Mail等の変更
  7. Console → Devices → [監視対象サーバ] → Associated Data Queries → ucd/net - Get Monitored Partitionsの右にある緑色の丸印をクリックしてクエリを再読み込み。

 移植の対象

監視対象の定義
 MySQLのcactiデータベースに格納されています
グラフデータ
 ファイルシステム上に*.rrdの形でグラフ毎にファイルが存在します
追加スクリプト
 cacti/scripts配下
追加リソース
 cacti/resource配下
追加テンプレート

 監視対象定義の移植

 MySQLのcactiデータベースを移植元でダンプし、移植先にリストアします。
# バックアップ(移植元)
# mkdir /root/cacti_backup        # 作業用ディレクトリの作成
# cd cacti_backup
# mysqldump -u root cacti > cacti.db

 scp等でリストア先にコピーします。
# リストア(移植先)
# mkdir /root/cacti_restore        # 作業用ディレクトリの作成
# cd cacti_restore
# mysql -u cacti -p cacti < cacti.db


 グラフデータのコンバートと移植

 アーキテクチャの異なる環境への移植(例えば、32bitから64bitへの移植)の場合、移植元でrrdファイルをXML形式にダンプして移植先でリストアする必要があります。
 CentOSでは/usr/share/cacti/rraディレクトリに格納されていたので、エクスポート用にコピーしてXML形式に一括変換します。

 rraディレクトリのある場所に移動 sudo find / -name *.rrd で探します。
# cd /usr/share/cacti
 エクスポート用にコピーします。
# mkdir /root/cacti_backup/rra_export
# cp -p rra/*.rrd /root/cacti_backup/rra_export
 エクスポート用ディレクトリに移動します。
# cd /root/cacti_backup/rra_export
 変換用スクリプトを作成します。
# cd /root/cacti_backup/rra_export
# vi dump.sh
for i in *.rrd ;do
        rrdtool dump $i ${i%.rrd}.xml
        rm -f $i
done
 進捗が見えるようにデバッグオプション -x を付けてスクリプトを実行します。ただし、変換元のファイルが削除されますのでオリジナルのディレクトリで実行しないように注意してください。
# sh -x dump.sh
 xml形式に変換できたらscp等で移植先サーバにコピーします。
 /root/cacti_restoreにコピーした場合。
# cd /root/cacti_restore
 変換用スクリプトを作成します。
# vi restore.sh
for i in *.xml ;do
        rrdtool restore $i ${i%.xml}.rrd
        rm -f $i
done
 進捗が見えるようにデバッグオプション -x を付けてスクリプトを実行します。
# sh -x restore.sh
 rrd形式に変換できたら移植先のCactiのrraディレクトリに上書きコピーします。
 リストアしたrrdファイルを上書きコピーします。
# unalias cp    # 逐一上書き確認されないようにエイリアス cp -i を解除します。
# cp -p /root/cacti_restore/*.rrd /usr/share/cacti/rra/
 cactiユーザでrrdファイルに書き込めないとグラフが更新されないのでrrdファイルのオーナーを修正します。
# chown -R cacti.cacti /usr/share/cacti/rra/*
# alias cp='cp -i'    # エイリアス cp -i を有効にします。
# alias
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'


 追加スクリプトの移植

 /usr/share/cacti/scripts/ に追加したスクリプトがある場合は移植します。

 追加リソースの移植

 /usr/share/cacti/resource/に追加したリソースがある場合は移植します。
 例えば、SNMP Informantを追加している場合、resource/snmp_queries/snmp_informant_* を移植しました。

 追加テンプレートの移植

 移植元のCactiでエクスポート(Console > Exports Templates)、移植先でインポート(Console > Import Templates)で移植します。
 例えば、SNMP Informantの元ファイルがある場合、それをインポートします。

 追加プラグインの移植

 移植元でSpineを利用していたため/usr/share/cacti/pluginsを移植先にコピーします。

 移植先のCacti環境の変更

 移植先のCactiで移植先の環境に合わせて設定変更します。
 「●Percona Monitoring Pluginをインストールする」で移植元にはMariaDBを監視するための設定がされていました。しかし、移植してきたデータベースのままでは移植先のMariaDBを監視することが出来ません。
 このためデータベースをリストア後、Cactiにログインして元々監視していたDeviceから該当のグラフを全て作成しないようにしました。
 Console > Devices > 元々のホストを選択 > 右上のGraph Listを選択 > Percona関連のグラフを全て選択 > 右下でDeleteを選択し、Goをクリック > Delete all Data Source(s) referenced by these Graph(s).を選択し、Continueをクリック
 これでPercona関連のグラフがData Sourceから全て削除されます。
 その後、再度、Console > Devices > 元々のホストを選択してください。Associated Graph TemplatesのPercona関連のStatusが全てNot Being Graphedに変化しているはずです。このままでも問題ありませんが、これらが邪魔な時は右の×を一回ずつクリックすることで削除されます。

 グラフが更新されないときのチェック事項

 コピーしたグラフのユーザ権限がcactiかつ読み書きになっているか?
# ls -l /usr/share/cacti/rra/
# chown cacti.root /usr/share/cacti/rra/*.rrd

 移植先サーバーからのSNMPアクセスが許可されているか?

 移植先サーバーからsnmpwalkコマンドでレスポンスが得られるか確認します。
 レスポンスが得られない場合はSNMPのアクセス許可、ファイアウォールの設定を見直します。
$ snmpwalk -v 1 -c public xxx.xxx.xxx.xxx

 poller.phpが動いているか?

 /etc/cron.d/cactiの内容を確認します。
$ cat /etc/cron.d/cacti
*/5 * * * * cacti   php /usr/share/cacti/poller.php &>/dev/null

 ポーリング中にエラーが出ていないか?

 デバッグメッセージ付きでpoller.phpを実行してみます。
 移植元にあったテンプレートが移植先で存在しない場合はここでエラーが確認できます。
$ su -s /bin/bash - cacti -c "php /usr/share/cacti/poller.php --force --debug"
 エラーの確認後にテンプレートを追加した場合は、Cactiの Console>Device から該当する監視対象の定義を開いて一度saveしないと更新されないようです。

 rrdファイルが更新されているか?

 rrdファイルの日付がポーリングを実行した時刻に更新されているか確認します。
 オーナーがcactiユーザーになっているか確認します。
$ ls -l /usr/share/cacti/rra


●バージョンアップ(0.8.8→1.0.4)

 参考URL:Cacti公式サイト

 CentOS 7のCactiがバージョンアップしました。
 多言語に対応したようです。

●バージョンアップ後のエラー

 2台のCactiのうち1台でバージョンアップ後、さまざまなエラーがcacti.logに記録されました。結果、何をしても問題が解消されなかったため、Cacti再インストール、Cactiデータベース再作成、Cacti設定情報再投入、監視対象手動による再設定を実施したところ回復しました。

 バージョンアップ後、ログに出力されたエラーを記載しています。

 「/usr/share/cacti/lib/ping.php on line: 467」が記録される

 下記のようなエラーが記録されていました。

2017-03-17 11:05:35 - ERROR PHP WARNING: socket_connect(): unable to connect [115]: Operation now in progress in file: /usr/share/cacti/lib/ping.php on line: 467 2017-03-17 11:05:35 - CMDPHP PHP ERROR WARNING Backtrace: (/cmd.php: 449 ping)(/lib/ping.php: 564 ping_tcp)(/lib/ping.php: 467 socket_connect)(CactiErrorHandler)(/lib/functions.php: 4259 cacti_debug_backtrace)


 各デバイスへのPing監視をすべて「UDP Ping」から「ICMP Ping」に変更したところ解消されました。
 それぞれのDevice画面で「Device [edit: ホスト名]」-「Availability/Reachability Options」-「Ping Method」で「ICMP Ping」を選択しました。

 There are no RRA's assigned to local_data_id

 参考URL:「PMP for Cacti」でMySQLのステータスを可視化する

 Perconaのグラフが表示されなくなったため、一度Percona関連のグラフやデータソース、テンプレートを削除しました。その後、テンプレートをインポートしましたが「CMDPHP ERROR: There are no RRA's assigned to local_data_id」というエラーが定期的に記録されグラフが表示されなくなってしまいました。いろいろ調べたところ下記の方法によりようやくグラフの枠は表示されるようになりました。が、データ取得が出来ない状態です。
 Managementの「Data Source」を選択 - グラフが表示されない該当の「Data Source Name」を選択 - 右上の「Edit Data Template.」を選択 - 何も変更せずに「Save(保存)」を選択します。
 正常に動作していれば、左ペインの「Templates」を選択 - 「Data Source」を選択 - 「Data Template Name」に表示されます。
 これで正常にグラフが表示されます。
 何でアップデート後、今までと違った動作になってしまったのだろうか・・・。

 データ取得が出来ない状態が解消しました。上記URL(「PMP for Cacti」でMySQLのステータスを可視化する)の「データテンプレートの調整」を参考にしていただき、各データソースで「Password」「Port」「Username」を設定したところデータを取得できるようになりました。

 データベース破損(SQL Assoc Failed!)

 参考URL:計測環境が壊れていました。

 どうもMySQL内のCacti用のデータベースが壊れてしまったみたいです。cacti.logに下記のようなログが大量に記録されていました。

11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'2006', SQL:"select poller_output.output, poller_output.time, UNIX_TIMESTAMP(poller_output.time) as unix_time, poller_output.local_data_id, poller_item.rrd_path, poller_item.rrd_name, poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) order by poller_output.local_data_id LIMIT 10000"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT count(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'2006', SQL:"select poller_output.output, poller_output.time, UNIX_TIMESTAMP(poller_output.time) as unix_time, poller_output.local_data_id, poller_item.rrd_path, poller_item.rrd_name, poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) order by poller_output.local_data_id LIMIT 10000"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT count(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'2006', SQL:"select poller_output.output, poller_output.time, UNIX_TIMESTAMP(poller_output.time) as unix_time, poller_output.local_data_id, poller_item.rrd_path, poller_item.rrd_name, poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) order by poller_output.local_data_id LIMIT 10000"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT count(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'2006', SQL:"select poller_output.output, poller_output.time, UNIX_TIMESTAMP(poller_output.time) as unix_time, poller_output.local_data_id, poller_item.rrd_path, poller_item.rrd_name, poller_item.rrd_num from (poller_output,poller_item) where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_name=poller_item.rrd_name) order by poller_output.local_data_id LIMIT 10000"
11/25/2016 11:39:59 AM - CMDPHP: Poller[0] ERROR: SQL Cell Failed!, Error:'2006', SQL:"SELECT count(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"


 壊れたサーバが移植して構築したサーバなので、移植元の環境からデータベースをダンプし更新しました。
 が、連日同様のログが出力され1日でログサイズが1GBを超え、ログファイルが一部壊れ、ローテーション時の圧縮が出来ない状態となってしまいました。
 どうもcactiのバージョンが違っているのが原因っぽいです。復旧用コマンドは下記のとおりです。
# /usr/bin/php /var/lib/cacti/cli/repair_database.php
 上記コマンドで回復する場合が多いようですが、今回は回復しませんでした。Cacti再インストール、データベース再作成を実施しました。(2017.03.30)

 MySQL server has gone away

 参考URL:マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~

 下記ログには「SQL Assoc Failed」が記録されている中、「error: MySQL server has gone away」という新たな文言も記録されています。どうもこれまでとは違うエラーが発生しているようです。

2017-03-17 15:05:01 - CMDPHP ERROR: A DB Exec Failed!, Error: MySQL server has gone away
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 549 log_cacti_stats)(/poller.php: 673 snmpagent_cacti_stats_update)(/lib/snmpagent.php: 51 set)(/lib/mib_cache.php: 172 db_execute_prepared)(/lib/database.php: 178 cacti_debug_backtrace)
2017-03-17 15:05:01 - DBCALL ERROR: SQL Assoc Failed!, Error:2006, SQL:"SELECT pc.id, ph.name, ph.file, ph.function FROM plugin_hooks AS ph LEFT JOIN plugin_config AS pc ON pc.directory = ph.name WHERE ph.status = 1 AND hook = ? ORDER BY id ASC"
2017-03-17 15:05:01 - DBCALL ERROR: SQL Assoc Failed!, Error: MySQL server has gone away
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 549 log_cacti_stats)(/poller.php: 675 api_plugin_hook_function)(/lib/plugins.php: 93 db_fetch_assoc_prepared)(/lib/database.php: 359 cacti_debug_backtrace)
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 563 db_fetch_cell_prepared)(/lib/database.php: 246 cacti_debug_backtrace)
2017-03-17 15:05:01 - DBCALL ERROR: A DB Exec Failed!, Error:2006, SQL:"REPLACE INTO settings (name,value) VALUES ('stats_recache_1','RecacheTime:0.0 DevicesRecached:0')'
2017-03-17 15:05:01 - CMDPHP ERROR: A DB Exec Failed!, Error: MySQL server has gone away
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 571 db_execute)(/lib/database.php: 113 db_execute_prepared)(/lib/database.php: 178 cacti_debug_backtrace)
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 710 snmpagent_poller_bottom)(/lib/snmpagent.php: 234 api_plugin_is_enabled)(/lib/plugins.php: 566 db_fetch_cell_prepared)(/lib/database.php: 246 cacti_debug_backtrace)
2017-03-17 15:05:01 - DBCALL ERROR: SQL Assoc Failed!, Error:2006, SQL:"SELECT status, COUNT(*) as cnt FROM `host` GROUP BY status"
2017-03-17 15:05:01 - DBCALL ERROR: SQL Assoc Failed!, Error: MySQL server has gone away
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 710 snmpagent_poller_bottom)(/lib/snmpagent.php: 245 db_fetch_assoc)(/lib/database.php: 320 db_fetch_assoc_prepared)(/lib/database.php: 359 cacti_debug_backtrace)
2017-03-17 15:05:01 - CMDPHP SQL Backtrace: (/poller.php: 710 snmpagent_poller_bottom)(/lib/snmpagent.php: 266 table)(/lib/mib_cache.php: 129 db_fetch_cell_prepared)(/lib/database.php: 246 cacti_debug_backtrace)
2017-03-17 15:05:01 - ERROR PHP ERROR: Call to a member function row() on a non-object in file: /usr/share/cacti/lib/snmpagent.php on line: 266
2017-03-17 15:05:01 - CMDPHP PHP ERROR Backtrace: (CactiShutdownHandler)(/lib/functions.php: 4302 cacti_debug_backtrace)
2017-03-17 15:05:01 - POLLER: Poller[1] WARNING: There are '1' detected as overrunning a polling process, please investigate


 maridbのデフォルトタイムアウト時間は8時間で設定されていました。
MariaDB [(none)]> show global variables like '%wait%';
+---------------------------------------------------+----------+
| Variable_name                                     | Value    |
+---------------------------------------------------+----------+
| innodb_lock_wait_timeout                          | 50       |
| innodb_spin_wait_delay                            | 6        |
| lock_wait_timeout                                 | 31536000 |
| performance_schema_events_waits_history_long_size | 10000    |
| performance_schema_events_waits_history_size      | 10       |
| wait_timeout                                      | 28800    |
+---------------------------------------------------+----------+
6 rows in set (0.00 sec)
 [mysqld]セクションにwait_timeoutを1時間に設定します。
# vi /etc/my.cnf.d/server.cnf
[mysqld]
wait_timeout=3600
# systemctl restart mariadb
 正しく設定されているか確認します。
MariaDB [(none)]> show global variables like '%wait%';
+---------------------------------------------------+----------+
| Variable_name                                     | Value    |
+---------------------------------------------------+----------+
| innodb_lock_wait_timeout                          | 50       |
| innodb_spin_wait_delay                            | 6        |
| lock_wait_timeout                                 | 31536000 |
| performance_schema_events_waits_history_long_size | 10000    |
| performance_schema_events_waits_history_size      | 10       |
| wait_timeout                                      | 3600     |
+---------------------------------------------------+----------+
6 rows in set (0.00 sec)
 正しく設定されています。
 wait_timeout値を変更します。サーバのCPU性能やメモリ搭載量にも関係するようなので、値は短すぎても長すぎても同じエラーが発生するようです。様子を見つつ設定するしかなさそうです。
 結局のところ、設定の効果はありませんでした。Cacti再インストール、データベース再作成を実施しました。(2017.03.30)

 Lost connection to MySQL server during query

 参考URL:mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table が出て困った

 上記ページを参照して作業をを実施します。
 cactiのログに下記のようなエラーが記録されていました。

2017-03-28 10:10:29 - CMDPHP ERROR: A DB Exec Failed!, Error: Lost connection to MySQL server during query
2017-03-28 10:10:29 - CMDPHP SQL Backtrace: (/poller.php: 526 log_cacti_stats)(/poller.php: 670 db_execute_prepared)(/lib/database.php: 178 cacti_debug_backtrace)
2017-03-28 10:10:29 - CMDPHP SQL Backtrace: (/poller.php: 526 log_cacti_stats)(/poller.php: 673 snmpagent_cacti_stats_update)(/lib/snmpagent.php: 29 snmpagent_read)(/lib/snmpagent.php: 568 db_fetch_cell)(/lib/database.php: 201 db_fetch_cell_prepared)(/lib/database.php: 246 cacti_debug_backtrace)
2017-03-28 10:10:29 - DBCALL ERROR: A DB Exec Failed!, Error:2006, SQL:"UPDATE `snmpagent_cache` SET `value` = ? WHERE `mib` = ? AND `name` = ? LIMIT 1'


 MySQLの設定値を確認します。
MariaDB [(none)]> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| deadlock_timeout_long      | 50000000 |
| deadlock_timeout_short     | 10000    |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| thread_pool_idle_timeout   | 60       |
| wait_timeout               | 7200     |
+----------------------------+----------+
13 rows in set (0.00 sec)
 net_read_timeoutが30秒、net_write_timeoutが60秒でした。
 これらの値を大きくするため、/etc/my.cnf.d/server.cnfに追加します。
# vi /etc/my.cnf.d/server.cnf
net_read_timeout=3600
net_write_timeout=3600
# systemctl restart mariadb
 反映されているか確認します。
MariaDB [(none)]> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| deadlock_timeout_long      | 50000000 |
| deadlock_timeout_short     | 10000    |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 3600     |
| net_write_timeout          | 3600     |
| slave_net_timeout          | 3600     |
| thread_pool_idle_timeout   | 60       |
| wait_timeout               | 7200     |
+----------------------------+----------+
13 rows in set (0.00 sec)
 これで様子を見ます。
 結局のところ、Cacti再インストール、データベース再作成を実施しました。(2017.03.30)

●Your MySQL TimeZone database is not populated. Please populate this database before proceeding

 MySQLにcCactiのデータベースを初期化し、Cactiのページにアクセス後、下記のようなエラーが表示されました。
Your MySQL TimeZone database is not populated. Please populate this database before proceeding
 下記コマンドを実行したところ問題が解消されました。
# mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql
Enter password: 
Warning: Unable to load '/usr/share/zoneinfo//leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//tzdata.zi' as time zone. Skipping it.
 Warningは無視して問題ありません。

●ERROR: Your Cacti database login account does not have access to the MySQL TimeZone database. Please provide the Cacti database account "select" access to the "time_zone_name" table in the "mysql" database, and populate MySQL's TimeZone information before proceeding.

 cactiのアップデート後、「Cacti Installation Wizard」でエラーが出力されました。
 対処方法は下記のとおりです。
タイムゾーンデータの読み込み
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
タイムゾーンの設定
$ vi /etc/my.cnf
[mysqld]
default-time-zone = 'Asia/Tokyo'
確認
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
権限設定
mysql> grant select on mysql.time_zone_name to 'cactiuser'@'localhost' identified by 'cactipass';
 これで対応完了です。

●Request Entity Too Large

 Import Templatesでテキストでインポートしたところ「Request Entity Too Large」が表示されました。
 apacheのログを確認したところ、下記のような記録がありました。
[Thu May 25 16:03:56.554451 2017] [:error] [pid 24693] [client 192.168.0.1] ModSecurity: \
Request body no files data length is larger than the configured limit (131072).. Deny with code (413) \
[hostname "server-a.bigbang.mydns.jp"] [uri "/cacti/templates_import.php"] [unique_id "WSaB3Dqhfjd7dnaoJHFuhfa8jnf"]
 調べたところWAFを設定しているために引っかかっているようです。

 参考URL:a-tak.comの真ん中より下

 インポートをしつつ、apacheのエラーログを確認し、該当偽陽性判定を除外するように設定変更しました。

●WARNING: Invalid Response(s)

 /var/log/cacti/cacti.logに下記のようなエラーが記録されていました。
2018/03/12 13:10:06 - POLLER: Poller[1] WARNING: Invalid Response(s), Errors[1] Device[5] Thread[1] DS[196]
 コンソールのManagementでDevice[1]に該当するホストのData Source List(右上)をクリックし、DS[196]が何であるかを確認します。
 該当するデータソースのグラフが問題なく更新されているか確認します。
 もし、更新されていない場合はそれが原因ですので、再度デバイスを選択、Graph List(右上)をクリック、該当グラフを削除します。
 そのまま
# tail -f /var/log/cacti/cacti.log
を実行し10~15分程度(デフォルトで5分間隔なので2~3回程度)待ちます。エラーが記録されなくなれば対応完了です。
2018/03/12 13:20:14 - SYSTEM STATS: Time:12.3617 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:20:14 - SYSTEM THOLD STATS: Time:0.0578 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0
2018/03/12 13:25:17 - SYSTEM STATS: Time:15.3962 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:25:17 - SYSTEM THOLD STATS: Time:0.0120 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0
2018/03/12 13:30:17 - SYSTEM STATS: Time:15.3325 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:30:17 - SYSTEM THOLD STATS: Time:0.0226 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0


●Poller Output Table not Empty.

 /var/log/cacti/cacti.logに下記のようなエラーが記録されていました。
2018/03/12 13:15:02 - POLLER: Poller[1] WARNING: Poller Output Table not Empty.  Issues: 1, DS[139]
2018/03/12 13:15:07 - POLLER: Poller[1] WARNING: Invalid Response(s), Errors[1] Device[1] Thread[1] DS[139]
2018/03/12 13:15:15 - SYSTEM STATS: Time:13.3620 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:174
2018/03/12 13:15:16 - SYSTEM THOLD STATS: Time:0.0509 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0
 コンソールのManagementでDevice[1]に該当するホストのData Source List(右上)をクリックし、DS[139]が何であるかを確認します。
 該当するデータソースのグラフ(「InnoDB Buffer Pool」でした)が問題なく更新されているか確認します。恐らく更新されていないはず。
 テンプレートの該当データソース(Management-データソース)を開きます。一覧の中から先ほど確認したおおもとファイルとなるData Template Nameを探します。
 内容を確認したところホスト名が間違っていましたので、修正しました。
# tail -f /var/log/cacti/cacti.log
を実行し10~15分程度(デフォルトで5分間隔なので2~3回程度)待ちます。エラーが記録されなくなれば対応完了です。
2018/03/12 13:20:14 - SYSTEM STATS: Time:12.3617 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:20:14 - SYSTEM THOLD STATS: Time:0.0578 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0
2018/03/12 13:25:17 - SYSTEM STATS: Time:15.3962 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:25:17 - SYSTEM THOLD STATS: Time:0.0120 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0
2018/03/12 13:30:17 - SYSTEM STATS: Time:15.3325 Method:cmd.php Processes:1 Threads:N/A Hosts:6 HostsPerProcess:6 DataSources:341 RRDsProcessed:175
2018/03/12 13:30:17 - SYSTEM THOLD STATS: Time:0.0226 Tholds:0 TotalDevices:6 DownDevices:0 NewDownDevices:0


●iostatを利用したDisk監視ができなくなった

 いつの間にかiostatのグラフが表示されなくなっている(2019.6月途中までは記録されていた)ことに気がつきました。
 確認したところ/usr/share/cacti/resource/snmp_queries/配下にiostat.xmlが存在していませんでした。
 監視設定を再読み込みさせるため、下図の「Reload Query」(既緑色の丸い矢印)をクリックしました。
 (この時は/etc/cron.d/iostatの結果が4行から5行に変わっていたので、見た目の表示が「成功 [8 Items, 4 Rows]」から「成功 [10 Items, 5 Rows]」になりわかりやすかった。)

cacti04.GIF

 しかし、いくつかグラフが正常に表示されませんでした。
 このため、更新しないグラフを全て一度削除し、再度作成したところ正常に表示されるようになりました。