Oracle Management Cloud の Infrastructure Monitoring と collectd を組み合わせて プロセス監視を実装する

##　はじめに
+ 「Oracle Managemenet Cloud（OMC）」の一機能である「Infrastructure Monitoring（IM）」とサーバのシステム情報収集に関するOSSである「collectd」を併用することで、Linux OS上のプロセス監視を実装することを目的とする。
+ 本記事では、[公開されているマニュアル](https://docs.oracle.com/en/cloud/paas/management-cloud/moncs/expanding-monitoring-using-collectd.html#GUID-99155EE9-61BD-4342-B474-ABABC72BB4B4/)を参考に、サンプル的にプロセス監視を設定してみる。
+ 本記事では、「OMC」で使用する「Cloudエージェント」や「collectd」のインストール手順は割愛する。
+ collectdのProcessesプラグインで収集できる項目は[参考リンク](https://collectd.org/wiki/index.php/Plugin:Processes)を参照


##　前提
+ 監視対象のホストにOMC用のCloudエージェントがインストールされていること
+ 監視対象のホストにcollectdがインストールされていること
- 検証時の製品バージョンは下記の通り
  - Oracle Management Cloud 18.4.1
  - Red Hat Enterprise Linux Server release 7.2
  - collectd-5.8.1-1

##　collectdの構成
collectdのconfファイルを下記の通り設定する。

### <i class="fa fa-cube" style="font-size:1em;"></i> /etc/collectd.conf
~~~
[root@hostname ~]# vi /etc/collectd.conf

■ Intervalの変更（10秒⇒60秒）
　監視間隔がデフォルトの場合だと短すぎることが原因で
　内部的にエラー(METRIC_UPLOAD_RATE_LIMIT_EXCEEDED)になるため、監視間隔を1分以上にする
---
#----------------------------------------------------------------------------#
# Interval at which to query values. This may be overwritten on a per-plugin #
# base by using the 'Interval' option of the LoadPlugin block:               #
#   <LoadPlugin foo>                                                         #
#       Interval 60                                                          #
#   </LoadPlugin>                                                            #
#----------------------------------------------------------------------------#

Interval     60
---

■ Processesプラグインの構成
（例）Cloudエージェントプロセス、collectdプロセスを監視するための設定
---
LoadPlugin processes
<Plugin processes>
        ProcessMatch "omc-cloud-agent" "java .*oracle.sysman.gcagent.tmmain.TMMain"
        Process "collectd"
</Plugin> 
---
※ここで監視対象のプロセスを定義する
　なお、ProcessMatch の場合は、regexにスラッシュ指定は不可のため注意


■ write_httpプラグインの構成
　write_httpプラグインを使用してcollectdで収集した情報をCloud Agentにプッシュするように設定

---
LoadPlugin write_http
<Plugin write_http>
         <Node "omc">
           URL "https://127.0.0.1:1899/emd/receiver/gmc"
           Format "JSON"
           StoreRates true
           VerifyPeer false
         </Node>
</Plugin>
---
※collectdがCloudエージェント・ホストに対してリモート構成の場合は、
　127.0.0.1のループバック・アドレスの代わりにCloudエージェント・ホスト名を指定する


■ unixsockプラグインの構成
　Cloudエージェントにcollectdctlで情報を収集させるために、unixsockプラグインを有効化

---
LoadPlugin unixsock
<Plugin unixsock>
        SocketFile "/var/run/collectd-unixsock"
        SocketGroup "collectd"
        SocketPerms "0660"
        DeleteSocket false
</Plugin>
---
※Cloudエージェントのインストールユーザが、collectdプロセスを実行しているユーザと異なる場合は、
　CloudエージェントのインストールユーザをSocketGroupで指定したグループに追加する(上記例では"collectd"グループ)
　もしくは、SocketGroupにインストールユーザが所属するグループを指定する

■ URI保護のための資格証明の追加（Optional）
⇒本検証では動作確認のみを目的とするため、Skipする

[root@hostname ~]# 
~~~


##　collectdの設定反映
collectdのサービスを再起動し、上記設定を反映させる。

~~~

[root@hostname ~]# systemctl restart collectd.service
[root@hostname ~]# echo $?
0
[root@hostname ~]# systemctl status collectd.service

● collectd.service - Collectd statistics daemon
   Loaded: loaded (/usr/lib/systemd/system/collectd.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-03-11 13:43:40 JST; 13s ago
     Docs: man:collectd(1)
           man:collectd.conf(5)
 Main PID: 23246 (collectd)
   CGroup: /system.slice/collectd.service
           mq23246 /usr/sbin/collectd

[root@hostname ~]# 
~~~


##　OMCへカスタムエンティティを追加
マニュアルを参考に、カスタムエンティティ追加用のjsonファイルを用意し、
手動でcollectd用のエンティティを追加する。（下記例でのホスト名：myhost1）

### <i class="fa fa-cube" style="font-size:1em;"></i> jsonファイルの作成（collectd-myhost1.json）
~~~
[root@hostname ~]# su - <Agent install user>

[<Agent install user>@hostname ~]$ vi collectd-myhost1.json

{
  "entities": 
  [
    {
      "name": "collectd-myhost1",
      "type": "omc_generic_metric_collector",
      "displayName": "collectd-myhost1",
      "timezoneRegion": "JST",
      "properties": 
      {
        "host_name": 
        {
          "displayName": "Host Name",
          "value": "myhost1.compute-999999999.oraclecloud.internal"
        },

        "omc_query_interface_path": 
        {
          "displayName": "Query Interface Path",
          "value": "/bin/collectdctl"
        },

        "omc_filter_expression": 
        {
          "displayName": "Filter Expression",
          "value": "{$.[?(@.host=='myhost1')]}"
        },

        "omc_auto_map": 
        {
          "displayName": "Automatically Map Metrics",
          "value": "TRUE"
        },

        "capability": 
        {
          "displayName": "capability",
          "value": "monitoring"
        },

        "omc_monitored": 
        {
          "displayName": "Cloud Agent Monitored",
          "value": "TRUE"
        },

        "omc_product_name": 
        {
          "displayName": "Product Name",
          "value": "collectd"
        },

        "omc_product_vendor": 
        {
          "displayName": "Product Vendor",
          "value": "Florian octo Forster, et al."
        },

        "omc_product_version_query_arg": 
        {
          "displayName": "Product Version Query Argument",
          "value": "-h"
        },

        "omc_product_version_regex": 
        {
          "displayName": "Product Version Regular Expression",
          "value": "^collectd (.+), http"
        },

        "omc_metrics_query_arg": 
        {
          "displayName": "Metrics Query Argument",
          "value": "listval"
        },

        "omc_response_query_arg": 
        {
          "displayName": "Response Query Argument",
          "value": "listval"
        },

        "omc_use_exit_code_for_response": 
        {
          "displayName": "Use exit code for response",
          "value": "TRUE"
        },

        "omc_protocol": 
        {
          "displayName": "Protocol",
          "value": "https"
        },

        "omc_payload_format": 
        {
          "displayName": "Payload Format",
          "value": "json"
        },

        "omc_receiver_uri_path": 
        {
          "displayName": "Receiver URI Path",
          "value": "/emd/receiver/gmc"
        }
      }
    }
  ]
}

[<Agent install user>@hostname ~]$ 
~~~

### <i class="fa fa-cube" style="font-size:1em;"></i> エンティティの追加
~~~
[<Agent install user>@hostname ~]$ /opt/omc/cloudagent/agent_inst/bin/omcli add_entity agent collectd-myhost1.json
Oracle Management Cloud Agent
Copyright (c) 1996, 2018 Oracle Corporation.  All rights reserved.
Operation Succeeded: Accepted 1 of 1 entities for processing.

[<Agent install user>@hostname ~]$ 
~~~

### <i class="fa fa-cube" style="font-size:1em;"></i> エンティティの追加後の確認
~~~
[<Agent install user>@hostname ~]$ /opt/omc/cloudagent/agent_inst/bin/omcli status_entity agent collectd-myhost1.json
Oracle Management Cloud Agent
Copyright (c) 1996, 2018 Oracle Corporation.  All rights reserved.
omc_generic_metric_collector.collectd-myhost1 : AGENT:entity fully monitored
⇒追加したエンティティが"AGENT:entity fully monitored"であることを確認

[<Agent install user>@hostname ~]$ 

[<Agent install user>@hostname ~]$ /opt/omc/cloudagent/agent_inst/bin/omcli config agent listtargets
Oracle Management Cloud Agent
Copyright (c) 1996, 2018 Oracle Corporation.  All rights reserved.
[myhost1.compute-999999999.oraclecloud.internal:4459, Lama]
[myhost1.compute-999999999.oraclecloud.internal, omc_host_linux]
[collectd-myhost1, omc_generic_metric_collector]
⇒追加したエンティティがターゲット一覧に表示されることを確認

[<Agent install user>@hostname ~]$ 
~~~

##　追加したエンティティにライセンスを付与
OMCのサービス・コンソールにログインし、下記手順で追加したエンティティにライセンスを付与する。

### <i class="fa fa-cube" style="font-size:1em;"></i> ①：メニューから「管理」を押下
![001.png](https://qiita-image-store.s3.amazonaws.com/0/351352/8d9b8720-419f-8b4c-1e35-490aa6692303.png)

### <i class="fa fa-cube" style="font-size:1em;"></i> ②：「エンティティ構成」→「ライセンス」を押下
![002.png](https://qiita-image-store.s3.amazonaws.com/0/351352/9163907b-fcca-2d5f-607f-ff5760ad6d44.png)

### <i class="fa fa-cube" style="font-size:1em;"></i> ③："ライセンスなし"のエンティティから追加したcollectd用のエンティティ（Generic Metric Collector）を選択し、ライセンス（Standard or Enterprise）を割り当て
※付与可能なライセンスはサブスクリプションおよびエンティティ数に依存するため注意

![003.png](https://qiita-image-store.s3.amazonaws.com/0/351352/ba2c959f-1677-63b1-8075-782dda99c46a.png)

### <i class="fa fa-cube" style="font-size:1em;"></i> ④：正常にライセンスが設定されたことを確認
![004.png](https://qiita-image-store.s3.amazonaws.com/0/351352/eb734abc-4d1c-f347-f71a-cd9f16e0b3f1.png)

### <i class="fa fa-cube" style="font-size:1em;"></i> ⑤：監視対象のカスタムエンティティに対しても同様にライセンス（Standard or Enterprise）を割り当て
ここでは例として、collectdプロセスの監視用に設定を行う（エンティティ名：myhost1-collectd）
※付与可能なライセンスはサブスクリプションおよびエンティティ数に依存するため注意
※④の確認後、カスタムエンティティが画面に反映されるまで、しばらく時間がかかる場合あり
![005.png](https://qiita-image-store.s3.amazonaws.com/0/351352/abff40c9-a4e4-be87-51ab-e16ce1359523.png)


### <i class="fa fa-cube" style="font-size:1em;"></i> ⑥：正常にライセンスが設定されたことを確認
![006.png](https://qiita-image-store.s3.amazonaws.com/0/351352/7125d1f8-38f0-66a1-9831-665f02bc1c40.png)


### <i class="fa fa-cube" style="font-size:1em;"></i> ⑦：「モニタリング」→「エンティティ」から追加したカスタムエンティティの情報が収集されていることを確認
※上記で追加したcollecdプロセス監視用のエンティティ（myhost1-collectd）が画面から確認できる
![007.png](https://qiita-image-store.s3.amazonaws.com/0/351352/68c2ddd7-8fc6-fc57-6c2f-d67518d6a648.png)

##　備考
上記でOMCからプロセス監視が行えるようになるため、対象のカスタムエンティティに対して
アラートルールを設定すれば、障害時のメール通知などが行えるようになる。


以上