Go 를 기반으로 하는 AWS Lambda 함수에 대한 네이티브 추적 설정
Go 로 작성된 AWS Lambda 함수에 대한 네이티브 추적을 설정하려면 Instana Go Tracer를 설치하고 구성하면 됩니다.
지원되는 런타임
Instana Go 1.8 이상을 사용하는 런타임에 go1.x 대한 네이티브 추적 기능을 지원합니다.
Go Tracer 설치
AWS Lambda 함수에서 추적 데이터를 수집하려면 Instana Go Tracer를 설치해야 합니다.
Go Tracer를 설치하기 전에, 람다(Lambda) 모니터링용 Instana AWS 센서가 AWS Lambda 에서 버전 및 런타임 메트릭을 수집하도록 구성되어 있는지 확인하십시오. 자세한 내용은 AWS 센서를 참조하여 람다 모니터링에 대해 알아보세요.
Instana Go Tracer 를 설치하려면 다음 단계를 따르십시오:
Go Tracer 모듈을 다운로드하세요:
go get github.com/instana/go-sensorGo Tracer 모듈을 파일에
go.mod추가하세요.
Go Tracer 업데이트
Go Tracer의 최신 버전을 사용하고 있는지 확인하려면 프로젝트 내의 파일을 go.mod 확인하거나 다음 명령어를 실행하세요:
go get github.com/instana/go-sensor@latest
최신 버전의 Go Tracer가 설치되어 있지 않다면, 최신 버전을 다운로드하여 파일 go.mod 내의 버전을 업데이트하십시오.
AWS Lambda 함수 설정
Instana Go Tracer를 설치하면, AWS Lambda 에서 서비스가 실행 중임을 자동으로 감지하여 서버리스 모드로 전환됩니다. 트레이서는 수집된 트레이스를 호스트 에이전트로 전송하는 대신, Instana 백엔드에 있는 Instana 서버리스 수신 엔드포인트로 직접 전송합니다.
수집된 트레이스를 Instana 백엔드로 전송하려면, AWS Lambda 함수에 다음 환경 변수를 설정하십시오:
**INSTANA_ENDPOINT_URL****INSTANA_AGENT_KEY**
AWS 콘솔 UI에서 AWS 핸들러에 이러한 변수를 제공하려면 다음 단계를 완료하십시오.
“ AWS Lambda 구성” 페이지에서 해당 Lambda 함수를 클릭합니다.
환경 변수 섹션에서 편집 을 클릭하고 다음 변수를 추가하십시오.
INSTANA_ENDPOINT_URL: Instana 백엔드 엔드포인트 의 URL 를 지정하십시오.INSTANA_AGENT_KEY: 에이전트 키 를 입력하세요.

선택적 환경 변수를 사용하여 수집할 ` HTTP ` 헤더 목록이나 사용할 사용자 지정 서비스 이름 등 트레이서의 기본 설정을 변경할 수 있습니다.
추적 사용
이 aws-lambda-go 패키지를 사용하면 AWS Lambda 에서 Go 코드를 실행할 수 있습니다.
Instana 사용하여 AWS Lambda 추적하고, 이벤트를 트리거하고, AWS 핸들러 함수 내에서 이루어지는 내부 및 외부 호출을 모니터링하려면 먼저 핸들러 코드를 계측해야 합니다.
Instana 계측 모듈에서 제공하는 미들웨어 래퍼를 사용하여 instalambda 핸들러 코드를 계측할 수 있습니다.
Instana 계측 모듈 추가
Go Lambda 프로젝트에 모듈을 instalambda 추가하려면, 해당 go.mod 파일이 있는 폴더에서 다음 명령어를 실행하세요:
go get github.com/instana/go-sensor/instrumentation/instalambda
이 명령어는 계측 모듈을 프로젝트의 종속성 목록과 메인 Go Tracer에 추가합니다.
핸들러 함수에 메서드 주입하기
다음 코드 조각은 Go 로 작성된 일반적인 AWS Lambda 함수를 보여줍니다:
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func main() {
lambda.Start(Handle)
}
func Handle() (string, error) {
// handler code
}
핸들러 함수는 최대 두 개의 인자를 받아 반환할 수 있으며, 단, 두 개의 인자를 받는 경우 첫 번째 인자는 반드시 를 구현해야 한다는 context.Context제한이 있습니다.
핸들러 함수를 인스트루먼트하려면 다음 단계를 완료하십시오.
- 를 사용하여 원래 핸들러 함수로부터
instalambda.NewHandler()계측된 핸들러를 생성합니다. - 인스트루먼트된 핸들러를
lambda.StartHandler()에 전달하십시오. 다음 스니펫은 코드 변경사항을 표시합니다.
package main
import (
"github.com/aws/aws-lambda-go/lambda"
// Import the in-process sensor and instrumentation packages
instana "github.com/instana/go-sensor"
"github.com/instana/go-sensor/instrumentation/instalambda"
)
func main() {
// Initialize the instana.Sensor instance
sensor := instana.NewSensor("my-lambda-handler")
// Create an instrumented handler from your handler function
h := instalambda.NewHandler(Handle, sensor)
// Pass the handler to the lambda.StartHandler() invoke loop
lambda.StartHandler(h)
}
func Handle() (string, error) {
// handler code
}
~에 계측 기능을 추가하기 lambda.Handler
다음 코드 조각은 다음과 같이 구현된 일반적인 AWS Lambdalambda.Handler 핸들러를 보여줍니다:
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func main() {
h := &Handler{
// handler configuration
}
lambda.StartHandler(h, sensor)
}
type Handler struct {
// ...
}
func (h *Handler) Invoke(ctx context.Context, payload []byte) ([]byte, error) {
// handler code
}
이러한 핸들러를 구현하려면, 이를 로 감싸서 instalambda.WrapHandler() : labmda.StartHandler()에 전달하십시오
package main
import (
"github.com/aws/aws-lambda-go/lambda"
// Import the in-process sensor and instrumentation packages
instana "github.com/instana/go-sensor"
"github.com/instana/go-sensor/instrumentation/instalambda"
)
func main() {
// Initialize the instana.Sensor instance
sensor := instana.NewSensor("my-lambda-handler")
h := &Handler{
// handler configuration
}
// Wrap and pass the handler to the lambda.StartHandler() invoke loop
lambda.StartHandler(instalambda.WrapHandler(h, sensor))
}
type Handler struct {
// ...
}
func (h *Handler) Invoke(ctx context.Context, payload []byte) ([]byte, error) {
// handler code
}
추적 컨텍스트 전파 활성화
추적 컨텍스트 전파를 사용하려면 핸들러 코드를 업데이트하지 않고 main() 함수에서 몇 가지 변경사항을 작성하는 것과 관련된 최소 인스트루먼테이션이 필요합니다. 그러나 핸들러 함수의 인수 목록에 context.Context 를 추가할 수 있습니다. context.Context 를 인수로 추가하면 instalambda 는 Lambda 트리거 이벤트의 범위를 컨텍스트에 삽입합니다. instana.SpanFromContext() 를 사용하여 이러한 범위를 검색하고 이를 상위로 사용하여 핸들러 내에서 작성된 내부 및 외부 호출을 추적할 수 있습니다.
func MyHandler(ctx context.Context) error {
// Pass the handler context to a subcall to trace its execution
subCall(ctx)
// ...
// Propagate the trace context within an HTTP request to another service monitored with Instana
// using an instrumented http.Client
req, err := http.NewRequest("GET", url, nil)
client := &http.Client{
Transport: instana.RoundTripper(sensor, nil),
}
client.Do(req.WithContext(ctx))
// ...
}
func subCall(ctx context.Context) {
if parent, ok := instana.SpanFromContext(ctx); ok {
// start a new span, using the Lambda entry span as a parent
sp = parent.Tracer().StartSpan(/* ... */)
defer sp.Finish()
}
// ...
}