PromQL でラベル違いのメトリクス同士を演算して no data
例えば以下のようなメトリクスがあったとします。みての通り、名前は一緒でラベルだけが異なるメトリクスです。
- mqtt_topic{instance="127.0.0.1:9981",job="mqtt",topic="/home/sensor/temp"}
- mqtt_topic{instance="127.0.0.1:9981",job="mqtt",topic="/home/sensor/humidity"}
これらを演算しようとして以下のようにしても no data になります。
mqtt_topic{topic="/home/sensor/temp"} * mqtt_topic{topic="/home/sensor/humidity"} Vector Matching に書いてある通りですが、デフォルトではこのようなベクター同士の演算の場合、左右でラベルが全て一致するメトリクス同士のみが結果に出力されます。
SQL の INNER JOIN でラベル全ての一致が ON 条件に入ってるのをイメージするとわかりやすそうです。
この条件を変更するには、ignoring() または on() を使います。今回のケースでは以下の2つの結果は同じです。
mqtt_topic{topic="/home/sensor/temp"} * ignoring(topic) mqtt_topic{topic="/home/sensor/humidity"}
mqtt_topic{topic="/home/sensor/temp"} * on(instance,job) mqtt_topic{topic="/home/sensor/humidity"} ignoring() は JOIN の条件から指定したラベルを除くように働き、on() は JOIN の条件を明示的にすべて指定するように働きます。
リテラル演算との組合せ
数値リテラル(スカラ)とベクターを演算すると、結果はベクターになります。スカラ値との演算時には上記のように ignoring() や on() は指定できません (syntax error になります)。複雑な計算をする場合、適切な場所に on() または ignoring() を書く必要があります。つまりベクター同士の演算になる場所に書きます。
例えば、topic="/home/sensor/temp" を温度、topic="/home/sensor/humidity" を湿度として不快指数を計算したいと思う場合、以下のようになります。
(0.81 * mqtt_topic{topic="/home/sensor/temp"})
+ ignoring(topic) (0.01 * mqtt_topic{topic="/home/sensor/humidity"})
* ignoring(topic) (0.99 * mqtt_topic{topic="/home/sensor/temp"} - 14.3)
+ 46.3 関連エントリー
- MQTT のトピックを prometheus に登録する MQTT のトピックを subscribe して一時的に保持し、prometheus 向けに exporter として働くデーモンを書いた。...
- RabbitMQ で MQTT over WebSocket ウェブページから JavaScript で MQTT ブローカーに送られてくるデータを取得したかったので、MQTT over WebSock...
- センサーデータ用に RabbitMQ + MQTT をセットアップする RabbitMQ + MQTT で Pub/Sub サーバを立てることにしました。 いろいろなセンサーのグラフ化にあたって GrowthFo...
- 気圧・温度・湿度 I2C センサー BME280 まず BME280 と BMP280 というよく似たやつがあるので注意…。 BMP は気圧と気温しか測れない。 初期設定 リセット直後の B...
- mackerel-agent + snmpで RTX1200 のメトリクス取得 検索すると Lua スクリプトを RTX にいれる方法もあるみたいだが、別途プロキシが必要みたいなので LAN 内の raspberrypi...