Observabilidade e Monitoramento
Tags: sre, observability, monitoring
Published: 2023-06-20 11:54:17

**Revisado por**: [Fernanda Santos Barros](https://www.linkedin.com/in/fernandabarros98/)

Resolver conflitos de serviços entre ambientes distintos, escalar sistemas rapidamente e ter sistemas menos acoplados são alguns dos benefícios de se adotar uma arquitetura de sistemas distribuídos. Tais sistemas possuem uma alta complexidade, necessitando de um esforço adicional para manter a sua arquitetura.

Em sistemas distribuídos, a questão mais complexa em termos de depuração não é compreender o código em execução, mas sim identificar onde o código com problema está localizado.   
 
Pensando nisso, como as equipes poderiam garantir o máximo de confiabilidade desses sistemas?

Como seria possível identificar rapidamente qual sistema está causando falha ou lentidão no processamento das requisições?

Como os times poderiam melhorar esses sistemas em um ambiente complexo?

Sistemas distribuídos podem conter inúmeros serviços em execução, assim, é primordial garantir a confiabilidade e a segurança de todos os recursos.

Esse formato de sistema possui algumas características importantes, são elas:
 
**Compartilhamento de recursos**: conforme o ambiente de execução do microsserviço, pode ocorrer o compartilhamento de recursos. O ambiente Kubernetes pode ser um exemplo, nele ocorre o compartilhamento de CPU, memória, disco, rede e outros.

**Processo simultâneo**: um cluster é composto por diversos hosts; dessa forma um mesmo microsserviço pode existir em diversos hosts ao mesmo tempo.

**Escalonamento**: um microsserviço, ou recurso computacional, deve ser capaz de aumentar ou diminuir a sua capacidade conforme a utilização.

**Resiliência**: microsserviços são projetados para serem tolerantes à falha.

Em suma, devido à quantidade de componentes, a complexidade do ambiente e a imprevisibilidade, torna-se evidente a necessidade de utilizar os conceitos e as ferramentas que a engenharia de confiabilidade nos oferece. Sendo assim, é
importante destacar dois conceitos: observabilidade e monitoramento.

### O que é observabilidade?

> Observabilidade é a capacidade de achar repostas para perguntas que ainda não temos: 
by [Juraci Paixão](https://twitter.com/jpkrohling)

A observabilidade nada mais é do que a capacidade de compreender o estado interno de um sistema com base em seu comportamento.
Para um sistema ser considerado minimamente observável é necessário cumprir alguns requisitos, sendo eles: permitir a coleta de logs, métricas e traces distribuídos.

Observabilidade é a capacidade de preservar o máximo de contexto possível em torno de qualquer solicitação, permitindo a reconstrução do ambiente e das circunstâncias que provocaram um novo ponto de falha.

Conforme essa definição, alguns pontos que podem surgir em um sistema observável: 

- Por qual motivo esse(s) cliente(s) apresenta(am) uma alta latência nas requisições do sistema X?
- Quais são os serviços envolvidos em uma transação específica?
- Quais são os impactos de uma alteração no ecossistema de microserviço? 

Os engenheiros que praticam a observabilidade conseguem questionar o sistema fazendo perguntas exploratórias, usando as respostas para conduzir a outras investigações. 

Essas simples perguntas auxiliam no processo de investigação da causa raiz de possíveis problemas e permitem a obtenção de insights sobre o comportamento dos sistemas. Tais questionamentos podem ser realizados em diferentes estágios do ciclo de vida do sistema, de acordo com o contexto da situação enfrentada.

### O que é o monitoramento?

> Monitoramento é a prática de obter resposta rápida para perguntas frequentes.
by [Juraci Paixão](https://twitter.com/jpkrohling)

O monitoramento se concentra em coletar e analisar dados de telemetria, visando garantir o desempenho e a disponibilidade do sistema.

O monitoramento tradicional é totalmente reativo, e se concentra em métrica, alerta e dashboards. Dashboard repleta de gráficos, e talvez não sabemos o que todos os gráficos realmente dizem. 

Seguindo esse conceito, um sistema monitorado é capaz de produzir respostas para várias perguntas previamente conhecidas. Dentre elas, temos:

- Como estão os níveis de consumo de recursos computacional (CPU, memória, disco, rede)?
- Quais são as taxas de erros da última hora?
- Qual é o tempo médio das requisições?
- Existe algum alerta ativo? 

As respostas para esses questionamentos nos permitem determinar, em tempo real, qual o estado do sistema e como está sendo o seu desempenho. Essas informações são cruciais em análises de causa raiz e na definição de ações corretivas.

### Conclusão

O monitoramento é para os desconhecidos conhecidos, a observabilidade é para os desconhecidos. 

Monitoramento e observabilidade são conceitos que se complementam para garantir um sistema confiável. O primeiro nos fornece uma abordagem mais reativa, com base em números concretos, enquanto o outro nos permite realizar uma análise mais profunda e estratégica do sistema e do negócio.
Com essa união, torna-se possível que as equipes de operações e engenharia atuem com mais rapidez e eficiência nas inconsistências que ocorrem durante a utilização de sistemas distribuídos. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrq996y71zwtxy5vakcn.png)

### Referências:

- [Qual é a diferença entre um sistema centralizado e um distribuído?](https://www.atlassian.com/br/microservices/microservices-architecture/distributed-architecture)
- [eBook Free - Monitoring - Google SRE Book](https://sre.google/workbook/monitoring/)
- [eBook Free - Distributed Systems Observability](https://unlimited.humio.com/rs/756-LMY-106/images/Distributed-Systems-Observability-eBook.pdf)