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

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

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

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

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

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

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

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

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

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

Google Cloud Shell

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

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

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

activateCloudShell.png

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

Screen Shot 2017-06-14 at 10.13.43 PM.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

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

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

ตั้งชื่อฟังก์ชันใหม่ว่า "hello-monitor" โดยทำดังนี้

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

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

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

ตอนนี้ฟังก์ชัน Cloud ได้รับการติดตั้งใช้งานเรียบร้อยแล้ว เราจะทดสอบจากบรรทัดคำสั่ง

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

$ gcloud functions describe hello-monitor

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

ตอนนี้การเรียกใช้ฟังก์ชันควรจะง่ายเพียงแค่ curl'ing URL นี้

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

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

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

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

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

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

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

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

โปรแกรมดูบันทึกนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้

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

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

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

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

เครื่องมืออีกอย่างที่ละเอียดกว่าในการสังเกตเวลาในการตอบสนองและการเรียก RPC คือฟีเจอร์ Stackdriver Trace แต่ก่อนที่จะใช้ฟีเจอร์นี้ได้ เราต้องทำการเปลี่ยนแปลงฟังก์ชันบางอย่างก่อน ได้แก่

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

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

แก้ไขไฟล์ package.json เพื่อเพิ่มการอ้างอิงสำหรับแพ็กเกจ 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 Functions ที่ชื่อ 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

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

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

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

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

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

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

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

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

ตอนนี้ให้ไปที่ส่วน "ภาพรวม" ของการติดตามในเมนูด้านซ้าย

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

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

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

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

จบ Codelab นี้แล้ว ซึ่งครอบคลุมการทำให้ Cloud Function ใหม่ใช้งานได้ การไปยังส่วนต่างๆ ของบันทึก และการสังเกตร่องรอยคำขอ

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

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

จบ Codelab การเริ่มต้นใช้งาน Cloud Functions Logging และการติดตามอย่างง่ายนี้แล้ว

โปรดอ่านข้อมูลเพิ่มเติมต่อไปนี้

/