AWS Lambda Native Tracing for Go
AWS Lambda izlemesi için Go özellikleri burada açıklanmıştır.
Desteklenen Yürütme Ortamları
go1.xGo1.8ya 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:
INSTANA_ENDPOINT_URLYönOrtamı'nizin URL 'sine ayarlayın arka uç noktasıINSTANA_AGENT_KEYAracı anahtarınızı içerir
AWS Console UI 'sindeki işleyiciye bu değerleri sağlamak için Lambda yapılandırma sayfasına gidin:

- Lambda işlev kutunuzu tıklatın
- "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()
}
// ...
}