{"id":23967225,"url":"https://github.com/adenilson365/devopslabs02-observabilidade","last_synced_at":"2026-04-10T00:07:06.858Z","repository":{"id":271225000,"uuid":"910278957","full_name":"Adenilson365/devopslabs02-observabilidade","owner":"Adenilson365","description":"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","archived":false,"fork":false,"pushed_at":"2025-01-06T11:01:21.000Z","size":105,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-06T12:19:26.509Z","etag":null,"topics":["docker","gcp-sql","google-cloud-platform","grafana","grafana-dashboard","grafana-loki","grafana-tempo","kubernetes","lets-encrypt","linux","opentelemetry","opentelemetry-collector","postgresql","shell-script"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/adenilson-konzelmann/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Adenilson365.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-30T21:39:01.000Z","updated_at":"2025-01-06T11:01:24.000Z","dependencies_parsed_at":"2025-01-06T12:19:28.944Z","dependency_job_id":"9aaee0e8-90b3-43d2-baae-90ae27a7fdf5","html_url":"https://github.com/Adenilson365/devopslabs02-observabilidade","commit_stats":null,"previous_names":["adenilson365/devopslabs02-observabilidade"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Adenilson365%2Fdevopslabs02-observabilidade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Adenilson365%2Fdevopslabs02-observabilidade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Adenilson365%2Fdevopslabs02-observabilidade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Adenilson365%2Fdevopslabs02-observabilidade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Adenilson365","download_url":"https://codeload.github.com/Adenilson365/devopslabs02-observabilidade/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240491810,"owners_count":19809977,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","gcp-sql","google-cloud-platform","grafana","grafana-dashboard","grafana-loki","grafana-tempo","kubernetes","lets-encrypt","linux","opentelemetry","opentelemetry-collector","postgresql","shell-script"],"created_at":"2025-01-06T22:34:45.845Z","updated_at":"2025-10-15T00:13:36.683Z","avatar_url":"https://github.com/Adenilson365.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Projeto de observabilidade ( logs-traces-métricas).\n- Fase: Em revisão de documentação\n\n## Objetivos \n\n- Criar uma stack completa de observabilidade.\n- Atingir os 3 pilares da observabilidade: Logs, métricas e tracing.\n- Ter envio de alertas baseados em métricas\n- Os dados coletados precisam ter persistência ( disco rígido ou  buckets). \n- Todo o processo deve estar documentado e ser replicável.\n   - Dados sensíveis não devem estar no repositório, mas o readme deve indicar sua configuração. \n###\n- [Instalção no kubernetes via shellscript](#instalação)\n- [Acompahe as etapas](#etapas)\n### Stack de observabilidade utilizada: \n![Prometheus](https://img.shields.io/badge/Prometheus-E6522C?style=for-the-badge\u0026logo=Prometheus\u0026logoColor=white) ![Grafana](https://img.shields.io/badge/grafana-%23F46800.svg?style=for-the-badge\u0026logo=grafana\u0026logoColor=white)  ![Grafana](https://img.shields.io/badge/grafana%20tempo-%23F46800.svg?style=for-the-badge\u0026logo=grafana\u0026logoColor=white) ![Grafana LOKI](https://img.shields.io/badge/grafana%20loki-%23f4800.svg?style=for-the-badge\u0026logo=grafana\u0026logoColor=white) ![](https://img.shields.io/badge/Opentelemetry-0078D7?style=for-the-badge\u0026logo=azure-devops\u0026logoColor=white)\n\n### Diagrama da stack\n![Diagrama Stack Observabilidade](./docs-assets/diagrama-stack-obs.png)\n\n### Documentação da stack\n- [OpenTelemetry SDK](https://opentelemetry.io/) - Para instrumentar a aplicação\n- [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) - Coletar métricas, traces, logs e enviar ao backend correspondente.\n- [Prometheus](https://prometheus.io/docs) - Exporter de métricas kubernetes e backend de métricas\n- [Grafana Loki](https://grafana.com/docs/loki/latest/) - Backend de logs\n- [Grafana Tempo](https://grafana.com/docs/tempo/latest/) - Backend de tracing\n- [Grafana](https://grafana.com/docs/grafana/latest/) - Dashboards\n- [Openapm - Diagrama e Recursos](https://openapm.io/landscape)\n\n\n### Repositórios Relacionados:\n- Abaixo aplicação usada como base para esse laboratório, objetivo é aplicar conceitos de observabilidade na configuração de ambiente e não programação em sí. \n- [Frontend](https://github.com/Adenilson365/devopslabs01-frontend)\n- [Backend - Catalogo](https://github.com/Adenilson365/devopslabs01-serviceMesh)\n- [Backend - Api de Imagens](https://github.com/Adenilson365/devopslabs01-api-images)\n- [Terraform - IAC](https://github.com/Adenilson365/devopslabs01-iac)\n\n\n## Instalação:\n- execute o script **install.sh**\n- 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.\n  - Nesse momento é necessário liberar no GCP SQL um acesso para a rede do GKE, quando estiver via Terraform essa observação será apagada.\n  - É 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.\n- Crie os arquivos segundo o readme do diretório config\n- DNS: Precisa apontar seu registro A api e obs para o ip do loadbalancing provisionado pelo nginx, ou configure como preferir. \n- DNS e Liberação SQL são as configurações manuais presentes no momento, o restante está via script shell.\n\n### Instalação Grafana Loki \n[Repositório Artifacthub](https://artifacthub.io/packages/helm/grafana/loki)\n```shell\nhelm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\nhelm install loki  grafana/loki-stack -f ./grafana-lokki/values.yaml --version 2.10.2 -n obs\n```\n- Instala a versão monolito com todos os componentes do grafana em um único deploy.\n- Por padrão instala a depêndencia promtail para coleta de logs\n\n- Versão [distributed](https://artifacthub.io/packages/helm/grafana/loki-distributed)\n- Mesmo formato de instalação, sendo necessário instalar a parte o [promtail](https://artifacthub.io/packages/helm/grafana/promtail)\n- Configurar o values.yaml do promtail para enviar logs ao loki\n```YAML\nconfig:\n  clients:\n    - url: http://loki-dis-loki-distributed-gateway/loki/api/v1/push\n\n# A url deve representar o dns do gateway do loki http://\u003csvc\u003e.\u003cns\u003e/loki/api/v1/push\n# se no mesmo namespace http://\u003csvc\u003e/loki/api/v1/push\n```\n\n\n- Após instalar necessário adicionar  a fonte de dados ao Grafana \n### Problemas de instalação:\n[Discussão](https://community.grafana.com/t/loki-helm-documentation-isnt-working-for-me/122777/5)\n[Issue que continha solução](https://github.com/grafana/loki/issues/12711)\n\n\n### Instalação stack Prometheus Grafana\n[Repositório Artifacthub](https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack)\n```shell\nhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts\nhelm repo update\nhelm upgrade --install prometheus prometheus-community/kube-prometheus-stack --version 67.5.0 --namespace obs --create-namespace -f ./kube-prom-stak/prom-values.yaml --wait\n```\n\n## Grafana Tempo ( Tracing )\n###\n### Arquitetura Tempo\n![Grafana Tempo](./docs-assets/arquitetura-tempo.png)\n![Documentação](https://grafana.com/docs/tempo/latest/setup/)\n![Helm chart](https://github.com/grafana/helm-charts/tree/main/charts/tempo)\n\n```shell\nhelm repo add grafana https://grafana.github.io/helm-charts\nhelm install tempo grafana/tempo -n obs\n```\n\n### Documentação\n[Opentelemetry como pipeline](https://grafana.com/blog/2021/04/13/how-to-send-traces-to-grafana-clouds-tempo-service-with-opentelemetry-collector/)\n\n### Configuração OpenTelemetry-collector\n###\n- Para **teste local** implante no docker compose essa imagem: [grafana/otel-lgtm](https://hub.docker.com/r/grafana/otel-lgtm)\n    - Essa imagem contém a stack completa (OpenTelemetry, Loki, Prometheus, Grafana, Tempo)\n    - Precisa expor no compose as portas 4317 (opentelemetry) e 3000 (Grafana dashboard)\n    - Não é necessário nenhum tipo de configuração apenas apontar a instrumentação para a porta 4317.\n    ```YAML\n    #Compose da stack otel-lgtm\n    otel:\n      image: grafana/otel-lgtm\n      ports:\n        - 4317:4317 # Opentelemetry gRpc\n        - 3000:3000 # Grafana Dashboard\n    ```\n\n### Configurar no k8s\n###\n\n- [Helm Opentelemetry-collector](https://artifacthub.io/packages/helm/opentelemetry-helm/opentelemetry-collector)\n```shell\nhelm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts\n\nhelm upgrade --install my-opentelemetry-collector open-telemetry/opentelemetry-collector \\\n--set mode=deployment --set image.repository=\"otel/opentelemetry-collector-k8s\" --set command.name=\"otelcol-k8s\" \\\n-f grafana-lokki/open-collector.yaml --version 0.111.0 -n obs\n```\n\n- Custom Values:\n```YAML\n\nconfig:\n  exporters:\n    debug: {}\n    otlp: \n      endpoint: http://tempo.obs.svc.cluster.local:4317  # Aponta para o serviço do grafana tempo\n      tls: \n        insecure: true\n  receivers:\n    otlp:\n      protocols:\n        grpc:\n          endpoint: 0.0.0.0:4317 # Para receber de qualquer endereço nessa porta\n        http:\n          endpoint: 0.0.0.0:4318\n  service:\n    telemetry:\n      metrics:\n        address: ${env:MY_POD_IP}:8888\n    extensions:\n      - health_check\n    pipelines:\n      logs:\n        exporters:\n          - otlp\n        processors:\n          - memory_limiter\n          - batch\n        receivers:\n          - otlp\n      metrics:\n        exporters:\n          - otlp\n        processors:\n          - memory_limiter\n          - batch\n        receivers:\n          - otlp\n          - prometheus\n      traces:\n        exporters:\n          - otlp\n        processors:\n          - memory_limiter\n          - batch\n        receivers:\n          - otlp\n```\n\n\n- A aplicação python precisa receber as variáveis de ambiente com as informações do collector\n```YAML\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: \u003cname\u003e\n  namespace: \u003cnamespace-da-aplicação\u003e\ndata:\n  OTEL_SERVICE_NAME: \u003cname-service\u003e\n  OTEL_EXPORTER_OTLP_ENDPOINT: http://\u003csvc-opentelemetry\u003e.obs.svc.cluster.local:4317\n  OTEL_EXPORTER_OTLP_INSECURE: 'true'\n  OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED: 'true'\n  OTEL_TRACES_EXPORTER: otlp\n  OTEL_METRICS_EXPORTER: otlp\n  OTEL_LOGS_EXPORTER: otlp\n\n```\n\n\n### Etapas \n\n- [x] Instalar a stack completa via helm\n- [x] Conectar opentelemetry ao tempo\n- [x] Instalar stack loki + promtail\n- [x] Trocar Promtail pelo opentelemetry para logs\n- [x] Implementar alertas via prometheus\n- [x] Integrar prometheus, opentelemetry, tempo para gerar grafico de malha\n- [x] Conectar métricas de aplicação do Opentelemetry ao prometheus\n- [x] Implementar volume persistente para métricas\n- [x] Implementar volume persistente para logs e traces\n- [ ] Corrigir bug de métricas duplicadas no prometheus\n- [ ] Revisar e alinhar a documentação\n\n [⬆️ Voltar ao topo](#objetivos)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadenilson365%2Fdevopslabs02-observabilidade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadenilson365%2Fdevopslabs02-observabilidade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadenilson365%2Fdevopslabs02-observabilidade/lists"}