天天看點

zabbix表字段類型和value type問題

最近在幫同僚搞spark streaming的監控,主要是通過解析servlet的url來擷取對應的監控值。

其中有部分值是和時間戳有關系的,java的時間戳是精确到ms的,是13位。

在添加監控後,發現不能正常擷取到值。

在agent端,直接通過zabbix_get測試,是可以拿到值的,證明和item值的擷取沒有關系,從日志也可以看出,item的value是正常發送出去的。

agent的日志:

1

2

3

4

5

6

7

8

9

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.064</code> <code>In zbx_popen() command:</code><code>'python /apps/sh/zabbix_scripts/spark/spark-monitor-streaming.py streaming-color.StreamingMetrics.streaming.lastReceivedBatch_submissionTime'</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.064</code> <code>End of zbx_popen():</code><code>5</code>

<code>231239</code><code>:</code><code>20140612</code><code>:</code><code>063124.064</code> <code>zbx_popen(): executing script</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>In zbx_waitpid()</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>zbx_waitpid() exited, status:</code><code>0</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>End of zbx_waitpid():</code><code>231239</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>Run remote command [python /apps/sh/zabbix_scripts/spark/spark-monitor-streaming.py streaming-color.StreamingMetrics.streaming.lastReceivedBatch_submissionTime] Result [</code><code>13</code><code>] [</code><code>1402481880037</code><code>]...</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>For key [spark_stream[streaming-color.StreamingMetrics.streaming.lastReceivedBatch_submissionTime]] received value [</code><code>1402481880037</code><code>]</code>

<code>87104</code><code>:</code><code>20140612</code><code>:</code><code>063124.201</code> <code>In process_value() key:</code><code>'xxxxx:spark_stream[streaming-color.StreamingMetrics.streaming.lastReceivedBatch_submissionTime]'</code> <code>value:</code><code>'1402481880037'</code>

通過資料庫開始入手,先來看proxy的proxy_history表對應的item的值:

<code>select</code> <code>itemid,from_unixtime(clock),value from proxy_history where itemid=</code><code>'106018'</code> <code>order by itemid;</code>

<code>+--------+----------------------+----------------------+</code>

<code>| itemid | from_unixtime(clock) | value                |</code>

<code>| 106018 | 2014-06-12 11:42:47  | 1402481880037.000000 |</code>

<code>| 106018 | 2014-06-12 11:17:29  | 1402481880037.000000 |</code>

<code>| 106018 | 2014-06-12 11:30:17  | 1402481880037.000000 |</code>

可以看到值被轉換成float的形式(如果item值的類型設定為float型,會精确度6位小數),而value的類型是longtext,是以這裡插入proxy的表不會出錯。

從proxy的日志可以看出,proxy通過get_values擷取到值,調用substitute_key_macros對值進行處理,最後調用send_data_to_server将資料發送到server.

再來看server的資料情況,通過items表可以檢視對應監控項的lastvalue(items的lastvalue是varchar(255)的,很少出現type問題)和error情況:

<code>select</code> <code>b.itemid,b.key_,b.lastvalue,b.error from hosts a,items b where a.hostid=b.hostid and a.host=</code><code>'xxxxx'</code> <code>and b.key_ like </code><code>'spark_stream[%Time]'</code><code>;</code>

<code>itemid|key_lastvalue|error                                                                 </code>

<code>|106018| spark_stream[streamingcolor.StreamingMetrics.streaming.lastReceivedBatch_submissionTime]    | 1402481880037 | Type of received value [1402481880037.000000] is not suitable </code><code>for</code> <code>value </code><code>type</code> <code>[Numeric (float)] |</code>

可以看到報錯資訊是和value type有關系的(之前也處理過一個類似的case:http://caiguangguang.blog.51cto.com/1652935/1377089),再來review下history相關表的value資料類型:

item為float類型時,value的字段類型是double(16,4),即總16位,其中小數占4位,這裡因為java的時間戳為13位,超過了這個限制,導緻資料插入報錯。

<code>desc </code><code>history</code>

<code>+--------+---------------------+------+-----+---------+-------+</code>

<code>| Field  | Type                | Null | Key | Default | Extra |</code>

<code>| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |</code>

<code>| clock  | int(11)             | NO   |     | 0       |       |</code>

<code>| value  | double(16,4)        | NO   |     | 0.0000  |       |</code>

把item的value type改為unsigned即可:

這種類型的資料存儲在history_uint表裡面,其value的字段類型是bigint(20),一般不會到達限制。

<code>desc history_uint;</code>

<code>| value  | bigint(20) unsigned | NO   |     | 0       |       |</code>

<code>| ns     | int(11)             | NO   |     | 0       |       |</code>

小結:

在處理zabbix item的問題時,通過zabbix_get并結合items表的error字段可以快速的定位問題.

本文轉自菜菜光 51CTO部落格,原文連結:http://blog.51cto.com/caiguangguang/1427490,如需轉載請自行聯系原作者