---
title: PrometheusとGrafanaで追求する、より良いアプリケーションの可観測性
tags:  #lifull #grafana #ログ #kuberentes  
author: [株式会社LIFULL](https://www.docswell.com/user/LIFULL)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/YJ65ZNDM7V.jpg?width=480
description: CloudNative Days Tokyo 2023でのセッション資料  Prometheus、Grafana LokiやGrafana Tempoなどを活用したアプリケーションの可観測性向上の取り組みについてご紹介します。具体的には、SuccessRateの計測とアラートにおける工夫やWeb Vitalsの計測によるパフォーマンス劣化の検知、OpenTelemetryの導入によるトレーサビリティの拡大、LokiとTempoを利用したログトレース連携などアプリケーション可観測性の強化について事例を交えてご紹介します。
published: December 14, 23
canonical: https://www.docswell.com/s/LIFULL/5Q8Q73-2023-12-14-113426
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/YJ65ZNDM7V.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GJ5YW53QJ4.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/9E2GQNZWER.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/D7YVWPR97M.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/VENM95DDJ8.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/Y79N2YG873.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/G78K56VZJD.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/L7LZY951ER.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EMVNZ35EW.jpg)

可観測性プラットフォームで作る「より良い可観測性」のための体験
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. 本書の無断転載、複製を固く禁じます。


# Page. 10

