ใช้ Stackdriver Logging และ Stackdriver Trace สำหรับ Cloud Functions

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ประโยชน์จากเครื่องมือการบันทึกและตรวจสอบที่พร้อมให้นักพัฒนาซอฟต์แวร์ทุกคนที่ทำงานกับ Cloud Functions เครื่องมือดังกล่าวมาพร้อมกับ Cloud Function ทั้งหมดที่คุณสามารถใช้ได้ในทุกภาษาที่รองรับ และควรจะช่วยให้คุณเขียนและเรียกใช้โค้ดแบบ Serverless ได้อย่างมีประสิทธิภาพยิ่งขึ้น

5815064fec87444b.png

คุณจะใช้ Cloud Function ที่ทริกเกอร์ HTTP ได้ แต่ข้อมูลทั้งหมดที่ครอบคลุมจะมีผลกับภาษาอื่นๆ และ Cloud Functions ที่ทริกเกอร์โดยเหตุการณ์อื่นๆ ด้วย

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID ในภายหลัง

  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

Cloud Shell

แม้ว่าคุณจะใช้ Cloud Functions รวมถึงความสามารถในการบันทึกและตรวจสอบจากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานใน Google Cloud

เครื่องเสมือนแบบ Debian นี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก ซึ่งหมายความว่าสิ่งที่คุณต้องมีสำหรับ Codelab นี้คือเบราว์เซอร์ (ใช่แล้ว ทั้งหมดนี้ทำงานได้บน Chromebook)

  1. หากต้องการเปิดใช้งาน Cloud Shell จาก Cloud Console เพียงคลิกเปิดใช้งาน Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (จะใช้เวลาเพียงไม่นานในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม)

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 14-06-2017 เวลา 22.13.43 น.

เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าตนเองผ่านการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็น PROJECT_ID แล้ว

gcloud auth list

เอาต์พุตจากคำสั่ง

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากโปรเจ็กต์ไม่ได้ตั้งค่าไว้ด้วยเหตุผลบางประการ ให้ใช้คำสั่งต่อไปนี้

gcloud config set project <PROJECT_ID>

กำลังมองหา PROJECT_ID ของคุณอยู่ใช่ไหม ตรวจสอบรหัสที่คุณใช้ในขั้นตอนการตั้งค่าหรือดูในแดชบอร์ด Cloud Console

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell ยังตั้งค่าตัวแปรสภาพแวดล้อมโดยค่าเริ่มต้นด้วย ซึ่งอาจเป็นประโยชน์เมื่อคุณเรียกใช้คำสั่งในอนาคต

echo $GOOGLE_CLOUD_PROJECT

เอาต์พุตจากคำสั่ง

<PROJECT_ID>
  1. สุดท้าย ให้ตั้งค่าโซนและการกำหนดค่าโปรเจ็กต์เริ่มต้น
gcloud config set compute/zone us-central1-f

คุณเลือกโซนต่างๆ ได้หลากหลาย ดูข้อมูลเพิ่มเติมได้ที่ภูมิภาคและ โซน

3. ทำให้ Cloud Function อย่างง่ายใช้งานได้

เพื่อให้มีการตรวจสอบ ให้สร้างข้อความ "สวัสดีชาวโลก" Cloud Function ในเมนูด้านซ้ายของ Google Cloud Console ให้คลิก Cloud Functions แล้วคลิกสร้างฟังก์ชัน

3c13aa20af602aa7.png

ป้อน " Hello-monitor" เป็นชื่อ Cloud Function ใหม่

fa6816c96d6d5b94.png

เก็บค่าเริ่มต้นทั้งหมดสำหรับซอร์สโค้ดไว้ (อย่างไรก็ตาม คุณเลือกภาษา/รันไทม์อื่นได้หากต้องการ)

7aadf164450484e.png

สุดท้ายให้คลิกสร้าง

dc74cd21000d6c91.png

คุณควรเห็น Cloud Function แสดงอยู่โดยมีเครื่องหมายถูกสีเขียวอยู่ข้างๆ ซึ่งหมายความว่าพร้อมที่จะเรียกใช้แล้ว

5363a34eb001d5ed.png

4. ทดสอบ Cloud Function และส่งการรับส่งข้อมูลโดยใช้ตัวสร้างโหลด

เมื่อทำให้ Cloud Function ใช้งานได้เรียบร้อยแล้ว ให้ทดสอบจากบรรทัดคำสั่ง

ก่อนอื่นให้ใช้คำสั่งต่อไปนี้โดยใช้ Cloud Shell

$ gcloud functions describe hello-monitor

