Slide 1

Slide 1 text

Spring Boot 3.0 オブザーバビリティツアーガイド 2023.2.17 JSUG勉強会 2023年 その1 髙野はいね(@hainet50b)

Slide 2

Slide 2 text

自己紹介 決済代行事業者にてソフトウェアエンジニアとして勤務。 ▼主な業務▼ ・決済システム(Java, Spring Boot, VMWare Tanzu)の開発/運用 ・データの整理と運用ダッシュボード構築 先日JSUGにスタッフとして参加させていただきました󰢛 髙野はいね ( @hainet50b) I ♡ Spring Boot!

Slide 3

Slide 3 text

旅のしおり Spring Boot 3.0で追加された機能を使いながら、 シンプルなSpring Bootアプリケーションに オブザーバビリティ機能を追加していくデモ中心のセッションです。 ▼日程表▼ ● 本日のツアーのご紹介(10分) ● オブザーバビリティツアー(45分) ● ダッシュボードを触ってみよう!(15分)

Slide 4

Slide 4 text

1 本日のツアーのご紹介

Slide 5

Slide 5 text

現在地

Slide 6

Slide 6 text

目的地

Slide 7

Slide 7 text

旅程表

Slide 8

Slide 8 text

Logging

Slide 9

Slide 9 text

Metrics Micrometer

Slide 10

Slide 10 text

Tracing Micrometer Tracing Micrometer Observation

Slide 11

Slide 11 text

事前準備・進め方 ▼事前準備▼ ・各種ミドルウェアはセットアップ済みです。  (Elasticsearch, Kibana, Filebeat, Prometheus, Grafana, Zipkin, RabbitMQ) ・ラボ環境のソースコードは事前に準備したものを使います。  → https://github.com/hainet50b/jsug-seminar-2023-02 ・Kibana / Grafanaダッシュボードはセットアップ済みです。 ▼進め方▼ ・質問はできる限りリアルタイムで拾います。 ・「こんな風にしたらどうなる?」も時間の限り試します。  

Slide 12

Slide 12 text

2 オブザーバビリティツアー

Slide 13

Slide 13 text

本日一番言葉にするのが難しいところ... 0. オブザーバビリティとは

Slide 14

Slide 14 text

データ(ログ・メトリクス・トレース)に 様々な文脈を付与することで、 あらゆる切り口から日々継続的かつ能動的に、 何かがあっても、なくても、 問題を探しにいく or 問題を探しにいけるようにする試み 0. オブザーバビリティとは 各種ダッシュボードで実現する Spring Observabilityで実現する あえて自分の言葉で...

Slide 15

Slide 15 text

1. ログ基盤を整える

Slide 16

Slide 16 text

1. ログ基盤を整える ログをtailして文脈を見極めるのは極めて困難(DEMO)

Slide 17

Slide 17 text

1. ログ基盤を整える Filebeatを経由してElasticsearchにログを投入する

Slide 18

Slide 18 text

1. ログ基盤を整える Filebeatの設定 filebeat.inputs: - type: filestream id: jsug-seminar-2023-02 enabled: true # 初期設定でfalseとなっているので注意 paths: - C:\Users\haine\project\inbox\jsug-seminar-2023-02\payment-gateway\log\* - C:\Users\haine\project\inbox\jsug-seminar-2023-02\log-ingester\log\* - C:\Users\haine\project\inbox\jsug-seminar-2023-02\credit-service\log\* - C:\Users\haine\project\inbox\jsug-seminar-2023-02\qr-service\log\*

Slide 19

Slide 19 text

1. ログ基盤を整える Kibanaで確認する(DEMO)

Slide 20

Slide 20 text

2. ログを構造化する

Slide 21

Slide 21 text

ただ入れただけのログはあまり役に立たないが、 アプリ/環境ごとにパーサーを作るのも大変。 2. ログを構造化する

Slide 22

Slide 22 text

▼ECS (Elastic Common Schema)▼  標準化されたフィールド定義を提供するスキーマ  ログを正規化して、  ・複数データソースを透過的に取り扱えるようにする  ・ダッシュボードをあらゆるアプリケーションに対応させる ▼ECS Logging▼  ログをElasticsearchに最適化した  JSON形式に構造化するプラグイン 2. ログを構造化する

Slide 23

Slide 23 text

ECS Loggingの依存を追加する 2. ログを構造化する co.elastic.logging log4j2-ecs-layout 1.5.0 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-log4j2 後述しますが 相性が良いためLog4j2を採用します。

Slide 24

Slide 24 text

Appenderの設定をする 2. ログを構造化する

Slide 25

Slide 25 text

