2020年10月16日金曜日

Ruby から Prometheus のメトリックを取得してみる

概要

過去に自分のアプリにエクスポータを追加する方法を紹介しました
今回はエクスポータから取得して Prometheus に溜まったメトリックデータを Ruby から取得してみたいと思います
使用するライブラリは prometheus/prometheus_api_client_ruby になります

環境

  • macOS 10.15.7
  • Ruby 2.7.1p83
    • prometheus-api-client 0.6.2

インストール

  • bundle init
  • vim Gemfile
gem "prometheus-api-client"
  • bundle install

サンプルコード: メトリックの取得とデータ変換

例えば redis-exporter から取得して Prometheus に溜まっているデータを取得するには以下のようなコードになります

  • vim app.rb
require 'prometheus/api_client'

prometheus = Prometheus::ApiClient.client(url: 'http://192.168.100.10:9090')

now = Time.now
a_hour_ago = now - 60 * 60

response = prometheus.get(
  'query_range',
  query: 'redis_memory_used_bytes{instance="localhost:9121",job="redis"}',
  start: a_hour_ago.strftime("%FT%T%:z"),
  end:   now.strftime("%FT%T%:z"),
  step:  '120s',
)

puts response.status
puts response.body

result = JSON.parse(response.body)
t = result["data"]["result"].first["values"].first[0]
v = result["data"]["result"].first["values"].first[1]

puts Time.at(t)
puts v.to_i / (1024.0 * 1024.0)

クエリに関しては Prometheus の UI で確認できるクエリをそのまま入力すれば OK です

データは基本的に時間のレンジで指定するのがいいので start と end を指定しましょう
時刻はフォーマットが決まっているので指定のフォーマットに併せて変換しています (例: 2020-10-16 09:58:44 +0900)

取得できるデータは JSON になっています
時刻データと実際の値が配列になっているのでそれぞれ取得しています
あとは必要なデータ形式に変換すれば OK です
サンプルでは見やすいように時刻を変換しているのとバイトデータとメガバイト単位に変換しています

最後に

prometheus/prometheus_api_client_ruby を使って Prometheus に溜まったデータを取得してみました
これを元に独自のアラートルールや UI が作成できるようになります

参考サイト

0 件のコメント:

コメントを投稿