앱 요청의 지연 시간 확인

애플리케이션에서 지연 시간 데이터를 수집하고 보는 방법을 알아봅니다.

  1. Google Cloud CLI를 사용하여 Google Kubernetes Engine(GKE) 클러스터를 만듭니다.

  2. 샘플 애플리케이션을 다운로드하고 클러스터에 배포합니다.

  3. 샘플 애플리케이션에 HTTP 요청을 보내 trace를 만듭니다.

  4. 만든 trace의 지연 시간 정보를 확인합니다.

  5. 삭제


Google Cloud 콘솔에서 이 태스크에 대한 단계별 안내를 직접 수행하려면 둘러보기를 클릭합니다.

둘러보기


시작하기 전에

  1. 조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.

  2. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  5. Enable the Google Kubernetes Engine and Cloud Trace APIs.

    Enable the APIs

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  8. Enable the Google Kubernetes Engine and Cloud Trace APIs.

    Enable the APIs

GKE 클러스터 만들기

  1. 툴바에서 Cloud Shell 활성화를 클릭한 후 Cloud Shell에서 다음 단계를 수행합니다.

  2. 클러스터 만들기:

    gcloud container clusters create cloud-trace-demo --zone us-central1-c
    

    완료하는 데 몇 분 정도 걸리는 이전 명령어는 us-central1-c 영역에 cloud-trace-demo라는 이름의 표준 클러스터를 만듭니다.

  3. Google Cloud CLI와 동일한 ID를 사용하기 위해 사용자 인증 정보를 자동으로 새로고침하도록 kubectl을 구성합니다.

    gcloud container clusters get-credentials cloud-trace-demo --zone us-central1-c
    
  4. 클러스터에 대한 액세스 권한을 확인합니다.

    kubectl get nodes
    

    이 명령어의 샘플 출력은 다음과 같습니다.

    NAME                                              STATUS   ROLES    AGE   VERSION
    gke-cloud-trace-demo-default-pool-063c0416-113s   Ready    <none>   78s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-1n27   Ready    <none>   79s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-frkd   Ready    <none>   78s   v1.22.12-gke.2300
    

애플리케이션 다운로드 및 배포

Flask 프레임워크 및 OpenTelemetry 패키지를 사용하는 Python 애플리케이션을 다운로드하고 배포합니다. 이 애플리케이션에 대해서는 이 페이지의 앱 정보 섹션에서 설명합니다.

Cloud Shell에서 다음을 수행합니다.

  1. GitHub에서 Python 앱을 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. 다음 명령어를 실행하여 샘플 애플리케이션을 배포합니다.

    cd python-docs-samples/trace/cloud-trace-demo-app-opentelemetry && ./setup.sh
    

    setup.sh 스크립트가 완료되는 데 몇 분 정도 걸립니다.

    이 스크립트는 사전 빌드된 이미지를 사용하여 3개의 서비스를 구성하고 모든 리소스가 프로비저닝될 때까지 기다립니다. 워크로드 이름은 cloud-trace-demo-a, cloud-trace-demo-b, cloud-trace-demo-c로 지정됩니다.

    이 명령어의 샘플 출력은 다음과 같습니다.

    deployment.apps/cloud-trace-demo-a is created
    service/cloud-trace-demo-a is created
    deployment.apps/cloud-trace-demo-b is created
    service/cloud-trace-demo-b is created
    deployment.apps/cloud-trace-demo-c is created
    service/cloud-trace-demo-c is created
    
    Wait for load balancer initialization complete......
    Completed.
    

trace 데이터 만들기

trace는 애플리케이션이 단일 작업을 완료하는 데 걸리는 시간을 설명합니다.

trace를 만들려면 Cloud Shell에서 다음 명령어를 실행하세요.

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

이전 명령어의 응답은 다음과 비슷합니다.

Hello, I am service A
And I am service B
Hello, I am service C

curl 명령어를 여러 번 실행하여 여러 trace를 생성할 수 있습니다.

지연 시간 데이터 보기

  1. Google Cloud 콘솔에서 Trace 탐색기 페이지로 이동합니다.

    Trace 탐색기로 이동

    검색창을 사용하여 이 페이지를 찾을 수도 있습니다.

    각 trace는 그래프에서는 점으로, 테이블에서는 행으로 표시됩니다.

    다음 스크린샷에서 여러 trace를 표시합니다.

    빠른 시작을 위한 trace 탐색기 창

  2. trace를 자세히 보려면 그래프에서 점을 선택하거나 표에서 행을 선택합니다.

    분산형 차트가 새로고침되고 선택한 점 주위에 원이 그려져 강조표시됩니다. 다른 trace를 나타내는 다른 점은 모두 흐리게 표시됩니다.

    Gantt 차트에는 선택한 trace에 대한 정보가 표시됩니다. Gantt 차트의 첫 번째 행은 trace이며, trace의 각 스팬에 대해 하나의 행이 있습니다. 스팬은 완전한 하위 작업을 수행하는 데 걸리는 시간을 설명합니다.

    각 스팬의 추가 세부정보가 세부정보 창에 표시됩니다.

  3. 스팬에 대한 자세한 내용을 보려면 Gantt 차트에서 스팬을 선택합니다.

