複雑なデータポイント

最終更新日: 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)

式演算子

データポイント式は、ほとんどのプログラミング/スクリプト言語で見られる一般的な演算子をサポートしています。

算術演算子
x+y 添加
•2 + 2 = 4
x-y 引き算
•3– 2 = 1
x * y 乗算
•2 * 3 = 6
x/y 分裂
•4/2 = 2
x%y モジュラス
•4%2 = 0
ビット演算子
x&y ビット単位で
•1010&1100 = 1000
× | よ ビットごとまたは
•1010 | 1100 = 1110
論理演算子
&&(式1、式2)
or
and(expression1、expression2)
論理および:expression1とexpression2の両方がtrue(ゼロ以外)の場合にtrueと評価されます
•and(2 + 2,1 + 1)= true
•and(2 + 2,2-2)= false
||(式1、式2)
or
または(式1、式2)
論理または:expression1またはexpression2のいずれかがtrue(ゼロ以外)の場合にtrueと評価されます
•or(2 + 2,1-1)= true
•または(2-2,1-1)= false

Note ブールデータ型は、データポイント式ではサポートされていません。 代わりに、ゼロ以外の値はTRUEとして扱われ、ゼロはFALSEとして扱われます。 したがって、両方のオペランドがゼロ以外の場合、
&& / and
「1」を返します。 いずれかのオペランドがゼロ以外の場合、
|| / or
「1」を返します。

式関数

演算子を使用して計算を実行することに加えて、データポイント式で次の関数を使用できます。

条件付き構文
if(x、y、z) 式xがtrueと評価された場合、yを返します。 それ以外の場合はzを返します
•if(0、1、2)= 2
•if(1、1、2)= 1
比較関数

以下の比較機能が利用できます。 通常、これらは条件付き(if)ステートメント内で使用されます。

lt(x、y) x <yの場合、trueと評価されます
•lt(1、2)= 1
le(x、y) x <= yの場合、trueと評価されます
•le(3、1)= 0
gt(x、y) x> yの場合、trueと評価されます
•gt(2、1)= 1
ge(x、y) x> = yの場合、trueと評価されます
•ge(4、1)= 1
eq(x、y) x == yの場合、trueと評価されます
•eq(4、1)= 0
limit(x、y、z) xがyとzの包括的境界の間にある場合、xを返します。 それ以外の場合はNaN
•limit(1、2、3)= NaN
•limit(4、4、7)= 4
in(i [、j、…、n]、z) zが可能な値のリストに存在する場合、true(1)と評価されます。 それ以外の場合はfalse(0)を返します
•in(DatapointOne、DatapointTwo、DatapointThree、value)= 1(現在、いずれかのデータポイントがある場合)
「値」を返す
•in(value1、value2、value3、DatapointOne)= 1(DatapointOneが現在の場合)
記載されている値
max(x、y) xとyの大きい方を返します
•max(1,2)= 2
min(x、y) xとyの小さい方を返します
•min(1,2)= 1
un(x) xが不明(数値ではない)の場合、true(1)と評価されます
•un(1)= 0
数学関数

いくつかの数学演算が利用可能です。

round(x) 値xを整数値に丸めます
•round(1.89)= 2
床(x) xの前の最小の次の整数を返します
•floor(2.78)= 2
天井(x) xの前の最大の次の整数を返します
•ceil(2.78)= 3
abs(x) xの絶対値を返します
•abs(-3)= 3
log(x) xの自然対数を返します
exp(x) xの自然指数を返します(ex)
pow(x、y) xをy乗した結果を返します(xy)
sqrt(x) xの平方根を返します
sin(x) xの正弦を返します
cos(x) xのコサインを返します
定数

次の数学定数を使用できます。

unkn() NaN(数値ではない)を返します
pi() 円周率の値を返します
e() オイラーの数の値を返します(e)
inf() 正の無限大の値を返します
neginf() 負の無限大の値を返します
ランダム() 0から1までの乱数を返します
パーセンタイル関数

パーセンタイル関数は、複雑なデータポイント式ではなく、仮想データポイント定義(グラフおよびウィジェット内)でのみ使用できる特別な関数です。 仮想データポイントの詳細については、を参照してください。 データソースグラフ.

パーセント(x、y) を使用して、表示された時間範囲のデータポイント「x」の使用可能なすべての値のyパーセンタイル値を返します。
集計データ
rawpercentile(x、y) 表示された時間範囲の名前付きデータポイント「x」の使用可能なすべての値のyパーセンタイル値を返します。
生を使用して
データ

パーセンタイル関数の例

  • 帯域幅(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を追加します。
      if(gt(95In,95Out), 95In, 95Out)
      。 これは、95Inの値を使用します。95Outの値より大きい場合は、95Outの値を使用します。
    • グラフの線95Percentileを追加して、選択した色で95%の線をプロットします。
  • また、パーセンタイル関数では、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値を使用した演算子/関数の動作のリストです。

算術演算子
+、-、*、/、%
NaNを返します
ビット演算子
&、|
非NaNを返します
論理演算子
および、または、xor
0または1を返します
条件付きExpr
if(x、y、z)およびxはNaN
zを返します
比較機能
lt、le、gt、ge、eq、in
0または1を返します
数学関数
最小、最大、罪、cos…
NaNを返します

Groovyの複雑なデータポイント

Groovyの複雑なデータポイントは、Groovyスクリプトを使用して、収集された生データを処理します。 Groovyの複雑なデータポイントでは、生データのペイロードにはアクセスできますが、実際のデータポイントにはアクセスできません(たとえば、「カウンター」または「派生」として計算されたデータポイント)。 また、Groovyでは、デバイスとインスタンスの両方のプロパティに基づいた計算が可能です。 通常、Groovyの複雑なデータポイントを使用して、標準の複雑なデータポイントでは実現できない方法でデータを操作します。

ほとんどの場合、標準の複雑なデータポイントを使用して、収集されたデータを操作できます。 ただし、データポイント式では不可能な追加の処理を行う必要がある場合は、Groovyスクリプトを使用して、よりフル機能のデータポイント計算を行うことができます。

Groovyを使用して複雑なデータポイントを構築する場合、コレクターは通常のデータポイントから収集された生データをGroovy変数に事前入力します。 これらのオブジェクトのタイプと構文は、 収集方法 データソースで採用されています。 コレクションタイプに基づいて割り当てられた変数名については、以下の表を参照してください。

コレクションタイプ

Groovy変数

SNMP 出力:snmpペイロードは配列として表され、各oid / responseペアは「=」で区切られた要素として表されます。
HTTP status:httpクライアントのステータスコード(1〜5)、5は接続に失敗しました
反応時間:ミリ秒単位の応答時間
出力:ヘッダーと本文を含むhttp応答全体
ボディ:http本文のみ
WMI 出力:プロパティ名(大文字)をキーとして指定したWMIクラスのすべてのプロパティのそれぞれを含むマップ
JMX 出力:指定された各mbeanとその生の値を含むマップ

注: 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);
記事上で