Configuration du traçage natif pour les fonctions d' AWS Lambda s basées sur l' Go
Vous pouvez configurer le traçage natif pour les fonctions d' AWS Lambda s écrites en Go en installant et en configurant Instana Go Tracer.
Environnements d'exécution pris en charge
Instana prend en charge le traçage natif pour go1.x l'exécution utilisant Go 1.8 ou une version ultérieure.
Installation d' Go Tracer
Vous devez installer Instana Go Tracer pour collecter les données de traçage des fonctions AWS Lambda.
Avant d'installer l' Go Tracer, assurez-vous que le capteur Instana AWS destiné à la surveillance Lambda est configuré pour collecter les versions et les métriques d'exécution à partir de AWS Lambda. Pour plus d'informations, consultez la page AWS relative au capteur de surveillance du rapport lambda.
Pour installer l'outil Tracer d' Instana Go, procédez comme suit :
Téléchargez le module Tracer d' Go :
go get github.com/instana/go-sensorAjoutez le module Tracer d' Go à votre
go.modfichier.
Mise à jour de Tracer d' Go
Pour vous assurer que vous utilisez bien la dernière version d' Go Tracer, vérifiez le go.mod fichier dans votre projet ou exécutez la commande suivante :
go get github.com/instana/go-sensor@latest
Si vous ne disposez pas de la dernière version d' Go Tracer, téléchargez-la et remplacez l'ancienne version dans le go.mod fichier.
Configuration de la fonction « AWS Lambda »
Une fois que vous avez installé l'application Tracer de Instana Go, celle-ci détecte automatiquement qu'un service est en cours d'exécution sur AWS Lambda et passe en mode sans serveur. Au lieu d'envoyer les traces collectées à l'agent hôte, le traceur les transmet directement au point de terminaison « acceptor » sans serveur de l' Instana, situé dans le backend Instana.
Pour envoyer les traces collectées au backend Instana, définissez les variables d'environnement suivantes dans votre fonction ` AWS Lambda ` :
**INSTANA_ENDPOINT_URL****INSTANA_AGENT_KEY**
Pour fournir ces variables au gestionnaire AWS dans l'interface utilisateur de la console AWS , procédez comme suit:
Sur la page « AWS Lambda : configuration », cliquez sur votre fonction Lambda.
Dans la section Variables d'environnement , cliquez sur Editer et ajoutez les variables suivantes:
INSTANA_ENDPOINT_URL: Indiquez l' URL de votre point de terminaison du backend Instana.INSTANA_AGENT_KEY: Indiquez la clé de votre agent.

Vous pouvez utiliser des variables d'environnement facultatives pour modifier les paramètres par défaut du traceur, tels que la liste des en-têtes HTTP à collecter ou un nom de service personnalisé à utiliser.
Activation du traçage
Grâce au aws-lambda-go paquet, vous pouvez exécuter le code de l' Go sur AWS Lambda.
Pour suivre l' AWS Lambda des événements déclencheurs et surveiller les appels internes et externes effectués au sein de la fonction de gestionnaire AWS à l'aide d' Instana, vous devez d'abord instrumenter votre code de gestionnaire.
Vous pouvez instrumenter votre code de gestionnaire à l'aide des wrappers de middleware fournis par le module d'instrumentation d' Instanainstalambda .
Ajout du module d'instrumentation « Instana »
Pour ajouter le instalambda module à votre projet Lambda sur Go, exécutez la commande suivante depuis le dossier contenant le go.mod fichier :
go get github.com/instana/go-sensor/instrumentation/instalambda
Cette commande ajoute le module d'instrumentation à la liste des dépendances de votre projet ainsi qu'au tracer principal Go.
Instrumentation d'une fonction de gestionnaire
L'extrait de code suivant présente une fonction « AWS Lambda » typique écrite en langage « Go » :
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func main() {
lambda.Start(Handle)
}
func Handle() (string, error) {
// handler code
}
Une fonction de gestion peut prendre et renvoyer jusqu'à deux arguments, à condition que, si elle en prend deux, le premier argument soit de type context.Context.
Pour instrumenter une fonction de gestionnaire, procédez comme suit:
- Créez un gestionnaire instrumenté à partir de la fonction de gestionnaire d'origine à l'aide de
instalambda.NewHandler(). - Transmettez le gestionnaire instrumenté à
lambda.StartHandler(). Le fragment suivant illustre les modifications de code:
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
}
Instrumentation d'un gestionnaire lambda.Handler
L'extrait de code suivant présente un gestionnaire typique de l' AWS Lambda, implémenté comme suit lambda.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
}
Pour implémenter un tel gestionnaire, encapsulez-le dans instalambda.WrapHandler() et transmettez-le à 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
}
Activer la propagation du contexte de trace
Pour activer la propagation du contexte de trace, vous avez besoin d'une instrumentation minimale qui implique d'apporter quelques modifications à votre fonction main() sans mettre à jour votre code de gestionnaire. Toutefois, vous pouvez ajouter context.Context à la liste des arguments de votre fonction de gestionnaire. Lorsque vous ajoutez context.Context en tant qu'argument, instalambda injecte les étendues de l'événement déclencheur Lambda dans le contexte. Vous pouvez extraire ces étendues avec instana.SpanFromContext() et les utiliser en tant que parent pour tracer les appels internes et externes effectués dans le gestionnaire:
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()
}
// ...
}