2. ログを構造化する 任意の項目を付与する // MDC for Logback & Log4j2 MDC.put("key.foo", "value-1"); MDC.put("key.bar", "value-2"); // Slf4j for Log4j2 Logger log = LoggerFactory.getLogger(PaymentGatewayApplication.class); log.atInfo() .setMessage("Some message.") .addKeyValue("key.foo", "value-1") .addKeyValue("key.bar", "value-2") .log(); // Log4j2 Logger log = LogManager.getLogger(PaymentGatewayApplication.class); log.info(new StringMapMessage() .with("key", Map.of( "foo", "value-1", "bar", "value-2" )) );

Slide 26

Slide 26 text

Filebeatの設定 2. ログを構造化する filebeat.inputs: - ... parsers: - ndjson: overwrite_keys: true add_error_key: true expand_keys: true # .(ドット)区切りをパラメータとして展開する。

Slide 27

Slide 27 text

Kibanaでドキュメントを確認する(DEMO) 2. ログを構造化する

Slide 28

Slide 28 text

2. ログを可視化する

Slide 29

Slide 29 text

Kibanaダッシュボードを確認する(DEMO) 3. ログを可視化する

Slide 30

Slide 30 text

寄り道:メトリクスとMicrometer

Slide 31

Slide 31 text

▼Micrometerとは▼ メトリクスのFacadeの役割をするライブラリ ※Spring Boot Actuatorの依存関係に含まれている。 寄り道:メトリクスとMicrometer Micrometerにおいて「メトリクス」とは「収集してデータストアに保存するもの」という前提がある。 「収集する実装とデータストア実装を意識しなくてよくなるもの」という理解で良さそう。 Appはデータストアを意識しなくて良い Micrometerではデータストアのことを Registryと呼ぶ。

Slide 32

Slide 32 text

4. メトリクスを収集する

Slide 33

Slide 33 text

アプリケーションとデータストアの関係 4. メトリクスを収集する アプリケーション側に エンドポイントを用意する

Slide 34

Slide 34 text

Registryの依存関係を追加する 4. メトリクスを収集する org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-registry-prometheus micrometer-registry-elastic micrometer-registry-datadog etc…

Slide 35

Slide 35 text

Prometheus用エンドポイントを追加する 4. メトリクスを収集する management: endpoints: web: exposure: include: health, prometheus

Slide 36

Slide 36 text

prometheus.yml 4. メトリクスを収集する scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "payment-gateway" metrics_path: "/actuator/prometheus" static_configs: - targets: ["localhost:8080"] labels: application: "payment-gateway" ...

Slide 37

Slide 37 text

5. メトリクスを可視化する

Slide 38

Slide 38 text

Grafanaでダッシュボードをインポート → https://grafana.com/grafana/dashboards/12900-springboot-apm-dashboard/ 5. メトリクスを可視化する

Slide 39

Slide 39 text

Grafanaダッシュボードを確認する(DEMO) 5. メトリクスを可視化する

Slide 40

Slide 40 text

寄り道:分散トレーシングと     Micrometer Tracing

Slide 41

Slide 41 text

▼分散トレーシングとは▼ ネットワークを跨るプロセス間の一連の処理に 一意のIDを採番することで処理を論理的に紐づけること 寄り道:分散トレーシングと     Micrometer Tracing スレッド間 コンポーネント間、etc… t Span A@App A Span B@App B Trace α TraceはSpanの集合 SpanとTraceはそれぞれ一意のIDを持つ

Slide 42

Slide 42 text

▼Context Propagationとは▼ プロセス間でトレースデータを受け渡すこと。 Spring Boot 3.0では以下の二つの規約に対応している。 ・W3C Trace Context(Spring Boot 3.0のデフォルト) ・B3 Propagation(Spring Cloud Sleuthのデフォルト) 寄り道:分散トレーシングと     Micrometer Tracing ≒プロトコル 設定でW3Cに変更可能

Slide 43

Slide 43 text

▼Micrometer Tracingとは▼ 分散トレーシングライブラリのFacade (TracerBridgeを提供) ※Spring Cloud Sleuthの後継ライブラリ ▼分散トレーシングライブラリの役割▼ Tracer:観測範囲を決めること Reporter (Exporter):トレースデータを外部に送信すること 寄り道:分散トレーシングと     Micrometer Tracing Spring Boot 3.0より Spring Boot 2系で使われていた

Slide 44

Slide 44 text

▼Micrometer Tracingが対応する分散トレーシング実装▼ Spring Boot 3.0より 寄り道:分散トレーシングと     Micrometer Tracing Zipkin Brave ・Zipkin系列の実装 ・Spring Cloud Sleuthで採用 ・B3 Propagationも仲間 Spring Boot 3.0より OpenTelemetry (OTel) ・CNCF系列の実装 ・最近勢いがある 業務シーンで乗り換え検討中 慣れていて実績があるので 今日はこちらを採用します 󰢛

Slide 45

Slide 45 text

6. トレースデータを送信する

