콘텐츠로 이동

Profiling Ruby

DataKit은 Datadog Ruby Continuous Profiler가 보고한 성능 데이터를 수신하여Guance으로 전송할 수 있습니다. Ruby Profiler는 CPU 시간, Wall Time, 객체 할당 등의 데이터를 수집할 수 있습니다.

사전 요구 사항

  • DataKit을 설치하고 Profile 수집기를 활성화해야 합니다.
  • CRuby 2.5 이상을 사용해야 하며, CRuby 3.2.3 이상을 권장합니다. JRuby와 TruffleRuby는 현재 지원되지 않습니다.
  • 애플리케이션이 glibc 또는 musl 기반 배포판을 포함한 지원 대상 Linux x86-64 또는 arm64 환경에서 실행되어야 합니다. Ruby Profiler는 Serverless 환경을 지원하지 않습니다.
  • datadog gem을 사용합니다. ~> 2.30 버전을 권장하며, 2.30 미만 버전에서는 네이티브 확장을 컴파일할 때 pkg-config 또는 pkgconf도 필요합니다.

구체적인 호환 범위는 SDK 업데이트에 따라 달라질 수 있습니다. Ruby Profiler 지원 버전도 함께 참고하십시오.

DataKit Profile 수집기 활성화

DataKit 설치 디렉터리의 conf.d/profile 디렉터리로 이동하여 profile.conf.sample을 복사한 후 이름을 profile.conf으로 변경합니다. 기본 설정에는 Ruby SDK가 사용하는 수신 엔드포인트가 이미 포함되어 있습니다.

[[inputs.profile]]
  endpoints = ["/profiling/v1/input"]
  body_size_limit_mb = 32

DataKit을 다시 시작하면 수신 주소는 다음과 같습니다.

http://<DataKit 주소>:9529/profiling/v1/input

Ruby SDK에서 Agent 기본 주소를 http://<DataKit 주소>:9529로 설정하십시오. 주소 뒤에 /profiling/v1/input을 추가할 필요는 없습니다.

Ruby SDK 설치

애플리케이션의 Gemfile에 다음 내용을 추가합니다.

gem "datadog", "~> 2.30"

그런 다음 종속성을 설치합니다.

bundle install

Ruby APM 자동 계측도 함께 활성화하려면 DDTrace Ruby를 참고하여 gem 로드 진입점을 설정하십시오.

Profiler 설정 및 시작

환경 변수 사용

다음 예시는 Profile 데이터를 로컬 DataKit으로 전송합니다.

DD_PROFILING_ENABLED=true \
DD_TRACE_AGENT_URL=http://127.0.0.1:9529 \
DD_ENV=production \
DD_SERVICE=my-ruby-service \
DD_VERSION=1.0.0 \
DD_TAGS=team:apm,region:cn \
bundle exec ddprofrb exec ruby app.rb

Rails 애플리케이션도 동일한 환경 변수를 사용하여 시작할 수 있습니다.

DD_PROFILING_ENABLED=true \
DD_TRACE_AGENT_URL=http://127.0.0.1:9529 \
DD_ENV=production \
DD_SERVICE=my-rails-service \
DD_VERSION=1.0.0 \
bundle exec ddprofrb exec bin/rails server

DD_AGENT_HOSTDD_TRACE_AGENT_PORT를 사용하여 주소와 포트를 각각 설정할 수도 있습니다.

DD_AGENT_HOST=127.0.0.1
DD_TRACE_AGENT_PORT=9529

DD_TRACE_AGENT_URL은 host/port 설정보다 우선합니다. 서로 충돌하는 대상 주소를 동시에 설정하지 마십시오. 컨테이너 또는 Kubernetes 환경에서 DataKit과 애플리케이션이 같은 컨테이너에 있지 않다면 127.0.0.1을 애플리케이션에서 접근 가능한 DataKit 주소로 바꾸십시오.

코드 설정 사용

애플리케이션 시작 단계에서 Profiler를 코드로 설정할 수도 있습니다. 예를 들어 Rails 애플리케이션에서는 initializer에 다음 코드를 추가할 수 있습니다.

require "datadog"

Datadog.configure do |c|
  c.agent.host = "127.0.0.1"
  c.agent.port = 9529
  c.profiling.enabled = true
  c.env = "production"
  c.service = "my-rails-service"
  c.version = "1.0.0"
  c.tags = { "team" => "apm", "region" => "cn" }
