Avez-vous déjà entendu parler d’Observabilité ?
* Non ? Dommage pour votre prod ! Nous vous souhaitons une belle war room :-)
* Oui ? L’implémentez-vous pour autant ?
L’Observabilité est un concept qui n’est pas récent, mais qui a pris de l’ampleur ces dernières années, et plus encore avec l’arrivée de projets comme Prometheus, Grafana ou encore OpenTelemetry. En pratique ce sont tout plein d’outils qui vont vous permettre d’instrumenter et de connaître tous les petits secrets de votre application. Grâce à eux vous devriez être capable d’expliquer le moindre soubresaut, voir même de les prévoir et agir en conséquence ! Mais au fait que sont tous ses outils ? En quoi ça consiste ? Et surtout comme ça marche ?
Dans cette session, nous explorerons par le menu le concept d’Observabilité, de ses 3 Piliers jusqu’au principe d’instrumentation, tout cela illustré avec un peu de code. Nous verrons également comment OpenTelemetry se veut être la solution de référence qui abordera tous ces aspects, au plus grand bonheur de notre production (et des nuits de vos SRE préférés) !
Ce talk a été donné lors de la conférence Touraine Tech 2022 (https://touraine.tech/).
Ressources :
* Démonstration: https://github.com/foxlegend/observablity-from-zero-to-opentelemetry
* Injection de charge: https://github.com/TheCopycat/spring-petclinic-bench
3. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
K8S
Api
Gateway
User
Service
Audit
Service
Audit
DB
User
DB
Kafka
Product
Mongo
DB
Basket
Service
Product
Service
Authentication
Delegation
Payment
Proxy
Corp
SSO
Client
SSO
Payment
Provider
10. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Comment définir l’Observabilité ?
L’Observabilité est une mesure de la capacité à
déduire les états internes d’un système à partir de
la connaissance de ses sorties externes.
“
WIKIPEDIA
The Free Encyclopedia
11. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Observabilité
Observabilité et Télémétrie
Métriques
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Logs
Traces
Stockage Traitement, Exploration & Alertes
Crédits images : flaticon: srip, Becris, Freepik
12. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Logs
Type de données : Evènements
Composition :
Ensemble de lignes de texte:
- Timestamp
- Tags
- Message
1970-1990 1990-2010 2010-now
[2022-01-21 14:25:30][INFO ][main-1] Hello Touraine tech
[2022-01-21 14:25:31][INFO ][main-1] Observability
[2022-01-21 14:25:32][DEBUG][main-1] Type=Talk
[2022-01-21 14:25:33][DEBUG][main-1] Speakers=2
[2022-01-21 14:25:33][WARN ][main-1] Unknowns=Knowns
[2022-01-21 14:25:34][TRACE][main-1] Coucou Maman
[2022-01-21 14:25:34][ERROR][main-1] Exception in thread "main"
java.lang.NullPointerException
At tech.touraine.person.Speakers.submitTalk (Speakers.java:47)
At tech.touraine.talk.Talk.submitTalk (Talk.kt:38)
At java.lang.Thread.run (Unknown Source)
[2022-01-21 14:25:35][FATAL][main-1] No Space Left on Device
13. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Metrics
Type de données : aggrégeables
Composition :
Ensemble de mesures :
- Timestamp
- Nom
- Tags
- Valeur numérique
1970-1990 1990-2010 2010-now
17. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Métriques
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Logs
Traces
18. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Et le Monitoring ?
Le Monitoring désigne la mesure d’un système […] dans le cadre
de la supervision d’un parc.
“ WIKIPEDIA
L’encyclopédie libre
…
{ }
Crédits images : flaticon: Freepik, Eucalyp, good-ware, srip, juicy-fish, smashicons
19. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Monitoring vs Observabilité
Monitoring Observabilité
Réactivité Proactivité
Prévisible Imprévisible
Quand ? Pourquoi ?
Problème Compréhension
21. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Origines
Traces
2016
OpenCensus
Métriques
Traces 2018
2019
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Logs
Métriques
Traces
2021 2022 ? Crédits images : flaticon
24. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Métriques : créer un compteur
@ApplicationScoped
public class BasketService {
// Meter creates Instruments (Counter, Gauge, Histogram...)
private static final Meter meter = GlobalOpenTelemetry
.getMeter("basket.metrics");
// Creates a Counter
private static LongCounter basketCounter =
meter.counterBuilder("basket_creation")
.setDescription("Compte les paniers créés")
.setUnit("basket")
.build();
// -- hidden code --
}
25. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Métriques : utiliser un compteur
@ApplicationScoped
public class BasketService {
private static final Meter meter = ...
private static LongCounter basketCounter = ...
public Basket createBasket(Basket basket) {
basketRepository.put(basket.id, basket);
basketCounter.add(1, Attributes.of(stringKey("type"), "OPEN"));
return basket;
}
public Basket checkoutBasket(Long id) {
var basket = basketRepository.get(id);
basketCounter.add(1, Attributes.of(stringKey("type"), "CLOSED"));
return basket;
}
}
26. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Métriques : observer une Jauge
@ApplicationScoped
public class BasketService {
private static final Meter meter = GlobalOpenTelemetry.getMeter("basket.metrics");
@PostConstruct
void businessMetrics() {
meter.gaugeBuilder("checkout_amount")
.setDescription("Compte le montant des paniers")
.setUnit("€")
.buildWithCallback(result -> {
result.record(getOpenBasketAmount(), Attributes.of(stringKey("type"), "OPEN"));
result.record(getClosedBasketAmount(), Attributes.of(stringKey("type"), "CLOSED"));
});
}
}
27. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Métriques : Exporter
# HELP basket_creation_total Compte les paniers créés
# TYPE basket_creation_total counter
basket_creation_total{type="OPEN",} 1.0
basket_creation_total{type="CLOSED",} 8.0
# HELP checkout_amount Compte le montant des paniers
# TYPE checkout_amount gauge
checkout_amount{type="OPEN",} 10.24
checkout_amount{type="CLOSED",} 805.63
28. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Traces : créer un span
@Path("/api/basket")
public class BasketResource {
static final Tracer tracer = GlobalOpenTelemetry.getTracer("basket.traces");
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response createBasket(@Context UriInfo uriInfo) {
var span = tracer.spanBuilder("BasketResource::createBasket").startSpan();
span.setAttribute("http.method", "POST");
span.setAttribute("http.url", uriInfo.getRequestUri().toString());
try (var scope = span.makeCurrent()) {
var basket = service.createBasket(Basket.randomBasket());
span.setAttribute("basket", basket.toString());
return Response.created().entity(basket).build();
} finally {
span.end();
}
}
}
29. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Trace : créer une trace enfant
@ApplicationScoped
public class BasketService {
private static final Tracer tracer = GlobalOpenTelemetry.getTracer("basket.traces");
// Appelé par BasketResource
public Basket createBasket(Basket basket) {
var span = tracer.spanBuilder("BasketService::createBasket").startSpan();
try (var scope = span.makeCurrent()) {
basket.state = "OPEN";
span.addEvent("Start PUT Basket to repository");
basketRepository.put(basket.id, basket);
span.addEvent("End PUT Basket to repository");
return basket;
} finally {
span.end();
}
}
}
34. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Spring Petclinic
agent
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Logs
Traces
NODE
EXPORTER
Métriques
application
Métriques
système
36. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
OpenTelemetry Collector - Cas d’usage…
otlp
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Bienvenue à TNT22, on est bien non ? lorem
Logs
Métriques
Crédits images : flaticon: Freepik, Good Ware
41. @charlesmariea @foxlegend Observabilité : de Zéro à OpenTelemetry
Il est temps de passer à l’action…
Métriques
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Bienvenue à TNT22, on est bien non ? Heureux de participer !
Logs
Traces
stable almost next
Crédits images : flaticon: freepik