Metric Design - 3sam5oh/webtoon-search-service GitHub Wiki
Test Monitoring ๊ด๋ จ์ผ๋ก ๋ฉํธ๋ฆญ ๋์์ธํ๋ฉด์ ์งํํ๋ ๋ด์ฉ ๊ณต์
- ์์คํ ์ ์ฑ๋ฅ๊ณผ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด ์์ง๋๋ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ. ์ด๋ฌํ ๋ฐ์ดํฐ๋ ์์น ํ์์ผ๋ก ํํ๋๋ฉฐ, ์์คํ ์ ๋ค์ํ ์ธก๋ฉด์ ๋ํ ์ ๋์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
- ์ด๋ฐ ์ ๋ณด๋ฅผ ์์ง, ์ ์ฅ, ์ฟผ๋ฆฌ ๋ฐ ์๋์ ํตํด ๋ชจ๋ํฐ๋งํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด Prometheus ๋ฑ์ ๋๊ตฌ.
USE/RED๋ ๋ฉํธ๋ฆญ ๋์์ธ ๋ฐฉ๋ฒ๋ก ์ ์ข
๋ฅ.
USE๋ ๋ฌผ๋ฆฌ์ ํ๋์จ์ด(์๋ฒ) ์์ฃผ์ ๋ฉํธ๋ฆญ ๋์์ธ ๋ฐฉ๋ฒ์,
RED๋ ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์ ๋ฉํธ๋ฆญ ๋์์ธ ๋ฐฉ๋ฒ์ ์ ์ํจ.
For every resource, check utilization, saturation, and errors.
- ๋ชจ๋ ์์์ ๋ํด์ ์ ์ ์จ, ํฌํ์จ, ์ค๋ฅ๋ฅผ ํ์ธํ์.
- ์ฃผ๋ก ๋ฌผ๋ฆฌ์ ์์์ ๋ํ ๋ฉํธ๋ฆญ์ ์์งํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ค์ด๋ผ๊ณ ์ดํดํจ.
-
Resource(์์)
: ๋ฌผ๋ฆฌ์ ์๋ฒ์ ๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์ -
Utilization(์ ์ ์จ)
: ๋ฆฌ์์ค๊ฐ ์๋น์ค์ ๋ํ์ฌ ๋ฐ์๊ฒ ์ฌ์ฉ๋๋ ํ๊ท ์๊ฐ
-> ์ ์ ์จ์ด ๋๋ค = ๋ฆฌ์์ค๊ฐ ์ฒ๋ฆฌ๋์ง์๊ณ ๋ฐ๋ ค์์ ๊ฐ๋ฅ์ฑ(bottle neck ๋ฑ)์ด ์๋ค. -
Saturation(ํฌํ์จ)
: ๋ฆฌ์์ค๊ฐ ์ฒ๋ฆฌํ์ง ๋ชปํ ์ฌ๋ถ์ ์ผ(extra work)์ ์ ๋. ๋ฆฌ์์ค๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ํ๊ณ๋ฅผ ๋์ด ์ฒ๋ฆฌํ์ง ๋ชปํ ์์ ์ ์ ๋. -
Errors(์ค๋ฅ)
: ์๋ฌ ์ด๋ฒคํธ์ ํ์ - ์ธ ์งํ๋ฅผ ์ฌ์ฉํด์ ๋ฎ์ ๋ ๋ฒจ์(์๋ฒ์ ๋ฌผ๋ฆฌ์ ์์ - ๋คํธ์ํฌ) ๋ชจ๋ํฐ๋ง์ด ๊ฐ๋ฅํ๋ค.
CPU ์ ์ ์จ์ ๋ฎ์๋ฐ ํฌํ์จ์ด ๋๋ค? -> ์ค๋ ๋๋ ํ๋ก์ธ์ค ๋ถ๋ฐฐ๊ฐ ์๋ชป๋์ด ์์ด์ ํ๋์ CPU ์ฝ์ด์ ์ผ์ด ๋ชฐ๋ ค์๋ค. -> ์ค๋ ๋ ํ์ ์ฌ์ฉํด์ ํ๋์ ์ค๋ ๋์ ๋ชฐ๋ฆฐ ์์ ์ ๋ถ๋ฐฐํ๋ ๋ฑ์ ์กฐ์น๋ฅผ ์ทจํ ์ ์์.
-
Pros
: 'it solves about 80% of server issues with 5% of the effort', 'it can be applied to systems other than servers'. USE ๋ฐฉ๋ฒ๋ก ์ ์ ์ฉํ์ฌ ๋์์ธํ ๋ฉํธ๋ฆญ์ ์๋ฒ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ์์คํ ์ ์ ์ฉ ๊ฐ๋ฅํ๊ณ , ์ ์ ๋ ธ๋ ฅ์ ๋ค์ฌ ๋์ ํจ์จ์ ์ฑ๋ฅ ๊ฐ์ ์ ์ด๋ค๋ผ ์ ์๋ค. -
Cons
: ๋ค์ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ง๋ง, MSA ๊ตฌ์กฐ์์๋ ์ ๋ขฐํ๊ธฐ๊ฐ ํ๋ฌ(์ถ์์ ์ด๊ธฐ ๋๋ฌธ). ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์บ์น ํ ์ ์์ง๋ง low level ๋ฉํธ๋ฆญ(์ธํ๋ผ ๋ ๋ฒจ์ ๋ฉํธ๋ฆญ)์ด์ด์ ์ด๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ด๋ ์๋น์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์์.
โThe USE Method doesnโt really apply to services; it applies to hardware, network disks, things like this,โ
โWe really wanted a microservices-oriented monitoring philosophy, so we came up with the RED Method.โ
โ๋ชจ๋ ๋ฆฌ์์ค์ ๋ํด ์์ฒญ๋ฅ (Rate), ์ค๋ฅ์จ(Error), ์ง์์๊ฐ(Duration)์ ๋ชจ๋ํฐ๋ง ํ๋ ๊ฒ์ ๊ฐ์กฐโ
- USE ๋ฐฉ๋ฒ๋ก ์ด low level์ ๋ฉํธ๋ฆญ ์์ง์ ๊ฐ์กฐํ๋ค๋ฉด, RED ๋ฐฉ๋ฒ๋ก ์ Application ๋ ๋ฒจ์ ๋ฉํธ๋ฆญ์ ๊ฐ์กฐ
-
Resource
: Application ์ Service ๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ด๋ ๋จ -
Rate
: ์ฒ๋ฆฌ์จ. ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ฒ๋ฆฌํ๋ ์์ฒญ์ ์๋. ex) ์ด๋น HTTP request ์. -
Error
: ์ค๋ฅ ์. ์์ฒญ์ด ์คํจํ๋ ๋น์จ.ex) HTTP 500 error ๋น์จ -
Duration
: ์ฒ๋ฆฌ ์๊ฐ. ์์ฒญ์ด ์ฒ๋ฆฌ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ. ex) HTTP request ์๊ฐ. - RED ๋ฐฉ๋ฒ๋ก ์ SLA(Service Level Agreement) ๋ฑ์ ํ์ ์ ์ฌ์ฉ๋ ์ ์์.
USE/RED ๋ฐฉ๋ฒ๋ก ์ ์ฐธ๊ณ ํด์ ์ฌ์ฉํ ์์คํ
์ ์ ํฉํ ๋ฉํธ๋ฆญ ์ ์ ํ๊ธฐ
์ด๋ค ๋ฉํธ๋ฆญ์ ์์งํด์ผ ํ ๊ฑด์ง?
1) ๊ธฐ๋ณธ์ ์ผ๋ก ์์คํ ๋ด์ ๋ชจ๋ ์ํคํ ์ณ๋ ๋ชจ๋ํฐ๋ง ๋์ด์ผ ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์ํคํ
์ณ๊ฐ ์ ๊ณตํด์ฃผ๋ ๋ฉํธ๋ฆญ ์ธ์๋ ์ํคํ
์ณ์ application ์ด ํต์ ํ๋ ๋ถ๋ถ์์ ๋ฉํธ๋ฆญ ์์งํ๊ธฐ
(์์ฒญ ํ์, ์์ฒญ ์๊ฐ, ์๋ฌ ํ์ ์ฒดํฌ)
2) ์๋น์ค path ๋ณ๋ก ๋ฉํธ๋ฆญ ์์ง์ด ๊ฐ๋ฅํด์ผ ํ๋ค.(์ด๋ ์๋น์ค ์ง์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ํ์ ํ๊ธฐ ์ํ์ฌ)
- tag๋ฅผ ์ฌ์ฉํ์ฌ path ๋ณ ๋ฉํธ๋ฆญ์ ๊ตฌ๋ถํ์ฌ ์์งํ๋ค. (๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๋๋ผ๋ ํ๊ทธ๋ก ๋ฉํธ๋ฆญ์ด ๊ตฌ๋ถ๋๋ค)
3) ์ ์ฒด ํ์์ ๋ฉ์๋ ์์ถ ํ์ ๋ ๋ค ์์ง์ด ํ์ํ๋ค.
- ์ค์ ์๋น์ค ์ํ์์ ์ด๋ ๋ฉ์๋์ ํธ๋ํฝ์ด ์ด๋ ์ ๋ ๋ชฐ๋ฆฌ๋์ง๋ฅผ ํ์ ํ๋ ค๋ฉด ํ์ํ์ง ์์๊น?
- ํน์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๋ฉ์๋์๋ ์ถ๊ฐ์ ์ธ ์ํคํ
์ณ๋ฅผ ๋ถ์ฌ์ ์ฑ๋ฅ ๊ฐ์ ์ ํด๋ณผ ์๋ ์์ ๊ฒ ๊ฐ์.
4) http request time ๊ณผ๋ ๋ณ๊ฐ๋ก ๋ฉ์๋์ ์๋ต ์๋๋ ํ์ํ ๊ฒ
5) USE ๋ณด๋ค๋ RED ์ ์ค์ ์ ๋๊ณ ๋ฉํธ๋ฆญ์ ๋์์ธํ๋ ๊ฒ์ด ์ข์ง ์์๊น?
- ์ธํ๋ผ์ ์ ๋ณด๋ฅผ ์ ํด์ฃผ๋ USE ๊ด๋ จ ๋ฉํธ๋ฆญ๋ค์ ๊ธฐ๋ณธ actuator metrics ๋ฑ์์ ์ ๊ณตํด์ค๋ค.
- ๋ฐ๋ฉด ์๋น์ค ๋ ๋ฒจ์ ์ ๋ณด๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ฉํธ๋ฆญ์ ๋ณ๋๋ก ์ ๊ณตํด์ฃผ์ง ์์ (๊ธฐ๊ปํด์ผ http request ์ ๊ด๋ จ๋ ๋ฉํธ๋ฆญ๋ค ์ ๋์ธ๋ฐ, ์ด๊ฒ๋ ์์ฒญ ์ ์ฒด๋ฅผ ์๋ ค์ค ๋ฟ์ด์ง ๊ฐ ์๋น์ค ๋ ๋ฒจ์์๋ ๋ชจ๋ํฐ๋ง์ด ๋ถ๊ฐ๋ฅ
- RED ๋ฐฉ๋ฒ๋ก ์ ์ฌ์ฉํด์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ ์, ๊ฐ๊ฐ์ ์๋น์ค ๋ณ๋ก ์์ฒญ ํ์(Rate), ์๋ฌ ํ์ ๋ฐ ๋ฐ์ ์ง์ (Error), ์ฒ๋ฆฌ ์๊ฐ(์คํ๋ง ๋ด๋ถ์ ์ฝ๋ ๋ฌธ์ ์ธ์ง? ์ฐ๊ฒฐ๋ ์ํคํ ์ณ์ ๋ฌธ์ ์ธ์ง?)(Duration)์ ์๊ฐํด๋ณด๊ณ ๋์์ธ ํ๊ธฐ.
- Backend App (Spring Actuator)
- Frontend App (Node Exporter)
- Nginx (Nginx Exporter)
- Opensearch (Opensearch Exporter)
- MySQL (MySQL Exporter)
- Redis (Redis Exporter)
- Node: Springboot, Vue.js ๋ฑ์ ๋์ํ๋ WorkerNode ๋ชจ๋ํฐ๋ง (Node Exporter)
{
"names": [
# ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๊ณ Ready ์ํ๊ฐ ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ
"application.ready.time",
# ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋๊ธฐ ์์ํ ์๊ฐ
"application.started.time",
# ๋์คํฌ์ ์ฌ์ ๊ณต๊ฐ
"disk.free",
# ๋์คํฌ์ ์ด ์ฉ๋
"disk.total",
# ํ์ฌ ํ์ฑํ๋ executor ์์
์ ์
"executor.active",
# ์๋ฃ๋ executor ์์
์ ์
"executor.completed",
# executor ํ์ ํต์ฌ ํฌ๊ธฐ
"executor.pool.core",
# executor ํ์ ์ต๋ ํฌ๊ธฐ
"executor.pool.max",
# executor ํ์ ํ์ฌ ํฌ๊ธฐ
"executor.pool.size",
# executor ํ์ ํ์ ๋๊ธฐ ์ค์ธ ์์
์ ์
"executor.queue.remaining",
# ํ์ฌ executor ํ์ ๋๊ธฐ ์ค์ธ ์์
์ ์
"executor.queued",
# ์ด HTTP ์๋ฒ ์์ฒญ์ ์
"http.server.requests",
# ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ HTTP ์๋ฒ ์์ฒญ์ ์
"http.server.requests.active",
# JVM ๋ฒํผ์ ๊ฐ์.
"jvm.buffer.count",
# ์ฌ์ฉ ์ค์ธ JVM ๋ฒํผ ๋ฉ๋ชจ๋ฆฌ ์.
"jvm.buffer.memory.used",
# JVM ๋ฒํผ์ ์ด ์ฉ๋.
"jvm.buffer.total.capacity",
# ๋ก๋๋ JVM ํด๋์ค์ ์
"jvm.classes.loaded",
# ์ธ๋ก๋๋ JVM ํด๋์ค์ ์
"jvm.classes.unloaded",
# JVM์์์ ํด๋์ค ์ปดํ์ผ ์๊ฐ
"jvm.compilation.time",
# GC(Garbage Collection) ์ค์ ์ด์์๋ ๊ฐ์ฒด์ ํฌ๊ธฐ
"jvm.gc.live.data.size",
# GC ์ค์ ์์ง๋ ์ ์๋ ์ต๋ ๋ฐ์ดํฐ ํฌ๊ธฐ
"jvm.gc.max.data.size",
# GC๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์
"jvm.gc.memory.allocated",
# GC๋ก ํ๋ก๋ชจ์
๋ ๋ฉ๋ชจ๋ฆฌ ์
"jvm.gc.memory.promoted",
# GC ์ค๋ฒํค๋.
"jvm.gc.overhead",
# GC ์ผ์ ์ ์ง ์๊ฐ.
"jvm.gc.pause",
# JVM์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด
"jvm.info",
# JVM์ด ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์ค์ ํ์ฌ ์ปค๋ฐ๋(ํ๋ณด๋) ๋ฉ๋ชจ๋ฆฌ ์
"jvm.memory.committed",
# JVM์ด ์ต๋๋ก ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์
"jvm.memory.max",
# ๊ฐ๋น์ง ์ปฌ๋ ์
ํ์ JVM ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ
"jvm.memory.usage.after.gc",
# JVM์ด ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ์
"jvm.memory.used",
# ํ์ฌ ์คํ ์ค์ธ ๋ฐ๋ชฌ(๋ฐฑ๊ทธ๋ผ์ด๋) ์ค๋ ๋์ ์
"jvm.threads.daemon",
# ํ์ฌ ํ์ฑํ๋ ์ค๋ ๋์ ์
"jvm.threads.live",
# ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋์ ์ต๋๋ก ํ์ฑํ๋ ์ค๋ ๋์ ์
"jvm.threads.peak",
# ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ฉด์ ์์๋ ์ด ์ค๋ ๋์ ์
"jvm.threads.started",
# ํ์ฌ ์ค๋ ๋์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฉํธ๋ฆญ
"jvm.threads.states",
# Logback ๋ก๊น
์ด๋ฒคํธ์ ์ด ์
#์ ํ๋ฆฌ์ผ์ด์
์์ ๋ก๊น
์ด ๋ฐ์ํ ๋๋ง๋ค ์ด ๊ฐ์ด ์ฆ๊ฐ
"logback.events",
# ํ์ฌ ํ๋ก์ธ์ค์ CPU ์ฌ์ฉ๋ฅ
"process.cpu.usage",
# ํ๋ก์ธ์ค๊ฐ ์์๋ ์๊ฐ
"process.start.time",
# ํ๋ก์ธ์ค๊ฐ ์คํ๋ ์๊ฐ
"process.uptime",
# ์์คํ
์์ ์ฌ์ฉ ๊ฐ๋ฅํ CPU ์ฝ์ด์ ์
"system.cpu.count",
# ์์คํ
์ ์ฒด CPU ์ฌ์ฉ๋ฅ
"system.cpu.usage",
# ํ์ฌ ํ์ฑํ๋ Tomcat ์ธ์
์ ์
"tomcat.sessions.active.current",
# Tomcat ์ธ์
์ ์ต๋ ํ์ฑํ ์
"tomcat.sessions.active.max",
# ์ ํจํ ์ต๋ Tomcat ์ธ์
์
"tomcat.sessions.alive.max",
# ์ ํ๋ฆฌ์ผ์ด์
์์ ์์ฑ๋ ์ด Tomcat ์ธ์
์
"tomcat.sessions.created",
# ๋ง๋ฃ๋ Tomcat ์ธ์
์ ์ด ์
"tomcat.sessions.expired",
# ๊ฑฐ๋ถ๋ Tomcat ์ธ์
์ ์ด ์
"tomcat.sessions.rejected"
]
}
- 1์ฐจ
2. USE / RED ๊ฐ๊ฐ Error ๋ฉํธ๋ฆญ ์์ง์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ํ์ธ
*Spring
USE
U
(disk.total - disk.free) / disk.total ( (์ ์ฒด ์ฉ๋ - ์ฌ์ ์ฉ๋) / ์ ์ฒด ์ฉ๋)
system.cpu.usage (์ ์ฒด ์์คํ
cpu ์ฌ์ฉ๋ฅ )
process.cpu.usage (ํ๋ก์ธ์ค cpu ์ฌ์ฉ๋ฅ )
(jvm.memory.max - jvm.memory.used) / jvm.memory.max (jvm ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ )
(executor.pool.size - executor.queue.remaining) / executor.pool.size (ํ์ฌ ํ ์ฌ์ฉ๋)
S
(executor.pool.size - executor.queued) / executor.pool.size ( ์ค๋ ๋ ํ์ ํฌํ ์ํ )
executor.queued (์ค๋ ๋ ํ์ ๋๊ธฐ์ด์ ํ์ฌ ๋๊ธฐ ์ค์ธ ์์
์ ์)
jvm.gc.overhead
E
??๊ธฐ๋ณธ ์ ๊ณต merics์ค์์ ์๋ฌ ์นด์ดํธ ํ ๋งํ ๋ฉํธ๋ฆญ์ด ๋ญ๊ฐ ์๋์ง
RED
R
http.server.requests (์ด HTTP ์์ฒญ ์)
http.server.requests.active ( ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ HTTP ์์ฒญ ์ )
-> 1๋ถ ๋จ์๋ก ๋์ด์ (์ด HTTP ์์ฒญ - ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ HTTP ์์ฒญ) / ์ด HTTP ์์ฒญ ํ๋ฉด
์์ฒญ์ด ์ผ๋ง๋ ๋จ์์๋์ง๋ฅผ ์ ์ ์์ ๋ฏ
??
D
??
Opensearch
USE
U
CPU_Utilization (CPU ์ฌ์ฉ๋ฅ )
Disk_Utilization (๋์คํฌ ์ฌ์ฉ๋ฅ )
Heap_Used / Heap_Maxed (๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ )
IO_ReadThroughput (์ง๋ 5์ด๊ฐ ๋์คํฌ์์ ์ฝ์ด์จ ๋ฐ์ดํฐ ์)
S
(ThreadPool_TotalThreads - ThreadPool_ActiveThreads) / ThreadPool_TotalThreads
(์ค๋ ๋ ํ ์์ฌ๋)
E
Paging_MajfltRate (์ด๋น ๋ฐ์ํ ์ฃผ์ํ ์ค๋ฅ ์)
Paging_MinfltRate (์ด๋น ๋ฐ์ํ ๋ง์ด๋ ์ค๋ฅ ์)
RED
R
HTTP_TotalRequest
HTTP_RequestDocs
Disk_ServiceRate
E
ThreadPool_RejectedReqs(๊ฑฐ๋ถ๋ executions ์)
D
Disk_WaitTime( ์ง๋ 5์ด๊ฐ ๋์คํฌ r/w ํ๊ท ์๋ต์๊ฐ)
GC_Collection_Time
- 2์ฐจ
2. ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ์ด ์ ์ ํ๊ฒ ์ ์ฉ๋๊ณ ์๋์ง ํ์ธ ํ์
3. ์ถ๊ฐ์ ์ธ ๋ฉํธ๋ฆญ์ด ์ด๋ ๊ฒ ์์ ์ ์์์ง ํ์ธ (ํฅํ Redis ์ฐ๊ฒฐ ์ Redis ์๋ต ์๊ฐ / ์ ์ ์๋ฌ ๊ด๋ จ ๋ฉํธ๋ฆญ ์ถ๊ฐ ๋ฑ)
search.request.count(controller)
-
ํด๋น ์ด๋ํฐ(์ปจํธ๋กค๋ฌ)๋ก ๋ค์ด์จ ์ ์ฒด ์์ฒญ ์ ํ์ธ
-
ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ํ์
-
์ถ๋ ฅ ์์
# HELP search_request_count_total
# TYPE search_request_count_total counter
search_request_count_total{application="webtoon-search",class="search-webtoon-controller",exception="IllegalArgumentException",method="searchWebtoon",result="failure"} 4.0
search_request_count_total{application="webtoon-search",class="search-webtoon-controller",exception="none",method="searchWebtoon",result="success"} 3.0
search.request.duration(controller)
-
์นํฐ ๊ฒ์ ๋ฉ์๋์ response ๊น์ง์ ๋ฐํ ์๊ฐ ํ์ธ
-
handler method ~ opensearch ๊น์ง์ ์ ์ฒด์ ์ธ ์๋ต ์๊ฐ ํ์
-
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋๋ฐ ์ ์ฒด ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง๋ ๊ฑฐ๋ฉด ํฐ์บฃ ~ Nginx ~ LB ~ Client ์ํคํ ์ณ์ ๋ฌธ์ ๋ฅผ ์์ฌํด๋ณผ ์ ์์ ๊ฒ
-
์ถ๋ ฅ ์์
# HELP search_request_duration_seconds duration until search webtoon list
# TYPE search_request_duration_seconds summary
search_request_duration_seconds_count{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.web.SearchWebtoonController",endpoint="/webtoons/search",exception="IllegalArgumentException",method="searchWebtoon"} 4
search_request_duration_seconds_sum{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.web.SearchWebtoonController",endpoint="/webtoons/search",exception="IllegalArgumentException",method="searchWebtoon"} 7.155E-4
search_request_duration_seconds_count{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.web.SearchWebtoonController",endpoint="/webtoons/search",exception="none",method="searchWebtoon"} 3
search_request_duration_seconds_sum{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.web.SearchWebtoonController",endpoint="/webtoons/search",exception="none",method="searchWebtoon"} 0.1211729
search.condition.null.count(service)
-
controller๋ก๋ถํฐ ๋ฐ์์ค๋ ๊ฒ์์ด ๊ฐ์ฒด๊ฐ null ๋๋ ๋น ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธ
-
ํ๋ก ํธ ๋จ์์ 1์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ ์ผ์ด์ค๊ฐ ์์ ๊ฒฝ์ฐ ์๋ฌ ๋ฐํ ํ ์นด์ดํ
-
์๋ฏธ ์๋ ๋ฉํธ๋ฆญ์ผ ๊ฐ๋ฅ์ฑ๋ ์์ (์นด์ดํ ์ผ๋ก ์ด๋ค ํจ๊ณผ๋ฅผ ์ป์ ์ ์์์ง?)
-
์ถ๋ ฅ ์์
# HELP search_condition_null_count_total title is null
# TYPE search_condition_null_count_total counter
search_condition_null_count_total{application="webtoon-search",class="search-webtoon-service",endpoint="/webtoons/search",method="search-webtoons"} 4.0
search.opensearch.reply.duration(adapter)
-
adapter ~ opensearch ๊ฐ์ ์๋ต ์๊ฐ ํ์ธ
-
์ถ๋ ฅ ์์
# HELP search_opensearch_reply_duration_seconds duration until opensearch reply
# TYPE search_opensearch_reply_duration_seconds summary
search_opensearch_reply_duration_seconds_count{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.searchengine.SearchEngineAdapter",endpoint="/webtoons/search",exception="none",method="loadWebtoons"} 3
search_opensearch_reply_duration_seconds_sum{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.searchengine.SearchEngineAdapter",endpoint="/webtoons/search",exception="none",method="loadWebtoons"} 0.1199463
# HELP search_opensearch_reply_duration_seconds_max duration until opensearch reply
# TYPE search_opensearch_reply_duration_seconds_max gauge
search_opensearch_reply_duration_seconds_max{application="webtoon-search",class="com.samsamohoh.webtoonsearch.adapter.searchengine.SearchEngineAdapter",endpoint="/webtoons/search",exception="none",method="loadWebtoons"} 0.0971084
opensearch.connection.fail.count(adapter)
-
opensearch์ ์๋ต ์คํจ ๋ฐ์์ ํ์ธ
-
opensearch ์๋ต ์คํจ๊ฐ ์ผ๋ง๋ ์์ฃผ ์์๋์ง ์นด์ดํ
-
ํ์๊ฐ ๋ง์ผ๋ฉด spring ~ opensearch ๊ฐ์ ๋คํธ์ํฌ ๋ฌธ์ ๋๋ opensearch ์์ฒด์ ๋ฌธ์ ์์ฌ๊ฐ๋ฅ.
-
์ถ๋ ฅ ์์
# HELP opensearch_connection_fail_count_total metrics for opensearch connecting failure
# TYPE opensearch_connection_fail_count_total counter
opensearch_connection_fail_count_total{application="webtoon-search",class="search-engine-adapter",endpoint="/webtoons/search",method="load-webtoons"} 2.0