Loki - coletando logs usando a abordagem Prometheus

Saudação, Khabrovites! Antecipando o início de um novo conjunto para o curso de práticas e ferramentas do DevOps, preparamos para você uma tradução de material interessante.





Este artigo é uma breve introdução ao Loki. O projeto Loki é suportado pela Grafana e visa coletar centralmente logs (de servidores ou contêineres).

A principal fonte de inspiração para Loki foi Prometheus, com a idéia de aplicar suas abordagens de gerenciamento de logs:

  • uso de etiquetas (etiquetas) para armazenamento de dados
  • baixo consumo de recursos

Voltaremos aos princípios de Prometeu e daremos alguns exemplos de seu uso no contexto do Kubernetes.

Algumas palavras sobre Prometeu


Para entender completamente como Loki funciona, é importante dar um passo atrás e relembrar um pouco de Prometheus.

Uma das características distintivas do Prometheus é a extração de métricas dos pontos de coleta (por meio de exportadores) e armazená-las no TSDB (Time Series Data Base, banco de dados de séries temporais) com a adição de metadados na forma de rótulos.

Por que isso é necessário?


Recentemente, o Prometheus se tornou o padrão de fato no mundo dos contêineres e do Kubernetes: sua instalação é muito simples, e o cluster Kubernetes inicialmente possui um ponto de extremidade para o Prometheus. O Prometheus também pode recuperar métricas de aplicativos implantados em um contêiner, mantendo algumas tags. Portanto, é muito fácil implementar aplicativos de monitoramento.

Infelizmente, ainda não existe uma solução pronta para gerenciar logs e você deve encontrar uma solução para si mesmo:

  • serviço de nuvem gerenciada para centralizar logs (AWS, Azure ou Google)
  • monitoramento como um serviço de monitoramento de serviço (por exemplo, Datadog)
  • criando seu próprio serviço de coleta de logs.

Para a terceira opção, tradicionalmente usei o Elasticsearch, apesar de nem sempre estar feliz com ele (especialmente sua gravidade e complexidade das configurações).

O Loki foi projetado para simplificar a implementação de acordo com os seguintes princípios:

  • seja fácil começar
  • consumir poucos recursos
  • trabalhe independentemente, sem qualquer manutenção especial
  • complementar Prometeu para ajudar a investigar bugs

No entanto, essa simplicidade é alcançada através de alguns compromissos. Uma delas é não indexar o conteúdo. Portanto, a pesquisa de texto não é muito eficaz ou rica e não permite estatísticas sobre o conteúdo do texto. Mas como Loki quer ser o equivalente a grep e complementar o Prometeu, isso não é uma falha.

Investigação de incidentes


Para entender melhor por que o Loki não precisa de indexação, voltemos ao método de investigação de incidentes usado pelos desenvolvedores do Loki:


1 Alerta → 2 Painel → 3 Consulta Adhoc → 4 Agregação de Log → 5 Rastreamento Distribuído → 6 Correções!
(1 Aviso → 2 Painéis → 3 Consulta Adhoc → 4 Agregação de log → 5 Rastreamento distribuído → 6 Corrigindo!)


A idéia é que recebamos algum alerta (Notificação de folga, SMS etc.) e depois:

  • Grafana
  • (, Prometheus)
  • (, Elasticsearch)
  • , (Jaeger, Zipkin .)
  • , , .

Aqui, no caso da pilha Grafana + Prometheus + Elasticsearch + Zipkin, você precisará usar quatro ferramentas diferentes. Para reduzir o tempo, seria bom poder executar todas essas etapas com uma ferramenta: Grafana. Vale ressaltar que essa abordagem de pesquisa foi implementada no Grafana desde a versão 6. Dessa forma, é possível acessar os dados do Prometheus diretamente do Grafana.


Tela do Explorer dividida entre Prometheus e Loki

Nesta tela, é possível visualizar os logs do Loki relacionados às métricas do Prometheus usando o conceito de tela dividida. A partir da versão 6.5, o Grafana permite processar o ID de rastreamento nas entradas de log do Loki para seguir os links para suas ferramentas de rastreamento distribuído favoritas (Jaeger).

Loki Local Test


A maneira mais fácil de testar o Loki localmente é usar o docker-compose. O arquivo docker-compose está no repositório Loki. Você pode obter o repositório usando o seguinte comando git:

$ git clone https://github.com/grafana/loki.git


Então você precisa ir para o diretório de produção:

$ cd production

Depois disso, você pode obter a versão mais recente das imagens do Docker:

$ docker-compose pull

Por fim, a pilha Loki é iniciada com o seguinte comando:

$ docker-compose up

Arquitetura Loki


Aqui está um pequeno diagrama com a arquitetura Loki:


Princípios da arquitetura Loki O

web client lança aplicativos no servidor, o Promtail coleta logs e os envia para o Loki, o web client também envia metadados para o Loki. Loki agrega tudo e o transfere para o Grafana.
Loki está pronto e funcionando. Para visualizar os componentes disponíveis, execute o seguinte comando:

$ docker ps


No caso de um Docker instalado recentemente, o comando deve retornar o seguinte resultado:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Vemos os seguintes componentes:

  • Promtail: agente para centralizar logs
  • Grafana: Uma famosa ferramenta de painel
  • Loki: um daemon de centralização de dados

Na estrutura de uma infraestrutura clássica (por exemplo, com base em máquinas virtuais), um agente Promtail deve ser implantado em cada máquina. Grafana e Loki podem ser instalados na mesma máquina.

Implantação do Kubernetes


A instalação dos componentes Loki no Kubernetes será a seguinte:

  • daemonSet para implementar o agente Promtail em cada máquina em um cluster de servidores
  • Implantação Loki
  • e, finalmente, a implantação do Grafana.

Felizmente, o Loki está disponível como um pacote Helm, facilitando a implantação.

Instalação via Helm


O leme já deve estar instalado. Pode ser baixado do repositório GitHub do projeto. Ele é instalado descompactando o arquivo que corresponde à sua arquitetura e adicionando o leme ao $PATH.

Nota: A versão 3.0.0 do Helm foi lançada recentemente. Como houve muitas mudanças, recomenda-se que o leitor espere um pouco antes de usá-lo primeiro .


Adicionando uma fonte para o Helm


O primeiro passo é adicionar o repositório "loki" com o seguinte comando:

$ helm add loki https://grafana.imtqy.com/loki/charts

Depois disso, você pode procurar por pacotes denominados "loki":

$ helm search loki

Resultado:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Esses pacotes têm os seguintes recursos:

  • O pacote loki / loki corresponde apenas ao servidor Loki
  • o pacote loki / fluent-bit permite implantar o DaemonSet usando o fluent-bin para coletar logs em vez do Promtail
  • O pacote loki / promtail contém arquivos de log do agente de coleção
  • O pacote loki / loki-stack permite implantar imediatamente o Loki junto com o Promtail.

Instalação Loki


Para implantar o Loki no Kubernetes, execute o seguinte comando no espaço de nome "monitoramento":

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Para salvar em disco, adicione a opção --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack \
              --namespace monitoring \
              --set loki.persistence.enabled=true

Nota: se você deseja implantar o Grafana ao mesmo tempo, adicione o parâmetro--set grafana.enabled = true

Ao executar este comando, você deve obter a seguinte saída:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Observando o status das lareiras no espaço de nome "monitoramento", veremos que tudo está expandido:

$ kubectl -n monitoring get pods -l release=loki

Resultado:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Todos os pods estão em execução. Agora é hora de fazer alguns testes!

Conectar ao Grafana


Para se conectar ao Grafana no Kubernetes, é necessário abrir um túnel na parte inferior. A seguir, está o comando para abrir a porta 3000 para a lareira da Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Outro ponto importante é a necessidade de recuperar a senha de administrador do Grafana. A senha é mantida loki-grafanaem segredo em um campo .data.admin-userno formato base64.

Para restaurá-lo, você deve executar o seguinte comando:

$ kubectl -n monitoring get secret loki-grafana \
 --template '{{index .data "admin-password" | base64decode}}'; echo

Use esta senha com a conta de administrador padrão (admin).

Definindo uma fonte de dados Loki no Grafana


Antes de tudo, verifique se a fonte de dados Loki (Configuração / Fonte de Dados) foi criada.
Aqui está um exemplo:


Exemplo de configuração de uma fonte de dados para o Loki

Ao clicar em "Teste", você pode verificar a conexão com o Loki.

Fazendo pedidos para Loki


Agora vá para a seção "Explorar" da Grafana. Ao receber logs de contêineres, o Loki adiciona metadados do Kubernetes. Assim, torna-se possível visualizar os logs de um contêiner específico.

: Por exemplo, a seguinte consulta de consulta pode ser usada para selecionar os logs do contêiner {container_name = "promtail"}.
Além disso, certifique-se de selecionar sua fonte de dados Loki aqui.

Essa solicitação retornará a atividade dos contêineres da seguinte maneira:


O resultado da solicitação na Grafana

Adicionando ao painel


A partir do Grafana 6.4, você pode colocar informações sobre os logs diretamente no painel. Depois disso, o usuário poderá alternar rapidamente entre o número de solicitações em seu site para os rastreamentos do aplicativo.

A seguir, é apresentado um exemplo de painel que implementa essa interação: Um


exemplo de painel com métricas do Prometheus e logs do Loki

Future loki


Comecei a usar o Loki em maio / junho com a versão 0.1. Hoje a versão 1 já foi lançada, e até 1.1 e 1.2.

É certo que a versão 0.1 não era estável o suficiente. Mas 0,3 já mostrava sinais reais de maturidade, e as próximas versões (0,4 e 1,0) apenas reforçavam essa impressão.

Depois da 1.0.0, ninguém pode ter desculpas para não usar esta ferramenta maravilhosa.

Outras melhorias não devem preocupar Loki, mas sua integração com o excelente Grafana. De fato, o Grafana 6.4 já possui boa integração com os painéis.

O Grafana 6.5, lançado recentemente, aprimora ainda mais essa integração, reconhecendo automaticamente o conteúdo dos logs no formato JSON.

O vídeo a seguir mostra um pequeno exemplo desse mecanismo:


Usando seqüências de caracteres Loki exibidas no Grafana

Torna-se possível usar um dos campos JSON, por exemplo, para:

  • links de ferramentas externas
  • filtrando o conteúdo do log

Por exemplo, você pode clicar em traceId para acessar Zipkin ou Jaeger.

Tradicionalmente, aguardamos seus comentários e convidamos você para um webinar aberto , onde falaremos sobre como o setor de DevOps se desenvolveu durante 2019 e discutiremos possíveis caminhos de desenvolvimento para 2020.

Source: https://habr.com/ru/post/undefined/


All Articles