Kong Statsd 플러그인으로 메트릭 모니터링 설정하기
Kong API Gateway는 마이크로서비스 아키텍처에서 중요한 역할을 하며, StatsD 플러그인을 통해 실시간으로 메트릭을 모니터링하는 기능을 제공합니다. 이 플러그인을 사용하면 API 트래픽, 응답 시간, 에러율 등의 중요한 데이터를 수집하고, 시스템 성능을 최적화할 수 있습니다. 이번 블로그에서는 Kong StatsD 를 사용하여 모니터링 환경을 구축하는 방법을 단계별로 설명합니다. 이를 통해 API의 상태를 더 쉽게 파악하고, 효율적인 관리와 문제 해결을 지원할 수 있습니다.목차
1. 사전 구성 사항
2. Kong StatsD API G/W 구성
2-1. Kong StatsD란?
2-2. Docker StatsD 배포
2-3. Kong StatsD 연동
2-4. 메트릭 지표 확인
3. 결론
1. 사전 구성 사항
Docker 26.1.2
Kong API GateWay OSS 3.6.1
2. Kong StatsD API G/W 구성
Kong StatsD 구성을 통해 Kong Service에 대한 메트릭을 수집하고 지표를 확인할 수 있습니다.
Kong StatsD 구성을 위해선 StatsD를 배포하여 Kong과 연동을 해주어야 합니다.
2-1. Kong StatsD 란?
Node.js 에서 실행되는 네트워크 데몬입니다. counter나 time과 같은 통계 데이터를 받아 backend에 전송하는 Proxy입니다. Kong StatsD 가 내장되어 있는 Graphite를 사용하여 시각화 할 수도 있습니다.
기본적으로 Kong에서 나오는 메트릭은 최근에 Service 에 대한 요청 수, 요청 크기, 서비스에 대한 http status, 응답 크기가 있습니다.

2-2. Docker StatsD 배포
이 포스트에서는 Docker Container로 배포했습니다.
Kong StatsD 를 배포하기 위해 Docker Image를 가져옵니다.
$ docker pull statsd/statsd:latest
Using default tag: latest
latest: Pulling from statsd/statsd
bba7bb10d5ba: Pull complete
ec2b820b8e87: Pull complete
284f2345db05: Pull complete
fea23129f080: Pull complete
9063cd8e3106: Pull complete
e6fac8ec5874: Pull complete
689a3a390764: Pull complete
c976cd216445: Pull complete
c0360273da46: Pull complete
4f4fb700ef54: Pull complete
4dfc35335d09: Pull complete
a027721661eb: Pull complete
4d4bfc2925df: Pull complete
82d8bb2cbd4e: Pull complete
Digest: sha256:e98a56e9b8d09ba094a7022a64af0c2a97753e4c575ddb70ea95eb3ad8ceb7c1
Status: Downloaded newer image for statsd/statsd:latest
docker.io/statsd/statsd:latest
이미지를 가져온 후 Kong StatsD 를 배포합니다.
$ docker run -d -p 8126:8126 -p 8125:8125/udp statsd/statsd:latest
19057091c7383cb9662c16d9a29337e6e6e3583f4a020d4a518d0ab136211b01f
아래의 명령어를 사용하여 메트릭을 확인할 수 있습니다.
Kong에 대한 연동이 안되어있기 때문에 statsD에 관련 지표밖에 나오지 않습니다.
해당 지표들은 아래와 같습니다.
statsd.bad_lines_seen : statsD의 잘못된 형식 또는 처리할 수 없는 데이터의 수를 뜻합니다.
statsd.packets_received : 서버에 수신된 패킷의 수를 뜻합니다.
statsd.metrices_received : 서버에 수신된 메트릭 데이터 포인트의 수가 나오게 됩니다.
$ echo "counters" | nc localhost 8126
{
'statsd.bad_lines_seen': 0,
'statsd.packets_received': 0,
'statsd.metrics_received': 0
}
Kong StatsD 플러그인을 통해 Kong의 메트릭들을 수집할 수 있습니다.
2-3. Kong StatsD 연동
Kong API G/W에서 Plugin에서 StatsD를 구성하여 StatsD와 연동할 수 있습니다.
Service와 Routes는 구성되어 있는 환경에서 진행하였습니다.
Manage 페이지에서 Plugin을 추가합니다.

StatsD를 선택하여 연동합니다.

Global로 선택하여 모든 Service의 메트릭을 수집할 수 있게합니다.
해당 플러그인의 이름과 태그, 프로토콜을 지정합니다.
Allow Status Codes를 추가하여 200의 http status code만 메트릭을 수집할 수 있도록 지정합니다.(예시 : 500-504 | 500~504까지의 status 수집) 예시와 같은 포멧을 사용하지 않는다면 저장할 수 없습니다.
Consumer Identifier Deafault는 인증 정책이 구성되었을 때 인증을 한 Consumer에 대한 정보가 메트릭에 수집되도록 합니다. username, custom_id, consumer_id가 있습니다.
Flush TimeOut는 한번에 처리할 수 있는 최대 항목의 갯수입니다. 이 기능은 현재 max_batch_size로 변경 되어있기 때문에 공백란으로 넣어둡니다.
Host는 Kong StatsD 를 배포한 서버의 IP를 적습니다.

