Java में जनरेटिव एआई ऐप्लिकेशन के लिए, मॉनिटर करने की काम की तकनीकें

1. खास जानकारी

जनरेटिव एआई के ऐप्लिकेशन के लिए, अन्य ऐप्लिकेशन की तरह ही ऑब्ज़र्वेबिलिटी की ज़रूरत होती है. क्या जनरेटिव एआई के लिए, ऑब्ज़र्वेबिलिटी की खास तकनीकों की ज़रूरत होती है?

इस लैब में, आपको एक आसान जनरेटिव एआई ऐप्लिकेशन बनाना होगा. इसे Cloud Run पर डिप्लॉय करें. साथ ही, Google Cloud की निगरानी और लॉगिंग की सेवाओं और प्रॉडक्ट का इस्तेमाल करके, इसे ज़रूरी निगरानी और लॉगिंग की सुविधाओं से लैस करें.

आपको क्या सीखने को मिलेगा

  • Cloud Shell Editor के साथ Vertex AI का इस्तेमाल करने वाला ऐप्लिकेशन लिखना
  • अपने ऐप्लिकेशन के कोड को GitHub में सेव करना
  • अपने ऐप्लिकेशन के सोर्स कोड को Cloud Run पर डिप्लॉय करने के लिए, gcloud CLI का इस्तेमाल करना
  • अपने जनरेटिव एआई ऐप्लिकेशन में मॉनिटरिंग और लॉगिंग की सुविधाएं जोड़ना
  • लॉग पर आधारित मेट्रिक का इस्तेमाल करना
  • Open Telemetry SDK की मदद से लॉगिंग और मॉनिटरिंग लागू करना
  • ज़िम्मेदारी से डेवलप किए गए एआई के लिए डेटा हैंडलिंग के बारे में अहम जानकारी

2. ज़रूरी शर्तें

अगर आपके पास पहले से कोई Google खाता नहीं है, तो आपको नया खाता बनाना होगा.

3. प्रोजेक्ट सेटअप करना

  1. अपने Google खाते से Google Cloud Console में साइन इन करें.
  2. नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. आपने अभी-अभी जो प्रोजेक्ट बनाया है या चुना है उसका प्रोजेक्ट आईडी लिख लें.
  3. प्रोजेक्ट के लिए बिलिंग की सुविधा चालू करें.
    • इस लैब को पूरा करने पर, बिलिंग की लागत 5 डॉलर से कम होनी चाहिए.
    • ज़्यादा शुल्क से बचने के लिए, इस लैब के आखिर में दिए गए निर्देशों का पालन करके संसाधनों को मिटाया जा सकता है.
    • नए उपयोगकर्ता, 300 डॉलर के मुफ़्त में आज़माने की सुविधा का फ़ायदा पा सकते हैं.
  4. पुष्टि करें कि Cloud Billing में मेरे प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है
    • अगर आपके नए प्रोजेक्ट के Billing account कॉलम में Billing is disabled दिखता है, तो:
      1. Actions कॉलम में मौजूद तीन बिंदुओं पर क्लिक करें
      2. बिलिंग बदलें पर क्लिक करें
      3. वह बिलिंग खाता चुनें जिसका आपको इस्तेमाल करना है
    • अगर आपको किसी लाइव इवेंट में शामिल होना है, तो खाते का नाम Google Cloud Platform का ट्रायल बिलिंग खाता होगा

4. Cloud Shell Editor तैयार करना

  1. Cloud Shell Editor पर जाएं. अगर आपको यह मैसेज दिखता है, जिसमें Cloud Shell को अपने क्रेडेंशियल के साथ gcloud को कॉल करने की अनुमति देने का अनुरोध किया गया है, तो जारी रखने के लिए अनुमति दें पर क्लिक करें.
    Cloud Shell को अनुमति देने के लिए क्लिक करें
  2. टर्मिनल विंडो खोलें
    1. हैमबर्गर मेन्यू हैमबर्गर मेन्यू का आइकॉन पर क्लिक करें
    2. टर्मिनल पर क्लिक करें
    3. नया टर्मिनल
      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 API चालू करना

