Eu preciso jsonPayload
nos logs de uma função do Google Cloud em vez do arquivo textPayload
. Meu objetivo é usar as chaves do dicionário como rótulos (consulte Rótulos de métricas baseadas em log ) para Métricas baseadas em log para que possam ser abordadas no Grafana.
Estou usando o logging
módulo do Python, mas também posso mudar para outra coisa, se necessário.
Eu preciso como saída nos logs:
jsonPayload: `{'key1':value1, 'key2':value2}`
Mas eu recebo uma textPayload
saída, toda a próxima linha é uma string:
"2022-02-08 15:43:32,460 [INFO]: {"key1": value1, "key2": value2}"
Exemplo real dos logs, no meio, você vê o textPayload
:
A imagem como texto:
{
insertId: "000000-1b431ffd-e42d-4f83-xyz"
labels: {1}
logName: "projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
receiveTimestamp: "2022-02-08T15:43:41.808217166Z"
resource: {2}
textPayload: "2022-02-08 15:43:32,460 [INFO]: {"json_metadata": {"countrows": 736203, "countcolumns": 6, "size": 48261360, "gcs_stamp": "2022-02-08 15:43:32.451000+00:00", "python_stamp": "2022-02-08 15:43:31.055538"}}"
timestamp: "2022-02-08T15:43:32.460Z"
trace: "projects/MY_PROJECT/traces/dd97759176248586a3d3xyz"
}
Primeiras tentativas
Lendo de https://cloud.google.com/logging/docs/structured-logging :
No Cloud Logging, os registros estruturados referem-se a entradas de registro que usam o campo jsonPayload para adicionar estrutura aos payloads. O log estruturado se aplica a logs escritos pelo usuário.
Eu tentei obter este "log estruturado" seguindo Escrevendo logs estruturados por
logging.info(json.dumps(json_for_gcp_lbm))
mas sem sucesso.
Mais adiante nos links: há um agente do Logging integrado do GCP que usa fluentd para Sobre o agente do Logging parece estar disponível apenas para o Google Kubernetes Engine ou o App Engine, não em uma função do Google Cloud:
Se você estiver usando o Google Kubernetes Engine ou o ambiente flexível do App Engine, poderá gravar logs estruturados como objetos JSON serializados em uma única linha para stdout ou stderr. O agente do Logging envia os logs estruturados para o Cloud Logging como o jsonPayload da estrutura LogEntry.
Como posso obter o jsonPayload
nesta saída?
Você pode configurar o log estruturado seguindo o exemplo nos documentos. Certifique-se de que sua versão do python seja 3.8 ou superior. Outra maneira de conseguir isso é usar as bibliotecas de cliente do Logging .
Exemplo do OP para o segundo método:
Coloque em seu requirements.txt:
como a versão mais recente no momento da escrita.
(ou nomeie como quiser)
e chame o log do json com:
json_for_gcp_lbm = {MY_JSON_HERE}
O que leva a uma saída jsonPayload:
E você pode escolher qualquer rótulo do json no menu "Criar métrica de logs" (Métricas baseadas em log / LBM):