ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿป
‘๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๋ฆฌํ€˜์ŠคํŠธ ์ถ”์ ์„ ์œ„ํ•œ Spring cloud Sleuth’, 'spring docs'๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

 

Spring Cloud Sleuth

Spring Cloud Sleuth automatically instruments all your Spring applications, so you should not have to do anything to activate it. The instrumentation is added by using a variety of technologies according to the stack that is available. For example, for a s

docs.spring.io

Microservices์—์„œ Request ์ถ”์ ์—์„œ์˜ ๋ฌธ์ œ์ 

A ์„œ๋ฒ„์™€ B ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

  1. A ์„œ๋ฒ„์— 2๊ฐœ์˜ ์š”์ฒญ์ด ๋“ค์–ด์™€์„œ B์„œ๋ฒ„์— ์ˆœ์„œ๋Œ€๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ B ์„œ๋ฒ„์—์„œ๋Š” ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. A์™€ B ์‚ฌ์ด์— ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์—†๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์—ฐ๊ด€๊ด€๊ณ„๋„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค์–ด์ง„๋‹ค.
    1. ์ž„์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ€์–ด๋„ฃ์–ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. ⇒ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์€ ์‹ค์Šต ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฌ๋‹ค.
  3. A์—์„œ ํ˜ธ์ถœํ•œ ์‹œ๊ฐ„๊ณผ B์—์„œ์˜ ์—๋Ÿฌ ์‹œ๊ฐ„์ด ๋งŽ์€ ์‹œ๊ฐ„์ด ์ฐจ์ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
    1. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•œ ๋ˆˆ์— ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค์–ด์ง„๋‹ค.
  4. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ํด๋ฆฌ๊ธ€๋ž์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ค‘๊ฐ„์— Redis, Kafka, RabbitMQ์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ฒฝ์œ ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿค”
์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ Spring Cloud์—์„œ ์ œ๊ณตํ•˜๋Š” Sleuth๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค!

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์š”์ฒญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ‘Distributed tracing’ ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ํ•œ ๋ฒˆ ์•Œ์•„๋ณด์ž.

Distributed tracing(๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค)

opentracing ํ™ˆํŽ˜์ด์ง€์— ์†Œ๊ฐœ๋˜์–ด ์žˆ๋Š” Distributed tracing์— ๋Œ€ํ•œ ๊ธ€์„ ๋ฒˆ์—ญํ–ˆ๋‹ค.

 

What is Distributed Tracing?

Distributed tracing, also called distributed request tracing, is a method used to profile and monitor applications, especially those built using a microservices architecture. Distributed tracing helps pinpoint where failures occur and what causes poor perf

opentracing.io

Distributed tracing์˜ ์ •์˜

Distributed Request Tracing์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ํŠนํžˆ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์žฅ์†Œ์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์›์ธ์„ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค”
Distributed tracing๋ฅผ ๋ˆ„๊ฐ€ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

IT ํŒ€๊ณผ DevOps ํŒ€์€ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๋“ฑ์˜ ์ตœ์‹  ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋””๋ฒ„๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ๋ถ„์‚ฐ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ํšจ์œจ์ ์ธ ์ฝ”๋“œ์™€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ „๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ์ž ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ์€ sleuth์˜ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„๋ณด์ž.

๋‹ค์Œ ํ•ญ์—์„œ๋Š” ์ €๋ฒˆ ํฌ์ŠคํŒ… ๋•Œ ์‚ดํŽด๋ณธ ์•„๋ž˜์˜ ์ด๋ฏธ์ง€์— ๋‚˜ํƒ€๋‚œ ์˜ˆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

Distributed Tracing with Zipkin

์œ„ ์ด๋ฏธ์ง€์—์„œ๋Š” 7๊ฐœ์˜ span์ด ์กด์žฌํ•œ๋‹ค.

Zipkin ๋‚ด ํŠธ๋ ˆ์ด์Šค์— ์ ‘๊ทผํ•˜๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋‘ ๋ฒˆ์งธ ํŠธ๋ ˆ์ด์Šค์—์„œ 7๊ฐœ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, ํŠน์ • ํŠธ๋ ˆ์ด์Šค๋ฅผ ์„ ํƒํ•˜๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด 4๊ฐœ์˜ span์ด ํ‘œ์‹œ๋œ๋‹ค.

