Usar métricas baseadas em registos

Esta página aborda os princípios básicos da emissão de registos para criar SLIs de disponibilidade e latência. Também fornece exemplos de implementação de como definir SLOs usando métricas baseadas em registos.

A utilização de elementos de dados em entradas de registo para criar indicadores ao nível do serviço é uma forma de tirar partido dos payloads de registo existentes. Caso contrário, pode ser possível adicionar o registo a um serviço existente, o que pode ser mais fácil do que criar a instrumentação de métricas.

Registos e métricas

Os registos recolhem registos denominados entradas do registo que descrevem eventos específicos que ocorrem em sistemas informáticos. Os registos são escritos pelo código, pelos serviços da plataforma em que o código está a ser executado (por exemplo, Dataflow) e pela infraestrutura da qual a plataforma depende (por exemplo, instâncias do Compute Engine).

Uma vez que os registos nos sistemas modernos descendem de ficheiros de texto escritos no disco (e, por vezes, ainda o são), uma entrada de registo é análoga a uma linha num ficheiro de registo e pode ser considerada a unidade quântica de registo.

Uma entrada de registo consiste, no mínimo, em duas coisas:

  • Uma data/hora que indica quando o evento ocorreu ou quando foi carregado no sistema de registo
  • O payload de texto, como dados de texto não estruturados ou dados estruturados, é mais comummente em JSON.

Os registos também podem conter metadados associados, especialmente quando são carregados no Cloud Logging. Estes metadados podem incluir o recurso que está a escrever o registo, o nome do registo e uma gravidade para cada entrada.

Registos

Os registos são usados para dois objetivos principais:

  • Os registos de eventos descrevem eventos específicos que ocorrem no sistema. Pode usar registos de eventos para gerar mensagens que garantam aos utilizadores que tudo está a funcionar bem ("tarefa concluída com êxito") ou para fornecer informações quando algo falha ("exceção recebida do servidor").
  • Os registos de transações descrevem os detalhes de cada transação processada por um sistema ou um componente. Por exemplo, um equilibrador de carga regista todos os pedidos que recebe, quer o pedido seja concluído com êxito ou não, e regista informações adicionais, como o URL pedido, o código de resposta HTTP e, possivelmente, informações como o back-end que foi usado para publicar o pedido.

Métrica

Ao contrário dos registos, as métricas normalmente não descrevem eventos específicos. Mais frequentemente, as métricas são usadas para representar o estado ou o desempenho de um sistema ao longo do tempo. Uma métrica é composta por uma série de pontos de dados que medem algo sobre o seu sistema. Cada ponto de dados inclui uma indicação de tempo e um valor numérico.

As métricas também podem ter metadados associados. A série de pontos de dados, denominada série cronológica, pode incluir informações como o nome da métrica, uma descrição e, frequentemente, etiquetas que especificam que recurso está a escrever os dados. Para obter informações sobre o modelo de métricas de monitorização, consulte o artigo Métricas, séries cronológicas e recursos.

Métricas baseadas em registos

As métricas baseadas em registos são métricas criadas a partir de entradas de registo através da extração de informações das entradas de registo e da respetiva transformação em dados de séries cronológicas. O Cloud Logging oferece mecanismos para criar dois tipos de métricas a partir de entradas de registo:

  • Métricas do contador, que contabilizam o número de entradas de registo que correspondem a um filtro específico. Pode usar uma métrica de contador para determinar, por exemplo, o número de pedidos ou erros registados no registo.

  • Métricas de distribuição, que usam expressões regulares para analisar o conteúdo em cada entrada do registo para extrair valores numéricos como uma distribuição.

Para mais informações sobre métricas baseadas em registos no Cloud Logging, consulte o artigo Usar métricas baseadas em registos.

Usar métricas baseadas em registos como INSs

As métricas baseadas em registos permitem-lhe extrair dados de registos num formato que pode usar para criar SLIs na monitorização:

  • Pode usar métricas de contador baseadas em registos para expressar um SLI de disponibilidade baseado em pedidos.

  • Pode usar uma métrica de distribuição baseada em registos para expressar um SLI de latência baseado em pedidos.

Exemplos de entradas do registo

