Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/adenilson365/devopslabs02-observabilidade
Prática de observabilidade, buscando atingir uma stack completa com os 3 pilares: Logs, traces e métricas, usando Opentelemetry, Prometheus, Grafana dahsboard, Grafana Tempo, Grafana Loki
https://github.com/adenilson365/devopslabs02-observabilidade
docker gcp-sql google-cloud-platform grafana grafana-dashboard grafana-loki grafana-tempo kubernetes lets-encrypt linux opentelemetry opentelemetry-collector postgresql shell-script
Last synced: 18 days ago
JSON representation
Prática de observabilidade, buscando atingir uma stack completa com os 3 pilares: Logs, traces e métricas, usando Opentelemetry, Prometheus, Grafana dahsboard, Grafana Tempo, Grafana Loki
- Host: GitHub
- URL: https://github.com/adenilson365/devopslabs02-observabilidade
- Owner: Adenilson365
- Created: 2024-12-30T21:39:01.000Z (25 days ago)
- Default Branch: main
- Last Pushed: 2025-01-06T11:01:21.000Z (19 days ago)
- Last Synced: 2025-01-06T12:19:26.509Z (19 days ago)
- Topics: docker, gcp-sql, google-cloud-platform, grafana, grafana-dashboard, grafana-loki, grafana-tempo, kubernetes, lets-encrypt, linux, opentelemetry, opentelemetry-collector, postgresql, shell-script
- Language: Shell
- Homepage: https://www.linkedin.com/in/adenilson-konzelmann/
- Size: 103 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Objetivos
- Criar uma stack completa de observabilidade.
- Atingir os 3 pilares da observabilidade: Logs, métricas e tracing.
- Os dados coletados precisam ter persistência ( disco rígido ou buckets).
- Todo o processo deve estar documentado e ser replicável.
- Dados sensíveis não devem estar no repositório, mas o readme deve indicar sua configuração.
- Instalação via [shellscript](#instalação)### Stack Inicial de observabilidade:
![Prometheus](https://img.shields.io/badge/Prometheus-E6522C?style=for-the-badge&logo=Prometheus&logoColor=white) ![Grafana](https://img.shields.io/badge/grafana-%23F46800.svg?style=for-the-badge&logo=grafana&logoColor=white) ![Grafana](https://img.shields.io/badge/grafana%20tempo-%23F46800.svg?style=for-the-badge&logo=grafana&logoColor=white) ![Grafana LOKI](https://img.shields.io/badge/grafana%20loki-%23f4800.svg?style=for-the-badge&logo=grafana&logoColor=white) ![](https://img.shields.io/badge/Opentelemetry-0078D7?style=for-the-badge&logo=azure-devops&logoColor=white)### Diagrama da stack
![Diagrama Stack Observabilidade](./docs-assets/diagrama-stack-obs.png)### Repositórios Relacionados:
- Abaixo aplicação usada como base para esse laboratório, objetivo é aplicar conceitos de observabilidade e não programação em sí, exceto pela instrumentalização da aplicação.
- [Terraform](https://github.com/Adenilson365/devopslabs01-iac)
- [Frontend](https://github.com/Adenilson365/devopslabs01-frontend)
- [Backend - Catalogo](https://github.com/Adenilson365/devopslabs01-serviceMesh)
- [Backend - Api de Imagens](https://github.com/Adenilson365/devopslabs01-api-images)### Documentação
- [openapm-landscape](https://openapm.io/landscape)
- [Grafana loki]
- [Opentelemetry](https://opentelemetry.io/)
- [Opentelemetry k8s](https://opentelemetry.io/docs/kubernetes)
- [Grafana Tempo](https://grafana.com/oss/tempo/)## Instalação:
- execute o script **install.sh**
- Para GCP - Execute o terraform conforme este [repositório](https://github.com/Adenilson365/devopslabs01-iac) ou rode em k8s local em ambos siga o próximo passo do diretório config.
- Nesse momento é necessário liberar no GCP SQL um acesso para a rede do GKE, quando estiver via Terraform essa observação será apagada.
- É necessário criar o usuário para a aplicação usar, com mesmo nome e senha do secret do catalogo, pode fazer isso via console GCP.
- Crie os arquivos segundo o readme do diretório config
- DNS: Precisa apontar seu registro A api e obs para o ip do loadbalancing provisionado pelo nginx, ou configure como preferir.
- DNS e Liberação SQL são as configurações manuais presentes no momento, o restante está via script shell.### Instalação Grafana Loki
[Repositório Artifacthub](https://artifacthub.io/packages/helm/grafana/loki)
```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki-stack -f ./grafana-lokki/values.yaml --version 2.10.2 -n obs
```
- Instala a versão monolito com todos os componentes do grafana em um único deploy.
- Por padrão instala a depêndencia promtail para coleta de logs- Versão [distributed](https://artifacthub.io/packages/helm/grafana/loki-distributed)
- Mesmo formato de instalação, sendo necessário instalar a parte o [promtail](https://artifacthub.io/packages/helm/grafana/promtail)
- Configurar o values.yaml do promtail para enviar logs ao loki
```YAML
config:
clients:
- url: http://loki-dis-loki-distributed-gateway/loki/api/v1/push# A url deve representar o dns do gateway do loki http://./loki/api/v1/push
# se no mesmo namespace http:///loki/api/v1/push
```- Após instalar necessário adicionar a fonte de dados ao Grafana
### Problemas de instalação:
[Discussão](https://community.grafana.com/t/loki-helm-documentation-isnt-working-for-me/122777/5)
[Issue que continha solução](https://github.com/grafana/loki/issues/12711)### Instalação stack Prometheus Grafana
[Repositório Artifacthub](https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack)
```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack --version 67.5.0 --namespace obs --create-namespace -f ./kube-prom-stak/prom-values.yaml --wait
```## Grafana Tempo ( Tracing )
###
### Arquitetura Tempo
![Grafana Tempo](./docs-assets/arquitetura-tempo.png)
![Documentação](https://grafana.com/docs/tempo/latest/setup/)
![Helm chart](https://github.com/grafana/helm-charts/tree/main/charts/tempo)```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm install tempo grafana/tempo -n obs
```### Documentação
[Opentelemetry como pipeline](https://grafana.com/blog/2021/04/13/how-to-send-traces-to-grafana-clouds-tempo-service-with-opentelemetry-collector/)### Configuração OpenTelemetry-collector
###
- Para **teste local** implante no docker compose essa imagem: [grafana/otel-lgtm](https://hub.docker.com/r/grafana/otel-lgtm)
- Essa imagem contém a stack completa (OpenTelemetry, Loki, Prometheus, Grafana, Tempo)
- Precisa expor no compose as portas 4317 (opentelemetry) e 3000 (Grafana dashboard)
- Não é necessário nenhum tipo de configuração apenas apontar a instrumentação para a porta 4317.
```YAML
#Compose da stack otel-lgtm
otel:
image: grafana/otel-lgtm
ports:
- 4317:4317 # Opentelemetry gRpc
- 3000:3000 # Grafana Dashboard
```### Configurar no k8s
###- [Helm Opentelemetry-collector](https://artifacthub.io/packages/helm/opentelemetry-helm/opentelemetry-collector)
```shell
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-chartshelm upgrade --install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
--set mode=deployment --set image.repository="otel/opentelemetry-collector-k8s" --set command.name="otelcol-k8s" \
-f grafana-lokki/open-collector.yaml --version 0.111.0 -n obs
```- Custom Values:
```YAMLconfig:
exporters:
debug: {}
otlp:
endpoint: http://tempo.obs.svc.cluster.local:4317 # Aponta para o serviço do grafana tempo
tls:
insecure: true
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317 # Para receber de qualquer endereço nessa porta
http:
endpoint: 0.0.0.0:4318
service:
telemetry:
metrics:
address: ${env:MY_POD_IP}:8888
extensions:
- health_check
pipelines:
logs:
exporters:
- otlp
processors:
- memory_limiter
- batch
receivers:
- otlp
metrics:
exporters:
- otlp
processors:
- memory_limiter
- batch
receivers:
- otlp
- prometheus
traces:
exporters:
- otlp
processors:
- memory_limiter
- batch
receivers:
- otlp
```- A aplicação python precisa receber as variáveis de ambiente com as informações do collector
```YAML
apiVersion: v1
kind: ConfigMap
metadata:
name:
namespace:
data:
OTEL_SERVICE_NAME:
OTEL_EXPORTER_OTLP_ENDPOINT: http://.obs.svc.cluster.local:4317
OTEL_EXPORTER_OTLP_INSECURE: 'true'
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED: 'true'
OTEL_TRACES_EXPORTER: otlp
OTEL_METRICS_EXPORTER: otlp
OTEL_LOGS_EXPORTER: otlp```
### Etapas
- [x] Instalar a stack completa via helm
- [x] Conectar opentelemetry ao tempo
- [x] Instalar stack lokki + promtail
- [x] Trocar Promtail pelo opentelemetry log
- [ ] Implementar alertas via prometheus
- [x] Integrar prometheus, opentelemetry, tempo para gerar grafico de malha
- [ ] Implementar volume persistente para logs e traces