ํŠน์ • trace๋ฅผ ์„ ํƒํ•˜๋ฉด Marge๋œ span์ด ํ‘œ์‹œ๋œ๋‹ค.

์ฆ‰, Zipkin์— sr, ss ์–ด๋…ธํ…Œ์ด์…˜ ๋˜๋Š” cr, cs ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” 2๊ฐœ์˜ span์ด ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ 1๊ฐœ์˜ ์ŠคํŒฌ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

๐Ÿค”
์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—๋Š” span์ด 7๊ฐœ, ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ์—๋Š” 4๊ฐœ๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

 

  • ์œ„ ์‚ฌ์ง„์„ ๋ณด๋ฉด Service1์—์„œ๋Š” 1๊ฐœ์˜ span์„ http://start์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
    • sr๊ณผ ss ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • Service1์—์„œ Service2๋ฅผ RPC ํ˜ธ์ถœ์„ ํ†ตํ•ด http://foo๋กœ 2๊ฐœ์˜ span์ด ์ „์†ก๋œ๋‹ค.
    • Service1์—์„œ cs์™€ cr ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
    • Service2์—์„œ sr๊ณผ ss ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
  • Service2์—์„œ Service3๋ฅผ RPC ํ˜ธ์ถœ์„ ํ†ตํ•ด http://bar๋กœ 2๊ฐœ์˜ span์ด ์ „์†ก๋œ๋‹ค.
    • Service2์—์„œ cs์™€ cr ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
    • Service3์—์„œ sr๊ณผ ss ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
  • Service2์—์„œ Service4๋ฅผ RPC ํ˜ธ์ถœ์„ ํ†ตํ•ด http://baz๋กœ 2๊ฐœ์˜ span์ด ์ „์†ก๋œ๋‹ค.
    • Service2์—์„œ cs์™€ cr ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
    • Service4์—์„œ sr๊ณผ ss ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌผ๋ฆฌ์ (Physical) span๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด

  • http:/start์—์„œ 1๊ฐœ
  • service1์—์„œ ํ˜ธ์ถœํ•œ service2์—์„œ 2๊ฐœ,
  • service2 ํ˜ธ์ถœ ์„œ๋น„์Šค3์—์„œ 2๊ฐœ,
  • service2 ํ˜ธ์ถœ ์„œ๋น„์Šค4์—์„œ 2๊ฐœ

์ด 7๊ฐœ์˜ span์ด ์žˆ๋‹ค.

 

๋…ผ๋ฆฌ์ (Logical)์œผ๋กœ๋Š” 4๊ฐœ์˜ span์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ•˜๋‚˜์˜ span๊ณผ RPC ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ์„ธ ๊ฐœ์˜ span์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Visualizing errors

Zipkin์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”์ ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€๊ณ  ์žกํžˆ์ง€ ์•Š์•˜์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” ์ ์ ˆํ•œ ํƒœ๊ทธ๋ฅผ span์— ์„ค์ •ํ–ˆ๋‹ค๋ฉด Zipkin์ด ์ ์ ˆํ•˜๊ฒŒ ๋ณด์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Tracing ๋ชฉ๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

์ด ์ถ”์ ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ์‚ฌํ•œ ๊ทธ๋ฆผ์ด ํ‘œ์‹œ๋œ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ span ์ค‘ ํ•˜๋‚˜๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋‹ค์Œ์ด ํ‘œ์‹œ๋œ๋‹ค.

span์—๋Š” error์˜ ์ด์œ  ๋ฐ error์™€ ๊ด€๋ จ๋œ ์ „์ฒด ์Šคํƒ trace๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

Distributed Tracing with Brave

2.0.0 ๋ฒ„์ „๋ถ€ํ„ฐ spring cloud sleuth๋Š” brave๋ฅผ trace ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋”ฐ๋ผ์„œ sleuth๋Š” ๋” ์ด์ƒ ์ฝ˜ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  brave์—๊ฒŒ ์ž‘์—…์„ ์œ„์ž„ํ•œ๋‹ค.

slueth๊ฐ€ brave์™€ ๋‹ค๋ฅธ ๋ช…๋ช… ๋ฐ ํƒœ๊ทธ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ œ๋ถ€ํ„ฐ ๋ธŒ๋ ˆ์ด๋ธŒ์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

ํ•˜์ง€๋งŒ ๊ธฐ์กด Sleuth ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด spring.sleuth.http.legacy.enable ํ”„๋กœํผํ‹ฐ๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

