Como usar métricas com base em registros

Nesta página, você verá os conceitos básicos da emissão de registros para criar SLIs de disponibilidade e latência. Você verá também exemplos de implementação de como definir SLOs usando métricas com base em registros.

Usar elementos de dados em entradas de registro para criar indicadores de nível de serviço é uma maneira fácil de aproveitar os payloads de registro atuais. Caso contrário, talvez seja possível adicionar a geração de registros a um serviço atual, o que pode ser mais fácil do que criar instrumentação de métricas.

Registros e métricas

Os registros coletam registros chamados entradas de registro, que descrevem eventos específicos que ocorrem em sistemas de computador. Os registros são gravados por código, pelos serviços da plataforma em que o código está sendo executado (por exemplo, Dataflow) e pela infraestrutura de que a plataforma depende, como instâncias do Compute Engine.

Como os registros em sistemas modernos descendem de arquivos de texto gravados no disco (e às vezes ainda estão neles), uma entrada de registro é similar a uma linha do arquivo de registros e pode ser considerada a unidade quântica do registro.

Uma entrada de registro consiste, no mínimo, de dois elementos:

  • carimbo de data/hora que indica quando o evento ocorreu ou quando foi ingerido no sistema de geração de registros;
  • o payload do texto, como dados de texto não estruturados ou dados estruturados, geralmente em JSON.

Os registros também podem conter metadados associados, especialmente quando são ingeridos no Cloud Logging. Esses metadados podem incluir o recurso que está gravando o registro, o nome do registro e uma gravidade para cada entrada.

Registros

Os registros são usados com dois propósitos principais:

  • Os registros de eventos descrevem eventos específicos que ocorrem no sistema. Use registros de eventos para gerar mensagens que garantam aos usuários que tudo está funcionando bem ("tarefa bem-sucedida") ou que forneçam informações quando houver falhas ("exceção recebida do servidor").
  • Os registros de transações descrevem os detalhes de cada transação processada por um sistema ou componente. Por exemplo, um balanceador de carga registra todas as solicitações que recebe, se a solicitação foi concluída ou não e registra informações adicionais, como URL solicitado, código de resposta HTTP e possivelmente informações como qual back-end foi usado para atender à solicitação.

Métrica

Diferentemente dos registros, as métricas geralmente não descrevem eventos específicos. Geralmente, as métricas são usadas para representar o estado ou a integridade de um sistema ao longo do tempo. Uma métrica é composta de uma série de pontos de dados que medem algo sobre o sistema. Cada ponto de dados inclui um carimbo de data/hora e um valor numérico.

As métricas também podem ter metadados associados a elas. A série de pontos de dados, chamada de série temporal, pode incluir informações como nome da métrica, descrição e rótulos que especificam qual recurso está gravando os dados. Para informações sobre o modelo de métricas do Monitoring, consulte Métricas, séries temporais e recursos.

Métricas com base em registros

Métricas com base em registros são métricas criadas a partir de entradas de registro por meio da extração de informações das entradas de registros e da transformação delas em dados de série temporal. O Cloud Logging oferece mecanismos para criar dois tipos de métricas a partir das entradas de registros:

  • Métricas de contador, que contam o número de entradas de registro que correspondem a um filtro específico. É possível usar uma métrica de contador para determinar, por exemplo, o número de solicitações ou erros gravados no registro.

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

Para mais informações sobre métricas com base em registros no Cloud Logging, consulte Como usar métricas com base em registros.

Como usar métricas com base em registros como SLIs

As métricas com base em registros permitem extrair dados de registros de uma forma que pode ser usada para criar SLIs no Monitoring:

  • É possível usar métricas de contador com base em registros para expressar um SLI de disponibilidade com base em solicitações.

  • É possível usar uma métrica de distribuição baseada em registros para expressar um SLI de latência com base em solicitações.

Exemplos de entradas de registro

