Malgré tous ses avantages, une architecture de microservices introduit également de nouvelles complexités. L’un des défis est de suivre les demandes au fur et à mesure de leur traitement, les données circulant entre tous les microservices qui composent l’application. Une nouvelle méthodologie appelée traçage distribué (requête) a été inventée à cette fin, et OpenTracing est un ensemble de spécifications et de normes d'API destinées à guider la conception et la mise en œuvre d'outils de traçage distribués.
Dans NGINX Plus Release 18 (R18) , nous avons ajouté le module NGINX OpenTracing à notre référentiel de modules dynamiques (il est disponible en tant que module tiers sur GitHub depuis quelques années maintenant). L’un des principaux avantages du module NGINX OpenTracing est qu’en instrumentant NGINX et NGINX Plus pour le traçage distribué, vous obtenez des données de traçage pour chaque application proxy, sans avoir à instrumenter les applications individuellement.
Dans ce blog, nous montrons comment activer le traçage distribué des requêtes pour NGINX ou NGINX Plus (pour plus de concision, nous ferons désormais simplement référence à NGINX Plus ). Nous fournissons des instructions pour deux services de traçage distribués ( traceurs , dans la terminologie OpenTracing), Jaeger et Zipkin . (Pour une liste d'autres traceurs, consultez la documentation OpenTracing .) Pour illustrer le type d’informations fournies par les traceurs, nous comparons le traitement des requêtes avant et après l’activation de la mise en cache NGINX Plus.
Un traceur comporte deux composants de base :
La première étape consiste à installer et configurer le serveur pour le traceur de votre choix. Nous fournissons des instructions pour Jaeger et Zipkin ; adaptez-les si nécessaire pour d'autres traceurs.
Nous recommandons la méthode suivante pour installer le serveur Jaeger. Vous pouvez également télécharger des images Docker à l’URL spécifiée à l’étape 1.
Accédez à la page de téléchargement de Jaeger et téléchargez le binaire Linux (au moment de la rédaction, jaeger-1.12.0-linux-amd64.tar ).
Déplacez le binaire vers /usr/bin/jaeger (en créant d'abord le répertoire si nécessaire) et exécutez-le.
$ mkdir /usr/bin/jaeger $ mv jaeger-1.12.0-linux-amd64.tar /usr/bin/jaeger $ cd /usr/bin/jaeger $ tar xvzf jaeger-1.12.0-linux-amd64.tar.gz $ sudo rm -rf jaeger-1.12.0-linux-amd64.tar.gz $ cd jaeger-1.12.0-linux-amd64 $ ./jaeger-all-in-one
Vérifiez que vous pouvez accéder à l'interface utilisateur Jaeger dans votre navigateur, à l' adresse http:// Jaeger-server-IP-address :16686/ (16686 est le port par défaut du serveur Jaeger).
Téléchargez et exécutez une image Docker de Zipkin (nous utilisons le port 9411, la valeur par défaut).
$ docker run -d -p 9411:9411 openzipkin/zipkin
Vérifiez que vous pouvez accéder à l'interface utilisateur Zipkin dans votre navigateur, à l' adresse http:// Zipkin-server-IP-address :9411/ .
Exécutez ces commandes sur l’hôte NGINX Plus pour installer le plug-in pour Jaeger ou Zipkin.
Installez le plug-in Jaeger. La commande wget
suivante est destinée aux systèmes Linux x86-64 :
$ cd /usr/local/lib $ wget https://github.com/jaegertracing/jaeger-client-cpp/releases/download/v0.4.2/libjaegertracing_plugin.linux_amd64.so -O /usr/local/lib/libjaegertracing_plugin.so
Les instructions pour créer le plug-in à partir de la source sont disponibles sur GitHub .
Créez un fichier de configuration au format JSON pour le plug-in, nommé /etc/jaeger/jaeger-config.json , avec le contenu suivant. Nous utilisons le port par défaut pour le serveur Jaeger, 6831 :
{ "service_name": "nginx", "sampler": { "type": "const", "param": 1 }, "reporter": { "localAgentHostPort": " Adresse IP du serveur Jaeger : 6831 " } }
Pour plus de détails sur l'objet échantillonneur
, consultez la documentation Jaeger .
Installez le plug-in Zipkin. La commande wget
suivante est destinée aux systèmes Linux x86-64 :
$ cd /usr/local/lib $ wget -O - https://github.com/rnburn/zipkin-cpp-opentracing/releases/download/v0.5.2/linux-amd64-libzipkin_opentracing_plugin.so.gz | gunzip -c > /usr/local/lib/libzipkin_opentracing_plugin.so
Créez un fichier de configuration au format JSON pour le plug-in, nommé /etc/zipkin/zipkin-config.json , avec le contenu suivant. Nous utilisons le port par défaut pour le serveur Zipkin, 9411 :
{ "nom_service": "nginx", "hôte_collecteur": " Adresse IP du serveur Zipkin ", " port_collecteur " : 9411 }
Pour plus de détails sur les objets de configuration, consultez le schéma JSON sur GitHub .
Exécutez ces instructions sur l’hôte NGINX Plus.
Installez le module NGINX OpenTracing conformément aux instructions du Guide d'administration NGINX Plus .
Ajoutez la directive load_module
suivante dans le contexte principal (de niveau supérieur) du fichier de configuration principal de NGINX Plus ( /etc/nginx/nginx.conf ) :
charger_module modules/ngx_http_opentracing_module.so;
Ajoutez les directives suivantes à la configuration NGINX Plus.
Si vous utilisez le schéma de configuration conventionnel , placez les directives dans un nouveau fichier appelé /etc/nginx/conf.d/opentracing.conf . Vérifiez également que la directive d'inclusion
suivante apparaît dans le contexte http
dans /etc/nginx/nginx.conf :
http {
include /etc/nginx/conf.d/*.conf;
}
opentracing_load_tracer
active le plug-in tracer. Décommentez la directive pour Jaeger ou Zipkin selon le cas.opentracing_tag
rendent les variables NGINX Plus disponibles sous forme de balises OpenTracing qui apparaissent dans l'interface utilisateur du traceur.log_format
et access_log
. Si vous souhaitez remplacer le journal d'accès et le format de journal NGINX par défaut par celui-ci, décommentez les directives, puis remplacez les trois instances de « opentracing
» par « main
». Une autre option consiste à enregistrer l’activité OpenTracing uniquement pour le trafic sur le port 9001 – supprimez le commentaire des directives log_format
et access_log
et déplacez-les dans le bloc serveur
.serveur
configure OpenTracing pour l'exemple d'application Ruby décrit dans la section suivante .# Charger un traceur de fournisseur#opentracing_load_tracer /usr/local/libjaegertracing_plugin.so
# /etc/jaeger/jaeger-config.json;
#opentracing_load_tracer /usr/local/lib/libzipkin_opentracing_plugin.so
# /etc/zipkin/zipkin-config.json;
# Activer le traçage pour toutes les requêtes
opentracing on;
# Définir des balises supplémentaires qui capturent la valeur des variables NGINX Plus
opentracing_tag bytes_sent $bytes_sent;
opentracing_tag http_user_agent $http_user_agent;
opentracing_tag request_time $request_time;
opentracing_tag upstream_addr $upstream_addr;
opentracing_tag upstream_bytes_received $upstream_bytes_received;
opentracing_tag statut_cache_amont $upstream_cache_status;
opentracing_tag heure_connexion_amont $upstream_connect_time;
opentracing_tag heure_en-tête_amont $upstream_header_time;
opentracing_tag heure_file_amont $upstream_queue_time;
opentracing_tag heure_réponse_amont $upstream_response_time;
#décommenter pour le débogage
# log_format opentracing '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for" '
# '"$host" sn="$server_name" '
# 'rt=$request_time '
# 'ua="$upstream_addr" us="$upstream_status" '
# 'ut="$upstream_response_time" ul="$upstream_response_length" '
# 'cs=$upstream_cache_status';
#access_log /var/log/nginx/opentracing.log opentracing;
serveur {
écouter 9001;
location / {
# Le nom de l'opération utilisé pour OpenTracing Spans est par défaut le nom du
# bloc 'location', mais supprimez le commentaire de cette directive pour la personnaliser.
#opentracing_operation_name $uri;
# Propager le contexte Span actif en amont, afin que la trace puisse être
# continuée par le backend.
opentracing_propagate_context;
# Assurez-vous que votre application Ruby écoute sur le port 4567
proxy_pass http://127.0.0.1:4567;
}
}
Valider et recharger la configuration NGINX Plus :
$ nginx -t $ nginx -s recharger
Avec le traceur et la configuration NGINX Plus en place, nous créons un exemple d'application Ruby qui montre à quoi ressemblent les données OpenTracing. L'application nous permet de mesurer dans quelle mesure la mise en cache NGINX Plus améliore le temps de réponse. Lorsque l'application reçoit une requête telle que la requête HTTP GET
suivante pour / , elle attend un laps de temps aléatoire (entre 2 et 5 secondes) avant de répondre.
$ curl http:// Adresse IP NGINX Plus : 9001/
Installez et configurez Ruby et Sinatra (une bibliothèque d’applications Web logicielles open source et un langage spécifique au domaine écrit en Ruby comme alternative aux autres frameworks d’applications Web Ruby).
Créez un fichier appelé app.rb avec le contenu suivant :
#!/usr/bin/ruby
require 'sinatra'
get '/*' do
out = "<h1>Application simple Ruby</h1>" + "\n"
#Dormir un temps aléatoire entre 2 s et 5 s
sleeping_time = rand(4)+2
sleep(sleeping_time)
puts "slept for: #{sleeping_time}s."
out += '<p>some output text</p>' + "\n"
return out
end
Rendez app.rb exécutable et exécutez-le :
$ chmod +x app.rb $ ./app.rb
Nous utilisons Jaeger et Zipkin pour montrer combien de temps il faut à NGINX Plus pour répondre à une demande lorsque la mise en cache n'est pas activée. Pour chaque traceur, nous envoyons cinq requêtes.
Voici les cinq demandes affichées dans l'interface utilisateur de Jaeger (la plus récente en premier) :
Voici les mêmes informations sur la console de l’application Ruby :
- -> /dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:50:46 +0000] "GET / HTTP/1.1" 200 49 3.0028
127.0.0.1 - - [07/06/2019 : [10:50:43 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 2s.
127.0.0.1 - - [07/06/2019 : 10:50:56 +0000] "GET / HTTP/1.1" 200 49 2.0018
127.0.0.1 - - [07/06/2019 : [10:50:54 UTC] "GET / HTTP/1.0"1 200 49
- -> /
a dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:53:16 +0000] "GET / HTTP/1.1" 200 49 3.0029
127.0.0.1 - - [07/06/2019 : [10:53:13 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 4s.
127.0.0.1 - - [07/06/2019 : 10:54:03 +0000] "GET / HTTP/1.1" 200 49 4.0030
127.0.0.1 - - [07/06/2019 : [10:53:59 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:54:11 +0000] "GET / HTTP/1.1" 200 49 3.0012
127.0.0.1 - - [07/06/2019 : [10:54:08 UTC] "GET / HTTP/1.0" 200 49
Dans l'interface utilisateur Jaeger, nous cliquons sur la première demande (la plus récente) pour afficher les détails la concernant, y compris les valeurs des variables NGINX Plus que nous avons ajoutées en tant que balises :
Voici cinq autres requêtes dans l'interface utilisateur Zipkin :
Les mêmes informations sur la console de l'application Ruby :
- -> /dormi pendant : 2s.
127.0.0.1 - - [07/06/2019 : 10:31:18 +0000] "GET / HTTP/1.1" 200 49 2.0021
127.0.0.1 - - [07/06/2019 : [10:31:16 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:31:50 +0000] "GET / HTTP/1.1" 200 49 3.0029
127.0.0.1 - - [07/06/2019 : [10:31:47 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:32:08 +0000] "GET / HTTP/1.1" 200 49 3.0026
127.0.0.1 - - [07/06/2019 : [10:32:05 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 3s.
127.0.0.1 - - [07/06/2019 : 10:32:32 +0000] "GET / HTTP/1.1" 200 49 3.0015
127.0.0.1 - - [07/06/2019 : [10:32:29 UTC] "GET / HTTP/1.0" 200 49
- -> /
a dormi pendant : 5s.
127.0.0.1 - - [07/06/2019 : 10:32:52 +0000] "GET / HTTP/1.1" 200 49 5.0030
127.0.0.1 - - [07/06/2019 : [10:32:47 UTC] "GET / HTTP/1.0" 200 49
Dans l'interface utilisateur Zipkin, nous cliquons sur la première demande pour afficher les détails la concernant, y compris les valeurs des variables NGINX Plus que nous avons ajoutées en tant que balises :
Nous activons la mise en cache en ajoutant des directives dans le fichier opentracing.conf que nous avons créé dans Configuration de NGINX Plus .
Dans le contexte http
, ajoutez cette directive proxy_cache_path
:
chemin_cache_proxy /data/nginx/cache keys_zone=one:10m;
Dans le bloc serveur
, ajoutez les directives proxy_cache
et proxy_cache_valid
suivantes :
proxy_cache un ;
proxy_cache_valid tout 1m ;
Valider et recharger la configuration :
$ nginx -t $ nginx -s recharger
Voici l’interface utilisateur de Jaeger après deux requêtes.
La première réponse (étiquetée 13f69db ) a pris 4 secondes. NGINX Plus a mis en cache la réponse et lorsque la demande a été répétée environ 15 secondes plus tard, la réponse a pris moins de 2 millisecondes (ms) car elle provenait du cache NGINX Plus.
Un examen détaillé des deux demandes explique la différence de temps de réponse. Pour la première requête, upstream_cache_status
est MISS
, ce qui signifie que les données demandées n'étaient pas dans le cache. L'application Ruby a ajouté un délai de 4 secondes.
Pour la deuxième requête, upstream_cache_status
est HIT
. Étant donné que les données proviennent du cache, l’application Ruby ne peut pas ajouter de délai et le temps de réponse est inférieur à 2 ms. Les valeurs upstream_*
vides indiquent également que le serveur en amont n'a pas été impliqué dans cette réponse.
L'affichage dans l'interface utilisateur Zipkin pour deux requêtes avec mise en cache activée donne une image similaire :
Et encore une fois, regarder les deux demandes en détail explique la différence de temps de réponse. La réponse n'est pas mise en cache pour la première requête ( upstream_cache_status
est MISS
) et l'application Ruby (par coïncidence) ajoute le même délai de 4 secondes que dans l'exemple Jaeger.
La réponse a été mise en cache avant que nous fassions la deuxième requête, donc upstream_cache_status
est HIT
.
Le module NGINX OpenTracing permet de tracer les requêtes et réponses NGINX Plus et donne accès aux variables NGINX Plus à l'aide de balises OpenTracing. Différents traceurs peuvent également être utilisés avec ce module.
Pour plus de détails sur le module NGINX OpenTracing, visitez le référentiel du module NGINX OpenTracing sur GitHub.
Pour essayer OpenTracing avec NGINX Plus, démarrez votre essai gratuit de 30 jours dès aujourd'hui ou contactez-nous pour discuter de vos cas d'utilisation .
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."