Как сдвинуть метрики с помощью Python и Prometheus Pushgateway

Я хочу вставить метрику с несколькими метками в Прометей, используя Пушгейтвей. Документация предлагает пример завитка, но мне нужно, чтобы он был отправлен через Python. Кроме того, я хотел бы добавить несколько меток в метрику.

6 ответов

Решение

Вот что я в итоге сделал - потребовалось время, чтобы получить права. Хотя в идеале я бы использовал Python-клиент Prometheus, разработанный специально для этой цели, похоже, что в некоторых случаях он не поддерживает несколько меток, а документация практически отсутствует - поэтому я выбрал решение, созданное в домашних условиях.

Приведенный ниже код использует gevent и поддерживает несколько (разделенных запятыми) URL-адресов pushgateway (например, "pushgateway1.my.com:9092, pushgateway2.my.com:9092").

import gevent
import requests

def _submit_wrapper(urls, job_name, metric_name, metric_value, dimensions):
    dim = ''
    headers = {'X-Requested-With': 'Python requests', 'Content-type': 'text/xml'}
    for key, value in dimensions.iteritems():
        dim += '/%s/%s' % (key, value)
    for url in urls:
        requests.post('http://%s/metrics/job/%s%s' % (url, job_name, dim),
                      data='%s %s\n' % (metric_name, metric_value), headers=headers)


def submit_metrics(job_name, metric_name, metric_value, dimensions={}):
    from ..app import config
    cfg = config.init()
    urls = cfg['PUSHGATEWAY_URLS'].split(',')
    gevent.spawn(_submit_wrapper, urls, job_name, metric_name, metric_value, dimensions)

Первый: установить клиент:

pip install prometheus_client

Два: вставьте в интерпретатор Python следующее:

from prometheus_client import CollectorRegistry, Gauge, push_to_gateway

registry = CollectorRegistry()
g = Gauge('job_last_success_unixtime', 'Last time a batch job successfully finished', registry=registry)
g.set_to_current_time()
push_to_gateway('localhost:9091', job='batchA', registry=registry)

Если вы не можете использовать prometheus_client, вот короткая версия requests:

      import requests

headers = {'X-Requested-With': 'Python requests', 'Content-type': 'text/xml'}
url = "https://pushgateway.example.com/metrics/job/job_name/instance/instance_name"
data = "websites_offline{website=\"example.com\"} 0\n"
r = requests.post(url, headers=headers, data=data)
print(r.reason)
print(r.status_code)

Дополнительные элементы могут быть добавлены после \n(новая строка) в переменной данных.

Это задокументировано для клиента Python: https://github.com/prometheus/client_python

В одной команде и без всяких скриптов:

      echo "some_metric 3.14" | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job

Вы можете использоватьGaugeMetricFamilyсорт. вы можете предпринять следующие шаги:

  1. Установитьprometheus_client:
      pip install prometheus_client
  1. Используйте следующий код Python, чтобы раскрыть ваши метрики:
      from prometheus_client import CollectorRegistry, push_to_gateway
from prometheus_client.core import GaugeMetricFamily

class CustomCollector(object):
    # make sure you define collect method
    def collect():
        # float metric you want to push
        metric = "<some_float_value>"

        # create gauge metric, define label names
        metric_gauge = GaugeMetricFamily("metric_name", "metric_description", labels=["label1", "label2"])
        # add metric value and label values
        metric_gauge.add_metric(["label1_value", "label2_value"], metric)

        yield metric_gauge



registry = CollectorRegistry()
registry.register(CustomCollector())

# Push metrics to pushgateway (modify the url accordingly)
push_to_gateway('localhost:9091', job='job_name', registry=registry)

Другие вопросы по тегам