Puncte:2

jsonPayload (înregistrare structurată) ieșire din înregistrarea Python Google Cloud Function necesară pentru a crea valori bazate pe jurnal (LBM) în GCP

drapel mx

am nevoie de jsonPayload în jurnalele unei funcții Google Cloud în loc de textPayload. Scopul meu este să folosesc cheile dicționarului ca etichete (vezi Etichete de valori bazate pe jurnal) pentru metrici bazate pe jurnal, astfel încât acestea să poată fi abordate în Grafana.

Eu folosesc Python Logare modul, dar pot trece și la altceva dacă este necesar.

Am nevoie ca ieșire în jurnale:

jsonPayload: `{'key1':value1, 'key2':value2}`

Dar primesc un textPayload în schimb, întreaga linie următoare este un șir:

„2022-02-08 15:43:32,460 [INFO]: {"key1": value1, "key2": value2}"

Exemplu real din bușteni, în mijloc, vezi textPayload:

introduceți descrierea imaginii aici

Imaginea ca text:

{
insertId: „000000-1b431ffd-e42d-4f83-xyz”
etichete: {1}
logName: „projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions”
primire ștampilă: „2022-02-08T15:43:41.808217166Z”
resursă: {2}
textPayload: "2022-02-08 15:43:32,460 [INFO]: {"json_metadata": {"countrows": 736203, "countcolumns": 6, "size": 48261360, "gcs_stamp": "2022 08 15:43:32.451000+00:00", "python_stamp": "2022-02-08 15:43:31.055538"}}"
marca temporală: „2022-02-08T15:43:32.460Z”
trace: „projects/MY_PROJECT/traces/dd97759176248586a3d3xyz”
}

Primele încercări

Citind din https://cloud.google.com/logging/docs/structured-logging:

În Cloud Logging, jurnalele structurate se referă la intrările de jurnal care utilizează câmpul jsonPayload pentru a adăuga structură la sarcinile lor utile. Jurnalul structurat se aplică jurnalelor scrise de utilizator.

Am încercat să obțin următoarea „înregistrare structurată”. Scrierea jurnalelor structurate de

logging.info(json.dumps(json_for_gcp_lbm))

dar fără niciun rezultat.

Mai departe în linkuri: există un agent de înregistrare încorporat de la GCP care utilizează fluentd cu privire la Despre agentul de logare pare să fie disponibil numai pentru Google Kubernetes Engine sau App Engine, nu într-o funcție Google Cloud:

Dacă utilizați Google Kubernetes Engine sau App Engine flexibil mediu, puteți scrie jurnalele structurate ca obiecte JSON serializate pe o singură linie la stdout sau stderr. Agentul de înregistrare trimite apoi jurnalele structurate pentru Cloud Logging ca jsonPayload al LogEntry structura.

Cum pot obține jsonPayload în această ieșire?

mdobrucki avatar
drapel tr
Înțeleg corect - rezultatul pe care l-ați furnizat provine din utilizarea [exemplu](https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs)? Ce versiune de python folosești?
questionto42standswithUkraine avatar
drapel mx
@mdobrucki Da, am folosit `logging.info(json.dumps(json_for_gcp_lbm))` care este luat din exemplul acelui link, dar am folosit doar ultima linie a acelui exemplu, sperând că acest lucru va ajunge deja. Folosesc o funcție cloud `Python 3.9`.
mdobrucki avatar
drapel tr
Dacă utilizați python 3.9, exemplul oferit în documente ar trebui să funcționeze, asigurați-vă că îl urmați corect și structurați datele în consecință. V-ați gândit să utilizați bibliotecile client Logging cu acest [exemplu](https://cloud.google.com/logging/docs/reference/libraries#write_structured_logs)?
questionto42standswithUkraine avatar
drapel mx
@mdobrucki Nu, trebuie să fi supravegheat asta, deoarece am căutat direct „json structurat”. O voi verifica cu biblioteca Google și voi folosi loggerul exemplului.
mdobrucki avatar
drapel tr
Spune-mi ce ai stabilit.
questionto42standswithUkraine avatar
drapel mx
@mdobrucki Da, a funcționat. Vina mea de când acel ghid din link este destul de clară. Am avut câteva probleme cu clasele datetime - am primit `google.protobuf.json_format.ParseError: Value 2022-02-09 13:27:35.067000+00:00 are un tip neașteptat `. Dar am rezolvat-o cu `str()` în jurul acelei clase datetime deocamdată, ar putea folosi și `.strftime()` pentru a-l face un șir. `default=str` ca parametru cum îl puteți utiliza în modulul Python încorporat `logging` nu funcționează. Oricum, puteți răspunde dacă doriți, aș putea apoi să „editeze” exemplul meu cum am făcut-o să funcționeze.
Puncte:1
drapel tr

Puteți configura înregistrarea structurată urmând exemplu în documente.Asigurați-vă că versiunea dvs. de python este 3.8 sau mai mare. O altă modalitate de a realiza acest lucru este utilizarea Înregistrarea bibliotecilor client.

Exemplu din OP pentru a doua metodă:

Introduceți în cerințele dumneavoastră.txt:

google-cloud-logging==3.0.0

ca cea mai recentă versiune la momentul scrierii.

din înregistrarea de import google.cloud ca gclogger

(sau numește-l după cum vrei)

și apelați json logging cu:

json_for_gcp_lbm = {MY_JSON_HERE}

    din înregistrarea de import google.cloud ca gclogger

    ...

    logging_client = gclogger.Client()
    logger_name = „MY_LOG_NAME_OF_FREE_CHOICE” # Salvat în jurnalele Google Cloud
    logger = logging_client.logger(nume_logger)

    # Nu știu cum ar funcționa cu `import logging` ca 
    # modulul Python încorporat, dar l-am făcut să funcționeze cu adăugarea
    # Următoarea linie nu funcționează
    # logging.info(json.dumps(json_for_gcp_lbm, default=str))
    # În schimb, avem nevoie 
    # https://cloud.google.com/logging/docs/samples/logging-write-log-entry#code-sample
    logger.log_struct(json_for_gcp_lbm)

Ceea ce duce la o ieșire jsonPayload:

introduceți descrierea imaginii aici

Și apoi puteți alege orice etichetă din json în meniul „Creare logs metric” (Metrici bazate pe jurnal / LBM):

introduceți descrierea imaginii aici

questionto42standswithUkraine avatar
drapel mx
Nu știu cum ar obține jsonPayload folosind `import logging` ca modul Python încorporat în primul link, totuși :). Când utilizați doar ultima linie a exemplului, acesta oferă în schimb doar `textPayload`. Probabil, am nevoie de partea `request` cu acel `global_log_fields = {}` pentru a o face să funcționeze. Cred că `import google.cloud.logging` este mai „pythonic” atunci, chiar dacă trebuie să instalez și să import google cloud logging pentru asta.
questionto42standswithUkraine avatar
drapel mx
Mic bonus, nu întrebasem asta, am văzut asta întâmplător: există un pasaj mai jos pe aceeași pagină a primului tău link despre cum aș putea accesa și noile jurnale create `google.cloud.logging` cu `jsonPayload` intrări din interiorul CF, consultați [Utilizarea API-ului Logging](https://cloud.google.com/functions/docs/monitoring/logging#using_the_logging_api).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.