ルールの概要
ルールとは、ネットワークやJunosデバイスから特定の情報を抽出するために必要なコンポーネント(ブロック)のパッケージです。 ルール は、分析アプリケーション用に特別に調整されたドメイン固有言語 (DSL) に準拠しています。DSL は、ルールで次のものをキャプチャできるように設計されています。
ルールが動作するために必要な入力データの最小セット
設定されたセンサーから関心のあるフィールド
レポートまたはポーリングの頻度
収集されたデータを操作するトリガーのセット
トリガーが作動するために必要な条件または評価
トリガーが開始されたときに実行する必要があるアクションまたは通知
ルールの構造は次のようになります。
ルールを整理するために、Paragon Insightsはルールを トピックに整理します。トピックは、 system のように非常に一般的なものから、 protocol.bgp のようにより詳細なものまであります。各トピックには、1 つ以上のルールが含まれています。トピックの詳細については、「 Paragon Insightsのトピックについて」を参照してください。
ルールの詳細については、次のセクションで説明します。
準則
ルール は、ハードコーディングから解放されることを意図しています。閾値について考えてみましょう。しきい値がハードコードされている場合、異なる要件を持つ別の顧客やデバイスに合わせて閾値をカスタマイズする簡単な方法はありません。そのため、ルールはパラメーター化を使用して定義され、既定値が設定されます。これにより、パラメータをデフォルトのままにしておくことも、展開時にオペレーターがカスタマイズすることもできます。カスタマイズは、個々のルールが含まれているプレイブックを適用しながら、デバイスグループまたは個々のデバイスレベルで実行できます。
デバイス中心のルールは、デバイスルールと呼ばれます。シャーシ、システム、ラインカード、インターフェイスなどのデバイスコンポーネントは、すべてルール定義のトピックとして扱われます。通常、デバイスルールでは、デバイス上のセンサーが使用されます。
複数のデバイスにまたがるルールは、ネットワーク ルールと呼ばれます。ネットワークルール:
-
ルール頻度を設定する必要があります
-
センサーを含まないこと
-
プレイブックでデバイスルールと混在させることはできません
いずれかの種類のルールをデプロイするには、プレイブックにルールを含め、プレイブックをデバイス グループまたはネットワーク グループに適用します。
Paragon Insightsには、事前定義された一連のルールが付属しています。
ルールを構成するすべてのブロックがすべてのルールに必要なわけではありません。ルール定義で特定のブロックが必要かどうかは、取得しようとしている情報の種類によって異なります。また、一部のルール コンポーネントはネットワーク ルールに対して無効です。 表 1 は、ルールのコンポーネントの一覧と、各コンポーネントの簡単な説明を示しています。
| ブロック |
機能 |
例 |
デバイスルールで必要ですか? |
ネットワークルールに有効か |
|---|---|---|---|---|
| センサーは、データを収集するためのパラメーターを定義します。これには通常、使用するデータ収集方法、取り込むデータ、データをプッシュまたはプルする頻度が含まれます。どのルールでも、センサーはルール内で直接定義されたフィールドによって参照することも、別のルールから参照することもできます。 Paragon Insightsでは、OpenConfig、ネイティブGPB、iAgent、SNMP、syslogの複数のタイプのセンサーを利用できます。 OpenConfigセンサーとiAgentセンサーでは、プッシュ間隔またはポーリング間隔にそれぞれ頻度を設定する必要があります。また、SNMP センサーでは頻度を設定する必要があります。 |
SNMPセンサーを使用して、60秒ごとにネットワークデバイスをポーリングし、ジュニパーSNMP MIBテーブル(jnxOperatingTable)内のすべてのデバイスデータを収集します。 |
いいえ - 別のルールからのフィールド参照、または別のルールからの参照を持つベクトルのみを使用するルールを作成できます。このような場合、rule-frequency を明示的に定義する必要があります。 |
いいえ |
|
| これらのフィールドは、センサー データをフィルタリングまたは操作する方法を提供し、特定の情報を識別して分離できるようにします。フィールドは、静的なしきい値などのプレースホルダー値としても機能し、システムがデータ分析を実行するのに役立ちます。 Fields ブロックのソースは、センサーへのポインター、別のルールで定義されたフィールドへの参照、定数、または数式です。フィールドには、文字列、整数、または浮動小数点を指定できます。デフォルトのフィールド タイプは文字列です。 |
上記で指定したSNMPテーブルから jnxOperating15MinLoadAvg (CPUの15分間平均使用率)値を抽出、分離し、センサーに保存します。 |
はい - フィールドに は、トリガーが動作するデータが含まれます。通常のフィールドとキーフィールドは、条件付きタグ付けプロファイルに基づいてルールに追加できます。以下の 「タグ付け 」セクションを参照してください。 |
はい |
|
| Vectors ブロックでは、リストの処理、セットの作成、異なるセット間での要素の比較が可能です。ベクトルは、1 つ以上のフィールドからの複数の値を保持するために使用されます。ベクトルを使用すると、既存の要素を活用して、複数のルールで同じ要素を繰り返し設定する必要がなくなります。 |
構成されたセンサーと、別のルールからの 2 番目のセンサーへのベクトルを含むルール。センサーを持たず、他のルールのフィールドへのベクトルを持つルール。 |
いいえ |
はい |
|
| [Variables] ブロックでは、ルールに値を渡すことができます。不変ルールの定義は、{{<placeholder-variable> }} のような口ひげスタイルのテンプレートによって実現されます。placeholder-variable 値は、デフォルトでルールに設定されるか、デプロイ時にユーザーが定義できます。 |
文字列「ge-0/0/0」は、すべてのインターフェイスのステータスを収集するフィールド内で使用され、データを 1 つのインターフェイスのみに絞り込みます。静的なしきい値として使用するフィールドで参照される "80" などの整数。 |
いいえ |
いいえ |
|
| Functions ブロックを使用すると、Python などの言語で記述された外部ファイルにプロトタイプ メソッドを作成することで、フィールド、トリガー、およびアクションを拡張できます。functions ブロックには、ファイル パス、アクセスするメソッド、および引数の説明や必須かどうかなどの引数の詳細が含まれます。 |
カウント値を比較する関数を使用して、入力パケット数と出力パケット数を監視するルール。システム ストレージを監視し、ストレージ使用率が定義されたしきい値を超えた場合に一時ファイルとログ ファイルをクリーンアップする関数を呼び出すルール |
いいえ |
いいえ |
|
| トリガーは 定期的にフィールドを他の要素と組み合わせてデータを比較し、現在のデバイスの状態を判断します。 トリガー ブロックはフィールドに作用し、1 つ以上の条件によって定義されます。トリガー条件には、正常性ページでデバイスの状態を視覚化する方法を定義するパラメーターを含む 1 つ以上の「when-then」ステートメントが含まれます。条件の条件が満たされると、条件で定義されたアクションが実行されます。 既定では、トリガーは、別の頻度に明示的に設定されていない限り、10 秒ごとに評価されます。 既定では、ルールで定義されているすべてのトリガーが並列で評価されます。 |
90秒ごとにCPUの15分平均使用率値を確認し、定義されたしきい値を超えた場合は、デバイスの正常性ページでデバイスのステータスを赤に設定し、現在の値を示すメッセージを表示します。 |
オプション - トリガーを使用すると、ルールでアクションを実行できます。 |
はい |
|
| [ルールのプロパティ]ブロックでは、ハードウェアの依存関係、ソフトウェアの依存関係、バージョン履歴など、Paragon Insightsルールのメタデータを指定できます。 |
MXシリーズのルーターのすべてのデバイスの後方互換性のために、サポートされている最小リリースバージョンを設定する設定。 |
いいえ |
はい |
センサー
センサーを定義するときは、センサー名、センサー タイプ、データ収集頻度などの情報を指定する必要があります。 表 1 に示すように、センサーは次のいずれかです。
-
OpenConfig OpenConfig JTI センサーについては、 Junos Telemetry Interface User Guide を参照してください。
-
Native GPB ネイティブ GPB JTI センサーについては、 Junos Telemetry Interface ユーザー ガイドを参照してください。
-
iAgent iAgentセンサーは、NETCONFおよびYAMLベースのPyEZテーブルとビューを使用して、必要なデータを取得します。構造化データ(XML)と非構造化データ(VTYコマンドおよびCLI出力)の両方がサポートされています。Junos PyEZの情報については、 Junos PyEZのドキュメントを参照してください。
-
SNMP 簡易ネットワーク管理プロトコル。
-
syslog システムログ
-
BYOI Bring your own ingest – 独自のインジェストタイプを定義できます。
-
Flow NetFlow トラフィック フロー分析プロトコル
-
sFlow sFlow パケット サンプリング プロトコル
異なるルールに同じセンサーが定義されている場合、センサーごとに 1 つのサブスクリプションのみが行われます。OpenConfig およびネイティブ GPB センサーの sensor-path と、iAgent センサーの file と table のタプルで構成されるキーを使用して、関連するルールを識別します。
同じ センサー パス キーを持つ複数のセンサーに異なる周波数が定義されている場合、センサー サブスクリプションには最も低い周波数が選択されます。
田畑
フィールド・ソースには、 表 1 にリストされているように、4 つのタイプがあります。 表 2 では、4 つのフィールド取り込みタイプについて詳しく説明しています。
| フィールド タイプ |
細部 |
|---|---|
| センサー |
センサーをサブスクライブすると、通常、データの複数の列にアクセスできます。たとえば、OpenConfig インターフェイス センサーにサブスクライブすると、次のようなカウンター関連情報を含む一連の情報にアクセスできます。 /interfaces/counters/tx-bytes、 /interfaces/counters/rx-bytes、 /interfaces/counters/tx-packets、 /interfaces/counters/rx-packets、 /interfaces/counters/oper-state など OpenConfig センサーのパスの名前がかなり長い場合、フィールド内のセンサー定義では、エイリアシングとフィルタリングが可能です。単一センサー ルールの場合、フィールド テーブルに必要なセンサーのセットは、ルールで定義されたトリガーに基づいて、プログラムによって未加工テーブルから自動インポートされます。 |
| 参考 |
トリガーは、そのルール内で定義されたフィールドでのみ動作できます。場合によっては、フィールドが別のルールで定義された別のフィールドまたはトリガー出力を参照する必要があることがあります。これは、他のフィールドまたはトリガーを参照し、追加のフィルターを適用することで実現されます。参照されるフィールドまたはトリガーは、参照元フィールドへのストリーム通知として扱われます。参照は、同じルール内ではサポートされていません。 参照は、指定された時間範囲から値(使用可能な場合)を選択する時間範囲オプションを取ることもできます。フィールド参照は常にあいまいさがないようにする必要があるため、結果をフィルター処理して 1 つの値だけを取得するように適切な注意を払う必要があります。参照が複数のデータポイントまたは値を受け取った場合、最新のもののみが使用されます。たとえば、過去 3 分間にフィールドに含まれる値を参照している場合、その時間範囲でそのフィールドに 6 つの値が含まれる可能性があります。Paragon Insightsは、このような状況でのみ最新の値を使用します。 参照用の構文は次のとおりです。 /device-group[device-group-name=<device-group>]\ /device[device-name=<device>]/topic[topic-name=<topic>]\ /rule[rule-name=<rule>]/field[<field-name>=<field-value>\ AND|OR ...]/<field-name>
手記:
上記のパスのデバイスグループとデバイスコンポーネントは、ネットワークルールにのみ適用されます。 たとえば、事前定義されたルール protocol.l3vpn/check-l3vpn-ospf-state には、次の参照パスを使用してインターフェイスのステータスを確認するためのフィールドがあります。 /device-group[device-group-name={{pe-device-group}}]
/device[device-id={{pe-device-name}}]/
topic[topic-name='protocol.l3vpn']
/rule[rule-name=get-interface-details]
/field[sub-interface-index='{{pe-ifl-number}}'
and interface-name='{{pe-interface-name}}']
/link-state |
| 定数 |
定数として定義されたフィールドは固定値であり、実行中に変更することはできません。Paragon Insights 定数 型は、文字列、整数、および倍精度浮動小数点数です。 |
| 式 |
未加工のセンサー フィールドは、トリガーを定義するための開始点です。ただし、トリガーは、多くの場合、数学的変換を適用することで、数式によって定義された派生フィールドに対して機能します。 数式は、事前定義またはユーザー定義 (UDF) にすることができます。定義済みの式には、最小、最大、平均、合計、カウント、変化率、経過時間、標準偏差、マイクロバースト、動的しきい値、異常検出、外れ値検出、予測が含まれます。 <パラグラフ>変化率とは、ある時点での現在の値と以前の値の差を指します。パケット転送は、変化率の式を使用できるユースケースの例です。 [Hold Time] フィールドは、時間間隔のしきい値を取ります。現在の値と以前の値の間の時間間隔は、指定された保持時間値を超えることはできません。[乗算係数] フィールドは、フィールド値の単位を変換するために使用されます。フィールド値がバイト単位で計算される場合、[乗算係数] として 1024 を指定すると、結果がキロバイトに変換されます。[保持時間(Hold Time)] と [乗算係数(Multiplication Factor)] は、変化率計算式を適用する場合、必須フィールドではありません。 Paragon Automationでは、 $timeを使用して経過時間式で現在の時点時間を取得できます。 一部の定義済みの数式は、履歴データを操作するために時間範囲を操作できます。時間範囲が指定されていない場合、数式は now として指定された現在のデータに対して機能します 。 |
ベクトル
ベクトル は、複数の要素を 1 つのルールにまとめるのに役立ちます。たとえば、ベクトルを使用すると、すべてのインターフェイス エラー フィールドを収集できます。Vector の構文は次のとおりです。
vector <vector-name>{
path [$field-1 $field-2 .. $field-n];
filter <list of specific element(s) to filter out from vector>;
append <list of specific element(s) to be added to vector>;
}
$field-n は、参照型のフィールドにすることができます。
ベクトルの定義に使用されるフィールドは、他のルールで定義されたフィールドへの直接参照にすることができます。
vector <vector-name>{
path [/device-group[device-group-name=<device-group>]\
/device[device-name=<device>]/topic[topic-name=<topic>]\
/rule[rule-name=<rule>]/field[<field-name>=<field-value>\
AND|OR ...]/<field-name> ...];
filter <list of specific element(s) to filter out from vector>;
append <list of specific element(s) to be added to vector>;
}
この構文では、コンストラクトの <field-name>=<field-value> 部分を使用したオプションのフィルター処理が可能になります。ベクトルは、指定された時間範囲から値を選択する時間範囲オプションを取ることもできます。指定された時間範囲で複数の値が返された場合、それらはすべて配列として選択されます。
ベクトルでは、次の定義式がサポートされています。
-
unique @vector1–vector1 から一意の要素セットを返します。 -
@vector1 and @vector2–vector1 と vector2 の一意の要素の共通部分を返します。 -
@vector1 or @vector2–2 つのベクトル内の一意の要素の合計セットを返します。 -
@vector1 unless @vector2–ベクトル 1 の一意の要素セットを返しますが、ベクトル 2 の要素は返しません
変数
変数は、ルール作成時に [変数 ] ページで定義します。変数定義のこの部分では、デプロイ中にデバイス グループまたはデバイスに特定の値が設定されていない場合に使用される既定値が作成されます。たとえば、 check-interface-status ルールには interface_name という変数が 1 つあります。 [変数 ] ページで設定される値は、正規表現 (regex)、 .*、つまりすべてのインターフェイスです。
check-interface-statusルールをそのまま適用すると、デバイスグループ内のすべてのデバイスのすべてのインターフェイスに関するインターフェイスステータス情報が提供されます。このルールを含むプレイブックを適用するときに、デバイスグループまたはデバイスレベルでデフォルト値を上書きできます。これにより、ルールを柔軟に適用できます。優先順位は、デバイス値がデバイス・グループ値を上書きし、デバイス・グループの値がルールで設定されたデフォルト値を上書きします。
デバイスルールで定義された変数のデフォルト値を指定することを強くお勧めします。ジュニパーが提供するすべてのルールは、この推奨事項に従います。デフォルト値は、ネットワーク ルールで定義された変数に設定しないでください。
関数
関数は、ルール作成時に [関数] タブで定義します。ここで関数を定義すると、フィールドに関連付けられた数式や、トリガーの [When] セクションと [Then] セクションで使用できます。トリガーの when 句で使用される関数は、ユーザー定義関数と呼ばれます。これらは true または false を返す必要があります。トリガーの then 句で使用される関数は、ユーザー定義アクションと呼ばれます。
Paragon Automationでは、Pythonユーザー定義関数を使用して複数の値を返すことができます。
たとえば、3 つの戻り値を持つ関数 example_function.py があるとします。ルールで example_function.py を呼び出すと、ユーザー定義関数 (UDF) の最初の戻り値が、関数を呼び出すルール フィールド ([フィールド] タブ) に格納されます。 r2 や r3などの戻り値フィールドを構成する必要があるのは、[関数] タブの [戻り値リスト] の残りの 2 つの戻り値だけです。
時系列データベースでは、リターン リスト フィールドの名前の前には、UDF を使用するルール フィールドの名前が付きます。たとえば、 rule_field_name-r2。
図 2 は、 Functions ブロックの構成例を示しています。フィールドの詳細については、以下で説明します。
トリガー
トリガーは、Paragon Insightsのルール定義において極めて重要な役割を果たします。これらは、使用可能なセンサー データの変更に基づいてアクションを実行するかどうか、およびいつ実行するかを決定するルールの一部です。トリガーは、when-this、then-that の方法で構築されます。前述したように、トリガーアクションは 条件に基づいています。 用語 は、フィールド値の更新を監視する when 句と、変更内容に基づいてアクションを開始する then 句で構成されます。1 つのトリガー内で複数の 用語 を作成できます。
本規約の when 句の評価は、用語リストの一番上から始まり、一番下に向かって行われます。項が評価され、一致しない場合は、次の項が評価されます。既定では、一致するか、一致なしでリストの一番下に到達するまで、この方法で評価が続行されます。
when 句で使用できる定義済みの演算子には、次のものがあります。
評価された方程式の場合、このドキュメントでは、方程式の左辺と右辺をそれぞれLHSとRHSに短縮します。
-
より大きい - ある値が別の値よりも大きいかどうかをチェックするために使用されます。
-
戻り値: True または False
-
構文: greater-than <LHS> <RHS> [time-range <range>]
-
例:
//Memory > 3000 MB in the last 5 minuteswhen greater-than $memory 3000 time-range 5m;
-
-
greater-than-or-equal-to- より大きい ものと同じですが、より大きいか等しいかをチェックします(>=)
-
より小さい
-
戻り値: True または False
-
構文: less-than <LHS> <RHS> [time-range <range>]
-
例:
//Memory < 6000 MB in the last 5 minuteswhen less-than $memory 6000 time-range 5m;
-
-
より小さいか等しい - より小さい のと同じですが、より小さいか等しいかどうかをチェックします(<=)
-
equal-to- ある値が別の値と等しいことを確認するために使用されます。
-
戻り値: True または False
-
構文: equal-to <LHS> <RHS> [time-range <range>]
-
例:
//Queue’s buffer utilization % == 0when equal-to $buffer-utilization 0;
-
-
not-equal-to: equal-to と同じですが、負の条件(!=)をチェックします。
-
exists - 値自体を気にせずに、ある値が存在するかどうかを確認するために使用します。つまり、デバイスから何らかの値が送信されているはずです。
-
戻り値: True または False
-
構文: exists <$var> [time-range <range>]
-
例:
//Has the device configuration changed?when exists $netconf-data-change
-
-
matches-with(文字列と正規表現用)- Python の正規表現操作を使用して文字列の一致をチェックするために使用します。詳細については、「 Python 正規表現」 を参照してください。
手記:LHS、または左側は、検索している文字列です。RHS(右辺)は一致式です。正規表現は RHS でのみ使用できます。
-
戻り値: True または False
-
構文: matches-with <LHS> <RHS> [time-range <range>]
-
例:
//Checks that ospf-neighbor-state has been UP for the past 10 minuteswhen matches-with $ospf-neighbor-state “^UP$” time-range 10m;
-
-
does-not-match-with(文字列と正規表現の場合)– matches-with と同じですが、否定的な条件をチェックします
-
範囲 - 値 X が、最小や最大(最小 <= X <= 最大)などの特定の範囲内にあるかどうかを確認します。
-
戻り値: True または False
-
構文: 範囲 <$var> 最小 <最小値>最大値<最大値> [time-range <範囲>]
-
例:
//Checks whether memory usage has been between 3000 MB and 6000 MB in the last 5 minuteswhen range $mem min 3000 max 6000 time-range 5m;
-
-
Increaseing-at-least-by-value:以前の値と比較して、値が少なくとも最小許容率だけ増加しているかどうかを確認するために使用します。許容可能な最小増加率を定義する省略可能なパラメーターを指定できます。最小許容増加率は、指定しない場合、デフォルトで 1 になります。
-
戻り値: True または False
-
構文:
値ごとに最小で増加する<$var> [増分<連続するポイント間の最小値>]
increase-at-least-by-value <$var> [increment <連続するポイント間の最小値>] time-range <範囲>
-
例:
Checks that the ospf-tx-hello has been increasing steadily over the past 5 minutes.when increasing-at-least-by-value $ospf-tx-hello increment 10 time-range 5m;
-
-
increaseing-at-most-by-value - 以前の値と比較して、値が最大許容レートを超えていないかどうかを確認するために使用します。許容可能な最大増加率を定義する省略可能なパラメーターを指定できます。指定しない場合、最大許容増加率はデフォルトで 1 になります。
-
戻り値: True または False
-
構文:
increaseing-at-most-by-value <$var> [increment <連続するポイント間の最大値>]
値ごとに最大で増加する<$var> [増分<連続するポイント間の最大値>] 時間範囲<範囲>
-
例:
Checks that the error rate has not increased by more than 5 in the past 5 minutes.when increasing-at-most-by-value $error-count increment 5 time-range 5m;
-
-
inging-at-least-by-rate - 連続する値の増加率が少なくとも特定の率であることを確認するために使用されます。必須パラメータには、値と時間単位が含まれ、これらが合わせて最小許容増加率を示します。
-
戻り値: True または False
-
構文:
この構文は、現在の値を以前の値と比較し、少なくとも値レートだけ増加するようにします。
<秒|分|時間|日|週|月|年> [時間範囲<範囲>><<$var>
この構文は、現在の値を以前の値と比較し、少なくともパーセント率で増加するようにします
<秒|分|時間|日|週|月|年> [時間範囲 <範囲>><<$var>
-
例:
Checks that the ospf-tx-hello has been increasing strictly over the past five minutes.when increasing-at-least-by-rate $ospf-tx-hello value 1 per second time-range 5m;
-
-
最大レートで増加 - レートごとに増加する場合と似ていますが、レートの減少を確認する点が異なります。
when 句で これらの演算子を使用すると、ユーザー定義条件と呼ばれる関数が作成されます。これらの関数は、常に true または false を返す必要があります。
用語の評価の結果が一致した場合、Then 句で指定されたアクションが実行されます。デフォルトでは、用語の処理はこの時点で停止します。このフローを変更するには、Then 句の下部にある [次の用語の評価] ボタンを有効にします。これにより、Paragon Insightsは項処理を続行し、when-this、this、then thatなどのより複雑な意思決定機能を作成します。
次に、[ Then ] セクションで使用できる事前定義済みのアクションの一覧を示します。
-
次に
-
地位
タグ 付け
タグ付けを使用すると、特定の条件が満たされたときに、フィールド、値、およびキーをParagon Insightsルールに挿入できます。詳細については、「 Paragon Insightsのタグ付けの概要 」を参照してください。
ルールのプロパティ
[ルールのプロパティ]ブロックでは、ハードウェアの依存関係、ソフトウェアの依存関係、バージョン履歴など、Paragon Insightsルールのメタデータを指定できます。このデータは、情報提供や、デバイスがParagon Insightsルールと互換性があるかどうかを確認するために使用できます。