Istio & Service Mesh – Contrôlez et tunez les flux entre vos micro services

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.

Workload 2 appelle workload3-service/start

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();
	}
Print Friendly, PDF & Email

Une réponse sur “Istio & Service Mesh – Contrôlez et tunez les flux entre vos micro services”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.