<!-- .slide: style="text-align: left;"> -->
# Upgrade Loki<!-- .element: style="font-size:110%" -->
<span class="date">29/08/2022</span><span class="ticket">
[**PF-875**](https://jira.corp.cloudwatt.com/browse/PF-875)</span>

---
<!-- .slide: style="text-align: left; font-size:75%"> -->
# Releases<!-- .element: style="font-size:120%" -->
#### Version cible
**Loki**: <span style="color:red">v2.2.1</span> <span>→</span> <span style="color:#38AB09">v2.6.1</span>
---
<!-- .slide: style="text-align: left; font-size:75%"> -->
# Nouveautés<!-- .element: style="font-size:120%" -->
#### Les évolutions de Loki<!-- .element: style="font-size:100%" -->
- rétention des données ;
- suppression des logs à la volée ;
- WAL ;
- Loki Index Gateway ;
- Loki Ruler ;
- amélioration du parallélisme (Ingester sharding) ;
- ordre chronologique des logs non obligatoire ;
- Ingester unhealthy ;
- nouveau schéma de stockage des données ;
- améliorations LogQL ;
- rapport d'utilisation.
---
<!-- .slide: style="text-align: left;"> -->
# Rétention des données<!-- .element: style="font-size:110%" -->
- gérée par les composants Table Manager (chunk/index store ou boltdb-shipper store) ou Compactor (boltdb-shipper store). Compactor devient le choix par défaut ;<!-- .element: style="font-size:80%" -->
- amélioration de la finesse de rétention. Loki peut maintenant avoir une rétention spécifique en fonction des labels.<!-- .element: style="font-size:80%" -->
```
retention_period: 744h
retention_stream:
- selector: '{namespace="dev"}'
priority: 1
period: 24h
```
---
<!-- .slide: style="text-align: left;"> -->
# Suppression des logs à la volée<!-- .element: style="font-size:110%" -->
Le compactor expose un nouveau endpoint pour exécuter les requêtes de suppression des logs.<!-- .element: style="font-size:80%" -->
Deux modes :<!-- .element: style="font-size:80%" -->
- <span>`filter-only` : logs filtrés lors de requêtes sur le querier ;</span><!-- .element: style="font-size:80%" -->
- <span>`filter-and-delete` : logs filtrés lors de requêtes sur le querier + suppression sur le stockage.</span><!-- .element: style="font-size:80%" -->
```shell
curl -g -X POST \
'http://127.0.0.1:3100/loki/api/v1/delete?query=\
{foo="bar"}&start=1591616227&end=1591619692'
```
---
<!-- .slide: style="text-align: left;"> -->
# WAL<!-- .element: style="font-size:110%" -->
<span style="color:red">2.2.1 : encore expérimental<span style="color:red">
<span style="color:#38AB09">2.6.1 : stable et activé par défaut, temporairement désactivé pour caascad<span style="color:#38AB09">
Enregistre les logs entrants et les stocke dans des systèmes de fichiers locaux afin de garantir la persistance des données en cas de plantage du processus.
Ingester :
- statefulset + volume persistent ; <!-- .element: style="font-size:60%" -->
- désactivation du flush des data.<!-- .element: style="font-size:60%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Loki Index Gateway<!-- .element: style="font-size:110%" -->
<span style="color:#38AB09">Nouveau composant.<span style="color:#38AB09"><!-- .element: style="font-size:80%" -->
Les querier/ruler stocke les index des logs dans des volumes persistents. Il y a donc autant de volumes que de querier et ruler.<!-- .element: style="font-size:80%" -->
Index Gateway télécharge, synchronise ces index et les mets à disposition des Querier et Ruler.<!-- .element: style="font-size:80%" -->
Les avantages : <!-- .element: style="font-size:80%" -->
* économies de stockage ; <!-- .element: style="font-size:60%" -->
* évite le problème de noisy neighbor problems. <!-- .element: style="font-size:60%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Loki Ruler<!-- .element: style="font-size:110%" -->
Fonctionnalités :
- alerting rules
Les alertes sont envoyées à Alertmanager.
- <span style="color:#38AB09">recordings rules<span style="color:#38AB09"><!-- .element: style="font-size:90%" -->
Les métriques calculées à partir des logs peuvent être envoyées en Remote Write (à Prometheus, Thanos...).
---
<!-- .slide: style="text-align: left;"> -->
# Amélioration du parallélisme (Ingester sharding)<!-- .element: style="font-size:110%" -->
Amélioration du query frontend. Activée par défaut.<!-- .element: style="font-size:90%" -->
Query --><!-- .element: style="font-size:90%" -->
* s3<!-- .element: style="font-size:80%" -->
* <span style="color:#38AB09">ingester<span style="color:#38AB09"><!-- .element: style="font-size:70%" -->
Utilité : parallélisation des requêtes sur les logs récents.
Benchmark :
- de ~1GB/s à ~15 GB/s <!-- .element: style="font-size:80%" -->
- pour caascad sans query frontend : ~200MB/s <!-- .element: style="font-size:80%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Ordre chronologique des logs non obligatoire<!-- .element: style="font-size:110%" -->
Loki n'exige plus que les logs soient envoyés dans un ordre chronologique :
- plus d'erreur notamment avec les logs venant du Kubelet ;<!-- .element: style="font-size:80%" -->
- plus d'erreur avec les logs venant des pods.<!-- .element: style="font-size:80%" -->
Activé par défaut.<!-- .element: style="font-size:80%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Ingester unhealthy<!-- .element: style="font-size:110%" -->
Quand l'ingester ne parvient pas à envoyer un heartbeat vers l'un des pairs, il est considéré comme unhealthy (timeout set to 1m) et sorti du quorum.<!-- .element: style="font-size:70%" -->
<span>La nouvelle option `autoforget_unhealthy` (par défaut à false) permet de supprimer du ring un Ingester au statut unhealthy.</span><!-- .element: style="font-size:80%" -->
Actuellement, nous avons une alerte pour les ingesters unhealthy. Pour la résoudre, nous devons aller sur l'UI du distributor et cliquer sur le bouton Forget.<!-- .element: style="font-size:70%" -->

---
<!-- .slide: style="text-align: left;"> -->
# Nouveau schéma de stockage des données<!-- .element: style="font-size:110%" -->
<span style="color:#38AB09">Nouvelle version : v12.<span style="color:#38AB09">
La v12 utilise plus de "préfixes" pour stocker les chunks, ce qui permet plus de performances par rapport au stockage S3 tout en évitant les limites de débit par préfixe imposées par S3.
```
{
from: "2022-08-19"
index: {
period: "24h"
prefix: "loki_index_from_20220819_"
}
object_store: "aws"
schema: "v12"
store: "boltdb-shipper"
},
---
<!-- .slide: style="text-align: left;"> -->
# Améliorations LogQL<!-- .element: style="font-size:110%" -->
- nouveau parser pour obtenir des labels à partir des logs <!-- .element: style="font-size:90%" -->`pattern parser`<!-- .element: style="font-size:90%" -->
Plus simple et plus rapide que <!-- .element: style="font-size:80%" -->`regexp`:<!-- .element: style="font-size:80%" -->
```sql
{namespace="logging", container="nginx"} | pattern
"<ip> - - <_> \"<method> <uri> <_>\" <status> <size> <_> \"<agent>\" <_>"
```
- nouvelles fonctions :<!-- .element: style="font-size:90%" --> `group_left` et `group_right` ;
- amélioration des performances ;<!-- .element: style="font-size:90%" -->
- ...
---
<!-- .slide: style="text-align: left;"> -->
# Rapport d'utilisation<!-- .element: style="font-size:110%" -->
Envoie des stats (anonymes) à Grafana Lab.
Activé par défaut. <span style="color:red">Désactivé pour caascad.<span style="color:red">
```apacheconf
err="NoCredentialProviders: no valid providers in chain.
Deprecated.\n\tFor verbose messaging see aws.Config.CredentialsChainVerboseErrors"
```
---
<!-- .slide: style="text-align: left;"> -->
# Changement de valeur par défaut dans la configuration<!-- .element: style="font-size:110%" -->


---
<!-- .slide: style="text-align: left;"> -->
# La migration de 2.2.1 vers 2.6.1<!-- .element: style="font-size:110%" -->
Une migration effectuée en trois étapes :
1/ mise à jour de l'image de base de Loki en 2.6.1 et adaptation de la nouvelle configuration par défaut ;
2/ passage au schéma de stockage v12 ;
3/ suppression de la métrique custom et de l'alerte pour les logs mal ordonnés.
Comment s'est passée la migration ?
OK. RAS.
---
<!-- .slide: style="text-align: left;"> -->
# Logs d'erreur Querier<!-- .element: style="font-size:110%" -->
:warning: Des erreurs `context canceled` apparaissent régulièrement dans les logs du composant querier.
```apacheconf
level=error caller=batch.go:720 ... msg="error fetching chunks"
err="context canceled"
```
```apacheconf
level=error caller=batch.go:720 msg="error fetching chunks"
err="failed to get s3 object: RequestCanceled: request context canceled\ncaused by: context canceled"
```
---
<!-- .slide: style="text-align: left;"> -->
# Logs d'erreur Querier<!-- .element: style="font-size:110%" -->
Remarques :
- erreurs plus courantes avec la nouvelle version sur staging, mais présentes aussi en production ; <!-- .element: style="font-size:80%" -->
- pour reproduire le problème, il suffit de lancer une requête conséquente quelque soit la limite (exemple : récupération des logs nginx ingress sur plusieurs heures) ; <!-- .element: style="font-size:80%" -->
- malgré les erreurs dans les logs du querier, les logs sont bien tous récupérés donc le service est quand même rendu.<!-- .element: style="font-size:80%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Tâches potentielles à faire suite au ticket<!-- .element: style="font-size:110%" -->
- utiliser la chart upstream au lieu de la chart custom (prérequis pour le reste)<!-- .element: style="font-size:80%" --> ;
- modifier la gestion de la rétention : table-manager -> compactor ;<!-- .element: style="font-size:80%" -->
- déployer ingester avec un volume persistent et utiliser le WAL ;<!-- .element: style="font-size:80%" -->
- refaire l'étude query frontend ;<!-- .element: style="font-size:80%" -->
- déployer le composant index gateway -> utile notamment si on déploie le ruler ;<!-- .element: style="font-size:80%" -->
- tester puis décider ou pas de déployer l'option Ingester Unhealthy. <!-- .element: style="font-size:80%" -->
<style type="text/css">
p {
font-size: smaller;
}
.reveal ul ul li {
font-size: smaller;
}
.reveal section {
text-align: left;
}
.reveal h4 {
color: coral;
margin-top: 1em;
}
.reveal h1 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
}
.reveal code {
color: aquamarine;
font-size: smaller;
}
</style>
---
<!-- .slide: style="text-align: left;"> -->
# Annexes<!-- .element: style="font-size:110%" -->
---
<!-- .slide: style="text-align: left;"> -->
# Les Release Notes de Loki<!-- .element: style="font-size:90%" -->
Si vous souhaitez en apprendre davantage sur les évolutions apportées par ces nouvelles versions de Loki :
* 2.3 : https://grafana.com/docs/loki/latest/release-notes/v2-3/<!-- .element: style="font-size:70%" -->
* 2.4 : https://grafana.com/docs/loki/latest/release-notes/v2-4/<!-- .element: style="font-size:70%" -->
* 2.5 : https://grafana.com/docs/loki/latest/release-notes/v2-5/<!-- .element: style="font-size:70%" -->
* 2.6 : https://grafana.com/docs/loki/latest/release-notes/v2-6/<!-- .element: style="font-size:70%" -->