Configurer des métriques et journaux locaux pour la passerelle auto-hébergée de Gestion des API Azure

S’APPLIQUE À : Développeur | Premium

Cet article fournit des informations détaillées sur la configuration des métriques et journaux locaux pour la passerelle auto-hébergée déployée sur un cluster Kubernetes. Pour configurer les journaux et métriques cloud, consultez cet article.

Métriques

La passerelle auto-hébergée prend en charge StatsD, qui est devenu un protocole unifiant pour la collecte et l’agrégation des métriques. Cette section décrit les étapes de déploiement de StatsD sur Kubernetes, de configuration de la passerelle pour émettre des métriques via StatsD, et d’utilisation de Prometheus pour surveiller les métriques.

Déployer StatsD et Prometheus sur le cluster

L’exemple de configuration YAML suivant déploie StatsD et Prometheus sur le cluster Kubernetes sur lequel une passerelle auto-hébergée est déployée. Il crée également un Service pour chaque service. La passerelle auto-hébergée publie ensuite des métriques sur le service StatsD. Nous allons accéder au tableau de bord de Prometheus via son service.

Remarque

L’exemple suivant tire (pull) des images conteneurs publiques à partir de Docker Hub. Nous vous recommandons de configurer un secret d’extraction pour l’authentification à l’aide d’un compte Docker Hub au lieu de créer une demande de tirage anonyme. Pour une plus grande fiabilité lors de l’utilisation de contenu public, importez et gérez les images dans un registre de conteneurs Azure privé. En savoir plus sur l’utilisation des images publiques.

apiVersion: v1
kind: ConfigMap
metadata:
  name: sputnik-metrics-config
data:
  statsd.yaml: ""
  prometheus.yaml: |
    global:
      scrape_interval:     3s
      evaluation_interval: 3s
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
      - job_name: 'test_metrics'
        static_configs:
          - targets: ['localhost:9102']
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sputnik-metrics
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sputnik-metrics
  template:
    metadata:
      labels:
        app: sputnik-metrics
    spec:
      containers:
      - name: sputnik-metrics-statsd
        image: prom/statsd-exporter
        ports:
        - name: tcp
          containerPort: 9102
        - name: udp
          containerPort: 8125
          protocol: UDP
        args:
          - --statsd.mapping-config=/tmp/statsd.yaml
          - --statsd.listen-udp=:8125
          - --web.listen-address=:9102
        volumeMounts:
          - mountPath: /tmp
            name: sputnik-metrics-config-files
      - name: sputnik-metrics-prometheus
        image: prom/prometheus
        ports:
        - name: tcp
          containerPort: 9090
        args:
          - --config.file=/tmp/prometheus.yaml
        volumeMounts:
          - mountPath: /tmp
            name: sputnik-metrics-config-files
      volumes:
        - name: sputnik-metrics-config-files
          configMap:
            name: sputnik-metrics-config
---
apiVersion: v1
kind: Service
metadata:
  name: sputnik-metrics-statsd
spec:
  type: NodePort
  ports:
  - name: udp
    port: 8125
    targetPort: 8125
    protocol: UDP
  selector:
    app: sputnik-metrics
---
apiVersion: v1
kind: Service
metadata:
  name: sputnik-metrics-prometheus
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 9090
    targetPort: 9090
  selector:
    app: sputnik-metrics

Enregistrez les configurations dans un fichier nommé metrics.yaml. Utilisez la commande suivante pour tout déployer sur le cluster :

kubectl apply -f metrics.yaml

Une fois le déploiement terminé, exécutez la commande suivante pour vérifier que les pods sont en cours d’exécution. Le nom de votre pod sera différent.

kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
sputnik-metrics-f6d97548f-4xnb7        2/2     Running   0          1m

Exécutez la commande ci-dessous pour vérifier que les services sont en cours d’exécution. Prenez note du CLUSTER-IP et du PORT du service StatsD, car nous les utiliserons plus tard. Vous pouvez visiter le tableau de bord Prometheus en utilisant son EXTERNAL-IP et son PORT.