JSON Logback with Logstash

๋กœ๊ทธ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ Logstash๊ฐ€ ์ฆ‰์‹œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” JSON ํŒŒ์ผ์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

(๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด groupId:artifactId:version ํ‘œ๊ธฐ๋ฒ•์—์„œ ์ข…์†์„ฑ์„ ์ „๋‹ฌํ•œ๋‹ค).

Dependencies Setup

  1. Logback์ด classpath์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. (ch.qos.logback:logback-core)
  2. Logstash Logback ์ธ์ฝ”๋”ฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    1. ๋งŒ์•ฝ 4.6์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด net.logstash.logback:logstash-logback-encoder:4.6 ์ถ”๊ฐ€ํ•œ๋‹ค.

logback-spring.xml์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <!-- Example for logging into the build folder of your project -->
    <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>

    <!-- You can override this to have a custom pattern -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!-- Appender to log to console -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- Minimum logging level to be presented in the console logs-->
            <level>DEBUG</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- Appender to log to file -->
    <appender name="flatfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    
    <!-- Appender to log to file in a JSON format -->
    <appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}.json</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "trace": "%X{traceId:-}",
                        "span": "%X{spanId:-}",
                        "baggage": "%X{key:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="console"/>
        <!-- uncomment this to have also JSON logs -->
        <!--<appender-ref ref="logstash"/>-->
        <!--<appender-ref ref="flatfile"/>-->
    </root>
</configuration>

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •๋ณด๋ฅผ JSON ํ˜•์‹์œผ๋กœ build/${spring.application.name}.json ํŒŒ์ผ์— ๊ธฐ๋กํ•œ๋‹ค.

Propagating(์ „ํŒŒ) Span Context

span context๋Š” ํ”„๋กœ์„ธ์Šค ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ํ•˜์œ„ span์œผ๋กœ ์ „ํŒŒ๋˜์–ด์•ผ ํ•˜๋Š”(Propagated) ์ƒํƒœ๋‹ค.

span context์˜ ์ผ๋ถ€๋Š” Baggage๋ผ๊ณ  ํ•œ๋‹ค.

trace ๋ฐ sapn ID๋Š” span context์˜ ํ•„์ˆ˜ ๋ถ€๋ถ„์ด๋‹ค.

Baggage์€ ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค.

๐Ÿป
ํ˜„์žฌ Baggage ํ’ˆ๋ชฉ์˜ ๊ฐœ์ˆ˜๋‚˜ ํฌ๊ธฐ์—๋Š” ์ œํ•œ์ด ์—†๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฐ์†Œํ•˜๊ฑฐ๋‚˜ RPC ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ, ๋„ˆ๋ฌด ๋งŽ์€ Baggage์ด ์ „์†ก ์ˆ˜์ค€ ๋ฉ”์‹œ์ง€ ๋˜๋Š” ํ—ค๋” ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜์—ฌ
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ ์˜ˆ๋Š” Baggage์„ span์— ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Span initialSpan = this.tracer.nextSpan().name("span").start();
ExtraFieldPropagation.set(initialSpan.context(), "foo", "bar");
ExtraFieldPropagation.set(initialSpan.context(), "UPPER_CASE", "someValue");

Baggage vs. Span Tags

Baggage์€ trace๊ณผ ํ•จ๊ป˜ ์ด๋™ํ•œ๋‹ค.

(๋ชจ๋“  child span๋Š” parent์˜ baggage๋ฅผ ํฌํ•จํ•œ๋‹ค)

Zipkin์€ baggage์— ๋Œ€ํ•œ ์ง€์‹์ด ์—†๊ณ  ๊ทธ ์ •๋ณด๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค.

 

Tag๋Š” ํŠน์ • span์— ๋ถ€์ฐฉ๋œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ, ๊ทธ๊ฒƒ๋“ค์€ ํŠน์ • span์—๋งŒ ํ‘œ์‹œ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒ€์ƒ‰๋œ tag ๊ฐ’์„ ๊ฐ–๋Š” span์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด tag๋ณ„๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ trace๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

Baggage๋ฅผ ๊ธฐ์ค€์œผ๋กœ span์„ ์กฐํšŒํ•˜๋ ค๋ฉด root span์— ํ•ด๋‹น ํ•ญ๋ชฉ์„ tag๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.