Como monitorar dados de série temporal com o OpenTSDB no Bigtable e no GKE

Last reviewed 2022-01-12 UTC

Neste tutorial, descrevemos como coletar, registrar e monitorar dados de série temporal no Google Cloud usando o OpenTSDB em execução no Google Kubernetes Engine (GKE) e Bigtable.

Os dados de série temporal são um recurso altamente valioso usado em diversos aplicativos, incluindo tendências, monitoramento e aprendizado de máquina. Você gera esses dados a partir da infraestrutura do servidor, código do aplicativo e outras origens. O OpenTSDB coleta e retém grandes quantidades de dados de série temporal com um alto grau de granularidade.

Neste guia, mostramos aos engenheiros de software e arquitetos como criar uma camada de coleção escalonável para dados de série temporal usando o GKE. Também mostramos como trabalhar com os dados coletados usando o Bigtable. Neste guia, presumimos que você tenha familiaridade com o Kubernetes e o Bigtable.

O diagrama a seguir mostra a arquitetura geral deste guia:

Fontes de dados de série temporal armazenados no Bigtable.

O diagrama anterior mostra várias fontes de dados de série temporal, como eventos de IoT e métricas do sistema, que são armazenadas no Bigtable usando o OpenTSDB implantado no GKE.

Objetivos

  • Crie imagens de contêiner usadas neste guia usando o Cloud Build.
  • Gerencie essas imagens de contêiner usando o Artifact Registry.
  • Criar uma instância do Bigtable.
  • Crie um cluster do GKE.
  • Implantar o OpenTSDB no cluster do GKE.
  • Enviar métricas de série temporal para o OpenTSDB.
  • Visualizar métricas usando o OpenTSDB e o Grafana.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  2. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  3. Ative as APIs Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry.

    Ative as APIs

  4. No console do Google Cloud, acesse a página de Boas-vindas.

    Acessar a página de boas-vindas

    Anote o ID do projeto porque ele será usado posteriormente.

  5. No Console do Google Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

Criar uma instância do Bigtable

Neste guia, o Bigtable é usado para armazenar os dados de série temporal coletados. Portanto, é necessário criar uma instância do Bigtable.

O Bigtable é um armazenamento de chave/coluna larga que funciona bem para dados de série temporal. O Bigtable aceita a API HBase, por isso é possível usar um software projetado para funcionar com o Apache HBase, como o OpenTSDB. Para mais informações sobre o esquema do HBase usado pelo OpenTSDB, consulte o Esquema do HBase.

O principal componente do OpenTSDB é o cliente AsyncHBase, que permite gravar em massa para HBase de maneira totalmente assíncrona, sem bloqueios e thread-safe. Quando você usa o OpenTSDB com o Bigtable, o AsyncHBase é implementado como cliente AsyncBigtable.

Neste guia, usamos uma instância do Bigtable com um cluster de nó único. Ao mudar para um ambiente de produção, use instâncias do Bigtable com clusters maiores. Para mais informações sobre como escolher um tamanho de cluster, consulte Noções básicas sobre o desempenho do Bigtable.

  1. No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você criará o cluster do Bigtable e o cluster do GKE e o identificador de instância do cluster do Bigtable:

    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    export ZONE=ZONE
    

    Substitua:

    • BIGTABLE_INSTANCE_ID: o identificador da instância do Bigtable.
    • ZONE: a zona em que o cluster do Bigtable e o do GKE serão criados;

    O comando será semelhante ao seguinte exemplo:

    export BIGTABLE_INSTANCE_ID=bt-opentsdb
    export ZONE=us-central1-f
    
  2. Crie a instância do Bigtable:

    gcloud bigtable instances create ${BIGTABLE_INSTANCE_ID} \
        --cluster-config=id=${BIGTABLE_INSTANCE_ID}-${ZONE},zone=${ZONE},nodes=1 \
        --display-name=OpenTSDB
    

Criar as imagens usadas para implantar e testar o OpenTSDB

