1. APM ์ด๋?
APM์ด๋ Application Performance Management / Application Performance Monitoring์ ์ฝ์์ด๋ค.
์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ด๋ฆฌ/๋ชจ๋ํฐ๋ง ์ ๋ด๋นํ๋ค.
APM ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์ ๋ฐ์ํ๋ ๋ฉํธ๋ฆญ(CPU, Memory, Thread, Transaction, …), ์ด๋ฒคํธ, ๋ก๊ทธ, ํธ๋์ญ์ ๋ฑ์ ๋ชจ๋ํฐ๋งํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ถ์ํ ๋ฐ์ดํฐ๋ ์๋์ ๋ชฉ์ ์ ์ํด ํ์ฉํ ์ ์๋ค.
- ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์์ธกํ๊ณ ๋ฐฉ์ง
- ๊ณ ๊ฐ ๊ธฐ๋ ์ฑ๋ฅ ๋ณด์ฅ, ๊ณ ๊ฐ ๊ฒฝํ ํฅ์
- ์๋ต ์๊ฐ ๋ณด์ฅ
- ๊ฐ์ฉ์ฑ ์ฆ๋, ๋ค์ดํ์ ๊ฐ์
2. Pinpoint ์ Prometheus+Grafana ์ฐจ์ด
Prometheus+Grafana๋ ์ ๋ช ํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ด๋ค. Pinpoint์ Prometheus๋ ๋น์ทํ ์ญํ ์ ํ์ง๋ง ์ฌ์ฉํ๋ ๋ชฉ์ ์์ ์ฝ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ฐ๋๋ค.
์ถ์
Prometheus๋ ์๋ฒ์ ๊ฐ ์งํ(metric)์ ํ์ฉํด์ JVM Memory, ์ด๋น ํธ๋์ญ์ ๋ฐ์ ์, Thread ์ํฉ ๋ฑ ์์ ์ํ๋ฅผ ํ์ ํ๊ธฐ ์ข๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด์ ์ธ ์์คํ ์ํ๋ฅผ ์๊ฐํํ ์ ์์ด ์ ๋ฐ์ ์ธ ์์ ๊ด๋ฆฌ์ ์ ํฉํ๋ค.
๋ฐ๋ฉด, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋จ์ํ ์๊ฐํ๋ง์ผ๋ก๋ ์ ํํ ์์ธ์ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค. ๊ทธ๋ ์ง๋ง, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋จ์ํ ์๊ฐํ๋ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ ํํ ์์ธ์ ํ์ ํ๊ธฐ ํ๋ค ์๋ ์๋ค.
์ด๋ Pinpoint๋ ํธ๋ ์ด์ฑ(tracing)์ ํตํด ์์ฒญ์ ํ๋ฆ์ ์ถ์ ํ๊ณ , ํน์ ๋ฌธ์ ์ง์ ์ ๋ช ํํ ํ์ ํ ์ ์๋๋ก ๋์์ค๋ค.
์ฝ๊ฒ ๋งํด, Prometheus์ Grafana๋ ์ ์ฒด์ ์ธ ์์คํ ์ ์ํ(์ฒ)๋ฅผ ํ์ ํ๋ ๋ฐ ์ ๋ฆฌํ๋ฉฐ, Pinpoint๋ ํน์ ๋ฌธ์ ์ ์์ธ(๋๋ฌด)์ ๊น์ด ๋ถ์ํ๋ ๋ฐ ํจ๊ณผ์ ์ด๋ค.
๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ง์
Prometheus๋ ๋ด์ฅ๋ ์๊ณ์ด ๋ฐ์ดํฐ์ ์์งํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , PromQL์ ํตํด ์ง์ํ ์ ์๋ค.
Pinpoint์์๋ Elasticsearch์ HBase์ ๊ฐ์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๊ณ , Kibana๋ฅผ ํตํด ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ์๊ฐํํ ์๋ ์๋ค.
์์ง ๋ฐฉ์
๋ APM ๋๊ตฌ๋ ๋ฐ์ดํฐ ์์ง ๋ฐฉ์์ ๋ฐ๋ฅธ ํ์ฅ์ฑ ์ฐจ์ด๊ฐ ์๋ค.
Prometheus๋ Exporter๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ฅผ Pull ๋ฐฉ์์ผ๋ก ์์งํ๊ธฐ ๋๋ฌธ ๋ถ์ฐ ์๋ฒ์ ์ ์ฉํ๊ธฐ์ ์ ํฉํ์ง ์๋ค.
Pinpoint๋ Prometheus๋ ๋ค๋ฅด๊ฒ Push ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ Collector์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋ถ์ฐ ์๋ฒ์์๋ ์ ๋์ํ๋ค.
ํ์ฅ์ฑ์ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋์๊ณ , ์์ง๋ ๋ฐ์ดํฐ์ ์์ด ์ฆ๊ฐํด๋ ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- Pinpoint Agent - ์ ํ๋ฆฌ์ผ์๋ ์ ์ฑ๋ฅ ๊ด๋ จ ์งํ ์์ง ๋ฐ ์ ๋ฌ
- Pinpoint Collector - Agent์์ ๋ฐ์ ์ ๋ณด๋ฅผ HBase์ ์ ์ฌ
- Pinpoint Web UI - ์์ง๋ ์ ๋ณด๋ฅผ ํ๋ฉด์ผ๋ก ์ ๊ณตํ๋ค.(์ฑ๋ฅ, ๋ชจ๋ํฐ๋ง, ์งํ)
3. Pinpoint ๋์ฐ๊ธฐ
ํ ์คํธ๋ฅผ ์ํด 2๊ฐ์ ๊ฐ์ ์๋ฒ๋ฅผ ๋์ ๊ณ ,
Server1์ SpringBoot + Agent
Server2์ HBase, Collector, Pinpoint Web์ ๋์ธ ๊ฒ์ด๋ค.
Server1 ํ๊ฒฝ์ SpringBoot Application์ ๋์ฐ๊ธฐ ์ํ Docker, Java21, .. ์ ์ค์นํด๋๊ณ
Server2 ํ๊ฒฝ์ Java8 ๋ง ์ค์นํด๋๋ค.
Pinpoint์ ๋ฒ์ ์ Pinpoint Github์์ ๋ณธ์ธ์๊ฒ ๋ง์ถฐ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋๋ SpringBoot 3.x, Java21 ์
Agent: 3.0.1 (3 ์ดํ ๋ฒ์ ์ด Agent๋ Java21๊ณผ ํธํX)
HBase: 1.2.7
Collector: 2.2.2
Web: 2.2.2
๋ฒ์ ์ ์ฌ์ฉํด์ ๋์ ๊ณ ๋ฌธ์ ์์ด ๋์ํ๋ค.
Server2 (APM ํ๊ฒฝ ์ธํ )
Pinpoint๋ Hbase 1.2.X ๋ฒ์ ์ ์ต์ ํ๋์ด์๋ค๊ณ ํด์ 1.2.7์ ์ค์นํ๋ค.
HBase ์ค์น
wget https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz
tar xzvf hbase-1.2.7-bin.tar.gz
vi ./hbase-1.2.7/conf/hbase-env.sh
// ์ด ์ต์
์ ์ฃผ์์ฒ๋ฆฌ ํ์ง ์์ผ๋ฉด hbase ์คํ์ warning ์ด ๋ธ
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
./hbase-1.2.7/bin/start-hbase.sh
HBase ์ JAVA Version ํธํ์ ์๋์ ๊ฐ๋ค.
PinPoint ์ ๋ณด๋ฅผ ๋ด์ ํ ์ด๋ธ ์์ฑ
# ์คํฌ๋ฆฝํธ ๋ค์ด
wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase
# ์คํฌ๋ฆฝํธ ์คํ
./hbase-1.2.7/bin/hbase shell hbase-create.hbase
Pinpoint Collector ์ค์น
// jar ํ์ผ ๋ค์ด
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-collector-boot-2.2.2.jar
// ์คํ๊ถํ
chmod +x pinpoint-collector-boot-2.2.2.jar
// ์คํ
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.2.2.jar > collector.log 2> collector-error.log &
Pinpoint Web ์ค์น
# jar ํ์ผ ๋ค์ด
wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-web-boot-2.2.2.jar
# ์คํ ๊ถํ ๋ถ์ฌ
chmod +x pinpoint-web-boot-2.2.2.jar
# ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.2.2.jar > web.log 2> web-error.log &
Server1 (SpringBoot + Agent)
Agent ์ค์น
# agent ์ค์น
wget https://repo1.maven.org/maven2/com/navercorp/pinpoint/pinpoint-agent/3.0.1/pinpoint-agent-3.0.1.tar.gz
# ์์ถ ํด์
tar xvzf pinpoint-agent-3.0.1.tar.gz
# config ํ์ผ ์์
sudo vi pinpoint-root.config
# ์์์ ๊ตฌ์ฑํ monitoring EC2์ ip๋ก ์์
profiler.transport.grpc.collector.ip=pinpoint ip๋ก ๋ณ๊ฒฝ
Agent๋ Java21 ๊น์ง ์ง์ ๊ฐ๋ฅํ๋ค.
Spring Boot Dockerfile ์์ฑ
# Java 21 OpenJDK ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์
FROM eclipse-temurin:21-jdk-jammy
# ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
# JAR ํ์ผ ๋ณต์ฌ
COPY build/libs/arch-unit-test-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
# ์ ํ๋ฆฌ์ผ์ด์
์คํ ๋ช
๋ น
ENTRYPOINT ["java", "-jar","-javaagent:/pinpoint/pinpoint-bootstrap-3.0.1.jar", "-Dpinpoint.agentId=appDev","-Dpinpoint.applicationName=app1","-Dpinpoint.config=/pinpoint/pinpoint-root.config", "-Duser.timezone=Asia/Seoul", "/app/app.jar"]
์คํ ๋ช ๋ น์ ๋ณด๋ฉด /pinpoint ํ์์์ pinpoint ๊ด๋ จํด์ ์ ๊ทผํ๊ณ ์๋ค. ๋ฐ๋ผ์ ์ ๋ด์ฉ๋ค์ ์ปจํ ์ด๋ ์์ผ๋ก ๋ณผ๋ฅจ ๋ง์ดํธ ์์ผ์ค์ผ ํ๋ค.
Spring Boot Docker ์ปจํ ์ด๋ ์คํ
sudo docker run -d -p 8080:8080 -v /home/js.kim/pinpoint/pinpoint-agent-3.0.1:/pinpoint --network pinpoint --name app1 app1
SpringBoot ์คํ ์ ์๋์ ๊ฐ์ด PINPOINT๊ฐ ๋จผ์ ๋ฌ๋ค.
Postgres DB ์ปจํ ์ด๋ ์คํ
docker run -d --network pinpoint --name postgres -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=testDB -p 15432:5432 postgres
4. Pinpoint ๊ธฐ๋ฅ
Server2์ ๋์ ๋ Pinpoint Web ์ฃผ์ [ip]:8080 ๋ก ์ ๊ทผํด๋ณด๋ฉด Agent์ ํจ๊ป ์คํ์์ผฐ๋ SpringBoot Application์ด ๋ฌ๋ค.
Postman์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด ์ด๋ฐ์์ผ๋ก ServerMap์ด ์ ๊ณต๋๊ณ ํธ์ถ ํ์ ๋ํ ๋ณด์ฌ์ง๋ค.
์ฐ์ธก ํจ๋ ๋งจ ์์ Scatter Chart๊ฐ ์กด์ฌํ๋๋ฐ RealTime Scatter Graph๋ฅผ ๋๋๊ทธํ์ฌ ๋ค์ด๊ฐ๋ฉด, Pinpoint CallStack ์ ๋ณผ ์ ์๋ค.
์๋ฒ Inspector ์ ๋ณด๋ ํ์ธํ ์ ์๋ค.
์๋์ ๊ฐ์ ์ ๋ณด๋ค์ ํ์ธํ ์ ์๋ค.
- Heap Usage: JVM์ Heap ์ ๋ณด์ Major Garbage Collection์ ์์๋ ์๊ฐ.
- Non-Heap Usage: JVM์ Non-Heap ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด์ Major Garbage Collection์ ์์๋ ์๊ฐ.
- JVM/System CPU Usage: JVM๊ณผ ์์คํ ์ CPU ์ฌ์ฉ๋. ๋ฉํฐ์ฝ์ด CPU์ ๊ฒฝ์ฐ ์ ์ฒด ์ฝ์ด ์ฌ์ฉ๋์ ํ๊ท ๊ฐ.
- Transactions Per Second: ์๋ฒ๋ก ์ ์ ๋ ์ด๋น ํธ๋์ญ์ ์.
- Active Requests: ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ธ Agent์ ํ์ฑ ์์ฒญ ํํฉ.
- Total Threads: Agent๊ฐ ์ฌ์ฉํ๋ ์ ์ฒด ์ฐ๋ ๋ ์.
- Response Time: Agent์ ํ๊ท ์๋ต ์๊ฐ.
- Open File Descriptors: ํ์ฌ ์ด๋ ค ์๋ File Descriptor์ ๊ฐ์ ๋ฐ ์ํ.
- Direct Buffer Count: Agent์ Direct Buffer ๊ฐ์.
- Direct Buffer Memory: Agent์ Direct Buffer ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํํฉ.
- Mapped Buffer Count: Agent์ Mapped Buffer ๊ฐ์.
- Loaded Classes: Agent์ ๋ก๋๋ ํด๋์ค์ ์ด ๊ฐ์.
5. ๋ง์น๋ฉฐ
Pinpoint๋ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ํ์ ํ๊ฑฐ๋ ๋นํจ์จ์ ์ธ ๋ฉ์๋์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ธฐ์ ์ ํฉํด๋ณด์๋ค. ๋ํ Zipkin ์ฒ๋ผ ๋ถ์ฐ ์ถ์ ๋ ๊ฐ๋ฅํ ๋ฟ๋๋ฌ JVM ๊ด๋ จํ ๋ฆฌ์์ค ์ฌ์ฉ ์ ๋ณด ๋ํ ํ์ธํ ์ ์๋ค.
ํนํ, Agent ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ PUSH ํด์ฃผ๊ธฐ ๋๋ฌธ์ MSA ํ๊ฒฝ์์๋ ์ ํฉํ๊ณ , Product ์ฝ๋ ์์ ์์ด ๊ตฌ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด ํฐ ์ฅ์ ์ธ ๊ฒ ๊ฐ๋ค.
์๋ฆผ ๊ธฐ๋ฅ์ ๋ค๋ค๋ณด์ง ์์์ง๋ง ์ด๋ฉ์ผ, SMS, ์นํ ์ ํตํด ์ ์กํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค.
+ ๋ชจ๋ํฐ๋ง, WAS๋ฅผ ํ๋์ ์๋ฒ์์ ๊ตฌ์ถํ๊ณ ์ถ๋ค๋ฉด
Pinpoint ๋ฅผ ๋์ ํ๊ธฐ ์ํด์ Java ๋ฒ์ ์ด ๊ต์ฅํ ์ค์ํ๋ค.
์ด๊ฒ์ ๊ฒ ๋ค ํ ์คํธํด๋ณธ ๊ฒฐ๊ณผ Java8๋ก ๋์ฐ๋๊ฒ Hbase, Pinpoint(Collector, Web)์ด๋ ์ฐฐ๋ก์ด๋ค.
ํ๋์ ์๋ฒ์์ Pinpoint ํด๊ณผ WAS๋ฅผ ๋์ฐ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด Java Version์ ๋ช ์์ ์ผ๋ก ์์ฑํ๊ณ ์คํํด์ฃผ๋ฉด ๋๋ค.
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ./hbase-1.2.7/bin/start-hbase.sh
start-hbase.sh ๊ฐ์ด ์ ์คํฌ๋ฆฝํธ๋ ์ ์คํฌ๋ฆฝํธ ์๋จ์ JAVA_HOME์ ๋ฐ๋ก ์ง์ ํด์ค๋ ๋๊ฐ์ด ๋์ํ๋ค.
๋๋ Pinpoint์ ํ์ํ ์ฑ๋ค์ ์คํํ๋ start-pinpoint-monitoring.sh ๋ผ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ฌ ๊ด๋ฆฌํ๋ ค ํ๋ค.
#!/bin/bash
# Java 8 ๊ฒฝ๋ก ์ค์
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH
# ๋ก๊ทธ ๋๋ ํ ๋ฆฌ ์์ฑ
LOG_DIR="./logs"
mkdir -p $LOG_DIR
# 1. Start HBase
echo "Starting HBase..."
JAVA_HOME=$JAVA_HOME ./hbase-1.2.7/bin/start-hbase.sh > $LOG_DIR/hbase-start.log 2>&1
if [ $? -ne 0 ]; then
echo "HBase failed to start. Check the log: $LOG_DIR/hbase-start.log"
exit 1
fi
echo "HBase started successfully."
# 2. Run HBase shell to create tables
echo "Running HBase shell for table creation..."
JAVA_HOME=$JAVA_HOME ./hbase-1.2.7/bin/hbase shell hbase-create.hbase > $LOG_DIR/hbase-create.log 2>&1
if [ $? -ne 0 ]; then
echo "HBase shell execution failed. Check the log: $LOG_DIR/hbase-create.log"
exit 1
fi
echo "HBase tables created successfully."
# 3. Start Pinpoint Collector
echo "Starting Pinpoint Collector..."
nohup $JAVA_HOME/bin/java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.2.2.jar > $LOG_DIR/collector.log 2> $LOG_DIR/collector-error.log &
if [ $? -ne 0 ]; then
echo "Pinpoint Collector failed to start. Check the log: $LOG_DIR/collector-error.log"
exit 1
fi
echo "Pinpoint Collector started successfully."
# 4. Start Pinpoint Web
echo "Starting Pinpoint Web..."
nohup $JAVA_HOME/bin/java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.2.2.jar > $LOG_DIR/web.log 2> $LOG_DIR/web-error.log &
if [ $? -ne 0 ]; then
echo "Pinpoint Web failed to start. Check the log: $LOG_DIR/web-error.log"
exit 1
fi
echo "Pinpoint Web started successfully."
echo "All services started successfully."
์ฐธ๊ณ ๋ก ํจํค์ง ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.