まず最初に、PromQL とは何かを理解しましょう。
- PromQL は、Prometheus が提供する組み込みのデータ クエリ言語 PromQL であり、Prometheus Query Language と呼ばれます。
- PromQL は、インジケーター (Metric) のクエリ/集計/フィルタリングの処理、および Metric の構文形式です
<metric name>{<label name>=<label value>, ...}
。 - ユーザーがリアルタイムのデータクエリ、集計操作、可視化、アラーム処理などを実行できるようにサポートします。
PromQL には 4 つのデータ型があります。
-
インスタント ベクトル (インスタント ベクトル): 一連の時系列。各時系列にはサンプル値が 1 つだけ含まれます。
-
範囲ベクトル: 一連の時系列。各時系列には一定期間にわたる複数のサンプル値が含まれます。
-
スカラー: 単純な浮動小数点数値
-
文字列 (String): 単純な文字列値
(1) 瞬時ベクトルセレクタ
瞬時ベクトル セレクターは、時系列の特定のサンプリング ポイントでのサンプリング値のセットを選択するために使用されます。最も単純なケースは、メトリックを指定し、そのメトリックに属する時系列の現在のサンプリング値をすべて選択することです。たとえば、次の式: go_info
時系列は、中括弧で囲まれたタグのキーと値のペアのセットを追加することでフィルターできます。ジョブが mysql であるサンプリングされた値をフィルターで除外します。
タグ値と一致するか、またはタグ値を照合するときに正規表現を使用できます。合計で次の一致演算子があります。
-
=: 完全に等しい
-
!=: 等しくない
-
=~: 正規表現の一致
-
!~: 正規表現の不一致
=~
以下では、mysql と prometheus のサンプリング値としてジョブを選択するために使用します。
go_info{
job=~"mysql|prometheus"}
(2) 区間ベクトルセレクター
間隔ベクトル セレクターは、過去の一定期間からサンプリングされた値を選択することを除いて、瞬間ベクトル セレクターに似ています。区間ベクトル セレクターは、[] で囲まれた期間を瞬時ベクトル セレクターの末尾に追加することで取得できます。たとえば、次の式は、過去 1 分間のメトリックが apiserver_request_total でリソースが pod であるすべての時系列のサンプリング値を選択します。
これはグラフをサポートしていないため、収集されたデータを表示するにはコンソールを選択する必要があります。
go_info{
job=~"mysql|prometheus"}[1m]
時間範囲は、複数の時間単位をサポートする時間範囲セレクター [ ] によって定義されます。
s - 秒
m - 分钟
h - 小时
d - 天
w - 周
y - 年
(3) オフセットベクトルセレクター
上記で紹介したセレクターはすべて、デフォルトで現在時刻を基準時間とし、オフセット修飾子を使用して基準時間を調整し、一定期間前方にシフトします。offset 修飾子はセレクターの後に続き、offset を使用してオフセットする量を指定します。たとえば、次の式は、メトリクス名 go_info 5 分前のすべての時系列のサンプリング値を選択します。
go_info offset 5m
(4) 集計演算子
数学演算子
- +(加算)、-(減算)、*(乗算)、/(除算)、%(剰余)、^(べき乗)
ブール演算子
- == (等しい)、!= (等しくない)、> (より大きい)、< (より小さい)、>= (以上)、<= (以下)
一時的なベクトルをスコープする PromQL の組み込み集計演算子。瞬間式によって返されたサンプル データを集計して、新しい時系列を形成できます。
sum (求和) min (最小值)
max (最大值) avg (平均值)
stddev (标准差) stdvar (标准方差)
count (计数) count_values (对value进行计数)
bottomk (后n条时序) topk (前n条时序)
quantile (分位数)
現在のマシンの利用可能なメモリの統計。
利用可能なメモリは、空き + バッファ + キャッシュに等しい
- node_exporter によって報告されるパラメーターのうち、インジケーターは次のとおりです。
- node_memory_Buffers_bytes
- node_memory_Cached_bytes
- node_memory_MemFree_bytes
利用可能なメモリ式node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes
サーバーのCPU使用率を計算します(1分)
インジケーターnode_cpu_seconds_total は、CPU の各モードで費やされた時間をカウントするために使用されます。条件がなければ、ユーザー モードの使用時間、アイドル時間、割り込み時間、カーネル モードの使用時間などの CPU 使用時間の合計です。の上。
#过滤出CPU空闲的时间
node_cpu_seconds_total{
mode="idle"}
#统计idle状态时长
sum(increase(node_cpu_seconds_total{
mode="idle"}[1m])) by (instance)
#统计总时长
#sum函数是将所有CPU核数时间相加,没有按照主机进行聚合,就需要引入 by (instance) 函数
#by (instance) 它会把sum求和到一起的数值按照指定方式进行拆分,instance代表的是机器名
#如果不写by (instance)的话就需要在{ }中写明需要哪个实例的数据
sum(increase(node_cpu_seconds_total[1m])) by (instance)
#计算出idle时长和总时长,CPU使用率的表达式
(1 - sum(increase(node_cpu_seconds_total{
mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100
(5) 内蔵機能
Prometheus には計算を支援する組み込み関数がいくつかあります。代表的な関数のいくつかを以下に紹介します。
abs():绝对值
sqrt():平方根
exp():指数计算
ln():自然对数
ceil():向上取整
floor():向下取整
round():四舍五入取整
delta():计算区间向量里每一个时序第一个和最后一个的差值
sort():排序
rate(): 计算整个时间范围内区间向量中时间序列的每秒平均增长率
irate(): 仅使用时间范围中的最后两个数据点来计算区间向量中时间序列的每秒平均增长率, irate 只能用于绘制快速变化的序列,在长期趋势分析或者告警中更推荐使用 rate 函数
increase(): 计算所选时间范围内时间序列的增量,它基本上是速率乘以时间范围选择器中的秒数
prometheus_http_requests_total を表示します。平均データは切り捨てられます: Floor(avg(prometheus_http_requests_total{code="200"}))
5 分以内の prometheus_http_requests_total、1 秒あたりの平均データを表示します: rate(prometheus_http_requests_total{code="200"}[5m])
(6) 一般的に使用される PromQL ステートメント
ノードのメモリ使用量
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100
ノードノードの CPU 使用率:
100-avg(irate(node_cpu_seconds_total{
mode="idle"}[5m])) by(instance)*100
ノードノードの開始ステータス、up == 1 が開始、0 が停止
ノードのIOパフォーマンス:
100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100)
ノード ノード ネットワーク カードのアウトバウンド トラフィック
((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) * 100)
ノード ノード TCP セッションが確立された状態です
node_netstat_Tcp_CurrEstab
ノードのディスク使用量
100-(node_filesystem_free_bytes{
fstype=~"ext4|xfs"}/node_filesystem_size_bytes {
fstype=~"ext4|xfs"}*100)
さて、ここでは Promethus クエリ PromQL について詳しく説明します。注意してください。