การดำเนินการนี้ควรแสดงคำอธิบายของ Cloud Function รวมถึง URL สำหรับ httpsTrigger ซึ่งเป็นปลายทาง HTTP(S) ที่จะเรียกใช้ Cloud Function ซึ่งควรมีลักษณะดังนี้ https://<region>-<project-id>.cloudfunctions.net/hello-monitor

ตอนนี้การทริกเกอร์ Cloud Function ควรทำได้ง่ายพอๆ กับการใช้คำสั่ง curl ใน URL ดังกล่าว

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

ตอนนี้ให้ใช้ Vegeta ซึ่งเป็นเครื่องมือทดสอบการโหลด HTTP ที่ใช้งานง่าย หากต้องการติดตั้ง จาก Cloud Shell ให้พิมพ์คำสั่งต่อไปนี้ :

$ go get -u github.com/tsenart/vegeta

หากต้องการส่งการรับส่งข้อมูลไปยัง Cloud Function (5 คำขอต่อวินาทีเป็นเวลา 2 นาที) ให้ใช้คำสั่งต่อไปนี้

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. ไปยังส่วนต่างๆ ในบันทึก

คลิกดูบันทึกจากมุมมองรายละเอียดของ Cloud Function

b24157fd3376e6a8.png

จากนั้นระบบควรนำคุณไปยังส่วน Stackdriver Logging ของโปรเจ็กต์ ซึ่งจะแสดงเฉพาะบันทึก Cloud Function เท่านั้น

5a36fa75d2fb0165.png

คำขอทั้งหมดที่ส่งไปยัง Cloud Function ควรจะแสดงรหัสสถานะ 200

เมื่อดูบันทึก คุณสามารถดำเนินการดังต่อไปนี้

  • กรองตามระดับการบันทึก (ในกรณีของคุณ บันทึกทั้งหมดจะเป็นระดับ debug)
  • เลือกกรอบเวลาที่เจาะจง (สัมพัทธ์หรือสัมบูรณ์)
  • เปิดใช้การสตรีมบันทึก (โดยเปิด Play 751a4600016f34a7.pngที่ด้านบนของหน้าจอ)
  • คัดลอกลิงก์ไปยังรายการบันทึก (สำหรับแชร์กับสมาชิกในทีม)
  • แสดงรายการบันทึกในบริบททรัพยากร
  • ปักหมุดรายการบันทึก (เป็นสัญลักษณ์ภาพ)
  • ส่งออกบันทึกไปยัง BigQuery, Cloud Storage หรือ Pub/Sub (หรือดาวน์โหลดเป็นไฟล์ JSON หรือ CSV)

6. อัปเดตฟังก์ชัน

เมื่อใช้ Cloud Console ให้ไปที่มุมมองรายละเอียดฟังก์ชัน แล้วสังเกตการเพิ่มขึ้นอย่างรวดเร็วที่คุณสร้างขึ้นด้วยผู้ทดสอบการโหลดของจำนวนการเรียกใช้ต่อวินาทีและเวลาดำเนินการ

aaee3159bbe395d3.png 7ed347101da5eca0.png

เครื่องมืออีกอย่างที่มีรายละเอียดมากขึ้นในการสังเกตเวลาในการตอบสนองและการเรียกใช้ RPC คือการติดตาม Stackdriver แต่ก่อนที่จะใช้งานได้ คุณจะต้องทำการเปลี่ยนแปลงบางอย่างกับ Cloud Functions ทำสิ่งต่อไปนี้:

  1. เพิ่มแพ็กเกจ node-emoji แบบประหยัดค่าใช้จ่ายเป็นทรัพยากร Dependency
  2. อัปเดตรหัสฟังก์ชันเพื่อใช้โมดูลอีโมจิของโหนดและแนะนำเวลาในการตอบสนอง
  3. เพิ่มตัวแปรสภาพแวดล้อมเพื่อเปิดใช้ Stackdriver Trace สำหรับ Cloud Functions

จากรายละเอียดฟังก์ชัน ให้คลิกแก้ไขเพื่อแก้ไขฟังก์ชัน

39b0f8f98b18a6c0.png

แก้ไขไฟล์ package.json เพื่อเพิ่มทรัพยากร Dependency สำหรับแพ็กเกจ node-emoji

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

แก้ไขฟังก์ชันจริงโดยเปลี่ยนเนื้อหาของ index.js เป็นดังนี้

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

ซึ่งเป็นการเพิ่มอีโมจิแบบสุ่มลงในข้อความที่ Cloud Function แสดงผลหลังจากหยุดชั่วคราวเป็นเวลา 300 มิลลิวินาที

สุดท้าย ให้เพิ่มตัวแปรสภาพแวดล้อม Cloud Function ที่ชื่อ GOOGLE_CLOUD_TRACE_ENABLED และตั้งค่าเป็น true ดังนี้

9205bd277b76aa21.png

คลิกบันทึก

กลับไปที่ Cloud Shell และเรียกคืนคำสั่งเพื่อสร้างโหลดบางส่วนบน Cloud Function ที่ทำให้ใช้งานได้ใหม่

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

ตอนนี้คุณพร้อมที่จะสังเกตรายการการติดตามที่สร้างขึ้นโดยไม่มีข้อกำหนดการตั้งค่าอื่นๆ และไม่มีไลบรารีการติดตามที่เฉพาะเจาะจงในโค้ดแล้ว

7. ติดตาม Cloud Function ที่อัปเดตแล้ว

ไปที่รายการการติดตาม (ในส่วน Stackdriver Trace) โดยใช้เมนูด้านซ้าย

576373f38cad6f8.png

คุณควรจะเห็นสิ่งที่คล้ายกับภาพหน้าจอต่อไปนี้

44a36b758b49f88f.png

ซึ่งน่าจะแสดงให้เห็นอย่างชัดเจนว่าเวลาในการตอบสนองที่ใช้ใน Cloud Function นั้นวัดที่ 300 มิลลิวินาที

แต่ละจุดบนกราฟเป็นคำขอที่คุณสามารถดูรายละเอียดต่างๆ เช่น การประทับเวลา, เมธอด HTTP และสถานะ, ป้ายกำกับ, ลิงก์ไปยังรายการบันทึกที่เกี่ยวข้อง และการเรียกใช้ RPC ที่ตามมาซึ่ง Cloud Function สร้างขึ้น

5815064fec87444b.png

หากต้องการซูมเข้า เพียงแค่คลิกและลากบนกราฟ การเลือกช่วงเวลาที่กำหนดเองในกราฟการติดตาม

หากต้องการซูมออก ให้คลิกยกเลิกการซูมที่ด้านบนของหน้า

เนื่องจากคุณทำให้ Cloud Function เดียวใช้งานได้ กราฟจึงแสดงเฉพาะคำขอ GET ใน URI hello-monitor แต่คุณจะกรองการติดตามได้ด้วยเมธอด HTTP (GET, POST, DELETE) ตามสถานะ HTTP (2XX, 3XX) หรือใช้ตัวกรองคำขอก็ได้

ไปที่ภาพรวมในเมนูด้านซ้ายมือ

e920cfca2a50899e.png

คุณจะดูการติดตามล่าสุดและข้อมูลเชิงลึกอื่นๆ ได้จากหน้าภาพรวมนี้

ef5a45647967d275.png

นอกจากนี้คุณยังสามารถสร้างรายงานที่กำหนดเองโดยใช้ตัวกรองคำขอ URI, เมธอด HTTP, สถานะ HTTP และช่วงเวลาร่วมกันได้อีกด้วย ยิ่งไปกว่านั้น ยังช่วยให้คุณเปรียบเทียบค่าที่สร้างขึ้นกับเกณฑ์พื้นฐานตามเวลาได้อีกด้วย

5bd34e9d13b47fb6.png

หากตั้งค่าช่วงเวลาที่ถูกต้องโดยมีจุดข้อมูลเพียงพอ คุณสามารถสร้างรายงานที่แสดงการเปลี่ยนแปลงเวลาในการตอบสนองที่สำคัญระหว่าง Cloud Function เริ่มต้นและฟังก์ชันใหม่ได้

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

รายงานที่กำหนดเองดังกล่าวสามารถใช้ค้นหาเวลาที่เกิดปัญหาด้านประสิทธิภาพและติดตามตัวบ่งชี้ระดับบริการ (SLI) เช่น เวลาในการตอบสนองคำขอของผู้ใช้ปลายทาง

8. ได้เวลาล้างข้อมูลทรัพยากรแล้ว

Codelab จบลงเพียงเท่านี้

แม้ว่า Cloud Functions และเครื่องมือ Stackdriver จะเป็นแพลตฟอร์มแบบ Serverless ซึ่งไม่มีค่าใช้จ่ายเมื่อไม่ได้ใช้งาน โปรดเป็นพลเมืองระบบคลาวด์ที่ดีและลบ Cloud Function เพียงเลือก hello-monitor ในส่วนภาพรวมในส่วนฟังก์ชันระบบคลาวด์ แล้วคลิกลบ

aceb633cf70a4a27.png

9. ขั้นตอนถัดไปคือ

นี่คือข้อมูลเพิ่มเติมบางส่วน

/