수집될 매트릭을 지정합니다. 아래의 사진은 기본 구성입니다.
request_count : 요청의 갯수를 의미합니다.
latency : 요청과 응답 사이의 간격입니다. (ms)
request_size : 요청의 크기입니다. (byte)
status_count : 응답에서 반환된 http status code 수를 의미합니다.
response_size : 응답의 크기입니다.(byte)
unique_users : 요청한 consumer를 추적합니다. (인증 구성된경우)
request_per_user : consumer의 요청 수를 의미합니다.(인증 구성된경우)
upstream_latency : 서비스에 지연시간을 의미합니다.(ms)
kong_latency : 모든 플러그인을 실행하는 데 걸린 Kong API G/W의 지연시간을 의미합니다.(ms)
status_count_per_user : service안의 consumer별로 http status를 의미합니다.
status_count_per_user_per_route : route안의 consumer별로 http status를 의미합니다.
shdict_usage : Kong API G/W에서 사용하는 모든 것을 수집합니다.
기본 구성으로 진행합니다.

구성에 대한 세부 설정도 가능합니다.
Name : 메트릭의 이름
Stat type : 어떤 종류의 이벤트를 나타낼지 정합니다.
Sample Rate : 샘플링 속도입니다.
Consumer Identifier : 인증 사용자에 대한 세부적인 정보를 지정합니다.(consumer_id, custom_id, username)
Service Identifier : 서비스에 대한 세부적인 정보를 지정합니다.(service_id, service_host, service_name, service_name_or_host)
Workspace Identifier : workspace에 대한 세부적인 정보를 지정합니다.(OSS는 사용불가능합니다.)(workspace_id, workspace_name)
기본 구성으로 진행합니다.

기본 구성으로 진행합니다.
Port : 배포한 StatsD의 UDP 포트를 적습니다.
Prefix : 메트릭의 이름을 적습니다.
Queue.Initial Retry Delay : StatsD의 연결이 끊겼을 때 재시도가 되기 전 시간입니다.
Queue.Max Batch Size : 처리할 수 있는 항목의 최대 수 입니다
Queue.Max Bytes : 대기열에서 기다릴 수 있는 최대 바이트 수 입니다.
Queue.Max Coalescing Delay : 대기열에서 첫 번째 항목이 추가된 후에 핸들러를 호출하기 까지의 최대 시간입니다.
Queue.Max Entries : 대기열에서 기다릴 수 있는 최대 항목 수 입니다.
Queue.Max Retry Delay : 재시도의 최대 지연 시간입니다.
Queue.Max Retry Time : 처리에 실패한 핸들러 호출을 대기열이 포기하기 전의 시간입니다.
여기서 대기열은 메트릭 데이터를 일시적으로 저장하는 데이터 구조입니다.

아래의 설정도 기본 구성으로 진행하였습니다.
Queue Size, Queue Count는 사용하지 않습니다.
Service Identifier Default : service의 메트릭 지표를 나타낼 때 식별자를 지정합니다.
Tag Style : 태그의 스타일을 정합니다.(dogstatsd, influxdb, librato, signalfx)
Udp Packet Size : UDP 패킷의 크기를 지정합니다. (65527보다 작아야합니다.)
Use Tcp : TCP를 사용 것인지 정합니다.

저장합니다.
Manage 페이지에서 구성한 것을 볼 수 있습니다.

2-4. 메트릭 지표 확인
Service에 많은 요청을 보내 Kong StatsD 에 메트릭이 수집되는지 확인합니다.
$ curl localhost:8000/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Kong StatsD 의 서버에 counters 문자열을 보내 kong에 대한 메트릭을 확인합니다.
$ echo "counters" | nc localhost 8126
{
'statsd.bad_lines_seen': 0,
'statsd.packets_received': 152,
'statsd.metrics_received': 152,
'kong.service.NGINX.request.count': 19,
'kong.service.NGINX.request.size': 2945,
'kong.service.NGINX.status.200': 19,
'kong.service.NGINX.response.size': 15257,
'kong.service.NGINX.workspace.b89f4649-f424-459a-ac85-a1ed3cd45779.status.200': 19
}
kong에 sevice의 NGINX의 요청과 http status 응답을 나타냅니다.
NGINX service에 대한 요청 수, 요청 크기, 200 http status 응답 수, 응답 크기, workspace의 http status 수가 나오게 됩니다.
해당 메트릭은 메모리에 저장되지 않기 때문에 짧은 시간내에 확인하여야 합니다.

API KEY 인증을 추가하고 요청을 보냅니다.
workespace 아래로 consumer test1에 해당되는 요청 수와 200 http status 응답 수, 그리고 route에 대한 consumer의 200 https status 응답 수가 나옵니다.
$ echo "counters" | nc localhost 8126
{
'statsd.bad_lines_seen': 0,
'statsd.packets_received': 346,
'statsd.metrics_received': 346,
'kong.service.NGINX.request.count': 27,
'kong.service.NGINX.request.size': 4536,
'kong.service.NGINX.status.200': 27,
'kong.service.NGINX.response.size': 21681,
'kong.service.NGINX.workspace.b89f4649-f424-459a-ac85-a1ed3cd45779.status.200': 27,
'kong.service.NGINX.user.test1.request.count': 27,
'kong.service.NGINX.user.test1.status.200': 27,
'kong.route.e2fad774-4448-42aa-a1c4-a2803ed9fc52.user.test1.status.200': 27
}
인증을 추가한뒤 kong에 service의 NGINX 서비스의 test1 유저의 요청과 http status를 나타냅니다.
3. 결론
Kong은 따로 모니터링이나 메트릭을 수집할 수 없기 때문에 Kong StatsD 와 같은 메트릭 수집도구를 사용하여야 합니다. Kong에서 사용할 수 있는 메트릭 수집도구는 Prometheus, Datadog, zipkin, statsD 등이 있습니다.
Kong StatsD 는 실시간으로 메트릭을 수집하고 메모리에 따로 저장을 하지않기 때문에 실시간 모니터링과 수치를 시각화한 그래프를 사용하려면 Grafana 같은 모니터링 시각화 도구를 사용하여야 합니다.
Kong에 대한 다른 정보를 보고싶으시다면 NGINX STORE Kong을 방문해주세요.