เทคนิคการสังเกตการณ์ที่ใช้งานได้จริงสําหรับแอปพลิเคชัน Generative AI ใน Java

1. ภาพรวม

แอปพลิเคชัน Gen AI ต้องมีการสังเกตการณ์เช่นเดียวกับแอปพลิเคชันอื่นๆ Generative AI ต้องใช้เทคนิคการสังเกตการณ์พิเศษไหม

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

สิ่งที่คุณจะได้เรียนรู้

  • เขียนแอปพลิเคชันที่ใช้ Vertex AI ด้วย Cloud Shell Editor
  • จัดเก็บโค้ดแอปพลิเคชันใน GitHub
  • ใช้ gcloud CLI เพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้กับ Cloud Run
  • เพิ่มความสามารถในการตรวจสอบและการบันทึกลงในแอปพลิเคชัน Gen AI
  • การใช้เมตริกตามบันทึก
  • การติดตั้งใช้งานการบันทึกและการตรวจสอบด้วย Open Telemetry SDK
  • รับข้อมูลเชิงลึกเกี่ยวกับการจัดการข้อมูล AI ที่มีความรับผิดชอบ

2. ข้อกำหนดเบื้องต้น

หากยังไม่มีบัญชี Google คุณจะต้องสร้างบัญชีใหม่

3. การตั้งค่าโปรเจ็กต์

  1. ลงชื่อเข้าใช้ Google Cloud Console ด้วยบัญชี Google
  2. สร้างโปรเจ็กต์ใหม่หรือเลือกใช้โปรเจ็กต์ที่มีอยู่ซ้ำ จดรหัสโปรเจ็กต์ของโปรเจ็กต์ที่คุณเพิ่งสร้างหรือเลือก
  3. เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์
    • การทำแล็บนี้ควรมีค่าใช้จ่ายในการเรียกเก็บเงินน้อยกว่า $5
    • คุณสามารถทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
    • ผู้ใช้ใหม่มีสิทธิ์ใช้ช่วงทดลองใช้ฟรีมูลค่า$300 USD
  4. ยืนยันว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์ของฉันในการเรียกเก็บเงินใน Cloud
    • หากโปรเจ็กต์ใหม่แสดง Billing is disabled ในคอลัมน์ Billing account ให้ทำดังนี้
      1. คลิกจุด 3 จุดในActionsคอลัมน์
      2. คลิกเปลี่ยนการเรียกเก็บเงิน
      3. เลือกบัญชีสำหรับการเรียกเก็บเงินที่ต้องการใช้
    • หากคุณเข้าร่วมกิจกรรมแบบสด บัญชีดังกล่าวอาจมีชื่อว่าบัญชีสำหรับการเรียกเก็บเงินของ Google Cloud Platform เวอร์ชันทดลองใช้งาน

4. เตรียม Cloud Shell Editor

  1. ไปที่ Cloud Shell Editor หากได้รับข้อความต่อไปนี้ซึ่งขอให้ให้สิทธิ์ Cloud Shell ในการเรียก gcloud ด้วยข้อมูลเข้าสู่ระบบของคุณ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ
    คลิกเพื่อให้สิทธิ์ Cloud Shell
  2. เปิดหน้าต่างเทอร์มินัล
    1. คลิกเมนู 3 ขีด ไอคอนเมนู 3 ขีด
    2. คลิก Terminal
    3. คลิก Terminal ใหม่
      เปิดเทอร์มินัลใหม่ใน Cloud Shell Editor
  3. กำหนดค่ารหัสโปรเจ็กต์ในเทอร์มินัลโดยทำดังนี้
    gcloud config set project [PROJECT_ID]
    
    แทนที่ [PROJECT_ID] ด้วยรหัสโปรเจ็กต์ของคุณ เช่น หากรหัสโปรเจ็กต์คือ lab-example-project คำสั่งจะเป็นดังนี้
    gcloud config set project lab-project-id-example
    
    หากได้รับข้อความต่อไปนี้ที่ระบุว่า gcloud ขอข้อมูลเข้าสู่ระบบของคุณไปยัง GCPI API ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ
    คลิกเพื่อให้สิทธิ์ Cloud Shell
    เมื่อดำเนินการสำเร็จ คุณควรเห็นข้อความต่อไปนี้
    Updated property [core/project].
    
    หากเห็น WARNING และระบบขอให้คุณ Do you want to continue (Y/N)? แสดงว่าคุณอาจป้อนรหัสโปรเจ็กต์ไม่ถูกต้อง กด N กด Enter แล้วลองเรียกใช้คำสั่ง gcloud config set project อีกครั้งหลังจากพบรหัสโปรเจ็กต์ที่ถูกต้อง
  4. (ไม่บังคับ) หากพบปัญหาในการค้นหารหัสโปรเจ็กต์ ให้เรียกใช้คำสั่งต่อไปนี้เพื่อดูรหัสโปรเจ็กต์ทั้งหมดของคุณโดยเรียงตามเวลาที่สร้างจากมากไปน้อย
    gcloud projects list \
         --format='value(projectId,createTime)' \
         --sort-by=~createTime
    

5. เปิดใช้ Google APIs

ในเทอร์มินัล ให้เปิดใช้ Google API ที่จำเป็นสำหรับแล็บนี้

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

คำสั่งนี้จะใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ ในที่สุดก็จะแสดงข้อความว่าดำเนินการสำเร็จคล้ายกับข้อความนี้

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

