ZabbixサーバーのDisk使用容量予測。ある時点の監視設定でどのくらいのサイズになるのか。

# はじめに
はじめまして。sewata100です。
Zabbix Advent Calendar 2015の13日目です。
言い訳がましいですが、記事書くの初めてでして至らない点多いですが、よろしくお願いします。

こんな経験ないですか？ないですよね。はい。
**Zabbixサーバ構築 => 監視設定をどしどし入れる => ディスク使用量100%**
最初に最大どのくらい監視設定入れられるのか考えろよ。。。
ということで考えてみましたがわかったことは私自身がいろいろ無知だということでした。
ただの苦労話的で参考になるかわかりませんが、続けます。

# ゴール
設定されている監視設定において、ヒストリ、トレンドに格納されるデータが全日数分埋まるとどのくらいのディスク使用量となるのかわかる。
できれば監視対象ホスト単位で。

# 成果
非常にアバウトな結果しか得られなかった。別なアプローチでもディスク使用量を管理下に置く必要性があることが見えた。

# 経過
## 見積もり方法の検討
まず、こちらの見積もり方法を参考にしました。
https://www.zabbix.com/documentation/2.4/manual/installation/requirements#database_size
※~90bytesになってますが検討中見たときはヒストリ50bytes, トレンド128bytesでした。続けます。

## 計算にあたって
以下を明確にする必要があると考えます。

- 1アイテムの1監視結果あたりのデータサイズがどのくらいなのか（ヒストリ、トレンドともに）
- 1アイテムあたりいくつの監視結果が格納されるのか（ヒストリ、トレンドともに）

これが見えた時点で以下の問題が見えました。
アイテムタイプで監視間隔がないものがある　SNMP trap, Zabbix trapper
監視間隔があってもそのとおりにデータが入らないものがある　ログ監視

詰んでますが、続けます。

1監視結果あたりのデータサイズについてです。
ヒストリ、トレンド関連のテーブルのレコードのデータ型から計算してみると、実際に対し、30倍ほどの大きな数字になってしまいました。
ディスク使用量増加ペースにおける　実測：計算　の比で　1：30程度
　※使用量増加ペース比での実予比較としたのはヒストリ、トレンドが埋まって安定しているZabbixサーバが手元になかったため
あきらめて1監視結果あたりは参考リンクのとおり、50byte、128byteにしたところ、それっぽい数字()になりました。

もう一点、DBについてです。
テーブルの断片化、使用ブロックの余り
Zabbix House keeperがdeleteしていきますが、実際のデータ使用量が減らない
　※ホスト削除して大量の監視結果が消えたとしても。。。
テーブル圧縮（Barracuda）

ここまで来るともうわからんな。。。

## 結果

有効なホストの有効なアイテムについて以下の式を計算します。

- ヒストリ：日数×(86400/間隔)×50　アイテム1つについて1日当たり50byteのデータが(86400/間隔)個生成される
- トレンド：日数×24×128　　　　　トレンド1つについて1日当たり128byteのデータが24個生成される

ただし、SNMP trap, Zabbix trapper無視、ログ監視は監視の度にログマッチとする、フレキシブル間隔は監視間隔設定のみを基準にする

Pythonのzabbix-apiを使います。

```python:host.get.size.all.py
#!/usr/bin/python -W all
# coding: utf-8

# Zabbix2.4.1

from zabbix_api import ZabbixAPI

# API access info
url="http://server/zabbix/api_jsonrpc.php"
user="user"
password="password"

#zapi = ZabbixAPI(server=url, log_level=6)
zapi = ZabbixAPI(server=url)
zapi.login(user, password)

hosts_enabled=zapi.host.get({
    "filter": { "status": 0 },
    "output": [ "hostid", "name" ]
})

hosts_items=[]
for host in hosts_enabled:
    host_items={}
    for key, value in host.iteritems():
        if key == "name":
            host_items["name"]=value
        if key == "hostid":
            host_items["hostid"]=value
            items_enabled=zapi.item.get({
                "filter": { "hostid": value, "status": 0, "flags": [ 0, 4 ],
                           "type": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16 ],
                           "state": 0 },
                "output": [ "itemid", "type", "hostid", "name", "delay", "history",
                            "trends", "value_type", "delay_flex", "state" ]
            })
            host_items["items"]=items_enabled
    hosts_items.append(host_items)

hosts_byte=[]
for h in hosts_items:
    byte=0
    host_byte={}
    for i in h["items"]:
        hbyte=50
        tbyte=128
        if i["delay"]:
            if int(i["delay"]) > 0:
                byte += int(i["history"]) * (86400 / int(i["delay"])) * hbyte
        if i["trends"]:
            if int(i["trends"]) > 0:
                byte += int(i["trends"]) * 24 * tbyte
    host_byte = { "hostid": h["hostid"], "name": h["name"], "byte": byte }
    hosts_byte.append(host_byte)

all_byte=0
for b in hosts_byte:
    print b["hostid"] +","+ b["name"] +","+ str(b["byte"])
    all_byte += b["byte"]

print "ALL," + str(all_byte)
```

次は、chrolisさんですね。
よろしくお願いします。