Para implantar e demonstrar o OpenTSDB com um back-end de armazenamento do Bigtable, este guia usa uma série de imagens de contêiner do Docker implantadas no GKE. Você cria várias dessas imagens usando código de um repositório GitHub correspondente com o Cloud Build. Ao implantar a infraestrutura no GKE, é usado um repositório de contêineres. Neste guia, você usa o Artifact Registry para gerenciar essas imagens de contêiner.

  1. No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você criará o repositório do Artifact Registry:

    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    export AR_REPO=AR_REPO
    

    Substitua:

    • PROJECT_ID: o ID do projeto
    • REGION: a região em que o repositório do Artifact Registry será criado
    • AR_REPO: o nome do repositório do Artifact Registry

    O comando será semelhante ao seguinte exemplo:

    export PROJECT_ID=bt-opentsdb-project-id
    export REGION=us-central1
    export AR_REPO=opentsdb-bt-repo
    
  2. Crie um repositório do Artifact Registry:

    gcloud artifacts repositories create ${AR_REPO} \
        --repository-format=docker  \
        --location=${REGION} \
        --description="OpenTSDB on bigtable container images"
    

Criar e gerenciar as imagens usadas para implantar e demonstrar o OpenTSDB

São usadas duas imagens de contêiner do Docker neste guia. A primeira imagem é usada para dois objetivos: executar a configuração única de banco de dados do Bigtable para o OpenTSDB e implantar contêineres de serviço de leitura e gravação para a implantação do OpenTSDB. A segunda imagem é usada para gerar dados de métrica de amostra para demonstrar sua implantação do OpenTSDB.

Ao enviar o job de compilação de imagens de contêiner para o Cloud Build, você marca as imagens para que elas sejam armazenadas no Artifact Registry depois de serem criadas.

  1. No Cloud Shell, clone o repositório do GitHub que contém o código de acompanhamento:

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  2. Acesse o diretório do código de amostra:

    cd opentsdb-bigtable
    
  3. Defina as variáveis de ambiente para a imagem do servidor OpenTSDB que usa o Bigtable como back-end de armazenamento:

    export SERVER_IMAGE_NAME=opentsdb-server-bigtable
    export SERVER_IMAGE_TAG=2.4.1
    
  4. Crie a imagem usando o Cloud Build:

    gcloud builds submit \
        --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO}/${SERVER_IMAGE_NAME}:${SERVER_IMAGE_TAG} \
        build
    

    Como a imagem foi marcada corretamente, quando a versão for concluída, ela será gerenciada pelo repositório do Artifact Registry.

  5. Defina as variáveis de ambiente para a imagem de geração de dados da série temporal de demonstração:

    export GEN_IMAGE_NAME=opentsdb-timeseries-generate
    export GEN_IMAGE_TAG=0.1
    
  6. Crie a imagem usando o Cloud Build:

    cd generate-ts
    ./build-cloud.sh
    cd ..
    

Crie um cluster do GKE

O GKE contém um ambiente gerenciado do Kubernetes. Depois de criar um cluster do GKE, é possível implantar os pods do Kubernetes nele. Neste guia, usamos o GKE e os pods do Kubernetes para executar o OpenTSDB.

O OpenTSDB separa o armazenamento dele da camada de aplicativo, permitindo a implantação simultânea em várias instâncias. Durante a execução em paralelo, uma grande quantidade de dados de série temporal é processada pelo OpenTSDB.

  1. No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você vai criar o cluster do Bigtable e o cluster do GKE, sendo que, para este último, você precisa também dar um nome e especificar o tipo de nó e a versão:

    export GKE_CLUSTER_NAME=GKE_CLUSTER_NAME
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    

    Substitua GKE_CLUSTER_NAME pelo nome do cluster do GKE.

    O comando será semelhante ao seguinte exemplo:

    export GKE_CLUSTER_NAME=gke-opentsdb
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    
  2. Crie um cluster do GKE:

    gcloud container clusters create ${GKE_CLUSTER_NAME} \
        --zone=${ZONE} \
        --cluster-version=${GKE_VERSION} \
        --machine-type ${GKE_NODE_TYPE} \
        --scopes "https://www.googleapis.com/auth/cloud-platform"
    

    Esta operação leva alguns minutos para ser concluída. A adição de escopos ao cluster do GKE permite que o contêiner do OpenTSDB interaja com o Bigtable e o Container Registry.

    O restante deste guia usa os contêineres que você acabou de criar e são gerenciados pelo Artifact Registry. Os scripts Dockerfile e entrypoint usados para criar o contêiner estão localizados na pasta build do arquivo guia.

  3. Receba as credenciais para se conectar ao cluster do GKE:

    gcloud container clusters get-credentials ${GKE_CLUSTER_NAME} --zone ${ZONE}
    

Criar um ConfigMap com detalhes de configuração

O Kubernetes usa ConfigMap para separar os detalhes de configuração da imagem do contêiner para tornar os aplicativos mais portáteis. A configuração do OpenTSDB é especificada no arquivo opentsdb.conf. Um ConfigMap que contém o arquivo opentsdb.conf está incluído no código de amostra.

