troccoとNew Relicを利用してtroccoのSLI/SLOを計測する
trocco SREの髙塚(@tk3fftk)です🙏
この記事は trocco Advent Calendar 2023 の18日目の記事となります。
TL;DR
troccoのSLI/SLOを定義し、SLOドキュメントとエラーバジェットポリシーを作成しました。
具体的な指標や定義などは少なくとも現時点では公開できませんが、ユーザーの皆さまにとっても、我々開発者にとってもプラスの方向に向かえるように活用し運用・改善していきたいと考えています。
また、SLI/SLOダッシュボードを2種類作成しました。
1つめは、SLIの実装としてtroccoのデータをtroccoを利用して転送し、以下のようなダッシュボードをLooker Studio上に作成しました。
※実際のデータとは異なります
2つめは、troccoは利用していませんが、New Relicに転送しているメトリクスを利用してダッシュボードを作成しました。
「そこはtroccoでNew RelicからBQにデータ送ってLooker Studioに統一するところでは」という声が聞こえてきそうですが、実装優先でデータが存在するNew Relic上でService Level機能を利用して作成しています。
※実際のデータとは異なります
アーキテクチャ
ざっくりですが、このようなデータの流れとなっています。
転送時間やストレージコストの削減のため、必要なデータのみ転送しています。
また、BigQuery側で日付として扱えないようなレンジ外のデータ[1]が歴史的な経緯なのか含まれてしまっているケースがあったため、フィルタを入れていたりします。
SLIの選定
SLIの選定にあたって、ユーザーに近いCSチームの方々やtrocco開発歴の長いエンジニアを招いてのブレインストーミングを行いました。
細かい部分は隠しているので雰囲気だけでも…
上述のブレインストーミング+Slack等で非同期に行われた議論をベースにしつつ、[GoogleのSRE本](https://sre.google/books/やThe Art of SLOs、SLO サービスレベル目標を参考にSLIを選定しました。
SLIの実装(ダッシュボード作成)
Looker Studio
BigQuery上のデータを使ってポチポチすればできる…と思いきやdimensionの粒度が分だと細かすぎるし時だと荒すぎるとか、パーセンタイルの確率とか出せないのでどうしよう、と社内のデータエンジニアに聞いたりコミュニティに聞いたりしていましたが、結果としてLooker Studioで力技するよりBigQueryのクエリ書けばええやんけ、となりました。Looker Studioの機能で表現できないものはBigQueryでやるべし、ということを学びました💪
こうして記事に改めて書いてみると、粒度としては荒い感じもしますが、以下のようなことを目指しています。[2]
- BQで1時間ごとのパーセンタイル値を算出(WITH)してパーセンタイル値を目標値と比較。比較した結果目標値を満たしている時間の割合を1日ごとに算出(SELECT)
- Looker Studio上で期間内の上記割合の平均値を表示する設定
WITH
percentile AS (
SELECT
TIMESTAMP_TRUNC(foo, HOUR) AS hourly,
APPROX_QUANTILES(DATETIME_DIFF(bar, foo, SECOND), 100)[
OFFSET
(@percentile)] AS value
FROM
`superdata`
WHERE
TIMESTAMP_TRUNC(foo, DAY) BETWEEN TIMESTAMP(PARSE_DATE("%Y%m%d", @DS_START_DATE))
AND TIMESTAMP(PARSE_DATE("%Y%m%d", @DS_END_DATE))
GROUP BY
hourly
ORDER BY
hourly
)
SELECT
TIMESTAMP_TRUNC(hourly, DAY) AS daily,
COUNTIF(percentile.value <= @objective) / COUNT(percentile.value) AS SLO_compliance
FROM
percentile
GROUP BY
daily
ORDER BY
daily
上記のクエリをカスタムクエリを実行するデータソースとして共通化し、パラメーターとしてパーセンタイルと目標値を渡しています。
また、関係者の目に触れる機会を増やすべく、Looker Studio上のダッシュボードについてはLooker Studioの配信機能を使ってメール配信を行っています。
New Relic
※実際のデータとは異なります
New RelicのService Level機能を利用すると、ガイドに従ってNRQLを書くだけでいい感じのSLOページが作成できます。ややこしいエラーバジェットの計算クエリも自動で作成してくれました。
Service Level機能単体だと一覧性が悪いので、必要な部分だけ別途ダッシュボード化しています。
New Relicのダッシュボードについてはネイティブで定期配信の機能が無いため、以下のようなSlack投稿が行われるようにしています。[3]
※実際のデータとは異なります
まとめと今後の展望
troccoのSLI/SLOを定義し、SLOドキュメントを作成しました。
SLOは作って終わりではなく、継続的な運用・改善とエラーバジェットポリシーの遵守を行っていくこと。また、SLOの達成自体が目的になってしまわないことにも注意しつつ、ここからが本番だと思っています。
また、New Relicで表示しているものについて「そこはtroccoでNew RelicからBQにデータ送ってLooker Studioに統一しろよ」という心の声があちこちから聞こえてくるので、今後取り組んでいきたいと思っています。[4]
We are hiring 🐈
troccoを開発するprimeNumberでは、一緒に信頼性向上を実現してくれるSREを絶賛募集中です!
まずはカジュアル面談でお会いしましょう🙏
-
BQ, Looker Studioともに初心者なのでクエリ違ってね?とかこうすればいいよ、みたいなコメントお待ちしています。 ↩︎
-
実装はNewRelicのダッシュボードのスナップショットを定期的にSlackへ送信する仕組みをAWSで作ってみた | DevelopersIOを参考にしました。 ↩︎
-
転送元New Relicがあれば… ↩︎
Discussion