Các kỹ thuật quan sát thực tế cho ứng dụng AI tạo sinh trong JavaScript

1. Tổng quan

Các ứng dụng AI tạo sinh cũng cần khả năng quan sát như mọi ứng dụng khác. Có kỹ thuật quan sát đặc biệt nào cần thiết cho AI tạo sinh không?

Trong phòng thí nghiệm này, bạn sẽ tạo một ứng dụng AI tạo sinh đơn giản. Triển khai ứng dụng này lên Cloud Run. Đồng thời, hãy trang bị cho ứng dụng này các chức năng giám sát và ghi nhật ký thiết yếu bằng các sản phẩm và dịch vụ quan sát của Google Cloud.

Kiến thức bạn sẽ học được

  • Viết một ứng dụng sử dụng Vertex AI bằng Cloud Shell Editor
  • Lưu trữ mã xử lý ứng dụng của bạn trong GitHub
  • Sử dụng gcloud CLI để triển khai mã nguồn của ứng dụng vào Cloud Run
  • Thêm các chức năng giám sát và ghi nhật ký vào ứng dụng AI tạo sinh
  • Sử dụng các chỉ số dựa trên nhật ký
  • Triển khai tính năng ghi nhật ký và giám sát bằng Open Telemetry SDK
  • Tìm hiểu thông tin chi tiết về cách xử lý dữ liệu AI có trách nhiệm

2. Điều kiện tiên quyết

Nếu chưa có Tài khoản Google, bạn phải tạo một tài khoản mới.

3. Thiết lập dự án

  1. Đăng nhập vào Google Cloud Console bằng Tài khoản Google của bạn.
  2. Tạo một dự án mới hoặc chọn sử dụng lại một dự án hiện có. Ghi lại mã dự án của dự án mà bạn vừa tạo hoặc chọn.
  3. Bật tính năng thanh toán cho dự án.
    • Việc hoàn thành bài thực hành này sẽ tốn ít hơn 5 USD chi phí thanh toán.
    • Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
    • Người dùng mới đủ điều kiện dùng thử miễn phí trị giá 300 USD.
  4. Xác nhận rằng bạn đã bật tính năng thanh toán trong phần Dự án của tôi trong phần Thanh toán trên Cloud
    • Nếu dự án mới của bạn có trạng thái Billing is disabled trong cột Billing account:
      1. Nhấp vào biểu tượng ba dấu chấm trong cột Actions
      2. Nhấp vào Thay đổi thông tin thanh toán
      3. Chọn tài khoản thanh toán mà bạn muốn sử dụng
    • Nếu bạn đang tham dự một sự kiện trực tiếp, thì tài khoản đó có thể sẽ có tên là Tài khoản thanh toán dùng thử Google Cloud Platform

4. Chuẩn bị Cloud Shell Editor

  1. Chuyển đến Trình chỉnh sửa Cloud Shell. Nếu bạn thấy lời nhắc sau đây, yêu cầu uỷ quyền cho Cloud Shell gọi gcloud bằng thông tin đăng nhập của bạn, hãy nhấp vào Uỷ quyền để tiếp tục.
    Nhấp để uỷ quyền cho Cloud Shell
  2. Mở cửa sổ dòng lệnh
    1. Nhấp vào trình đơn có biểu tượng ba dấu gạch ngang Biểu tượng trình đơn ba đường kẻ
    2. Nhấp vào Terminal (Thiết bị đầu cuối)
    3. Nhấp vào New Terminal
      Mở cửa sổ dòng lệnh mới trong Trình chỉnh sửa Cloud Shell (Thiết bị đầu cuối mới)
  3. Trong thiết bị đầu cuối, hãy định cấu hình mã dự án của bạn:
    gcloud config set project [PROJECT_ID]
    
    Thay thế [PROJECT_ID] bằng mã dự án của bạn. Ví dụ: nếu mã dự án của bạn là lab-example-project, thì lệnh sẽ là:
    gcloud config set project lab-project-id-example
    
    Nếu bạn nhận được thông báo sau đây cho biết gcloud đang yêu cầu thông tin đăng nhập của bạn vào GCPI API, hãy nhấp vào Uỷ quyền để tiếp tục.
    Nhấp để uỷ quyền cho Cloud Shell
    Khi thực thi thành công, bạn sẽ thấy thông báo sau:
    Updated property [core/project].
    
    Nếu thấy biểu tượng WARNING và được yêu cầu Do you want to continue (Y/N)?, thì có thể bạn đã nhập sai mã dự án. Nhấn N, nhấn Enter rồi thử chạy lại lệnh gcloud config set project sau khi bạn tìm thấy mã dự án chính xác.
  4. (Không bắt buộc) Nếu bạn gặp vấn đề khi tìm mã dự án, hãy chạy lệnh sau để xem mã dự án của tất cả các dự án được sắp xếp theo thời gian tạo theo thứ tự giảm dần:
    gcloud projects list \
         --format='value(projectId,createTime)' \
         --sort-by=~createTime
    

5. Bật API của Google

Trong dòng lệnh, hãy bật các API của Google cần thiết cho lớp học này:

gcloud services enable \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     aiplatform.googleapis.com \
     logging.googleapis.com \
     monitoring.googleapis.com \
     cloudtrace.googleapis.com

Lệnh này sẽ mất một chút thời gian để hoàn tất. Cuối cùng, nó sẽ tạo ra một thông báo thành công tương tự như thông báo này:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

Nếu bạn nhận được thông báo lỗi bắt đầu bằng ERROR: (gcloud.services.enable) HttpError accessing và có thông tin chi tiết về lỗi như bên dưới, hãy thử lại lệnh sau khi chờ 1 đến 2 phút.

"error": {
  "code": 429,
  "message": "Quota exceeded for quota metric 'Mutate requests' and limit 'Mutate requests per minute' of service 'serviceusage.googleapis.com' ...",
  "status": "RESOURCE_EXHAUSTED",
  ...
}

6. Tạo ứng dụng NodeJS bằng AI tạo sinh

Trong bước này, bạn sẽ viết mã cho ứng dụng đơn giản dựa trên yêu cầu sử dụng mô hình Gemini để cho thấy 10 sự thật thú vị về một loài động vật mà bạn chọn. Hãy làm theo các bước sau để tạo mã xử lý ứng dụng.

  1. Trong thiết bị đầu cuối, hãy tạo thư mục codelab-o11y:
    mkdir ~/codelab-o11y
    
  2. Thay đổi thư mục hiện tại thành codelab-o11y:
    cd ~/codelab-o11y
    
  3. Khởi động package.json của ứng dụng NodeJS:
    npm init -y
    
  4. Cài đặt gói fastify:
    npm install fastify
    
  5. Cài đặt các gói Cloud SDK để xác thực và làm việc với Vertex AI:
    npm install google-auth-library @google-cloud/vertexai
    
  6. Tạo tệp index.js rồi mở tệp đó trong Trình chỉnh sửa Cloud Shell:
    cloudshell edit index.js
    
    Giờ đây, một tệp trống sẽ xuất hiện trong cửa sổ trình chỉnh sửa phía trên thiết bị đầu cuối. Màn hình của bạn sẽ trông giống như sau:
    Hiện Trình chỉnh sửa Cloud Shell sau khi bắt đầu chỉnh sửa main.go
  7. Sao chép mã sau đây rồi dán vào tệp index.js đã mở:
    const { VertexAI } = require('@google-cloud/vertexai');
    const { GoogleAuth } = require('google-auth-library');
    
    let generativeModel;
    const auth = new GoogleAuth();
    auth.getProjectId().then(result => {
      const vertex = new VertexAI({ project: result });
      generativeModel = vertex.getGenerativeModel({
          model: 'gemini-1.5-flash'
      });
    });
    
    const fastify = require('fastify')();
    const PORT = parseInt(process.env.PORT || '8080');
    
    fastify.get('/', async function (request, reply) {
      const animal = request.query.animal || 'dog';
      const prompt = `Give me 10 fun facts about ${animal}. Return this as html without backticks.`
      const resp = await generativeModel.generateContent(prompt);
      const html = resp.response.candidates[0].content.parts[0].text;
      reply.type('text/html').send(html);
    })
    
    fastify.listen({ host: '0.0.0.0', port: PORT }, function (err, address) {
      if (err) {
        console.error(err);
        process.exit(1);
      }
      console.log(`codelab-genai: listening on ${address}`);
    })
    
    Sau vài giây, Cloud Shell Editor sẽ tự động lưu mã của bạn.

Triển khai mã của ứng dụng AI tạo sinh lên Cloud Run

  1. Trong cửa sổ dòng lệnh, hãy chạy lệnh để triển khai mã nguồn của ứng dụng lên Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Nếu bạn thấy lời nhắc như bên dưới, thông báo cho bạn biết rằng lệnh này sẽ tạo một kho lưu trữ mới. Nhấp vào Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Quá trình triển khai có thể mất vài phút. Sau khi quá trình triển khai hoàn tất, bạn sẽ thấy kết quả như sau:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Sao chép URL dịch vụ Cloud Run đã hiển thị vào một thẻ hoặc cửa sổ riêng trong trình duyệt của bạn. Ngoài ra, hãy chạy lệnh sau trong cửa sổ dòng lệnh để in URL dịch vụ và nhấp vào URL xuất hiện trong khi giữ phím Ctrl để mở URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Khi mở URL này, bạn có thể gặp lỗi 500 hoặc thấy thông báo:
    Sorry, this is just a placeholder...
    
    Điều này có nghĩa là các dịch vụ chưa hoàn tất quá trình triển khai. Vui lòng đợi vài giây rồi làm mới trang. Ở cuối, bạn sẽ thấy một đoạn văn bản bắt đầu bằng Những sự thật thú vị về loài chó và chứa 10 sự thật thú vị về loài chó.

Hãy thử tương tác với ứng dụng để tìm hiểu những thông tin thú vị về các loài động vật. Để thực hiện việc này, hãy thêm tham số animal vào URL, chẳng hạn như ?animal=[ANIMAL], trong đó [ANIMAL] là tên của một loài động vật. Ví dụ: thêm ?animal=cat để nhận 10 thông tin thú vị về mèo hoặc thêm ?animal=sea turtle để nhận 10 thông tin thú vị về rùa biển.

7. Kiểm tra các lệnh gọi Vertex API

Việc kiểm tra các lệnh gọi API của Google sẽ giúp trả lời những câu hỏi như "Ai gọi một API cụ thể, ở đâu và khi nào?". Kiểm tra là việc quan trọng khi bạn khắc phục sự cố cho ứng dụng, điều tra mức tiêu thụ tài nguyên hoặc thực hiện phân tích pháp y phần mềm.

Nhật ký kiểm tra cho phép bạn theo dõi các hoạt động quản trị và hệ thống, cũng như ghi lại các lệnh gọi đến các thao tác API "đọc dữ liệu" và "ghi dữ liệu". Để kiểm tra các yêu cầu của Vertex AI nhằm tạo nội dung, bạn phải bật nhật ký kiểm tra "Đọc dữ liệu" trong bảng điều khiển Cloud.

  1. Nhấp vào nút bên dưới để mở trang Nhật ký kiểm tra trong bảng điều khiển Cloud

  2. Đảm bảo rằng trang này đã chọn dự án mà bạn tạo cho lớp học này. Dự án đã chọn sẽ xuất hiện ở góc trên cùng bên trái của trang, ngay bên cạnh trình đơn hình bánh hamburger:
    Trình đơn thả xuống dự án trên Google Cloud Console
    Nếu cần, hãy chọn dự án phù hợp trong hộp kết hợp.
  3. Trong bảng Cấu hình nhật ký kiểm tra quyền truy cập vào dữ liệu, hãy tìm dịch vụ Vertex AI API trong cột Dịch vụ rồi chọn dịch vụ đó bằng cách đánh dấu vào hộp ở bên trái tên dịch vụ.
    Chọn Vertex AI API
  4. Trong bảng thông tin ở bên phải, hãy chọn loại nhật ký kiểm tra "Đọc dữ liệu".
    Kiểm tra nhật ký Đọc dữ liệu
  5. Nhấp vào Lưu.

Để tạo nhật ký kiểm tra, hãy mở URL của dịch vụ. Làm mới trang trong khi thay đổi giá trị của tham số ?animal= để nhận được kết quả khác.

Khám phá nhật ký kiểm tra

  1. Nhấp vào nút bên dưới để mở trang Trình khám phá nhật ký trong bảng điều khiển Cloud:

  2. Dán bộ lọc sau vào ngăn Truy vấn.
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    Ngăn Truy vấn là một trình chỉnh sửa nằm ở gần đầu trang Trình khám phá nhật ký:
    Truy vấn nhật ký kiểm tra
  3. Nhấp vào Chạy truy vấn.
  4. Chọn một trong các mục nhật ký kiểm tra và mở rộng các trường để kiểm tra thông tin được ghi lại trong nhật ký.
    Bạn có thể xem thông tin chi tiết về lệnh gọi Vertex API, bao gồm cả phương thức và mô hình đã được sử dụng. Bạn cũng có thể xem danh tính của phương thức gọi và những quyền nào đã cho phép cuộc gọi.

8. Ghi lại các hoạt động tương tác với AI tạo sinh

Bạn không tìm thấy các tham số yêu cầu API hoặc dữ liệu phản hồi trong nhật ký kiểm tra. Tuy nhiên, thông tin này có thể quan trọng đối với việc khắc phục sự cố ứng dụng và phân tích quy trình làm việc. Trong bước này, chúng ta sẽ khắc phục điểm thiếu sót này bằng cách thêm tính năng ghi nhật ký ứng dụng. Hoạt động ghi nhật ký sử dụng phương thức ghi nhật ký chuẩn của NodeJS console.log để ghi nhật ký có cấu trúc vào đầu ra tiêu chuẩn. Phương thức này có khả năng Cloud Run ghi lại thông tin được in vào đầu ra chuẩn và tự động chuyển thông tin đó vào Cloud Logging. Để ghi lại chính xác nhật ký có cấu trúc, bạn phải định dạng nhật ký in cho phù hợp. Hãy làm theo hướng dẫn bên dưới để thêm các chức năng ghi nhật ký có cấu trúc vào ứng dụng NodeJS của chúng ta.

  1. Quay lại cửa sổ (hoặc thẻ) "Cloud Shell" trong trình duyệt.
  2. Trong cửa sổ dòng lệnh, hãy mở lại index.js:
    cloudshell edit ~/codelab-o11y/index.js
    
  3. Thực hiện các bước sau để ghi lại phản hồi của mô hình:
    1. Tìm lệnh gọi đến await generativeModel.generateContent() (ở dòng 20).
    2. Sao chép và dán mã bên dưới vào đầu dòng tiếp theo.
        console.log(JSON.stringify({
            severity: 'DEBUG',
            message: 'Content is generated',
            animal: animal,
            prompt: prompt,
            response: resp.response,
        }));
      

Hàm trình xử lý được sửa đổi để gọi console.log() nhằm in cấu trúc JSON mà giản đồ tuân theo các nguyên tắc định dạng có cấu trúc. Nhật ký này ghi lại tham số về động vật trong yêu cầu, cũng như câu lệnh và câu trả lời của mô hình.

Sau vài giây, Cloud Shell Editor sẽ tự động lưu các thay đổi của bạn.

Triển khai mã của ứng dụng AI tạo sinh lên Cloud Run

  1. Trong cửa sổ dòng lệnh, hãy chạy lệnh để triển khai mã nguồn của ứng dụng lên Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Nếu bạn thấy lời nhắc như bên dưới, thông báo cho bạn biết rằng lệnh này sẽ tạo một kho lưu trữ mới. Nhấp vào Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Quá trình triển khai có thể mất vài phút. Sau khi quá trình triển khai hoàn tất, bạn sẽ thấy kết quả như sau:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Sao chép URL dịch vụ Cloud Run đã hiển thị vào một thẻ hoặc cửa sổ riêng trong trình duyệt của bạn. Ngoài ra, hãy chạy lệnh sau trong cửa sổ dòng lệnh để in URL dịch vụ và nhấp vào URL xuất hiện trong khi giữ phím Ctrl để mở URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Khi mở URL này, bạn có thể gặp lỗi 500 hoặc thấy thông báo:
    Sorry, this is just a placeholder...
    
    Điều này có nghĩa là các dịch vụ chưa hoàn tất quá trình triển khai. Vui lòng đợi vài giây rồi làm mới trang. Ở cuối, bạn sẽ thấy một đoạn văn bản bắt đầu bằng Những sự thật thú vị về loài chó và chứa 10 sự thật thú vị về loài chó.

Để tạo nhật ký ứng dụng, hãy mở URL dịch vụ. Làm mới trang trong khi thay đổi giá trị của tham số ?animal= để nhận được kết quả khác.
Để xem nhật ký ứng dụng, hãy làm như sau:

  1. Nhấp vào nút bên dưới để mở trang Trình khám phá nhật ký trong bảng điều khiển Cloud:

  2. Dán bộ lọc sau vào ngăn Truy vấn (số 2 trong Giao diện Trình khám phá nhật ký):
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. Nhấp vào Chạy truy vấn.

Kết quả của truy vấn cho thấy nhật ký có câu lệnh và câu trả lời của Vertex AI, bao gồm cả mức độ an toàn.

9. Đếm số lượt tương tác với AI tạo sinh

Cloud Run ghi các chỉ số được quản lý mà bạn có thể dùng để giám sát các dịch vụ đã triển khai. Các chỉ số giám sát do người dùng quản lý giúp bạn kiểm soát tốt hơn dữ liệu và tần suất cập nhật chỉ số. Để triển khai chỉ số như vậy, bạn cần viết một đoạn mã thu thập dữ liệu và ghi dữ liệu đó vào Cloud Monitoring. Hãy xem bước tiếp theo (không bắt buộc) để biết cách triển khai bằng SDK OpenTelemetry.

Bước này cho thấy lựa chọn thay thế cho việc triển khai chỉ số người dùng trong mã – chỉ số dựa trên nhật ký. Các chỉ số dựa trên nhật ký cho phép bạn tạo chỉ số giám sát từ các mục nhập nhật ký mà ứng dụng của bạn ghi vào Cloud Logging. Chúng ta sẽ sử dụng nhật ký ứng dụng mà chúng ta đã triển khai ở bước trước để xác định chỉ số dựa trên nhật ký của bộ đếm loại. Chỉ số này sẽ tính số lệnh gọi thành công đến Vertex API.

  1. Xem cửa sổ của Trình khám phá nhật ký mà chúng ta đã dùng ở bước trước. Trong ngăn Truy vấn, hãy tìm trình đơn thả xuống Hành động rồi nhấp vào trình đơn đó để mở. Hãy xem ảnh chụp màn hình bên dưới để tìm trình đơn:
    Thanh công cụ kết quả truy vấn có trình đơn thả xuống Thao tác
  2. Trong trình đơn mở ra, hãy chọn Tạo chỉ số để mở bảng điều khiển Tạo chỉ số dựa trên nhật ký.
  3. Hãy làm theo các bước sau để định cấu hình một chỉ số bộ đếm mới trong bảng điều khiển Tạo chỉ số dựa trên nhật ký:
    1. Đặt Loại chỉ số: Chọn Bộ đếm.
    2. Đặt các trường sau trong phần Chi tiết:
      • Tên chỉ số nhật ký: Đặt tên thành model_interaction_count. Có áp dụng một số quy định hạn chế về tên; Hãy xem phần Khắc phục sự cố về quy định hạn chế về tên để biết thông tin chi tiết.
      • Nội dung mô tả: Nhập nội dung mô tả cho chỉ số. Ví dụ: Number of log entries capturing successful call to model inference.
      • Đơn vị: Để trống hoặc chèn chữ số 1.
    3. Giữ nguyên các giá trị trong mục Lựa chọn bộ lọc. Xin lưu ý rằng trường Build filter (Tạo bộ lọc) có cùng bộ lọc mà chúng ta đã dùng để xem nhật ký ứng dụng.
    4. (Không bắt buộc) Thêm nhãn để giúp đếm số lượng cuộc gọi cho từng loài động vật. LƯU Ý: nhãn này có khả năng làm tăng đáng kể số lượng giá trị riêng biệt của chỉ số và bạn không nên sử dụng trong phiên bản chính thức:
      1. Nhấp vào Thêm nhãn.
      2. Đặt các trường sau trong phần Nhãn:
        • Tên nhãn: Đặt tên thành animal.
        • Nội dung mô tả: Nhập nội dung mô tả về nhãn. Ví dụ: Animal parameter.
        • Loại nhãn: Chọn STRING.
        • Tên trường: Loại jsonPayload.animal.
        • Biểu thức chính quy: Để trống.
      3. Nhấp vào Xong
    5. Nhấp vào Tạo chỉ số để tạo chỉ số.

Bạn cũng có thể tạo chỉ số dựa trên nhật ký từ trang Chỉ số dựa trên nhật ký bằng cách sử dụng gcloud logging metrics create lệnh CLI hoặc google_logging_metric tài nguyên Terraform.

Để tạo dữ liệu chỉ số, hãy mở URL của dịch vụ. Làm mới trang đã mở nhiều lần để thực hiện nhiều lệnh gọi đến mô hình. Giống như trước đây, hãy thử dùng các loài động vật khác nhau trong tham số.

Nhập truy vấn PromQL để tìm kiếm dữ liệu chỉ số dựa trên nhật ký. Để nhập một truy vấn PromQL, hãy làm như sau:

  1. Nhấp vào nút bên dưới để mở trang Trình khám phá chỉ số trong bảng điều khiển Cloud:

  2. Trong thanh công cụ của ngăn trình tạo truy vấn, hãy chọn nút có tên là < > MQL hoặc < > PromQL. Hãy xem hình ảnh bên dưới để biết vị trí của nút.
    Vị trí của nút MQL trong Trình khám phá chỉ số
  3. Xác minh rằng bạn đã chọn PromQL trong nút bật/tắt Language (Ngôn ngữ). Nút bật/tắt ngôn ngữ nằm trong cùng một thanh công cụ cho phép bạn định dạng cụm từ tìm kiếm.
  4. Nhập truy vấn của bạn vào trình chỉnh sửa Truy vấn:
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    Để biết thêm thông tin về cách sử dụng PromQL, hãy xem phần PromQL trong Cloud Monitoring.
  5. Nhấp vào Run Query (Chạy truy vấn). Bạn sẽ thấy một biểu đồ đường tương tự như ảnh chụp màn hình này:
    Hiện các chỉ số được truy vấn

    Xin lưu ý rằng khi bạn bật nút Chạy tự động, nút Chạy truy vấn sẽ không xuất hiện.

10. (Không bắt buộc) Sử dụng Open Telemetry để giám sát và theo dõi

Như đã đề cập trong bước trước, bạn có thể triển khai các chỉ số bằng cách sử dụng SDK OpenTelemetry (Otel). Bạn nên sử dụng OTel trên các cấu trúc vi dịch vụ. Bước này mô tả những nội dung sau:

  • Khởi động các thành phần OTel để hỗ trợ việc theo dõi và giám sát ứng dụng
  • Điền cấu hình OTel bằng siêu dữ liệu tài nguyên của môi trường Cloud Run
  • Đo lường ứng dụng flask bằng các chức năng theo dõi tự động
  • Triển khai chỉ số bộ đếm để theo dõi số lượng lệnh gọi mô hình thành công
  • Tương quan dấu vết với nhật ký ứng dụng

Cấu trúc được đề xuất cho các dịch vụ ở cấp sản phẩm là sử dụng trình thu thập OTel để thu thập và nhập tất cả dữ liệu về khả năng quan sát cho một hoặc nhiều dịch vụ. Để đơn giản, mã trong bước này không sử dụng bộ sưu tập. Thay vào đó, nó sử dụng các tệp xuất OTel để ghi dữ liệu trực tiếp vào Google Cloud.

Thiết lập các thành phần OTel để theo dõi và giám sát chỉ số

  1. Quay lại cửa sổ (hoặc thẻ) "Cloud Shell" trong trình duyệt.
  2. Cài đặt các gói cần thiết để sử dụng tính năng tự động đo từ xa OpenTelemetry:
    npm install @opentelemetry/sdk-node \
      @opentelemetry/api \
      @opentelemetry/auto-instrumentations-node \
      @opentelemetry/instrumentation-express \
      @opentelemetry/instrumentation-http \
      @opentelemetry/sdk-metrics \
      @opentelemetry/sdk-trace-node \
      @google-cloud/opentelemetry-cloud-trace-exporter \
      @google-cloud/opentelemetry-cloud-monitoring-exporter \
      @google-cloud/opentelemetry-resource-util
    
  3. Trong thiết bị đầu cuối, hãy tạo một tệp mới setup.js:
    cloudshell edit ~/codelab-o11y/setup.js
    
  4. Sao chép và dán mã bên dưới vào trình chỉnh sửa để thiết lập tính năng giám sát và theo dõi OpenTelemetry.
    const opentelemetry = require("@opentelemetry/api");
    const { registerInstrumentations } = require('@opentelemetry/instrumentation');
    const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
    const { MeterProvider, PeriodicExportingMetricReader } = require("@opentelemetry/sdk-metrics");
    const { AlwaysOnSampler, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
    const { Resource } = require('@opentelemetry/resources');
    const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');
    const { FastifyInstrumentation } = require('@opentelemetry/instrumentation-fastify');
    const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
    const { TraceExporter } = require("@google-cloud/opentelemetry-cloud-trace-exporter");
    const { MetricExporter } = require("@google-cloud/opentelemetry-cloud-monitoring-exporter");
    const { GcpDetectorSync } = require("@google-cloud/opentelemetry-resource-util");
    
    module.exports = { setupTelemetry };
    
    function setupTelemetry() {
      const gcpResource = new Resource({
        [ATTR_SERVICE_NAME]: process.env.K_SERVICE,
      }).merge(new GcpDetectorSync().detect())
    
      const tracerProvider = new NodeTracerProvider({
        resource: gcpResource,
        sampler: new AlwaysOnSampler(),
        spanProcessors: [new SimpleSpanProcessor(new TraceExporter({
          // will export all resource attributes that start with "service."
          resourceFilter: /^service\./
        }))],
      });
      registerInstrumentations({
        tracerProvider: tracerProvider,
        instrumentations: [
          // Express instrumentation expects HTTP layer to be instrumented
          new HttpInstrumentation(),
          new FastifyInstrumentation(),
        ],
      });
      // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
      tracerProvider.register();
    
      const meterProvider = new MeterProvider({
        resource: gcpResource,
        readers: [new PeriodicExportingMetricReader({
          // Export metrics every second (default quota is 30,000 time series ingestion requests per minute)
          exportIntervalMillis: 1_000,
          exporter: new MetricExporter(),
        })],
      });
      opentelemetry.metrics.setGlobalMeterProvider(meterProvider);
    }
    
  5. Quay lại cửa sổ dòng lệnh rồi mở lại index.js:
    cloudshell edit ~/codelab-o11y/index.js
    
  6. Thay thế mã bằng phiên bản khởi tạo tính năng theo dõi và thu thập chỉ số OpenTelemetry, đồng thời cập nhật bộ đếm hiệu suất trên mỗi lần thực thi thành công. Để cập nhật mã, hãy xoá nội dung của tệp rồi sao chép và dán mã bên dưới:
    const { VertexAI } = require('@google-cloud/vertexai');
    const { GoogleAuth } = require('google-auth-library');
    
    let generativeModel, traceIdPrefix;
    const auth = new GoogleAuth();
    auth.getProjectId().then(result => {
      const vertex = new VertexAI({ project: result });
      generativeModel = vertex.getGenerativeModel({
            model: 'gemini-1.5-flash'
      });
      traceIdPrefix = `projects/${result}/traces/`;
    });
    
    // setup tracing and monitoring OTel providers
    const { setupTelemetry }= require('./setup');
    setupTelemetry();
    
    const { trace, context } = require('@opentelemetry/api');
    function getCurrentSpan() {
      const current_span = trace.getSpan(context.active());
      return {
          trace_id: current_span.spanContext().traceId,
          span_id: current_span.spanContext().spanId,
          flags: current_span.spanContext().traceFlags
      };
    };
    
    const opentelemetry = require("@opentelemetry/api");
    const meter = opentelemetry.metrics.getMeter("genai-o11y/nodejs/workshop/example");
    const counter = meter.createCounter("model_call_counter");
    
    const fastify = require('fastify')();
    const PORT = parseInt(process.env.PORT || '8080');
    
    fastify.get('/', async function (request, reply) {
      const animal = request.query.animal || 'dog';
      const prompt = `Give me 10 fun facts about ${animal}. Return this as html without backticks.`
      const resp = await generativeModel.generateContent(prompt)
      const span = getCurrentSpan();
      console.log(JSON.stringify({
          severity: 'DEBUG',
          message: 'Content is generated',
          animal: animal,
          prompt: prompt,
          response: resp.response,
          "logging.googleapis.com/trace": traceIdPrefix + span.trace_id,
          "logging.googleapis.com/spanId": span.span_id,
      }));
      counter.add(1, { animal: animal });
      const html = resp.response.candidates[0].content.parts[0].text;
      reply.type('text/html').send(html);
    });
    
    fastify.listen({ host: '0.0.0.0', port: PORT }, function (err, address) {
      if (err) {
        console.error(err);
        process.exit(1);
      }
      console.log(`codelab-genai: listening on ${address}`);
    });
    

Giờ đây, ứng dụng này sử dụng OpenTelemetry SDK để đo lường việc thực thi mã bằng tính năng theo dõi và triển khai việc đếm số lần thực thi thành công dưới dạng một chỉ số. Phương thức main() được sửa đổi để thiết lập các trình xuất OpenTelemetry cho dấu vết và chỉ số để ghi trực tiếp vào Google Cloud Tracing và Monitoring. Thao tác này cũng thực hiện các cấu hình bổ sung để điền sẵn siêu dữ liệu liên quan đến môi trường Cloud Run vào các dấu vết và chỉ số đã thu thập. Hàm Handler() được cập nhật để tăng bộ đếm chỉ số mỗi khi lệnh gọi Vertex AI API trả về kết quả hợp lệ.

Sau vài giây, Cloud Shell Editor sẽ tự động lưu các thay đổi của bạn.

Triển khai mã của ứng dụng AI tạo sinh lên Cloud Run

  1. Trong cửa sổ dòng lệnh, hãy chạy lệnh để triển khai mã nguồn của ứng dụng lên Cloud Run.
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    Nếu bạn thấy lời nhắc như bên dưới, thông báo cho bạn biết rằng lệnh này sẽ tạo một kho lưu trữ mới. Nhấp vào Enter.
    Deploying from source requires an Artifact Registry Docker repository to store built containers.
    A repository named [cloud-run-source-deploy] in region [us-central1] will be created.
    
    Do you want to continue (Y/n)?
    
    Quá trình triển khai có thể mất vài phút. Sau khi quá trình triển khai hoàn tất, bạn sẽ thấy kết quả như sau:
    Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic.
    Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
    
  2. Sao chép URL dịch vụ Cloud Run đã hiển thị vào một thẻ hoặc cửa sổ riêng trong trình duyệt của bạn. Ngoài ra, hãy chạy lệnh sau trong cửa sổ dòng lệnh để in URL dịch vụ và nhấp vào URL xuất hiện trong khi giữ phím Ctrl để mở URL:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    Khi mở URL này, bạn có thể gặp lỗi 500 hoặc thấy thông báo:
    Sorry, this is just a placeholder...
    
    Điều này có nghĩa là các dịch vụ chưa hoàn tất quá trình triển khai. Vui lòng đợi vài giây rồi làm mới trang. Ở cuối, bạn sẽ thấy một đoạn văn bản bắt đầu bằng Những sự thật thú vị về loài chó và chứa 10 sự thật thú vị về loài chó.

Để tạo dữ liệu đo từ xa, hãy mở URL của dịch vụ. Làm mới trang trong khi thay đổi giá trị của tham số ?animal= để nhận được kết quả khác.

Khám phá dấu vết ứng dụng

  1. Nhấp vào nút bên dưới để mở trang Trình khám phá dấu vết trong bảng điều khiển Cloud:

  2. Chọn một trong những dấu vết gần đây nhất. Bạn sẽ thấy 5 hoặc 6 khoảng thời gian có dạng như trong ảnh chụp màn hình bên dưới.
    Chế độ xem khoảng thời gian của ứng dụng trong Trình khám phá dấu vết
  3. Tìm khoảng thời gian theo dõi lệnh gọi đến trình xử lý sự kiện (phương thức fun_facts). Đây sẽ là khoảng thời gian cuối cùng có tên /.
  4. Trong ngăn Trace details (Thông tin chi tiết về dấu vết), hãy chọn Logs & events (Nhật ký và sự kiện). Bạn sẽ thấy nhật ký ứng dụng tương ứng với khoảng thời gian cụ thể này. Mối tương quan được phát hiện bằng cách sử dụng mã nhận dạng dấu vết và khoảng thời gian trong dấu vết và trong nhật ký. Bạn sẽ thấy nhật ký ứng dụng đã viết câu lệnh và câu trả lời của Vertex API.

Khám phá chỉ số bộ đếm

  1. Nhấp vào nút bên dưới để mở trang Trình khám phá chỉ số trong bảng điều khiển Cloud:

  2. Trong thanh công cụ của ngăn trình tạo truy vấn, hãy chọn nút có tên là < > MQL hoặc < > PromQL. Hãy xem hình ảnh bên dưới để biết vị trí của nút.
    Vị trí của nút MQL trong Trình khám phá chỉ số
  3. Xác minh rằng bạn đã chọn PromQL trong nút bật/tắt Language (Ngôn ngữ). Nút bật/tắt ngôn ngữ nằm trong cùng một thanh công cụ cho phép bạn định dạng cụm từ tìm kiếm.
  4. Nhập truy vấn của bạn vào trình chỉnh sửa Truy vấn:
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. Nhấp vào Run Query (Chạy truy vấn). Khi bạn bật nút Auto-run (Tự động chạy), nút Run Query (Chạy truy vấn) sẽ không xuất hiện.

11. (Không bắt buộc) Thông tin nhạy cảm bị làm rối từ nhật ký

Ở Bước 10, chúng ta đã ghi lại thông tin về hoạt động tương tác của ứng dụng với mô hình Gemini. Thông tin này bao gồm tên của động vật, câu lệnh thực tế và câu trả lời của mô hình. Mặc dù việc lưu trữ thông tin này trong nhật ký là an toàn, nhưng điều này không nhất thiết đúng trong nhiều trường hợp khác. Câu lệnh có thể bao gồm một số thông tin cá nhân hoặc thông tin nhạy cảm mà người dùng không muốn lưu trữ. Để giải quyết vấn đề này, bạn có thể làm rối dữ liệu nhạy cảm được ghi vào Cloud Logging. Để giảm thiểu việc sửa đổi mã, bạn nên dùng giải pháp sau.

  1. Tạo một chủ đề PubSub để lưu trữ các mục nhật ký đến
  2. Tạo một bồn lưu trữ dữ liệu chuyển hướng nhật ký đã nhận đến chủ đề PubSub.
  3. Tạo một quy trình Dataflow sửa đổi nhật ký được chuyển hướng đến chủ đề PubSub theo các bước sau:
    1. Đọc một mục nhập nhật ký từ chủ đề PubSub
    2. Kiểm tra tải trọng của mục nhập để tìm thông tin nhạy cảm bằng API kiểm tra DLP
    3. Ẩn thông tin nhạy cảm trong tải trọng bằng một trong các phương thức ẩn DLP
    4. Ghi mục nhập nhật ký đã làm rối mã nguồn vào Cloud Logging
  4. Triển khai quy trình

12. (Không bắt buộc) Dọn dẹp

Để tránh rủi ro phát sinh phí cho các tài nguyên và API được dùng trong lớp học lập trình, bạn nên dọn dẹp sau khi hoàn thành lớp học. Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho lớp học lập trình này.

  1. Để xoá dự án, hãy chạy lệnh xoá dự án trong thiết bị đầu cuối:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    Khi bạn xoá dự án trên đám mây, hệ thống sẽ ngừng tính phí cho tất cả tài nguyên và API được dùng trong dự án đó. Bạn sẽ thấy thông báo này, trong đó PROJECT_ID là mã dự án của bạn:
    Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID].
    
    You can undo this operation for a limited period by running the command below.
        $ gcloud projects undelete PROJECT_ID
    
    See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects.
    
  2. (Không bắt buộc) Nếu bạn gặp lỗi, hãy tham khảo Bước 5 để tìm mã dự án mà bạn đã sử dụng trong phòng thí nghiệm. Thay thế bằng lệnh trong hướng dẫn đầu tiên. Ví dụ: nếu mã dự án của bạn là lab-example-project, thì lệnh sẽ là:
    gcloud projects delete lab-project-id-example --quiet
    

13. Xin chúc mừng

Trong phòng thí nghiệm này, bạn đã tạo một ứng dụng AI tạo sinh sử dụng mô hình Gemini để đưa ra dự đoán. Đồng thời, ứng dụng này được trang bị các chức năng giám sát và ghi nhật ký cần thiết. Bạn đã triển khai ứng dụng và các thay đổi từ mã nguồn sang Cloud Run. Sau đó, bạn có thể sử dụng các sản phẩm Google Cloud Observability để theo dõi hiệu suất của ứng dụng, nhờ đó đảm bảo được độ tin cậy của ứng dụng.

Nếu bạn muốn tham gia một nghiên cứu về trải nghiệm người dùng (UX) để cải thiện những sản phẩm mà bạn đã sử dụng hôm nay, hãy đăng ký tại đây.

Sau đây là một số lựa chọn để bạn tiếp tục học tập: