Docker×Datadog×PHP 구현 정리(APM편)

개요



Datadog를 사용하여 Docker(ECS)에서 구현하는 PHP 웹 앱의 지표를 수집하여 Datadog 콘솔(APMService)에서 모니터링할 수 있습니다.

개요



· PHP 컨테이너에 DatadogAPM 측정 설정
· 로컬 개발 환경 (docker-compose)에서 datag/agent 컨테이너 구현
· 클라우드 개발 환경 (ECS)에서 datag/agent 컨테이너 구현

작업 로그



PHP 컨테이너의 DatadogAPM 측정 설정



· PHP에 Datadog 확장 기능 (datadog-php-tracer) 설치
→ PHP 컨테이너의 Dockerfile에 설치한다.
ENV DDTRACE_VERSION=0.30.1
RUN curl -Lo datadog-php-tracer.apk https://github.com/DataDog/dd-trace-php/releases/download/${DDTRACE_VERSION}/datadog-php-tracer_${DDTRACE_VERSION}_noarch.apk \
&& apk add datadog-php-tracer.apk --allow-untrusted \
&& rm datadog-php-tracer.apk

※컨테이너를 실행해,↓phpinfo()로 인스톨 되고 있는 것을 확인


※datadog-php-tracer를 인스톨하는 것만으로, 마음대로 계측해 datag/agent의 EP에 계측 데이터를 송신해 준다.

로컬 개발 환경(docker-compose)에서 datag/agent 컨테이너 구현



로컬에서 컨테이너를 실행하고 datadog 콘솔에 데이터를 보낼 수 있는지 확인합니다.
↓구성으로서는 이런 느낌.


datadog/agent 컨테이너

datadog의 공식 이미지 ( datadog/agent )에 환경 변수를 설정하고 실행
  • datadog의 API 키

  • ※키는 Datadog 콘솔의 Integrations - APIs - API keys 에서 확인
    DD_API_KEY=***
    
  • Datadog Agent의 추적 메트릭을 활성화합니다.
  • DD_APM_ENABLED=true
    
  • 데이터 대상 사이트 설정
  • DD_SITE=datadoghq.com
    
  • 비 로컬 트래픽 추적 권한
  • DD_APM_NON_LOCAL_TRAFFIC=true
    

    PHP 컨테이너 설정

    환경 변수로 측정 데이터를 설정합니다.
  • datadog-agent 컨테이너의 호스트 이름 설정
  • DD_AGENT_HOST=datadog-agent
    

    ※datadog/agent의 서비스명을 datag-agent로 했으므로 그대로 설정(디폴트는 localhost)
  • APM - Services 이름 (APM 서비스 이름)
  • DD_SERVICE_NAME=php-apm
    



    docker-compose.yml
    version: '3'
    services:
      php-apache:
        container_name: php_apache_container
        build: ./php_apache_container
        volumes:
          - ./php_apache_container/src:/var/www/html
        environment:
          DD_AGENT_HOST: "datadog-agent"
          DD_SERVICE_NAME: "php-apache"
          DD_TRACE_GLOBAL_TAGS: "env:local,service:php-apache"
          DD_TRACE_ANALYTICS_ENABLED=true
        networks:
          - net
    
    
      datadog-agent:
        container_name: datadog-agent
        image: datadog/agent:latest
        environment:
          DD_API_KEY: "******"
          DD_APM_ENABLED: "true"
          DD_SITE: "datadoghq.com"
          DD_APM_NON_LOCAL_TRAFFIC: "true"
        networks:
          net:
    
    networks:
      net:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 172.16.238.0/24
    

    ※ 대체로 ↑의 느낌. . 업무용 코드, 고유 명사를 싹둑 삭제, 편집한 것 싣고 있습니다. 동작은 보이지 않는다.

    클라우드 개발 환경(ECS)에서 datag/agent 컨테이너 구현

    ↓ 대체로 아래와 같은 느낌으로 실장


    · ECS는 EC2 모드
    · PHP 컨테이너는 Replica, AWSVPC 모드, Datadog 컨테이너는 Daemon, Bridge 모드로 시작

    ENI 제한

    ※사용하는 인스턴스 타입은 ENI수:3
    AWSVPC 모드라면 태스크마다 하나의 ENI를 사용하기 때문에 ENI 고갈을 막기 위해 datag 컨테이너는 bridge 모드로 구현

    PHP 컨테이너 → Datadog 컨테이너 통신 경로

    태스크간에 걸쳐 통신하는 경우, 직접 통신할 수 없기 때문에 Route53에서 PrivateHostedZone→ALB를 통해 datag/agent 컨테이너에 계측 메트릭스를 송신한다.
    ※서비스 검출과 SRV 레코드를 사용한 방법도 있는 것 같지만, datadog-php-tracer(의 통신에 사용하고 있는 CURL)가 SRV 레코드에 대응하지 않는 것 같기 때문에 사용할 수 없다?

    작업 정의

    · 로컬 환경에서도 설정한 환경 변수를 environment로 설정
    · API 키는 파라미터 스토어로 설정하고, ARN을 지정
    · 포트는 datagAPM 용 포트 8126※terraform으로 관리하고 있기 때문에, 설정치를 ${var}의 형태로 외부로부터 설정할 수 있도록 하고 있다. (JSON의 LINT에 화가 나지만 신경 쓰지 않는다)
    [
      {
        "name": "datadog-agent",
        "image": "datadog/agent:latest",
        "cpu": 10,
        "memory": 256,
        "portMappings": [
          {
            "hostPort": ${dd_trace_agent_port},
            "protocol": "tcp",
            "containerPort": ${dd_trace_agent_port}
          }
        ],
        "essential": true,
        "mountPoints": [
          {
            "containerPath": "/var/run/docker.sock",
            "sourceVolume": "docker_sock",
            "readOnly": true
          },
          {
            "containerPath": "/host/sys/fs/cgroup",
            "readOnly": true,
            "sourceVolume": "cgroup"
          },
          {
            "containerPath": "/host/proc",
            "readOnly": true,
            "sourceVolume": "proc"
          }
        ],
        "environment": [
          {
            "name": "DD_APM_ENABLED",
            "value": "true"
          },
          {
            "name": "DD_SITE",
            "value": "datadoghq.com"
          },
          {
            "name": "DD_APM_NON_LOCAL_TRAFFIC",
            "value": "true"
          },
          {
            "name": "DD_TAGS",
            "value": "php-sample"
          }
        ],
        "secrets": [
          {
            "name": "DD_API_KEY",
            "valueFrom": "${dd_api_key}"
          }
        ]
      }
    ]
    

    좋은 웹페이지 즐겨찾기