アプリケーションよりアイテムの無効化/有効化につきまして

いつもお世話になります。

以下の環境/作業手順/エラーメッセージにおきまして、
トラブルシューティングを実施しております。

◆バージョン情報:
ZABBIXのバージョン:1.6.9
ZABBIXサーバーのOS:CentOS 5.4
MySQLのバージョン:5.0.77

◆作業手順:
手順1.アプリケーションの作成
手順2.アイテムの作成
手順3.アプリケーションより"アイテムを無効にする"を選択
手順4.アプリケーションより"アイテムを有効にする"を選択

上記作業手順を行いましたところ、手順3.手順4にて下記のエラーメッセージが出力されました。

◆エラーメッセージ内容:
・Undefined index: hostid[/usr/share/zabbix/hosts.php:849]

・Error in query [SELECT ia.itemid,i.hostid,i.key_ FROM items_applications ia
 LEFT JOIN items i ON ia.itemid=i.itemid WHERE ia.applicationid=195
 AND i.hostid= AND (ia.applicationid div 100000000000000) in (0) ]
 [You have an error in your SQL syntax; check the manual that corresponds to your
 MySQL server version for the right syntax to use near 'AND
 (ia.applicationid div 100000000000000) in (0)' at line 1]

・mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
 [/usr/share/zabbix/include/db.inc.php:521]

現在、調査を実施しておりますが、解決策を見出せないため、投稿させて頂きました。
大変申し訳ありませんが、ご教授頂けないでしょうか。
どうぞ宜しくお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

ykykさん

バグですね…
エラーのSQLを整形すると下記になります。
<code>
SELECT
ia.itemid,
i.hostid,
i.key_
FROM items_applications ia
LEFT JOIN items i ON ia.itemid=i.itemid
WHERE
ia.applicationid=195 AND
i.hostid= AND
(ia.applicationid div 100000000000000) in (0)
</code>

「i.hostid= AND」が構文エラーです。
ソースはこれから見てみます。

ユーザー KAZ の写真

ykykさん

少々ソースを解析しました。
zabbix-1.6.9\frontends\php\hosts.phpの849行目でURLからhostidが取得できなくて発生しているみたいです。
<code>
$sql = 'SELECT ia.itemid,i.hostid,i.key_'.
' FROM items_applications ia '.
' LEFT JOIN items i ON ia.itemid=i.itemid '.
' WHERE ia.applicationid='.$appid.
' AND i.hostid='.$_REQUEST['hostid'].
' AND '.DBin_node('ia.applicationid');
</code>

なので、下記の手順の時URLに「hostid=xxx」が不足してると思われます。

手順3.アプリケーションより"アイテムを無効にする"を選択
手順4.アプリケーションより"アイテムを有効にする"を選択

もう少々お待ち下さい。

ユーザー KAZ の写真

ykykさん

1.6.8でも再現しました。
下記の部分のみで再現しますね。

手順3.アプリケーションより"アイテムを無効にする"を選択
手順4.アプリケーションより"アイテムを有効にする"を選択

発生原因も掴めましたので、修正方法を検討中です。
早ければ、火曜日にはパッチができるのではないかと思います。

ユーザー ykyk の写真

伊藤様

お世話になります。
ykykです。

返信が遅くなり、申し訳ございません。

この度は、ご回答ならびに調査を実施して頂きまして、
誠にありがとうございます。

引き続き、伊藤様のご回答をお待ちしております。

ユーザー KAZ の写真

ykykさん

対処方法が分かりました。
1.6.8と1.6.9はソースが同じだったので、1.6.8で検証しました。

zabbix-1.6.8\frontends\php\hosts.phpの845行目から850行目のSQL
<code> $sql = 'SELECT ia.itemid,i.hostid,i.key_'.
' FROM items_applications ia '.
' LEFT JOIN items i ON ia.itemid=i.itemid '.
' WHERE ia.applicationid='.$appid.
' AND i.hostid='.$_REQUEST['hostid'].
' AND '.DBin_node('ia.applicationid');
</code>

下記のように変更すると正しく動作しました。
<code>
$sql = 'SELECT ia.itemid,i.hostid,i.key_'.
' FROM items_applications ia '.
' LEFT JOIN items i ON ia.itemid=i.itemid '.
[color=FF0000] ' LEFT JOIN applications a ON ia.applicationid=a.applicationid '.
' LEFT JOIN hosts h ON a.hostid=h.hostid '.[/color]
' WHERE ia.applicationid='.$appid.
[color=FF0000]// ' AND i.hostid='.$_REQUEST['hostid'].[/color]
' AND '.DBin_node('ia.applicationid');
</code>

パッチにした方が良いでしょうか?
取り敢えず、フォーラムのバグ報告に情報を公開しておきます。

ユーザー KAZ の写真

ykykさん

パッチを作成してZABBIX-JPに展開中です。
rpmとしてはZabbix1.6.9-2に取り込まれる予定です。
パッチがダウンロードできるようになったら、バグ報告にリンクを作る予定です。