kubectl get services
NAME                         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
sputnik-metrics-prometheus   LoadBalancer   10.0.252.72   13.89.141.90    9090:32663/TCP               18h
sputnik-metrics-statsd       NodePort       10.0.41.179   <none>          8125:32733/UDP               18h

Configurer la passerelle auto-hébergée pour émettre des métriques

Maintenant que StatsD et Prometheus sont déployés, nous pouvons mettre à jour les configurations de la passerelle auto-hébergée pour commencer à émettre des métriques via StatsD. Vous pouvez activer ou désactiver la fonctionnalité en utilisant la clé telemetry.metrics.local dans le fichier Configmap du déploiement de la passerelle auto-hébergée avec des options supplémentaires. Les options disponibles sont les suivantes :

Champ Default Description
telemetry.metrics.local none Active la journalisation via StatsD. La valeur peut être none ou statsd.
telemetry.metrics.local.statsd.endpoint n/a Spécifie le point de terminaison de StatsD.
telemetry.metrics.local.statsd.sampling n/a Spécifie le taux d’échantillonnage des métriques. La valeur peut être comprise entre 0 et 1. Exemple : 0.5
telemetry.metrics.local.statsd.tag-format n/a Format d’étiquetage de l’exportateur StatsD. La valeur peut être none, librato, dogStatsD ou influxDB.

Voici un exemple de configuration :

apiVersion: v1
kind: ConfigMap
metadata:
    name: contoso-gateway-environment
data:
    config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
    telemetry.metrics.local: "statsd"
    telemetry.metrics.local.statsd.endpoint: "10.0.41.179:8125"
    telemetry.metrics.local.statsd.sampling: "1"
    telemetry.metrics.local.statsd.tag-format: "dogStatsD"

Mettez à jour le fichier YAML du déploiement de la passerelle auto-hébergée avec les configurations ci-dessus, et appliquez les modifications à l’aide de la commande ci-dessous :

kubectl apply -f <file-name>.yaml

Pour prélever les dernières modifications de configuration, redémarrez le déploiement de la passerelle à l’aide de la commande ci-dessous :

kubectl rollout restart deployment/<deployment-name>

Afficher les métriques

À présent que tout est déployé et configuré, la passerelle auto-hébergée doit signaler les métriques via StatsD. Prometheus récupère ensuite les métriques de StatsD. Accédez au tableau de bord Prometheus en utilisant les valeurs EXTERNAL-IP et PORT du service Prometheus.

Effectuez quelques appels d’API via la passerelle auto-hébergée. Si tout est bien configuré, vous devez être en mesure d’afficher les métriques ci-dessous :

Métrique Description
requests_total Nombre de demandes API au cours de la période
request_duration_seconds Nombre de millisecondes entre le moment où la passerelle a reçu la requête et celui où la réponse complète a été envoyée
request_backend_duration_seconds Nombre de millisecondes consacrées à l’ensemble des E/S du back-end (connexion, envoi et réception d’octets)
request_client_duration_seconds Nombre de millisecondes consacrées à l’ensemble des E/S du client (connexion, envoi et réception d’octets)

Journaux d’activité

La passerelle auto-hébergée génère des journaux dans stdout et stderr par défaut. Vous pouvez facilement afficher les journaux à l’aide de la commande suivante :

kubectl logs <pod-name>

Si votre passerelle auto-hébergée est déployée dans Azure Kubernetes Service, vous pouvez activer Azure Monitor pour conteneurs afin de collecter stdout et stderr à partir de vos charges de travail et d’afficher les journaux dans Log Analytics.

La passerelle auto-hébergée prend également en charge de nombreux protocoles, notamment localsyslog, rfc5424 et journal. Le tableau suivant récapitule toutes les options prises en charge.