หากได้รับข้อความแสดงข้อผิดพลาดที่ขึ้นต้นด้วย ERROR: (gcloud.services.enable) HttpError accessing และมีรายละเอียดข้อผิดพลาดดังที่แสดงด้านล่าง ให้ลองใช้คำสั่งอีกครั้งหลังจากผ่านไป 1-2 นาที

"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. สร้างแอปพลิเคชัน Gen AI

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

  1. สร้างไดเรกทอรี codelab-o11y ในเทอร์มินัลโดยใช้คำสั่งต่อไปนี้
    mkdir "${HOME}/codelab-o11y"
    
  2. เปลี่ยนไดเรกทอรีปัจจุบันเป็น codelab-o11y โดยทำดังนี้
    cd "${HOME}/codelab-o11y"
    
  3. ดาวน์โหลดโค้ดการเริ่มต้นของแอปพลิเคชัน Java โดยใช้ตัวเริ่มต้นเฟรมเวิร์ก Spring
    curl https://start.spring.io/starter.zip \
        -d dependencies=web \
        -d javaVersion=17 \
        -d type=maven-project \
        -d bootVersion=3.4.1 -o java-starter.zip
    
  4. ยกเลิกการเก็บรหัส Bootstrap ไปยังโฟลเดอร์ปัจจุบัน
    unzip java-starter.zip
    
  5. และนำไฟล์ที่เก็บออกจากโฟลเดอร์
    rm java-starter.zip
    
  6. สร้างไฟล์ project.toml เพื่อกำหนดเวอร์ชัน Java Runtime ที่จะใช้เมื่อทำให้โค้ดใช้งานได้ใน Cloud Run
    cat > "${HOME}/codelab-o11y/project.toml" << EOF
    [[build.env]]
        name = "GOOGLE_RUNTIME_VERSION"
        value = "17"
    EOF
    
  7. เพิ่มทรัพยากร Dependency ของ Google Cloud SDK ลงในไฟล์ pom.xml
    1. เพิ่มแพ็กเกจหลักของ Google Cloud
      sed -i 's/<dependencies>/<dependencies>\
      \
              <dependency>\
                  <groupId>com.google.cloud<\/groupId>\
                  <artifactId>google-cloud-core<\/artifactId>\
                  <version>2.49.1<\/version>\
              <\/dependency>\
              /g' "${HOME}/codelab-o11y/pom.xml"
      
    2. เพิ่มแพ็กเกจ Vertex AI ของ Google Cloud
      sed -i 's/<dependencies>/<dependencies>\
      \
              <dependency>\
                  <groupId>com.google.cloud<\/groupId>\
                  <artifactId>google-cloud-vertexai<\/artifactId>\
                  <version>1.16.0<\/version>\
              <\/dependency>\
              /g' "${HOME}/codelab-o11y/pom.xml"
      
  8. เปิดไฟล์ DemoApplication.java ใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
    
    ตอนนี้ซอร์สโค้ดที่สร้างขึ้นของไฟล์ DemoApplication.java ควรปรากฏในหน้าต่างเอดิเตอร์เหนือเทอร์มินัล ซอร์สโค้ดของไฟล์จะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
  9. แทนที่โค้ดในเอดิเตอร์ด้วยเวอร์ชันที่แสดงด้านล่าง หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในโปรแกรมแก้ไข
    package com.example.demo;
    
    import java.io.IOException;
    import java.util.Collections;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.google.cloud.ServiceOptions;
    import com.google.cloud.vertexai.VertexAI;
    import com.google.cloud.vertexai.api.GenerateContentResponse;
    import com.google.cloud.vertexai.generativeai.GenerativeModel;
    import com.google.cloud.vertexai.generativeai.ResponseHandler;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            String port = System.getenv().getOrDefault("PORT", "8080");
            SpringApplication app = new SpringApplication(DemoApplication.class);
            app.setDefaultProperties(Collections.singletonMap("server.port", port));
            app.run(args);
        }
    }
    
    @RestController
    class HelloController {
        private final String projectId = ServiceOptions.getDefaultProjectId();
        private VertexAI vertexAI;
        private GenerativeModel model;
    
        @PostConstruct
        public void init() {
            vertexAI = new VertexAI(projectId, "us-central1");
            model = new GenerativeModel("gemini-1.5-flash", vertexAI);
        }
    
        @PreDestroy
        public void destroy() {
            vertexAI.close();
        }
    
        @GetMapping("/")
        public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException {
            String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks.";
            GenerateContentResponse response = model.generateContent(prompt);
            return ResponseHandler.getText(response);
        }
    }
    
    หลังจากผ่านไป 2-3 วินาที Cloud Shell Editor จะบันทึกโค้ดโดยอัตโนมัติ

ติดตั้งใช้งานโค้ดของแอปพลิเคชัน Gen AI ไปยัง Cloud Run

  1. ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้กับ Cloud Run
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    หากเห็นข้อความแจ้งดังด้านล่างที่แจ้งให้ทราบว่าคำสั่งจะสร้างที่เก็บใหม่ คลิก 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)?
    
    กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการติดตั้งใช้งานเสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังนี้
    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. คัดลอก URL ของบริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดปุ่ม Ctrl ค้างไว้เพื่อเปิด URL
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้
    Sorry, this is just a placeholder...
    
    ซึ่งหมายความว่าบริการยังติดตั้งใช้งานไม่เสร็จ รอสักครู่แล้วรีเฟรชหน้าเว็บ ที่ท้ายข้อความ คุณจะเห็นข้อความที่ขึ้นต้นด้วยเรื่องน่ารู้เกี่ยวกับสุนัขและมีเรื่องน่ารู้เกี่ยวกับสุนัข 10 เรื่อง

