This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. はじめに
定期的に、またはオンデマンドで処理されるタスク、および永続的に実行されているプロセスの監視は、たとえば、ログファイルやステータスファイルを分析することで実行できます。 しかし、この方法では、多くの場合、以下の追加作業が必要となります。 少量の情報を抽出するために、大量のデータを読み込む必要がある場合が多い。
この手間を軽減するため、Checkmk では、プログラムの出力を Checkmk エージェント形式のファイルに直接書き込むオプションを用意しています。 エージェントは、いわゆるスプールディレクトリに保存されたこれらのファイルをすべて収集し、その内容をエージェント出力に統合します。 スプールディレクトリを使用するこの方法は、たとえば次のような場合に役立ちます。
ログファイルの定期的な分析、
自動バックアップの監視
データベースからの使用状況統計の作成およびチェック
mk-jobプラグインではクーロンジョブの制御が不十分な場合サンプル出力をテストするための独自のチェックの開発
Checkmk では、スプールディレクトリは、Windows、Linux、AIX、FreeBSD、OpenWrt、および Solaris のオペレーティングシステムでエージェントによってサポートされています。
この機能を問題なく使用できるように、いくつかの注意点があります。
2. ファイルディレクトリパス
スプールディレクトリへのデフォルトのファイルパスは、Linux およびその他の Unix システムでは/var/lib/check_mk_agent/spool/ 、Windows ではC:\ProgramData\checkmk\agent\spool\ です。
Linux および Unix では、Agent rules > Installation paths for agent files (Linux, Unix) ルールと、そこで使用できるBase directory for variable data (caches, state files) オプションを使用して、親ディレクトリのパスをカスタマイズできます。
監視中のホストで作業している場合は、エージェント出力からそこで設定されているスプールディレクトリをフィルタリングすることができます。
user@host:~$ check_mk_agent | grep SpoolDirectory
SpoolDirectory: /var/lib/check_mk_agent/spoolCheckmk は単一のスプールディレクトリを使用し、デフォルトではroot が所有しています。
異なる所有者の複数のディレクトリは提供されていません。
ただし、スプールディレクトリに(最初は空の)ファイルを作成し、そのファイルの所有者を別のユーザーに変更して、そのユーザーがファイルの内容を上書きできるようにすることはもちろん可能です。
3. ファイル名と内容
スプールファイルには、Checkmk で処理されるあらゆる形式のテキスト出力を含めることができます。 ファイルは、スプールディレクトリ内の順番で連結されます。 使用するファイル拡張子は問いません。
数字によるソートを使用する場合は、ファイル名の先頭にアンダースコア (_) を付けてください。数字で始まるファイル名は、年齢チェックに使用されます。
ドットで始まるファイルは無視されます。
連結されたファイルの内容の混乱を避けるため、各スプールファイルは
セクションヘッダー、つまり
<<<と>>>で囲まれた行で開始し、ファイル内でローカルチェック形式のみを使用する場合でも、改行で終了する必要があります。
したがって、サービスを即座に提供するローカルチェックは、次のように記述します。
<<<local>>>
0 "Spool Test Dummy" - This static service is always OK同様に、Checkmk 側でチェックプラグインを必要とする出力は削除することができます。
<<<waterlevels>>>
rainbarrel 376
pond 15212
pool 1237323.1. ピギーバックセクションの終了
ファイルでピギーバックセクションを使用する場合は、このファイルを次の行で終了してください。<<<<>>>> これは、読み取り順序が変更された場合に、ピギーバック出力の後の出力がホスト自体に再割り当てされるようにするための唯一の方法です。
4. ファイルの年齢チェック
プログラムが出力ファイルに正しく書き込める場合、プロセスが正常に完了したかどうかに関係なく、すべては問題ありません。 しかし、ディスクへの書き込み前にプログラムが中止したり、ファイルシステムエラーにより新しいファイルが書き込めない場合はどうでしょうか?
このような状況では、ファイル名の先頭に整数を付加するオプションがあります。たとえば、600MyCronjob などです。
この場合、この数字はファイルの最大年齢(秒単位)として解釈されます。
ファイルがこれより古い場合、エージェントはファイルを無視し、Checkmk 内の関連サービスは出力がないためUNKNOWN状態になります。
3900_hourly_cleaner.txt というファイルの場合、この数字は、実行時間が 5 分未満と予想される 1 時間ごとに実行されるクーロンジョブに適切に選択されています。
5. 実用的な例
ユーザーがログインおよびログアウトするサービスを実行していると仮定します。 このサービスのログファイルには、次の 3 種類の行が含まれます。
21/Oct/2022:12:42:09 User harrihirsch logged in from 12.34.56.78
21/Oct/2022:12:42:23 User zoezhang logged out after 10 min idle
21/Oct/2022:13:00:00 Current user count: 739このプロセスは、ログイン/ログアウトのたびに「Current user count 」という行を書き込むのではなく、一定間隔で書き込むようにしています。
ログファイルの行数が少なく、すぐに読み込める場合は、ローカルチェックをプログラムすることができます。
このチェックは、毎回ログファイル全体を 1 行ずつ読み込み、Current user count という行が発生するたびに、ユーザー数を表示値に設定します。logged in およびlogged out という行が発生すると、ユーザー数を増減します。
最後に、チェックは次のような行を出力します。
1 "Frobolator User Count" count=1023 Watch out! Limit nearly used up.サービスの人気が高まるにつれて、ローカルチェックの実行時間はどんどん長くなり、ある時点でこの解決策は、非同期エージェントプラグインとして実行しても実用的なものではなくなります。 ここで、スプールディレクトリを適切に使用することで、チェックの実行効率を劇的に高めることができます。 次の数段落では、ローカルチェックを提供しているプログラムを変更して、スプールディレクトリを効果的に使用する方法について説明します。
まず、プログラムはファイルの最後に達しても自身を終了させるのではなく、ログファイルが完全に評価された時点で、その時点で決定されたサービスの状態をスプールファイルに書き込むようにします。
<<<local>>>
2 "Frobolator User Count" count=1200 Maximum number of users reached!次に、プログラムを一定期間待機させます。待機時間は、新しく追加されるログエントリの頻度に応じて、数秒から数分まで任意に設定できます。 その後、新しく追加された行のみを評価し、状態を再計算します。 数値が変更されている場合は、スプールファイルを書き換えます。
この手順を無限ループとしてプログラムします。
このプログラムのクラッシュを検出するために、スプールファイルに適切な名前を付けます。たとえば、1800_frobolator.txtなどです。スプールファイルが 30 分間更新されない場合は、サービスまたは評価プログラムに問題があることを示しています。
エージェントのプラグインディレクトリではなく、オペレーティングシステムのオプションを使用して、プログラムをディーモンとして起動します。 プログラムがクラッシュしたり、終了したりした場合の自動再起動に注意してください。 多くのサーバーアプリケーションでは、通常のログファイルに書き込む代わりに、またはそれに加えて、ログ出力を別のプログラムにパイプするオプションも提供しています。 このメカニズムを、スプールファイルを書く評価スクリプトに使用するのも良い方法です。
6. 考慮すべき細かい点
ファイルの読み取りには、エージェントによる通常のプロセスの起動とは異なる問題があります。 トラブルのない運用を行うために、以下の点に注意してください。
6.1. 文字セット
Checkmk は、エージェントの出力は、行末が単純な改行 (0x0A または\n) で、文字エンコーディングがUTF-8(バイトオーダーマーク/BOM なし) であるものと想定しています。
この条件から逸脱すると、最悪の場合、フォーマットが不正なスプールファイルの最初の 1 文字以降がエージェント出力として読み込めなくなる可能性があります。
具体的には、次のことを意味します。
特に古いWindows および Linux システムでは、スプールファイルがWindows 1250 から 1258またはISO 8859エンコーディングで記述されていないことを確認してください。 これを回避できない場合は、UTF-8(事実上の7 ビット ASCII)との共通部分のみが使用されていることを確認してください。
特に新しいWindows システムでは、スプールファイルが、そのシステムで標準として使用されているUTF-16エンコーディングで記述されていないことを確認してください。
BOM は使用しないでください。 特に、Windows のスクリプト言語は、使用されているエンコーディングを示すこの文字シーケンスを出力ファイルに自動的に書き込むことがよくあります。 エージェントの出力では、これにより、行頭に「
<<<」が表示されなくなります。Unix の改行文字 (
0x0Aまたは\n) を使用してください。 ここでも、Windows は多くの場合、文字列CRLF(0x0D 0x0Aまたは\r\n) を使用します。
スプールファイルによって望ましくない動作が発生する場合は、16 進エディタで最初の行を確認してください。
0xFF 0xFEは UTF-16 エンコードのファイルであることを示しています。 この場合、スクリプトを UTF-8 で出力するように変更してください。0xEF 0xBB 0xBFは、BOM 付き UTF-8 を表示します。 この場合、今後は BOM なしでファイルを作成すれば通常問題はありません。
6.2. ソフトリンクおよび名前付きパイプ
原則として、スプールディレクトリ内のファイルはソフトリンクまたは名前付きパイプでもかまいません。 ただし、ファイル名による年齢チェックは、ソフトリンクまたは名前付きパイプ自体の年齢が評価され、書き込まれたデータの年齢は評価されないため、ここでは機能しないことにご注意ください。 名前付きパイプの場合、パイプに書き込むプロセスが常にデータを提供していることを確認する必要があります。 データが提供されない場合、Checkmk エージェントは永久に待機し、最終的にはタイムアウトになります。
特権のないユーザーにスプールファイルへの書き込みを許可する必要がある場合は、これらのユーザー用に空のファイルを作成し、その所有権を適宜設定してください。 そうすることで、これらのユーザーは自分でソフトリンクを設定したり、スプールファイルに直接書き込むことができます。
6.3. ロックとバッファリング
複数のステータス行をスプールファイルに書き込む長いプログラムを書く場合、プログラムの開始時に出力ファイルを開いて書き込むことが考えられます。 ただし、この場合、書き込みバッファが最初に空になり、宛先に書き込まれるまでファイルは完全に空のままとなり、書き込みプログラムがファイルを閉じるまでファイルは不完全なままとなります。 長い書き込み操作の間、ファイルが排他的にロックされている場合も同様です。
このため、書き込む内容全体が利用可能になったときにのみ出力ファイルに書き込むか、一時ファイルに書き込んでからスプールディレクトリにコピーするか、あるいはcat を使用して一時ファイルの内容をスプールディレクトリにある既存のファイルに転送してください。
6.4. 概要を把握する
別の問題として、異なるプログラムが同じ名前のファイルに書き込みを試みると、問題が発生する可能性があります。 スプールファイルの数が多い場合、どのプログラムがどのスプールファイルに実際に書き込んだかを把握しにくくなります。 特に、スプールファイルのフォーマットが間違っているためにエージェントの出力の一部が使用できなくなった場合、非常に面倒で、時間のかかる検索作業が必要になる可能性があります。
この問題を回避するには、各スプールファイルと同じ名前(先頭にドットを付けた名前)のファイルを作成し、そのファイルにジョブに関する情報や連絡先(該当する場合)を保存します。 この隠しファイルの内容は、転送されません。