Champ Default Description
telemetry.logs.std text Active la journalisation dans des flux standard. La valeur peut être none, text ou json.
telemetry.logs.local auto Active la journalisation locale. La valeur peut être none, auto, localsyslog, rfc5424, journal, json
telemetry.logs.local.localsyslog.endpoint n/a Spécifie le point de terminaison du syslog local. Pour plus de détails, consultez la section Utilisation des journaux syslog locaux.
telemetry.logs.local.localsyslog.facility n/a Spécifie le code de catégorie du syslog local. Exemple : 7
telemetry.logs.local.rfc5424.endpoint n/a Spécifie le point de terminaison de rfc5424.
telemetry.logs.local.rfc5424.facility n/a Spécifie le code de facilité par rfc5424. Exemple : 7
telemetry.logs.local.journal.endpoint n/a Spécifie le point de terminaison du journal.
telemetry.logs.local.json.endpoint 127.0.0.1:8888 Spécifie le point de terminaison UDP qui accepte les données JSON : chemin de fichier, adresse IP : port ou nom d’hôte : port.

Voici un exemple de configuration de journalisation locale :

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: contoso-gateway-environment
    data:
        config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
        telemetry.logs.std: "text"
        telemetry.logs.local.localsyslog.endpoint: "/dev/log"
        telemetry.logs.local.localsyslog.facility: "7"

Utilisation des journaux syslog locaux

Configuration de la passerelle pour diffuser en continu les journaux

Lorsque vous utilisez le syslog local comme destination pour les journaux, le runtime doit autoriser la diffusion en continu des journaux vers la destination. Pour Kubernetes, un volume correspondant à la destination doit être monté.

Étant donné la configuration suivante :

apiVersion: v1
kind: ConfigMap
metadata:
    name: contoso-gateway-environment
data:
    config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
    telemetry.logs.local: localsyslog
    telemetry.logs.local.localsyslog.endpoint: /dev/log

Vous pouvez facilement commencer à diffuser en continu les journaux vers ce point de terminaison syslog local :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-deployment
  labels:
    app: contoso
spec:
  replicas: 1
  selector:
    matchLabels:
      app: contoso
  template:
    metadata:
      labels:
        app: contoso
    spec:
      containers:
        name: azure-api-management-gateway
        image: mcr.microsoft.com/azure-api-management/gateway:2.5.0
        imagePullPolicy: IfNotPresent
        envFrom:
        - configMapRef:
            name: contoso-gateway-environment
        # ... redacted ...
+       volumeMounts:
+       - mountPath: /dev/log
+         name: logs
+     volumes:
+     - hostPath:
+         path: /dev/log
+         type: Socket
+       name: logs

Consommation des journaux syslog locaux sur Azure Kubernetes Service (AKS)

Lorsque vous configurez l’utilisation du syslog local sur Azure Kubernetes Service, vous pouvez explorer les journaux de deux façons :

Consommation des journaux d’activité à partir des nœuds Worker

Vous pouvez facilement les consommer en accédant aux nœuds Worker :

  1. Créer une connexion SSH au nœud (docs)
  2. Les journaux sont accessibles sous host/var/log/syslog

Par exemple, vous pouvez filtrer tous les syslogs pour ne retenir que ceux provenant de la passerelle autohébergée :

$ cat host/var/log/syslog | grep "apimuser"
May 15 05:54:20 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:20.0445178Z, isRequestSuccess=True, totalTime=290, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:20.0445178Z, region=Repro, correlationId=b28565ec-73e0-41e6-9312-efcdd6841846, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=287, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.cloudapp.net/api/resource?param1\=sample"
May 15 05:54:21 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:21.1189171Z, isRequestSuccess=True, totalTime=150, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:21.1189171Z, region=Repro, correlationId=ab4d7464-acee-40ae-af95-a521cc57c759, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=148, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.cloudapp.net/api/resource?param1\=sample"

Notes

Si vous avez modifié la racine avec chroot, par exemple chroot /host, le chemin d’accès ci-dessus doit refléter cette modification.

Étapes suivantes