qiita.comの 12/8 (金) です。
Mackerel では從來のメトリックに加へ、メトリックにラベルを附与できる形式である「ラベル付きメトリック」を開發中です。OpenTelemetry 規格のメトリックそのものを Mackerel に投稿し閲覽できます。
只今ベータ版テストを受け附け中ですので、是非とも御應募ください。
さて。Mackerel に投稿したラベル付きメトリックはグラフを作って閲覽したり、(將來的には) アラートを發報できます。この時にラベル付きメトリックを讀んだり計算するには PromQL と云ふ query 言語を介して行ひます。PromQL を書いて柔軟にメトリックを檢索したり計算したりできるのです。
そもそも PromQL とは Prometheus と云ふ監視 application が備へた query 言語です。Prometheus はラベルの付いたメトリックを保存し、閲覽したりアラートを發報できます。Prometheus のメトリックの形式は OpenTelemetry のメトリックの形式とは一致しませんが、メトリック名やラベル名を變換する事で保存できます。保存したラベルの付いたメトリックを Prometheus は PromQL を介して讀んだり計算できるのです。この世に知られた、ラベルの付いたメトリックを柔軟に處理する實績の有る PromQL を Mackerel でも query 言語として採用しました。
PromQL がどの樣なものか Prometheus の document を御覽いただけます。
この 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 : ラベル檢索條件期閒メトリックキー
- diamond : メトリックキー期閒粒度値の列
と表せます。ラベル DB はラベル檢索條件と期閒を引數としてメトリックキーを返す函數と見做せ、diamond はメトリックキーと時刻と粒度を引數として値の列を返す函數と見做せます。reader は PromQL からラベル檢索條件と期閒と粒度とを抽出して DB を讀まねばなりません。reader 內の on memory での計算は自由な data 構造を用ゐて最適化し易いのですが、DB への query は所詮 DB の實現できる data 構造に制約されます。ですのでラベル檢索條件・期閒・粒度に關はる PromQL の仕樣を精査しました。
調査 resource は、
- Prometheus の document
- 書籍
- Prometheus の source code
- Go の
github.com/prometheus/prometheus/promql
package
- Go の
です。結果として以下の仕樣を抽出しました。それぞれの說明は Prometheus の document を御覽ください。
- data 型
- ラベル檢索條件 (matcher)
- 時刻・粒度が指定される要因
これらを特に念頭に置いて、以下の設計で處理可能である事を議論しながら腦內 simulate しました。
格好惡いので用語は少し變へますが…、
- parser
- Go の
github.com/prometheus/prometheus/promql/parser
を fork したもの。OpenTelemetry のメトリックを變換せずに扱へる樣に擴張しました - AST (abstract syntax tree。抽象構文木) を生成します
- Go の
- 問ひ合はせ計畫を立てる
- 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 枠もございます。
明日は id:taxintt さんです。