Zabbix-agentでTomcatのプロセスを監視する

# どうやるの？

Tomcatの起動プロセスの監視アイテムを作るぞ。
まずは`zabbix_get`で動作確認だ。

```bash
$ zabbix_get -s 192.168.200.24 -k proc.num[httpd]
6
$ zabbix_get -s 192.168.200.24 -k proc.num[tomcat]
0
```
tomcatはどうやって取るんだ・・・？

答えはこれ

```bash
$ zabbix_get -s 192.168.200.24 -k proc.num[java,,,"org.apache.catalina.startup.Bootstrap start"]
1
```


# 環境
- RHEL 7.7 (Maipo)
- zabbix_server 4.0.16
- zabbix_agent 4.0.16
- Tomcat 8.5.50


# リファレンスをちゃんと読む
[Zabbix Documentation 2.2](https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/zabbix_agent)に使い方があったので調べてみると、プロセス名を知る必要があることを知る。

*`proc.num[<name>,<user>,<state>,<cmdline>]`*

- name - プロセス名（デフォルトは「全プロセス」）
- user - ユーザー名（デフォルトは「全ユーザー」）
- state - 可能な値: all （デフォルト）、run, sleep, zomb
- cmdline - コマンドラインによるフィルター（正規表現）

# tomcatのプロセス名を調べる

起動しているtomcatの状態を調べます。

```bash
$ systemctl status tomcat
● tomcat.service - Apache Tomcat 8
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since 木 2020-02-06 15:01:19 JST; 1h 29min ago
  Process: 844 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 844 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           └─875 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.prot...

 2月 06 15:01:19 192.168.200.24 systemd[1]: Starting Apache Tomcat 8...
 2月 06 15:01:19 192.168.200.24 systemd[1]: Started Apache Tomcat 8.
```

PID`875`をさらに調べます。

```bash
$ cat /proc/875/stat 
875 (java) S 1 844 844 0 -1 1077944320 19379 0 124 0 937 64 0 0 20 0 41 0 752 2357014528 21813 18446744073709551615 4194304 4196524 140724105374304 140724105356960 140023800299543 0 0 2 16800973 18446744073709551615 0 0 17 0 0 0 5 0 0 6294912 6295604 12607488 140724105383058 140724105383592 140724105383592 140724105383914 0
```
（）で囲われている箇所がプロセス名です。
tomcatを起動しているプロセス名は`java`のようです。

# 解決（間違い）
```bash
$ zabbix_get -s 192.168.200.24 -k proc.num[java]
1
```
取れました！

...でもふと気づく。
これではただのJavaのプロセスなだけで、tomcatのプロセスかどうかは判別できないことに。

## プロセスをもう一度確認
```bash
$ ps aux | grep java
tomcat     875  0.1  8.6 2301772 87452 ?       Sl   15:01   0:10 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
```
どうやらこのプロセスはtomcatが実行しているようです。

```bash
$ zabbix_get -s 192.168.200.24 -k proc.num[java,tomcat]
1
```
取れました。

ただ、よくよく考えてみると、tomcatユーザがjavaコマンドを実行しているだけで
**Tomcatの起動プロセス**を監視しているわけではないことに気付きました。

## もう一度調べる
プロセスを確認して気付きました。
optionが長くてわかりにくかったけど、起動プロセス（`org.apache.catalina.startup.Bootstrap start`）の記述があるじゃないですか。

```bash
$ ps aux | grep java
tomcat    2023 83.6  7.3 2299724 74204 ?       Sl   17:26   0:02 

/usr/bin/java 
  -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties 
  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
  -Djdk.tls.ephemeralDHKeySize=2048 
  -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
  -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 
  -Dignore.endorsed.dirs= 
  -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar 
  -Dcatalina.base=/opt/tomcat 
  -Dcatalina.home=/opt/tomcat 
  -Djava.io.tmpdir=/opt/tomcat/temp 
  org.apache.catalina.startup.Bootstrap start
```

*`proc.num[<name>,<user>,<state>,<cmdline>]`*
第４引数のコマンドラインを使えば抽出できそうです。

```bash
$ zabbix_get -s 192.168.200.24 -k proc.num[java,,,"org.apache.catalina.startup.Bootstrap start"]
1
```
無事に起動プロセスのカウントを取得できました。
tomcatユーザであるかどうかはあまり意味がないと思ったのであえて書きませんでした。

# 終わりに
長々と書いてしまいました。
`proc.num[java,tomcat]`と書いてある記述も見かけたので、こちらを紹介させていただきました。

# 補足
Tomcatのインストール方法によっては上記のやり方とは異なりますが、調べ方さえ分かれば応用は効きくと思います。
私の場合はソースをDL・展開してインストールを行いました。
参考：[ApacheとTomcatを連携させてみた](https://qiita.com/Dace_K/items/9d0419aefcb969335ca5)