NewRelicUIを使用してSLIとSLOを手動で作成できます。または、 NerdGraphAPIとTerraformServiceLevelリソースを使用してプロセスを自動化することもできます。
要件と制限
サービス レベルを作成および管理するには、次のものが必要です。
以下のようなエラーが出る場合は、ユーザーの権限を確認してください。
- UIでSLI/SLOを保存するオプションが無効になっていました。
- APIは、「タイプ
\"RootMutationType\".”
のフィールド\"eventExportRegisterRule\"
をクエリできません」というエラーメッセージを返します。
複数のアカウントを持つ New Relic 組織の場合: サービス レベルは 1 つのアカウントにのみ関連付けることができます。複数のアカウントにまたがるエンティティを持つワークロードのサービス レベルを作成しようとしている場合は、関連付けられているすべてのエンティティが同じアカウントに含まれるように、ワークロードを再構築する必要がある場合があります。1 つのアカウントで最大 500 個の SLI を作成できます。
New Relic は、さまざまな方法でさまざまなソースからデータを取り込みます。それぞれに独自のフレーバーがあり、データの消費方法に多くの可能性をもたらします。データの特性により、サービス レベルを構成できないシナリオがいくつかあります。
- Subqueries。サブクエリはサポートされていません。
- Addition of sum functions。
SELECT sum(attributeA)
またはSELECT sum(attributeA + attributeB)
を使用することは可能ですが、式SELECT sum(attributeA) + sum(attributeB)
はサポートされていません。
SLIおよびSLOを作成するための重要な概念
SLIとSLOを定義する際には、これらの概念に留意してください。
主要なユーザー エクスペリエンスを定義する
チームが所有する最高レベルの主要なユーザー エクスペリエンスを考えることから始めて、それ以上の粒度では価値が得られなくなるまで、基礎となる主要なユーザー エクスペリエンスに焦点を当てます。どの SL から開始するかを選択するときは、トップダウン アプローチを使用することをお勧めします。つまり、最も粒度の低い SL から開始し、必要な場合にのみより粒度の高い SL を作成します。
まず、「システム境界」を特定します。これは、ユーザーが機能の「ブラック ボックス」として認識しているシステムの一部です。いくつかの例:
- API の場合は、単なるサービスかもしれません。
- データ パイプラインの場合、データをエンド ツー エンドで処理するために必要な一連のサービスである可能性があります。
これらの最上位のサービス レベルを確立すると、サービスのすべてのエンドポイントが同じように動作するわけではなく、さらに分割する必要がある場合があります。例えば:
- ログイン トランザクションでは、エラー時にブラウジング トランザクションよりも高い SLO が必要になる場合があります
- 一部の操作の期間は、残りの操作よりもはるかに長くなります
たとえば、大まかに言うと、New Relic での主要なユーザー エクスペリエンスは次のようになります。 顧客がテレメトリ データを送信し、そのデータを後で製品 API または UI でクエリできるようにします。
そのユーザー エクスペリエンスのために、次のような SLO を作成できます。
| 期間 | ターゲット | カテゴリ | インジケーター | | ------------ | ------ | -------- | ------------------------------------------------------------------- | | 過去 28 日間 | 99.9% | レイテンシ | ユーザーが取り込んだデータは 1 分以内にクエリ可能になります |
通常、これらの種類のユーザー エクスペリエンスには複数のサービスが関与し、複数のチームや組織の境界にまたがっていることに注意してください。
基盤となるユーザー エクスペリエンスの粒度を高めることで、New Relic でのもう 1 つの重要なユーザー エクスペリエンスは、 顧客がカスタム ダッシュボードを使用してテレメトリ データを視覚化できるようになる可能性があります。
この SLO は次のようになります。
| 期間 | ターゲット | カテゴリ | インジケーター | | ------------ | ------ | ------------ | ------------------------------------------------- | | 過去 28 日間 | 99.9% | 可用性 | ユーザーがダッシュボード UI を正常に操作 |
細かすぎる例として、ダッシュボードにグラフ ウィジェットを追加することもユーザー エクスペリエンスです。ただし、このアクションに対して特定の SLO を作成しても、ユーザーがダッシュボード UI を正常に操作するという以前の SLO と比較して、追加の価値はありません。
要約すると、トップダウン アプローチを使用し、最も粒度の低いサービス レベルから開始します。必要な場合にのみ、より詳細なサービス レベルを作成します。
関連するエンティティ
New Relicエコシステムでは、すべてのサービスレベルが別のエンティティにリンクされています。これは、スタック内でデータを報告する要素、またはアクセス可能なデータを生成する要素です。サービスレベルが関連するエンティティによって、SLI/SLOの結果が表示される場所が決まります。
New Relic に報告される任意の NRDB イベントまたはディメンション メトリックで SLI を定義できます。ほとんどのカスタム イベントは、単一の New Relic エンティティに関連していませんが、より高いレベルのビジネスおよびユーザー エクスペリエンスの洞察を提供します。この場合でも、SLI を特定のエンティティまたはワークロードに関連付けることができます。
SLI クエリは、関連エンティティが存在する同じアカウントのスコープ内にある必要があることに注意してください。
SLIクエリ
SLIは、有効なリクエストの総数のうち、良いレスポンスの割合として定義されます。ほとんどの場合、有効な作品と良い作品を定義することでSLIを設定します。
- valid requestは、SLI にとって意味があるものとしてカウントするリクエストです (たとえば、ヘルスチェックによって開始されなかったエンドポイントに関連するすべてのトランザクション)。
- good responseは、エンドユーザーまたはクライアント サービスに適切な出力を提供すると考えられる応答です (たとえば、サービスは 2 秒未満で応答し、エンドユーザーに良好なナビゲーション エクスペリエンスを提供します)。
代わりに、悪い反応と思われるものを定義することもできます。
- bad responseは、不正な出力を提供すると考えられる応答です (たとえば、サービスがサーバー エラーで応答したため、クライアントがフローを失敗させたなど)。 New Relic は、良好な応答の数を
valid - bad
として自動的に取得します。
リクエストベースのSLOは、リクエストの総数に対する適切なリクエストの数の比率として定義されるSLIに基づいています。要求ベースのSLOは、その比率がコンプライアンス期間の目標を満たしているか超えている場合に満たされます。
推奨されるSLI
このセクションでは、サービスやブラウザアプリケーションのパフォーマンスを測定するために一般的に使用されるいくつかのSLIを紹介します。
New Relic エージェントを使用して計測された APM サービスと主要なトランザクションの SLI
Transaction
イベントに基づくと、これらのSLIはリクエストドリブンサービスで最も一般的です。
サービスの成功は、全リクエスト数に対する成功したレスポンスの数の比率です。これは事実上エラー率ですが、予想されるエラーを取り除くなど、フィルタリングすることができます。
Valid events fields
WHERE entityGuid = '{entityGuid}'
ここで、 {entityGuid}
はサービスのGUIDです。
Bad events fields
WHERE entityGuid = '{entityGuid}' AND error.expected != true
ここで、 {entityGuid}
はサービスのGUIDです。
レイテンシーSLIは、有効なリクエストのうち、良好なエクスペリエンスとして設定された閾値よりも速く処理された割合を測定するものです。
継続時間のしきい値を決めるためには、過去数週間のサービスのパフォーマンスを確認し、その結果を現実的で達成可能なベースラインとして使用します。その後、SLIのしきい値を繰り返し検討し、より意欲的なパフォーマンスに合わせていくことができます。
継続時間の条件に適切な値を選択するために、1 つの典型的な方法は、過去 7 日間または 15 日間の回答の 95 パーセンタイルの継続時間を選択することです。 クエリビルダー を使用してこの継続時間のしきい値を見つけ、それを使用して SLI にとって良いイベントと思われるものを決定します。
SELECT percentile(duration, 95) FROM Transaction
WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX
Valid events fields
WHERE entityGuid = '{entityGuid}' AND transactionType = 'Web'
ここで、 {entityGuid}
はサービスのGUIDです。
Good events fields
WHERE entityGuid = '{entityGuid}' AND transactionType = 'Web' AND duration < {duration}
- ここで、
{entityGuid}
はサービスのGUIDです。 - ここで、
{duration}
は、クライアントサービスまたはエンドユーザーに優れたエクスペリエンスを提供すると考える応答時間(秒単位)です。
OpenTelemetry を使用して計測された APM サービスおよび主要なトランザクション用の SLI
OpenTelemetryのスパンに基づくと、これらのSLIはリクエストドリブンのサービスで最も一般的なものです。
サービスの成功は、全リクエスト数に対する成功したレスポンスの数の比率です。これは事実上エラー率ですが、予想されるエラーを取り除くなど、フィルタリングすることができます。
Valid events fields
WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer')
OR kind IN ('server', 'consumer'))
ここで、 {entityGuid}
はサービスのGUIDです。
Bad events fields
WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer')
OR kind IN ('server', 'consumer')) AND otel.status_code = 'ERROR'
ここで、 {entityGuid}
はサービスのGUIDです。
レイテンシーSLIは、有効なリクエストのうち、良好なエクスペリエンスとして設定された閾値よりも速く処理された割合を測定するものです。
継続時間のしきい値を決めるためには、過去数週間のサービスのパフォーマンスを確認し、その結果を現実的で達成可能なベースラインとして使用します。その後、SLIのしきい値を繰り返し検討し、より意欲的なパフォーマンスに合わせていくことができます。
継続時間の条件に適切な値を選択するために、1 つの典型的な方法は、過去 7 日間または 15 日間の回答の 95 パーセンタイルの継続時間を選択することです。 クエリビルダー を使用してこの継続時間のしきい値を見つけ、それを使用して SLI にとって良いイベントと思われるものを決定します。
SELECT percentile(duration.ms, 95) FROM Span
WHERE entityGuid = '{entityGuid}' AND (span.kind IN ('server', 'consumer')
OR kind IN ('server', 'consumer')) SINCE 7 days ago LIMIT MAX
Valid events fields
WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer')
OR kind IN ('server', 'consumer'))
ここで、 {entityGuid}
はサービスのGUIDです。
Good events fields
WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer')
OR kind IN ('server', 'consumer')) AND duration.ms < {duration}
- ここで、
{entityGuid}
はサービスのGUIDです。 - ここで、
{duration}
は、クライアントサービスまたはエンドユーザーに優れたエクスペリエンスを提供すると考える応答時間(秒単位)です。
メトリック タイムスライス データを使用した APM サービスの SLI
APM メトリクスはタイムスライス データとして報告されます。 SLI のタイムスライス データを活用することもできます。
注: この機能はまだベータ版です。
サービスの成功は、すべてのリクエストの数に対する成功した応答の数の比率です。 これは実質的にエラー率です。
Valid data
SELECT sum(getField(apm.service.transaction.duration, count))
WHERE appName = '{appName}'
ここで、 {appName}
は APM アプリ名です。
Bad events fields
SELECT sum(getField(apm.service.error.count, count))
WHERE appName = '{appName}' AND getField(`apm.service.error.count`, count) > 0
ここで、 {appName}
は APM アプリ名です。
良好なイベントがカスタム メトリックによって報告されると想像してください。 有効なイベント数は同じである可能性があります。
Valid data
SELECT sum(getField(apm.service.transaction.duration, count))
WHERE appName = '{appName}'
ここで、 {appName}
は APM アプリ名です。
そして、今度はカスタム メトリックを使用して良好なイベントを検出します。
Good data
SELECT sum(getField(newrelic.timeslice.value, count))
WHERE appName = '{appName}' AND metricTimesliceName = 'Custom/CrossClusterQuery/DataAvailability/status/success'
ここで、 {appName}
は APM アプリ名です。
ブラウザアプリケーション用SLI
以下のSLIは、GoogleのBrowser Core Web Vitalsに基づいています。
ページビューのうち、エラーなく提供された割合のことです。
Valid events fields
WHERE entityGuid = '{entityGuid}'
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
Bad events fields
WHERE entityGuid = '{entityGuid}' AND firstErrorInSession IS true
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
これは、有効なページビューのうち、ビューポートに表示される最大のコンテンツ要素が、良好なエクスペリエンスに対応すると考えられる閾値よりも速くレンダリングされた割合です。
Valid events fields
WHERE entityGuid = '{entityGuid}' AND largestContentfulPaint IS NOT NULL
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
Good events fields
WHERE entityGuid = '{entityGuid}' AND largestContentfulPaint < '{largestContentfulPaint}'
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
ここで、 {largestContentfulPaint}
は、ビューポートに表示される最大のコンテンツ要素をレンダリングする時間(ミリ秒単位)であり、エンドユーザーに優れたエクスペリエンスを提供します。頻繁な標準は4000ミリ秒です。
ご使用の環境で{largestContentfulPaint}
に使用する現実的な数値を決定するための一般的な方法のひとつは、過去7日間または15日間の応答の95パーセンタイル期間を選択することです。クエリビルダーを使用して検索します。
SELECT percentile(largestContentfulPaint, 95) FROM PageViewTiming
WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX
これは、ユーザーが最初にページにアクセスしてから、そのアクセスに対してブラウザが応答するまでの時間が、一定の閾値以下であるページビューの割合です。
Valid events fields
WHERE entityGuid = '{entityGuid}' AND interactionToNextPaint IS NOT NULL
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
Good events fields
WHERE entityGuid = '{entityGuid}' AND interactionToNextPaint < {interactionToNextPaint}
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
ここで、 {interactionToNextPaint}
は、エンドユーザーに優れたエクスペリエンスを提供するためにブラウザーが応答する必要がある時間(ミリ秒単位)です。頻繁な標準は300ミリ秒です。
ご使用の環境で{interactionToNextPaint}
に使用する現実的な数値を決定するための一般的な方法のひとつは、過去7日間または15日間の応答の95パーセンタイル期間を選択することです。クエリビルダーを使用して検索します。
SELECT percentile(interactionToNextPaint, 95) FROM PageViewTiming
WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX FACET deviceType
累積レイアウトシフト(CLS)が良好なページビューの割合です。CLSは、ページの寿命期間中に発生した予期せぬレイアウトシフトについて、個々のレイアウトシフトスコアの総和と表現されます。レイアウトシフトは、レンダリングされたフレームから次のフレームへと可視要素の位置が変わるときに発生します。
Valid events fields
WHERE entityGuid = '{entityGuid}' AND cumulativeLayoutShift IS NOT NULL
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
デスクトップとモバイルデバイスのCLSを別々に追跡するために、別々のSLIを作成したい場合は、フィールドの最後にこれらの条項のいずれかを追加してください。
AND deviceType = 'Mobile'
AND deviceType = 'Desktop'
Good events fields
WHERE entityGuid = '{entityGuid}' AND cumulativeLayoutShift < {cumulativeLayoutShift}
ここで、 {entityGuid}
はブラウザアプリのGUIDです。
ここで、 {cumulativeLayoutShift}
は事前設定された値です。優れたユーザーエクスペリエンスを提供するには、サイトのCLSスコアが0.1以下になるように努める必要があります。 0.25以上のCLSスコアは、ユーザーエクスペリエンスが低いと見なされます。
valid eventsクエリを定義した際に、デスクトップとモバイルデバイスのCLSを別々に追跡するために、別々のSLIを作成することにした場合は、フィールドの最後にこの句を追加します。
AND deviceType = 'Mobile'
AND deviceType = 'Desktop'
ご使用の環境で{cumulativeLayoutShift}
に選択する現実的な数を決定するための一般的な方法のひとつは、モバイルデバイスとデスクトップデバイスに分割された、過去7日間または15日間のページ読み込みの75パーセンタイルを選択することです。クエリビルダーを使用して検索します。
SELECT percentile(cumulativeLayoutShift, 95) FROM PageViewTiming
WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX FACET deviceType
合成チェック用の SLI
成功とは、すべてのチェックの数に対する、成功した合成チェックの数の比率です。
Valid events fields
WHERE entity.guid = '{entityGuid}'
ここで、 {entityGuid}
合成チェックの GUID です。
Good events fields
WHERE entity.guid = '{entityGuid}' AND result='SUCCESS'
ここで、 {entityGuid}
合成チェックの GUID です。
サービスレベルの作成と編集
UI のいくつかの場所から SLI と SLO を作成できます。
- one.newrelic.com > All capabilities > Service levelsに移動します。 SLI は、ワークロードを含むアカウント全体の任意のエンティティに関連付けることができます。
- 任意の サービス、キー現場、 browserアプリケーション、または外形監視モニターの Service levels ページから。 SLI はその特定のエンティティに関連付けられます。 この開始点を使用すると、 New Relic利用可能な最新データに基づいて、このエンティティ タイプの最も一般的なサービスレベル インジケーターを自動的に作成します。
- 任意のワークロードのService levelsタブから。 SLI は、ワークロード内の任意のエンティティ、またはワークロード全体に関連付けることができます。
SLI の作成後、すぐにデータが表示されるわけではありません。最初の SLI 達成結果が表示されるまでに、数分の遅延が予想されます。デフォルトでは、データの保持期間は 13 か月です。
サービス レベルは 1 つのアカウントにのみ関連付けることができることに注意してください。詳細については、要件を参照してください。
サービス レベルを作成するには、次の手順に従います。
新しい SLI を定義するには、次の 3 つのオプションのいずれかを選択します。
- Entity data: 当社のエージェントまたは独自のカスタムイベントからの標準データに基づいて SLI を作成します。 これが最も一般的なオプションです。 これを選択する場合は、使用するエンティティ (APM サービスなど) を選択します。
- Custom data: あるいは、カスタム NRDB イベントまたは次元メトリクスに基づいて SLI を作成することもできます。 サービスレベル データを特定のエンティティに関連付けることができない場合、またはサービスレベルをワークロードに直接関連付けたい場合に、このオプションを使用します。
- Metric data: Prometheus、OTel、または独自のカスタム ディメンション メトリクスからのデータに基づいています。
この手順では、どのイベントが有効か、良いか、悪いかを判断する SLI クエリを構成します。
SLI を APM サービスやブラウザアプリと関連付けると、New Relic はいくつかの典型的な SLI とそのクエリーを提案します。サービスレベル目標の基準値として最新のデータを使用しますので、その後に SLI と SLO を編集することができます。
異なるタイプのエンティティを使用している場合、ディメンション メトリックをクエリする場合、または New Relic が提供するベースライン値をカスタマイズする場合は、必要に応じて SLI をカスタマイズできます。たとえば、 WHERE
句を使用してヘルスチェックを除外できます。各クエリで異なるイベント タイプを使用することもできます。この場合、各有効なイベントが、適切なクエリまたは不適切なクエリの 1 つ以下のイベントにのみ対応していることを確認してください。
データが収集されたアカウントは、SLIが参照しているエンティティのアカウントと一致します。各フィールドの内容については、上記のセクションを参照してください。
右側には最終的なクエリが表示され、下部には過去数日間の有効なイベントと良い/悪いイベントの数のプレビューが表示されます。
以下は、ディメンション メトリクスのパーセンテージ ベースの成功率の例です。これを SLI の有効/良好なイベントに変換してみましょう。
SELECT percentage(sum(scrooge_do_expire_count),
WHERE status = 'success') AS 'Success Rate'
有効なクエリの場合、外側のWHERE
句をコピーするだけです。
SELECT sum(scrooge_do_expire_count)
良いイベントは、パーセンテージ関数の外側のWHERE
句とWHERE
句です。
SELECT sum(scrooge_do_expire_count)
現在サポートされている 4 つの集計関数はcount()
、 sum()
、 getField()
およびgetCdfCount()
です。 Count
とsum
すべてのイベント タイプで使用できますが、 getField
とgetCdfCount
はMetricから選択した場合にのみ使用できます。
イベント データで count()
関数を使用して、有効/良好/不良イベントの数を数えます。
sum()
関数は、イベント データまたはディメンション メトリックに事前に集計されたカウンターがある場合に役立ちます。パラメータ、つまり合計に使用する属性が必要です。
getField()
と getCdfCount()
関数を使用して、分布指標属性がしきい値を下回る、またはしきい値に達する頻度を確認します。どちらの関数にも属性が必要で、getCdfCount() には値を測定するためのしきい値も必要です。
count()
を使用した例:
WHERE entityGuid = '{entityGuid}' AND firstErrorInSession IS true
sum()
を使用した例:
SELECT sum(provider.errors.Sum)
WHERE awsAccountId = 'XXX' AND provider LIKE 'LambdaFunction%'
getField()
と getCdfCount()
を組み合わせた使用例:
SELECT getField(`newrelic.goldenmetrics.synth.monitor.medianDurationS`, count) AS 'Valid'
SELECT getCdfCount(`newrelic.goldenmetrics.synth.monitor.medianDurationS`, 0.5) AS 'Good'
SLI クエリでワイルドカードを使用することもできます。例を次に示します。
SELECT sum(provider.cache%Count.Sum)
WHERE awsAccountId = 'XXX'
このステップでは、SLI値のプレビューを取得し、このSLIに1つのSLOを追加します。時間枠の長さと目標のパーセンテージを選択するだけです。右のグラフは、設定している目標が実現可能かどうか、または目標を達成できないことが多いかどうかを予測するのに役立ちます。
ローリングタイムウィンドウのSLOがサポートされています。ローリングタイムウィンドウでは、SLOの準拠には過去N日間のデータが考慮されます。毎分、最も古いデータが現在の計算から抜け落ち、新しいデータがそれに取って代わります。
SLIの短い名前を選択してください。これは、SLIが何を測定しているかを認識するのに役立ちます。
SLIにタグを追加して、後でUIでのSLIの検索、フィルタリング、およびグループ化に使用できるようにすることをお勧めします。
組織にとって意味のある任意のタグを設定できます。ドロップダウンは、次のような便利なタグキーを提案します。
owner
:このサービスレベルを所有するチームまたはビジネスユニットであり、SLOターゲットを逃した場合に対応します。
category
: latency
など、SLIが測定しているものを説明するキーワード。提案されたサービスレベルフローに従うと、New Relicがこのタグを作成し、後で編集することができます。
environment
:サービスレベルが測定している環境であり、それはユースケースにとって意味があります。
maturity
:SLOがどれほど安定しているかを利害関係者に伝えるのに役立ちます。 test
、 commitment
、 aspirational
などのタグ値を使用することをお勧めします。
user_journey
およびapplication
: これらの種類のタグは、ユーザー ジャーニー全体であろうと、特定のアプリケーションだけであろうと、同じユーザー エクスペリエンスに適用される SLI をグループ化するのに役立ちます。
さらに、ドロップダウンには関連するエンティティタグも表示されるため、それらをSLIにすばやく追加することもできます。
最後に、オプションでそのサービスレベルの説明を追加できます。
SLIの編集
SLI を作成したら、次に示すように、 ...メニューをクリックしてからEdit
をクリックし、サービスレベル リスト ページから SLI を編集できます。
または、 Edit
をクリックして、概要ページから同じことを行うことができます。
SLM を最適化する
SLM 実装を最適化する方法については、 可観測性成熟度 SLM ガイドを参照してください。