prometheus常用関数式
5581 ワード
Prometheusの強みは、多くの計算式を使って自分の必要なデータを取得できることです.計算式にかかわるだけに、ZabbixでCPU使用率を取得するのは簡単ですが、Prometheusでは計算式を使用して完了する必要があります.
例えばCPU使用率を統計する:node_exporterは、CPUがよく使う8つの状態の累積稼働時間をキャプチャし、そして、(すべての非アイドル状態のCPU時間の総和)/(すべての状態のCPU時間の総和)=CPU使用率を使用します.また、CPUの平均時間を取得するにはCounterデータ型を使用する必要があります.Counterのデータは常に増分されているので、増分値の一部を切り取ってから、この値を数式に当てはめて計算します.
Prometheusは異なるデータ型に非常に多くの計算関数を提供しています.counterデータ型に遭遇し、任意の操作をする前にrate()またはincrease()関数をセットする小さなテクニックがあります.一般的な関数の説明を以下に示します.
rate()関数:counterタイプのデータに特化した非常に重要な関数であり、counterのこの期間の平均毎秒増分を取得します.例えばモニタリングネットワークがバイト数を受け取る場合、9:10から9:20までの間に累計量が1000 bytes増加し、rate([1 m])関数を加えると1000を60秒で割って約16 bytesと算出される.
increase関数:rate()関数と同様にCounterと組み合わせて使用します.違いは、平均値ではなく一定期間の増分です.たとえば、
sum関数:実際の作業ではCPUの多くはマルチコアであり、node_cpuは各コアのデータを個別に表示しますが、実際には各コアの個別の状況ではなく、全体のCPUの状況に関心を持っています.sum()関数を用いて合計すると1つの合計データが得られるが,sum()はすべての機器のデータを合計したものであるため,by(instance)またはby(cluster_name)を用いて単一のサーバまたは1組のサーバのCPUデータを取り出すことができる.上記の式は、次のように進化します.
count関数:この関数は、100台のサーバが監視しているなど、いくつかのあいまいな判断を行うために使用され、CPUの使用率が80%を超える機器がN台に達するとアラームを実行するために使用することができます.
topk関数:この関数は大量のデータからランキング前のNの数値を取り出すことができ、Nはカスタマイズすることができる.例えば100台のサーバーの320個のCPUを監視して、この関数で現在の負荷の高いいくつかを調べることができて、警報に用います
これは、特定のメトリック基準名とラベルの組合せに時間系列が存在しない場合にアラートを発行するのに役立ちます.
第2の例では、
デルタ()関数
次の式の例は、CPU温度の現在と2時間前の差を返します.
changes()関数
predict_linear関数:曲線変化速度を計算し、一定の予測作用を果たす.例えば、現在の1時間のディスク使用率が急激に低下し、ディスクがすぐに満杯になる可能性があります.この場合、この関数を使用して、現在の1時間のデータで今後数時間の状態を予測し、早期警告を実現できます.
例えばCPU使用率を統計する:node_exporterは、CPUがよく使う8つの状態の累積稼働時間をキャプチャし、そして、(すべての非アイドル状態のCPU時間の総和)/(すべての状態のCPU時間の総和)=CPU使用率を使用します.また、CPUの平均時間を取得するにはCounterデータ型を使用する必要があります.Counterのデータは常に増分されているので、増分値の一部を切り取ってから、この値を数式に当てはめて計算します.
Prometheusは異なるデータ型に非常に多くの計算関数を提供しています.counterデータ型に遭遇し、任意の操作をする前にrate()またはincrease()関数をセットする小さなテクニックがあります.一般的な関数の説明を以下に示します.
rate()関数:counterタイプのデータに特化した非常に重要な関数であり、counterのこの期間の平均毎秒増分を取得します.例えばモニタリングネットワークがバイト数を受け取る場合、9:10から9:20までの間に累計量が1000 bytes増加し、rate([1 m])関数を加えると1000を60秒で割って約16 bytesと算出される.
1
rate( node_network_receive_bytes[1m] ) #
1
increase関数:rate()関数と同様にCounterと組み合わせて使用します.違いは、平均値ではなく一定期間の増分です.たとえば、
1
increase(node_cpu[1m])
# CPU 1
sum関数:実際の作業ではCPUの多くはマルチコアであり、node_cpuは各コアのデータを個別に表示しますが、実際には各コアの個別の状況ではなく、全体のCPUの状況に関心を持っています.sum()関数を用いて合計すると1つの合計データが得られるが,sum()はすべての機器のデータを合計したものであるため,by(instance)またはby(cluster_name)を用いて単一のサーバまたは1組のサーバのCPUデータを取り出すことができる.上記の式は、次のように進化します.
1
sum
( increase(node_cpu[1m]) )
count関数:この関数は、100台のサーバが監視しているなど、いくつかのあいまいな判断を行うために使用され、CPUの使用率が80%を超える機器がN台に達するとアラームを実行するために使用することができます.
1
count(count_netstat_wait_connections >
200
)
topk関数:この関数は大量のデータからランキング前のNの数値を取り出すことができ、Nはカスタマイズすることができる.例えば100台のサーバーの320個のCPUを監視して、この関数で現在の負荷の高いいくつかを調べることができて、警報に用います
1
topk(
3
,count_netstat_wait_connections) #Gauge
2
topk(
3
,,rate(node_network_receive_bytes[20m])) #Counter
absent()
absent(v instant-vector)
渡されたベクトルが任意の要素を有する場合、空のベクトルが返される.渡されたベクトルに要素がない場合は、値が1の1要素ベクトルが返されます.これは、特定のメトリック基準名とラベルの組合せに時間系列が存在しない場合にアラートを発行するのに役立ちます.
absent(nonexistent{job="myjob"})
# => {job="myjob"}
absent(nonexistent{job="myjob",instance=~".*"})
# => {job="myjob"}
absent(sum(nonexistent{job="myjob"}))
# => {}
第2の例では、
absent()
は、入力ベクトルから1要素出力ベクトルのラベルを導出しようと試みる.デルタ()関数
delta(v range-vector)
は、範囲ベクトルv
の各時系列要素の最初の値と最後の値との差を計算し、所与の増分および等価ラベルを有するインスタントベクトルを返す.delta
は、範囲ベクトルセレクタで指定された全時間範囲をカバーするように外挿されるので、サンプル値が整数であっても非整数結果が得られる.次の式の例は、CPU温度の現在と2時間前の差を返します.
delta(cpu_temp_celsius{host="zeus"}[2h])
delta
は計器にのみ使用されるべきである.changes()関数
changes(v range-vector)
は、1つの区間ベクトルを入力し、この区間ベクトル内の各サンプルデータ値の変化回数(瞬時ベクトル)を返す.# , 1changes(node_load5{instance="192.168.1.75:9100"}[1m]) # 1
predict_linear関数:曲線変化速度を計算し、一定の予測作用を果たす.例えば、現在の1時間のディスク使用率が急激に低下し、ディスクがすぐに満杯になる可能性があります.この場合、この関数を使用して、現在の1時間のデータで今後数時間の状態を予測し、早期警告を実現できます.
1
predict_linear( node_filesystem_free_bytes{mountpoint=
"/"
}[1h],
4
*
3600
) 0
#
4
プロセスを した 、CPU の を います.
1、まずキーを し して、 えばCPUの を べるため、node_を うべきですcpuというkey
2、node_cpuというkeyに づいてidleのCPU とすべてのCPU をフィルタリングし、{}を してフィルタリングします. のようにします.1
node_cpu{ mode=
'idle'
}
# CPU
2
node_cpu
# ALL
3、increase() を って1 のデータを り します.このとき り したのはCPUごとのデータです1
increase(node_cpu{mode=
'idle'
}[1m])
4、sum() を して CPUのデータを し、 のデータを る1
sum
( increase(node_cpu{mode=
'idle'
}[1m]) )
5、sum() はCPUごとのデータを したが、サーバごとに を い、すべてのサーバのCPUデータが じになったため、 を1 う がある.ここでまた しい by(instance)を き した.sumを した を した で し、instanceはマシン を します.by(instance)を かない は、どのインスタンスが かを{}に するデータが です.1
sum
( increase(node_cpu{mode=
'idle'
}[1m]) ) by (instance)
# CPU
6、 にCPU を する1
1-(
sum
( increase(node_cpu{mode=
'idle'
}[1m]) ) by (instance) /
sum
(increase(node_cpu[1m])) by (instance) ) *100
な を3つ します.
ソース を しますか?1
#CPU
2
100 - (avg(irate(node_cpu_seconds_total{mode=
"idle"
}[5m])) by (instance) * 100)
3
#
4
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
5
#
6
100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
7
#
8
100 - (node_filesystem_free_bytes{mountpoint=
"/"
,fstype=~
"ext4|xfs"
} / node_filesystem_size_bytes{mountpoint=
"/"
,fstype=~
"ext4|xfs"
} * 100)