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

2023.2.17 - Spring Boot 3.0 オブザーバビリティツアーガイド

hainet50b
February 17, 2023

2023.2.17 - Spring Boot 3.0 オブザーバビリティツアーガイド

▼開催日▼
2023年2月17日

▼イベント▼
JSUG勉強会 2023年 その1
https://jsug.doorkeeper.jp/events/151317

▼配信アーカイブ▼
https://www.youtube.com/watch?v=yjJ1jyvEaOI

▼関連リポジトリ▼
https://github.com/hainet50b/jsug-seminar-2023-02

hainet50b

February 17, 2023
Tweet

More Decks by hainet50b

Other Decks in Programming

Transcript

  1. 事前準備・進め方 ▼事前準備▼ ・各種ミドルウェアはセットアップ済みです。  (Elasticsearch, Kibana, Filebeat, Prometheus, Grafana, Zipkin, RabbitMQ)

    ・ラボ環境のソースコードは事前に準備したものを使います。  → https://github.com/hainet50b/jsug-seminar-2023-02 ・Kibana / Grafanaダッシュボードはセットアップ済みです。 ▼進め方▼ ・質問はできる限りリアルタイムで拾います。 ・「こんな風にしたらどうなる?」も時間の限り試します。  
  2. 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\*
  3. ECS Loggingの依存を追加する 2. ログを構造化する <dependency> <groupId>co.elastic.logging</groupId> <artifactId>log4j2-ecs-layout</artifactId> <version>1.5.0</version> </dependency> <dependency>

    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> 後述しますが 相性が良いためLog4j2を採用します。
  4. Appenderの設定をする 2. ログを構造化する <?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <File name="ECS_FILE"

    fileName="log/payment-gateway.log"> <EcsLayout serviceName="payment-gateway" serviceVersion="0.0.1-SNAPSHOT" /> </File> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="ECS_FILE"/> </Root> </Loggers> </Configuration>
  5. 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" )) );
  6. Filebeatの設定 2. ログを構造化する filebeat.inputs: - ... parsers: - ndjson: overwrite_keys:

    true add_error_key: true expand_keys: true # .(ドット)区切りをパラメータとして展開する。
  7. 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" ...
  8. ▼Context Propagationとは▼ プロセス間でトレースデータを受け渡すこと。 Spring Boot 3.0では以下の二つの規約に対応している。 ・W3C Trace Context(Spring Boot

    3.0のデフォルト) ・B3 Propagation(Spring Cloud Sleuthのデフォルト) 寄り道:分散トレーシングと     Micrometer Tracing ≒プロトコル 設定でW3Cに変更可能
  9. ▼Micrometer Tracingとは▼ 分散トレーシングライブラリのFacade (TracerBridgeを提供) ※Spring Cloud Sleuthの後継ライブラリ ▼分散トレーシングライブラリの役割▼ Tracer:観測範囲を決めること Reporter

    (Exporter):トレースデータを外部に送信すること 寄り道:分散トレーシングと     Micrometer Tracing Spring Boot 3.0より Spring Boot 2系で使われていた
  10. ▼Micrometer Tracingが対応する分散トレーシング実装▼ Spring Boot 3.0より 寄り道:分散トレーシングと     Micrometer Tracing Zipkin Brave

    ・Zipkin系列の実装 ・Spring Cloud Sleuthで採用 ・B3 Propagationも仲間 Spring Boot 3.0より OpenTelemetry (OTel) ・CNCF系列の実装 ・最近勢いがある 業務シーンで乗り換え検討中 慣れていて実績があるので 今日はこちらを採用します 󰢛
  11. サンプリングレートと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%を採用する目的でしか使用したことがありません。 トレースデータに含まれる サービス名になるため必ず付与する
  12. 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による可視化は要のため、 乗り換えも検討をしている。
  13. 寄り道: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
  14. ▼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
  15. ▼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