はじめに
OCIではロギング・サービスのカスタム・ログを使用することで任意のログを収集することができます。
今回はカスタム・ログで収集したログとサービス・コネクタ・ハブを使用してMySQL Database Service(以下 MDS)を監視し、アラート通知を行う方法を紹介します。
事前準備
コンピュートインスタンスとMDSを1つずつ作成します。なお、インスタンスの作成時には拡張オプションのOracle Coludエージェントでカスタム・ログのモニタリング
にチェックが入っていることを確認してください。
ログの作成
事前準備で作成したコンピュートインスタンスにMDSの情報を収集します。
今回は以下のようなスクリプト(get-health.sh
)を作成しました。
mysqladmin ping
でヘルスチェックを行い、結果を/var/log/mysql-status.log
に出力します。
1 2 3 4 5 6 7 |
#!/bin/bash if [ "`mysqladmin --login-path=login-mysql ping --connect-timeout=10`" = 'mysqld is alive' ]; then echo 'mysqld is alive' >> /var/log/mysql-status.log else echo 'mysqld is dead' >> /var/log/mysql-status.log fi |
このスクリプトを1分おきに実行します。
1 2 |
# crontab -l * * * * * /root/get-health.sh |
なお、/var/log/mysql-status.logは肥大化し続けるため、実際に運用する際には別途ローテーションの設定も行う必要があります。
カスタム・ログの収集
動的グループの作成
動的グループを作成します。動的グループまたはユーザー・グループを後でログの収集対象を指定する際に使用します。
アイデンティティとセキュリティ -> 動的グループを選択します。
動的グループの作成を選択し、名前とルールを入力します。
今回はコンパートメントIDが一致するインスタンスを含めるというルールにしました。
ログ・グループ作成
ログ・グループを作成します。
監視および管理 -> ロギング -> ログ・グループを選択します。
ログ作成
カスタム・ログを作成します。
管理 -> ロギング -> ログを選択し、カスタム・ログの作成を選択します。
ログ・グループは先ほど作成したものを指定します。
カスタム・ログを作成すると次にエージェント構成の作成画面に移ります。
ここで、最初に作成したmysql-status.log
を収集するように設定していきます。
動的グループには前の手順で作成したBlog_CustomLog
を指定します。
このとき、以下のメッセージが表示されたら作成を選択し、ポリシーを作成してください。
通知設定
トピックの作成
開発者サービス -> 通知 -> トピックからトピックの作成を選択します。
作成したら、トピックの詳細からサブスクリプションの作成を選択します。
今回はメールで通知を行うので、プロトコルを電子メールとし、通知を送りたいメールアドレスを入力します。
作成すると、入力したメールアドレスに確認のメールが送られます。メールアドレスの確認が行われるまでは、サブスクリプションのステータスはPendingのままです。メール内のリンクをクリックするとサブスクリプションがActiveになります。
サービス・コネクタの作成
監視および管理 -> ロギング -> サービス・コネクタを選択します。
サービス・コネクタの作成から作成します。
サービス・コネクタの構成でソースをロギング、ターゲットを通知にします。
ソースの構成で拡張モードに切り替えを選択します。
問合せコード・エディタで、先ほど作成したカスタム・ログを問い合わせます。また、mysqld is aliveを除く
の条件でフィルタリングします。
クエリは以下の構文となります。
1 |
search "[compartment_OCID]/[loggroup_OCID]/[log_OCID]" | data.message!='mysqld is alive' |
ターゲットの構成のトピックに先ほど作成したMySQL_health_topic
を選択します。また、メッセージの書式はフォーマットされたメッセージの送信
を選択することでアラートメールがわかりやすい書式で送られてきます。
なお、トピック選択時に以下のようなメッセージが表示された場合は、作成
を選択してポリシーを作成してください。
検証
MDSを再起動します。しばらくするとログにはmysqld is dead
の文字列が出力されるようになります。
トピックで設定したメールアドレスには以下のようなメールが届きました。
ただし、MDSが停止している間、ログにはmysqld is dead
の文字列が出力され続けるため、1分毎にメールが送られることになります。
閾値を設定する方法
カスタム・ログを監視する場合は文字列を監視することになります。そのため、あるパラメータが閾値を超えたらアラート通知を行うといったことはできません。
閾値をトリガーにしたい場合は、例えば以下のようにスクリプト側で判定を行う方法が考えられます。
1 2 3 4 5 6 7 8 9 |
#!/bin/bash VAR=`mysql --login-path=login-mysql -ss -e "show global status like 'threads_connected';" | cut -f 2` if [ $VAR -lt 100 ]; then echo 1 >> /var/log/mysql-connections.log else echo 0 >> /var/log/mysql-connections.log fi |
まとめ
カスタム・ログを使用したアラート通知の方法を紹介しました。MDSからステータス変数を取得して監視する場合は、スクリプトの作りこみが必要となります。そのうえ、検証で確かめた通りアラート通知の抑制ができないため、実際の運用には課題があります。一方で、もともとカスタム・ログで収集していたログに対してアラートを追加したくなったときには活用ができそうです。
OCIではカスタム・メトリックの公開を使用すれば同じことができますので基本的には、こちらの機能を使った方がいいでしょう。本ブログでもこちらの記事で紹介しています。