Suivi des demandes entrantes avec le kit SDK X-Ray pour Python - AWS X-Ray

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Suivi des demandes entrantes avec le kit SDK X-Ray pour Python

Lorsque vous ajoutez l'intergiciel à votre application et que vous configurez un nom de segment, le SDK X-Ray pour Python crée un segment pour chaque requête échantillonnée. Ce segment comprend la durée, la méthode et l'état de la demande HTTP. L'instrumentation supplémentaire crée des sous-segments sur ce segment.

Le kit SDK X-Ray pour Python prend en charge les intergiciels suivants pour instrumenter les demandes HTTP entrantes :

  • Django

  • Flask

  • Bottle

Note

Pour lesAWS Lambda fonctions, Lambda crée un segment pour chaque requête échantillonnée. Pour en savoir plus, consultez AWS Lambda et AWS X-Ray.

VoirNœuds pour un exemple de fonction Python instrumentée dans Lambda.

Pour les scripts ou applications Python sur d'autres frameworks, vous pouvez créer des segments manuellement.

Chaque segment possède un nom qui identifie votre application dans la carte des services. Le segment peut être nommé de manière statique ou vous pouvez configurer le SDK pour le nommer dynamiquement en fonction de l'en-tête de l'hôte dans la demande entrante. La dénomination dynamique vous permet de regrouper les traces en fonction du nom de domaine figurant dans la demande et d'appliquer un nom par défaut si le nom ne correspond pas à un modèle attendu (par exemple, si l'en-tête de l'hôte est falsifié).

Demandes transmises

Si un équilibreur de charge ou un autre intermédiaire transmet une demande à votre application, X-Ray extrait l'adresse IP du client de l'X-Forwarded-Foren-tête de la demande plutôt que de l'adresse IP source du paquet IP. L'adresse IP du client enregistrée pour une demande transférée peut être falsifiée. Elle ne doit donc pas être fiable.

Lorsqu'une demande est transmise, le SDK définit un champ supplémentaire dans le segment pour l'indiquer. Si le segment contient le champx_forwarded_for défini surtrue, l'adresse IP du client a été extraite de l'X-Forwarded-Foren-tête de la requête HTTP.