A aplicação Stack Doctor é um exemplo de um serviço instrumentado para emitir mensagens de registo que contêm informações sobre todos os pedidos, erros e latência feitos ao serviço. O código do serviço está disponível no stack-doctor repositório do GitHub.

O serviço gera entradas de registo do Cloud Logging no registo projects/stack-doctor/logs/bunyan_log. A entrada de registo para cada tipo de evento inclui um valor message diferente. As entradas de registo para diferentes tipos de eventos têm o seguinte aspeto:

  • Em cada pedido:

    {
      "insertId": "..........iTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "pid": 81846,
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "hostname": "<hostname>",
        "level": 30,
        "message": "request made",
        "v": 0,
        "name": "sli-log"
      },
        "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.263999938Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.003471183Z"
    }
    
  • Em pedidos bem-sucedidos:

    {
      "insertId": "..........qTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "name": "sli-log",
        "v": 0,
        "pid": 81846,
        "level": 30,
        "hostname": "<hostname>",
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "message": "success!"
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Em pedidos concluídos:

    {
      "insertId": "..........mTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "level": 30,
        "name": "sli-log",
        "message": "slept for 606 ms",
        "hostname": "<hostname>",
        "pid": 81846,
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Em caso de erro:

    {
      "insertId": "..........DTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "hostname": "<hostname>",
        "level": 50,
        "pid": 81846,
        "message": "failure!",
        "name": "sli-log",
        "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)",
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:44.414999961Z",
      "severity": "ERROR",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:46.182157077Z"
    }
    

Com base nestas entradas, pode criar métricas baseadas em registos que contabilizam todos os pedidos, contabilizam erros e monitorizam a latência dos pedidos. Em seguida, pode usar as métricas baseadas em registos para criar SLIs de disponibilidade e latência.

Criar métricas baseadas em registos para SLIs.

Antes de poder criar SLIs em métricas baseadas em registos, tem de criar as métricas baseadas em registos.

  • Para INSs de disponibilidade em contagens de pedidos e erros, use métricas de contador baseadas em registos.
  • Para SLIs de latência, use métricas de distribuição baseadas em registos.

Depois de criar as métricas baseadas em registos, pode encontrá-las em Monitorização pesquisando-as no Explorador de métricas. Na monitorização, as métricas baseadas em registos têm o prefixo logging.googleapis.com/user.

Métricas para INSs de disponibilidade

Pode expressar um SLI de disponibilidade baseado em pedidos na API Cloud Monitoring através da estrutura TimeSeriesRatio para configurar uma proporção de pedidos "bons" ou "maus" em relação ao total de pedidos. Esta proporção é usada no campo goodTotalRatio de uma estrutura RequestBasedSli.

Tem de criar métricas de contador baseadas em registos que possam ser usadas para criar esta proporção. Tem de criar, pelo menos, dois dos seguintes elementos:

  1. Uma métrica que contabiliza o total de eventos; use esta métrica no denominador da proporção.totalServiceFilter

    Para o exemplo "stack-doctor", pode criar uma métrica baseada em registos que contabiliza as entradas de registo nas quais a string de mensagem "pedido feito" aparece.

  2. Uma métrica que contabiliza eventos "incorretos". Use esta métrica nas proporções badServiceFilter.

    Para o exemplo "stack-doctor", pode criar uma métrica baseada em registos que conte as entradas de registo nas quais a string de mensagem "failure!" aparece.

  3. Uma métrica que contabiliza eventos "bons". Use esta métrica nos goodServiceFilterda proporção.

    Para o exemplo "stack-doctor", pode criar uma métrica baseada em registos que conte as entradas de registo nas quais a string de mensagem "success!" aparece.

O SLI descrito para este exemplo baseia-se numa métrica para o total de pedidos denominada log_based_total_requests e numa métrica para erros denominada log_based_errors.

Pode criar métricas baseadas em registos através da Google Cloud consola, da API Cloud Logging ou da CLI Google Cloud. Para criar métricas de contador baseadas em registos através da Google Cloud consola, pode usar o seguinte procedimento:

  1. Na Google Cloud consola, aceda à página Métricas baseadas em registos:

    Aceda a Métricas baseadas em registos

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

    A página de métricas baseadas em registos mostra uma tabela de métricas definidas pelo utilizador e uma tabela de métricas definidas pelo sistema.

  2. Clique em Criar métrica, localizado acima da tabela de métricas definidas pelo utilizador.

  3. No painel Tipo de métrica, selecione Contador.

  4. No painel Detalhes, atribua um nome à nova métrica. Para o exemplo "stack-doctor", introduza log_based_total_requests ou log_based_errors.

    Pode ignorar os outros campos para este exemplo.

  5. No painel Seleção de filtros, crie uma consulta que obtenha apenas as entradas de registo que quer contabilizar na sua métrica.

    Para o exemplo "stack-doctor", a consulta para log_based_total_requests pode incluir o seguinte:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="request made"
    

    A consulta para logs_based_errors altera a string da mensagem:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="failure!"
    
  6. Clique em Pré-visualizar registos para verificar o filtro e ajustá-lo, se necessário.

  7. Ignore o painel Etiquetas para este exemplo.

  8. Clique em Criar métrica para concluir o procedimento.

Para mais informações sobre como criar métricas de contador baseadas em registos, consulte o artigo Criar uma métrica de contador.

Métricas para INSs de latência

Expressa um SLI de latência baseado em pedidos na API Cloud Monitoring através de uma estrutura DistributionCut, que é usada no campo distributionCut de uma estrutura RequestBasedSli. Tem de criar uma métrica de distribuição baseada em registos para criar um SLI de latência. Este exemplo cria uma métrica de distribuição baseada em registos denominada log_based_latency.

Pode criar métricas baseadas em registos através da Google Cloud consola, da API Cloud Logging ou da CLI Google Cloud. Para criar métricas de distribuição baseadas em registos através da Google Cloud consola, pode usar o seguinte procedimento:

  1. Na Google Cloud consola, aceda à página Métricas baseadas em registos:

    Aceda a Métricas baseadas em registos

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

    A página de métricas baseadas em registos mostra uma tabela de métricas definidas pelo utilizador e uma tabela de métricas definidas pelo sistema.

  2. Clique em Criar métrica, localizado acima da tabela de métricas definidas pelo utilizador.

  3. No painel Tipo de métrica, selecione Distribuição.

  4. No painel Detalhes, atribua um nome à nova métrica. Para o exemplo "stack-doctor", introduza log_based_latency.

    Pode ignorar os outros campos para este exemplo.

  5. No painel Seleção de filtros, crie uma consulta que obtenha apenas as entradas de registo que quer contabilizar na sua métrica.

    Para o exemplo "stack-doctor", a consulta para log_based_latency pode incluir o seguinte:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="slept for"
    

    Especifique os seguintes campos para a consulta de filtro:

    • Nome do campo: json.message
    • Expressão regular: \s(\d*)\s

      A string de mensagem para pedidos concluídos tem o formato "slept for n ms". A expressão regular extrai o valor de latência n da string.

  6. Ignore o painel Etiquetas para este exemplo.

  7. Clique em Criar métrica para concluir o procedimento.

Para mais informações sobre a criação de métricas de distribuição baseadas em registos, consulte o artigo Criar métricas de distribuição.

INSs de disponibilidade

No Cloud Monitoring, expressa um SLI de disponibilidade baseado em pedidos através de uma estrutura TimeSeriesRatio. O exemplo seguinte mostra um SLO que usa as métricas log_based_total_requests e log_based_errors na proporção. Este SLO espera que a proporção de pedidos "bons" para o total seja, pelo menos, de 98% durante um período contínuo de 24 horas:

{
 "serviceLevelIndicator": {
   "requestBased": {
     "goodTotalRatio": {
       "totalServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
          resource.type=\"global\"",
       "badServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_errors\"
          resource.type=\"global\""
     }
   }
 },
 "goal": 0.98,
 "rollingPeriod": "86400s",
 "displayName": "Log-Based Availability"
}

INSs de latência

No Cloud Monitoring, expressa um SLI de latência baseado em pedidos através de uma estrutura DistributionCut. O exemplo seguinte mostra um SLO que usa a métrica log_based_latency e espera que 98% dos pedidos estejam abaixo de 500 ms durante um período contínuo de 24 horas:

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"logging.googleapis.com/user/log_based_latency\"
          resource.type=\"global\"",
        "range": {
          "min": 0,
          "max": 500
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 500 ms"
}

Recursos adicionais