Slide 1

Slide 1 text

次世代Mackerelの アーキテクチャ id:onk 2023-07-11 Mackerel Meetup #14 Tokyo 1

Slide 2

Slide 2 text

自己紹介 ● 大仲 能史 a.k.a. id:onk ● 株式会社はてな ○ Mackerel開発チーム ○ エンジニアリングマネージャー ○ 今日は京都から来ました 2

Slide 3

Slide 3 text

3 今日の話

Slide 4

Slide 4 text

4 次世代Mackerelの アーキテクチャ

Slide 5

Slide 5 text

5 次世代 #とは

Slide 6

Slide 6 text

6 今のメトリック投稿

Slide 7

Slide 7 text

メトリック投稿 7 https://mackerel.io/ja/docs/entry/advanced/custom-metrics

Slide 8

Slide 8 text

メトリック投稿 ● GraphiteのCarbon Plaintextに似ている ○ \t\t ● データをかき集める ○ pluginを実装する ● 投稿する ○ pluginがHTTPでCarbon形式で投げる 8

Slide 9

Slide 9 text

メトリック投稿 9 ● 我々もpluginを作っているし、競合他社も pluginを作っている ○ https://github.com/mackerelio/mackerel-agent- plugins ● 例えばホストメトリックではそれぞれ /proc/meminfoをパースしている

Slide 10

Slide 10 text

メトリック投稿 ● 集めるところは共通化されていない ● 投げるところも共通化されていない 10

Slide 11

Slide 11 text

11 メトリックのメタデータ

Slide 12

Slide 12 text

メトリックのメタデータ ● ホスト単位のメトリックは扱いづらい ○ ホストはデプロイのたびに切り替わるようになった ● 理想のダッシュボードには式グラフが必須 ○ role()はともかく、host()はメンテが非常に難しい 12

Slide 13

Slide 13 text

メトリックのメタデータ ● ホスト以外の絞り込みもしたい ● 例えばアクセスログ 13

Slide 14

Slide 14 text

メトリックのメタデータ ● 特定のステータスコードのリクエスト数 ○ これは今でも取れている ● AZごと&ステータスコードごと ○ ホストのメタデータに含まれているのでやればできる ● PATHごと&ステータスコードごと ○ これは今のMackerelではまず無理な例 ○ メトリック名に詰め込んで頑張ればできる……? 14

Slide 15

Slide 15 text

15 メトリックのメタデータ

Slide 16

Slide 16 text

メトリックのメタデータ ● 投げるときにメタデータ付きで投げておいて 16 access_num;status=200;path=/api 53 1689025057 access_num;status=200;path=/ 70 1689025057 access_num;status=503;path=/api 20 1689025057 access_num;status=401;path=/api 1 1689025057

Slide 17

Slide 17 text

メトリックのメタデータ ● 引くときに自由に絞り込みたい ● Observabilityの文脈 ○ アプリケーションの状態を、出力から推定したい 17 seriesByTag('name=access_num', 'status=200')

Slide 18

Slide 18 text

余談:Observability(可観測性) ● システムの現在の状態を出力 から推定できる特性 ○ 初見の状態に対しても調査可能 ■ 現代の複雑なシステムは、毎回原因が 違う不具合が発生する ○ デプロイすることなく対応できる 18

Slide 19

Slide 19 text

19 OpenTelemetry

Slide 20

Slide 20 text

OpenTelemetry ● ざっくり言うと「テレメトリーの取り方を標 準化してみんなで使えるものを作ろうぜ」 ● CNCF Incubating Project ○ コンテナ技術の推進と、その進化を取り巻くテクノロ ジー業界の足並みを揃えるために2015年に創設され た財団である。 20 https://ja.wikipedia.org/wiki/Cloud_Native_Computing_Foundation

Slide 21

Slide 21 text

OpenTelemetry ● otel-collectorに投げておくと、任意の exporterに出力できる ● fluentdのような仕組み(ざっくり) 21 https://opentelemetry.io/docs/collector/

Slide 22

Slide 22 text

OpenTelemetry ● アプリケーションがログやメトリックを出す ならOTelが標準になるだろう ○ アプリはどのベンダーの形式で出すか考えなくて良い ○ ベンダーはプラグインを作る必要がなくなる ● メトリックのメタデータも対応している 22

Slide 23

Slide 23 text

23 対応中です

Slide 24

Slide 24 text

OpenTelemetry対応(writer) ● エンドポイントはOTLPで受け付ける ● メタデータ付きのメトリックを取る ○ 次元数が変わる ● 実装 ○ メタデータも含めてhash化してTSDBのkeyにする 24

Slide 25

Slide 25 text

OpenTelemetry対応(reader) ● ラベルで引く ○ access_num{status=200} ■ access_num;status=200;path=/ ■ access_num;status=200;path=/api ● ラベル→メトリックの転置インデックス 25

Slide 26

Slide 26 text

OpenTelemetry対応(reader) ● ラベル付きメトリックを自在に引くための PromQL Engineを実装した ○ 算術演算、集合演算、集計演算、比較演算、関数、... 26

Slide 27

Slide 27 text

OpenTelemetry対応(graph) 27 ● 補完機能付きクエリエディタ ● 凡例表示の工夫 ● 開発中の画面 ○ https://mackerel.io/ja/blog/entry/meetup14-1

Slide 28

Slide 28 text

28 まとめ

Slide 29

Slide 29 text

まとめ ● 現代ではメトリックのメタデータが必要 ● OpenTelemetryでプラグイン競争が終わる ● メタデータ対応を実装した ○ 転置インデックスと新たなEngineが必要になるのが大 きな違い 29

Slide 30

Slide 30 text

まとめ ● 今後のMackerelはマルチディメンジョン ○ 任意の次元で引ける新しいダッシュボードが主役 ● OpenTelemetry=入力データは競合間で同じ ○ いかに見やすく、使いやすくするかの勝負 ○ チームで取り組むためのベストプラクティスを提供す るプロダクトとして、引き続き開発していきます 30