Slide 46

Slide 46 text

依存関係を追加する 6. トレースデータを送信する io.micrometer micrometer-tracing-bridge-brave io.zipkin.reporter2 zipkin-reporter-brave 採用する実装に対応する TracerBridgeの依存 採用する実装の依存

Slide 47

Slide 47 text

サンプリングレートとZipkinの設定をする 6. トレースデータを送信する spring: application: name: payment-gateway management: tracing: enabled: true sampling: probability: 1.0 propagation: type: w3c zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans トレースデータを送信する頻度のこと。 目的によって100%かそれ以外に設定する。 ・一連の処理を追うことが目的  →100% ・特定の処理の平均処理時間などを取ることが目的  →1%や場合によっては0.1%など 私は100%を採用する目的でしか使用したことがありません。 トレースデータに含まれる サービス名になるため必ず付与する

Slide 48

Slide 48 text

7. トレースデータを可視化する

Slide 49

Slide 49 text

Zipkin UI(DEMO) 7. トレースデータを可視化する

Slide 50

Slide 50 text

Zipkinのデータストアを インメモリからElasticsearchに変更してKibanaで可視化する 7. トレースデータを可視化する Zipkin UIは横軸の可視化

Slide 51

Slide 51 text

Zipkinのデータストアを インメモリからElasticsearchに変更してKibanaで可視化する 7. トレースデータを可視化する 縦軸の可視化にKibanaを使う

Slide 52

Slide 52 text

Zipkinのデータストアを インメモリからElasticsearchに変更してKibanaで可視化する 7. トレースデータを可視化する $STORAGE_TYPE="elasticsearch" $ES_HOSTS="http://localhost:9200" $ES_USERNAME="elastic" $ES_PASSWORD="changeme" java -jar zipkin-server-2.24.0-exec.jar 環境変数で設定を変更する ※重要 ZipkinがES 8系に対応していない。 Kibanaによる可視化は要のため、 乗り換えも検討をしている。

Slide 53

Slide 53 text

Kibanaのダッシュボードを確認する(DEMO) 7. トレースデータを可視化する

Slide 54

Slide 54 text

寄り道:Micrometer Observation API

Slide 55

Slide 55 text

▼Micrometer Observation APIとは▼ 以下の役割を持つAPIです。 ・観測の開始と終了を指定する。 ・観測イベントに対して実装を差し込む。 ・デフォルトのタグを指定する。 MicrometerやMicrometer Tracingを更に抽象化する。 ※Observation API経由で時間を測ったりSpanを切れる 寄り道:Micrometer Observation API Spring Boot 3.0 (Micrometer 1.10)で追加された

Slide 56

Slide 56 text

寄り道:Micrometer Observation API ※イメージ図

Slide 57

Slide 57 text

寄り道:Micrometer Observation API @Observed(name = "exchange", contextualName = "exchange") public void target() { // do something. } private final ObservationRegistry registry; public PaymentGatewayApplication(ObservationRegistry registry) { this.registry = registry; } public void observed() { Observation .createNotStarted("exchange", registry) .observe(() -> { // do something. }); } @Observed ObservationRegistry

Slide 58

Slide 58 text

3 ダッシュボードを触ってみよう!

Slide 59

Slide 59 text

DEMO

Slide 60

Slide 60 text

▼Spring Boot ▼ ● Spring Actuator Production-ready Features: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html ● Spring Cloud Sleuth: https://docs.spring.io/spring-cloud-sleuth/docs/current-SNAPSHOT/reference/html/ ▼Mircometer▼ ● Micrometer: https://micrometer.io/ ● Micrometer API: https://micrometer.io/docs/concepts ● Micrometer Tracing: https://micrometer.io/docs/tracing ● Micrometer Observation: https://micrometer.io/docs/observation ▼Context Propagation▼ ● W3C Trace Context: https://www.w3.org/TR/trace-context/ ● B3 Propagation: https://github.com/openzipkin/b3-propagation 参考文献 1/3

Slide 61

Slide 61 text

▼Elastic ▼ ● Elasticsearch: https://www.elastic.co/jp/elasticsearch/ ● ECS(Elastic Common Schema): https://www.elastic.co/guide/en/ecs/current/ecs-reference.html ● FIlebeatの設定: https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation-configu ration.html ▼Prometheus / Grafana▼ ● Prometheus: https://prometheus.io/ ● Grafana: https://grafana.com/ ● 参考ダッシュボード: https://grafana.com/grafana/dashboards/12900-springboot-apm-dashboard/ 参考文献 2/3

Slide 62

Slide 62 text

▼Zipkin / OpenTelemetry▼ ● Zipkin: https://zipkin.io/ ● OpenTelemetry: https://opentelemetry.io/ 参考文献 3/3

Slide 63

Slide 63 text

Thanks!!