end

설정 코드를 추가한 후에도 Profiler를 최대한 일찍 로드할 수 있도록 ddprofrb exec로 애플리케이션을 시작하는 것이 좋습니다. 런처를 사용할 수 없다면 애플리케이션 진입점 맨 앞에서 Profiler를 로드하십시오.

require "datadog/profiling/preload"

그런 다음 기존 명령으로 애플리케이션을 시작합니다.

주요 설정

환경 변수 기본값 설명
DD_PROFILING_ENABLED false Continuous Profiler 활성화 여부입니다. 통합하려면 true로 설정해야 합니다.
DD_PROFILING_ALLOCATION_ENABLED false 객체 할당 데이터 수집 여부입니다. 활성화하면 런타임 오버헤드가 증가하므로 먼저 사전 프로덕션 환경에서 평가하는 것이 좋습니다.
DD_PROFILING_MAX_FRAMES 400 각 호출 스택에서 수집하는 최대 프레임 수입니다.
DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED false 실험적 힙 분석 활성화 여부입니다. 객체 할당 수집도 함께 활성화해야 합니다.
DD_ENV 없음 production, staging 등의 애플리케이션 배포 환경입니다.
DD_SERVICE SDK가 추론 서비스 이름입니다. 프로덕션 환경에서는 명시적으로 설정하는 것이 좋습니다.
DD_VERSION 없음 애플리케이션 버전입니다.
DD_TAGS 없음 key:value 형식으로 입력하고 쉼표로 구분하는 추가 태그입니다.

실험적 기능의 지원 범위와 성능 오버헤드는 SDK 버전에 따라 달라질 수 있습니다. 활성화하기 전에 Ruby Profiler 설정을 참고하십시오.

Profile 보기

애플리케이션이 시작되면 Ruby Profiler가 주기적으로 DataKit에 데이터를 보고합니다. 1~2분 기다린 후Guance 워크스페이스의 애플리케이션 성능 모니터링 -> Profile 페이지에서 service, env, version별 해당 데이터를 확인할 수 있습니다.

애플리케이션에 DDTrace Ruby 트레이싱도 통합되어 있다면 호환되는 SDK 버전이 Trace와 Profile의 연관 정보를 자동으로 포함합니다. 트레이싱 통합 방법은 DDTrace Ruby를 참고하십시오.

DataKit 메트릭 생성 안내

DataKit은 Ruby SDK가 보고한 데이터의 language: ruby를 인식하고 원본 Profile 파일과 메타데이터를 보존하여 업로드합니다. 현재 generate_metrics는 Java, Go, Python Profile에서만 profiling_metrics 메트릭을 추출합니다. 따라서 이 설정이 true여도 Ruby Profile에서는 추가 profiling_metrics 메트릭이 생성되지 않습니다. 이는 플레임 그래프와 Profile 상세 정보 표시에 영향을 주지 않습니다.

문제 해결

  • Profile 데이터가 없음: profile.conf가 활성화되어 있고 DD_PROFILING_ENABLED=true로 설정되어 있는지 확인한 후 최소 한 번의 보고 주기 동안 기다리십시오.
  • 연결이 거부됨: 애플리케이션에서 <DataKit 주소>:9529에 접근할 수 있는지 확인하십시오. 컨테이너의 127.0.0.1은 현재 컨테이너만 가리킵니다.
  • 주소 설정이 적용되지 않음: DD_TRACE_AGENT_URLDD_AGENT_HOST/DD_TRACE_AGENT_PORT가 동시에 설정되어 있는지 확인하고 대상 설정 하나만 남기십시오.
  • 네이티브 확장 로드 실패: 지원되는 Linux 아키텍처에서 CRuby를 사용하는지 확인하십시오. 이전 gem 버전에서는 pkg-config 또는 pkgconf가 설치되어 있는지도 확인하고 gem 설치 출력과 mkmf.log를 검토하십시오.
  • 요청 본문이 너무 큼: DataKit 로그에 요청이 제한을 초과했다는 메시지가 표시되면 필요에 따라 body_size_limit_mb를 늘린 후 DataKit을 다시 시작하십시오.
  • 샘플링 신호 충돌: Ruby Profiler는 SIGPROF를 사용합니다. 애플리케이션이나 다른 라이브러리도 이 신호를 사용한다면 Ruby Profiler 문제 해결을 참고하십시오.

문서 평가

이 페이지가 도움이 되었나요?