マイクロサービスやマクロサービスの運用と健全性に関する長期的な指標をどのように追跡していますか?サービスレベル指標(SLI)とサービスレベル目標(SLO)は、DevOpsチームとIT運用アナリストにとって非常に重要な(時には意欲的な)メトリクスです。このブログ記事では、SignalFlowを活用して複数のSLOのエラーバジェットをまとめて追跡する方法をご紹介します(Terraformを使って簡単に始めることもできます)。
SLOの目的は組織によってさまざまです。
Google社のSREハンドブックをお読みになったことがあれば、SLOとSLIについてはよくご存じだと思います。まだお読みでない方のために、その中の一節をご紹介します。
「SREの本来の責務は、単に「すべて」を自動化してアラートを待つことではありません。SLOに基づいて日常業務やプロジェクトを行うことであり、短期的にはSLOが守られるようにすること、中長期的にもSLOを維持できるようにすることです。SLOを重視しないならSREなど必要ないと言ってもよいでしょう」- Google社SREハンドブック第2章
SLx (SLO/SLI/SLA)は多くの場合、経時的なトレンドと結び付けて考えられます。SLxに関する議論では、「エラー分数」、「1カ月あたりのバジェット」、「四半期あたりの可用性」などの言葉がよく使われます。では、経時的なトレンドを示すグラフと、イベントを適時に通知するアラートを使ってSLOを追跡するにはどうすればよいのでしょうか。そこでSignalFlowの機能を活用できるというわけです。
図1-1.アラート分数に基づくエラーバジェットの例
ここでは「ダウンタイム分数」を基準にSLOを設定します。そのためには何が必要でしょうか?
1番目は、「成功率」に関するアラートを使えばよさそうです。2番目は、アラートの状態が続いている間、1分単位でアラートを生成すればよいでしょう。3番目は、分単位のアラートを合計して定数(ダウンタイム分数のバジェット)と比較すれば解決です。
幸いSignalFlowには、このような分単位のアラートを生成する機能や、特定の周期(週/月/四半期など)でアラート数を追跡する方法が用意されています。
SignalFlowでは、alerts()関数を使ってアラートを時系列で追跡し、特定の期間に発生したアラート数をカウントできます。
そのために必要なものは以下の通りです。
filter_ = filter('sf_environment', '*') and filter('sf_service', 'adservice') and filter('sf_kind', 'SERVER', 'CONSUMER') and (not filter('sf_dimensionalized', '*')) and (not filter('sf_serviceMesh', '*')) A = data('spans.count', filter=filter_ and filter('sf_error', 'false'), rollup='rate').sum().publish(label='Success', enable=False) B = data('spans.count', filter=filter_, rollup='rate').sum().publish(label='All Traffic', enable=False) C = combine(100*((A if A is not None else 0)/B)).publish(label='Success Rate %') constant = const(30) detect(when(C < 98, duration("40s")), off=when(constant < 100, duration("10s")), mode='split').publish('Success Ratio Detector')
このコードでは以下の操作を行っています。
要するにこのコードでは、メトリクスがアラートしきい値を超えている間、1分ごとにアラートが生成されるようにしています。
次に、このアラート分数を追跡するためのグラフを作成します。さらに、グラフを1カ月ごとにリセットして、各月でエラーバジェットが使い果たされたかどうかがわかるようにします。
## Chart based on detector firing AM = alerts(detector_name='THIS IS MY DETECTOR NAME').count().publish(label='AM', enable=False) alert_stream = (AM).sum().publish(label="alert_stream") downtime = alert_stream.sum(cycle='month', partial_values=True).fill().publish(label="Downtime Minutes") ## 99% uptime is roughly 438 minutes budgeted_minutes = const(438) Total = (budgeted_minutes - downtime).fill().publish(label="Available Budget")
このコードでは以下の操作を行っています。
図1-2.アラート分数のグラフ作成の例
SignalFlowがいかに便利なツールであるかおわかりいただけたでしょうか?その高度な機能を活用すれば、面白いことがたくさんできます。
ここに示した例のように、SignalFlowを使ってアラートとグラフを作成し、それらを組み合わせてSLO/SLxを新たな方法で可視化することもできるのです。詳しい例とSignalFlowの使い方については、GitHubのSignalFlowリポジトリをご覧ください。
Splunk Observabilityが秘める可能性はほぼ無限です!このブログ記事をSignalFlow活用の出発点として、Splunk Observabilityでもっと高度な機能の開発にチャレンジしてみてください。
Terraformを使って、Splunk ObservabilityでこのSLO/エラーバジェット追跡機能を簡単に実装したい場合は、GitHubのObservability-Content-Contribリポジトリをチェックしてください。現在、Splunk Observabilityで何かすごい機能の開発に取り組んでいる方は、作成したダッシュボードやディテクターをこのリポジトリで公開することをぜひご検討ください。
Splunk Observabilityをまだお使いでない場合は、Splunk Observability Cloud製品スイートの無料トライアルをぜひお試しください。
このブログ記事はSplunkのオブザーバビリティフィールドソリューションエンジニアであるJeremy Hicksが執筆しました。ご協力いただいた以下の同僚に感謝申し上げます(敬称略):Bill Grant、Joseph Ross
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。