Skip to content

Latest commit

ย 

History

History
111 lines (84 loc) ยท 5.04 KB

File metadata and controls

111 lines (84 loc) ยท 5.04 KB

LogPilot ํด๋ผ์ด์–ธํŠธ ๊ฐ€์ด๋“œ

์ด ๋ฌธ์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— LogPilot ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ฐ๋™ํ•˜๊ณ  ์ด๋ฒคํŠธ/๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆฌ๋ฐ์— ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Producer(logpilot-demo-produce)์™€ Consumer(logpilot-demo-consume) ๋ฐ๋ชจ ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•˜์—ฌ '๊ฒฝ๋Ÿ‰ ์นดํ”„์นด' ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ํ•„์ˆ˜ ์กฐ๊ฑด: ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— LogPilot Server๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ A: Gradle ์‹คํ–‰

./gradlew :logpilot-server:bootRun

์˜ต์…˜ B: Docker ์‹คํ–‰

docker build -t logpilot-server .
docker run -p 8080:8080 -p 50051:50051 logpilot-server

์˜ต์…˜ C: Kubernetes ์‹คํ–‰

# ์ƒ์„ธ ๊ฐ€์ด๋“œ๋Š” K8S.ko.md ์ฐธ์กฐ
kubectl apply -f k8s/

๊ธฐ๋ณธ ์„œ๋ฒ„ ์ฃผ์†Œ: localhost:50051 (gRPC) / http://localhost:8080 (REST)


1. ๋ชจ๋“œ ์„ ํƒ: REST vs gRPC

LogPilot์€ ๋‘ ๊ฐ€์ง€ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜์„ธ์š”.

ํŠน์ง• REST (HTTP/1.1) gRPC (HTTP/2 + Protobuf)
์„ฑ๋Šฅ ๋ณดํ†ต (ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ JSON) ๋†’์Œ (๋ฐ”์ด๋„ˆ๋ฆฌ Protobuf)
์ฒ˜๋ฆฌ๋Ÿ‰ (Throughput) ํ‘œ์ค€ ๋†’์Œ (Multiplexing ์ง€์›)
ํƒ€์ž… ์•ˆ์ •์„ฑ ๋А์Šจํ•จ (JSON) ์—„๊ฒฉํ•จ (IDL ์ •์˜)
์„ค์ • ๋‚œ์ด๋„ ์‰ฌ์›€ (ํ‘œ์ค€ HTTP) HTTP/2 ์ง€์› ํ•„์š”
๊ถŒ์žฅ ๋Œ€์ƒ ๋‹จ์ˆœ ๋กœ๊น…, ๋ฐฉํ™”๋ฒฝ ์ œ์•ฝ ํ™˜๊ฒฝ ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ์ƒ์„ฑ, ๋กœ๊ทธ ๋ถ„์„/์†Œ๋น„

๐Ÿš€ ์ถ”์ฒœ ์‚ฌํ•ญ

  • gRPC ์‚ฌ์šฉ: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ, ๊ณ ์„ฑ๋Šฅ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ, ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” Consumer ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.
  • REST ์‚ฌ์šฉ: ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ, ๊ฒฝ๋Ÿ‰ ์ƒ์‚ฐ์ž(Producer), ๋˜๋Š” gRPC ํฌํŠธ ์‚ฌ์šฉ์ด ์ œํ•œ๋œ ํ™˜๊ฒฝ.

2. Producer ์—ฐ๋™ (์ด๋ฒคํŠธ ๋ฐœํ–‰)

Producer๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณด๋‚ด๋ ค๋ฉด Logback Appender๋ฅผ, ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด LogPilotClient๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Producer๋Š” ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Logback Appender๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: logpilot-demo-produce

์ด ๋ชจ๋“ˆ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์ฑ„์šฉ ์‚ฌ์ดํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. LogPilotAppender๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๋ฐฐ์น˜(Batch)๋กœ ๋ฌถ์–ด ๋น„๋™๊ธฐ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์˜ˆ์‹œ (logback-spring.xml):

<appender name="LOGPILOT" class="com.logpilot.logback.LogPilotAppender">
    <!-- Appender๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ REST๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„ค์ • ๊ฐ€๋Šฅ -->
    <serverUrl>http://localhost:8080</serverUrl>
    <serviceName>my-service</serviceName>
    <apiKey>your-api-key</apiKey>

    <!-- ์„ฑ๋Šฅ ์ตœ์ ํ™” (๋ฐฐ์น˜ ์ „์†ก) -->
    <enableBatching>true</enableBatching>
    <batchSize>100</batchSize>
    <flushIntervalMillis>5000</flushIntervalMillis>
</appender>

Tip: ์œ„ ์„ค์ •์ฒ˜๋Ÿผ batching์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. Consumer ์—ฐ๋™ (๋ฉ”์‹œ์ง€ ์†Œ๋น„)

Consumer๋Š” ์„œ๋ฒ„์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. LogPilot์€ Kafka ์Šคํƒ€์ผ์˜ **์˜คํ”„์…‹ ๊ด€๋ฆฌ(Offset Management)**๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ํ•œ ๋ฒˆ์”ฉ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: logpilot-demo-consume

์ด ๋ชจ๋“ˆ์€ ๋งค์ดˆ ๋กœ๊ทธ๋ฅผ ํด๋งํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ฑ„์šฉ ํ†ต๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•ด gRPC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ (AnalyticsService.java):

// ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™” (gRPC ๋ชจ๋“œ)
LogPilotClient client = LogPilotClient.builder()
        .serverUrl("localhost:50051")
        .clientType(LogPilotClient.ClientType.GRPC)
        .build();

// ์†Œ๋น„์ž ID๋ฅผ ์‚ฌ์šฉํ•œ ์ด๋ฒคํŠธ ์กฐํšŒ (์•ˆ์ •์ ์ธ ์˜คํ”„์…‹ ์ถ”์ )
// getLogs(channel, consumerId, limit)
List<LogEntry> events = client.getLogs("orders", "inventory-service", 100);

for (LogEntry event : events) {
    process(event);
    // autoCommit=false๊ฐ€ ์•„๋‹Œ ํ•œ ์˜คํ”„์…‹์€ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค.
}

์™œ gRPC์ธ๊ฐ€?: ๋ฐ๋ชจ์ฒ˜๋Ÿผ 1์ดˆ๋งˆ๋‹ค ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋กœ๊ทธ๋ฅผ ํด๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, gRPC์˜ ์ง€์† ์—ฐ๊ฒฐ(Persistent Connection)๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท์€ REST ๋ฐฉ์‹์— ๋น„ํ•ด CPU ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์„ ํฌ๊ฒŒ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.


4. ๋ฐ๋ชจ ์‹คํ–‰ํ•ด๋ณด๊ธฐ

์œ„์˜ ํŒจํ„ด๋“ค์ด ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•ด๋ณด์„ธ์š”:

  1. ์„œ๋ฒ„ ์‹œ์ž‘: ./gradlew :logpilot-server:bootRun
  2. Producer ์‹œ์ž‘: ./gradlew :logpilot-demo-produce:bootRun (Port 8082)
    • ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ (STEADY ๋ชจ๋“œ): curl -X POST "http://localhost:8082/simulation/start?mode=STEADY"
    • ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ ์ค‘์ง€: curl -X POST "http://localhost:8082/simulation/stop"
  3. Consumer ์‹œ์ž‘: ./gradlew :logpilot-demo-consume:bootRun (Port 8083)
    • ํ†ต๊ณ„ ํ™•์ธ: curl http://localhost:8083/analytics/stats