複雑なデータポイント
最終更新日: 16 年 2021 月 XNUMX 日概要
データポイントは、監視中に収集されるデータの一部です。 すべてのデータソース定義には、収集および保存する情報と、そのデータを収集、処理、および潜在的にアラートする方法を定義する、少なくともXNUMXつの構成済みデータポイントが必要です。 LogicMonitorは、通常のデータポイントと複雑なデータポイントのXNUMX種類のデータポイントを定義します。
通常のデータポイントは、収集された生の出力から直接抽出できる、監視するデータを表します。 通常のデータポイントの詳細については、を参照してください。 通常のデータポイント.
一方、複雑なデータポイントでは、生の出力で利用できないデータを使用して、監視対象システムから返されたデータの後処理が可能になります。 これは、ターゲットリソースによって提示されたデータを操作する必要がある場合に役立ちます。 たとえば、ストレージシステムでは、通常、使用率を追跡して警告する必要があります。使用率は、合計容量と使用済み容量に基づいて計算できます。
複雑なデータポイントの値は計算された形式で保存されるため、グラフ、レポート、ダッシュボード、およびポータル内の他の場所で使用できます。
LogicMonitorは、次のXNUMX種類の複雑なデータポイントを定義します。 標準の複雑なデータポイント および Groovyの複雑なデータポイント。 それぞれについて、次のセクションで詳しく説明します。
注: 複雑なデータポイントは、で概説されているように、データソース定義から構成されます。 データポイントの概要.
標準の複雑なデータポイント
標準の複雑なデータポイントは、LogicMonitorの式構文を使用して、データポイントまたはデバイスプロパティの値に基づいて新しい値を計算します。
たとえば、SNMPインターフェイスMIBは、インターフェイス上のインバウンドオクテット(InOctets)を報告するOIDを提供します。 運用エンジニアはオクテットではなくMbpsの観点から考える傾向があるため、次の式を使用して、InOctetデータポイントによって運ばれる値をMbpsに変換できます。
InOctets*8/1000/1000
標準の複雑なデータポイントは、式内のデバイスプロパティを参照することもできます。 プロパティ名を二重ハッシュマーク(つまり、## PROPERTYNAME ##)で囲むだけです。
たとえば、特定のデバイスに設定された帯域幅制限に基づいてスループットを計算するとします。 次のように、「ManualBandwidthLimit」という名前のプロパティを設定し、そのプロパティを標準の複雑なデータポイント計算内で使用できます。
InOctets*8/##ManualBandwidthLimit##
このユースケースでは、データソースが適用されるすべてのデバイスでカスタムプロパティが定義されていることを確認するように注意する必要があります。 プロパティが見つからない場合は、空の文字列に置き換えられ、エラーが返されます。
この問題を防ぐために、プロパティを取得する標準の複合データポイント式と、有効な値がある場合にのみプロパティを使用するXNUMX番目の標準の複合データポイント式を作成できます。
データポイント式構文を使用した標準の複素データポイントの構築
データポイント式は、InfixまたはRPN(逆ポーランド記法)表記のいずれかで記述できます。
中置の例:
(sendpkts-recdpkts)/sentpkts*100
RPNの例:
sendpkts,recdpkts,-,sentpkts,/,100,*
注: このサポート記事のすべての式の例は、中置記法を使用して示されています。
式オペランド
データポイント式で使用できるオペランドには、次のXNUMX種類があります。
- データポイント名
- デバイスのプロパティ名
- 任意の番号
次の例では、数値とデータポイント名を使用して、特定のインターフェイスで破棄されたインバウンドパケットの割合を計算します。
100 * InDiscards/(InBroadcastPkts+InUcastPkts+InMulticastPkts+InDiscards)
式演算子
データポイント式は、ほとんどのプログラミング/スクリプト言語で見られる一般的な演算子をサポートしています。
算術演算子
ビット演算子
論理演算子
注意: ブールデータ型は、データポイント式ではサポートされていません。 代わりに、ゼロ以外の値はTRUEとして扱われ、ゼロはFALSEとして扱われます。 したがって、両方のオペランドがゼロ以外の場合、
「1」を返します。 いずれかのオペランドがゼロ以外の場合、
&& / and
「1」を返します。
|| / or
式関数
演算子を使用して計算を実行することに加えて、データポイント式で次の関数を使用できます。
条件付き構文
比較関数
以下の比較機能が利用できます。 通常、これらは条件付き(if)ステートメント内で使用されます。
数学関数
いくつかの数学演算が利用可能です。
定数
次の数学定数を使用できます。
パーセンタイル関数
パーセンタイル関数は、複雑なデータポイント式ではなく、仮想データポイント定義(グラフおよびウィジェット内)でのみ使用できる特別な関数です。 仮想データポイントの詳細については、を参照してください。 データソースグラフ.
パーセンタイル関数の例
- 帯域幅(bps)の10時間ごとのグラフをプロットすることを検討してください。 私たちのデータベースでは、この時間のbpsの2個の値を収集しました:[3、7、6、1、3、4、10、2、4、1]。 この配列を並べ替えると、[2、2、3、3、4、4、6、7,10、95、10]になります。 percent(bps、9)関数は0(95ベースの配列のXNUMX番目の値)を返します。これは、サンプルのXNUMX%がこの値を下回っていることを意味します。
- 別の例として、95%のトラフィックレートを計算するには(多くのISPが行うように、95%のインレートとアウトのレートの最大値を使用)、snmp64_If-データソースのスループットグラフに以下を追加できます。
- 次の式を使用して、仮想データポイント95Inを追加します。
percent(InMaxBits,95) - 次の式を使用して、仮想データポイント95Outを追加します。
percent(OutMaxBits,95) - 次の式を使用して、仮想データポイント95Percentileを追加します。
。 これは、95Inの値を使用します。95Outの値より大きい場合は、95Outの値を使用します。
if(gt(95In,95Out), 95In, 95Out) - グラフの線95Percentileを追加して、選択した色で95%の線をプロットします。
- 次の式を使用して、仮想データポイント95Inを追加します。
- また、パーセンタイル関数では、xが式ではなくデータポイントである必要があることに注意してください。 意味:
percent(InOctets*8, 95)
動作しませんが…percent(InOctets, 95)
意志
前者を実装するには、最初に数式を含む仮想データポイントを作成し、そのデータポイントをパーセンタイル関数の引数として使用します。
特殊なケース:負の値
データポイント式を負の符号で始めることはできません。 式で負の値を使用するには、ゼロから値を減算します(たとえば、-0ではなく2-2を使用します)。
特殊なケース:不明な値
不明な値は、テスト条件の一部として、または結果として、XNUMXつの方法で処理されます。
次の式について考えてみます。
if(un(DatapointOne),0,DatapointOne)
この場合、DatapointOneの値が不明な場合(NaN —データの欠如、非数値形式のデータ、無限大などの数値ではない)、式は0を返します。 DatapointOneの値がNaN(実際の数値)以外の場合、その数値が返されます。
次に、次のことを検討してください。
if(lt(DatapointTwo,5),unkn,DatapointTwo)
DatapointTwoの値が数値5より小さい場合、この式はNaN(「データなし」として表示されます)を返します。DatapointTwoが5より大きい値を返す場合、その値が表示されます。
NaN値は、true / falseのみを返す操作で使用する場合にも特別な考慮が必要です。 Java言語仕様では、オペランドのXNUMXつがNaNであっても、論理式は結果としてTRUEまたはFALSEとしてのみ評価されることが規定されています。 たとえば、式 eq(x,y)
xおよび/またはyがNaNであっても、常に0または1の結果として評価されます。
これを回避するには、式の評価の前にNaNを実行する前に値を確認します。
if(or(un(Datapoint1), un(Datapoint2)), unkn(), <expression to evaluate>)
以下は、NaN値を使用した演算子/関数の動作のリストです。
Groovyの複雑なデータポイント
Groovyの複雑なデータポイントは、Groovyスクリプトを使用して、収集された生データを処理します。 Groovyの複雑なデータポイントでは、生データのペイロードにはアクセスできますが、実際のデータポイントにはアクセスできません(たとえば、「カウンター」または「派生」として計算されたデータポイント)。 また、Groovyでは、デバイスとインスタンスの両方のプロパティに基づいた計算が可能です。 通常、Groovyの複雑なデータポイントを使用して、標準の複雑なデータポイントでは実現できない方法でデータを操作します。
ほとんどの場合、標準の複雑なデータポイントを使用して、収集されたデータを操作できます。 ただし、データポイント式では不可能な追加の処理を行う必要がある場合は、Groovyスクリプトを使用して、よりフル機能のデータポイント計算を行うことができます。
Groovyを使用して複雑なデータポイントを構築する場合、コレクターは通常のデータポイントから収集された生データをGroovy変数に事前入力します。 これらのオブジェクトのタイプと構文は、 収集方法 データソースで採用されています。 コレクションタイプに基づいて割り当てられた変数名については、以下の表を参照してください。
注: Groovyの複雑なデータポイントは、「カウンター」や「派生」データポイントなどのレートとして計算されるのではなく、収集されたとおりに(つまり、「ゲージ」データポイントとして)生データを参照します。
Groovyでデータを処理したら、を使用する必要があります
計算された値をコレクターに戻して保管するメソッド。
return();
GroovyComplexデータポイントのデバイスとインスタンスのプロパティ
Groovyの複雑なデータポイント内で収集したデバイスまたはインスタンスのプロパティを使用できます。
デバイスまたはインスタンスのプロパティは、Groovy内で次のように参照できます。
hostProps.get("auto.PropertyName")
デバイスプロパティを取得するにはinstanceProps.get("auto.PropertyName")
インスタンスプロパティを取得するにはtaskProps.get("auto.PropertyName")
いずれかのタイプのプロパティを取得するには
見る 埋め込まれたGroovyスクリプト 詳細と例については。
例:WMIを使用したGroovy Complex Datapoint
Win32_OperatingSystemクラスをクエリするWMIデータソースについて考えてみます。 WMIクラスから出力された生の日付を使用する必要がある場合は、次のように記述します。
rawDate=output["LOCALDATETIME"];
return(rawDate);
例:SNMPを使用したGroovy Complex Datapoint
snmp64_If-などのインターフェイスデータをクエリするSNMPデータソースについて考えてみます。 返された生の値に対していくつかの計算を実行したい場合は、次のようなことを行うことができます。
// iterate through output array
output.each
{ line ->
(oid, value) = line.toString().split('=');
// get inOctet and outOctet values
if (oid.startsWith(".1.3.6.1.2.1.31.1.1.1.6"))
{
totalInOctets = value.toFloat();
}
else if (oid.startsWith(".1.3.6.1.2.1.31.1.1.1.10"))
{
totalOutOctets = value.toFloat();
}
}
// sum the values and return
totalOctets = totalInOctets + totalOutOctets;
return(totalOctets);
例:JMXを使用したGroovy Complex Datapoint
この例では、時刻を日付文字列として返すJMXMbeanについて考えてみます。 時間を文字列として表示する方法は多数あるため、LogicMonitorにすべての可能な形式のポストプロセッサを含めることはできませんが、これはGroovyスクリプトを使用して簡単に実現できます。 次のMbeanが「ThuSep11 06:40:30UTC2016」の形式で時刻を返す場合:
solr/##WILDVALUE2##:type=/replication,id=org.apache.solr.handler.ReplicationHandler:replicationFailedAt
しかし、今からの時間とそのMbeanの時間を報告するデータポイントを作成したいので、Groovyコードとして次を使用できます。
rawDate = output["solr/##WILDVALUE2##:type=/replication,id=org.apache.solr.handler.ReplicationHandler:replicationFailedAt"];
Date fd = Date.parse( 'EEE MMM dd HH:mm:ss z yyyy', rawDate );
today = new Date();
timeDiff = (today.time - fd.time)/1000;
return (timeDiff);
例:HTTPを使用したGroovy Complex Datapoint
これは、Groovyを使用してHTTP収集メカニズムによって返されるステータスコードを操作する方法の簡単な例です。
if (status < 2)
{
myStatus = 5;
}
else
{
myStatus = 10;
}
return(myStatus);