Après avoir vu dans les deux précédents articles, comment mettre en place du monitoring très simplement sur un cluster K8s orchestré depuis Rancher, puis comment déployer des services sécurisés depuis la même plate-forme d'orchestration, nous allons nous pencher cette fois sur les outils suivants d'analyse de sites web.

Rappel du contexte

Nous disposons de deux sites web sécurisés, un Wordpress et un Ghost avec deux sous-domaines gérés depuis notre DNS. Ces deux sites doivent désormais bénéficier d'outils de tracing par exemple et d'analyses des data (ElasticSearch, Kibana, Logstach).

Installation de Jaeger

Pour obtenir ce service en ui depuis Rancher, il faut :

Lancer l'application depuis Rancher et cliquant sur "launch" puis sélectionner l'application et démarrer, au bout de quelques minutes celle-ci apparaitra comme "active" :

Comment accéder à la page web ui ? rien de plus simple, dans un terminal saisir les commandes suivantes que vous trouverez dans les détails de votre application jaeger sur Rancher.

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/instance=jaeger,app.kubernetes.io/component=query" -o jsonpath="{.items[0].metadata.name}") 
echo http://127.0.0.1:8080/ 
kubectl port-forward --namespace default $POD_NAME 8080:16686

Concepts de Jaeger et Open Tracing

Le service d'interface utilisateur envoie ses requêtes afin que nous puissions voir des exemples de quelques traces de base.

Examinez la zone située à gauche de la page intitulée "Rechercher des traces". Le premier, un sélecteur, répertorie les services disponibles pour le traçage. Le compte devrait en montrer un. (Si ce n’est pas le cas, essayez d’actualiser la page.) Maintenant, cliquez sur le sélecteur et vous verrez jaeger-query répertorié comme le seul service.

Un service est une application enregistrée à Jaeger. Nous verrons comment enregistrer notre application ci-dessous.  Ensuite, avec jaeger-query sélectionné, cliquez sur le bouton Rechercher des traces en bas du formulaire.

Une liste de traces apparaîtra à droite de l'écran. Les traces ont des titres qui correspondent au sélecteur d'opération sur le formulaire de recherche. Sélectionnez /api/services dans la zone Opération, puis cliquez à nouveau sur le bouton Rechercher. En fonction du nombre de fois que vous avez rechargé la page, vous verrez quelques opérations.

Cliquez maintenant sur l'une des traces.

Cette trace comporte une opération. Cela a pris 38,43 ms. Il n’ya pas grand chose à regarder ici. Mais nous pouvons regarder ce que le service a envoyé au serveur Jaeger Tracing. Alors cliquez sur la case en haut à droite de la page.

Jaeger Tracing Tags

Ensuite, regardons le JSON.

{
    "data": [
        {
            "traceID": "3e5ab20e9c36543e",
            "spans": [
                {
                    "traceID": "3e5ab20e9c36543e",
                    "spanID": "3e5ab20e9c36543e",
                    "flags": 1,
                    "operationName": "/api/services",
                    "references": [],
                    "startTime": 1565007029535869,
                    "duration": 38431,
                    "tags": [
                        {
                            "key": "sampler.type",
                            "type": "string",
                            "value": "probabilistic"
                        },
                        {
                            "key": "sampler.param",
                            "type": "float64",
                            "value": 1
                        },
                        {
                            "key": "span.kind",
                            "type": "string",
                            "value": "server"
                            },
                            {
                                "key": "http.method",
                                "type": "string",
                                "value": "GET"
                            },
                            {
                                "key": "http.url",
                                "type": "string",
                                "value": "/api/services"
                            },
                            {
                                "key": "component",
                                "type": "string",
                                "value": "net/http"
                            },
                            {
                                "key": "http.status_code",
                                "type": "int64",
                                "value": 200
                            },
                            {
                                "key": "internal.span.format",
                                "type": "string",
                                "value": "proto"
                            }
                        ],
                        "logs": [],
                        "processID": "p1",
                        "warnings": null
                    }
                ],
                "processes": {
                    "p1": {
                        "serviceName": "jaeger-query",
                        "tags": [
                            {
                                "key": "client-uuid",
                                "type": "string",
                                "value": "6ff2abd7d059bbcb"
                            },
                            {
                                "key": "hostname",
                                "type": "string",
                                "value": "jaeger-query-8bf9789bf-2jhg5"
                            },
                            {
                                "key": "ip",
                                "type": "string",
                                "value": "10.52.1.49"
                            },
                            {
                                "key": "jaeger.version",
                                "type": "string",
                                "value": "Go-2.15.1dev"
                            }
                        ]
                    }
                },
                "warnings": null
            }
        ],
        "total": 0,
        "limit": 0,
        "offset": 0,
        "errors": null
    }

Il y a beaucoup d'informations ici. Vers le haut du JSON, vous voyez un tableau de plages. Cette trace n'en a qu'un. Une trace consiste en une ou plusieurs plages. Comme vous pouvez le deviner, une période est un intervalle de temps contenant une ou plusieurs opérations. Nous examinerons de plus près les étendues lorsque nous ajouterons du code au service.  À l’intérieur, il y a un grand nombre de tags. Les tags sont des attributs qu'une application ajoute aux traces. En voici deux:

{
    "key": "http.method",
    "type": "string",
    "value": "GET"
},
{
    "key": "http.status_code",
    "type": "int64",
    "value": 200
}

Nous verrons comment ajouter ces tags à nos spans ci-dessous. Pour le moment, revenons à la page principale et utilisons des tags pour effectuer une recherche. Entrez maintenant http.method = get dans le champ Tags et cliquez à nouveau sur le bouton de recherche.

Vous verrez une liste de traces. La plupart des opérations de l'interface utilisateur de Jaeger sont des systèmes GETS, ce qui est logique.  C’est la base de l’interface Jaeger. Connectons un service à présent.

Tracing a service

L'application du didacticiel Jaeger contient une API CRUD (create-read-update-delete) pour la gestion des enregistrements des employés. Les enregistrements sont stockés dans un hashmap local. Nous allons ajouter une trace avec deux plages à l’application.

Créer un traceur

Pour ajouter le traçage à une application, vous avez besoin d'un traceur. Nous allons en créer un et utiliser Spring pour le fournir aux classes de service et de contrôleur de microservice.  Voici la méthode pour créer le traceur: