Score:2

jsonPayload (การบันทึกที่มีโครงสร้าง) เอาต์พุตจากการบันทึกของ Python Google Cloud Function ที่จำเป็นในการสร้าง Log-Based Metrics (LBM) ใน GCP

ฉันต้องการ jsonน้ำหนักบรรทุก ในบันทึกของ Google Cloud Function แทน ข้อความเพย์โหลด. เป้าหมายของฉันคือการใช้คีย์ของพจนานุกรมเป็นป้ายกำกับ (ดู ป้ายกำกับเมตริกตามบันทึก) สำหรับ Log-Based Metrics เพื่อให้สามารถระบุสิ่งเหล่านี้ได้ใน Grafana

ฉันใช้ Python ของ เข้าสู่ระบบ โมดูล แต่ฉันสามารถเปลี่ยนเป็นอย่างอื่นได้หากจำเป็น

ฉันต้องการเป็นผลลัพธ์ในบันทึก:

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

แต่ฉันได้รับ ข้อความเพย์โหลด เอาต์พุตแทน บรรทัดถัดไปทั้งหมดเป็นสตริง:

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

ตัวอย่างจริงจากบันทึก ตรงกลาง คุณเห็น ข้อความเพย์โหลด:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพเป็นข้อความ:

{
รหัสแทรก: "000000-1b431ffd-e42d-4f83-xyz"
ป้ายกำกับ: {1}
ชื่อบันทึก: "projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
การประทับเวลารับ: "2022-02-08T15:43:41.808217166Z"
ทรัพยากร: {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"}}"
การประทับเวลา: "2022-02-08T15:43:32.460Z"
ติดตาม: "โครงการ/MY_PROJECT/traces/dd97759176248586a3d3xyz"
}

พยายามครั้งแรก

อ่านจาก https://cloud.google.com/logging/docs/structured-logging:

ใน Cloud Logging บันทึกที่มีโครงสร้างหมายถึงรายการบันทึกที่ใช้ฟิลด์ jsonPayload เพื่อเพิ่มโครงสร้างให้กับเพย์โหลด การบันทึกที่มีโครงสร้างใช้กับบันทึกที่ผู้ใช้เขียน

ฉันพยายามรับ "การบันทึกแบบมีโครงสร้าง" ต่อไปนี้ การเขียนบันทึกที่มีโครงสร้าง โดย

logging.info(json.dumps(json_for_gcp_lbm))

แต่ก็ไม่มีประโยชน์

เพิ่มเติมในลิงก์: มีตัวแทนการบันทึกในตัวจาก GCP ที่ใช้ คล่องแคล่ว เกี่ยวกับ เกี่ยวกับตัวแทนการบันทึก ดูเหมือนจะใช้ได้เฉพาะกับ Google Kubernetes Engine หรือ App Engine ไม่ใช่ในฟังก์ชัน Google Cloud:

หากคุณใช้ Google Kubernetes Engine หรือ App Engine แบบยืดหยุ่น คุณสามารถเขียนบันทึกที่มีโครงสร้างเป็นวัตถุ JSON ที่ทำให้เป็นอนุกรมได้ ในบรรทัดเดียวเป็น stdout หรือ stderr จากนั้นตัวแทนการบันทึกจะส่ง บันทึกที่มีโครงสร้างไปยัง Cloud Logging เป็น jsonPayload ของ LogEntry โครงสร้าง.

ฉันจะได้รับ jsonน้ำหนักบรรทุก ในผลลัพธ์นี้?

mdobrucki avatar
tr flag
ฉันเข้าใจถูกต้องหรือไม่ ผลลัพธ์ที่คุณระบุมาจากการใช้[ตัวอย่าง](https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs) คุณใช้ไพ ธ อนเวอร์ชันใด
questionto42standswithUkraine avatar
@mdobrucki ใช่ ฉันใช้ `logging.info(json.dumps(json_for_gcp_lbm))` ซึ่งนำมาจากตัวอย่างของลิงก์นั้น แต่ฉันใช้แค่บรรทัดสุดท้ายของตัวอย่างนั้น หวังว่ามันจะทำได้ ฉันใช้ฟังก์ชั่นคลาวด์ `Python 3.9`
mdobrucki avatar
tr flag
หากคุณใช้ python 3.9 ตัวอย่างที่ให้ไว้ใน docs ควรทำตามเคล็ดลับ ตรวจสอบให้แน่ใจว่าได้ปฏิบัติตามอย่างถูกต้องและจัดโครงสร้างข้อมูลของคุณตามนั้น คุณได้พิจารณาใช้ไลบรารีของไคลเอ็นต์ Logging กับ[ตัวอย่าง](https://cloud.google.com/logging/docs/reference/libraries#write_structured_logs)นี้แล้วหรือยัง
questionto42standswithUkraine avatar
@mdobrucki ไม่ฉันต้องดูแลสิ่งนั้นตั้งแต่ฉันค้นหา "structured json" โดยตรงแทน ฉันจะตรวจสอบกับห้องสมุดของ Google และใช้ตัวบันทึกของตัวอย่าง
mdobrucki avatar
tr flag
แจ้งให้เราทราบว่าคุณได้จัดตั้งอะไร
questionto42standswithUkraine avatar
@mdobrucki ใช่ มันได้ผล ความผิดของฉันเนื่องจากคำแนะนำในลิงก์นั้นค่อนข้างชัดเจน ฉันมีปัญหากับคลาส datetime - ฉันได้รับ `google.protobuf.json_format.ParseError: Value 2022-02-09 13:27:35.067000+00:00 มีประเภทที่ไม่คาดคิด `. แต่แก้ไขได้ด้วย `str()` รอบคลาส datetime นั้น ตอนนี้สามารถใช้ `.strftime()` เพื่อทำให้เป็นสตริงได้ `default=str` เป็นพารามิเตอร์ว่าคุณจะใช้มันอย่างไรในโมดูล Python ในตัว `การบันทึก` ไม่ทำงาน อย่างไรก็ตาม คุณอาจตอบได้หากต้องการ จากนั้นฉันอาจ "แก้ไข" ตัวอย่างของฉันว่าฉันทำงานอย่างไร
Score:1
ธง tr

คุณสามารถตั้งค่าการบันทึกที่มีโครงสร้างตาม ตัวอย่าง ในเอกสารตรวจสอบให้แน่ใจว่าเวอร์ชันไพ ธ อนของคุณคือ 3.8 หรือสูงกว่า อีกวิธีหนึ่งในการบรรลุผลคือการใช้ การบันทึกไลบรารีไคลเอ็นต์.

ตัวอย่างจาก OP สำหรับวิธีที่สอง:

ใส่ข้อกำหนดของคุณ txt:

google-cloud-logging==3.0.0

เป็นเวอร์ชันล่าสุด ณ เวลาที่เขียน

จากการบันทึกการนำเข้า google.cloud เป็น gclogger

(หรือตั้งชื่อตามที่คุณต้องการ)

และเรียกการบันทึก json ด้วย:

json_for_gcp_lbm = {MY_JSON_HERE}

    จากการบันทึกการนำเข้า google.cloud เป็น gclogger

    ...

    logging_client = gclogger.Client()
    logger_name = "MY_LOG_NAME_OF_FREE_CHOICE" # บันทึกไว้ในบันทึกของ Google Cloud
    คนตัดไม้ = logging_client.logger (ชื่อคนตัดไม้)

    # ฉันไม่รู้ว่ามันจะทำงานอย่างไรกับ `นำเข้าการบันทึก` เป็นไฟล์ 
    # โมดูล Python ในตัว แต่ฉันใช้งานได้กับการเพิ่ม
    # บรรทัดต่อไปนี้ไม่ทำงาน
    # logging.info(json.dumps(json_for_gcp_lbm, default=str))
    #แต่เราต้องการ 
    # https://cloud.google.com/logging/docs/samples/logging-write-log-entry#code-sample
    logger.log_struct(json_for_gcp_lbm)

ซึ่งนำไปสู่เอาต์พุต jsonPayload:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคุณสามารถเลือกป้ายกำกับใดก็ได้จาก json ในเมนู "สร้างเมตริกบันทึก" (เมตริกตามบันทึก / LBM):

ป้อนคำอธิบายรูปภาพที่นี่

questionto42standswithUkraine avatar
ฉันไม่รู้ว่าจะได้รับ jsonPayload โดยใช้ `การนำเข้าการบันทึก' เป็นโมดูล Python ในตัวในลิงก์แรกได้อย่างไร :) เมื่อใช้เฉพาะบรรทัดสุดท้ายของตัวอย่าง จะให้เฉพาะ `textPayload` แทน เป็นไปได้ว่าฉันต้องการส่วน `request` กับ `global_log_fields = {}` เพื่อให้มันใช้งานได้ ฉันคิดว่า `นำเข้า google.cloud.logging` เป็น "pythonic" มากกว่า แม้ว่าฉันจะต้องติดตั้งและนำเข้าการบันทึกบนคลาวด์ของ Google สำหรับสิ่งนี้
questionto42standswithUkraine avatar
โบนัสเล็กน้อย ฉันไม่ได้ถามสิ่งนี้ แต่เห็นสิ่งนี้โดยบังเอิญ: มีข้อความถัดไปในหน้าเดียวกันของลิงก์แรกของคุณเกี่ยวกับวิธีที่ฉันสามารถเข้าถึง `google.cloud.logging` ใหม่ที่ทำบันทึกด้วย `jsonPayload` จากภายใน CF โปรดดู [การใช้ Logging API](https://cloud.google.com/functions/docs/monitoring/logging#using_the_logging_api)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา