Tracing – Visualisez une chaine d’appel
Istio vous permet de configurer plusieurs types de logs de votre Service Mesh.
- Métriques des proxys, services et briques internes
- Traces d’appels
- Logs d’accès.
Cette partie traitera de la partie traces d’appels afin de reconstituer le chemin d’une requête. Les proxy sidecar envoy rajoutent automatiquement pour vous des headers HTTP au format OpenTrace permettant leur exploitation dans des outils dédiés. Jaeger est l’outil installé avec Istio, mais il est possible de configurer d’autres outils comme Zipkin, Lightstep ou Datalog.
Pour résumer, lors d’un échange HTTP, les headers suivants seront rajoutés :
- Trace ID
- Span ID
- Parent Span ID
La combinaison de ces trois headers va permettre de retracer le parcours d’une requête. Cependant votre application devra faire en sorte de transporter les headers HTTP reçus vers la prochaine requête HTTP. Dans cette transition, le sidecar envoy va re créer de nouveaux header et chaque appel sera interprété comme un nouvel appel.
Si votre application fait transiter les headers, Envoy ne les rajoutera pas et la trace sera transmise de service en service. Le résultat sur Jaeger est le suivant :
On voit le cheminement de la requête depuis la gateway d’entrée jusqu’a workload1, qui appelle workload2, qui appelle workload 3. Jaeger permet de visualiser le path d’appel de chaque étape également.
Les headers HTTP à faire transiter sont les suivants :
- « x-request-id »
- « x-b3-traceid »
- « x-b3-spanid »
- « x-b3-sampled »
- « x-b3-flags »,
- « x-ot-span-context »
- « x-datadog-trace-id »
- « x-datadog-parent-id »
- « x-datadog-sampled »
- « end-user »
- « user-agent »
Exemple avec une application SpringBoot JAVA :
@GetMapping(path = "/start") public String callMod2(@RequestHeader Map<String, String> headers) { headers.forEach((key, value) -> { logger.info(String.format("Header '%s' = %s", key, value)); }); HttpHeaders newReqHeaders = new HttpHeaders(); for (String header : headers_to_proagate) { String value = headers.get(header); if (value != null) { newReqHeaders.add(header,value); } } RestTemplate restTemplate = new RestTemplate(); final String uri = "http://workload3-service:8080/start"; HttpEntity<String> entity = new HttpEntity<String>("parameters", newReqHeaders); ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class); //String result = restTemplate.getForObject(uri, String.class); return result.getBody(); }
Une réponse sur “Istio & Service Mesh – Contrôlez et tunez les flux entre vos micro services”