zabbix ログ検知が遅れる原因と対処

Zabbixから、数時間前のログアラートが届いたことがありました。ログ検知が遅延してしまっていたようです。障害に気付くのが数時間遅れることを意味するので、実はかなり致命的です。
原因は、ログ出力量が急激に増えたことで、Zabbix agentの処理量＜ログの増加量、になってしまっていたことでした。対処方法は、ログ出力を減らすこと、Zabbix agentの設定変更、が挙げられますが、対処方法よりも、本当にログの読み込みが遅れているのか、遅れているならばどの程度なのか、を調べる方が難しかったので、それをメインに書いています。

# 前提条件
* Zabbix ver4.0系で記載しています
* Zabbix データベースはmysql前提で記載しています

# ログの読み込みが遅れているかを確認してみる
Zabbix データベースでは、各host・各itemごとにlastlogsizeという、対象ログファイルのどこまで読み込み終えたかという情報が管理されています。この情報を確認してみます。

とりあえず、Zabbixで使っているデータベースにログインします。
```shell
mysql -u xxxx -p
```

## hostidを特定する
まずは、hostidを特定します。
hosts Tableから、hostidの情報が引けます。管理しているホストが多い場合は、ホストの「表示名」でqueryした方が特定しやすいと思います。下記の例では、XXXXXに特定したいホストの「表示名」の一部を入力して検索しています。

```sql
use zabbix;
select hostid ,name from hosts where name LIKE "%XXXXX%";
```

例えば、このような結果が得られます。これで、hostidが特定できました。
```sql
+--------+------------------------------------------------------------+
| hostid | name                                                       |
+--------+------------------------------------------------------------+
|  10528 | xxx-ec2-yyy-a001                                           |
|  10530 | xxx-ec2-yyy-c002                                           |
|  10532 | xxx-ec2-zzz-a001                                           |
+--------+------------------------------------------------------------+
```

## 対象のホストのlastlogsize
hostidが特定できたので、hostidに対するitemのlastlogsizeを見ていきます。key_は、Zabbixアイテムのキーです。logかlogrtであれば、下記のままでクエリ可能です。hostidには先ほど特定した数字を入れます。

```sql
select itemid,key_,lastlogsize from items where key_ LIKE "log%" AND lastlogsize!=0 AND hostid="10528" ;
```

例えば、このような結果が得られます。
```sql
+--------+---------------------------------------------------+-------------+
| itemid | key_                                              | lastlogsize |
+--------+---------------------------------------------------+-------------+
|  31581 | log[/var/log/messages,"test",,]                   |     1516376 |
|  53598 | logrt[/var/log/xxxxx/server.log,"yyyyy",,,skip]   |   975428836 |
|  53645 | logrt[/var/log/xxxxx/server.log,"zzzzz",,,skip]   |   978799247 |
+--------+---------------------------------------------------+-------------+
```

このlastlogsizeと、実際のログサイズを比較してみます。ほぼ同じであればログの読み込みは遅れていません。差が大きい場合は、ログの増加量に対してzabbix agentのログ読み込み量が追いついていないと判断することができます。

:::note info
lastlogsizeとログファイルのサイズを比較することで、ログの読み込み遅れが発生しているか確認できる
:::

# ログの読み込みが追いついていない場合
一定時間後（例えばログ監視間隔に設定している時間後）に、先ほどのクエリで再度lastlogsizeを確認してみます。これにより、時間あたり、どの程度のログサイズを読み込めているのかを確認できます。ログの増加量に対し、どの程度足りていないのかの参考になります。

対策としては、Zabbix agentの読み込み速度を上げるのが手っ取り早いです。設定は、zabbix_agentd.confにあるので、viなどエディタで追記します。
```shell
### Option: MaxLinesPerSecond
#	Maximum number of new lines the agent will send per second to Zabbix Server
#	or Proxy processing 'log' and 'logrt' active checks.
#	The provided value will be overridden by the parameter 'maxlines',
#	provided in 'log' or 'logrt' item keys.
#
# Mandatory: no
# Range: 1-1000
# Default:
# MaxLinesPerSecond=20
MaxLinesPerSecond=200
```

追記したら、再起動します。
```shell
systemctl restart zabbix-agent
```

デフォルトが20とかなり小さいです。メモリ等のリソースを消費する可能性があるので、経過観察しながら少しずつ上げるのが良いと思います。また、監視しているログのファイルサイズが想定外に急増していないかをZabbixで監視しておけば、この問題を未然に防げたり、軽症で済むかもしれません。ファイルサイズの監視は、Zabbixアイテムのキーにvfs.dir.sizeを使うことで簡単に出来ます。詳しくは、[こちらを参照](https://www.zabbix.com/documentation/4.0/en/manual/config/items/itemtypes/zabbix_agent)。

:::note info
Zabbix agentの処理量＜ログの増加量であることが確認できたら、Zabbix agentの設定で処理量を大きくするとよい
:::