1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Prometheus Pushgateway に プログラムからメトリクスをpushする [Text format編]

Last updated at Posted at 2021-02-20

概要

Pushgateway にプログラムからメトリクスをpushする方法を紹介します。

push可能なメトリクスのフォーマットはTextProtocol 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-Typeapplication/x-www-form-urlencoded でしたので、このプログラムでも合わせていますが、この指定は特になくても良いようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?