ลองโต้ตอบกับแอปพลิเคชันเพื่อดูข้อเท็จจริงที่น่าสนใจเกี่ยวกับสัตว์ต่างๆ โดยให้ผนวกพารามิเตอร์ animal เข้ากับ URL เช่น ?animal=[ANIMAL] โดยที่ [ANIMAL] คือชื่อสัตว์ เช่น เพิ่ม ?animal=cat เพื่อดูสาระน่ารู้ 10 ข้อเกี่ยวกับแมว หรือ ?animal=sea turtle เพื่อดูสาระน่ารู้ 10 ข้อเกี่ยวกับเต่าทะเล

7. ตรวจสอบการเรียกใช้ Vertex API

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

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

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้าบันทึกการตรวจสอบใน Cloud Console

  2. ตรวจสอบว่าหน้าเว็บมีโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับแล็บนี้เลือกอยู่ โปรเจ็กต์ที่เลือกจะแสดงที่มุมซ้ายบนของหน้าเว็บทางด้านขวาของเมนูแฮมเบอร์เกอร์
    เมนูแบบเลื่อนลงของโปรเจ็กต์ Google Cloud Console
    หากจำเป็น ให้เลือกโปรเจ็กต์ที่ถูกต้องจากช่องคำสั่งแบบเลื่อนลง
  3. ในตารางการกำหนดค่าบันทึกการตรวจสอบการเข้าถึงข้อมูล ในคอลัมน์บริการ ให้ค้นหาบริการ Vertex AI API แล้วเลือกบริการโดยเลือกช่องทําเครื่องหมายที่อยู่ทางด้านซ้ายของชื่อบริการ
    เลือก Vertex AI API
  4. ในแผงข้อมูลทางด้านขวา ให้เลือกประเภทการตรวจสอบ "อ่านข้อมูล"
    ตรวจสอบบันทึกการอ่านข้อมูล
  5. คลิกบันทึก

หากต้องการสร้างบันทึกการตรวจสอบ ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าของพารามิเตอร์ ?animal= เพื่อดูผลลัพธ์ที่แตกต่างกัน

สำรวจบันทึกการตรวจสอบ

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้า Logs Explorer ในคอนโซลระบบคลาวด์

  2. วางตัวกรองต่อไปนี้ลงในแผงคำค้นหา
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    แผงคำค้นหาคือเครื่องมือแก้ไขที่อยู่ใกล้ด้านบนของหน้า Logs Explorer
    ค้นหาบันทึกการตรวจสอบ
  3. คลิกเรียกใช้การค้นหา
  4. เลือกรายการบันทึกการตรวจสอบรายการใดรายการหนึ่ง แล้วขยายช่องเพื่อตรวจสอบข้อมูลที่บันทึกไว้ในบันทึก
    คุณดูรายละเอียดเกี่ยวกับการเรียก Vertex API ได้ รวมถึงเมธอดและโมเดลที่ใช้ นอกจากนี้ คุณยังดูตัวตนของผู้เรียกใช้และสิทธิ์ที่อนุญาตให้โทรได้ด้วย

8. บันทึกการโต้ตอบกับ Gen AI

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

การใช้งานจะใช้ Logback กับ Spring Boot เพื่อพิมพ์บันทึกของแอปพลิเคชันไปยังเอาต์พุตมาตรฐาน วิธีนี้มีความสามารถของ Cloud Run ในการบันทึกข้อมูลที่พิมพ์ไปยังเอาต์พุตมาตรฐานและส่งไปยัง Cloud Logging โดยอัตโนมัติ หากต้องการบันทึกข้อมูลเป็นข้อมูลที่มีโครงสร้าง คุณควรจัดรูปแบบบันทึกที่พิมพ์ออกมาให้สอดคล้องกัน ทำตามวิธีการด้านล่างเพื่อเพิ่มความสามารถในการบันทึกแบบมีโครงสร้างลงในแอปพลิเคชัน

  1. กลับไปที่หน้าต่าง (หรือแท็บ) "Cloud Shell" ในเบราว์เซอร์
  2. สร้างและเปิดไฟล์ใหม่LoggingEventGoogleCloudEncoder.javaใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
    
  3. คัดลอกและวางโค้ดต่อไปนี้เพื่อใช้ตัวเข้ารหัส Logback ที่เข้ารหัสบันทึกเป็น JSON ที่แปลงเป็นสตริงตามรูปแบบบันทึกที่มีโครงสร้างของ Google Cloud
    package com.example.demo;
    
    import static ch.qos.logback.core.CoreConstants.UTF_8_CHARSET;
    
    import java.time.Instant;
    import ch.qos.logback.core.encoder.EncoderBase;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import java.util.HashMap;
    
    import com.google.gson.Gson;
    
    public class LoggingEventGoogleCloudEncoder extends EncoderBase<ILoggingEvent>  {
        private static final byte[] EMPTY_BYTES = new byte[0];
        private final Gson gson = new Gson();
    
        @Override
        public byte[] headerBytes() {
            return EMPTY_BYTES;
        }
    
        @Override
        public byte[] encode(ILoggingEvent e) {
            var timestamp = Instant.ofEpochMilli(e.getTimeStamp());
            var fields = new HashMap<String, Object>() {
                {
                    put("timestamp", timestamp.toString());
                    put("severity", severityFor(e.getLevel()));
                    put("message", e.getMessage());
                }
            };
            var params = e.getKeyValuePairs();
            if (params != null && params.size() > 0) {
                params.forEach(kv -> fields.putIfAbsent(kv.key, kv.value));
            }
            var data = gson.toJson(fields) + "\n";
            return data.getBytes(UTF_8_CHARSET);
        }
    
        @Override
        public byte[] footerBytes() {
            return EMPTY_BYTES;
        }
    
        private static String severityFor(Level level) {
            switch (level.toInt()) {
                case Level.TRACE_INT:
                return "DEBUG";
                case Level.DEBUG_INT:
                return "DEBUG";
                case Level.INFO_INT:
                return "INFO";
                case Level.WARN_INT:
                return "WARNING";
                case Level.ERROR_INT:
                return "ERROR";
                default:
                return "DEFAULT";
            }
        }
    }
    
  4. สร้างและเปิดไฟล์ใหม่logback.xmlใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/resources/logback.xml"
    
  5. คัดลอกและวาง XML ต่อไปนี้เพื่อกำหนดค่า Logback ให้ใช้ตัวเข้ารหัสกับโปรแกรมต่อท้าย Logback ที่พิมพ์บันทึกลงในเอาต์พุตมาตรฐาน
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
        <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="com.example.demo.LoggingEventGoogleCloudEncoder"/>
        </appender>
    
        <root level="info">
            <appender-ref ref="Console" />
        </root>
    </configuration>
    
  6. เปิดไฟล์ DemoApplication.java อีกครั้งใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
    
  7. แทนที่โค้ดในเอดิเตอร์ด้วยเวอร์ชันที่แสดงด้านล่างเพื่อบันทึกคำขอและการตอบกลับของ Gen AI หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในโปรแกรมแก้ไข
    package com.example.demo;
    
    import java.io.IOException;
    import java.util.Collections;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.google.cloud.ServiceOptions;
    import com.google.cloud.vertexai.VertexAI;
    import com.google.cloud.vertexai.api.GenerateContentResponse;
    import com.google.cloud.vertexai.generativeai.GenerativeModel;
    import com.google.cloud.vertexai.generativeai.ResponseHandler;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            String port = System.getenv().getOrDefault("PORT", "8080");
            SpringApplication app = new SpringApplication(DemoApplication.class);
            app.setDefaultProperties(Collections.singletonMap("server.port", port));
            app.run(args);
        }
    }
    
    @RestController
    class HelloController {
        private final String projectId = ServiceOptions.getDefaultProjectId();
        private VertexAI vertexAI;
        private GenerativeModel model;
        private final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);
    
        @PostConstruct
        public void init() {
            vertexAI = new VertexAI(projectId, "us-central1");
            model = new GenerativeModel("gemini-1.5-flash", vertexAI);
        }
    
        @PreDestroy
        public void destroy() {
            vertexAI.close();
        }
    
        @GetMapping("/")
        public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException {
            String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks.";
            GenerateContentResponse response = model.generateContent(prompt);
            LOGGER.atInfo()
                    .addKeyValue("animal", animal)
                    .addKeyValue("prompt", prompt)
                    .addKeyValue("response", response)
                    .log("Content is generated");
            return ResponseHandler.getText(response);
        }
    }
    

หลังจากผ่านไป 2-3 วินาที Cloud Shell Editor จะบันทึกการเปลี่ยนแปลงโดยอัตโนมัติ

ติดตั้งใช้งานโค้ดของแอปพลิเคชัน Gen AI ไปยัง Cloud Run

  1. ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้กับ Cloud Run
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    หากเห็นข้อความแจ้งดังด้านล่างที่แจ้งให้ทราบว่าคำสั่งจะสร้างที่เก็บใหม่ คลิก 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)?
    
    กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการติดตั้งใช้งานเสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังนี้
    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. คัดลอก URL ของบริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดปุ่ม Ctrl ค้างไว้เพื่อเปิด URL
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้
    Sorry, this is just a placeholder...
    
    ซึ่งหมายความว่าบริการยังติดตั้งใช้งานไม่เสร็จ รอสักครู่แล้วรีเฟรชหน้าเว็บ ที่ท้ายข้อความ คุณจะเห็นข้อความที่ขึ้นต้นด้วยเรื่องน่ารู้เกี่ยวกับสุนัขและมีเรื่องน่ารู้เกี่ยวกับสุนัข 10 เรื่อง

หากต้องการสร้างบันทึกของแอปพลิเคชัน ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าของพารามิเตอร์ ?animal= เพื่อดูผลลัพธ์ที่แตกต่างกัน
หากต้องการดูบันทึกของแอปพลิเคชัน ให้ทำดังนี้

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้า Logs Explorer ใน Cloud Console

  2. วางตัวกรองต่อไปนี้ลงในแผงคำค้นหา (#2 ในอินเทอร์เฟซของเครื่องมือสำรวจบันทึก)
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. คลิกเรียกใช้การค้นหา

ผลลัพธ์ของคำค้นหาจะแสดงบันทึกพร้อมพรอมต์และการตอบกลับของ Vertex AI รวมถึงคะแนนความปลอดภัย

9. นับการโต้ตอบกับ Gen AI

Cloud Run จะเขียนเมตริกที่มีการจัดการซึ่งใช้เพื่อตรวจสอบบริการที่ทําให้ใช้งานได้ เมตริกการตรวจสอบที่ผู้ใช้จัดการช่วยให้คุณควบคุมข้อมูลและความถี่ในการอัปเดตเมตริกได้มากขึ้น หากต้องการใช้เมตริกดังกล่าว คุณต้องเขียนโค้ดที่รวบรวมข้อมูลและเขียนลงใน Cloud Monitoring ดูขั้นตอนถัดไป (ไม่บังคับ) เพื่อดูวิธีติดตั้งใช้งานโดยใช้ OpenTelemetry SDK

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

  1. ดูหน้าต่างของเครื่องมือสำรวจบันทึกที่เราใช้ในขั้นตอนก่อนหน้า ในแผงคำค้นหา ให้ค้นหาเมนูแบบเลื่อนลงการดำเนินการ แล้วคลิกเพื่อเปิด ดูภาพหน้าจอด้านล่างเพื่อค้นหาเมนู
    แถบเครื่องมือผลการค้นหาที่มีเมนูแบบเลื่อนลงของการดำเนินการ
  2. ในเมนูที่เปิดอยู่ ให้เลือกสร้างเมตริกเพื่อเปิดแผงสร้างเมตริกตามบันทึก
  3. ทำตามขั้นตอนต่อไปนี้เพื่อกำหนดค่าเมตริกตัวนับใหม่ในแผงสร้างเมตริกตามบันทึก
    1. ตั้งค่าประเภทเมตริก: เลือกตัวนับ
    2. ตั้งค่าช่องต่อไปนี้ในส่วนรายละเอียด
      • ชื่อเมตริกบันทึก: ตั้งชื่อเป็น model_interaction_count โดยมีข้อจำกัดในการตั้งชื่อบางประการ โปรดดูรายละเอียดที่หัวข้อการแก้ปัญหาเกี่ยวกับข้อจำกัดในการตั้งชื่อ
      • คำอธิบาย: ป้อนคำอธิบายสำหรับเมตริก เช่น Number of log entries capturing successful call to model inference.
      • หน่วย: เว้นว่างไว้หรือแทรกตัวเลข 1
    3. ปล่อยค่าไว้ในส่วนการเลือกตัวกรอง โปรดทราบว่าช่องสร้างตัวกรองมีตัวกรองเดียวกันกับที่เราใช้เพื่อดูบันทึกของแอปพลิเคชัน
    4. (ไม่บังคับ) เพิ่มป้ายกำกับที่จะช่วยนับจำนวนการโทรสำหรับสัตว์แต่ละตัว หมายเหตุ: ป้ายกำกับนี้อาจเพิ่มจำนวนค่าที่เป็นไปได้ของเมตริกอย่างมาก และไม่แนะนำให้ใช้ในเวอร์ชันที่ใช้งานจริง
      1. คลิกเพิ่มป้ายกำกับ
      2. ตั้งค่าช่องต่อไปนี้ในส่วนป้ายกำกับ
        • ชื่อป้ายกำกับ: ตั้งชื่อเป็น animal
        • คำอธิบาย: ป้อนคำอธิบายของป้ายกำกับ เช่น Animal parameter
        • ประเภทป้ายกำกับ: เลือก STRING
        • ชื่อฟิลด์: ประเภท jsonPayload.animal
        • นิพจน์ทั่วไป: เว้นว่างไว้
      3. คลิกเสร็จสิ้น
    5. คลิกสร้างเมตริกเพื่อสร้างเมตริก

นอกจากนี้ คุณยังสร้างเมตริกตามบันทึกจากหน้าเมตริกตามบันทึกได้โดยใช้gcloud logging metrics create คำสั่ง CLI หรือใช้google_logging_metric แหล่งข้อมูล Terraform

หากต้องการสร้างข้อมูลเมตริก ให้เปิด URL ของบริการ รีเฟรชหน้าที่เปิดอยู่หลายๆ ครั้งเพื่อเรียกใช้โมเดลหลายครั้ง เช่นเดียวกับก่อนหน้านี้ ให้ลองใช้สัตว์ที่แตกต่างกันในพารามิเตอร์

ป้อนการค้นหา PromQL เพื่อค้นหาข้อมูลเมตริกตามบันทึก หากต้องการป้อนการค้นหา PromQL ให้ทำดังนี้

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสำรวจเมตริกใน Cloud Console

  2. ในแถบเครื่องมือของแผงเครื่องมือสร้างคำค้นหา ให้เลือกปุ่มที่มีชื่อเป็น < > MQL หรือ < > PromQL ดูตำแหน่งของปุ่มได้ที่รูปภาพด้านล่าง
    ตำแหน่งของปุ่ม MQL ในเครื่องมือสำรวจเมตริก
  3. ตรวจสอบว่าได้เลือก PromQL ในปุ่มเปิด/ปิดภาษา ปุ่มสลับภาษาจะอยู่ในแถบเครื่องมือเดียวกันกับที่ให้คุณจัดรูปแบบคำค้นหา
  4. ป้อนคำค้นหาลงในตัวแก้ไขคำค้นหา
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ PromQL ได้ที่ PromQL ใน Cloud Monitoring
  5. คลิกเรียกใช้การค้นหา คุณจะเห็นแผนภูมิเส้นที่คล้ายกับภาพหน้าจอนี้
    แสดงเมตริกที่ค้นหา

    โปรดทราบว่าเมื่อเปิดใช้ปุ่มเปิด/ปิดเรียกใช้โดยอัตโนมัติ ระบบจะไม่แสดงปุ่มเรียกใช้คําค้นหา

10. (ไม่บังคับ) ใช้ Open Telemetry เพื่อการตรวจสอบและการติดตาม

ดังที่ได้กล่าวไว้ในขั้นตอนก่อนหน้า คุณสามารถใช้เมตริกโดยใช้ OpenTelemetry (Otel) SDK ได้ การใช้ OTel ในสถาปัตยกรรมแบบหลายบริการเป็นแนวทางปฏิบัติที่แนะนำ ขั้นตอนนี้แสดงการเพิ่มการตรวจสอบ OTel ลงในแอปพลิเคชัน Spring Boot ในขั้นตอนนี้ คุณจะดำเนินการต่อไปนี้

  • การวัดคุมแอปพลิเคชัน Spring Boot ด้วยความสามารถในการติดตามอัตโนมัติ
  • การใช้เมตริกตัวนับเพื่อตรวจสอบจำนวนการเรียกโมเดลที่สำเร็จ
  • เชื่อมโยงการติดตามกับบันทึกของแอปพลิเคชัน

สถาปัตยกรรมที่แนะนำสำหรับบริการระดับผลิตภัณฑ์คือการใช้ OTel Collector เพื่อรวบรวมและส่งข้อมูลการตรวจสอบทั้งหมดจากหลายบริการ โค้ดในขั้นตอนนี้ไม่ได้ใช้ตัวรวบรวมเพื่อความเรียบง่าย แต่จะใช้การส่งออก OTel ที่เขียนข้อมูลไปยัง Google Cloud โดยตรงแทน

ตั้งค่าแอปพลิเคชัน Spring Boot ด้วยคอมโพเนนต์ OTel และการติดตามอัตโนมัติ

  1. กลับไปที่หน้าต่าง (หรือแท็บ) "Cloud Shell" ในเบราว์เซอร์
  2. ในเทอร์มินัล ให้อัปเดตไฟล์ application.permissions ด้วยพารามิเตอร์การกำหนดค่าเพิ่มเติม
    cat >> "${HOME}/codelab-o11y/src/main/resources/application.properties" << EOF
    otel.logs.exporter=none
    otel.traces.exporter=google_cloud_trace
    otel.metrics.exporter=google_cloud_monitoring
    otel.resource.attributes.service.name=codelab-o11y-service
    otel.traces.sampler=always_on
    EOF
    
    พารามิเตอร์เหล่านี้กำหนดการส่งออกข้อมูลการสังเกตการณ์ไปยัง Cloud Trace และ Cloud Monitoring รวมถึงบังคับใช้การสุ่มตัวอย่างของ Trace ทั้งหมด
  3. เพิ่มทรัพยากร Dependency ของ OpenTelemetry ที่จำเป็นลงในไฟล์ pom.xml
    sed -i 's/<dependencies>/<dependencies>\
    \
            <dependency>\
                <groupId>io.opentelemetry.instrumentation<\/groupId>\
                <artifactId>opentelemetry-spring-boot-starter<\/artifactId>\
            <\/dependency>\
            <dependency>\
                <groupId>com.google.cloud.opentelemetry<\/groupId>\
                <artifactId>exporter-auto<\/artifactId>\
                <version>0.33.0-alpha<\/version>\
            <\/dependency>\
            <dependency>\
                <groupId>com.google.cloud.opentelemetry<\/groupId>\
                <artifactId>exporter-trace<\/artifactId>\
                <version>0.33.0<\/version>\
            <\/dependency>\
            <dependency>\
                <groupId>com.google.cloud.opentelemetry<\/groupId>\
                <artifactId>exporter-metrics<\/artifactId>\
                <version>0.33.0<\/version>\
            <\/dependency>\
    /g' "${HOME}/codelab-o11y/pom.xml"
    
  4. เพิ่ม BOM ของ OpenTelemetry ลงในไฟล์ pom.xml
    sed -i 's/<\/properties>/<\/properties>\
        <dependencyManagement>\
            <dependencies>\
                <dependency>\
                    <groupId>io.opentelemetry.instrumentation<\/groupId>\
                    <artifactId>opentelemetry-instrumentation-bom<\/artifactId>\
                    <version>2.12.0<\/version>\
                    <type>pom<\/type>\
                    <scope>import<\/scope>\
                <\/dependency>\
            <\/dependencies>\
        <\/dependencyManagement>\
    /g' "${HOME}/codelab-o11y/pom.xml"
    
  5. เปิดไฟล์ DemoApplication.java อีกครั้งใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
    
  6. แทนที่โค้ดปัจจุบันด้วยเวอร์ชันที่เพิ่มเมตริกประสิทธิภาพ หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในโปรแกรมแก้ไข
    package com.example.demo;
    
    import io.opentelemetry.api.common.AttributeKey;
    import io.opentelemetry.api.common.Attributes;
    import io.opentelemetry.api.OpenTelemetry;
    import io.opentelemetry.api.metrics.LongCounter;
    
    import java.io.IOException;
    import java.util.Collections;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.google.cloud.ServiceOptions;
    import com.google.cloud.vertexai.VertexAI;
    import com.google.cloud.vertexai.api.GenerateContentResponse;
    import com.google.cloud.vertexai.generativeai.GenerativeModel;
    import com.google.cloud.vertexai.generativeai.ResponseHandler;
    
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            String port = System.getenv().getOrDefault("PORT", "8080");
            SpringApplication app = new SpringApplication(DemoApplication.class);
            app.setDefaultProperties(Collections.singletonMap("server.port", port));
            app.run(args);
        }
    }
    
    @RestController
    class HelloController {
        private final String projectId = ServiceOptions.getDefaultProjectId();
        private VertexAI vertexAI;
        private GenerativeModel model;
        private final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);
        private static final String INSTRUMENTATION_NAME = "genai-o11y/java/workshop/example";
        private static final AttributeKey<String> ANIMAL = AttributeKey.stringKey("animal");
        private final LongCounter counter;
    
        public HelloController(OpenTelemetry openTelemetry) {
            this.counter = openTelemetry.getMeter(INSTRUMENTATION_NAME)
                    .counterBuilder("model_call_counter")
                    .setDescription("Number of successful model calls")
                    .build();
        }
    
        @PostConstruct
        public void init() {
            vertexAI = new VertexAI(projectId, "us-central1");
            model = new GenerativeModel("gemini-1.5-flash", vertexAI);
        }
    
        @PreDestroy
        public void destroy() {
            vertexAI.close();
        }
    
        @GetMapping("/")
        public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException {
            String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks.";
            GenerateContentResponse response = model.generateContent(prompt);
            LOGGER.atInfo()
                    .addKeyValue("animal", animal)
                    .addKeyValue("prompt", prompt)
                    .addKeyValue("response", response)
                    .log("Content is generated");
            counter.add(1, Attributes.of(ANIMAL, animal));
            return ResponseHandler.getText(response);
        }
    }
    
  7. เปิดไฟล์ LoggingEventGoogleCloudEncoder.java อีกครั้งใน Cloud Shell Editor โดยทำดังนี้
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
    
  8. แทนที่โค้ดปัจจุบันด้วยเวอร์ชันที่เพิ่มแอตทริบิวต์การติดตามลงในบันทึกที่เขียน การเพิ่มแอตทริบิวต์จะช่วยให้เชื่อมโยงบันทึกกับช่วงการติดตามที่ถูกต้องได้ หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในโปรแกรมแก้ไข
    package com.example.demo;
    
    import static ch.qos.logback.core.CoreConstants.UTF_8_CHARSET;
    
    import java.time.Instant;
    import java.util.HashMap;
    
    import ch.qos.logback.core.encoder.EncoderBase;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import com.google.cloud.ServiceOptions;
    import io.opentelemetry.api.trace.Span;
    import io.opentelemetry.api.trace.SpanContext;
    import io.opentelemetry.context.Context;
    
    import com.google.gson.Gson;
    
    
    public class LoggingEventGoogleCloudEncoder extends EncoderBase<ILoggingEvent>  {
        private static final byte[] EMPTY_BYTES = new byte[0];
        private final Gson gson;
        private final String projectId;
        private final String tracePrefix;
    
    
        public LoggingEventGoogleCloudEncoder() {
            this.gson = new Gson();
            this.projectId = lookUpProjectId();
            this.tracePrefix = "projects/" + (projectId == null ? "" : projectId) + "/traces/";
        }
    
        private static String lookUpProjectId() {
            return ServiceOptions.getDefaultProjectId();
        }
    
        @Override
        public byte[] headerBytes() {
            return EMPTY_BYTES;
        }
    
        @Override
        public byte[] encode(ILoggingEvent e) {
            var timestamp = Instant.ofEpochMilli(e.getTimeStamp());
            var fields = new HashMap<String, Object>() {
                {
                    put("timestamp", timestamp.toString());
                    put("severity", severityFor(e.getLevel()));
                    put("message", e.getMessage());
                    SpanContext context = Span.fromContext(Context.current()).getSpanContext();
                    if (context.isValid()) {
                        put("logging.googleapis.com/trace", tracePrefix + context.getTraceId());
                        put("logging.googleapis.com/spanId", context.getSpanId());
                        put("logging.googleapis.com/trace_sampled", Boolean.toString(context.isSampled()));
                    }
                }
            };
            var params = e.getKeyValuePairs();
            if (params != null && params.size() > 0) {
                params.forEach(kv -> fields.putIfAbsent(kv.key, kv.value));
            }
            var data = gson.toJson(fields) + "\n";
            return data.getBytes(UTF_8_CHARSET);
        }
    
        @Override
        public byte[] footerBytes() {
            return EMPTY_BYTES;
        }
    
        private static String severityFor(Level level) {
            switch (level.toInt()) {
                case Level.TRACE_INT:
                return "DEBUG";
                case Level.DEBUG_INT:
                return "DEBUG";
                case Level.INFO_INT:
                return "INFO";
                case Level.WARN_INT:
                return "WARNING";
                case Level.ERROR_INT:
                return "ERROR";
                default:
                return "DEFAULT";
            }
        }
    }
    

หลังจากผ่านไป 2-3 วินาที Cloud Shell Editor จะบันทึกการเปลี่ยนแปลงโดยอัตโนมัติ

ติดตั้งใช้งานโค้ดของแอปพลิเคชัน Gen AI ไปยัง Cloud Run

  1. ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้กับ Cloud Run
    gcloud run deploy codelab-o11y-service \
         --source="${HOME}/codelab-o11y/" \
         --region=us-central1 \
         --allow-unauthenticated
    
    หากเห็นข้อความแจ้งดังด้านล่างที่แจ้งให้ทราบว่าคำสั่งจะสร้างที่เก็บใหม่ คลิก 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)?
    
    กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการติดตั้งใช้งานเสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังนี้
    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. คัดลอก URL ของบริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดปุ่ม Ctrl ค้างไว้เพื่อเปิด URL
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้
    Sorry, this is just a placeholder...
    
    ซึ่งหมายความว่าบริการยังติดตั้งใช้งานไม่เสร็จ รอสักครู่แล้วรีเฟรชหน้าเว็บ ที่ท้ายข้อความ คุณจะเห็นข้อความที่ขึ้นต้นด้วยเรื่องน่ารู้เกี่ยวกับสุนัขและมีเรื่องน่ารู้เกี่ยวกับสุนัข 10 เรื่อง

หากต้องการสร้างข้อมูลการวัดและส่งข้อมูล ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าของพารามิเตอร์ ?animal= เพื่อดูผลลัพธ์ที่แตกต่างกัน

สำรวจการติดตามแอปพลิเคชัน

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้า Trace Explorer ใน Cloud Console

  2. เลือกการติดตามล่าสุดรายการใดรายการหนึ่ง คุณควรเห็น 5 หรือ 6 ช่วงที่มีลักษณะเหมือนในภาพหน้าจอด้านล่าง
    มุมมองของช่วงแอปในเครื่องมือสำรวจ Trace
  3. ค้นหาระยะเวลาที่ติดตามการเรียกไปยังตัวแฮนเดิลเหตุการณ์ (เมธอด fun_facts) ซึ่งจะเป็นช่วงสุดท้ายที่มีชื่อว่า /
  4. ในแผงรายละเอียดการติดตาม ให้เลือกบันทึกและเหตุการณ์ คุณจะเห็นบันทึกของแอปพลิเคชันที่สัมพันธ์กับช่วงเวลานี้ ระบบจะตรวจหาความสัมพันธ์โดยใช้รหัสการติดตามและรหัสช่วงในการติดตามและในบันทึก คุณควรเห็นบันทึกของแอปพลิเคชันที่เขียนพรอมต์และคำตอบของ Vertex API

สำรวจเมตริกตัวนับ

  1. คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสำรวจเมตริกใน Cloud Console

  2. ในแถบเครื่องมือของแผงเครื่องมือสร้างคำค้นหา ให้เลือกปุ่มที่มีชื่อเป็น < > MQL หรือ < > PromQL ดูตำแหน่งของปุ่มได้ที่รูปภาพด้านล่าง
    ตำแหน่งของปุ่ม MQL ในเครื่องมือสำรวจเมตริก
  3. ตรวจสอบว่าได้เลือก PromQL ในปุ่มเปิด/ปิดภาษา ปุ่มสลับภาษาจะอยู่ในแถบเครื่องมือเดียวกันกับที่ให้คุณจัดรูปแบบคำค้นหา
  4. ป้อนคำค้นหาลงในตัวแก้ไขคำค้นหา
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. คลิกเรียกใช้การค้นหา เมื่อเปิดใช้ปุ่มเปิด/ปิดเรียกใช้อัตโนมัติ ระบบจะไม่แสดงปุ่มเรียกใช้การค้นหา

11. (ไม่บังคับ) ข้อมูลที่ละเอียดอ่อนที่ผ่านการปกปิดจากบันทึก

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

  1. สร้างหัวข้อ PubSub เพื่อจัดเก็บรายการบันทึกที่เข้ามา
  2. สร้างซิงก์บันทึกที่เปลี่ยนเส้นทางบันทึกที่ส่งไปยังหัวข้อ PubSub
  3. สร้างไปป์ไลน์ Dataflow ที่แก้ไขบันทึกที่เปลี่ยนเส้นทางไปยังหัวข้อ PubSub โดยทำตามขั้นตอนต่อไปนี้
    1. อ่านรายการบันทึกจากหัวข้อ PubSub
    2. ตรวจสอบเพย์โหลดของรายการเพื่อหาข้อมูลที่ละเอียดอ่อนโดยใช้ DLP Inspection API
    3. ปกปิดข้อมูลที่ละเอียดอ่อนในเพย์โหลดโดยใช้วิธีการปกปิดข้อมูลของ DLP วิธีใดวิธีหนึ่ง
    4. เขียนรายการบันทึกที่ปิดบังไปยัง Cloud Logging
  4. ทำให้ไปป์ไลน์ใช้งานได้

12. (ไม่บังคับ) ล้างข้อมูล

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

  1. หากต้องการลบโปรเจ็กต์ ให้เรียกใช้คำสั่งลบโปรเจ็กต์ในเทอร์มินัล
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    การลบโปรเจ็กต์ Cloud จะหยุดการเรียกเก็บเงินสำหรับทรัพยากรและ API ทั้งหมดที่ใช้ภายในโปรเจ็กต์นั้น คุณควรเห็นข้อความนี้โดยที่ PROJECT_ID จะเป็นรหัสโปรเจ็กต์ของคุณ
    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. (ไม่บังคับ) หากได้รับข้อผิดพลาด ให้ดูขั้นตอนที่ 5 เพื่อค้นหารหัสโปรเจ็กต์ที่คุณใช้ในระหว่างแล็บ แทนที่ด้วยคำสั่งในวิธีการแรก เช่น หากรหัสโปรเจ็กต์คือ lab-example-project คำสั่งจะเป็นดังนี้
    gcloud projects delete lab-project-id-example --quiet
    

13. ขอแสดงความยินดี

ในแล็บนี้ คุณได้สร้างแอปพลิเคชัน Gen AI ที่ใช้โมเดล Gemini เพื่อทำการคาดการณ์ และติดตั้งเครื่องมือในแอปพลิเคชันด้วยความสามารถในการตรวจสอบและการบันทึกที่จำเป็น คุณได้ติดตั้งใช้งานแอปพลิเคชันและการเปลี่ยนแปลงจากซอร์สโค้ดไปยัง Cloud Run จากนั้นใช้ผลิตภัณฑ์ Google Cloud Observability เพื่อติดตามประสิทธิภาพของแอปพลิเคชัน เพื่อให้มั่นใจในความน่าเชื่อถือของแอปพลิเคชัน

หากสนใจเข้าร่วมการศึกษาวิจัยประสบการณ์ของผู้ใช้ (UX) เพื่อปรับปรุงผลิตภัณฑ์ที่คุณใช้ในวันนี้ โปรดลงทะเบียนที่นี่

ตัวเลือกบางส่วนสำหรับการเรียนรู้ต่อมีดังนี้