टर्मिनल में, इस लैब के लिए ज़रूरी 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 से शुरू होने वाला कोई गड़बड़ी का मैसेज मिलता है और उसमें गड़बड़ी की जानकारी इस तरह दी गई है, तो एक से दो मिनट बाद कमांड को फिर से आज़माएं.

"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. जनरेटिव एआई ऐप्लिकेशन बनाना

इस चरण में, आपको अनुरोध पर आधारित एक सामान्य ऐप्लिकेशन का कोड लिखना होगा. यह ऐप्लिकेशन, आपकी पसंद के किसी जानवर के बारे में 10 मज़ेदार तथ्य दिखाने के लिए Gemini मॉडल का इस्तेमाल करता है. ऐप्लिकेशन कोड बनाने के लिए, यह तरीका अपनाएं.

  1. टर्मिनल में, codelab-o11y डायरेक्ट्री बनाएं:
    mkdir "${HOME}/codelab-o11y"
    
  2. मौजूदा डायरेक्ट्री को codelab-o11y में बदलें:
    cd "${HOME}/codelab-o11y"
    
  3. Spring फ़्रेमवर्क स्टार्टर का इस्तेमाल करके, Java ऐप्लिकेशन का बूटस्ट्रैप कोड डाउनलोड करें:
    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. बूटस्ट्रैप कोड को मौजूदा फ़ोल्डर में अनआर्काइव करें:
    unzip java-starter.zip
    
  5. इसके बाद, फ़ोल्डर से संग्रह की गई फ़ाइल को हटा दें:
    rm java-starter.zip
    
  6. Cloud Run पर कोड डिप्लॉय करते समय इस्तेमाल किए जाने वाले Java Runtime के वर्शन को तय करने के लिए, project.toml फ़ाइल बनाएं:
    cat > "${HOME}/codelab-o11y/project.toml" << EOF
    [[build.env]]
        name = "GOOGLE_RUNTIME_VERSION"
        value = "17"
    EOF
    
  7. pom.xml फ़ाइल में Google Cloud SDK डिपेंडेंसी जोड़ें:
    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. Google Cloud Vertex AI पैकेज जोड़ें:
      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. Cloud Shell Editor में DemoApplication.java फ़ाइल खोलें:
    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);
        }
    }
    
    कुछ सेकंड बाद, Cloud Shell Editor आपके कोड को अपने-आप सेव कर देगा.

जेन एआई ऐप्लिकेशन के कोड को 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. दिखाए गए Cloud Run सेवा के यूआरएल को अपने ब्राउज़र में अलग टैब या विंडो में कॉपी करें. इसके अलावा, सेवा का यूआरएल प्रिंट करने के लिए, टर्मिनल में यह कमांड चलाएं. साथ ही, यूआरएल खोलने के लिए, Ctrl कुंजी को दबाकर रखते हुए, दिखाए गए यूआरएल पर क्लिक करें:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    यूआरएल खोलने पर, आपको 500 गड़बड़ी का मैसेज मिल सकता है या यह मैसेज दिख सकता है:
    Sorry, this is just a placeholder...
    
    इसका मतलब है कि सेवाएं पूरी तरह से डिप्लॉय नहीं हुई हैं. कुछ देर इंतज़ार करें और पेज को रीफ़्रेश करें. आखिर में आपको कुत्तों के बारे में मज़ेदार तथ्य से शुरू होने वाला एक टेक्स्ट दिखेगा. इसमें कुत्तों के बारे में 10 मज़ेदार तथ्य शामिल होंगे.

अलग-अलग जानवरों के बारे में मज़ेदार तथ्य जानने के लिए, ऐप्लिकेशन के साथ इंटरैक्ट करें. इसके लिए, यूआरएल में animal पैरामीटर जोड़ें. जैसे, ?animal=[ANIMAL]. यहां [ANIMAL] जानवर का नाम है. उदाहरण के लिए, बिल्लियों के बारे में 10 मज़ेदार तथ्य जानने के लिए ?animal=cat जोड़ें या समुद्री कछुओं के बारे में 10 मज़ेदार तथ्य जानने के लिए ?animal=sea turtle जोड़ें.

7. अपने Vertex API कॉल का ऑडिट करना

Google API कॉल की ऑडिट करने से, इन सवालों के जवाब मिलते हैं: "किसने, कहां, और कब किसी एपीआई को कॉल किया?". अपने ऐप्लिकेशन की समस्या हल करने, संसाधनों के इस्तेमाल की जांच करने या सॉफ़्टवेयर फ़ॉरेंसिक विश्लेषण करने के लिए, ऑडिट करना ज़रूरी है.

ऑडिट लॉग की मदद से, एडमिन और सिस्टम की गतिविधियों को ट्रैक किया जा सकता है. साथ ही, "डेटा रीड करें" और "डेटा लिखें" एपीआई ऑपरेशनों के लिए कॉल लॉग किए जा सकते हैं. कॉन्टेंट जनरेट करने के लिए, Vertex AI के अनुरोधों की ऑडिट करने के लिए, आपको Cloud Console में "डेटा रीड" ऑडिट लॉग चालू करने होंगे.

  1. Cloud Console में ऑडिट लॉग पेज खोलने के लिए, नीचे दिए गए बटन पर क्लिक करें

  2. पक्का करें कि पेज पर, इस लैब के लिए बनाया गया प्रोजेक्ट चुना गया हो. चुना गया प्रोजेक्ट, हैमबर्गर मेन्यू
    Google Cloud Console प्रोजेक्ट का ड्रॉपडाउन
    से लेकर पेज के सबसे ऊपर बाएं कोने में दिखता है. अगर ज़रूरी हो, तो कॉम्बोबॉक्स से सही प्रोजेक्ट चुनें.
  3. डेटा ऐक्सेस करने से जुड़े ऑडिट लॉग कॉन्फ़िगरेशन टेबल में, सेवा वाले कॉलम में जाकर Vertex AI API सेवा ढूंढें. इसके बाद, सेवा के नाम के बाईं ओर मौजूद चेकबॉक्स को चुनकर सेवा को चुनें.
    Vertex AI API चुनें
  4. दाईं ओर मौजूद जानकारी वाले पैनल में, "डेटा पढ़ा गया" ऑडिट टाइप चुनें.
    डेटा पढ़ने से जुड़े लॉग देखना
  5. सेव करें पर क्लिक करें.

ऑडिट लॉग जनरेट करने के लिए, सेवा का यूआरएल खोलें. अलग-अलग नतीजे पाने के लिए, ?animal= पैरामीटर की वैल्यू बदलते समय पेज को रीफ़्रेश करें.

ऑडिट लॉग एक्सप्लोर करना

  1. Cloud Console में लॉग एक्सप्लोरर पेज खोलने के लिए, नीचे दिए गए बटन पर क्लिक करें:

  2. नीचे दिए गए फ़िल्टर को क्वेरी पैनल में चिपकाएं.
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    क्वेरी पैन, Logs Explorer पेज पर सबसे ऊपर मौजूद एक एडिटर होता है:
    ऑडिट लॉग के लिए क्वेरी करना
  3. क्वेरी चलाएं पर क्लिक करें.
  4. ऑडिट लॉग की किसी एक एंट्री को चुनता है और फ़ील्ड को बड़ा करता है, ताकि लॉग में कैप्चर की गई जानकारी की जांच की जा सके.
    Vertex API कॉल के बारे में जानकारी देखी जा सकती है. इसमें इस्तेमाल किया गया तरीका और मॉडल शामिल है. इसके अलावा, आपको यह भी पता चल सकता है कि कॉल किसने किया और कॉल करने के लिए किन अनुमतियों का इस्तेमाल किया गया.

8. जेन एआई के साथ हुई बातचीत को लॉग करना

आपको ऑडिट लॉग में, एपीआई अनुरोध के पैरामीटर या जवाब का डेटा नहीं मिलता. हालांकि, ऐप्लिकेशन और वर्कफ़्लो के विश्लेषण से जुड़ी समस्याओं को हल करने के लिए, यह जानकारी अहम हो सकती है. इस चरण में, हम ऐप्लिकेशन लॉगिंग की सुविधा जोड़कर इस कमी को पूरा करते हैं.

इस कोड में, ऐप्लिकेशन के लॉग को स्टैंडर्ड आउटपुट में प्रिंट करने के लिए, Spring Boot के साथ Logback का इस्तेमाल किया जाता है. इस तरीके में, Cloud Run की क्षमता का इस्तेमाल किया जाता है. इससे स्टैंडर्ड आउटपुट में प्रिंट की गई जानकारी को कैप्चर किया जाता है और उसे Cloud Logging में अपने-आप शामिल किया जाता है. जानकारी को स्ट्रक्चर्ड डेटा के तौर पर कैप्चर करने के लिए, प्रिंट किए गए लॉग को उसी के मुताबिक फ़ॉर्मैट किया जाना चाहिए. ऐप्लिकेशन में स्ट्रक्चर्ड लॉगिंग की सुविधाएं जोड़ने के लिए, यहां दिए गए निर्देशों का पालन करें.

  1. अपने ब्राउज़र में ‘Cloud Shell' विंडो (या टैब) पर वापस जाएं.
  2. Cloud Shell Editor में नई फ़ाइल LoggingEventGoogleCloudEncoder.java बनाएं और उसे खोलें:
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
    
  3. Google Cloud के स्ट्रक्चर्ड लॉग फ़ॉर्मैट के मुताबिक, लॉग को स्ट्रिंग वाले JSON के तौर पर कोड में बदलने वाले Logback एनकोडर को लागू करने के लिए, यहां दिया गया कोड कॉपी करके चिपकाएं:
    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. Cloud Shell Editor में नई फ़ाइल logback.xml बनाएं और उसे खोलें:
    cloudshell edit "${HOME}/codelab-o11y/src/main/resources/logback.xml"
    
  5. Logback को कॉन्फ़िगर करने के लिए, इस 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. Cloud Shell Editor में DemoApplication.java फ़ाइल को फिर से खोलें:
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
    
  7. जनरेटिव एआई के अनुरोध और जवाब को लॉग करने के लिए, एडिटर में मौजूद कोड को यहां दिखाए गए वर्शन से बदलें. कोड बदलने के लिए, फ़ाइल का कॉन्टेंट मिटाएं. इसके बाद, यहां दिए गए कोड को एडिटर में कॉपी करें:
    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);
        }
    }
    

कुछ सेकंड बाद, Cloud Shell Editor आपके बदलावों को अपने-आप सेव कर लेता है.

जेन एआई ऐप्लिकेशन के कोड को 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. दिखाए गए Cloud Run सेवा के यूआरएल को अपने ब्राउज़र में अलग टैब या विंडो में कॉपी करें. इसके अलावा, सेवा का यूआरएल प्रिंट करने के लिए, टर्मिनल में यह कमांड चलाएं. साथ ही, यूआरएल खोलने के लिए, Ctrl कुंजी को दबाकर रखते हुए, दिखाए गए यूआरएल पर क्लिक करें:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    यूआरएल खोलने पर, आपको 500 गड़बड़ी का मैसेज मिल सकता है या यह मैसेज दिख सकता है:
    Sorry, this is just a placeholder...
    
    इसका मतलब है कि सेवाएं पूरी तरह से डिप्लॉय नहीं हुई हैं. कुछ देर इंतज़ार करें और पेज को रीफ़्रेश करें. आखिर में आपको कुत्तों के बारे में मज़ेदार तथ्य से शुरू होने वाला एक टेक्स्ट दिखेगा. इसमें कुत्तों के बारे में 10 मज़ेदार तथ्य शामिल होंगे.

ऐप्लिकेशन लॉग जनरेट करने के लिए, सेवा का यूआरएल खोलें. अलग-अलग नतीजे पाने के लिए, ?animal= पैरामीटर की वैल्यू बदलते समय पेज को रीफ़्रेश करें.
ऐप्लिकेशन के लॉग देखने के लिए, यह तरीका अपनाएं:

  1. Cloud Console में लॉग एक्सप्लोरर पेज खोलने के लिए, नीचे दिए गए बटन पर क्लिक करें:

  2. इस फ़िल्टर को क्वेरी पैन में चिपकाएं. यह लॉग एक्सप्लोरर इंटरफ़ेस में #2 पर मौजूद है:
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. क्वेरी चलाएं पर क्लिक करें.

क्वेरी के नतीजे में, प्रॉम्प्ट और Vertex AI के जवाब वाले लॉग दिखते हैं. इनमें सुरक्षा रेटिंग भी शामिल हैं.

9. जेन एआई के साथ हुई बातचीत की संख्या

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 सीएलआई कमांड या google_logging_metric Terraform संसाधन का इस्तेमाल करें.

मेट्रिक का डेटा जनरेट करने के लिए, सेवा का यूआरएल खोलें. मॉडल को कई बार कॉल करने के लिए, खोले गए पेज को कई बार रीफ़्रेश करें. पहले की तरह, पैरामीटर में अलग-अलग जानवरों के नाम इस्तेमाल करें.

लॉग पर आधारित मेट्रिक डेटा खोजने के लिए, 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 का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Cloud Monitoring में PromQL लेख पढ़ें.
  5. क्वेरी चलाएं पर क्लिक करें. आपको इस स्क्रीनशॉट की तरह एक लाइन चार्ट दिखेगा:
    क्वेरी की गई मेट्रिक दिखाएं

    ध्यान दें कि अपने-आप चलने की सुविधा टॉगल चालू होने पर, क्वेरी चलाएं बटन नहीं दिखता.

10. (ज़रूरी नहीं) मॉनिटरिंग और ट्रेसिंग के लिए, Open Telemetry का इस्तेमाल करें

पिछले चरण में बताया गया है कि OpenTelemetry (Otel) SDK का इस्तेमाल करके मेट्रिक लागू की जा सकती हैं. कई सेवाओं वाले आर्किटेक्चर पर OTel का इस्तेमाल करना एक अच्छा तरीका है. इस चरण में, Spring Boot ऐप्लिकेशन में OTel इंस्ट्रूमेंटेशन जोड़ने का तरीका दिखाया गया है. इस चरण में, आपको ये काम करने होंगे:

  • स्प्रिंग बूट ऐप्लिकेशन को ऑटोमैटिक ट्रेसिंग की सुविधाओं के साथ इंस्ट्रुमेंट करना
  • मॉडल कॉल की संख्या को मॉनिटर करने के लिए, काउंटर मेट्रिक लागू करना
  • ऐप्लिकेशन लॉग के साथ ट्रेसिंग को जोड़ना

प्रॉडक्ट-लेवल की सेवाओं के लिए, हमारा सुझाव है कि आप OTel कलेक्टर का इस्तेमाल करें. इससे, कई सेवाओं से मिले सभी ऑब्ज़र्वेबिलिटी डेटा को इकट्ठा और प्रोसेस किया जा सकता है. इस चरण के कोड में, कलेक्टर का इस्तेमाल नहीं किया गया है, ताकि इसे आसानी से समझा जा सके. इसके बजाय, यह OTel एक्सपोर्ट का इस्तेमाल करता है. ये एक्सपोर्ट, डेटा को सीधे Google Cloud में लिखते हैं.

OTel कॉम्पोनेंट और अपने-आप ट्रेस करने की सुविधा के साथ Spring Boot ऐप्लिकेशन सेट अप करना

  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 में ऑब्ज़र्वेबिलिटी डेटा एक्सपोर्ट करने के बारे में पता चलता है. साथ ही, ये सभी ट्रेस के लिए सैंपलिंग लागू करते हैं.
  3. pom.xml फ़ाइल में, OpenTelemetry की ज़रूरी डिपेंडेंसी जोड़ें:
    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. pom.xml फ़ाइल में OpenTelemetry BOM जोड़ें:
    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. Cloud Shell Editor में DemoApplication.java फ़ाइल को फिर से खोलें:
    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. Cloud Shell Editor में LoggingEventGoogleCloudEncoder.java फ़ाइल को फिर से खोलें:
    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";
            }
        }
    }
    

कुछ सेकंड बाद, Cloud Shell Editor आपके बदलावों को अपने-आप सेव कर लेता है.

जेन एआई ऐप्लिकेशन के कोड को 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. दिखाए गए Cloud Run सेवा के यूआरएल को अपने ब्राउज़र में अलग टैब या विंडो में कॉपी करें. इसके अलावा, सेवा का यूआरएल प्रिंट करने के लिए, टर्मिनल में यह कमांड चलाएं. साथ ही, यूआरएल खोलने के लिए, Ctrl कुंजी को दबाकर रखते हुए, दिखाए गए यूआरएल पर क्लिक करें:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    यूआरएल खोलने पर, आपको 500 गड़बड़ी का मैसेज मिल सकता है या यह मैसेज दिख सकता है:
    Sorry, this is just a placeholder...
    
    इसका मतलब है कि सेवाएं पूरी तरह से डिप्लॉय नहीं हुई हैं. कुछ देर इंतज़ार करें और पेज को रीफ़्रेश करें. आखिर में आपको कुत्तों के बारे में मज़ेदार तथ्य से शुरू होने वाला एक टेक्स्ट दिखेगा. इसमें कुत्तों के बारे में 10 मज़ेदार तथ्य शामिल होंगे.

टेलीमेट्री डेटा जनरेट करने के लिए, सेवा का यूआरएल खोलें. अलग-अलग नतीजे पाने के लिए, ?animal= पैरामीटर की वैल्यू बदलते समय पेज को रीफ़्रेश करें.

ऐप्लिकेशन के ट्रेस एक्सप्लोर करना

  1. Cloud Console में Trace explorer पेज खोलने के लिए, नीचे दिए गए बटन पर क्लिक करें:

  2. सबसे हाल के ट्रेस में से किसी एक को चुनें. आपको पांच या छह स्पैन दिखेंगे. ये स्पैन, नीचे दिए गए स्क्रीनशॉट में दिखाए गए स्पैन की तरह दिखेंगे.
    ट्रेस एक्सप्लोरर में ऐप्लिकेशन स्पैन का व्यू
  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. (ज़रूरी नहीं) लॉग से संवेदनशील जानकारी को छिपाया गया हो

