회사에 모니터링 시스템인 datadog을 도입하게 되면서 얻었던 지식들을 공유하려합니다. ML 엔지니어로써 생소했던 모니터링 시스템이라 고군분투했지만 시간이 지나고보니 datadog 공식문서가 꽤 잘 되어있다는 걸 깨달았네요 🔥 agent를 심어 모니터링하는 것이 주요 기능이기 때문에 모니터링 하고자 하는 시스템의 종류에 따라 달라지겠지만 조금이라도 도움이 되고자 작성하였습니다. 아래 내용은 편의상 평서문으로 작성하였습니다.
Datadog이란?
- SaaS 기반 대규모 애플리케이션 및 인프라를 위한 모니터링 및 분석 통합 플랫폼
- 서버에 에이전트를 설치 후 모니터링하는 단순한 기능임
- 에이전트에 추가적인 설정으로 데이터베이스나 메모리 스토어 및 애플리케이션 등을 상세하게 모니터링할 수 있음
- 외부 API 연동이 가능한 것이 큰 장점임(AWS, Microsoft Azure, Google cloud도 가능하며 가능한 API는 약 600개가 넘음)
- 여러 서비스와 리소스에 agent를 설치하여 데이터를 수집하며 주로 Go와 Python 언어로 작성되어 있음
- datadog 주요 기능 설명
- log collection: API 관련 log 실시간으로 확인 가능
- APM: Application Performance Monitoring, 애플리케이션 성능을 감시하는 기능
- infrastructure: host, container, process, cpu 등 확인
- host: 우리가 모니터링하고 싶은 대상, 서버, API 등
datadog agent
- agent(대리인을 뜻하는 말로 중개를 해주는 사람)란? 서버, 컴퓨터, 또는 다른 장치에 설치되어 특정 작업을 수행하거나 데이터를 수집하는 소프트웨어 컴포넌트를 의미함. 보통 백그라운드에서 실행되며 사용자의 직접적인 개입 없이도 자동으로 작업을 수행할 수 있음
- datadog agent는 서버의 CPU 사용량, 메모리 상태, 디스크 사용량, 네트워크 트래픽 등과 같은 시스템 매트릭을 수집하며 수집한 데이터는 암호화되어 datadog 서버로 전송됨
- agent는 platform 별로 설치하는 방법이 다름
회사에서는 AI API를 docker container로 관리하며 agent 또한 container 형태로 띄워놓은 상태. 기본적으로 datadog agent는 TCP 8126과 UDP 8125 포트를 사용하고 있는데 TCP 8126은 주로 datadog의 APM 기능에 사용되며 UDP 8125는 StatsD 메트릭을 수집하는데 사용된다.
- TCP: 연결 지향적이고 신뢰성이 높은 데이터 전송을 제공하기 때문에 중요한 트레이스 데이터를 안전하게 전송하기 위해서
- UDP: 단순하고 효율적인 통계 수집을 위한 프로토콜이며 연결을 설정할 필요가 없고 빠르게 데이터를 전송할 수 있어 대량의 간단한 메트릭을 빠르게 수집하는데 적합하기 때문
docker agent 설치 방법
- API key를 발급받는다.(한번만 하면 됨)
- datadog image를 pull 해준다.
- docker run으로 container를 실행한다.
- AI API container에도 환경변수와 옵션 세팅을 해준다.
docker pull gcr.io/datadoghq/agent docker run -d --name datadog-agent \\ --cgroupns host \\ --pid host \\ -e DD_API_KEY=<DATADOG_API_KEY> \\ -e DD_LOGS_ENABLED=true \\ -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \\ -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \\ -e DD_SITE=<DD_SITE> -v /var/run/docker.sock:/var/run/docker.sock:ro \\ -v /var/lib/docker/containers:/var/lib/docker/containers:ro \\ -v /proc/:/host/proc/:ro \\ -v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \\ -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \\ gcr.io/datadoghq/agent:latest
옵션과 관련한 내용은 링크 참고. datadog agents는 여러개의 서브 컴포넌트로 구성되며 각 컴포넌트는 특정작업을 수행하고 관련 로그를 생성함.
agent.log: 주 컴포넌트에 대한 로그. 메트릭 수집, agent 상태, agent와 datadog 서버 간의 통신 등에 관련된 정보
init.log: agent 초기화 프로세스에 대한 정보
process-agent.log: 실행중인 프로세스, 리소스 사용량, 프로세스 간의 통신 등에 관한 정보
security-agent.log: 보안 관련 이벤트
system-probe.log: 네트워크 트래픽, 연결 상태, 포트 사용 등의 네트워크 관련 메트릭 수집
trace-agent.log: APM과 관련된 로그. 사용중인 python 버전, tracing 받은 수, 용량, 이벤트 추출 정보
Infrastructure
cpu, memory 사용량이나 container의 cpu, memory 등의 활동을 모니터링할 수 있음
APM
- 애플리케이션의 성능을 감시하는 기능
- python 코드 내에 trace를 보내는 코드를 추가해줘야하고 host name은 ip address임
- 세팅별로 다르지만 필자의 경우, 2개의 container를 각각 띄우기 때문에 ai container에서 datadog container로 보내는 ip를 셋업해야함
- 아래 명령어로 datadog container ip를 확인해야함. default로 172.17.0.3
- docker inspect [container name]
- 파이썬 메인 코드안에 아래의 코드를 넣어줌
- from ddtrace import tracer tracer.configure(hostname='172.17.0.3', port=8126)
- trace를 잘 받고 있는지 확인하기 위해선 trace-agent.log 볼 것
cd /var/log/datadog tail -f trace-agent.log 2023-09-01 06:41:16 UTC | TRACE | INFO | (run.go:269 in Infof) | [lang:python lang_version:3.8.17 interpreter:CPython tracer_version:1.17.3 endpoint_version:v0.5] -> traces received: 1, traces filtered: 0, traces amount: 490 bytes, events extracted: 0, events sampled: 0 2023-09-01 06:42:26 UTC | TRACE | INFO | (run.go:269 in Infof) | [lang:python lang_version:3.8.17 interpreter:CPython tracer_version:1.17.3 endpoint_version:v0.5] -> traces received: 2, traces filtered: 0, traces amount: 914 bytes, events extracted: 0, events sampled: 0 2023-09-01 06:52:16 UTC | TRACE | INFO | (run.go:269 in Infof) | [lang:python lang_version:3.8.17 interpreter:CPython tracer_version:1.17.3 endpoint_version:v0.5] -> traces received: 1, traces filtered: 0, traces amount: 620 bytes, events extracted: 0, events sampled: 0 2023-09-01 07:01:06 UTC | TRACE | INFO | (run.go:269 in Infof) | [lang:python lang_version:3.8.17 interpreter:CPython tracer_version:1.17.3 endpoint_version:v0.5] -> traces received: 73, traces filtered: 0, traces amount: 28747 bytes, events extracted: 0, events sampled: 0 2023-09-01 07:02:06 UTC | TRACE | INFO | (run.go:269 in Infof) | [lang:python lang_version:3.8.17 interpreter:CPython tracer_version:1.17.3 endpoint_version:v0.5] -> traces received: 54, traces filtered: 0, traces amount: 21259 bytes, events extracted: 0, events sampled:
→ 잘 받고 있는 것을 확인할 수 있음
datadog에서도 distributed tracing이 detected 되는 것을 볼 수 있다.
위에서 세팅한 뒤 service를 추가해줘야 한다.
- APM에서 setup & Config 클릭 후 create New Entry 클릭
- DD_SERVICE에 bentoml dockerfile에 적혀있는 DD_SERVICE 환경 변수 이름 적고 save entry 클릭
log collection
- 텍스트 정보를 다루는 로그를 수집함
- log를 모으기 위해선 datadog agent container 실행 시 몇가지 환경변수를 추가해주어야 한다.
docker run -d --name datadog-agent \ --cgroupns host \ --pid host \ -e DD_API_KEY=<DATADOG_API_KEY> \ -e DD_LOGS_ENABLED=true \ -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \ -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \ -e DD_SITE=<DD_SITE> -v /var/run/docker.sock:/var/run/docker.sock:ro \ -v /var/lib/docker/containers:/var/lib/docker/containers:ro \ -v /proc/:/host/proc/:ro \ -v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \ -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \ gcr.io/datadoghq/agent:latest
info가 default로 되어있어 모든 log는 info로 표시된다. → datadog log configure에서 정규표현식을 이용해 세팅이 필요하다.
아래 add a new pipeline 클릭 후 filter를 걸어준다. 우리는 service를 기준으로 나뉘어있어 service를 선택함
grok parser 세팅
Parse My Logs 버튼을 누르면 알아서 로그를 가져와 정규표현식을 가져와준다.
우리는 log 형식이 하나 더 있어서 add 버튼을 눌러 추가해주고 정규표현식을 추가해주었다. 정규표현식은 이곳을 참고하면 되는데 key: value 형식이다. 자주 사용하는 건 date, word
log level 정의: status remapper
결과: info만 찍히던게 python logger에 맞춰 error, debug, info로 잘 나뉜다!
Custom metric
- 유저가 사용하고 있는 AI 모델이 잘 예측하고 있는지 치우쳐서 예측하는 클래스가 있는지 확인하기 위해 metric을 추가함
- host는 datadog container를 의미한다. 우리는 container로 띄웠기 때문에 docker inspect [contianer_id]로 ip address를 확인 후 적어준다.
- port는 8125가 기본값이다.
- 참고 datadog container의 기본 ip를 172.17.0.3이다.초기 세팅은 service가 시작하는 스크립트에 아래의 코드를 심어준다.
from datadog import initialize, statsd options = { 'statsd_host':'172.17.0.3', 'statsd_port':8125 } initialize(**options)
수집하고자 하는 지표를 아래와 같이 작성한다. tag로 구별할 수 있어 카테고리를 나눌 수 있다.
statsd.gauge('face_recovery.class', value, tags=['key':'value'])
다양한 지표를 추가할 수 있는데 지표의 type에 따라 gauge, set, histogram, distribution 등이 있으며 자세한 내용은 공식 문서에서 확인할 수 있다.
결과는 metric tab에서 확인할 수 있음
AI container(host) 세팅
- docker container running 시 env와 service 이름 등을 설정해줘야하고 API 내 환경 변수를 추가해주어야 한다.
- 컨테이너 이름을 설정해두면 datadog에서 모니터링하는데 쉽게 식별할 수 있다.
docker container run -t -d -p 8080:3000 \\ --name [container 이름] \\ -l com.datadoghq.tags.env=[환경 stg, prd 등] \\ -l com.datadoghq.tags.service=[service 이름] \\ [docker image]
- 환경 변수
ENV DD_AGENT_HOST=datadog-agent ENV DD_SERVICE=[service 이름] ENV DD_ENV=[환경 stg, prd 등] ENV DD_LOGS_INJECTION=true
Reference
맺음말
AI API를 위한 세팅이다보니 참고할만한 글이 많이 없어 초반에 많이 헤맸습니다. 그래도 세팅하고 나니 에러를 디버깅하거나 어느 영역에서 시간을 많이 쓰고 있는지 우리의 환경이 잘 활용되고 있는지를 볼 수 있어 좋네요. 이외에도 활용할 만한 기능들이 많기 때문에 적응이 된다면 다른 기능들도 적용해보고 싶네요. 읽어주셔서 감사합니다. 도움이 되셨길 바래요! 🫧