![Page Image](https://bcdn.docswell.com/page/PER2D6QZ79.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/P7XD1M51JX.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/37KX2G6MJD.jpg)

可観測性プラットフォームで作る「より良い可観測性」のための体験
メトリクス→トレース
exemplarをprometheus metricsに追加
❯ curl -H &quot;Accept: application/openmetrics-text&quot; localhost:8080/metrics
http_request_duration_seconds_bucket{code=&quot;200&quot;,handler=&quot;random&quot;,method=&quot;get&quot;,le=&quot;5.0&quot;} 459
# {TraceID=&quot;f949aaa6558a9fbfd490b958d0d57d78&quot;} 3.001288709 1.6710666564
…
例）
metricsを利⽤してサービスの50%tileの
latencyを計測し関連するトレースを確
認
12
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LJ354N6275.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/8JDDQWV6JG.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/VEPXL9RZJ8.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
ログについて「より良い検索体験」を考える
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. 本書の無断転載、複製を固く禁じます。


# Page. 16

![Page Image](https://bcdn.docswell.com/page/27VLQMRMEQ.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
分断されたログをつなぐ
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. 本書の無断転載、複製を固く禁じます。


# Page. 17

![Page Image](https://bcdn.docswell.com/page/5JGXWGMX7L.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
識別⼦を伝播させながらログに埋め込む
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. 本書の無断転載、複製を固く禁じます。


# Page. 18

![Page Image](https://bcdn.docswell.com/page/47Q83XR5EP.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/KE42168V71.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/L71MGV24JG.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
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. 本書の無断転載、複製を固く禁じます。


# Page. 21

![Page Image](https://bcdn.docswell.com/page/G7W3KLRZ72.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4JZVZMRL73.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
Lokiのlabelのレギュレーションを設定
grouping=”kubernetes.[namespace名].[application名]”
※ kubernetesのmetadataとして付与したnamespaceとapplication名を利⽤
横断検索のためのクエリ
{grouping=~”.+”, grouping!~”kubernetes.(default|kube-system|istio-system).*”}
|= “&lt;trace_id&gt;”
明らかに不必要なシステムコンポーネントを除外
22
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 23

![Page Image](https://bcdn.docswell.com/page/YE65ZNRMJV.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
横断検索のクエリを浸透させる
{grouping=~”.+”, grouping!~”kubernetes.(default|kube-system|istio-system).*”}
|= “&lt;trace_id&gt;”
加えて
●
●
23
Lokiのクエリに対する学習コストを低くする
障害調査などで素早くログを引けるようにしたい
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 24

![Page Image](https://bcdn.docswell.com/page/GE5YW58QE4.jpg)

「より良い可観測性」を⽬指したログ基盤の構築
ログへの導線を補助
コードジェネレータ
PR
プラットフォーム関連情報.md
● アクセスログへのリンク
● Lokiのsnippet集
{grouping=&quot;kubernetes.sample-namespace.sample&quot;}
| pattern &quot;&lt;raw&gt;&quot;
| json
#| structural_log_status &gt;= 499 or structural_log_status == 0 # 異常なステータスコードのログのみを表⽰する(0はEnvoyにおけるClient Closed
Connection)
#| structural_log_uri =~ &quot;/sample/.*&quot; # URIが/sample/から始まるログのみを表⽰する
#| structural_log_reqtime &gt; 3 # レスポンスタイムが3秒以上のリクエストのみを表⽰する
#| structural_log_ua !~ &quot;.*[bB]ot.*&quot; # UAにBotを含まないログのみを表⽰する
#| stream = &quot;stderr&quot; # 標準エラーのみを表⽰する
#|= &quot;ERROR&quot; # ERRORという⽂字列を含むログのみを表⽰する
| metadata_version =~ &quot;main|canary&quot;
| line_format &quot;[version={{ $.metadata_version }}] [pod={{ $.metadata_pod_name }}] [container={{ $.metadata_container_name }}] [stream={{
$.stream }}]\n{{ $structural_log := index (fromJson $.raw) \&quot;structural_log\&quot; }}{{ if $structural_log }}{{ range $k, $v := $structural_log
}}\033[1;33m{{$k}}\033[0m={{ $v }}\n{{ end }}{{ else }}{{ $.message }}{{ end }}&quot;
24
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 25

![Page Image](https://bcdn.docswell.com/page/972GQNKW7R.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/DJYVWPN9JM.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/V7NM95XDE8.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/YJ9N2Y88J3.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/GJ8K568ZED.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/LJLZY9R17R.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/47MVNZR57W.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/P7R2D6RZJ9.jpg)

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


# Page. 33

![Page Image](https://bcdn.docswell.com/page/PJXD1MR1EX.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/3JKX2GRMED.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/LE354N82J5.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/8EDDQWM6EG.jpg)

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
out_forward
nginx
plugin
/var/log/containers/*
2023-11-23T04:35:01.025619037Z stdout F
{&quot;x-client-ip&quot;:&quot;xxx.xxx.xxx.xxx&quot;,&quot;size&quot;:0,&quot;uri&quot;:&quot;/foo?bar=baz&quot;,&quot;referer&quot;:&quot;https://example.com
/&quot;,&quot;forwardedfor&quot;:&quot;xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx&quot;,&quot;ua&quot;:&quot;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&quot;,&quot;traceparent&quot;:&quot;00-5e031fd77a5c4d6a7480e6a1c55e3797-38976629a94401c6-01&quot;,&quot;time&quot;:&quot;2023-11-23T04:35:00.46
8Z&quot;,&quot;method&quot;:&quot;GET&quot;,&quot;status&quot;:200,&quot;host&quot;:&quot;xxx.xxx.xxx.xxx&quot;,&quot;scheme&quot;:&quot;http&quot;,&quot;vhost&quot;:&quot;service-foo&quot;,&quot;reqtime&quot;:37,&quot;protocol&quot;:&quot;H
TTP/1.1&quot;}
●
●
36
uri, method, statusをlabelにしたメトリクスを作成する
reqtimeからhistogramを作成しavg/50%/90%/99%tileなど計算できるようなメトリクスを作成する
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 37

![Page Image](https://bcdn.docswell.com/page/V7PXL9QZE8.jpg)

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
out_forward
nginx
plugin
/var/log/containers/*
2023-11-23T04:35:01.025619037Z stdout F
{&quot;x-client-ip&quot;:&quot;xxx.xxx.xxx.xxx&quot;,&quot;size&quot;:0,&quot;uri&quot;:&quot;/foo?bar=baz&quot;,&quot;referer&quot;:&quot;https://example.com
/&quot;,&quot;forwardedfor&quot;:&quot;xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx&quot;,&quot;ua&quot;:&quot;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&quot;,&quot;traceparent&quot;:&quot;00-5e031fd77a5c4d6a7480e6a1c55e3797-38976629a94401c6-01&quot;,&quot;time&quot;:&quot;2023-11-23T04:35:0
0.468Z&quot;,&quot;method&quot;:&quot;GET&quot;,&quot;status&quot;:200,&quot;host&quot;:&quot;xxx.xxx.xxx.xxx&quot;,&quot;scheme&quot;:&quot;http&quot;,&quot;vhost&quot;:&quot;service-foo&quot;,&quot;reqtime&quot;:37,&quot;prot
ocol&quot;:&quot;HTTP/1.1&quot;}
regexp:
exact_match:
forward_match:
- /foo
- /api/v1/bar
- /api/v1/baz
uriをそのまま利⽤してしまうとcardinalityが⾼くなりすぎるので抽出するuriはリスト形式にして管理
37
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 38

![Page Image](https://bcdn.docswell.com/page/2JVLQM5M7Q.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/5EGXWG6XJL.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/4JQ83X457P.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/K74216QVJ1.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/LJ1MGVP4EG.jpg)

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
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. 本書の無断転載、複製を固く禁じます。


# Page. 43

![Page Image](https://bcdn.docswell.com/page/GJW3KL2ZJ2.jpg)

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
Lighthouse-exporter
LCP (Largest Contentful Paint)
FID (First Input Delay)
CLS (Cumulative Layout Shift)
…
/metrics
※ 実際はheadlessモード
lighthouse_audit{id=&quot;l
argest-contentful-paint
&quot;,unit=&quot;millisecond&quot;,ur
i=&quot;https://example.com
/&quot;,form_factor=&quot;mobile
&quot;} 1300.000
…
# simple usage, required `interval` millisecond
npm start -- --interval 600000 --targets https://example.com/
43
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 44

![Page Image](https://bcdn.docswell.com/page/4EZVZMDLJ3.jpg)

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


# Page. 45

![Page Image](https://bcdn.docswell.com/page/Y765ZN1MEV.jpg)

「より良い可観測性」を⼿に⼊れるメトリクス活⽤事例
プラットフォーム上での展開
lighthouseExporter:
enabled: true
interval: 86400
targets:
- https://example.com/
コードジェネレータ
manifest
lighthouse_audit{id=&quot;l
argest-contentful-paint
&quot;,unit=&quot;millisecond&quot;,ur
i=&quot;https://example.com
/&quot;,form_factor=&quot;mobile
&quot;} 1300.000
…
プラットフォームを利⽤する
各サービスが定義する設定ファイルに設定
45
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 46

![Page Image](https://bcdn.docswell.com/page/G75YW54Q74.jpg)

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


# Page. 47

![Page Image](https://bcdn.docswell.com/page/9J2GQNVWJR.jpg)

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


# Page. 48

![Page Image](https://bcdn.docswell.com/page/DEYVWP39EM.jpg)

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


# Page. 49

![Page Image](https://bcdn.docswell.com/page/VJNM95VD78.jpg)

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


# Page. 50

![Page Image](https://bcdn.docswell.com/page/YE9N2Y68E3.jpg)

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


# Page. 51

![Page Image](https://bcdn.docswell.com/page/GE8K56ZZ7D.jpg)

「より良い可観測性」のための分散トレーシング
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. 本書の無断転載、複製を固く禁じます。


# Page. 52

![Page Image](https://bcdn.docswell.com/page/LELZY9D1JR.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/4JMVNZP5JW.jpg)

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


# Page. 54

![Page Image](https://bcdn.docswell.com/page/PJR2D61ZE9.jpg)

「より良い可観測性」のための分散トレーシング
TraceQL
{ .http.method = “POST”} | count() &gt; 2
http.method: POST
{ span.http.status_code &gt;= 400 &amp;&amp; span.http.status_code &lt; 500 }
bad request
ref. https://grafana.com/docs/tempo/latest/traceql/
54
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 55

![Page Image](https://bcdn.docswell.com/page/PEXD1MY17X.jpg)

「より良い可観測性」のための分散トレーシング
TraceQL
{.service.name=&quot;service-a&quot;} &gt;&gt; {.net.peer.name=&quot;db.example.com&quot; &amp;&amp; .db.operation = &quot;CONNECT&quot; &amp;&amp; duration &gt;= 100ms}
●
●
`service-a` を親のspanとしてもつ⼦孫span
データベース db.example.com への接続操作を⾏い、その操作が100ミリ秒より⼤きいspanを特定
親
子
孫
55
db.example.com
© LIFULL Co., Ltd. 本書の無断転載、複製を固く禁じます。


# Page. 56

![Page Image](https://bcdn.docswell.com/page/3EKX2G3M7D.jpg)

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


# Page. 57

![Page Image](https://bcdn.docswell.com/page/L7354NG2E5.jpg)

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


# Page. 58

![Page Image](https://bcdn.docswell.com/page/87DDQW167G.jpg)



