NGINX
Rapport de recherche Datadog : Bilan sur l'adoption de l'informatique sans serveur Rapport : Bilan sur l'adoption de l'informatique sans serveur

NGINX

L’APM Datadog peut prendre en charge NGINX en utilisant une combinaison de plug-ins et de configurations. Les instructions ci-dessous utilisent le paquet NGINX disponible dans les référentiels Linux officiels et des binaires pré-compilés pour les plug-ins.

Version open source de NGINX

Installation des plug-ins

Remarque : ce plug-in ne fonctionne pas sur les distributions Linux qui utilisent des versions antérieures de libstdc++, notamment RHEL/Centos 7 et AmazonLinux 1. Une solution consiste à exécuter NGINX à partir d’un conteneur Docker. Un exemple de Dockerfile est disponible ici.

Les plug-ins suivants doivent être installés :

Commandes pour télécharger et installer ces modules :

# Récupérer le dernier numéro de version depuis Github.
get_latest_release() {
  wget -qO- "https://api.github.com/repos/$1/releases/latest" |
    grep '"tag_name":' |
    sed -E 's/.*"([^"]+)".*/\1/';
}
NGINX_VERSION=1.17.3
OPENTRACING_NGINX_VERSION="$(get_latest_release opentracing-contrib/nginx-opentracing)"
DD_OPENTRACING_CPP_VERSION="$(get_latest_release DataDog/dd-opentracing-cpp)"
# Installer le plug-in NGINX pour OpenTracing
wget https://github.com/opentracing-contrib/nginx-opentracing/releases/download/${OPENTRACING_NGINX_VERSION}/linux-amd64-nginx-${NGINX_VERSION}-ngx_http_module.so.tgz
tar zxf linux-amd64-nginx-${NGINX_VERSION}-ngx_http_module.so.tgz -C /usr/lib/nginx/modules
# Installer le plug-in C++ Datadog pour Opentracing
wget https://github.com/DataDog/dd-opentracing-cpp/releases/download/${DD_OPENTRACING_CPP_VERSION}/linux-amd64-libdd_opentracing_plugin.so.gz
gunzip linux-amd64-libdd_opentracing_plugin.so.gz -c > /usr/local/lib/libdd_opentracing_plugin.so

Configuration de NGINX

La configuration de NGINX doit charger le module OpenTracing.

# Charger le module OpenTracing
load_module modules/ngx_http_opentracing_module.so;

Le bloc http active le module OpenTracing et charge le traceur Datadog :

    opentracing on; # Activer OpenTracing.
    opentracing_tag http_user_agent $http_user_agent; # Ajouter un tag à chaque trace.
    opentracing_trace_locations off; # Émettre une seule span par requête.

    # Charger l'implémentation de tracing Datadog et le fichier de configuration donné.
    opentracing_load_tracer /usr/local/lib/libdd_opentracing_plugin.so /etc/dd-config.json;

Ajoutez les lignes suivantes au bloc location dans le serveur où vous souhaitez effectuer le tracing :

            opentracing_operation_name "$request_method $uri";
            opentracing_propagate_context;

Un fichier de configuration pour l’implémentation du tracing Datadog est également requis :

{
  "environment": "prod",
  "service": "nginx",
  "operation_name_override": "nginx.handle",
  "agent_host": "localhost",
  "agent_port": 8126
}

La valeur service peut être modifiée afin d’être adaptée à votre utilisation de NGINX. Il est possible que vous soyez contraint de modifier la valeur agent_host si NGINX s’exécute dans un conteneur ou un environnement orchestré.

Exemples complets :

Une fois cette configuration terminée, les requêtes HTTP transmises à NGINX initieront et propageront les traces Datadog, qui s’afficheront dans l’interface graphique de l’APM.

NGINX et FastCGI

Lorsque l’emplacement dessert un backend FastCGI au lieu de HTTP, le bloc location doit utiliser opentracing_fastcgi_propagate_context au lieu de opentracing_propagate_context.

NGINX Ingress Controller pour Kubernetes

Les versions 0.23.0 et ultérieures du contrôleur Kubernetes ingress-nginx incluent le plug-in NGINX pour OpenTracing.

Pour activer ce plug-in, créez ou modifiez une ConfigMap en définissant enable-opentracing: "true" et datadog-collector-host, à savoir l’emplacement où les traces doivent être envoyées. Le nom de la ConfigMap sera cité explicitement par l’argument de ligne de commande du conteneur du contrôleur nginx-ingress. Par défaut, sa valeur est --configmap=$(POD_NAMESPACE)/nginx-configuration. Si ingress-nginx a été installé avec une chart helm, le nom de cette ConfigMap suivra le modèle suivant : Nom-Version-nginx-ingress-controller.

Le contrôleur Ingress gère les fichiers nginx.conf et /etc/nginx/opentracing.json. Le tracing est activé pour tous les blocs location.

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  enable-opentracing: "true"
  datadog-collector-host: $HOST_IP
  # Valeurs par défaut
  # datadog-service-name: "nginx"
  # datadog-collector-port: "8126"
  # datadog-operation-name-override: "nginx.handle"

En outre, vérifiez que les spécifications de pod de votre contrôleur nginx-ingress définissent la variable d’environnement HOST_IP. Ajoutez cette entrée au bloc env: qui contient les variables d’environnement POD_NAME et POD_NAMESPACE.

- name: HOST_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP

Pour définir un nom de service différent selon le contrôleur Ingress à l’aide d’annotations :

  nginx.ingress.kubernetes.io/configuration-snippet: |
      opentracing_tag "service.name" "custom-service-name";

Ce qui précède remplace le nom de service par défaut nginx-ingress-controller.ingress-nginx.

Pour aller plus loin