Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オブザーバビリティ入門

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 オブザーバビリティ入門

Avatar for Cybozu

Cybozu PRO

July 13, 2023
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. 9 ビジネス ü ユーザーの利⽤状況を 分析し、ビジネス上の 意志決定に利⽤ ü 従量課⾦ 運⽤ ü

    障害時のアラート ü 問題箇所の発⾒ ü オートスケーリング ü プログレッシブデリバ リーの実現 開発・テスト ü 性能測定 ü デバッグ ü ユーザーの利⽤状況に 応じた機能の改善 ü Flaky Testの発⾒ ü テスト時間の分析 オブザーバビリティの⽤途
  2. ログの集め⽅ 14 App Container Runtime App Agent Agent ファイルに ログを出⼒

    ファイルに ログを出⼒ 標準出⼒/ 標準エラー出⼒ ストレージ に保存 ファイルからログを読む。 必要に応じてローテーション
  3. 構造化ログの出⼒例 ▶ JSON形式 16 {"severity":"INFO", "logged_at":"2023-05-15T04:47:09.882Z", "caller":"zap/options.go:212", "message":"finished unary call

    with code OK", "service":"sample", "utsname":"sample-57cfb5bf75-hbgjr", "grpc.start_time":"2023-05-15T04:47:09Z", "system":"grpc", "span.kind":"server", "grpc.service":"sample.v2beta2.Clusters", "grpc.method":"Join", "grpc.code":"OK", "grpc.time_ms":4.534} time="2023-05-15T04:50:27Z" level=info msg="Reconciliation completed" application=argocd/worker dedup_ms=0 dest-name= dest-namespace=worker dest-server="https://kubernetes.default.svc" diff_ms=49 fields.level=2 git_ms=16 health_ms=4 live_ms=9 settings_ms=0 sync_ms=0 time_ms=125 ▶ logfmt形式
  4. ログ出⼒のライブラリ ▶ ファイルや標準出⼒・標準エラー出⼒に出⼒ ▶ 各⾔語で⽤意されているライブラリを使う n Java: logback n Go:

    zapなど ▶ ログ出⼒はパフォーマンスやファイル書き込みなどで注意す べき点が多いので、⾃作は避けよう。 17
  5. ログのレベル ログレベル ⽤途 CRITICAL 即座に終了するような致命的なエラーが発⽣した。 ERROR データベースやファイルに書き込めないなど、リクエストの処理またはプロセス⾃体が続 ⾏不可能になる問題が発⽣した。 スタックトレースとか、ソフトウェアが実⾏したアクションの結果など、問題の診断情報 を⼗分に出⼒する。

    WARN 処理を打ち切る必要がなく、今のところ正常に続⾏できるが、将来的に問題につながり得 る事象が発⽣した。将来何か問題があったとき、真っ先に⾒返してほしいログ。 潜在的な問題。リソースがキャパシティに近いとか。何かアクションが必要な物。 INFO 正常な動作の軌跡。サーバが起動したとかリクエストが来たとか。 外界に影響を与える処理は info ログを出す。繰り返し処理の開始・終了時に info ログを 出す。 nice-to-haveなインフォメーション。”Service started”とか”Listening on port 5050”とか。 DEBUG 関数の出⼊りの記録や⽂字列解析の途中結果など、デバッグ⽤の情報。 productionでは通常無効化しておき、問題が起きたときに有効化する。 18
  6. LogQLの例 23 {job=~"argocd/.*"} |= "Reconciliation completed" | logfmt | time_ms

    > 1000 | line_format "{{.application}}: {{.time_ms}}" n {label="value"} でラベルによる絞り込み。=~ で正規表現指定 n |= で grep による絞り込み n logfmt や json で構造化ログをパースして絞り込み n line_format で指定した形式でログを表⽰
  7. メトリクス ▶ メトリクスとは n アプリケーションやシステムの挙動に関する様々な統計情報 n ⼀定周期で統計情報を収集し、時系列データとして記録する ▶ メトリクスによって分かること n

    現在のアプリケーションの状態 n 過去のある時点でアプリケーションがどのような状態だったか n ある期間内に状態がどのように変化したか 26
  8. メトリクス収集の仕組み 27 App Push Gateway Agent OS Exporter App Service

    Agent Agent ジョブの完了時など にメトリクスをpush サーバーやOSに関する 情報などを収集 ストレージ に保存 周期的(Necoでは30秒)にAPI を実⾏してメトリクスを収集
  9. Prometheus形式のメトリクス例 29 # HELP http_server_api_requests_total A counter for requests to

    the wrapped handler. # TYPE http_server_api_requests_total counter http_server_api_requests_total{code="200",method="get"} 157 http_server_api_requests_total{code="500",method="get"} 16 http_server_api_requests_total{code="200",method="post"} 21 http_server_api_requests_total{code="500",method="post"} 3 # HELP http_server_request_duration_seconds A histogram of latencies for requests. # TYPE http_server_request_duration_seconds histogram http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="0.25"} 99 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="0.5"} 190 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="1"} 343 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="2.5"} 343 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="5"} 343 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="10"} 343 http_server_request_duration_seconds_bucket{handler="/api/v1/todo",method="get",le="+Inf"} 343 http_server_request_duration_seconds_sum{handler="/api/v1/todo",method="get"} 157.30460066099994 http_server_request_duration_seconds_count{handler="/api/v1/todo",method="get"} 343 ラベル 値 メトリクス名
  10. メトリクスとして出⼒する情報の例 ▶ インフラ n コンテナごとのCPUやメモリ、ディスクの使⽤量 n Kubernetesのリソースに関する情報 ▶ アプリケーション n

    リクエスト数、エラーの数、キャッシュヒット率、CPUやI/Oを利⽤ する処理にかかる時間、リモート呼び出しの処理の回数や時間など n そのほか有⽤な物はなんでも出しておくのがおすすめ 30
  11. メトリクス名の付け⽅ ▶ 名前の付け⽅ n https://prometheus.io/docs/practices/naming/ 31 http_server_request_duration_seconds_bucket チーム名や製品名などメトリクスを分類するための プレフィックスを付ける(例: kintone_ap_,

    mysql_) 必要に応じてサフィックスを付ける 総カウント数→total ヒストグラム→bucketなど 必要に応じて単位を付ける seconds, bytesなど メトリクスの内容を表す 名前を付ける
  12. ラベル設計の注意点 ▶ ⾼いカーディナリティのラベルを避ける。 n 分析時の性能劣化やデータ容量の肥⼤化を引き起こす可能性がある。 ▶ メトリクスにセンシティブな情報を含めない。 33 http_server_requests_total{method="GET", userid="0000830"}

    HTTPのメソッドは、GET, POST, DELETEなど決まった ものしかないのでカーディナ リティが低い。 ユーザーIDは⾮常に種類が多く カーディナリティが⾼い。 またセンシティブなデータ。
  13. 35 Histogram 観測値の集計データ 例: HTTPリクエストサ イズや、リクエストの レイテンシー Gauge 現在の値を⽰す 例:

    ディスクの使⽤量、 CPUの使⽤率 Counter 増加する値を⽰す 例: APIのリクエスト数 の累計、パケットの合 計受信サイズ メトリクスのタイプ
  14. メトリクス設計の⽅法論 ▶ RED(Request Rate, Request Error Rate, Request Duration) n

    リクエストにおけるエラーの割合とかかった時間。 n サービスの利⽤ユーザーへの影響が分かりやすい指標。 ▶ USE(Utilization, Errors, Saturation) n リソースの利⽤率、エラー数、飽和状態の割合。 n データベースやメッセージキューなどに適した指標。 ▶ The Four Golden Signals(Latency, Traffic, Errors, Saturation) n ユーザー向け、⾮ユーザー向けのどちらにも使える指標。 36
  15. PromQLの例 38 # APIのリクエストにかかった時間の99パーセンタイルをverbごとに集計 histogram_quantile(0.99, sum by (verb, le) (

    rate(apiserver_request_duration_seconds_bucket{}[5m]) ) ) n histogram_quantile で分位数(パーセンタイル)を計算 n sum で合計値を計算 n rate で秒間あたりの変化数を計算
  16. トレースとスパン 42 Span Nginx Kintone Slash MySQL Span /api Span

    /auth Span /items Span /auth Span SELECT Span SELECT Span INSERT time Trace スパン 作業や操作の単位 トレース 複数のスパンで構成 されるリクエストの 開始から終了までの単位
  17. スパンデータの例 45 { "resource_spans": [ { "resource": { "attributes": [

    { "key": "service.name", "value": { "stringValue": "my.service" } } ] }, "scope_spans": [ { "spans": [ { "traceId": "5B8EFFF798038103D269B633813FC60C", "spanId": "EEE19B7EC3C1B174", "parentSpanId": "EEE19B7EC3C1B173", "name": "I'm a server span", "startTimeUnixNano": 1544712660000000000, "endTimeUnixNano": 1544712661000000000, "kind": 2, "attributes": [ { "key": "my.span.attr", "value": { "stringValue": "some value" } サービス名などコンポーネント に固有の情報 トレースやスパンを識別するた めのID、開始時間と終了時間、 その他スパンに関する様々な情 報を含める
  18. Attributesに何を含めるべきか ▶ ResourceのAttributes n サービス名やnamespace, バージョン情報など n Conventions n https://opentelemetry.io/docs/specs/otel/resource/semantic_conventions/

    ▶ SpanのAttributes n HTTPのステータスコード、メソッド、URL、クライアントIPなど n Conventions n https://opentelemetry.io/docs/specs/otel/trace/semantic_conventions/ 46