L'intergiciel crée un segment pour chaque demande entrante avec un bloc http contenant les informations suivantes :

  • Méthode HTTP : GET, POST, PUT, DELETE, etc.

  • Adresse du client : l'adresse IP du client formulant la demande.

  • Code de réponse : code de réponse HTTP pour la demande terminée.

  • Chronologie : heure de début (date de réception de la demande) et heure de fin (heure d'envoi de la réponse).

  • Agent utilisateur : le formulaireuser-agent de la demande.

  • Longueur du contenu :content-length extrait de la réponse.

Ajout des intergiciels à votre application (Django)

Ajoutez les intergiciels à la liste MIDDLEWARE dans le fichier settings.py. L'intergiciel X-Ray doit figurer sur la première ligne du fichier settings.py afin que les demandes qui échouent dans d'autres intergiciels soient enregistrées.

Exemple settings.py : kit SDK X-Ray pour le kit SDK pour Python
MIDDLEWARE = [ 'aws_xray_sdk.ext.django.middleware.XRayMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware' ]

Ajoutez l'application Django du SDK X-Ray à laINSTALLED_APPS liste de votresettings.py fichier. Cela permettra de configurer l'enregistreur X-Ray lors du démarrage de votre application.

Exemple settings.py : kit SDK X-Ray pour l'application Python Django
INSTALLED_APPS = [ 'aws_xray_sdk.ext.django', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

Configurez un nom de segment dans le fichier settings.py.

Exemple settings.py — Nom du segment
XRAY_RECORDER = { 'AWS_XRAY_TRACING_NAME': 'My application', 'PLUGINS': ('EC2Plugin',), }

Cela indique à l'enregistreur X-Ray de suivre les demandes traitées par votre application Django avec le taux d'échantillonnage par défaut. Vous pouvez configurer les paramètres du fichier Django de l'enregistreur pour appliquer les règles d'échantillonnage personnalisées ou modifier d'autres paramètres.

Note

Commeplugins ils sont transmis sous forme de tuple, veillez à inclure une fin, lorsque vous spécifiez un seul plugin. Par exemple, plugins = ('EC2Plugin',)

Ajout des intergiciels à votre application (Flask)

Pour instrumenter l'application Flask, vous devez d'abord configurer un nom de segment dans l'élément xray_recorder. Utilisez ensuite la fonction XRayMiddleware pour corriger votre application Flask dans le code.

Exemple app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.flask.middleware import XRayMiddleware app = Flask(__name__) xray_recorder.configure(service='My application') XRayMiddleware(app, xray_recorder)

Cela indique à l'enregistreur X-Ray de suivre les demandes traitées par votre application Flask avec la fréquence d'échantillonnage par défaut. Vous pouvez configurer l'enregistreur dans le code pour appliquer les règles d'échantillonnage personnalisées ou modifier d'autres paramètres.

Ajout des intergiciels à votre application (Bottle)

Pour instrumenter votre application Bottle, vous devez d'abord configurer un nom de segment dans l'élément xray_recorder. Utilisez ensuite la fonction XRayMiddleware pour corriger votre application Bottle dans le code.

Exemple app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.bottle.middleware import XRayMiddleware app = Bottle() xray_recorder.configure(service='fallback_name', dynamic_naming='My application') app.install(XRayMiddleware(xray_recorder))

Cela indique à l'enregistreur X-Ray de suivre les demandes traitées par votre application Bottle avec la fréquence d'échantillonnage par défaut. Vous pouvez configurer l'enregistreur dans le code pour appliquer les règles d'échantillonnage personnalisées ou modifier d'autres paramètres.

Instrumentation manuelle du code Python

Si vous n'utilisez pas Django ni Flask, vous pouvez créer des segments manuellement. Vous pouvez créer un segment pour chaque demande entrante ou créer des segments autour de clients HTTP ouAWS SDK corrigés afin de fournir un contexte permettant à l'enregistreur d'ajouter des sous-segments.

Exemple main.py — Instrumentation manuelle
from aws_xray_sdk.core import xray_recorder # Start a segment segment = xray_recorder.begin_segment('segment_name') # Start a subsegment subsegment = xray_recorder.begin_subsegment('subsegment_name') # Add metadata and annotations segment.put_metadata('key', dict, 'namespace') subsegment.put_annotation('key', 'value') # Close the subsegment and segment xray_recorder.end_subsegment() xray_recorder.end_segment()

Configuration d'une stratégie d'attribution de noms de segment

AWS X-Rayutilise un nom de service pour identifier votre application et la distinguer des autres applications, bases de données, API externes etAWS ressources utilisées par votre application. Lorsque le SDK X-Ray génère des segments pour les demandes entrantes, il enregistre le nom du service de votre application dans le champ du nom du segment.

Le SDK X-Ray peut nommer les segments d'après le nom d'hôte dans l'en-tête de la requête HTTP. Toutefois, cet en-tête peut être falsifié, ce qui peut entraîner la création de nœuds inattendus dans votre carte de service. Pour éviter que le SDK ne nomme les segments de manière incorrecte en raison de demandes contenant des en-têtes d'hôte falsifiés, vous devez spécifier un nom par défaut pour les demandes entrantes.

Si votre application traite des demandes pour plusieurs domaines, vous pouvez configurer le SDK pour utiliser une stratégie de dénomination dynamique afin de refléter cela dans les noms de segments. Une stratégie de dénomination dynamique permet au SDK d'utiliser le nom d'hôte pour les demandes qui correspondent à un modèle attendu et d'appliquer le nom par défaut aux demandes qui ne correspondent pas.

Par exemple, vous pouvez avoir une seule application qui envoie des demandes à trois sous-domaines :www.example.comapi.example.com, etstatic.example.com. Vous pouvez utiliser une stratégie de dénomination dynamique avec le modèle*.example.com pour identifier les segments de chaque sous-domaine portant un nom différent, ce qui se traduit par trois nœuds de service sur la carte des services. Si votre application reçoit des demandes dont le nom d'hôte ne correspond pas au modèle, vous verrez un quatrième nœud sur la carte des services avec un nom de secours que vous spécifiez.

Pour utiliser le même nom pour tous les segments de demande, spécifiez le nom de votre application lorsque vous configurez l'enregistreur, comme illustré dans les sections précédentes.

Une stratégie d'attribution de noms dynamique définit un modèle auquel doivent correspondre les noms d'hôte et un nom par défaut à utiliser si le nom d'hôte de la demande HTTP ne correspond pas au modèle. Pour nommer des segments de façon dynamique dans Django, ajoutez le paramètre DYNAMIC_NAMING au fichier settings.py.

Exemple settings.py — Dénomination dynamique
XRAY_RECORDER = { 'AUTO_INSTRUMENT': True, 'AWS_XRAY_TRACING_NAME': 'My application', 'DYNAMIC_NAMING': '*.example.com', 'PLUGINS': ('ElasticBeanstalkPlugin', 'EC2Plugin') }

Vous pouvez utiliser '*' dans le modèle pour correspondre à n'importe quelle chaîne ou '?' pour correspondre à un seul caractère. Pour Flask, configurez l'enregistreur dans le code.

Exemple main.py — Nom du segment
from aws_xray_sdk.core import xray_recorder xray_recorder.configure(service='My application') xray_recorder.configure(dynamic_naming='*.example.com')
Note

Vous pouvez remplacer le nom de service par défaut que vous définissez avec la AWS_XRAY_TRACING_NAMEvariable d'environnementVariables d’environnement.