การบันทึกและการติดตาม Codelab ของ Cloud Functions

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

เราจะใช้ฟังก์ชันที่ทริกเกอร์ HTTP ที่นี่ แต่ทุกอย่างที่เรากล่าวถึงจะมีผลกับภาษาอื่นๆ และฟังก์ชันที่เหตุการณ์อื่นทริกเกอร์ (ที่เก็บข้อมูล pub/sub ฯลฯ)

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

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

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

การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน (ดู "cleanup" ในตอนท้ายของเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรี $300

Google Cloud Shell

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

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

หากต้องการเปิดใช้งาน Google Cloud Shell เพียงคลิกปุ่มด้านขวาบนของคอนโซลของนักพัฒนาซอฟต์แวร์ (ใช้เวลาเพียงไม่กี่นาทีในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม) โดยทําดังนี้

เมื่อเปิดใช้งาน CloudShell

คลิกปุ่ม "เริ่ม Cloud Shell"

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

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

gcloud auth list

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

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

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

[core]
project = <PROJECT_ID>

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

echo $GOOGLE_CLOUD_PROJECT

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

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

กําลังมองหา PROJECT_ID ของคุณอยู่ใช่ไหม โปรดดูรหัสที่คุณใช้ในขั้นตอนการตั้งค่าหรือค้นหาในแดชบอร์ดของคอนโซล

Project_ID.png

ข้อสําคัญ: สุดท้าย กําหนดโซนเริ่มต้นและการกําหนดค่าโปรเจ็กต์ดังนี้

gcloud config set compute/zone us-central1-f

คุณเลือกได้หลายโซน ดูข้อมูลเพิ่มเติมในเอกสารประกอบเกี่ยวกับภูมิภาคและภูมิภาค

เพื่อที่จะได้มีสิ่งที่จะตรวจสอบ เรามาสร้างฟังก์ชันระบบคลาวด์ Hello World กัน ในเมนูด้านซ้ายของ Console ให้คลิก Cloud Functions แล้วคลิก "Create function" :

ตั้งชื่อฟังก์ชันใหม่ "hello-monitor" :

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

สุดท้าย ให้สร้างฟังก์ชันโดยใช้ปุ่ม "Create"

หลังจากผ่านไปสักครู่ คุณควรจะเห็นฟังก์ชันที่พร้อมเรียกใช้ (ตามที่ระบุไว้ในเครื่องหมายถูกสีเขียว) :

เมื่อคุณทําให้ฟังก์ชันระบบคลาวด์ใช้งานได้เรียบร้อยแล้ว เราจะทดสอบจากบรรทัดคําสั่ง

ขั้นแรก ให้ใช้ Cloud Shell เพื่อเรียกใช้คําสั่งต่อไปนี้

$ gcloud functions describe hello-monitor

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

การทริกเกอร์ฟังก์ชันควรเรียบง่ายพอๆ กับ curl'URL นี้ :

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

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

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

หากต้องการส่งการเข้าชมไปยังฟังก์ชันระบบคลาวด์ (คําขอ 5 รายการต่อวินาทีเป็นเวลา 2 นาที) ให้ใช้คําสั่งนี้

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

จากมุมมองรายละเอียดฟังก์ชัน ให้คลิก "ดูบันทึก" เมนูด้านขวามือ :

ซึ่งจะนําคุณไปยังส่วน Stackdriver Logging ของโปรเจ็กต์ โดยแสดงเฉพาะบันทึกฟังก์ชันระบบคลาวด์ :

เราหวังว่าคําขอทั้งหมดที่ส่งไปยังฟังก์ชันจะแสดงรหัสสถานะ 200

ผู้ดูบันทึกนี้ช่วยให้คุณทําสิ่งต่อไปนี้ได้

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

โปรดทราบว่าตัวเลือกด้านซ้ายบนที่คุณสามารถกรองบันทึกตามฟังก์ชันได้ นอกจากนี้ยังค้นหาป้ายกํากับหรือการค้นหาข้อความแบบเต็มในแถบค้นหาที่ด้านบนของหน้าต่างได้ด้วย ในกรณีของเรา ป้ายกํากับคือ hello-monitor (ชื่อฟังก์ชัน) รวมถึงตัวระบุการดําเนินการสําหรับคําขอแต่ละรายการ

คุณคัดลอกตัวกรองเพื่อแชร์ได้ (ดูเมนูแบบเลื่อนลงในช่องค้นหา) :

ไปที่คอนโซล"รายละเอียดฟังก์ชัน" ดูและสังเกตการเพิ่มขึ้นอย่างฉับพลันที่เราสร้างด้วยเครื่องมือทดสอบการโหลดของเรา ทั้งในแง่ของจํานวนการเรียกใช้ต่อวินาทีและเวลาในการเรียกใช้ :

เครื่องมือโดยละเอียดอีกรูปแบบหนึ่งสําหรับสังเกตเวลาในการตอบสนองและการเรียกใช้ RPC คือฟีเจอร์ Stackdriver Trace แต่ก่อนที่เราจะใช้ฟีเจอร์นี้ได้ คุณต้องทําการเปลี่ยนแปลงบางอย่างกับฟังก์ชันของเรา ได้แก่

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

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

แก้ไขไฟล์ 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
  
};

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

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

อย่าลืมคลิก "บันทึก"

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

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

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

โดยใช้เมนูนําทางด้านซ้ายเพื่อไปยังรายการติดตาม (ภายใต้การติดตามการติดตาม) :

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

ซึ่งควรเห็นได้ชัดว่าเวลาในการตอบสนองที่แสดงในฟังก์ชันของเราวัดได้ที่ 300 มิลลิวินาที

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

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

หากต้องการซูมออก ให้คลิกปุ่ม "เลิกทํา Zoom" ที่ด้านบนของหน้า

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

ไปที่ส่วน Trace "overview" ในเมนูด้านซ้าย :

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

... รวมทั้งความสามารถในการสร้างรายงานที่กําหนดเองตามชุดค่าผสมของตัวกรองคําขอ URI, เมธอด HTTP, สถานะ HTTP และช่วงเวลา และยังช่วยให้คุณเปรียบเทียบค่าที่สร้างกับเกณฑ์เวลา ได้อีกด้วย

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

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

วิธีนี้เป็นการสรุป Codelab ของเราที่ครอบคลุมการติดตั้งใช้งานฟังก์ชันระบบคลาวด์ใหม่ การตรวจสอบบันทึก และการสังเกตการติดตามคําขอ

แม้ว่า Cloud Functions และเครื่องมือ Stackdriver จะเป็นแพลตฟอร์มแบบ Serverless ที่ไม่มีค่าใช้จ่ายระหว่างการใช้งาน การเป็นพลเมืองในระบบคลาวด์ที่ดีช่วยให้เราลบฟังก์ชันของเราได้

เพียงเลือกฟังก์ชัน hello-monitor ในหน้าภาพรวม Cloud Functions แล้วคลิก "delete"

การดําเนินการนี้สิ้นสุด Codelab การเริ่มต้นใช้งานแบบง่ายที่มีการบันทึกและการติดตามฟังก์ชันระบบคลาวด์

การติดตามผลต่อไปนี้มีดังนี้

/