PrometheusとGrafanaで追求する、より良いアプリケーションの可観測性

9.9K Views

December 14, 23

スライド概要

CloudNative Days Tokyo 2023でのセッション資料

Prometheus、Grafana LokiやGrafana Tempoなどを活用したアプリケーションの可観測性向上の取り組みについてご紹介します。具体的には、SuccessRateの計測とアラートにおける工夫やWeb Vitalsの計測によるパフォーマンス劣化の検知、OpenTelemetryの導入によるトレーサビリティの拡大、LokiとTempoを利用したログトレース連携などアプリケーション可観測性の強化について事例を交えてご紹介します。

profile-image

LIFULL HOME'Sを運営する株式会社LIFULLのアカウントです。 LIFULLが主催するエンジニア向けイベント「Ltech」等で公開されたスライド等をこちらで共有しております。

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

PrometheusとGrafanaで追求する、 より良いアプリケーションの可観測性 2023.12.12 CloudNative Days Tokyo 2023 Track D 株式会社LIFULL 川合 拓央 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

2.

スコープ PrometheusやGrafanaを使った可観測性向上について プラットフォームエンジニアリングの視点で発表します ‧可観測性についての機能をどういった考えで構成しているか ‧可観測性についての機能を普及させていく上での⼯夫/観点 アプリケーションの実装⽅法などについては話題に出てきません 2 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

3.

プラットフォームについて LIFULLの内製PaaS アプリケーション開発の最適化 キーワード: デプロイ、セキュリティ、可観測性、信頼性、パフォーマンス 取り組みなどについてのblog https://www.lifull.blog/archive/category/KEEL 3 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

4.

プラットフォームについて LIFULLの内製PaaS Kubernetesで稼働しているマルチテナンシーなシングルクラスタ サービスA Prometheus サービスB Loki Spinnaker プラットフォーム提供機能 4 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

5.

プラットフォームについて LIFULLの内製PaaS プラットフォームの「可観測性」に関連する部分 サービスA Prometheus サービスB Loki Spinnaker プラットフォーム提供機能 5 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

6.

プラットフォームについて LIFULLの内製PaaS プラットフォームの提供する機能を利⽤するための導⼊補助としてコードジェネレータを配布 manifest apiVersion: keel.lifull.com/v1alpha1 kind: KEELConfiguration PR metadata: name: &name keelctl-sample spec: … namespaces: コード ジェネレータ Alert feature: alert applications: - dashboard - クラスタ上で稼働するアプリケーションの定義ファイル 6 pipeline © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

7.

コンテンツ 「より良いアプリケーションの可観測性」をプラットフォームとして提供しています 可観測性の基盤を構築していく上での観点、普及のための観点を事例を交えて紹介します ● ● ● ● 7 可観測性プラットフォームで作る「より良い可観測性」のための体験 「より良い可観測性」を⽬指したログ基盤の構築 「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 「より良い可観測性」のための分散トレーシング © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

8.

可観測性プラットフォームで作る「より良い可観測性」のための体験 「より良いアプリケーションの可観測性」のためのポイント アプリケーションの可観測性を利⽤するユーザの体験を考える ref.https://github.com/cncf/tag-observability/blob/main/whitepaper.md 8 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

9.

可観測性プラットフォームで作る「より良い可観測性」のための体験 Grafanaを使うと仮定して ● built-inでメジャーなdatasourceが対応 ● シグナル間の連携をサポートする機能 ○ derived Fields (ログ→トレース) ○ tracesToLogsV2 (トレース→ログ) ○ exemplar(メトリクス→トレース) ○ tracesToMetrics(トレース→メトリクス) ref. https://grafana.com/docs/grafana/latest/datasources/ https://grafana.com/blog/2022/08/18/new-in-grafana-9.1-trace-to-metrics-allows-users-to-navigate-from-a-trace-s pan-to-a-selected-data-source/ 9 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

10.

可観測性プラットフォームで作る「より良い可観測性」のための体験 ログ→トレース 例) ログ検索でlatencyが⼤きい レスポンスを検索 対象のトレースを利⽤して どの処理に時間がかかって いたかを確認 10 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

11.

可観測性プラットフォームで作る「より良い可観測性」のための体験 トレース→ログ 例) traceの検索でDBに接続で きなかったspanを⾒つけ て関連するログを確認す る ※traceのattributeには任意 の情報(stack traceなど も)を含められるので⼀概 にログに⾶ぶ必要があるか は⼀考の余地がある 11 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

