โ
๋ณธ ํ๋ก์ ํธ๋ Spring Boot์์ ๋ก๊ทธ๋ฅผ ๋ฐ์์ํค๊ณ , JMeter๋ก ๋ถํ ํธ๋ํฝ์ ์์ฑํ ํ, Filebeat โ Logstash โ Elasticsearch โ Kibana๋ก ์ด์ด์ง๋
์๋-ํฌ-์๋ ๋ก๊ทธ ํ์ดํ๋ผ์ธ์ ๊ตฌํํ ์ค์ตํ ํ๋ก์ ํธ์
๋๋ค.
โ
JSON ๊ธฐ๋ฐ ๋ก๊ทธ๋ฅผ ์์งํ์ฌ ๊ตญ๊ฐ๋ณ, ์๊ฐ๋๋ณ ๊ณต๊ฒฉ ์ถ์ด ๋ถ์๊น์ง ์ง์ ์๊ฐํํ๋ฉฐ, ์ด์ํ๊ฒฝ ํธ๋ฌ๋ธ์ํ
๊ฒฝํ๋ ํจ๊ป ์ค๊ณํ์ต๋๋ค.
| ๊ฐํ์ | ์ด์ ํ | ์ ์๋ฏผ | ํฉ๋ณ๊ธธ |
|---|---|---|---|
| kkangsol | lyjh98 | Jsumin07 | Gill010147 |
- โ ๋ก๊ทธ ๋ถ์ ์์คํ ๊ตฌ์ถ์ ์ ๊ณผ์ ์ ์ค๋ฌด ํ๋ฆ๋๋ก ๊ตฌํ
- โ JMeter ๊ธฐ๋ฐ์ ๊ณต๊ฒฉ ์๋๋ฆฌ์ค ์์ฑ โ ๊ตฌ์กฐํ๋ JSON ๋ก๊ทธ ์์ง
- โ Filebeat โ Logstash โ Elasticsearch โ Kibana๋ก ์ด์ด์ง๋ ์์ง/์์ธ/์๊ฐํ ํ์ดํ๋ผ์ธ ๊ฒ์ฆ
- โ ๊ณต๊ฒฉ ํจํด, ์๊ฐ๋, ๊ตญ๊ฐ๋ณ ์ด์ ๋ก๊ทธ ๋ถํฌ ์๊ฐํ๋ก ์ธ์ฌ์ดํธ ๋์ถ
| ๋ชฉ์ | ๊ธฐ๋ฅ | ๋ฒ์ |
|---|---|---|
| ๐ ๋ก๊ทธ ์์ง | Filebeat | 7.11.2 |
| โก ๋ฐ์ดํฐ ๊ฐ๊ณต | Logstash | 7.11.2 |
| ๐พ ์ ์ฅ/๊ฒ์ | Elasticsearch | 7.11.2 |
| ๐ ์๊ฐํ | Kibana | 7.11.2 |
| ๐ API/๋ฐ์ดํฐ | Spring Boot | 3.5.3 |
| ๐ ๋ถํ์์ฑ | JMeter | 5.6.3 |
์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์ฒญ ์์ ํ DTO ๊ธฐ๋ฐ ๋ก๊ทธ ์์ฑ
package com.example.loginlog.dto;
import lombok.Data;
@Data // Getter, Setter, toString ๋ฑ ํ์ํ lombok์์ฑ
public class LoginRequest {
private String email = "ian.lee@celebritymail.com"; // ์ด๋ฉ์ผ ๊ณ ์
private String password; //ํจ์ค์๋
private String country; //์ ์ ์๋ ๋๋ผ
private String timestamp; //์ ์ ์๋ ์๊ฐ
private boolean success; //์ฑ๊ณต ์คํจ
private String failureReason; //์คํจ ์ด์
}
์ฑ๊ณต/์คํจ ์ ๋ก๊ทธ ํํ ๊ตฌ๋ถํ์ฌ JSON ๋ก๊ทธ ๊ธฐ๋ก
package com.example.loginlog.controller;
import org.springframework.web.bind.annotation.RestController;
import com.example.loginlog.dto.LoginRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
@RestController // ์ด ํด๋์ค๊ฐ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์์ ๋ช
์
public class LoginController {
// ๋ก๊ทธ ์ฐ๊ธฐ ์ํ Logger๊ฐ์ฒด ์์ฑ
private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
// HTTP POST ์์ฒญ์ /login ๊ฒฝ๋ก์์ ๋ฐ์ ๋ ํด๋น ๋ฉ์๋ ์คํ
@PostMapping("/login")
// ์์ฒญ ๋ณธ๋ฌธ์ JSON์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋๋ฐ, ์ด ๋ฐ์ดํฐ๋ฅผ LoginReequest ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ
public ResponseEntity<String> login(@RequestBody LoginRequest request){
if(request.isSuccess()) {
// ์ฑ๊ณต ๋ก๊ทธ
logger.info("LOGIN_SUCCESS - password={}, country={}, timestamp={}, success={}",
request.getPassword(),
request.getCountry(),
request.getTimestamp(),
request.isSuccess());
// ResponseEntity : ์๋ต์ฝ๋๊น์ง ๋ณด๋ผ ์ ์๋ Spring-web ๋ผ์ด๋ธ๋ฌ๋ฆฌ
return ResponseEntity.ok("๋ก๊ทธ์ธ ์ฑ๊ณต");
}else {
// ์คํจ ๋ก๊ทธ
logger.warn("LOGIN_FAILED - password={}, country={}, timestamp={}, success={}, failureReason={}",
request.getPassword(),
request.getCountry(),
request.getTimestamp(),
request.isSuccess(),
request.getFailureReason());
// HTTP 401(์ธ์ฆ ์คํจ/HttpStatus.UNAUTHORIZED) ์๋ต ๋ฐํ (๋ก๊ทธ์ธ์คํจ)
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("๋ก๊ทธ์ธ ์คํจ");
}
}
}
<!--logback-spring.xml์์ JSON๋ก๊ทธ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ -->
<!-- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์ด logstash์ธ ์ด์ : logstash์ ์ ๋ค์ด๊ฐ๋๋ก ๋ก๊ทธ๋ฅผ JSONํํ๋ก ๋ง๋ค์ด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ -->
<!-- Logback์ JSONํฌ๋งท ์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.4</version>
</dependency>
- CSV ๊ธฐ๋ฐ 200,000๊ฑด์ ๋ก๊ทธ์ธ ์๋
โ
์ค๋ ๋ ์(์ฌ์ฉ์):10000
๊ฐ์์ ์ฌ์ฉ์ ์ (= ๋์์ ์์ฒญ ๋ณด๋ผ ์ฌ์ฉ์ ์)
์ฌ๊ธฐ์ 10,000๋ช
์ ์ฌ์ฉ์๊ฐ ์๋ฎฌ๋ ์ด์
๋จ
โ
๋จํ์
๊ธฐ๊ฐ(์ด):15
10,000๋ช
์ ์ฌ์ฉ์๋ฅผ 15์ด ๋์ ๋๋ ์ ์คํ
โ 10000 รท 15 = ์ฝ 666๋ช
/์ด ์๋๋ก ํฌ์
๋จ
์ซ์๊ฐ ์์์๋ก ๋ถํ๊ฐ ๊ธ๊ฒฉํ ๋ชฐ๋ฆผ
โ
๋ฃจํ ์นด์ดํธ:20
๊ฐ ์ฌ์ฉ์๋น ์์ฒญ์ ๋ช ๋ฒ ๋ฐ๋ณตํ ์ง ์ค์
โ ์ฌ์ฉ์ 1๋ช
์ด 20๋ฒ ์์ฒญ์ ๋ณด๋
์ด ์์ฒญ ์ = ์ฌ์ฉ์ ์ ร ๋ฃจํ ์ = 10,000 ร 20 = 20๋ง
โ
View Result Tree
์์ฒญ๋ณ ์ฑ๊ณต/์คํจ ์ฌ๋ถ, ์๋ต ์ฝ๋, ์์ฒญ/์๋ต ๋ด์ฉ์ ์์ธํ ํ์ธํ ์ ์๋ ๋๋ฒ๊น
๋๊ตฌ ๋ก๊ทธ์ธ ์ฑ๊ณต/์คํจ ๋ฉ์์ง, ์ค๋ฅ ์๋ต, ํ๋ผ๋ฏธํฐ ํ์ธ ๋ฑ์ ํ์ฉ
-
Filebeat๋ก ๋ก๊ทธ ์์ง
-
Logstash์์ grok, mutate, date ํํฐ ์ฌ์ฉํด JSON ๋ก๊ทธ ํ์ฑ
โจ๏ธ์ฝ๋
input {
# file {
# path => "C:/fisa_project/dummy_data/logs/ianlogin.log"
# start_position => "beginning"
# sincedb_path => "NUL"
# codec => "json"
# }
beats{
port => 5044
}
}
filter {
grok {
match => {
"message" => "password=%{DATA:password}, country=%{DATA:country}, timestamp=%{TIMESTAMP_ISO8601:timestamp}, success=%{WORD:success}(?:, failureReason=%{DATA:failureReason})?"
}
}
date {
match => ["timestamp", "yyyy-MM-dd'T'HH:mm:ss"]
target => "@timestamp"
timezone => "Asia/Seoul"
}
mutate {
remove_field => ["message", "logger_name", "thread_name", "level", "@version", "path", "host", "timestamp"]
}
}
output {
stdout { codec => rubydebug } # ์ฝ์ ํ์ธ์ฉ
elasticsearch {
hosts => ["http://localhost:9200"]
index => "lastianlog"
}
}
- `start_position`, `sincedb_path`๋ก ์์ง ๋ฒ์ ์ ์ด <br>
- ํ์ฑ๋ ๋ก๊ทธ๋ฅผ Elasticsearch์ ์์ธ
- ์ค์๊ฐ ๋์๋ณด๋ ๊ตฌ์ถ
โ JMeter CSV ์ฒซ ์ด ์ฝ์ ์ฌ๋ถ
- CSV ์ฒซ ์ด์ด ์ปฌ๋ผ๊ฐ์ผ๋ก, JMeter๊ฐ ์ฝ๋ ๋ฐ์ดํฐ์์๋ ๋น ์ก์ด์ผ ํ๋๋ฐ ์ฝ์โ CSV boolean ํ์ฑ ์ค๋ฅ
- "True" / "False" ๋๋ฌธ์ ๊ฐ์ด DB์์ boolean ๋งคํ ์คํจ โ ํ ์คํธ ํ์ผ์์ True ์ False์ ๋๋ฌธ์์ด์ ์ผ๊ด์ ์ผ๋ก ์๋ฌธ์์ด๋ก ๋ณ๊ฒฝโ JMeter ์คํ ์๊ฐ ๋ถ์กฑ
Duration ์ค์ ์ด ์งง์ ์ผ๋ถ ํธ๋ํฝ๋ง ์ ์ก๋จ- ํนํ Thread Group > Duration, Scheduler, Ramp-Up ์ค์ ์ด ์งง์ผ๋ฉด ์ ์ฒด ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ์ ์ ํ
์คํธ ์ข
๋ฃ๋จ
โ Thread Group ์ค์ ์์ Duration 10์ด โ 20์ด ์ด์์ผ๋ก ์ค์
์์ฑ๋ ๋ก๊ทธ ๋ผ์ธ์ ํ์ธ ๋ช
๋ น์ด
wc -l login.log
โ Logstash ๊ฒฝ๋ก ์ค์ ์ด์
- ํ์ ๊ฐ ๋ก๊ทธ ํ์ผ ๊ฒฝ๋ก๊ฐ ๋ฌ๋ผ ์คํ ์ค๋ฅ ๋ฐ์-
Logstash๋ ์ง์ ๋ ๋ก์ปฌ ์ ๋ ๊ฒฝ๋ก์์ ๋ก๊ทธ๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๋ฉด ์์ง ์์ฒด๊ฐ ๋์ง ์์
-
No such file or directory ์ค๋ฅ ๋ฐ์
โ ๊ณตํต ๊ฒฝ๋ก ํต์ผ ๋ฐ .conf ํ์ผ ๋ด ์ฃผ์์ผ๋ก ์ฃผ์์ฌํญ ๋ช ์
โ Elasticsearch ์ธ๋ฑ์ค ์ค๋ณต ๋ฌธ์
- ๋ก๊ทธ ํ์ผ ์์ ๋๋ ์ฌํ ์คํธ ํ ๋์ผํ ๋ก๊ทธ ํ์ผ์ ๋ค์ Logstash๋ก ๋๊ธฐ๋ ค ํ์ผ๋ Elasticsearch์ ๊ธฐ์กด ์ธ๋ฑ์ค๊ฐ ์กด์ฌํด ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฌ๋์ง ์์-
๋ก๊ทธ ํ์ผ ๊ฒฝ๋ก์ ๋ด์ฉ์ ๋์ผํ์ง๋ง ์ด์ ์ ์ฒ๋ฆฌ๋ ์ํ๋ก ์ธ์๋จ
-
Filebeat๋ Logstash๋ ํ ๋ฒ ์ฒ๋ฆฌํ ํ์ผ์ ๋ด๋ถ ์ํ(sincedb ๋ฑ)์ ๊ธฐ๋ก โ ๋์ผ ๊ฒฝ๋ก/๋ด์ฉ์ ํ์ผ์ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ผ๋ก ํ๋จํ๊ณ ๋ฌด์ํจ
-
Elasticsearch ์ธ๋ฑ์ค๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฉด ๋ฌธ์ ID ์ค๋ณต ๋๋ ํ์ฑ ์คํจ๋ก skip
โ Filebeat ๋ก๊ทธ ํ์ฑ ๋ฉํ ํ๋๋ง ์ถ๋ ฅ๋๋ ๋ฌธ์
- ๋ก๊ทธ ์์ง ๋ฐ ๋ถ์ ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ ํ๋๋ง ๋ํ๋๊ณ , ์ ์ ๋ก๊ทธ ๋ฉ์์ง(message)๊ฐ ๋ณด์ด์ง ์์.log.file.path: C:\fisa_project\dummy_data\logs\ianlogin.log
agent.name: 1-01
agent.version: 7.11.2
tags: [ "_grokparsefailure" ]
์ด ํ์์ ๋ก๊ทธ ํ์ฑ ์คํจ ์ ๋ํ๋๋ ์ ์์ ์ธ ํ์์ผ๋ก, Filebeat๋ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํ์ฑํ์ง ๋ชปํ๋๋ผ๋ ์๋์ ๊ฐ์ ๋ฉํ ํ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ Elasticsearch์ ์ ์ก.
| ํ๋๋ช | ์ค๋ช |
|---|---|
@timestamp |
๋ก๊ทธ๊ฐ ์์ง๋ ์๊ฐ (Filebeat๊ฐ ์์งํ ์์ ๊ธฐ์ค) |
_index |
๋ก๊ทธ๊ฐ ์ ์ฅ๋ ์ธ๋ฑ์ค ์ด๋ฆ (์: ianlogend) |
_id |
Elasticsearch๊ฐ ๋ถ์ฌํ ๋ฌธ์ ๊ณ ์ ID |
_type |
๋ฌธ์ ํ์
(๋ณดํต _doc) |
_score |
๊ฒ์ relevance ์ ์ (๊ธฐ๋ณธ ๊ฒ์ ์ -) |
log.file.path |
์ค์ ๋ก๊ทธ ํ์ผ์ ์ ์ฒด ๊ฒฝ๋ก |
log.offset |
๋ก๊ทธ ํ์ผ ๋ด์์ ์ด ๋ก๊ทธ๊ฐ ์์๋ ๋ฐ์ดํธ ์์น |
agent.name |
Filebeat๊ฐ ์คํ๋ ํธ์คํธ ์ด๋ฆ |
agent.hostname |
ํธ์คํธ ์ด๋ฆ (๋ณดํต agent.name๊ณผ ๋์ผ) |
agent.type |
์์ง ์์ด์ ํธ ์ ํ (์ฌ๊ธฐ์ filebeat) |
agent.version |
Filebeat ๋ฒ์ (์: 7.11.2) |
agent.id |
Filebeat ์ธ์คํด์ค ๊ณ ์ ์๋ณ์ |
agent.ephemeral_id |
์คํ ์ค์ธ Filebeat ํ๋ก์ธ์ค์ ๊ณ ์ ID (๋งค ์คํ ์ ๋ณ๊ฒฝ๋จ) |
input.type |
์
๋ ฅ ํ์
(log, stdin ๋ฑ) |
tags |
ํ์ฑ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๊ทธ (์: _grokparsefailure) |
ecs.version |
Elastic Common Schema ๋ฒ์ (1.6.0 ๋ฑ) |
- โ
๋๋ฏธ๋ฐ์ดํฐ ๋์ ์ค์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ฎฌ๋ ์ด์
ํ์ฌ ๋ถ์์ ํ์ค์ฑ ํฅ์
- โ
์ต์ Kibana ๊ธฐ๋ฅ(Lens, Canvas ๋ฑ)์ ํ์ฉํ ๊ณ ๊ธ ๋์๋ณด๋ ์ปค์คํฐ๋ง์ด์ง ๋ฐ ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ
- โ
๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ํ์ง ๋ชจ๋ธ๊ณผ ์ฐ๋ํ์ฌ ์ด์ ํ์ ํ์ง ์๋ํ ๋ฐ ์ค์๊ฐ ๋์ ์ฒด๊ณ ๊ตฌ์ถ
- โ
Slack / Email ๋ฑ ์๋ฆผ ์์คํ
๊ณผ์ ์ฐ๋์ ํตํด ์คํจ์จ ๊ธ์ฆ ๋ฑ ์ด์ ์ํฉ์ ์ฆ์ ๋์
- โ
ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ ์ํคํ
์ฒ ์ค๊ณ๋ฅผ ํตํด ํ์ฅ์ฑ๊ณผ ์์ ์ฑ์ ๊ฐ์ถ ELK ํ๊ฒฝ ๊ตฌ์ฑ
- ์ด๋ฒ ํ๋ก์ ํธ๋ ๋จ์ํ ๋ก๊ทธ ์์ง์ ๋์ด, ๋ฐ์ดํฐ์ ์ค๊ณ๋ถํฐ ์์ฑ, ์ ์ , ์์ง ํ์ดํ๋ผ์ธ ๊ตฌํ, ๊ทธ๋ฆฌ๊ณ ์๊ฐํ ๋ถ์์ ์ด๋ฅด๊ธฐ๊น์ง ์ ๊ณผ์ ์ ๊ฒฝํํ ์ ์๋ ๊ฐ์ง ๊ธฐํ์์ต๋๋ค.
์งํ ๊ณผ์ ์์ ์์์น ๋ชปํ ํธ๋ฌ๋ธ์ํ ๋ ๋ง์๊ณ , ๊ธฐ์ ์ ๋๊ด์ ๋ถ๋ชํ๋ ์๊ฐ๋ ์ ์ง ์์์ง๋ง, ๊ทธ๋งํผ ์ง์ ๋ถ๋ชํ๋ฉฐ ํด๊ฒฐํด๋๊ฐ๋ ๊ณผ์ ์ ํตํด ์ป์ ๋ฐฐ์์ ๋งค์ฐ ์ปธ์ต๋๋ค.
ํนํ ๋ก๊ทธ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ์ค์๊ฐ ๋ถ์์ด ๊ฐ๋ฅํด์ง๋์ง๋ฅผ ์ฒด๊ฐํ๋ฉฐ, ๋จ์ํ ๊ตฌํ์ ๋์ด ์์คํ ์ ๋ฐ์ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๊ฐ์ง ์ ์์๊ณ , ์ค์ ์ด์ ํ๊ฒฝ์์ ์๊ตฌ๋๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ ์ฑ, ์ ์ฐ์ฑ, ๊ฐ์์ฑ์ ์ค์์ฑ๋ ๊นจ๋ฌ์ ์ ์์์ต๋๋ค.
๋์ด์ผ๋ณด๋ฉด ํ๋ํ์ง๋ง, ๊ทธ๋งํผ ์ฑ์ฅ์ ๋ฐ๋๊ฐ ๋์๋ ํ๋ก์ ํธ์๋ค๊ณ ์์ ์๊ฒ ๋งํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ ํ๋ก์ ํธ์ ์ฒ์ ๋์ ํ์ง๋ง, ์๋๋ฆฌ์ค ๊ธฐ๋ฐ์ผ๋ก ๋จ๊ณ๋ณ ๊ตฌํํ๋ฉฐ ์ค์ ๊ฐ๊ฐ์ ์ตํ๋ ๊ฒฝํ์ด์์ต๋๋ค.
JMeter๋ฅผ ํ์ฉํด JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ฌ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ฉฐ, Spring ๊ธฐ๋ฐ ์์คํ ์ ํ๋ฆ์ ์ดํดํ๋ ๋ฐ ์ง์คํ์ต๋๋ค.
๊ธฐ์ ์คํ์ ์ค์ฌ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ก๊น ํ๋ฆ์ ์ฒดํํ๋ฉฐ, ์ค๋ฌด์์ ํ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ฐ ์ญ๋์ ์์ ์ ์์์ต๋๋ค.
- ์ฒ์ ์ ํ๋ ๋ด์ฉ์ด๋ผ ๋ค์ ์ด๋ ค์์ด ์์์ง๋ง, ํ์๋ค๊ณผ ํจ๊ป ํ๋ ฅํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์์ฑํด ๋๊ฐ ์ ์์์ต๋๋ค.
ํ์ดํ๋ผ์ธ์ ์ฒ์ ๊ตฌ์ถํ ๋๋ ๋ค์ ๋ณต์กํ๊ฒ ๋๊ปด์ก์ง๋ง, ์ค์ต์ ํตํด ์ ์ฒด์ ์ธ ํ๋ฆ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ดํดํ ์ ์์๊ณ , ๋งค์ฐ ๋ป๊น์ ์๊ฐ์ด์์ต๋๋ค.
ํนํ ELK๋ฅผ ์ง์ ๋ค๋ค๋ณด๋ฉด์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์์ง๋๊ณ ์๊ฐํ๋๋์ง๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฐ์ธ ์ ์์ด ์ ์ตํ ๊ฒฝํ์ด์์ต๋๋ค.
- JMeter๋ก 20๋ง ๊ฑด ๋๊ท๋ชจ ๋ถํ ํ
์คํธ์ ์๋๋ฆฌ์ค๋ฅผ ์ค๊ณํ๊ณ , ์ง์ ์์ฑํ ๋ก๊ทธ์ธ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Filebeat-Logstash-Kibana๋ฅผ ์ฐ๊ณํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ต๋๋ค.
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ์ ๋ณต์ก์ฑ ์ดํด์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ํ์ตํ ์ ์์๊ณ , JMeter๋ฅผ ํ์ฉํด์ ์ง์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๋ ์ ์ด ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ๊ฐ์ ธ์์ ์งํํ๋ ๊ฒ๋ณด๋ค ๋ ์๋ฏธ ์๋ ํ๋ก์ ํธ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ดํ๋ผ์ธ์ด ๊ตฌ์ถ๋ ํ์๋ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ํ๋์ด ํ์ํ๋ค๋ ์ ์ ๊นจ๋ฌ์์ต๋๋ค. ํฅํ ์ค์๊ฐ ์๋ฆผ ์์คํ ๊ตฌ์ถ, ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ์ด์ ํ์ง ๊ธฐ๋ฅ๋ ์ถ๊ฐํด๋ณด๊ณ ์ถ์ต๋๋ค.





