์๋ํฌ์๋ API ๊ฐ์์ฑ์ ์ํ Go OpenTelemetry ํธ๋ ์ด์ฑ
Go OpenTelemetry ํธ๋ ์ด์ฑ์ ์ค์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค. HTTP ์์ฒญ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ , ์๋ํํฐ ํธ์ถ ์ ๋ฐ์์ ํธ๋ ์ด์ค, ๋ฉํธ๋ฆญ, ๋ก๊ทธ๋ฅผ ์๊ด๊ด๊ณํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.

Go API์์์ ์๋ํฌ์๋ ํธ๋ ์ด์ฑ ์๋ฏธ
ํธ๋ ์ด์ค๋ ์์ฒญ์ด ์์คํ ์ ํต๊ณผํ๋ ์ ์ฒด ํ์๋ผ์ธ์ ๋๋ค. API ํธ์ถ์ด ๋์ฐฉํ ๋ ์์ํด ์๋ต์ ๋ณด๋ผ ๋ ๋๋ฉ๋๋ค.
ํธ๋ ์ด์ค ์์๋ ์คํฌ์ด ์์ต๋๋ค. ์คํฌ์ "์์ฒญ ํ์ฑ", "SQL ์คํ", "๊ฒฐ์ ์ ๊ณต์ ํธ์ถ"์ฒ๋ผ ์๊ฐ ์ธก์ ์ด ๋๋ ํ ๋จ๊ณ์ ๋๋ค. ์คํฌ์ HTTP ์ํ ์ฝ๋, ์์ ํ ์ฌ์ฉ์ ์๋ณ์, ์ฟผ๋ฆฌ๊ฐ ๋ฐํํ ํ ์ ๊ฐ์ ์ ์ฉํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ด์ ์ ์์ต๋๋ค.
"์๋ํฌ์๋"๋ ํธ๋ ์ด์ค๊ฐ ์ฒซ ๋ฒ์งธ ํธ๋ค๋ฌ์์ ๋ฉ์ถ์ง ์๋๋ค๋ ๋ป์ ๋๋ค. ๋ฏธ๋ค์จ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ, ์บ์ ํธ์ถ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ , ์๋ํํฐ API(๊ฒฐ์ , ์ด๋ฉ์ผ, ์ง๋), ๋ค๋ฅธ ๋ด๋ถ ์๋น์ค ๋ฑ ๋ฌธ์ ๊ฐ ์จ์ด์๊ธฐ ์ฌ์ด ๊ณณ๋ค์ ๋ฐ๋ผ๊ฐ๋๋ค.
ํธ๋ ์ด์ฑ์ ๋ฌธ์ ๊ฐ ๊ฐํ์ ์ผ ๋ ํนํ ๊ฐ์น๊ฐ ํฝ๋๋ค. 200๊ฐ ์์ฒญ ์ค ํ ๋ฒ๋ง ๋๋ ค์ง๋ ๊ฒฝ์ฐ, ๋ก๊ทธ๋ง ๋ณด๋ฉด ๋น ๋ฅธ ์์ฒญ๊ณผ ๋๋ฆฐ ์์ฒญ์ด ๋์ผํด ๋ณด์ผ ์ ์์ต๋๋ค. ํธ๋ ์ด์ค๋ ์ฐจ์ด๋ฅผ ๋ช ํํ ๋ณด์ฌ์ค๋๋ค: ํ ์์ฒญ์ด ์ธ๋ถ ํธ์ถ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ 800ms๋ฅผ ์๋นํ๊ณ , ๋ ๋ฒ ์ฌ์๋ํ ๋ค ํ์ ์์ ์ ์์ํ๋ค๋ ์์ผ๋ก์.
๋ํ ๋ก๊ทธ๋ ์๋น์ค ๊ฐ์ ์ฐ๊ฒฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. API์ ํ ์ค, ์์ปค์ ๋ค๋ฅธ ์ค์ ๋ก๊ทธ๋ง ์๊ณ ๊ทธ ์ฌ์ด์์ ์๋ฌด ๊ฒ๋ ์์ ์ ์์ต๋๋ค. ํธ๋ ์ด์ฑ์ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฐ ์ด๋ฒคํธ๋ค์ด ๋์ผํ trace ID๋ฅผ ๊ณต์ ํ๋ฏ๋ก ์ถ์ธกํ์ง ์๊ณ ์ฒด์ธ์ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค.
ํธ๋ ์ด์ค, ๋ฉํธ๋ฆญ, ๋ก๊ทธ: ๊ฐ ์ ํธ์ ์ญํ
ํธ๋ ์ด์ค, ๋ฉํธ๋ฆญ, ๋ก๊ทธ๋ ์๋ก ๋ค๋ฅธ ์ง๋ฌธ์ ๋ตํฉ๋๋ค.
ํธ๋ ์ด์ค๋ ํ ์ค์ ์์ฒญ์์ ๋ฌด์จ ์ผ์ด ์์๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํธ๋ค๋ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์ถ, ์บ์ ์กฐํ, ์๋ํํฐ ์์ฒญ์์ ์๊ฐ์ด ์ด๋์ ์ฐ์๋์ง ์๋ ค์ค๋๋ค.
๋ฉํธ๋ฆญ์ ์ถ์ธ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ง๊ณ๊ฐ ์์ ์ ์ด๊ณ ๋น์ฉ์ด ๋ฎ์ ๊ฒฝ๋ณด์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค: ์ง์ฐ์ ํผ์ผํ์ผ, ์์ฒญ๋ฅ , ์ค๋ฅ์จ, ํ ๊น์ด, ํฌํ๋ ๋ฑ์ ๋๋ค.
๋ก๊ทธ๋ "์"๋ฅผ ํ๋ฌธ์ผ๋ก ์ค๋ช ํฉ๋๋ค: ๊ฒ์ฆ ์คํจ, ์์์น ๋ชปํ ์ ๋ ฅ, ์ฃ์ง ์ผ์ด์ค, ์ฝ๋๊ฐ ๋ด๋ฆฐ ๊ฒฐ์ ๋ฑ์ ๋๋ค.
์ง์ง ์ด์ ์ ์๊ด๊ด๊ณ์ ๋๋ค. ๋์ผํ trace ID๊ฐ ์คํฌ๊ณผ ๊ตฌ์กฐํ๋ ๋ก๊ทธ์ ๋ํ๋๋ฉด ์ค๋ฅ ๋ก๊ทธ์์ ์ ํํ ํธ๋ ์ด์ค๋ก ๋ฐ๋ก ์ด๋ํด ์ด๋ค ์์กด์ฑ์ด ๋๋ ค์ก๋์ง ๋๋ ์ด๋ค ๋จ๊ณ๊ฐ ์คํจํ๋์ง๋ฅผ ์ฆ์ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์ฌ๊ณ ๋ชจ๋ธ
๊ฐ ์ ํธ๋ฅผ ์ํ ์ ์๋ ์ฉ๋๋ก ์ฌ์ฉํ์ธ์:
- ๋ฉํธ๋ฆญ์ ๋ฌด์ธ๊ฐ ์๋ชป๋์์์ ์๋ ค์ค๋๋ค.
- ํธ๋ ์ด์ค๋ ํ ์์ฒญ์์ ์๊ฐ์ด ์ด๋์ ์ฐ์๋์ง ๋ณด์ฌ์ค๋๋ค.
- ๋ก๊ทธ๋ ์ฝ๋๊ฐ ๋ฌด์์ ๊ฒฐ์ ํ๊ณ ์ ๊ทธ๋ฐ์ง๋ฅผ ์ค๋ช ํฉ๋๋ค.
์์: POST /checkout ์๋ํฌ์ธํธ๊ฐ ํ์์์์ ์์ํฉ๋๋ค. ๋ฉํธ๋ฆญ์ p95 ์ง์ฐ์ด ๊ธ์ฆํ์์ ๋ณด์ฌ์ค๋๋ค. ํธ๋ ์ด์ค๋ ๋๋ถ๋ถ์ ์๊ฐ์ด ๊ฒฐ์ ์ ๊ณต์ ํธ์ถ ๋ด๋ถ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ํด๋น ์คํฌ ๋ด๋ถ์ ์๊ด๋ ๋ก๊ทธ ๋ผ์ธ์ 502๋ก ์ธํด ์ฌ์๋๊ฐ ๋ฐ์ํ์์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์ด๋ ๋ฐฑ์คํ ์ค์ ์ด๋ ์๋ฅ ์ฅ์ ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ฝ๋ ์ถ๊ฐ ์ ์: ์ด๋ฆ ์ง๊ธฐ, ์ํ๋ง, ์ถ์ ํ ํญ๋ชฉ
์ฌ์ ๊ณํ์ด ์์ด์ผ ๋์ค์ ํธ๋ ์ด์ค๋ฅผ ๊ฒ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ณํ์ด ์์ผ๋ฉด ๋ฐ์ดํฐ๋ ์์ง๋์ง๋ง ๊ธฐ๋ณธ์ ์ธ ์ง๋ฌธ๋ค์ด ์ด๋ ค์์ง๋๋ค: "์ด๊ฒ์ด ์คํ ์ด์ง์ธ๊ฐ ํ๋ก๋์ ์ธ๊ฐ?" "์ด๋ค ์๋น์ค๊ฐ ๋ฌธ์ ๋ฅผ ์์ํ๋๊ฐ?"
์ผ๊ด๋ ์๋ณ๋ถํฐ ์์ํ์ธ์. ๊ฐ Go API์ ๋ช
ํํ service.name์ ์ ํ๊ณ (์: checkout-api), deployment.environment=dev|staging|prod ๊ฐ์ ๋จ์ผ ํ๊ฒฝ ํ๋๋ฅผ ์ฌ์ฉํ์ธ์. ์ด ๊ฐ๋ค์ ์์ ์ ์ผ๋ก ์ ์งํ์ธ์. ์ด๋ฆ์ด ์ฃผ์ค์ ๋ฐ๋๋ฉด ์ฐจํธ์ ๊ฒ์์์ ์๋ก ๋ค๋ฅธ ์์คํ
์ฒ๋ผ ๋ณด์
๋๋ค.
๋ค์์ผ๋ก ์ํ๋ง์ ๊ฒฐ์ ํ์ธ์. ๊ฐ๋ฐ์์๋ ๋ชจ๋ ์์ฒญ์ ์ถ์ ํ๋ ๊ฒ์ด ์ข์ง๋ง, ํ๋ก๋์ ์์๋ ๋น์ฉ์ด ๋ถ๋ด์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ ํธ๋ํฝ์ ์์ ๋น์จ์ ์ํ๋งํ๊ณ , ์ค๋ฅ์ ๋๋ฆฐ ์์ฒญ์ ํญ์ ๋จ๊ธฐ๋ ๊ฒ์ ๋๋ค. ๊ณ ๋น๋ ์๋ํฌ์ธํธ(ํฌ์ค์ฒดํฌ, ํด๋ง)๋ ์ ๊ฒ ๋๋ ์ ํ ์ถ์ ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์คํฌ์ ์ด๋ค ํ๊ทธ๋ฅผ ๋ฌ์ง, ์ด๋ค ๊ฒ์ ์ ๋ ์์งํ์ง ์์์ง ํฉ์ํ์ธ์. ์๋น์ค ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ ์์ฑ์ ํ์ฉ ๋ชฉ๋ก์ ์งง๊ฒ ์ ์งํ๊ณ ๊ฐ๋จํ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์น์ ๋ง๋์ธ์.
์ข์ ํ๊ทธ๋ ๋ณดํต ์์ ์ ์ธ ID์ ๋๋ต์ ์ธ ์์ฒญ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค(๋ผ์ฐํธ ํ ํ๋ฆฟ, ๋ฉ์๋, ์ํ ์ฝ๋). ๋ฏผ๊ฐํ ํ์ด๋ก๋๋ ์ ๋ ์์งํ์ง ๋ง์ธ์: ๋น๋ฐ๋ฒํธ, ๊ฒฐ์ ๋ฐ์ดํฐ, ์ ์ฒด ์ด๋ฉ์ผ, ์ธ์ฆ ํ ํฐ, ์์ ์์ฒญ ๋ณธ๋ฌธ ๋ฑ. ์ฌ์ฉ์ ๊ด๋ จ ๊ฐ์ ๊ผญ ํฌํจํด์ผ ํ๋ค๋ฉด ํด์ํ๊ฑฐ๋ ๊ฐ๋ฆฌ์ธ์.
๋จ๊ณ๋ณ: Go HTTP API์ OpenTelemetry ํธ๋ ์ด์ฑ ์ถ๊ฐํ๊ธฐ
์์ ์์ ์ ํ ๋ฒ ํธ๋ ์ด์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ์ค์ ์ ์คํฌ์ด ์ด๋๋ก ์ ์ก๋๋์ง์ ๋ชจ๋ ์คํฌ์ ์ฒจ๋ถ๋ ๋ฆฌ์์ค ์์ฑ์ ๊ฒฐ์ ํฉ๋๋ค.
1) OpenTelemetry ์ด๊ธฐํ
๋ฐ๋์ service.name์ ์ค์ ํ์ธ์. ์ด ๊ฐ์ด ์์ผ๋ฉด ์๋ก ๋ค๋ฅธ ์๋น์ค์ ํธ๋ ์ด์ค๊ฐ ์์ฌ ์ฐจํธ๊ฐ ์ฝ๊ธฐ ์ด๋ ค์์ง๋๋ค.
// main.go (startup)
exp, _ := stdouttrace.New(stdouttrace.WithPrettyPrint())
res, _ := resource.New(context.Background(),
resource.WithAttributes(
semconv.ServiceName("checkout-api"),
),
)
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp),
sdktrace.WithResource(res),
)
otel.SetTracerProvider(tp)
์ด๊ฒ์ด Go OpenTelemetry ํธ๋ ์ด์ฑ์ ๊ธฐ์ด์ ๋๋ค. ๋ค์์ผ๋ก๋ ๋ค์ด์ค๋ ๊ฐ ์์ฒญ์ ๋ํด ์คํฌ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
2) HTTP ๋ฏธ๋ค์จ์ด ์ถ๊ฐ ๋ฐ ์ฃผ์ ํ๋ ์บก์ฒ
์๋์ผ๋ก ์คํฌ์ ์์ํ๊ณ ์ํ ์ฝ๋์ ์ง์ ์๊ฐ์ ๊ธฐ๋กํ๋ HTTP ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ธ์. ์คํฌ ์ด๋ฆ์ ์์ URL์ด ์๋๋ผ ๋ผ์ฐํธ ํ
ํ๋ฆฟ(์: /users/:id)์ ์ฌ์ฉํด ์ค์ ํ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฒ ๊ฐ์ ๊ณ ์ ๊ฒฝ๋ก๊ฐ ์๊น๋๋ค.
๊ธฐ๋ณธ์ผ๋ก ๊น๋ํ ๊ท์น์ ์งํฅํ์ธ์: ์์ฒญ๋น ์๋ฒ ์คํฌ ํ๋, ๋ผ์ฐํธ ๊ธฐ๋ฐ ์คํฌ ์ด๋ฆ, ์บก์ฒ๋ HTTP ์ํ, ํธ๋ค๋ฌ ์คํจ๋ ์คํฌ ์ค๋ฅ๋ก ๋ฐ์, ์ง์ ์๊ฐ์ ํธ๋ ์ด์ค ๋ทฐ์ด์์ ํ์ธ ๊ฐ๋ฅ.
3) ์คํจ๋ฅผ ๋ช ํํ ํ์ํ๊ธฐ
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ ํ์ฌ ์คํฌ์ ์คํจ๋ก ํ์ํ์ธ์. ๊ทธ๋ฌ๋ฉด ๋ก๊ทธ๋ฅผ ๋ณด๊ธฐ ์ ์๋ ํธ๋ ์ด์ค๊ฐ ๋์ ๋๋๋ค.
ํธ๋ค๋ฌ์์ ๋ค์์ ํ ์ ์์ต๋๋ค:
span := trace.SpanFromContext(r.Context())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
4) ๋ก์ปฌ์์ trace ID ํ์ธํ๊ธฐ
API๋ฅผ ์คํํ๊ณ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํด ๋ณด์ธ์. ์์ฒญ ์ปจํ ์คํธ์์ trace ID๋ฅผ ํ ๋ฒ ๋ก๊ทธ์ ๋จ๊ฒจ ์์ฒญ๋ง๋ค ๋ฐ๋๋์ง ํ์ธํ์ธ์. ํญ์ ๋น์ด ์๋ค๋ฉด ๋ฏธ๋ค์จ์ด๊ฐ ํธ๋ค๋ฌ๊ฐ ๋ฐ๋ ๋์ผํ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค.
DB์ ์๋ํํฐ ํธ์ถ์์ ์ปจํ ์คํธ ์ ์งํ๊ธฐ
context.Context๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ์๊ฐ ์๋ํฌ์๋ ๊ฐ์์ฑ์ ๊นจ์ง๋๋ค. ๋ค์ด์ค๋ ์์ฒญ ์ปจํ
์คํธ๋ ๋ชจ๋ DB ํธ์ถ, HTTP ํธ์ถ, ํฌํผ์ ์ ๋ฌํ๋ ์ค๋ฐฅ(thread)์ด์ด์ผ ํฉ๋๋ค. context.Background()๋ก ๊ต์ฒดํ๊ฑฐ๋ ์ ๋ฌ์ ์์ผ๋ฉด ํธ๋ ์ด์ค๋ ๋ณ๊ฐ์ ๊ด๋ จ ์๋ ์์
์ผ๋ก ๋๋ฉ๋๋ค.
์์๋ฐ์ด๋ HTTP์ ๊ฒฝ์ฐ, ๊ณ์ธก๋ ํธ๋์คํฌํธ๋ฅผ ์ฌ์ฉํด Do(req)๊ฐ ํ์ฌ ์์ฒญ์ ์์ ์คํฌ์ด ๋๊ฒ ํ์ธ์. ํ๋ฅ ์๋น์ค๊ฐ ๋์ผํ ํธ๋ ์ด์ค์ ์คํฌ์ ๋ถ์ผ ์ ์๋๋ก W3C ํธ๋ ์ด์ค ํค๋๋ฅผ ์ ๋ฌํ์ธ์.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์ถ๋ ๊ฐ์ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๊ณ์ธก๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ QueryContext ๋ฐ ExecContext ์ฃผ์์ ์คํฌ์ ๋ํํ์ธ์. ์์ ํ ์ธ๋ถ ์ ๋ณด๋ง ๊ธฐ๋กํ์ธ์. ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ๊ณ ์ ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ถํด์๋ ์ ๋ฉ๋๋ค.
์ ์ฉํ๋ฉด์ ์ํ์ด ์ ์ ์์ฑ์ ์์
์ด๋ฆ(์: SELECT user_by_id), ํ
์ด๋ธ ๋๋ ๋ชจ๋ธ ์ด๋ฆ, ํ ์(๊ฐ์๋ง), ์ง์ ์๊ฐ, ์ฌ์๋ ํ์, ๊ทธ๋ฆฌ๊ณ ๊ฑฐ์น ์ค๋ฅ ์ ํ(ํ์์์, ์ทจ์, ์ ์ฝ ์๋ฐ) ๋ฑ์ ํฌํจํฉ๋๋ค.
ํ์์์์ ๋จ์ง ์คํจ์ ์ผ๋ถ๊ฐ ์๋๋๋ค. DB์ ์๋ํํฐ ํธ์ถ์ context.WithTimeout์ ์ค์ ํ๊ณ ์ทจ์๊ฐ ์ ํ๋๊ฒ ํ์ธ์. ํธ์ถ์ด ์ทจ์๋๋ฉด ์คํฌ์ ์ค๋ฅ๋ก ํ์ํ๊ณ deadline_exceeded ๊ฐ์ ์งง์ ์ด์ ๋ฅผ ์ถ๊ฐํ์ธ์.
๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๊ณผ ํ ํธ๋ ์ด์ฑ
๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ํธ๋ ์ด์ค๊ฐ ๋ฉ์ถ๊ธฐ ์ฌ์ด ๊ณณ์ ๋๋ค. HTTP ์์ฒญ์ด ๋๋๊ณ ์์ปค๊ฐ ๋ค๋ฅธ ๋จธ์ ์์ ๋์ค์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ปจํ ์คํธ๊ฐ ๊ณต์ ๋์ง ์์ต๋๋ค. ์๋ฌด๊ฒ๋ ํ์ง ์์ผ๋ฉด API ํธ๋ ์ด์ค์ ์ด๋์ ๊ฐ ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์์ ํธ๋ ์ด์ค ๋ ๊ฐ๋ง ๋จ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค: ์์ ์ ํ์ ๋ฃ์ ๋ ํ์ฌ ํธ๋ ์ด์ค ์ปจํ ์คํธ๋ฅผ ์บก์ฒํด ์์ ๋ฉํ๋ฐ์ดํฐ(ํ์ด๋ก๋, ํค๋, ์์ฑ ๋ฑ)์ ์ ์ฅํ์ธ์. ์์ปค๊ฐ ์์๋ ๋ ๊ทธ ์ปจํ ์คํธ๋ฅผ ์ถ์ถํด ์๋ ์์ฒญ์ ์์์ผ๋ก ์ ์คํฌ์ ์์ํ์ธ์.
์ปจํ ์คํธ๋ฅผ ์์ ํ๊ฒ ์ ํํ๊ธฐ
ํธ๋ ์ด์ค ์ปจํ ์คํธ๋ง ๋ณต์ฌํ๊ณ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ง ๋ง์ธ์.
- trace ์๋ณ์์ ์ํ๋ง ํ๋๊ทธ(W3C traceparent ์คํ์ผ)๋ง ์ฃผ์ ํ์ธ์.
- ๋น์ฆ๋์ค ํ๋์ ๋ถ๋ฆฌํด์ ๋ณด๊ดํ์ธ์(์: ๋ณ๋์ "otel" ๋๋ "trace" ํ๋).
- ๋ค์ ์ฝ์ ๋๋ ์ ๋ขฐํ์ง ์๋ ์ ๋ ฅ์ผ๋ก ์ทจ๊ธํ์ธ์(ํ์ ๊ฒ์ฆ, ๋๋ฝ ์ฒ๋ฆฌ).
- ํ ํฐ, ์ด๋ฉ์ผ, ์์ฒญ ๋ณธ๋ฌธ์ ์์ ๋ฉํ๋ฐ์ดํฐ์ ๋ฃ์ง ๋ง์ธ์.
๋ ธ์ด์ฆ๋ฅผ ๋ง๋ค์ง ์๊ณ ์ถ๊ฐํ ์คํฌ
์ฝ๊ธฐ ์ฌ์ด ํธ๋ ์ด์ค๋ ๋ณดํต ๋ช ๊ฐ์ ์๋ฏธ ์๋ ์คํฌ์ ๊ฐ์ง๋ฉฐ, ์์ญ ๊ฐ์ ์์ ์คํฌ์ด ์์ง๋ ์์ต๋๋ค. ๊ฒฝ๊ณ์ "๋๊ธฐ ์ง์ " ์ฃผ์์ ์คํฌ์ ๋ง๋์ธ์. ์์์ ์ผ๋ก๋ API ํธ๋ค๋ฌ์ enqueue ์คํฌ๊ณผ ์์ปค์ job.run ์คํฌ์ด ์ ๋นํฉ๋๋ค.
์๋์ ์ปจํ ์คํธ๋ง ์ถ๊ฐํ์ธ์: ์๋ ๋ฒํธ, ํ ์ด๋ฆ, ์์ ์ข ๋ฅ, ํ์ด๋ก๋ ํฌ๊ธฐ(๋ด์ฉ ์๋). ์ฌ์๋๊ฐ ๋ฐ์ํ๋ฉด ๋ฐฑ์คํ ์ง์ฐ์ ๋ณผ ์ ์๊ฒ ๋ณ๋์ ์คํฌ์ด๋ ์ด๋ฒคํธ๋ก ๊ธฐ๋กํ์ธ์.
์์ฝ๋ ์์ ์๋ ๋ถ๋ชจ๊ฐ ํ์ํฉ๋๋ค. ์์ฒญ์ด ์๋ค๋ฉด ๊ฐ ์คํ๋ง๋ค ์๋ก์ด ๋ฃจํธ ์คํฌ์ ๋ง๋ค๊ณ ์ค์ผ์ค ์ด๋ฆ์ ํ๊ทธํ์ธ์.
๋ก๊ทธ์ ํธ๋ ์ด์ค ์๊ด๊ด๊ณ(๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ ์์ ์ ์ง)
ํธ๋ ์ด์ค๋ ์๊ฐ์ด ์ด๋์ ์ฐ์๋์ง๋ฅผ ๋งํด์ฃผ๊ณ , ๋ก๊ทธ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๊ณ ์์ธ์ง ๋งํฉ๋๋ค. ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ก๊ทธ ํญ๋ชฉ์ trace_id์ span_id๋ฅผ ๊ตฌ์กฐํ๋ ํ๋๋ก ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
Go์์๋ context.Context์์ ํ์ฑ ์คํฌ์ ๊ฐ์ ธ์ ๊ฐ ์์ฒญ(๋๋ ์์
)๋ง๋ค ๋ก๊ฑฐ๋ฅผ ํ์ฅํ์ธ์. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๋ก๊ทธ ๋ผ์ธ์ด ํน์ ํธ๋ ์ด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
span := trace.SpanFromContext(ctx)
sc := span.SpanContext()
logger := baseLogger.With(
"trace_id", sc.TraceID().String(),
"span_id", sc.SpanID().String(),
)
logger.Info("charge_started", "order_id", orderID)
์ด ์ ๋๋ฉด ๋ก๊ทธ ํญ๋ชฉ์์ ์ ํํ ์คํฌ์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๋ํ ์ปจํ
์คํธ๊ฐ ์์ผ๋ฉด trace_id๊ฐ ๋น์ด ์์ด ์ด๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์ ์ ์์ต๋๋ค.
PII๋ฅผ ์ ์ถํ์ง ์๊ณ ๋ก๊ทธ ์ ์ฉ์ฑ ์ ์งํ๊ธฐ
๋ก๊ทธ๋ ํธ๋ ์ด์ค๋ณด๋ค ๋ ์ค๋ ๋ณด๊ด๋๊ณ ๋ ๋๊ฒ ์ ํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ๋ ์๊ฒฉํด์ผ ํฉ๋๋ค. ์์ ์ ์ธ ์๋ณ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ํธํ์ธ์: user_id, order_id, payment_provider, status, error_code. ์ฌ์ฉ์ ์
๋ ฅ์ ๊ผญ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ํ๋ค๋ฉด ๋จผ์ ๊ฐ๋ฆฌ๊ณ ๊ธธ์ด๋ฅผ ์ ํํ์ธ์.
์ค๋ฅ ๊ทธ๋ฃนํ๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ธฐ
์ผ๊ด๋ ์ด๋ฒคํธ ์ด๋ฆ๊ณผ ์ค๋ฅ ์ ํ์ ์ฌ์ฉํด ์ง๊ณํ๊ณ ๊ฒ์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋์ธ์. ๋ฌธ๊ตฌ๊ฐ ๋งค๋ฒ ๋ฐ๋๋ฉด ๋์ผํ ์ด์๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๋ฌธ์ ๋ฅผ ์ฐพ๋ ๋ฐ ์ค์ ๋ก ๋์์ด ๋๋ ๋ฉํธ๋ฆญ ์ถ๊ฐํ๊ธฐ
๋ฉํธ๋ฆญ์ ์ด๊ธฐ ๊ฒฝ๊ณ ์์คํ ์ ๋๋ค. ์ด๋ฏธ Go OpenTelemetry ํธ๋ ์ด์ฑ์ ์ฌ์ฉํ๋ ํ๊ฒฝ์์๋ ๋ฉํธ๋ฆญ์ผ๋ก: ์ผ๋ง๋ ์์ฃผ, ์ผ๋ง๋ ์ฌ๊ฐํ์ง, ์ธ์ ๋ถํฐ์ธ์ง๋ฅผ ๋ตํ๊ฒ ํ์ธ์.
๋๋ถ๋ถ์ API์ ๊ฑฐ์ ํญ์ ์ ์ฉํ ์๊ท๋ชจ ์งํฉ์ผ๋ก ์์ํ์ธ์: ์์ฒญ ์, ์ค๋ฅ ์(์ํ ํด๋์ค๋ณ), ์ง์ฐ ํผ์ผํ์ผ(p50, p95, p99), ์ฒ๋ฆฌ ์ค ์์ฒญ ์, DB ๋ฐ ์ฃผ์ ์๋ํํฐ ํธ์ถ์ ์์กด์ฑ ์ง์ฐ.
ํธ๋ ์ด์ค์ ๋ฉํธ๋ฆญ์ ์ ๋ ฌํ๋ ค๋ฉด ๊ฐ์ ๋ผ์ฐํธ ํ
ํ๋ฆฟ๊ณผ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์คํฌ์ด /users/{id}๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉํธ๋ฆญ๋ ๋์ผํ๊ฒ ํ์ธ์. ๊ทธ๋ฌ๋ฉด ์ฐจํธ์ "/checkout์ p95์ด ๊ธ์ฆ"์ด ๋ณด์ผ ๋ ํด๋น ๋ผ์ฐํธ๋ก ํํฐ๋ง๋ ํธ๋ ์ด์ค๋ก ๋ฐ๋ก ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
๋ผ๋ฒจ(์์ฑ)์ ์ฃผ์ํด์ ์ฌ์ฉํ์ธ์. ์๋ชป๋ ๋ผ๋ฒจ ํ๋๊ฐ ๋น์ฉ์ ํญ๋ฐ์ํค๊ณ ๋์๋ณด๋๋ฅผ ์ธ๋ชจ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ผ์ฐํธ ํ ํ๋ฆฟ, ๋ฉ์๋, ์ํ ํด๋์ค, ์๋น์ค ์ด๋ฆ์ ๋ณดํต ์์ ํฉ๋๋ค. ์ฌ์ฉ์ ID, ์ด๋ฉ์ผ, ์ ์ฒด URL, ์์ ์ค๋ฅ ๋ฉ์์ง๋ ๋ณดํต ์์ ํ์ง ์์ต๋๋ค.
๋น์ฆ๋์ค ์ค์ ์ด๋ฒคํธ(์: checkout ์์/์๋ฃ, ๊ฒฐ์ ์คํจ ์ ํ๋ณ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ฑ๊ณต ๋ ์ฌ์๋)์ฉ ์ปค์คํ ๋ฉํธ๋ฆญ์ ๋ช ๊ฐ ์ถ๊ฐํ์ธ์. ์งํฉ์ ์๊ฒ ์ ์งํ๊ณ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ ๊ฑฐํ์ธ์.
ํ ๋ ๋ฉํธ๋ฆฌ ๋ด๋ณด๋ด๊ธฐ ๋ฐ ์์ ํ ๋กค์์
๋ด๋ณด๋ด๊ธฐ๋ OpenTelemetry๊ฐ ์ค์ฉํ๋๋ ์ง์ ์ ๋๋ค. ์๋น์ค๋ ์คํฌ, ๋ฉํธ๋ฆญ, ๋ก๊ทธ๋ฅผ ์ ๋ขฐํ ์ ์๋ ๊ณณ์ผ๋ก ์ง์ฐ ์์ด ๋ณด๋ด์ผ ํฉ๋๋ค.
๋ก์ปฌ ๊ฐ๋ฐ์์๋ ๋จ์ํ๊ฒ ์ ์งํ์ธ์. ์ฝ์ ์ต์คํฌํฐ๋ ๋ก์ปฌ ์ปฌ๋ ํฐ๋ก OTLP๋ฅผ ๋ณด๋ด๋ฉด ํธ๋ ์ด์ค๋ฅผ ๋น ๋ฅด๊ฒ ๋ณด๊ณ ์คํฌ ์ด๋ฆ๊ณผ ์์ฑ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค. ํ๋ก๋์ ์์๋ ์๋น์ค ๊ทผ์ฒ์ ์์ด์ ํธ๋ OpenTelemetry Collector๋ก OTLP๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์ ํธํ์ธ์. ๊ทธ๋ฌ๋ฉด ์ฌ์๋, ๋ผ์ฐํ , ํํฐ๋ง์ ํ ๊ณณ์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฐฐ์น ์ ์ก์ด ์ค์ํฉ๋๋ค. ์งง์ ๊ฐ๊ฒฉ์ ๋ฐฐ์น์ ์๊ฒฉํ ํ์์์์ผ๋ก ์ ์กํด ๋คํธ์ํฌ๊ฐ ๋งํ๋ ์์ฒญ์ ์ฐจ๋จํ์ง ์๊ฒ ํ์ธ์. ํ ๋ ๋ฉํธ๋ฆฌ๋ ํฌ๋ฆฌํฐ์ปฌ ๊ฒฝ๋ก์ ์์ด์๋ ์ ๋ฉ๋๋ค. ์ต์คํฌํฐ๊ฐ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ ค์ผ ํฉ๋๋ค.
์ํ๋ง์ผ๋ก ๋น์ฉ์ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ ์งํ์ธ์. ๋จผ์ ํค๋ ๊ธฐ๋ฐ ์ํ๋ง(์: ์์ฒญ์ 1~10%)์ผ๋ก ์์ํ๊ณ ๊ฐ๋จํ ๊ท์น์ ์ถ๊ฐํ์ธ์: ์ค๋ฅ๋ ํญ์ ์ํ๋ง, ํน์ ์๊ณ๊ฐ ์ด์์ ๋๋ฆฐ ์์ฒญ์ ํญ์ ์ํ๋ง. ๊ณ ๋น๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ๋ฎ์ ๋น์จ๋ก ์ํ๋งํ์ธ์.
๋กค์์์ ์์ ๋จ๊ณ๋ก ํ์ธ์: ๊ฐ๋ฐ์์ 100% ์ํ๋ง, ์คํ ์ด์ง์์ ํ์ค์ ์ธ ํธ๋ํฝ๊ณผ ๋ฎ์ ์ํ๋ง, ํ๋ก๋์ ์์๋ ๋ณด์์ ์ธ ์ํ๋ง๊ณผ ์ต์คํฌํฐ ์คํจ์ ๋ํ ์๋ฆผ.
์๋ํฌ์๋ ๊ฐ์์ฑ์ ๋ง์น๋ ํํ ์ค์๋ค
์๋ํฌ์๋ ๊ฐ์์ฑ์ ๋๊ฐ ๋จ์ํ ์ด์ ๋ก ์คํจํฉ๋๋ค: ๋ฐ์ดํฐ๋ ์กด์ฌํ์ง๋ง ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค.
Go์์ ๋ถ์ฐ ํธ๋ ์ด์ฑ์ ๊นจ๋จ๋ฆฌ๋ ํํ ๋ฌธ์ ๋ ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ์ด์ด ๊ฐ์ ์ปจํ
์คํธ๋ฅผ ๋ฒ๋ฆผ. ํธ๋ค๋ฌ๋ ์คํฌ์ ๋ง๋ค์ง๋ง DB ํธ์ถ, HTTP ํด๋ผ์ด์ธํธ, ๊ณ ๋ฃจํด์ด ์์ฒญ ์ปจํ
์คํธ ๋์
context.Background()๋ฅผ ์ฌ์ฉํจ. - ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด์ ์คํฌ์ ํ์ํ์ง ์์. ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ณ ์คํฌ ์ํ๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด ํธ๋ ์ด์ค๊ฐ ์ฌ์ฉ์์๊ฒ๋ 500์ด์ง๋ง "์ ์"์ฒ๋ผ ๋ณด์ผ ์ ์์.
- ๋ชจ๋ ๊ฒ์ ๊ณ์ธกํจ. ๋ชจ๋ ํฌํผ๊ฐ ์คํฌ์ด ๋๋ฉด ํธ๋ ์ด์ค๊ฐ ์์์ด ๋๊ณ ๋น์ฉ์ด ์ฆ๊ฐํจ.
- ๊ณ ์นด๋๋๋ฆฌํฐ ์์ฑ ์ถ๊ฐ. ID๊ฐ ํฌํจ๋ ์ ์ฒด URL, ์ด๋ฉ์ผ, ์์ SQL ๊ฐ, ์์ฒญ ๋ณธ๋ฌธ, ์์ ์ค๋ฅ ๋ฌธ์์ด์ ์๋ฐฑ๋ง ๊ฐ์ ๊ณ ์ ๊ฐ์ ์์ฑํ ์ ์์.
- ํ๊ท ์ผ๋ก ์ฑ๋ฅ์ ํ๋จํจ. ์ฌ๊ณ ๋ ํ๊ท ์ด ์๋๋ผ ํผ์ผํ์ผ(p95/p99)๊ณผ ์ค๋ฅ์จ์ ๋๋ฌ๋จ.
๋น ๋ฅธ ์ ๊ฒ์ ํ๋์ ์ค์ ์์ฒญ์ ๊ณจ๋ผ ๊ฒฝ๊ณ๋ค์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ ๋๋ค. ์ธ๋ฐ์ด๋ ์์ฒญ, DB ์ฟผ๋ฆฌ, ์๋ํํฐ ํธ์ถ, ๋น๋๊ธฐ ์์ปค๋ฅผ ํตํด ํ๋์ trace ID๊ฐ ํ๋ฅด๋์ง ๋ณผ ์ ์๋ค๋ฉด ์๋ํฌ์๋ ๊ฐ์์ฑ์ด ์์ง ํ๋ณด๋ ๊ฒ์ด ์๋๋๋ค.
์ค์ฉ์ ์ธ "์๋ฃ" ์ฒดํฌ๋ฆฌ์คํธ
์ฌ์ฉ์ ๋ณด๊ณ ์์์ ์ ํํ ์์ฒญ์ผ๋ก ์ด๋ํ ๋ค ๊ทธ ์์ฒญ์ ๋ชจ๋ ํ์์ ๋ฐ๋ผ๊ฐ ์ ์์ ๋ ๊ฑฐ์ ์๋ฃ๋ ๊ฒ์ ๋๋ค.
- ํ๋์ API ๋ก๊ทธ ๋ผ์ธ์ ๊ณจ๋ผ
trace_id๋ก ์ ํํ ํธ๋ ์ด์ค๋ฅผ ์ฐพ์ผ์ธ์. ๋์ผํ ์์ฒญ์ ๋ ๊น์ ๋ก๊ทธ(DB, HTTP ํด๋ผ์ด์ธํธ, ์์ปค)๊ฐ ๋์ผํ ํธ๋ ์ด์ค ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ์ธ์. - ํธ๋ ์ด์ค๋ฅผ ์ด์ด ์ค์ฒฉ ๊ตฌ์กฐ๋ฅผ ํ์ธํ์ธ์: ์ต์๋จ์ HTTP ์๋ฒ ์คํฌ, ๊ทธ ์๋ DB ํธ์ถ๊ณผ ์๋ํํฐ API์ ์์ ์คํฌ๋ค์ด ์๋์ง. ํํํ ๋ชฉ๋ก์ด๋ฉด ์ปจํ ์คํธ๊ฐ ์์ค๋ ๊ฒ์ ๋๋ค.
- API ์์ฒญ์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ํธ๋ฆฌ๊ฑฐ(์: ์์์ฆ ์ด๋ฉ์ผ ์ ์ก)ํ๊ณ ์์ปค ์คํฌ์ด ์์ฒญ์ผ๋ก ์ฐ๊ฒฐ๋๋์ง ํ์ธํ์ธ์.
- ๊ธฐ๋ณธ ๋ฉํธ๋ฆญ(์์ฒญ ์, ์ค๋ฅ์จ, ์ง์ฐ ํผ์ผํ์ผ)์ ํ์ธํ๊ณ ๋ผ์ฐํธ๋ ์์ ์ผ๋ก ํํฐ๋งํ ์ ์๋์ง ํ์ธํ์ธ์.
- ์์ฑ๊ณผ ๋ก๊ทธ์์ ์์ ์ฑ์ ๊ฒ์ฌํ์ธ์: ๋น๋ฐ๋ฒํธ, ํ ํฐ, ์ ์ฒด ์ ์ฉ์นด๋ ๋ฒํธ, ์์ ๊ฐ์ธ์ ๋ณด๊ฐ ์๋์ง ํ์ธํ์ธ์.
๊ฐ๋จํ ํ์ค ํ ์คํธ๋ ๊ฒฐ์ ์ ๊ณต์๊ฐ ์ง์ฐ๋ ๋ ๋๋ฆฐ ์ฒดํฌ์์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ฒ์ ๋๋ค. ํ ํธ๋ ์ด์ค์์ ์ธ๋ถ ํธ์ถ ์คํฌ์ด ๋ช ํํ ํ์๋๊ณ ์ฒดํฌ์์ ๋ผ์ฐํธ์ p95 ์ง์ฐ์ด ๊ธ์ฆํ๋ ๋ฉํธ๋ฆญ์ด ๋ณด์ฌ์ผ ํฉ๋๋ค.
๋ง์ฝ AppMaster๋ก Go ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ค๋ฉด(์: AppMaster), ์ด ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋ฆด๋ฆฌ์ค ๋ฃจํด์ ์ผ๋ถ๋ก ๋ง๋ค์ด ์ ์๋ํฌ์ธํธ์ ์์ปค๊ฐ ์ฑ ์ฑ์ฅ์ ๋ฐ๋ผ ๊ณ์ ์ถ์ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ๋์๋ฉ๋๋ค. AppMaster (appmaster.io)๋ ์ค์ Go ์๋น์ค๋ฅผ ์์ฑํ๋ฏ๋ก ํ๋์ OpenTelemetry ์ค์ ์ ํ์คํํด ์๋น์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ๊ฑธ์ณ ์ ์ฉํ ์ ์์ต๋๋ค.
์์: ์๋น์ค ์ ๋ฐ์ ๋๋ฆฐ ์ฒดํฌ์์ ๋๋ฒ๊น
๊ณ ๊ฐ์ด "์ฒดํฌ์์์ด ๊ฐ๋ ๋ฉ์ถฅ๋๋ค"๋ผ๊ณ ๋ณด๊ณ ํฉ๋๋ค. ์ฌํ์ด ์ด๋ ต๋ค๋ฉด Go OpenTelemetry ํธ๋ ์ด์ฑ์ ์ด์ ์ด ๋ฐํ๋ฉ๋๋ค.
๋จผ์ ๋ฉํธ๋ฆญ์ผ๋ก ๋ฌธ์ ์ ํํ๋ฅผ ํ์ ํ์ธ์. ์์ฒญ๋ฅ , ์ค๋ฅ์จ, ์ฒดํฌ์์ ์๋ํฌ์ธํธ์ p95 ๋๋ p99 ์ง์ฐ์ ์ดํด๋ณด์ธ์. ์ง์ฐ์ด ์งง์ ์๊ฐ์๋ง ๋ฐ์ํ๊ณ ์ผ๋ถ ์์ฒญ์๋ง ์ํฅ์ ์ค๋ค๋ฉด ๋ณดํต ์์กด์ฑ, ํ์, ์ฌ์๋ ๋์์ด ์์ธ์ด์ง CPU๋ ์๋๋๋ค.
๋ค์์ผ๋ก ๊ฐ์ ์๊ฐ๋์ ๋๋ฆฐ ํธ๋ ์ด์ค๋ฅผ ์ด์ด๋ณด์ธ์. ํ๋์ ํธ๋ ์ด์ค๋ฉด ์ถฉ๋ถํ ๋๊ฐ ๋ง์ต๋๋ค. ์ ์์ ์ธ ์ฒดํฌ์์์ ๋ณดํต 300600ms์
๋๋ค. ๋ฌธ์ ์๋ ๊ฒฝ์ฐ 812์ด๊ฐ ๋ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ ์๊ฐ์ด ํ๋์ ์คํฌ ๋ด๋ถ์ ์์ต๋๋ค.
ํํ ํจํด์ ์ด๋ ์ต๋๋ค: API ํธ๋ค๋ฌ๋ ๋น ๋ฅด์ง๋ง DB ์์ ์ ๋์ฒด๋ก ๊ด์ฐฎ๊ณ , ๊ฒฐ์ ์ ๊ณต์ ์คํฌ์์ ์ฌ์๋๊ฐ ๋ฐ๋ณต๋๋ฉฐ ๋ค์ด์คํธ๋ฆผ ํธ์ถ์ด ์ ๊ธ์ด๋ ํ ๋ค์์ ๋๊ธฐํฉ๋๋ค. ์๋ต์ด ์ฌ์ ํ 200์ ๋ฐํํ ์ ์์ด ์ค๋ฅ ๊ธฐ๋ฐ ์๋ฆผ์ ์ ํ ์ธ๋ฆฌ์ง ์์ ์ ์์ต๋๋ค.
์๊ด๋ ๋ก๊ทธ๋ ์ ํํ ๊ฒฝ๋ก๋ฅผ ํ๋ฌธ์ผ๋ก ์๋ ค์ค๋๋ค: "retrying Stripe charge: timeout" ๋ค์์ "db tx aborted: serialization failure", ์ด์ด์ "retry checkout flow" ๊ฐ์ ๋ก๊ทธ๊ฐ ๋์ค๋ฉด ์์ ๋ฌธ์ ๋ค์ด ๊ฒฐํฉํด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๊ฐ๋จ๋ฆฌ๊ณ ์๋ค๋ ๋ช ํํ ์ ํธ์ ๋๋ค.
๋ณ๋ชฉ์ ์ฐพ์ ๋ค์๋ ์ผ๊ด์ฑ์ด ์๊ฐ์ด ์ง๋๋ ๊ฐ๋ ์ฑ์ ์ ์งํฉ๋๋ค. ์คํฌ ์ด๋ฆ, ์์ ํ ์์ฑ(์ฌ์ฉ์ ID ํด์, ์ฃผ๋ฌธ ID, ์์กด์ฑ ์ด๋ฆ), ์ํ๋ง ๊ท์น์ ์๋น์ค ์ ๋ฐ์ ๊ฑธ์ณ ํ์คํํด ๋ชจ๋๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ๋ ์ด์ค๋ฅผ ์ฝ์ ์ ์๊ฒ ํ์ธ์.


