c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Cosense で公表中です。

Programming は GitHub で開發中です。

Mackerel の PromQL 處理の內部 (2023/12 時點) #mackerelio

qiita.comの 12/8 (金) です。

Mackerel では從來のメトリックに加へ、メトリックにラベルを附与できる形式である「ラベル付きメトリック」を開發中です。OpenTelemetry 規格のメトリックそのものを Mackerel に投稿し閲覽できます。

mackerel.io

只今ベータ版テストを受け附け中ですので、是非とも御應募ください。

さて。Mackerel に投稿したラベル付きメトリックはグラフを作って閲覽したり、(將來的には) アラートを發報できます。この時にラベル付きメトリックを讀んだり計算するには PromQL と云ふ query 言語を介して行ひます。PromQL を書いて柔軟にメトリックを檢索したり計算したりできるのです。

そもそも PromQL とは Prometheus と云ふ監視 application が備へた query 言語です。Prometheus はラベルの付いたメトリックを保存し、閲覽したりアラートを發報できます。Prometheus のメトリックの形式は OpenTelemetry のメトリックの形式とは一致しませんが、メトリック名やラベル名を變換する事で保存できます。保存したラベルの付いたメトリックを Prometheus は PromQL を介して讀んだり計算できるのです。この世に知られた、ラベルの付いたメトリックを柔軟に處理する實績の有る PromQL を Mackerel でも query 言語として採用しました。

PromQL がどの樣なものか Prometheus の document を御覽いただけます。

prometheus.io

この PromQL を處理する system の現時點 (2023/12) での內部を少し御傳へしませう。(將來もこの設計である事を保證するものではございません。)この system を「reader」と呼びませう。下記の記事で「OTel metric Reader」として登場する system の事です。

rmatsuoka.hatenablog.com speakerdeck.com

reader は 2 つの DB からラベル付きメトリックを讀みます。ラベルを保存する「ラベル DB (PostgreSQL)」と、メトリックを保存する時系列 DB「diamond」です。(diamond についてはまかれるあなとみあ ―Mackerel のしくみを理解する 30 分― @ Hatena Engineer Seminar #16 - Speaker Deckメトリックはいかにして見え續ける樣になったか #devio2022 - Speaker Deckを御覽ください。)それぞれの DB からの讀み出しを形式的に書くと、

  • ラベル DB : ラベル檢索條件\times期閒\toメトリックキー
  • diamond : メトリックキー\times期閒\times粒度\to値の列

と表せます。ラベル DB はラベル檢索條件と期閒を引數としてメトリックキーを返す函數と見做せ、diamond はメトリックキーと時刻と粒度を引數として値の列を返す函數と見做せます。reader は PromQL からラベル檢索條件と期閒と粒度とを抽出して DB を讀まねばなりません。reader 內の on memory での計算は自由な data 構造を用ゐて最適化し易いのですが、DB への query は所詮 DB の實現できる data 構造に制約されます。ですのでラベル檢索條件・期閒・粒度に關はる PromQL の仕樣を精査しました。

調査 resource は、

です。結果として以下の仕樣を抽出しました。それぞれの說明は Prometheus の document を御覽ください。

  • data 型
  • ラベル檢索條件 (matcher)
    • 等號 matcher (equality matcher)
    • 不等號 matcher (negative equality matcher)
    • 正規表現 matcher (regular expression matcher) ※未實裝です
    • 正規表現否定 matcher (negative regular expression matcher) ※未實裝です
    • and ,
  • 時刻・粒度が指定される要因
    • API
      • instant query
      • 範圍 query (range query)
    • selector
      • 範圍 vector selector
      • subquery
    • 修飾子
      • offset 修飾子
      • @ 修飾子

これらを特に念頭に置いて、以下の設計で處理可能である事を議論しながら腦內 simulate しました。

gyazo.com

格好惡いので用語は少し變へますが…、

  • parser
    • Go の github.com/prometheus/prometheus/promql/parser を fork したもの。OpenTelemetry のメトリックを變換せずに扱へる樣に擴張しました
    • AST (abstract syntax tree。抽象構文木) を生成します
  • 問ひ合はせ計畫を立てる
    • AST を traverse して API の parameter も考慮し、ラベル DB に投げるラベル檢索條件と、diamond に投げる期閒・粒度を決めます
  • 實行機
    • 問ひ合はせ計畫から SQL を生成してラベル DB を檢索し、メトリックキーを蒐集します
    • メトリックキーと問ひ合はせ計畫から diamond を檢索し、メトリックを蒐集します
    • 蒐集したラベル付きメトリックを、on memory な cache であるメトリック pool に保存します
    • 計算機を呼び出します
  • 計算機
    • interpreter として AST を計算します
    • メトリック pool からラベル付きメトリックを讀みつつ、計算します

memory を活用して、處理を單純に、高速にする目論見です。

そして irate 等幾つかの函數を含めて本當に實裝でき (irate 函數を含めて多くを實裝したのは監視ツールのカウンタへの向き合い方 - Diary of a Perpetual Studentも書いた id:arthur-1 です)、その後 tuning されてゐるのが、今ベータ版テストで提供してゐる reader です。御試しください。

そして Meetup にゐらしてください。LT 枠もございます。

mackerelio.connpass.com

明日は id:taxintt さんです。