Nestas e nas próximas etapas, você usará o utilitário GNU envsubst para substituir marcadores de variáveis de ambiente nos arquivos de modelo YAML pelos respectivos valores para a implantação.

  • Crie um ConfigMap do arquivo opentsdb-config.yaml atualizado:

    envsubst < configmaps/opentsdb-config.yaml.tpl | kubectl create -f -
    

Criar tabelas do OpenTSDB no Bigtable

Antes de ler ou gravar dados com o OpenTSDB, é preciso criar tabelas no Bigtable para armazenar esses dados. Para criar as tabelas, crie um job do Kubernetes.

  1. No Cloud Shell, inicie o job:

    envsubst < jobs/opentsdb-init.yaml.tpl | kubectl create -f -
    

    Este job leva alguns minutos para ser concluído. Verifique se o job foi concluído com sucesso:

    kubectl describe jobs
    

    A saída mostra que um job foi concluído quando Pods Statuses mostra 1 Succeeded.

  2. Examine os registros do job de criação de tabela:

    OPENTSDB_INIT_POD=$(kubectl get pods --selector=job-name=opentsdb-init \
                        --output=jsonpath={.items..metadata.name})
    kubectl logs $OPENTSDB_INIT_POD
    

    A resposta será semelhante a:

    create 'tsdb-uid',
      {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'},
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 3.2730 seconds
    
    create 'tsdb',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.8440 seconds
    
    create 'tsdb-tree',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.5420 seconds
    
    create 'tsdb-meta',
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.9910 seconds
    

    A resposta lista cada tabela que foi criada. Este job executa vários comandos de criação de tabela, cada um usando o formato create TABLE_NAME. As tabelas são criadas com sucesso quando você tem saída na forma de 0 row(s) in TIME seconds.

    • TABLE_NAME: o nome da tabela criada pelo job.
    • TIME: o tempo necessário para criar a tabela

Modelo de dados

As tabelas que você criou armazenam pontos de dados do OpenTSDB. Em uma etapa posterior, você gravará dados de série temporal nessas tabelas. Os pontos de dados de série temporal são organizados e armazenados da seguinte forma:

Campo Obrigatório Descrição Exemplo
metric Obrigatório Item a ser avaliado - a chave padrão sys.cpu.user
timestamp Obrigatório Tempo Unix epoch da medição 1497561091
tags Adicione pelo menos uma tag Qualifica a avaliação para fins de consulta hostname=www cpu=0 env=prod
value Obrigatório Valor de avaliação 89,3

A métrica, o carimbo de data/hora e as tags (chave de tag e valor da tag) formam a chave de linha. O carimbo de data/hora é normalizado em uma hora para garantir que uma linha não contenha muitos pontos de dados. Para mais informações, consulte Esquema do HBase.

Implantar o OpenTSDB

O diagrama a seguir mostra a arquitetura de implantação do OpenTSTB com os serviços em execução no GKE e com o Bigtable como back-end de armazenamento:

Duas implantações do OpenTSDB do Kubernetes.

Neste guia, usamos duas implantações do OpenTSDB do Kubernetes: uma implantação envia métricas para o Bigtable e a outra faz a leitura da implantação. O uso de duas implantações evita que as leituras e gravações longas bloqueiem uma à outra. A mesma imagem do contêiner é usado pelos pods em cada implantação. O OpenTSDB fornece um daemon chamado tsd que é executado em cada contêiner. Um único processo tsd pode processar uma alta capacidade de eventos a cada segundo. Para distribuir a carga, cada implantação neste guia cria três réplicas dos pods de leitura e gravação.

  1. No Cloud Shell, crie uma implantação para gravar métricas:

    envsubst < deployments/opentsdb-write.yaml.tpl | kubectl create -f  -
    

    As informações de configuração para implantação de gravação estão no arquivo opentsdb-write.yaml.tpl na pasta deployments do repositório do guia.

  2. Criar uma implantação para métricas de leitura:

    envsubst < deployments/opentsdb-read.yaml.tpl | kubectl create -f  -
    

    As informações de configuração para implantação do leitor estão no arquivo opentsdb-read.yaml.tpl na pasta deployments do repositório do guia.

Em uma implantação de produção, é possível aumentar o número de pods tsd em execução, seja manualmente ou usando o escalonamento automático no Kubernetes. Da mesma forma, é possível aumentar o número de instâncias no cluster do GKE manualmente ou usando o Escalonador automático de cluster.

Criar os serviços do OpenTSDB

Para fornecer conectividade de rede consistente às implantações, crie dois serviços do Kubernetes: um serviço grava métricas no OpenTSDB e o outro faz leituras.

  1. No Cloud Shell, crie o serviço para gravar métricas:

    kubectl create -f services/opentsdb-write.yaml
    

    As informações de configuração para o serviço de gravação de métricas estão contidas no arquivo opentsdb-write.yaml na pasta services do repositório do guia. Esse serviço é criado dentro do cluster do Kubernetes e pode ser acessado por outros serviços em execução no cluster.

  2. Criar o serviço para ler métricas:

    kubectl create -f services/opentsdb-read.yaml
    

    As informações de configuração para o serviço de leitura de métricas estão contidas no arquivo opentsdb-read.yaml na pasta services do repositório do guia.

Gravar dados de série temporal no OpenTSDB

Há vários mecanismos para gravar dados no OpenTSDB. Depois de definir os pontos de extremidade do serviço, você pode direcionar os processos para começar a gravar dados neles. Este guia implanta um serviço Python que emite dados demonstrativos de séries temporais para duas métricas: Cluster Memory Utilization (memory_usage_gauge) e Cluster CPU Utilization (cpu_node_utilization_gauge).

  • No Cloud Shell, implante o gerador de métricas de série temporal no cluster:

    envsubst < deployments/generate.yaml.tpl | kubectl create -f -
    

Examinar os dados de exemplo de série temporal com o OpenTSDB

É possível consultar métricas de série temporal usando o ponto de extremidade do serviço opentsdb-read implantado anteriormente no guia. É possível usar os dados de várias maneiras. Uma opção comum é visualizar. O OpenTSDB inclui uma interface básica para visualizar as métricas coletadas. Neste guia, você aprende a usar o Grafana, uma alternativa conhecida para visualização de métricas que inclui funcionalidades complementares.

A execução do Grafana no cluster requer um processo semelhante usado para configurar o OpenTSDB. Além de criar um ConfigMap e uma implantação, você precisa configurar o encaminhamento de portas para poder acessar o Grafana enquanto ele estiver em execução no seu cluster do Kubernetes.

  1. No Cloud Shell, crie o ConfigMap do Grafana usando as informações de configuração no arquivo grafana.yaml na pasta configmaps do repositório do guia:

    kubectl create -f configmaps/grafana.yaml
    
  2. Crie a implantação do Grafana usando as informações de configuração no arquivo grafana.yaml na pasta deployments do repositório do guia:

    kubectl create -f deployments/grafana.yaml
    
  3. Receba o nome do pod do Grafana no cluster e use-o para configurar o encaminhamento de portas.

    GRAFANA_PODS=$(kubectl get pods --selector=app=grafana \
                   --output=jsonpath={.items..metadata.name})
    kubectl port-forward $GRAFANA_PODS 8080:3000
    

    Verifique se o encaminhamento foi bem-sucedido. A resposta será semelhante a:

    Forwarding from 127.0.0.1:8080 -> 3000
    
  4. Para se conectar à interface da Web do Grafana, no Cloud Shell, clique em Visualização na Web e selecione Visualizar na porta 8080.

    Para mais informações, consulte Como usar a visualização da Web.

    Uma nova guia do navegador é aberta e conectada à interface da Web do Grafana. Depois de alguns instantes, o navegador exibe gráficos semelhantes a este:

    Gráfico de linhas mostrando métricas de cluster.

    Esta implantação do Grafana foi personalizada para este guia. Os arquivos configmaps/grafana.yaml e deployments/grafana.yaml configuram o Grafana para se conectar ao serviço opentsdb-read, permitir autenticação anônima e exibir algumas métricas básicas do cluster. Para a implantação do Grafana em um ambiente de produção, implemente os mecanismos de autenticação adequados e use gráficos de série temporal mais avançados.

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir recursos individuais

  1. Exclua o cluster do Kubernetes para excluir todos os artefatos criados:

    gcloud container clusters delete GKE_CLUSTER_NAME
    

    Para excluir o cluster do Kubernetes, confirme digitando Y.

  2. Para excluir a instância do Bigtable, faça o seguinte:

    1. No Console do Google Cloud, acesse o Bigtable.

      Acessar o Bigtable

    2. Selecione a instância que você criou anteriormente e clique em Excluir instância.

Exclua o projeto

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir