Lớp học lập trình về ghi nhật ký và theo dõi Cloud Functions

Mục tiêu của lớp học lập trình này là giúp bạn hiểu cách tận dụng các công cụ ghi nhật ký và giám sát được cung cấp cho tất cả nhà phát triển Cloud Functions. Những công cụ này đi kèm với mọi Cloud Function mà bạn triển khai trên tất cả các ngôn ngữ được hỗ trợ và sẽ giúp bạn làm việc hiệu quả hơn khi viết và vận hành mã không cần máy chủ.

Ở đây, chúng ta sẽ sử dụng một hàm được kích hoạt bằng HTTP, nhưng mọi thứ chúng ta đề cập cũng áp dụng cho các ngôn ngữ khác và cho các hàm được kích hoạt bằng các sự kiện khác (bộ chứa lưu trữ, pub/sub, v.v.)

Thiết lập môi trường theo tốc độ của riêng bạn

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "dọn dẹp" ở cuối tài liệu này).

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.

Google Cloud Shell

Mặc dù bạn có thể sử dụng Google Cloud Functions và các chức năng ghi nhật ký cũng như giám sát của dịch vụ này từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Máy ảo dựa trên Debian này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.

Để kích hoạt Google Cloud Shell, trong bảng điều khiển dành cho nhà phát triển, bạn chỉ cần nhấp vào nút ở phía trên cùng bên phải (mất vài giây để cung cấp và kết nối với môi trường):

activateCloudShell.png

Nhấp vào nút "Start Cloud Shell" (Bắt đầu Cloud Shell):

Screen Shot 2017-06-14 at 10.13.43 PM.png

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID :

gcloud auth list

Đầu ra của lệnh

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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Cloud Shell cũng thiết lập một số biến môi trường theo mặc định. Các biến này có thể hữu ích khi bạn chạy các lệnh trong tương lai.

echo $GOOGLE_CLOUD_PROJECT

Đầu ra của lệnh

<PROJECT_ID>

Nếu vì lý do nào đó mà dự án chưa được thiết lập, bạn chỉ cần đưa ra lệnh sau :

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Kiểm tra mã nhận dạng bạn đã dùng trong các bước thiết lập hoặc tìm mã nhận dạng đó trong trang tổng quan của bảng điều khiển:

Project_ID.png

QUAN TRỌNG: Cuối cùng, hãy đặt cấu hình dự án và vùng mặc định:

gcloud config set compute/zone us-central1-f

Bạn có thể chọn nhiều múi giờ khác nhau. Tìm hiểu thêm trong tài liệu về Khu vực và múi giờ.

Để có thứ gì đó cần theo dõi, hãy tạo một hàm đám mây Hello World. Trong trình đơn bên trái của Bảng điều khiển, hãy nhấp vào Cloud Functions, sau đó nhấp vào "Create function" :

Đặt tên cho hàm mới là "hello-monitor" :

... và giữ nguyên tất cả các giá trị mặc định cho mã nguồn (tuy nhiên, bạn có thể chọn một ngôn ngữ/thời gian chạy khác nếu muốn) :

Cuối cùng, hãy tạo hàm bằng nút "Create":

Sau một khoảng thời gian ngắn, bạn sẽ thấy hàm của mình xuất hiện dưới dạng sẵn sàng được gọi (như dấu kiểm màu xanh lục cho biết) :

Giờ đây, khi hàm trên đám mây đã được triển khai thành công, chúng ta sẽ kiểm thử hàm này qua dòng lệnh.

Trước tiên, hãy sử dụng Cloud Shell để phát lệnh sau :

$ gcloud functions describe hello-monitor

Thao tác này sẽ trả về nội dung mô tả về hàm, bao gồm cả URL cho httpsTrigger. Đây là điểm cuối HTTP(S) để gọi hàm. Định dạng phải là : https://<region>-<project-id>.cloudfunctions.net/hello-monitor

Giờ đây, việc kích hoạt hàm sẽ đơn giản như curl URL này :

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

Bây giờ, chúng ta sẽ sử dụng Vegeta, một công cụ kiểm thử tải HTTP đơn giản. Để cài đặt gói này, trong Cloud Shell, bạn chỉ cần nhập lệnh sau :

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

Để gửi một số lưu lượng truy cập đến hàm đám mây (5 yêu cầu mỗi giây trong vài phút), hãy sử dụng lệnh sau :

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

Trong chế độ xem chi tiết hàm, hãy nhấp vào trình đơn bên phải "Xem nhật ký":

Thao tác này sẽ đưa bạn đến phần Stackdriver Logging của dự án, chỉ cho bạn thấy nhật ký hàm trên đám mây :

Hy vọng rằng tất cả các yêu cầu đối với hàm của bạn đều trả về mã trạng thái 200.

Khi sử dụng trình xem nhật ký này, bạn có thể :

  • lọc theo cấp độ nhật ký (trong trường hợp này, tất cả nhật ký đều ở cấp độ Debug)
  • chọn một khung thời gian cụ thể (tương đối hoặc tuyệt đối)
  • bật tính năng truyền trực tuyến nhật ký ("nút phát" ở đầu màn hình)
  • sao chép đường liên kết đến mục nhật ký (để chia sẻ với các thành viên trong nhóm)
  • hiển thị một mục nhật ký trong ngữ cảnh tài nguyên
  • ghim một mục nhập nhật ký (dưới dạng tín hiệu trực quan)
  • xuất nhật ký sang BigQuery, Cloud Storage hoặc Cloud Pub/Sub (hoặc chỉ cần tải nhật ký xuống ở định dạng JSON hoặc CSV)

Ngoài ra, xin lưu ý rằng bạn có thể lọc nhật ký theo chức năng bằng bộ chọn ở trên cùng bên trái. Bạn cũng có thể tìm nhãn hoặc tìm kiếm toàn văn trong thanh tìm kiếm ở đầu cửa sổ. Trong trường hợp của chúng ta, nhãn là hello-monitor (tên của hàm) cũng như giá trị nhận dạng thực thi cho mỗi yêu cầu.

Bạn cũng có thể sao chép các bộ lọc để chia sẻ (hãy xem trình đơn thả xuống trong hộp tìm kiếm) :

Sử dụng bảng điều khiển, chuyển đến chế độ xem "Chi tiết hàm" và quan sát mức tăng đột biến mà chúng ta đã tạo bằng trình kiểm thử tải, cả về số lượng lệnh gọi mỗi giây và thời gian thực thi :

Một công cụ khác chi tiết hơn để quan sát độ trễ và các lệnh gọi RPC là tính năng Stackdriver Trace. Tuy nhiên, trước khi có thể sử dụng tính năng này, chúng ta cần thực hiện một số thay đổi đối với các hàm, cụ thể là:

  1. Thêm gói node-emoji cứu sinh làm phần phụ thuộc
  2. Cập nhật mã hàm để sử dụng mô-đun node-emoji và thêm một số độ trễ
  3. Thêm một biến môi trường để bật Stackdriver Trace cho Cloud Functions

Trên trang "Chi tiết hàm", hãy nhấp vào biểu tượng chỉnh sửa để sửa đổi hàm :

Chỉnh sửa tệp package.json để thêm một phần phụ thuộc cho gói node-emoji :

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

Chỉnh sửa hàm thực tế bằng cách thay đổi nội dung của index.js thành nội dung sau :

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
  
};

Thao tác này sẽ thêm một biểu tượng cảm xúc ngẫu nhiên vào thông báo do hàm trả về sau khi tạm dừng trong 300 mili giây.

Cuối cùng, hãy thêm một biến môi trường Cloud Functions có tên là GOOGLE_CLOUD_TRACE_ENABLED và đặt thành true như sau:

Đừng quên nhấp vào Lưu!

Bây giờ, hãy quay lại Cloud Shell và gọi lại lệnh để tạo một số tải cho hàm vừa triển khai :

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

Giờ đây, chúng ta đã sẵn sàng quan sát danh sách các dấu vết được tạo mà không cần các yêu cầu thiết lập khác và không cần thư viện theo dõi cụ thể trong mã của bạn!

Sử dụng trình đơn bên trái để chuyển đến Trace list (Danh sách dấu vết) (trong Stackdriver Trace) :

Bạn sẽ thấy nội dung tương tự như ảnh chụp màn hình này :

Điều này sẽ cho thấy rõ ràng rằng độ trễ được giới thiệu trong hàm của chúng ta thực sự được đo ở mức 300 mili giây.

Mỗi dấu chấm trên biểu đồ này là một yêu cầu mà bạn có thể xem thông tin chi tiết, chẳng hạn như dấu thời gian, phương thức và trạng thái HTTP, nhãn, đường liên kết quay lại mục nhật ký tương ứng và mọi lệnh gọi RPC tiếp theo mà hàm thực hiện :

Nếu bạn muốn phóng to, chỉ cần nhấp và kéo trên biểu đồ :Chọn một phạm vi thời gian tuỳ chỉnh trong biểu đồ theo dõi

Để thu nhỏ, hãy nhấp vào nút "Thu nhỏ" ở đầu trang.

Vì chúng ta đã triển khai một hàm duy nhất, nên biểu đồ chỉ cho thấy các yêu cầu GET trên URI hello-monitor, nhưng bạn có thể lọc dấu vết theo phương thức HTTP (GET, POST, DELETE, ...), theo trạng thái HTTP (2XX, 3XX, ...) hoặc bằng cách sử dụng bộ lọc yêu cầu.

Bây giờ, hãy chuyển đến phần "Tổng quan" về Dấu vết trong trình đơn bên trái :

Trên trang tổng quan này, bạn có thể tìm thấy các dấu vết gần đây và thông tin chi tiết khác.

... cũng như khả năng tạo báo cáo tuỳ chỉnh dựa trên sự kết hợp của bộ lọc yêu cầu URI, phương thức HTTP, trạng thái HTTP và phạm vi thời gian. Bạn thậm chí có thể so sánh các giá trị được tạo với đường cơ sở thời gian :

Nếu thiết lập được các phạm vi thời gian chính xác và có đủ điểm dữ liệu, bạn có thể tạo một báo cáo cho thấy sự thay đổi quan trọng về độ trễ giữa hàm ban đầu và hàm mới :

Bạn có thể dùng báo cáo tuỳ chỉnh như vậy để tìm thời điểm xuất hiện vấn đề về hiệu suất, cũng như theo dõi chỉ báo cấp độ dịch vụ (SLI) như độ trễ yêu cầu của người dùng cuối.

Đến đây là kết thúc lớp học lập trình của chúng ta. Lớp học này đã đề cập đến việc triển khai một hàm đám mây mới, điều hướng qua nhật ký của hàm đó và quan sát các dấu vết yêu cầu của hàm.

Mặc dù Cloud Functions và các công cụ Stackdriver là những nền tảng không máy chủ và sẽ không phát sinh chi phí khi không sử dụng, nhưng để trở thành một thành viên tích cực của cộng đồng đám mây, chúng ta hãy xoá hàm của mình.

Bạn chỉ cần chọn hàm hello-monitor trong trang tổng quan về Cloud Functions rồi nhấp vào "xoá".

Đến đây là kết thúc lớp học lập trình đơn giản này về cách bắt đầu sử dụng tính năng ghi nhật ký và dấu vết của Cloud Functions!

Sau đây là một số tài liệu đọc thêm :

/