概要
Pushgateway にプログラムからメトリクスをpushする方法を紹介します。
push可能なメトリクスのフォーマットはText
とProtocol buffer
の2種類あります。
本記事ではText
フォーマットでpushする方法を紹介します。
Protocol buffer
フォーマットでのpushについては以下記事をご参照ください。
Prometheus Pushgateway に プログラムからメトリクスをpushする [Protocol buffer編]
各言語向けライブラリ
「Prometheus」のクライアントライブラリに「Pushgateway」へのメトリクスpushメソッドがしれっと実装されていますので若干盲点ですが、各言語向けのライブラリがあります。
以下ドキュメントで紹介されています。
サンプルコードも記載されているので取り入れやすいです。
通常は上記のライブラリを使うのが良いと思います。
以下は車輪の再発明をしたい方向けの情報です。
メトリクスをPOSTする処理を実装するだけなのでわざわざライブラリ使わなくても、、という方には参考になるかも知れません。
Prometheus Client Data の仕様
以下ドキュメントにPrometheus Client Dataのフォーマットが記載されています。
POSTリクエスト送信処理を実装するには、リクエストボディの最後に改行(空行)を付与することに気をつけると良いです。
この仕様についてはThe last line must end with a line-feed character.
と記述されています。
最後に改行がないとレスポンスコード400 Bad Request
が返り、レスポンスメッセージは text format parsing error in line 1: invalid metric name\n
となっていました。
curl によるPOST手順の確認
README.mdに以下のように記載されています。
このcurlコマンドで送信されるPOSTリクエストと同じPOSTリクエストをプログラムで生成することを考えると良さそうです。
cat <<EOF | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job/instance/some_instance
# TYPE some_metric counter
some_metric{label="val1"} 42
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF
以下、サンプルコードです。
Pythonによるメトリクスpush処理の実装例
import requests
import textwrap
def push():
some_metric = 42
another_metric = 2398.283
data = textwrap.dedent('''
# TYPE some_metric counter
some_metric{label="val1"} {some_metric}
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric {another_metric}
'''.format(some_metric=some_metric, another_metric=another_metric )) # 最終行に改行を入れないと400が返るので注意
res = post(data)
def post(data):
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
res = requests.post(
"http://pushgateway.example.org:9091/metrics/job/some_job/instance/some_instance", headers=headers, data=data)
if res.status_code != 200:
raise Exception("failed : {}".format(res.status_code))
return res
なお、curlコマンドによるPOSTリクエストヘッダは、Content-Type
が application/x-www-form-urlencoded
でしたので、このプログラムでも合わせていますが、この指定は特になくても良いようです。