• 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 를 방문하시기 바랍니다.

문제 신고

Go 에이전트 코드 수준 측정항목 계측

Go 에이전트 코드 수준 메트릭 구성 의 단계를 사용하여 코드 수준 메트릭을 켠 후에는 추가 계측을 사용하여 메트릭이 수집되는 방식을 미세 조정할 수 있습니다.

거래 계측

코드 수준 측정항목이 활성화되면 Go 에이전트는 애플리케이션의 StartTransaction 메서드를 호출하여 시작된 모든 트랜잭션에 소스 코드 컨텍스트 정보를 추가합니다. 기존 계측 코드를 변경하지 않고 이는 StartTransaction 을 호출한 함수를 기반으로 소스 코드 위치가 추가됨을 의미합니다. 이는 계측 패키지에서 StartTransaction 를 호출한 경우에도 마찬가지입니다.

그러나 특정 트랜잭션에 대해 코드 수준 측정항목이 수집되는 방식을 수동으로 제어하려는 경우 아래에 설명된 대로 여러 newrelic.TraceOption 함수를 추가할 수 있습니다.

단일 트랜잭션에 대한 코드 수준 측정항목 억제

특정 트랜잭션에 대한 코드 수준 측정항목을 원하지 않는 경우(예: 해당 데이터가 필요하지 않을 때 정보를 수집하는 오버헤드를 피하기 위해) WithoutCodeLevelMetrics 함수를 StartTransaction 호출:

txn := app.StartTransaction("nothing-here-to-see", newrelic.WithoutCodeLevelMetrics())
defer txn.End()

파일 경로 접두사 조정

기본적으로 Go 에이전트는 코드 수준 메트릭에서 참조하는 소스 파일의 전체(절대) 파일 경로 이름을 보고합니다. 구성 가이드 에는 ConfigCodeLevelMetricsPathPrefixes 설정을 통해 선택한 디렉터리 이름에서 시작하도록 전역적으로 파일 경로 이름을 자르는 방법에 대한 정보가 있지만 개별 트랜잭션에 대해 다른 파일 경로 이름 접두사를 지정해야 할 수도 있습니다. 그렇다면 트랜잭션에 WithPathPrefixes 옵션을 추가하기만 하면 됩니다.

txn := app.StartTransaction("mytransaction", newrelic.WithPathPrefixes("otherproject/lib/src"))
defer txn.End()

즉, 이 트랜잭션에 대해서만 소스 파일 경로 이름(예: "/usr/src/otherproject/lib/src/main.go" )이 "otherproject/lib/src/main.go" 로 단축됩니다.

사용하려는 경로 접두어가 여러 개인 경우 추가 매개변수로 WithPathPrefixes 에 전달하기만 하면 됩니다.

txn := app.StartTransaction("mytransaction", newrelic.WithPathPrefixes("otherproject/lib/src", "myproject/src"))
defer txn.End()

기능 인식 휴리스틱의 무시 접두사 조정

기본적으로 Go 에이전트에는 계측 중인 에이전트에 도달하기 위해 에이전트 자체 내부에 있는 호출 스택의 기능을 건너뛰는 논리가 포함되어 있습니다. 구성 가이드 에는 ConfigCodeLevelMetricsIgnoredPrefixes 설정을 통해 이 휴리스틱을 전역적으로 변경하는 방법에 대한 정보가 있지만 단일 트랜잭션에 대해 맞춤 네임스페이스 무시 접두사를 제공할 수 있습니다. 트랜잭션에 WithIgnoredPrefixes 옵션을 추가하면 됩니다.

txn := app.StartTransaction("mytransaction", newrelic.WithIgnoredPrefixes("github.com/ignore/this/"))
defer txn.End()

기능을 무시해야 하는 패키지가 여러 개 있는 경우 WithIgnoredPrefixes 에 여러 문자열 인수를 지정할 수 있습니다.

txn := app.StartTransaction("mytransaction", newrelic.WithIgnoredPrefixes("github.com/ignore/this/", "github.com/ignore/that/"))
defer txn.End()

