Splunk APMのビジネスワークフロー分析でサービスがまずい状態を見逃さない

# はじめに

Splunk Observability CloudのAPMには[Business Workflow（ビジネスワークフロー）](https://docs.splunk.com/Observability/apm/workflows/workflows.html)という機能があります。
アプリから得られたトレースにビジネス上の意味付けを与えられる機能で、良機能だと思うのでご紹介します。

# トレース分析の課題

とりあえずGoogleのECサイトのデモである[Microservice Demo](https://github.com/GoogleCloudPlatform/microservices-demo)をAPMのService Map機能で可視化してみます。
全トランザクションを元にサービス間の関連性がマップとして作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/1377af6f-4e03-73ae-576b-b1da3bfab1fd.png)

トレースも全量見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/3066b207-c242-70aa-a97b-7e75b8167a42.png)


さて、ここで気になることとして、どのトレースが重要かであるかです。
全てのトレースが等しく重要な訳ではなく、優先度を付けなければ効率的なモニタリング、アクションが取れなくなります。
ECサイトであれば例えば以下が実行された際のトレースが特に重要と考えられ、エラー率やレイテンシーを測定したいでしょう。また、その中でも無料会員よりも有料会員が重要とするケースもあります。
（このようなビジネス上重要なユーザーアクションをクリティカルユーザージャーニーとも呼んだりします）

- ログイン
- 商品サーチ
- 商品購入アクション

# Business Workflow

Business Workflowはそのようなトレースを抽出し、観測できる機能です
それでは設定方法と活用方法を見ていきましょう。

## 設定方法

以下種類の設定が可能です。

1. 特定のサービスを経過したトレース
例：「paymentservice」（支払い）を経過したトレース

1. 特定のサービスのTag別のトレース
例：「paymentservice」を経過しTenant Levelが「Gold」であるトレース
または一つのサービス内で複数の処理を行っているモノリシックなアプリの場合は例えば「Operation」みたいなTagで処理内容（商品検索、購入など）を出力するようにすれば、その処理ごとに抽出可能になります。

1. Global Tag別のトレース


### 1. 特定のサービスを経過したトレース

Business Workflowの設定画面は`Setting > Business Workflow`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/761164b8-33a2-3306-e551-cd0f95966df7.png)

`Rule Type`に「Service」、`Target Service`に例えば「paymentservice」を指定し、`Source of Workflow Name`に「Matched service:endpoint」を指定します。設定はこれだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/ca066cf7-cada-b089-8d63-31c097355fd4.png)

設定後、トレースが取得できるまで待ちます。Service MapでWorkflowを絞り込んでみましょう。するとpaymentserviceを経過したトレースに限定したMapを見ることができます。これで支払いアクションを取ったユーザーはどのようなサービスを使用しているか分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/4d0e0785-6166-cc2b-cf8a-ad610c7ba80e.png)

トレースも見てみましょう。同様にpaymentserviceを経過したトレースだけに絞り込まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/53068b21-250d-b6f4-983c-36d7dfc7b008.png)


### 2. 特定のサービスのTag別のトレース

Business Workflow作成に戻ります。`Target Service`に「paymentservice」を指定するところまでは同じで、`Source of Workflow Name`に「Tag value」を指定します。そしてBusiness Workflow化したいTagを選択します。ここで選択できるTagはpaymentserviceのスパンに含まれるTagです。
例えばtenant.level（カスタムタグでGold、Silver、Bronzeの値を持つ）を取っているとしたら会員グレード別の分析ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/105e53ce-fb68-6283-4a92-9c38f735b239.png)

Service Mapで`Workflow: gold`が生成されているので選択すると、同様にpaymentを実行したgoldユーザーのトレースで絞り込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/aaca324b-eed8-46e0-cd40-f87537d432ba.png)

トレースも同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/aa70b6b5-f52e-23e7-303e-8b44735aa3ef.png)

### 3. Global Tag別のトレース

`Rule Type`に「Global Tag」を選択することで[Globalでインデックス化したTag](https://docs.splunk.com/Observability/apm/span-tags/index-span-tags.html)（詳細割愛）を元にBusiness Workflow化することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/039aae5b-f6dc-5b82-95ec-83bda414117a.png)

以降はこれまでと同じです。



## 利用方法

ここまでの使い方は実はアドホックでフィルタをすることでも可能です。
Business Workflowの利点は定点観測、アラート、トラブルシューティングが容易になるところです。

### SLIダッシュボード

Business WorkflowのRED（Request、Error、Duration）に関するダッシュボードが用意されています。任意のBusiness Workflowをフィルタに指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/a606ccb1-3b35-8a14-36ea-39427fbca3a0.png)

問題が起きた時、いつから何が悪化しているか簡単に確認できますね。


### Detector
エラーとレイテンシーに対してDetector（アラート定義）を仕込むことができます。
Detectorについてはこちら：

https://qiita.com/symmr/items/7add9210b1c5db2874f5

Detector定義画面でBusiness Workflowが選択可能です。（ダッシュボードの🔔アイコンから遷移すれば既に設定済み）
検出方法は`Static Threshold`、`Sudden Change`、`Historical Anomary`（Durationのみ）が選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/a9f5bd33-938e-35f2-a140-542b9f6a5eba.png)

これにより、特に注意すべきBusiness Workflowで異常が発生した（今回の例であれば支払いの過程でエラー発生 or レイテンシーが急増した、またはSLOを違反しそうになっている）場合にアラートを通知し、アクションに移せます。

### トラブルシューティング

アラートを受け取ったメンバーはとりあえずダッシュボードで状況把握し、次に根本原因調査です。なんと対象のBusiness Workflowのトレースも絞り込みは一瞬で、その中でレイテンシーの高いトレースや、エラーの発生しているトレースもフィルタをかけられるので、どれかピックアップして確認します。

ちなみにSplunk Observability Cloudは**サンプリングしません**ので「サンプリング対象外だったらから調べられなかった」ということはないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/53068b21-250d-b6f4-983c-36d7dfc7b008.png)

対象トレースのスパン分析はこんな感じ。どのサービスでどれだけ処理時間を要していて、どこでどんなエラーがでているか一目瞭然です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/4bf84510-af40-cd65-0841-4ca80cf605ad.png)


あるいはAPMのTag Spotlight機能を使って問題の切り分けをしてあげてもよいです。
Tag Spotlightについてはこちら：

https://qiita.com/symmr/items/5388fe16db890b753c4b

各Tagについて値ごとのエラー発生状況やレイテンシーが確認し、問題のある条件を切り分けできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/641b01eb-698d-ff93-cbba-3f71ab8093b7.png)


# まとめ

Splunk Observability CloudのAPMにはBusiness Workflow機能の概要と使い方を見てきました。
ビジネス上重要なトレースを特定⇒観測⇒アラート⇒トラブルシューティングの流れがキレイにできそうであるという印象です。