दसवें चरण में, हमने Gemini मॉडल के साथ ऐप्लिकेशन के इंटरैक्शन की जानकारी लॉग की है. इस जानकारी में जानवर का नाम, असल प्रॉम्प्ट, और मॉडल का जवाब शामिल था. इस जानकारी को लॉग में सेव करना सुरक्षित होना चाहिए. हालांकि, कई अन्य स्थितियों में ऐसा होना ज़रूरी नहीं है. प्रॉम्प्ट में कुछ निजी या संवेदनशील जानकारी शामिल हो सकती है. ऐसा हो सकता है कि उपयोगकर्ता इस जानकारी को सेव न करना चाहे. इस समस्या को हल करने के लिए, Cloud Logging में लिखे गए संवेदनशील डेटा को अस्पष्ट किया जा सकता है. कोड में कम से कम बदलाव करने के लिए, यह तरीका आज़माएं.

  1. आने वाली लॉग एंट्री सेव करने के लिए, PubSub विषय बनाएं
  2. एक लॉग सिंक बनाएं, जो PubSub विषय पर भेजे गए लॉग को रीडायरेक्ट करता हो.
  3. PubSub विषय पर रीडायरेक्ट किए गए लॉग में बदलाव करने के लिए, Dataflow पाइपलाइन बनाएं. इसके लिए, यह तरीका अपनाएं:
    1. PubSub विषय से लॉग एंट्री पढ़ना
    2. DLP inspection API का इस्तेमाल करके, एंट्री के पेलोड में मौजूद संवेदनशील जानकारी की जांच करना
    3. डीएलपी के डेटा छिपाने के तरीकों में से किसी एक का इस्तेमाल करके, पेलोड में मौजूद संवेदनशील जानकारी को छिपाएं
    4. Cloud Logging में, अस्पष्ट की गई लॉग एंट्री लिखें
  4. पाइपलाइन डिप्लॉय करना

12. (ज़रूरी नहीं) व्यवस्थित करें

कोड लैब में इस्तेमाल किए गए संसाधनों और एपीआई के लिए शुल्क लगने से बचने के लिए, हमारा सुझाव है कि लैब पूरा होने के बाद, उन्हें हटा दें. बिलिंग को बंद करने का सबसे आसान तरीका यह है कि आप उस प्रोजेक्ट को मिटा दें जिसे आपने कोडलैब के लिए बनाया था.

  1. प्रोजेक्ट को मिटाने के लिए, टर्मिनल में delete project कमांड चलाएं:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    अपने Cloud प्रोजेक्ट को मिटाने से, उस प्रोजेक्ट में इस्तेमाल किए गए सभी संसाधनों और एपीआई के लिए बिलिंग बंद हो जाती है. आपको यह मैसेज दिखेगा. इसमें 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. (ज़रूरी नहीं) अगर आपको कोई गड़बड़ी मिलती है, तो पांचवें चरण में जाकर उस प्रोजेक्ट आईडी को ढूंढें जिसका इस्तेमाल आपने लैब के दौरान किया था. इसे पहले निर्देश में दी गई कमांड से बदलें. उदाहरण के लिए, अगर आपका प्रोजेक्ट आईडी lab-example-project है, तो कमांड यह होगी:
    gcloud projects delete lab-project-id-example --quiet
    

13. बधाई हो

इस लैब में, आपने एक जनरेटिव एआई ऐप्लिकेशन बनाया है. यह ऐप्लिकेशन, अनुमान लगाने के लिए Gemini मॉडल का इस्तेमाल करता है. साथ ही, ऐप्लिकेशन में मॉनिटर करने और लॉग करने की ज़रूरी सुविधाएं जोड़ी हैं. आपने सोर्स कोड से ऐप्लिकेशन और बदलावों को Cloud Run पर डिप्लॉय किया हो. इसके बाद, ऐप्लिकेशन की परफ़ॉर्मेंस को ट्रैक करने के लिए, Google Cloud Observability प्रॉडक्ट का इस्तेमाल करें. इससे आपको ऐप्लिकेशन की विश्वसनीयता के बारे में पता चल पाएगा.

अगर आपको यूज़र एक्सपीरियंस (यूएक्स) से जुड़ी रिसर्च स्टडी में शामिल होना है, ताकि आज इस्तेमाल किए गए प्रॉडक्ट को बेहतर बनाया जा सके, तो यहां रजिस्टर करें.

यहां सीखने के कुछ विकल्प दिए गए हैं: