OpenTelemetry를 사용하여 앱에 커스텀 trace 및 측정항목 추가

이 문서에서는 OpenTelemetry를 사용하여 애플리케이션에 관측 가능성 코드를 추가하는 방법을 설명합니다. OpenTelemetry는 널리 사용되는 프로엠워크에 대한 원격 분석을 생성하는 계측 라이브러리를 제공합니다. 애플리케이션별 동작을 측정하는 커스텀 계측을 추가하여 라이브러리에서 생성된 원격 분석을 보강할 수 있습니다.

이 문서에서 설명하는 원칙과 개념은 OpenTelemetry에서 지원하는 모든 언어로 제작된 앱에 적용할 수 있습니다. 계측에 대한 자세한 내용은 다음 문서를 참조하세요.

Go로 trace 및 측정항목 생성에 설명된 것과 동일한 Go 앱인 샘플 코드는 GitHub에서 사용 가능합니다. 전체 샘플을 보려면 더보기를 클릭한 다음 GitHub에서 보기를 선택합니다.

시작하기 전에

Enable the Cloud Logging, Cloud Monitoring, and Cloud Trace APIs.

Enable the APIs

커스텀 trace 만들기

애플리케이션에서 커스텀 trace를 생성하려면 OpenTelemetry 스팬을 만드는 계측 코드를 추가합니다. OpenTelemetry에서 스팬은 trace의 빌딩 블록입니다.

스팬을 만들려면 다음을 수행합니다.

  1. OpenTelemetry Tracer를 가져오도록 앱을 수정합니다. OpenTelemetry에서 추적기는 스팬의 생성자입니다. 다음 코드와 같이 추적기를 가져올 수 있습니다.

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    scopeName으로 표시되는 추적기 이름은 생성된 trace의 계측 범위를 식별합니다.

  2. tracer 인스턴스를 사용하여 스팬을 만듭니다. 다음 코드 샘플에서 computeSubrequests 함수는 호출될 때마다 스팬을 생성합니다.

    func computeSubrequests(r *http.Request, subRequests int) error {
    	// Add custom span representing the work done for the subrequests
    	ctx, span := tracer.Start(r.Context(), "subrequests")
    	defer span.End()
    
    	// Make specified number of http requests to the /single endpoint.
    	for i := 0; i < subRequests; i++ {
    		if err := callSingle(ctx); err != nil {
    			return err
    		}
    	}
    	// record number of sub-requests made
    	subRequestsHistogram.Record(ctx, int64(subRequests))
    	return nil
    }
    

    computeSubrequests 함수에서 생성된 이전 코드 샘플의 스팬은 전체 함수에서 수행된 작업을 나타냅니다. 이는 함수의 첫 번째 단계가 tracer.Start를 사용하여 새 스팬을 시작하는 것이고 span.End() 앞에 defer 키워드를 사용하면 함수가 종료되기 직전에 스팬이 종료되기 때문입니다.

커스텀 측정항목 만들기

애플리케이션에서 측정항목을 생성하려면 앱 실행 중에 측정된 값을 기록하는 계측 코드를 추가합니다.

측정항목을 만들려면 다음을 수행합니다.

  1. OpenTelemetry Meter를 가져오도록 앱을 수정합니다. OpenTelemetry에서 측정기는 측정항목을 기록하기 위해 측정항목 계측에 액세스합니다. 다음 코드와 같이 측정기를 가져올 수 있습니다.

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    scopeName으로 표시되는 측정기 이름은 생성된 측정항목의 계측 범위를 식별합니다.

  2. meter 인스턴스를 사용하여 측정항목을 기록할 수 있는 계측을 만듭니다. 예를 들어, 다음 코드에서는 meter를 사용하여 OpenTelemetry 히스토그램을 생성합니다.

    sleepHistogram, err = meter.Float64Histogram("example.sleep.duration",
    	metric.WithDescription("Sample histogram to measure time spent in sleeping"),
    	metric.WithExplicitBucketBoundaries(0.05, 0.075, 0.1, 0.125, 0.150, 0.2),
    	metric.WithUnit("s"))
    if err != nil {
    	panic(err)
    }

    이전 코드는 sleepHistogram이라는 히스토그램을 생성합니다.

  3. sleepHistogram 인스턴스를 사용하여 randomSleep 함수가 호출될 때 결정되는 절전 모드 시간을 기록합니다.

    func randomSleep(r *http.Request) time.Duration {
    	// simulate the work by sleeping 100 to 200 ms
    	sleepTime := time.Duration(100+rand.Intn(100)) * time.Millisecond
    	time.Sleep(sleepTime)
    
    	hostValue := attribute.String("host.value", r.Host)
    	// custom histogram metric to record time slept in seconds
    	sleepHistogram.Record(r.Context(), sleepTime.Seconds(), metric.WithAttributes(hostValue))
    	return sleepTime
    }
    

    OpenTelemetry 내보내기 도구 구성에 따라 이러한 계측에서 기록된 측정항목을 애플리케이션에서 내보냅니다.

다음 단계