12.
[beta]
可観測性プラットフォームで作る「より良い可観測性」のための体験
メトリクス→トレース
exemplarをprometheus metricsに追加
❯ curl -H "Accept: application/openmetrics-text" localhost:8080/metrics
http_request_duration_seconds_bucket{code="200",handler="random",method="get",le="5.0"} 459
# {TraceID="f949aaa6558a9fbfd490b958d0d57d78"} 3.001288709 1.6710666564
…

例)
metricsを利⽤してサービスの50%tileの
latencyを計測し関連するトレースを確
認

12

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

13.

可観測性プラットフォームで作る「より良い可観測性」のための体験 トレース→メトリクス spanの属性を使って任意 のmetricsにリンク出来る 例) あるserviceのtraceを⾒て いたときにp99のlatency を素早く確認する 13 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

14.

可観測性プラットフォームで作る「より良い可観測性」のための体験 アプリケーションの可観測性を利⽤するユーザの体験を考える これがより良い可観測性を獲得するための第⼀歩 14 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

15.

「より良い可観測性」を⽬指したログ基盤の構築 ログについて「より良い検索体験」を考える http://example.com/path/ {“status”:500,”uri”:”/v1/api/xx x”} {“status”:500,”uri”:”/path/” {“severity”:”Error”,”message”:”upstrea m timed out”} {“severity”:”Error”,”message”:”request failed: /v1/api/xxx”} マイクロサービスを横断してhttp://example.com/path/に関連するログをまとめて閲覧したい 15 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

16.

「より良い可観測性」を⽬指したログ基盤の構築 分断されたログをつなぐ http://example.com/path/ {“status”:500,”uri”:”/v1/api”,” request-id”:”xyz”} {“status”:500,”uri”:”/path/” ,”request-id”:”xyz”} ”x-request-id”: ”xyz” {“severity”:”Error”,”message”:”upstrea m timed out”,”request-id”:”xyz”} {“severity”:”Error”,”message”:”request failed: /v1/api/xxx”, ”request-id”:”xyz”} マイクロサービスを横断してhttp://example.com/path/に関連するログをまとめて閲覧したい 16 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

17.

「より良い可観測性」を⽬指したログ基盤の構築 識別⼦を伝播させながらログに埋め込む OpenTelemetryを使ったトレースを推奨していくという決定 context-propagation http instrumentation libraries to automatically propagate trace context across services ref. https://opentelemetry.io/docs/instrumentation/js/propagation/#context-propagation-with-libraries W3C Trace Context ex. transparent header 17 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

18.

「より良い可観測性」を⽬指したログ基盤の構築 識別⼦を伝播させながらログに埋め込む http://example.com/path/ {“status”:500,”uri”:”/path/” ,”traceparent”:”00-e790f1ab26 a4ec86374a9f418ffcc303-f30cbf 1c1bda5e8b-01”} {“status”:500,”uri”:”/v1/api”,” traceparent”:”00-e790f1ab26a 4ec86374a9f418ffcc303-f30cbf1 c1bda5e8b-01”} {“severity”:”Error”,”message”:”upstrea m timed out”,”trace_id”:”e790f1ab26a4ec86374a 9f418ffcc303”,”span_id”:”75464ae8f310 bdfa”} {“severity”:”Error”,”message”:”request failed: /v1/api/xxx”, ”trace_id”:”e790f1ab26a4ec86374a9f4 18ffcc303”,”span_id”:”1d088d3717aaf 2e3”} 18 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

19.

