Na Sardine, levamos a estabilidade muito a sério. À medida que escalamos para mais comerciantes e uma variedade de casos de uso, o monitoramento e os alertas se tornam ainda mais críticos. Usamos o GCP para hospedagem e, embora o GCP ofereça algumas funcionalidades básicas, decidimos usar o datadog para elevar o nível da nossa configuração de monitoramento.
Os benefícios de usar o datadog incluem:
- Capacidade de filtrar e agrupar dinamicamente os logs por rótulos personalizados. Com o GCP dá até para fazer algo parecido, mas não muito bem.
- Configurar aviso e alerta para o mesmo monitor.
- Compartilhar a definição de um monitor entre diferentes projetos do GCP (produção e staging) com limites diferentes.
- Compartilhar a definição de um painel entre diferentes projetos do GCP.
- Uma interface geral mais limpa e intuitiva, com menos bugs.
O Datadog oferece um guia online para integração com o GCP. Como usamos o terraform para gerenciar nossa infraestrutura, queríamos configurar tudo usando o terraform.
Configurando a integração do GCP a partir do datadog
O primeiro passo é selecionar "integrations" > "Google Cloud Platform" no datadog e adicionar seu projeto. Para isso, você precisará de uma conta de serviço com as permissões adequadas:
resource "google_service_account" "datadog-connect" { account_id = "datadog-connect" display_name = "Service Account for datadog connection"}resource "google_project_iam_member" "datadog-connect" { for_each = toset([ "roles/cloudasset.viewer", "roles/compute.viewer", "roles/monitoring.viewer", ]) role = each.key member = "serviceAccount:${google_service_account.datadog-connect.email}"}
Além disso, você pode limitar a coleta de métricas a hosts com tags específicas. Como em nosso projeto de desenvolvimento nossos desenvolvedores podem criar qualquer coisa a qualquer momento, definimos a tag específica "datadog:monitored" nos hosts que queremos monitorar, e coletamos métricas apenas desses hosts

Além disso, é importante observar que o conector do datadog não coleta todas as métricas que o GCP oferece. Por exemplo, costumávamos usar o valor p95 das métricas gcp.loadbalancing.https.backend_latencies em nosso monitoramento, mas o datadog só consegue coletar avg e sumsqdev desde agosto de 2021. Precisamos definir nossas próprias métricas personalizadas no nível da aplicação.
Coleta de logs
Para aplicações em execução no GCE ou GKE, o Datadog Agent pode ser usado para coletar logs localmente. Para outros logs, você precisará encaminhá-los usando um log sink e o pubsub.
resource "google_pubsub_topic" "export-logs-to-datadog" { name = "export-logs-to-datadog"}resource "google_pubsub_subscription" "datadog-logs" { name = "datadog-logs" topic = google_pubsub_topic.export-logs-to-datadog.name message_retention_duration = "604800s" retain_acked_messages = false ack_deadline_seconds = 60 push_config { push_endpoint = "https://gcp-intake.logs.datadoghq.com/v1/input/${var.datadog_key}/" }}resource "google_logging_project_sink" "datadog-sink" { name = "datadog-sink" destination = "pubsub.googleapis.com/${google_pubsub_topic.export-logs-to-datadog.id}" filter = "" unique_writer_identity = true}resource "google_project_iam_member" "pubsub-publisher-permisson" { role = "roles/pubsub.publisher" member = google_logging_project_sink.datadog-sink.writer_identity}
Você pode precisar definir um pipeline de logs personalizado para que a estrutura dos seus logs seja refletida corretamente na UI de logs do datadog. Aqui está o nosso pipeline.

Métricas personalizadas (datadog agent)
Para coletar métricas adicionais, logs e métricas personalizadas, você precisará instalar o datadog agent. O agent é oferecido como imagem Docker, além de pacotes para a maioria dos sistemas operacionais, então geralmente é muito fácil de instalar.
Uma complicação para nós foi que ainda não estávamos usando o GKE. Estávamos usando um managed instance group com um sistema operacional otimizado para contêineres. Como usamos golang para a maior parte da nossa aplicação, nossa imagem Docker da aplicação é bem simples — simplesmente copiamos a aplicação golang na imagem scratch. Isso significa que não há sistema operacional no qual instalar o pacote do datadog, então precisamos descobrir uma forma de executar duas imagens Docker (nossa imagem de aplicação e a imagem do datadog agent) no sistema operacional otimizado para contêineres.
Embora não esteja bem documentado, descobrimos que é possível iniciar um Docker no startup_script da VM.
module "managed_instance_group_template" { source = "terraform-google-modules/vm/google//modules/instance_template" ...startup_script = "docker run -d --name dd-agent ...."
É isso! Embora ainda estejamos no meio da configuração, já estamos vendo valor no datadog e estamos muito satisfeitos com ele!