애플리케이션 정보

이 빠른 시작에서 사용되는 샘플 애플리케이션은 GitHub 저장소에서 제공됩니다. 이 저장소에는 Cloud Shell 이외의 환경에서 애플리케이션을 사용하는 방법에 대한 정보가 포함되어 있습니다. 샘플 애플리케이션은 Python으로 작성되고 Flask 프레임워크 및 OpenTelemetry 패키지를 사용하며 GKE 클러스터에서 실행됩니다.

계측

GitHub 저장소app.py 파일에는 trace 데이터를 캡처하고 Google Cloud 프로젝트로 전송하는 데 필요한 계측이 포함되어 있습니다.

  • 이 애플리케이션이 몇 가지 OpenTelemetry 패키지를 가져옵니다.

    from opentelemetry import trace
    from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
    from opentelemetry.instrumentation.flask import FlaskInstrumentor
    from opentelemetry.instrumentation.requests import RequestsInstrumentor
    from opentelemetry.propagate import set_global_textmap
    from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
    from opentelemetry.sdk.trace import TracerProvider
    from opentelemetry.sdk.trace.export import BatchSpanProcessor
    
  • 애플리케이션은 trace 컨텍스트를 사용하여 웹 요청을 계측하고 Flask 핸들러와 요청을 다른 서비스에 대한 요청을 자동으로 추적합니다.

    app = flask.Flask(__name__)
    FlaskInstrumentor().instrument_app(app)
    RequestsInstrumentor().instrument()
  • 애플리케이션은 Cloud Trace 내보내기 도구를 trace 제공자로 구성하여 Cloud Trace 형식으로 trace 컨텍스트를 전파합니다.

    def configure_exporter(exporter):
        """Configures OpenTelemetry context propagation to use Cloud Trace context
    
        Args:
            exporter: exporter instance to be configured in the OpenTelemetry tracer provider
        """
        set_global_textmap(CloudTraceFormatPropagator())
        tracer_provider = TracerProvider()
        tracer_provider.add_span_processor(BatchSpanProcessor(exporter))
        trace.set_tracer_provider(tracer_provider)
    
    
    configure_exporter(CloudTraceSpanExporter())
    tracer = trace.get_tracer(__name__)
  • 다음 코드 스니펫은 Python에서 요청을 보내는 방법을 보여줍니다. OpenTelemetry는 발신 요청으로 trace 컨텍스트를 암시적으로 전파합니다.

    if endpoint is not None and endpoint != "":
        data = {"body": keyword}
        response = requests.get(
            endpoint,
            params=data,
        )
        return keyword + "\n" + response.text
    else:
        return keyword, 200
    

애플리케이션 작동 방식

명확하게 알아두어야 할 사실은 이 섹션에서는 서비스 이름에서 cloud-trace-demo가 생략된다는 점입니다. 예를 들어 cloud-trace-demo-c 서비스는 c로 참조됩니다.

이 애플리케이션은 a, b, c라는 세 가지 서비스를 만들며, a 서비스는 b 서비스를 호출하도록 구성되고 b 서비스는 c 서비스를 호출하도록 구성됩니다. 서비스 구성에 대한 자세한 내용은 GitHub 저장소의 YAML 파일을 참조하세요.

이 빠른 시작에서 a 서비스로 HTTP 요청을 보낼 때 다음 curl 명령어를 사용했습니다.

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

curl 명령어는 다음과 같이 작동합니다.

  1. kubectlcloud-trace-demo-a라는 서비스의 IP 주소를 가져옵니다.
  2. 그런 다음 curl 명령어는 서비스 a에 HTTP 요청을 보냅니다.
  3. a 서비스는 HTTP 요청을 수신하고 b 서비스에 요청을 보냅니다.
  4. b 서비스는 HTTP 요청을 수신하고 c 서비스에 요청을 보냅니다.
  5. c 서비스는 b 서비스에서 HTTP 요청을 수신하고 Hello, I am service C 문자열을 b 서비스에 반환합니다.
  6. b 서비스는 c 서비스에서 응답을 수신하고 이를 And I am service B 문자열에 추가하고 결과를 a 서비스에 반환합니다.
  7. a 서비스는 b 서비스에서 응답을 수신하고 이를 Hello, I am service A 문자열에 추가합니다.
  8. a 서비스의 응답이 Cloud Shell에 출력됩니다.

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.

새 프로젝트를 만들었지만 더 이상 필요하지 않은 경우 프로젝트를 삭제하세요.

기존 프로젝트를 사용한 경우 다음을 수행합니다.

  1. 클러스터를 삭제하려면 Cloud Shell에서 다음 명령어를 실행합니다.

    gcloud container clusters delete cloud-trace-demo --zone us-central1-c

다음 단계