J’ai la mauvaise surprise de voir mon conteneur loki ne pas redémarrer après avoir forcé un redéploiement sur mon environnement de test. La log obtenue par docker logs donnait:
level=info ts=2020-07-30T11:57:00.873322167Z caller=main.go:102 msg="Starting Loki" version="(version=master-2a596a7, branch=master, revision=2a596a77)"
level=info ts=2020-07-30T11:57:00.873540532Z caller=server.go:194 http=[::]:3100 grpc=[::]:9095 msg="server listening on addresses"
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1bcca3b]
goroutine 1 [running]:
github.com/cortexproject/cortex/pkg/util/runtimeconfig.(*Manager).GetConfig(0x0, 0x0, 0x0)
/src/loki/vendor/github.com/cortexproject/cortex/pkg/util/runtimeconfig/manager.go:206 +0x3b
github.com/grafana/loki/pkg/loki.tenantLimitsFromRuntimeConfig.func1(0x0, 0x0, 0xc000d41330)
Mon docker-compose.yml avait le malheur d’utiliser la version de l’image loki taguée par latest. J’aime bien en phase de développement avoir la dernière version puis de la figer à un moment donné bien -sûr. Après être revenu à des versions précédentes de loki, je me suis aperçu que la 1.4.0 et la 1.5.0 n’avaitent pas de problème de démarrage. La version latest était-elle buggué ? Cela aurait été étrange car un plantage au démarrage aurait dû être vu par tout le monde.
En allant voir les tag sur dockerhub le projet loki utilise une nomenclature particulière. Ainsi c’est la version master qui représente la dernière version qui marche. Effectivement en utilisant loki:master j’ai un loki qui se lance et on voit dans la log qu’il ne correspond pas à la même version de la branche master que celle utilisé par le tag latest.
level=info ts=2020-07-30T12:00:56.557308462Z caller=main.go:102 msg="Starting Loki" version="(version=master-7eaaab6, branch=master, revision=7eaaab60)"
level=info ts=2020-07-30T12:00:56.580151883Z caller=server.go:194 http=[::]:3100 grpc=[::]:9095 msg="server listening on addresses"
level=info ts=2020-07-30T12:00:56.58097458Z caller=worker.go:58 msg="no address specified, not starting worker"
level=info ts=2020-07-30T12:00:56.581571028Z caller=module_service.go:58 msg=initialising module=store
level=info ts=2020-07-30T12:00:56.58316204Z caller=module_service.go:58 msg=initialising module=server
level=info ts=2020-07-30T12:00:56.583249542Z caller=module_service.go:58 msg=initialising module=table-manager
level=info ts=2020-07-30T12:00:56.583345814Z caller=table_manager.go:333 msg="synching tables" expected_tables=2
level=info ts=2020-07-30T12:00:56.583420152Z caller=table_manager.go:485 msg="creating table" table=index_2638
level=info ts=2020-07-30T12:00:56.583485244Z caller=table_manager.go:485 msg="creating table" table=index_2639
level=info ts=2020-07-30T12:00:56.583545947Z caller=module_service.go:58 msg=initialising module=memberlist-kv
level=info ts=2020-07-30T12:00:56.583584211Z caller=module_service.go:58 msg=initialising module=ring
level=info ts=2020-07-30T12:00:56.583627147Z caller=client.go:228 msg="value is nil" key=collectors/ring index=1
level=info ts=2020-07-30T12:00:56.58367197Z caller=module_service.go:58 msg=initialising module=ingester
level=info ts=2020-07-30T12:00:56.583717688Z caller=lifecycler.go:491 msg="not loading tokens from file, tokens file path is empty"
level=info ts=2020-07-30T12:00:56.58376097Z caller=lifecycler.go:515 msg="instance not found in ring, adding with no tokens" ring=ingester
level=info ts=2020-07-30T12:00:56.5838539Z caller=lifecycler.go:367 msg="auto-joining cluster after timeout" ring=ingester
level=info ts=2020-07-30T12:00:56.583966192Z caller=module_service.go:58 msg=initialising module=distributor
level=info ts=2020-07-30T12:00:56.584061482Z caller=loki.go:201 msg="Loki started"
Voilà un problème de moins, vu en environnement staging et poussé en production en 2 clics 3 mouvements ! Le problème existait peut-être depuis longtemps, je m’en vais donc de ce pas ajouter un build quotidien que je préconise pour tout projet ayant des dépendances non fixée comme les snapshot en maven ou les latest ou master en docker !