O aplicativo Stack Doctor é um exemplo de um serviço instrumentado para emitir mensagens de registro que contêm informações sobre todas as solicitações, os erros e a latência do serviço. O código do serviço está disponível no repositório do GitHub stack-doctor.

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

  • Em cada solicitação:

    {
      "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 solicitações bem-sucedidas:

    {
      "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 solicitações concluídas:

    {
      "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"
    }
    
  • No 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 nessas entradas, é possível criar métricas com base em registros que contam todas as solicitações, contam os erros e rastreiam a latência das solicitações. Em seguida, use as métricas com base em registros para criar SLIs de disponibilidade e latência.

Como criar métricas com base em registros para SLIs.

Antes de criar SLIs em métricas com base em registros, você precisa criar as métricas com base em registros.

  • Para SLIs de disponibilidade em contagens de solicitações e erros, use métricas de contador com base em registros.
  • Para SLIs de latência, use métricas de distribuição com base em registros.

Depois de criar as métricas com base em registros, é possível encontrá-las no Monitoring pesquisando-as no Metrics Explorer. No Monitoring, as métricas com base em registros têm o prefixo logging.googleapis.com/user.

Métricas para SLIs de disponibilidade

Para expressar um SLI de disponibilidade baseado em solicitação na API Cloud Monitoring, use a estrutura TimeSeriesRatio para configurar uma proporção de solicitações "boas" ou "ruins" para o total solicitações. Essa proporção é usada no campo goodTotalRatio de uma estrutura RequestBasedSli.

Crie métricas de contador com base em registros que podem ser usadas para construir essa proporção. É preciso criar pelo menos dois dos seguintes elementos:

  1. Uma métrica que conta o total de eventos. Use essa métrica no totalServiceFilter da proporção.

    No exemplo de "stack-doctor", você pode criar uma métrica com base em registros que conta entradas de registro em que a string de mensagem "solicitação feita" aparece.

  2. Uma métrica que conta eventos "ruins". Use essa métrica no badServiceFilter da proporção.

    No exemplo de "stack-doctor", você pode criar uma métrica com base em registros que conta entradas de registro em que a string de mensagem "falha!" aparece.

  3. Uma métrica que conta eventos "bons". Use essa métrica no goodServiceFilter da proporção.

    No exemplo de "stack-doctor", você pode criar uma métrica com base em registros que conta entradas de registro em que a string de mensagem "sucesso!" aparece.

O SLI descrito para este exemplo é baseado em uma métrica para o total de solicitações chamadas log_based_total_requests e em uma métrica para erros chamados log_based_errors.

É possível criar métricas com base em registros usando o console do Google Cloud, a API Cloud Logging ou a Google Cloud CLI. Para criar métricas de contador baseadas em registros usando o Console do Google Cloud, use o procedimento a seguir:

  1. No painel de navegação do console do Google Cloud, selecione Logging e, em seguida, Métricas com base em registros:

    Acessar Métricas com base em registros

    A página de métricas com base em registros mostra uma tabela de métricas definidas pelo usuário e uma tabela de métricas definidas pelo sistema.

  2. Clique em Criar métrica, localizada acima da tabela de métricas definidas pelo usuário.

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

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

    Você pode ignorar os outros campos deste exemplo.

  5. No painel Seleção de filtro, crie uma consulta que recupere apenas as entradas de registro que você quer contar na sua métrica.

    Para o exemplo de "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 Visualizar registros para verificar seu filtro e ajuste-o, se necessário.

  7. Ignore o painel Rótulos 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 registros, consulte Como criar uma métrica de contador.

Métricas para SLIs de latência

Para expressar um SLI de latência baseado em solicitação na API Cloud Monitoring, use uma estrutura DistributionCut, que é usada no campo distributionCut de uma estrutura RequestBasedSli. É preciso criar uma métrica de distribuição baseada em registros para criar um SLI de latência. Este exemplo cria uma métrica de distribuição baseada em registros chamada log_based_latency..

É possível criar métricas com base em registros usando o console do Google Cloud, a API Cloud Logging ou a Google Cloud CLI. Para criar métricas de distribuição baseadas em registros com o Console do Google Cloud, siga este procedimento:

  1. No painel de navegação do console do Google Cloud, selecione Logging e, em seguida, Métricas com base em registros:

    Acessar Métricas com base em registros

    A página de métricas com base em registros mostra uma tabela de métricas definidas pelo usuário e uma tabela de métricas definidas pelo sistema.

  2. Clique em Criar métrica, localizada acima da tabela de métricas definidas pelo usuário.

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

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

    Você pode ignorar os outros campos deste exemplo.

  5. No painel Seleção de filtro, crie uma consulta que recupere apenas as entradas de registro que você quer contar na sua métrica.

    Para o exemplo de "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 da mensagem para solicitações concluídas tem o formato "slept for n ms". A expressão regular extrai o valor de latência n da string.

  6. Ignore o painel Rótulos para este exemplo.

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

Para mais informações sobre como criar métricas de distribuição com base em registros, consulte Como criar métricas de distribuição.

SLIs de disponibilidade

No Cloud Monitoring, você expressa um SLI de disponibilidade baseado em solicitação usando uma estrutura TimeSeriesRatio. O exemplo a seguir mostra um SLO que usa as métricas log_based_total_requests e log_based_errors na proporção. Esse SLO espera que a proporção de solicitações "boas" em relação ao total seja, pelo menos, 98% em 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"
}

SLIs de latência

No Cloud Monitoring, você expressa um SLI de latência baseado em solicitação usando uma estrutura DistributionCut. O exemplo a seguir mostra um SLO que usa a métrica log_based_latency e espera que 98% das solicitações fiquem abaixo de 500 ms em 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"
}

Outros recursos