이 변경으로 이름이 github.com/ignore/this/ (또는 두 번째 예에서는 github.com/ignore/that/ )로 시작하는 패키지의 모든 함수는 계측 중인 함수를 찾기 위해 건너뜁니다.

코드 위치를 명시적으로 표시

보고할 관심 지점을 쉽게 식별할 수 있도록 StartTransaction 호출 끝에 WithThisCodeLocation 을 추가합니다(예: 트랜잭션이 실제로 다른 프레임워크 내에서 시작된 경우). 이렇게 하면 코드 수준 측정항목에서 WithThisCodeLocation 가 호출된 소스 코드의 위치를 보고하게 됩니다.

txn := app.StartTransaction("mytransaction", newrelic.WithThisCodeLocation())
defer txn.End()

코드 위치를 명시적으로 표시

또한 트랜잭션과 연결될 소스 코드의 위치를 완전히 제어할 수 있습니다. 본질적으로 ThisCodeLocation 을 호출하여 해당 위치에 대한 "마커"를 가져오면 모든 위치를 표시할 수 있습니다. 그런 다음 WithCodeLocation 옵션과 함께 저장된 마커를 StartTransaction 호출에 사용합니다.

here := newrelic.ThisCodeLocation()
.
.
.
txn := app.StartTransaction("mytransaction", newrelic.WithCodeLocation(here))
defer txn.End()

필요한 경우 보고된 위치가 호출 스택의 위쪽에 있도록 여러 호출 함수를 건너뛰도록 ThisCodeLocation 에 지시할 수 있습니다. 예를 들어, hereThisCodeLocation 를 호출하는 함수의 호출자를 참조하도록 1명의 호출자를 건너뛰려면 위의 예를 다음과 같이 변경합니다.

here := newrelic.ThisCodeLocation(1)
.
.
.
txn := app.StartTransaction("mytransaction", newrelic.WithCodeLocation(here))
defer txn.End()

함수 값을 기반으로 코드 위치를 명시적으로 표시

계측하려는 코드를 함수 이름이나 함수 리터럴 값과 같은 func 유형 값으로 사용할 수 있는 경우 WithFunctionLocation 옵션을 StartTransaction 에 추가하고 func 값을 매개변수로 전달합니다.

func myfunction() { ... }
.
.
.
txn := app.StartTransaction("myfunction", newrelic.WithFunctionLocation(myfunction))

또는

someFunction := func() {...}
.
.
.
txn := app.StartTransaction("myfunction", newrelic.WithFunctionLocation(someFunction))

나중에 WithCodeLocation 옵션과 함께 사용하기 위해 func 값에서 CodeLocation 값을 얻을 수도 있습니다. 이것을 위에 표시된 사용법과 비교하여 나중에 WithCodeLocation 에서 참조할 수 있도록 ThisCodeLocation 으로 코드 위치를 저장합니다. 이번에는 동일한 작업을 수행하지만 대신 func 값을 사용합니다.

func myFunc() {...}
.
.
.
locationOfMyFunc, err := newrelic.FunctionLocation(myFunc)
if err != nil {
// handle the case that the location could not be determined
// from the value passed to FunctionLocation.
}
.
.
.
txn := app.StartTransaction("mytransaction", newrelic.WithCodeLocation(locationOfMyFunc))

FunctionLocation 은 전달된 값이 유효한 함수가 아니거나 해당 함수에서 소스 코드 위치를 가져올 수 없는 경우 오류를 반환합니다. 반대로 WithFunctionLocation 옵션은 가능한 경우 전달된 값을 기반으로 코드 수준 측정항목을 설정하지만 오류가 발생하면 아무 작업도 수행하지 않습니다.

래핑된 핸들러에 사용자 지정 옵션 추가

StartTransaction 끝에 추가할 수 있는 위에서 설명한 동일한 옵션을 WrapHandleWrapHandleFunc 에도 추가하여 원하는 경우(대부분의 경우 WrapHandleWrapHandleFunc 함수는 계측되는 코드의 위치를 올바르게 식별합니다. 예를 들어:

http.HandleFunc(newrelic.WrapHandleFunc(app, "/endpoint", endpointFunction, newrelic.WithThisCodeLocation()))

트랜잭션이 시작된 후 추적 옵션 변경

트랜잭션이 이미 시작된 후(아마도 프레임워크나 통합 기능을 통해)이 끝날 때까지 코드 위치를 알 수 없는 경우가 있습니다. SetOption 메소드를 호출하여 기존 트랜잭션의 트랜잭션 옵션을 변경할 수 있습니다. 매개변수는 위에서 설명한 대로 TraceOption 함수의 집합입니다. 예를 들어:

txn := newrelic.FromContext(r.context)
txn.SetOption(newrelic.WithThisCodeLocation())

캐시된 코드 수준 메트릭 기능으로 성능 향상

코드 수준 측정항목으로 트랜잭션을 계측하는 가장 편리한 방법은 계측된 함수 내에서 newrelic.WithThisCodeLocation() (또는 위에서 설명한 유사한 함수)를 호출하는 것입니다. 그러나 해당 함수가 애플리케이션의 런타임 동안 여러 번 호출될 경우 소스 코드 위치를 반복적으로 계산하는 오버헤드를 피하는 것이 좋습니다. 트랜잭션 코드가 많은 고루틴에서 동시에 실행되는 경우 특히 그렇습니다.

이를 완화하기 위해 Go 에이전트는 이러한 여러 기능의 캐싱 버전을 제공합니다. 그것들은 처음 호출될 때만 소스 코드 위치를 파악하는 작업을 수행한 다음 이후에 매번 해당 값을 재사용한다는 점을 제외하고는 캐시되지 않은 대응물과 동일하게 작동합니다.

이 기능을 사용하려면 NewCachedCodeLocation() 을 호출하여 캐시 저장소 변수를 생성하고 계측된 트랜잭션 실행 간에 지속되는 위치에 넣어야 합니다. 이 변수는 해당 코드 위치에 대해 캐시된 값을 보유합니다. 그런 다음 동일한 이름의 독립 실행형 함수를 사용하는 것처럼 FunctionLocation(functionValue) 또는 ThisCodeLocation() 메서드를 사용합니다. 그러나 이 경우에는 CachedCodeLocation 변수의 메서드입니다. 이 메소드는 스레드로부터 안전하므로 추가 동시성 제어를 추가하지 않고도 동시 고루틴에서 사용할 수 있습니다.

예를 들어 이 코드에서는 myFunc 변수에 할당된 클로저에 사용되는 캐시 변수를 설정합니다.

cache := newrelic.NewCachedCodeLocation()
myFunc := func() {
txn := app.StartTransaction("mytransaction", cache.WithThisCodeLocation())
defer txn.End()
// go on to perform the transaction
}

(이 예에서는 app 이 에이전트가 시작될 때 생성된 에이전트의 Application 값이고 이 코드 스니펫에 표시된다고 가정합니다.)

이제 myFunc 함수를 여러 번 호출할 수 있습니다. myFunc 의 각(동시에) 호출에는 cache 변수에 대한 참조가 있습니다. cache.WithThisCodeLocation() 을 실행하기 위한 첫 번째 호출은 해당 지점에서 소스 코드 위치를 계산하고 cache 변수에 저장합니다. myFunc 의 후속 실행은 이전에 cache 에 저장된 값을 재사용합니다.

사용하려는 각 코드 위치에 대해 다른 캐시 변수를 사용해야 합니다. 요점은 해당 위치를 한 번만 평가한 다음 거기에서 캐시된 값을 사용하는 것입니다. 캐시 변수는 여기와 모듈 패키지 문서에 설명된 것 외에는 복사하거나 사용할 수 없습니다.

사용할 수 있는 모든 캐시된 코드 수준 메트릭 기능 및 메서드에 대한 자세한 내용은 전체 Go 모듈 패키지 설명서 를 참조하세요.

Copyright © 2023 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.