「より良い可観測性」を⽬指したログ基盤の構築 サービス横断ログ検索を実現する out_forward nginx plugin nginx plugin /var/log/containers/* ※ nginxを挟んでいる理由はout_forwardにclient side load balancingがないため 19 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

20.

「より良い可観測性」を⽬指したログ基盤の構築 Loki運⽤メリット Object StorageにS3を利⽤。コストを抑えて運⽤出来る indexとchunksの両⽅をObject Storageに保存することが 出来る Amazon Simple Storage Service (Amazon S3) ref. https://grafana.com/docs/loki/latest/get-started/components/ 20 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

21.

「より良い可観測性」を⽬指したログ基盤の構築 Loki運⽤メリット スケーラビリティ write path, read pathごとに負荷に応じて調整可能 コスト削減のため深夜帯にはreed pathのコンポーネン トの台数を減らすようにして運⽤している ref. https://grafana.com/docs/loki/latest/get-started/components/ 21 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

22.
[beta]
「より良い可観測性」を⽬指したログ基盤の構築
Lokiのlabelのレギュレーションを設定
grouping=”kubernetes.[namespace名].[application名]”
※ kubernetesのmetadataとして付与したnamespaceとapplication名を利⽤

横断検索のためのクエリ
{grouping=~”.+”, grouping!~”kubernetes.(default|kube-system|istio-system).*”}
|= “<trace_id>”

明らかに不必要なシステムコンポーネントを除外

22

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

23.
[beta]
「より良い可観測性」を⽬指したログ基盤の構築
横断検索のクエリを浸透させる
{grouping=~”.+”, grouping!~”kubernetes.(default|kube-system|istio-system).*”}
|= “<trace_id>”

加えて
●
●

23

Lokiのクエリに対する学習コストを低くする
障害調査などで素早くログを引けるようにしたい

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

24.
[beta]
「より良い可観測性」を⽬指したログ基盤の構築
ログへの導線を補助
コードジェネレータ

PR

プラットフォーム関連情報.md
● アクセスログへのリンク
● Lokiのsnippet集

{grouping="kubernetes.sample-namespace.sample"}
| pattern "<raw>"
| json
#| structural_log_status >= 499 or structural_log_status == 0 # 異常なステータスコードのログのみを表⽰する(0はEnvoyにおけるClient Closed
Connection)
#| structural_log_uri =~ "/sample/.*" # URIが/sample/から始まるログのみを表⽰する
#| structural_log_reqtime > 3 # レスポンスタイムが3秒以上のリクエストのみを表⽰する
#| structural_log_ua !~ ".*[bB]ot.*" # UAにBotを含まないログのみを表⽰する
#| stream = "stderr" # 標準エラーのみを表⽰する
#|= "ERROR" # ERRORという⽂字列を含むログのみを表⽰する
| metadata_version =~ "main|canary"
| line_format "[version={{ $.metadata_version }}] [pod={{ $.metadata_pod_name }}] [container={{ $.metadata_container_name }}] [stream={{
$.stream }}]\n{{ $structural_log := index (fromJson $.raw) \"structural_log\" }}{{ if $structural_log }}{{ range $k, $v := $structural_log
}}\033[1;33m{{$k}}\033[0m={{ $v }}\n{{ end }}{{ else }}{{ $.message }}{{ end }}"

24

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

25.

「より良い可観測性」を⽬指したログ基盤の構築 ログへの導線を補助 プラットフォーム関連情報.md ● アクセスログへのリンク ● lokiのsnippet集 ブラウザ拡張機能 横断検索へのリンクを発⾏ 25 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

26.

「より良い可観測性」を⽬指したログ基盤の構築 timerangeは前後30sのものに設定 検索対象を限定する 26 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

27.

「より良い可観測性」を⽬指したログ基盤の構築 OpenTelemetry未対応のアプリケーションへの対応 プラットフォーム関連情報.md ● アクセスログへのリンク ● lokiのsnippet集 ブラウザ拡張機能 対象Podのアクセスログの前後を確認するためのリンクを発⾏ (alternative show context) 27 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

28.

「より良い可観測性」を⽬指したログ基盤の構築 LogQLを⼀切書かず 関連するログをまとめて検索できる体験を提供 プラットフォームからの機能提供という観点では 利⽤しやすい環境を⽤意することが重要 28 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

29.

「より良い可観測性」を⽬指したログ基盤の構築 クラスタ外のログの取り込みを整備 クラスタ外で稼働しているシステムのログも横断検索に対応する サービスA Prometheus サービスC サービスB Loki Spinnaker プラットフォーム提供機能 29 サービス サービス サービスX ● 検索効率向上 ● コストダウン © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

30.

「より良い可観測性」を⽬指したログ基盤の構築 3つの役割のfluentd 1. fluentd-external-router ○ 2. 3. fluentd-processor ○ ログの整形をしたり、Prometheusのメトリクスを作ったりする ○ 各テナント毎に構築 fluentd-aggregator ○ 30 type: LoadBalancerからリクエストされる⼊り⼝、後続のfluentdに転送先を決めて送るだけ lokiに転送だけする。back pressureとしての役割も。 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

31.

「より良い可観測性」を⽬指したログ基盤の構築 3つの役割のfluentd type: LoadBalancer tagに応じて fluentd-processorに転送したり、 fluentd-aggregatorに転送したりする fluentdexternal-router nginx 31 テナント毎に作成し各々必要な処理を⾏う fluentdprocessor fluentdprocessor fluentdprocessor nginx fluentdaggregator © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

32.

「より良い可観測性」を⽬指したログ基盤の構築 クラスタ内外のログについて検索できる体験が Grafana Lokiで実現された 可観測性のプラットフォームとしても スケール可能な構成であることを考慮 32 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

33.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 メトリクスをアラートに利⽤ ● ● 33 USEメソッド ○ Utilization: 使⽤率 ○ Saturation: 飽和率 ○ Errors: エラー数 例) ActiveなWorker数 / 総Worker数 Backlogに積まれたIn-QueueなConnection数 ECONNREFUSEDが返った数 REDメソッド ○ Requests: リクエスト数 ○ Errors: エラー数 ○ Duration: 実⾏にかかった時間 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

34.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 サービス全体の可⽤性としては99.9% ● エンドポイントA ○ ○ ● エンドポイントB ○ ○ 34 安定性が⾼く、成功率は100% 全体のトラフィックの99%を占める ⾮常に不安定で頻繁に問題が発⽣し、成功率は90% 全体のトラフィックの1%を占める © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

35.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 エンドポイントごとの測定のためにアクセスログからメトリクスを作成する out_forward nginx plugin /var/log/containers/* 35 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

36.
[beta]
「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例

out_forward
nginx

plugin

/var/log/containers/*

2023-11-23T04:35:01.025619037Z stdout F
{"x-client-ip":"xxx.xxx.xxx.xxx","size":0,"uri":"/foo?bar=baz","referer":"https://example.com
/","forwardedfor":"xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx","ua":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X)
AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Sa
fari/602.1","traceparent":"00-5e031fd77a5c4d6a7480e6a1c55e3797-38976629a94401c6-01","time":"2023-11-23T04:35:00.46
8Z","method":"GET","status":200,"host":"xxx.xxx.xxx.xxx","scheme":"http","vhost":"service-foo","reqtime":37,"protocol":"H
TTP/1.1"}

●
●
36

uri, method, statusをlabelにしたメトリクスを作成する
reqtimeからhistogramを作成しavg/50%/90%/99%tileなど計算できるようなメトリクスを作成する
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

37.
[beta]
「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例

out_forward
nginx

plugin

/var/log/containers/*

2023-11-23T04:35:01.025619037Z stdout F
{"x-client-ip":"xxx.xxx.xxx.xxx","size":0,"uri":"/foo?bar=baz","referer":"https://example.com
/","forwardedfor":"xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx","ua":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X)
AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Sa
fari/602.1","traceparent":"00-5e031fd77a5c4d6a7480e6a1c55e3797-38976629a94401c6-01","time":"2023-11-23T04:35:0
0.468Z","method":"GET","status":200,"host":"xxx.xxx.xxx.xxx","scheme":"http","vhost":"service-foo","reqtime":37,"prot
ocol":"HTTP/1.1"}

regexp:
exact_match:
forward_match:
- /foo
- /api/v1/bar
- /api/v1/baz

uriをそのまま利⽤してしまうとcardinalityが⾼くなりすぎるので抽出するuriはリスト形式にして管理

37

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

38.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 エンドポイント毎のメトリクスを利⽤したアラートを設定 メトリクス化したエンドポイント単位での検知が可能になったことで これまで⾒えてこなかったエラーが顕在化した 分かりきった原因があるものは対応⼿順など解消につながるヒントを設定する 38 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

39.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 エンドポイント毎のメトリクスを利⽤したダッシュボードを設定 PrometheusのRecording rulesやダッシュボード表⽰の事前キャッシュ作成のためのCronJob などいくつかパフォーマンスにおける調整をおこない実現 39 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

40.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 エンドポイントごとのアラートをデプロイパイプラインで利⽤する main canary ● ● 40 Spinnaker Kayenta canaryにデプロイしたい内容を反映させて⼀部のリクエストを流す Spinnaker Kayentaがこのデプロイによって発⽣するエラーがないことを確認できたらmainにも反映する © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

41.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 エンドポイントごとのアラートをデプロイパイプラインで利⽤する ▼mainとcanaryとを⽐較 main 全体のError Rateが5%上昇 canary 以下のエンドポイントのError Rateが0.01%上昇 /important/foo /important/bar /important/baz サービスにとって特に重要なエンドポイントでデプロイ中にエラーが発⽣したら即時切り戻し対象にする 41 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

42.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 Lighthouseを使ったCore Web Vitalsの計測 ref. https://developers.google.com/search/docs/appearance/core-web-vitals?hl=ja LCP (Largest Contentful Paint) FID (First Input Delay) CLS (Cumulative Layout Shift) … 42 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

43.
[beta]
「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
Lighthouse-exporter
LCP (Largest Contentful Paint)
FID (First Input Delay)
CLS (Cumulative Layout Shift)
…

/metrics

※ 実際はheadlessモード

lighthouse_audit{id="l
argest-contentful-paint
",unit="millisecond",ur
i="https://example.com
/",form_factor="mobile
"} 1300.000
…

# simple usage, required `interval` millisecond
npm start -- --interval 600000 --targets https://example.com/

43

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

44.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 44 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

45.
[beta]
「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
プラットフォーム上での展開

lighthouseExporter:
enabled: true
interval: 86400
targets:
- https://example.com/

コードジェネレータ

manifest

lighthouse_audit{id="l
argest-contentful-paint
",unit="millisecond",ur
i="https://example.com
/",form_factor="mobile
"} 1300.000
…

プラットフォームを利⽤する
各サービスが定義する設定ファイルに設定

45

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

46.

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例 「よりよい可観測性」のために 必要な指標、必要なメトリクス粒度を整理して メトリクスがなければ作り出し幅広く活⽤させる 46 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

47.

「より良い可観測性」のための分散トレーシング リクエストを処理するための様々な処理 例えば、 ‧ ユーザ認証の呼び出し ‧ DBへのリクエスト ‧ Templateの構築 など 処理の依存関係を考慮して分析可能にする ref. https://opentelemetry.io/docs/concepts/observability-primer/ 47 分散システムを構築している場合に特に効⼒を発揮 しパフォーマンスの問題や原因に導く⼿助けをする もの © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

48.

「より良い可観測性」のための分散トレーシング OLTPやJaegerなど 複数の⼊出⼒形式に 対応 ref. https://opentelemetry.io/docs/collector/ 48 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

49.

「より良い可観測性」のための分散トレーシング ref. https://opentelemetry.io/docs/collector/ 49 例) hash処理 属性追加 Tail based Sampling (後述) © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

50.

「より良い可観測性」のための分散トレーシング TracesはLogと同様にボリュームを必要とするので全て収集すべきなのか? ほとんどはno issue 必要になるのは⼀部 ref. https://opentelemetry.io/docs/concepts/sampling/ 50 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

51.

「より良い可観測性」のための分散トレーシング Tail based sampling アプリケーションで⽣成した traceを全て送信する 送られてきたtraceを 利⽤するか利⽤しないか決める 全てのtraceをOTEL Collectorなどに送信し /xyz errorが発⽣しているもの status_code: {status_codes: [ERROR]} /abc /abc /abc 51 sampled latencyが⾼いもの sampled など特定の条件でフィルターする latency: {threshold_ms: 5000, upper_threshold_ms: 10000} アプリケーションから全てのデータを送信す る必要があるので送信元のCPU,Memory,転送 量の増加などに注意する © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

52.

「より良い可観測性」のための分散トレーシング LIFULLではTraceデータの保存期間は短く設定して削除して総量は減らしている Tail based samplingでフィルターせず100%保存している 52 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

53.

「より良い可観測性」のための分散トレーシング アクセスログを検索すると必ずTraceデータが確認できるという体験の良さ 53 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

54.
[beta]
「より良い可観測性」のための分散トレーシング
TraceQL
{ .http.method = “POST”} | count() > 2

http.method: POST

{ span.http.status_code >= 400 && span.http.status_code < 500 }

bad request
ref. https://grafana.com/docs/tempo/latest/traceql/

54

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

55.
[beta]
「より良い可観測性」のための分散トレーシング
TraceQL
{.service.name="service-a"} >> {.net.peer.name="db.example.com" && .db.operation = "CONNECT" && duration >= 100ms}

●
●

`service-a` を親のspanとしてもつ⼦孫span
データベース db.example.com への接続操作を⾏い、その操作が100ミリ秒より⼤きいspanを特定

親

子

孫

55

db.example.com

© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

56.

「より良い可観測性」のための分散トレーシング ⽬当てのTraceを確実に⾒つけたいのでTail based samplingは必要 Sampling Rateでのトレードオフを把握 56 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。

57.

最後に より良い可観測性を得るためにPrometheusやGrafanaを利⽤した事例の紹介 ● ● ● Lokiによるログの検索体験向上 メトリクスの活⽤事例 トレースとの向き合い⽅ プラットフォーム提供の視点としても重要な観点 ● ● 利⽤者の優れた体験をデザインする 利⽤しやすくスケール可能な環境の提供 他にもContinuous ProfilingやeBPFなど別の視点からも改善出来る材料は豊富 より良いアプリケーションの可観測性を獲得を⽬指す 57 © LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。