AWS Lambda Native Tracing for Go

AWS Lambda izlemesi için Go özellikleri burada açıklanmıştır.

Desteklenen Yürütme Ortamları

  • go1.x Go 1.8 ya da sonraki bir yayın düzeyini kullanma

Kuruluşu

Not: Bu belge, Go Lambda işlevlerinin izlenmesini nasıl ayarlayacağınızı açıklar. Ayrıca, YönOrtamın AWS Lambda çalıştırma zamanı içinden toplayamadığı sürümler ve çalıştırma zamanı metrikleriyle ilgili gerekli bilgilerin toplanmasını sağlamak için AWS Lambda izleme algılayıcısı ayarının da yapıldığından emin olun.

v1.23.0 Instana in-process algılayıcısı, bir hizmetin AWS Lambda üzerinde çalıştığını otomatik olarak algılar ve sunucusuz kipe geçer. İşlem içindeki algılayıcı, toplanan izleri anasistem aracısına göndermek yerine, bunları INSTANA_AGENT_KEYiçinde tanımlanan bir aracı anahtarını kullanarak INSTANA_ENDPOINT_URL ortam değişkeninde belirtilen Yönortamısız kabul edici uç noktasına doğrudan gönderir.

github.com/instana/go-sensor' un en son sürümünü kullandığınızdan emin olmak için projenizdeki go.mod dosyasını denetleyin ya da çalıştırın:

go get github.com/instana/go-sensor@latest

Devam eden Go algılayıcısının en son sürümünü karşıdan yükleyebilir ve gerekli sürümü go.modiçinde güncelleyebilirsiniz.

Yapılandırma

Toplanan izlemeleri göndermek için, iki ortam değişkeniyle birlikte bir AWS Lambda işlevi sağlanmalıdır:

AWS Console UI 'sindeki işleyiciye bu değerleri sağlamak için Lambda yapılandırma sayfasına gidin:

ortam değişkenlerini yapılandırma

  1. Lambda işlev kutunuzu tıklatın
  2. "Ortam Değişkenleri" bölümünde "Düzenle" yi tıklatın ve iki yeni değişken ekleyin

Toplanacak HTTP üstbilgileri listesi ya da kullanılacak özel hizmet adı gibi, işlem sırasında algılayıcı varsayılanlarının değiştirilmesine izin veren birkaç isteğe bağlı ortam değişkeni vardır.

Kullanım

AWS , AWS Lambda üzerinde Go kodunun çalıştırılmasına izin veren github.com/aws/aws-lambda-go paketini sağlar. Lambda tetikleyici olaylarını, işleyici işlevi içinde yapılan YönOrtamıana ve iç ve dış çağrılarla izlemek için önce tetiklenmesi gerekir. github.com/instana/go-sensor/instrumentation/instalambda , işleyici koduna izleme kodu eklemesi için ara katman yazılımı sarıcıları sağlar.

Projenize github.com/instana/go-sensor/instrumentation/instalambda dosyasını eklemek için go.mod dosyasını içeren klasörden şunları yapın:

go get github.com/instana/go-sensor/instrumentation/instalambda

Bu işlem sırasında ana github.com/instana/go-sensor algılayıcısına ve proje bağımlılıkları listenize özel işlemden geçirme modülü ekler.

İşleyici işlevine izleme kodu ekleme

Go dilinde yazılan tipik bir AWS Lambda işlevi şöyle görünür:

package main

import (
	"github.com/aws/aws-lambda-go/lambda"
)

func main() {
	lambda.Start(Handle)
}

func Handle() (string, error) {
	// handler code
}

Bir işleyici işlevi, işleyici işlevinin iki parametre alması durumunda, ilkinin context.Context' i gerçekleştirmesi gereken bir sınırlamayla en fazla iki parametre alabilir ve döndürebilir.

Bir işleyici işlevine izleme kodu eklemek için, önce instalambda.NewHandler() kullanarak işleyiciden bir işleyici oluşturun, daha sonra lambda.StartHandler()' a geçin, böylece önceki kod şu şekilde değişir:

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
}

Özel İşlemden Geçirme lambda.Handler

lambda.Handler olarak gerçekleştirilen tipik bir AWS Lambda işleyicisi şöyle görünür:

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
}

Bu işleyiciye izleme kodu eklemek için, işleyiciyi instalambda.WrapHandler() ile sarın ve labmda.StartHandler()' e geçin:

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
}

İzleme Bağlamı Yaması

Minimum bir özel işlemden geçirme yalnızca main() işlevinizde birkaç değişiklik içerir ve işleyici kodunuzun güncellenmesini gerektirmez. Ancak, işleyici işlevinizin bağımsız değişkenleri listesine context.Context öğesini eklemeyi düşünebilirsiniz. Bu durumda instalambda , Lambda tetikleme olayını içine yerleştirir. Bu aralık instana.SpanFromContext() ile alınabilir ve işleyici içinde yapılan iç ve dış çağrıları izlemek için üst öğe olarak kullanılabilir:

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()
	}

	// ...
}