জাভাতে জেনারেটিভ এআই অ্যাপ্লিকেশনের জন্য ব্যবহারিক পর্যবেক্ষণ কৌশল

1. ওভারভিউ

Gen AI অ্যাপ্লিকেশনগুলির জন্য অন্য যে কোনও মতো পর্যবেক্ষণযোগ্যতা প্রয়োজন। জেনারেটিভ এআই-এর জন্য কি বিশেষ পর্যবেক্ষণ কৌশল প্রয়োজন?

এই ল্যাবে, আপনি একটি সাধারণ জেনারেল এআই অ্যাপ্লিকেশন তৈরি করবেন। ক্লাউড রানে এটি স্থাপন করুন। এবং Google ক্লাউড পর্যবেক্ষণযোগ্যতা পরিষেবা এবং পণ্যগুলি ব্যবহার করে প্রয়োজনীয় পর্যবেক্ষণ এবং লগিং ক্ষমতা সহ এটিকে যন্ত্র তৈরি করুন৷

যা শিখবেন

  • ক্লাউড শেল এডিটরের সাথে Vertex AI ব্যবহার করে এমন একটি অ্যাপ্লিকেশন লিখুন
  • GitHub এ আপনার অ্যাপ্লিকেশন কোড সংরক্ষণ করুন
  • ক্লাউড রানে আপনার অ্যাপ্লিকেশনের সোর্স কোড স্থাপন করতে gcloud CLI ব্যবহার করুন
  • আপনার জেনারেল এআই অ্যাপ্লিকেশনে নিরীক্ষণ এবং লগিং ক্ষমতা যুক্ত করুন
  • লগ-ভিত্তিক মেট্রিক্স ব্যবহার করে
  • ওপেন টেলিমেট্রি SDK-এর মাধ্যমে লগিং এবং পর্যবেক্ষণ বাস্তবায়ন করা
  • দায়িত্বশীল AI ডেটা পরিচালনার অন্তর্দৃষ্টি পান

2. পূর্বশর্ত

আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে তবে আপনাকে একটি নতুন অ্যাকাউন্ট তৈরি করতে হবে।

3. প্রকল্প সেটআপ

  1. আপনার Google অ্যাকাউন্ট দিয়ে Google ক্লাউড কনসোলে সাইন-ইন করুন।
  2. একটি নতুন প্রকল্প তৈরি করুন বা একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করতে বেছে নিন। আপনি যে প্রকল্পটি তৈরি করেছেন বা নির্বাচন করেছেন তার প্রকল্প আইডি লিখুন।
  3. প্রকল্পের জন্য বিলিং সক্ষম করুন
    • এই ল্যাবটি সম্পূর্ণ করতে বিলিং খরচে $5 এর কম খরচ হওয়া উচিত।
    • আপনি আরও চার্জ এড়াতে সংস্থানগুলি মুছতে এই ল্যাবের শেষে পদক্ষেপগুলি অনুসরণ করতে পারেন৷
    • নতুন ব্যবহারকারীরা $300 USD ফ্রি ট্রায়ালের জন্য যোগ্য৷
  4. ক্লাউড বিলিং-এ আমার প্রকল্পগুলিতে বিলিং সক্ষম করা হয়েছে তা নিশ্চিত করুন৷
    • যদি আপনার নতুন প্রকল্প বলে যে Billing account কলামে Billing is disabled :
      1. Actions কলামে তিনটি বিন্দুতে ক্লিক করুন
      2. বিলিং পরিবর্তন করুন ক্লিক করুন
      3. আপনি যে বিলিং অ্যাকাউন্টটি ব্যবহার করতে চান তা নির্বাচন করুন
    • আপনি যদি কোনো লাইভ ইভেন্টে যোগ দেন, তাহলে অ্যাকাউন্টটির নাম সম্ভবত Google ক্লাউড প্ল্যাটফর্ম ট্রায়াল বিলিং অ্যাকাউন্ট হবে

4. ক্লাউড শেল এডিটর প্রস্তুত করুন

  1. ক্লাউড শেল এডিটরে নেভিগেট করুন। আপনার শংসাপত্র সহ gcloud কল করার জন্য ক্লাউড শেলকে অনুমোদন করার অনুরোধ করে যদি আপনাকে নিম্নলিখিত বার্তার সাথে অনুরোধ করা হয়, চালিয়ে যেতে অনুমোদন ক্লিক করুন।
    ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  2. টার্মিনাল উইন্ডো খুলুন
    1. হ্যামবার্গার মেনুতে ক্লিক করুন হ্যামবার্গার মেনু আইকন
    2. টার্মিনাল ক্লিক করুন
    3. নতুন টার্মিনালে ক্লিক করুন
      ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  3. টার্মিনালে, আপনার প্রকল্প আইডি কনফিগার করুন:
    gcloud config set project [PROJECT_ID]
    
    আপনার প্রকল্পের ID দিয়ে [PROJECT_ID] প্রতিস্থাপন করুন। উদাহরণস্বরূপ, যদি আপনার প্রকল্প আইডি হয় lab-example-project , কমান্ডটি হবে:
    gcloud config set project lab-project-id-example
    
    যদি আপনাকে নিম্নলিখিত বার্তার সাথে অনুরোধ করা হয়, এই বলে যে gcloud আপনার শংসাপত্রগুলি GCPI API-তে অনুরোধ করছে, চালিয়ে যেতে অনুমোদন ক্লিক করুন।
    ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
    সফলভাবে সঞ্চালনের সময় আপনাকে নিম্নলিখিত বার্তাটি দেখতে হবে:
    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 এবং নিচের মতো ত্রুটির বিবরণ রয়েছে, তাহলে 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. একটি জেনারেল এআই অ্যাপ্লিকেশন তৈরি করুন

এই ধাপে আপনি সহজ অনুরোধ-ভিত্তিক অ্যাপ্লিকেশনের একটি কোড লিখবেন যা আপনার পছন্দের একটি প্রাণী সম্পর্কে 10টি মজার তথ্য দেখানোর জন্য মিথুন মডেল ব্যবহার করে। অ্যাপ্লিকেশন কোড তৈরি করতে অনুসরণ করুন.

  1. টার্মিনালে, codelab-o11y ডিরেক্টরি তৈরি করুন:
    mkdir "${HOME}/codelab-o11y"
    
  2. বর্তমান ডিরেক্টরিকে codelab-o11y এ পরিবর্তন করুন:
    cd "${HOME}/codelab-o11y"
    
  3. স্প্রিং ফ্রেমওয়ার্ক স্টার্টার ব্যবহার করে জাভা অ্যাপ্লিকেশনের বুটস্ট্র্যাপ কোড ডাউনলোড করুন:
    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. ক্লাউড রানে কোড স্থাপন করার সময় ব্যবহার করা জাভা রানটাইম সংস্করণ সংজ্ঞায়িত করতে 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 ক্লাউড কোর প্যাকেজ যোগ করুন:
      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. ক্লাউড শেল এডিটরে 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);
        }
    }
    
    কয়েক সেকেন্ড পরে, ক্লাউড শেল এডিটর আপনার কোড স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে।

ক্লাউড রানে জেনারেল এআই অ্যাপ্লিকেশনের কোড স্থাপন করুন

  1. টার্মিনাল উইন্ডোতে ক্লাউড রানে অ্যাপ্লিকেশনটির সোর্স কোড স্থাপন করতে কমান্ডটি চালান।
    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টি অনুলিপি করুন৷ বিকল্পভাবে, পরিষেবা 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 প্যারামিটার যোগ করুন, যেমন ?animal=[ANIMAL] যেখানে [ANIMAL] একটি প্রাণীর নাম। উদাহরণস্বরূপ, বিড়াল সম্পর্কে 10টি মজার তথ্য পেতে ? ?animal=cat যোগ করুন অথবা সামুদ্রিক কচ্ছপ সম্পর্কে 10টি মজার তথ্য পেতে ?animal=sea turtle যোগ করুন।

7. আপনার Vertex API কল অডিট করুন

Google API কলগুলি নিরীক্ষণ করা প্রশ্নগুলির উত্তর প্রদান করে যেমন "কে একটি নির্দিষ্ট API, কোথায় এবং কখন কল করে?"। আপনি যখন আপনার আবেদনের সমস্যা সমাধান করেন, সম্পদ খরচের তদন্ত করেন বা সফ্টওয়্যার ফরেনসিক বিশ্লেষণ করেন তখন অডিটিং গুরুত্বপূর্ণ।

অডিট লগগুলি আপনাকে প্রশাসনিক এবং সিস্টেম কার্যকলাপগুলি ট্র্যাক করার পাশাপাশি "ডেটা রিড" এবং "ডেটা রাইটিং" API অপারেশনগুলিতে কল লগ করার অনুমতি দেয়। বিষয়বস্তু তৈরি করার জন্য Vertex AI অনুরোধগুলি অডিট করতে আপনাকে ক্লাউড কনসোলে "ডেটা রিড" অডিট লগগুলি সক্ষম করতে হবে৷

  1. ক্লাউড কনসোলে অডিট লগ পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন

  2. নিশ্চিত করুন যে পৃষ্ঠাটিতে আপনার তৈরি করা প্রকল্পটি এই ল্যাবের জন্য নির্বাচিত হয়েছে৷ নির্বাচিত প্রকল্পটি হ্যামবার্গার মেনু থেকে পৃষ্ঠার উপরের বাম কোণে দেখানো হয়েছে:
    গুগল ক্লাউড কনসোল প্রকল্প ড্রপডাউন
    প্রয়োজনে, কম্বোবক্স থেকে সঠিক প্রকল্পটি নির্বাচন করুন।
  3. ডেটা অ্যাক্সেস অডিট লগ কনফিগারেশন টেবিলে, পরিষেবা কলামে Vertex AI API পরিষেবাটি খুঁজুন এবং পরিষেবার নাম থেকে বাম দিকে অবস্থিত চেকবক্সটি নির্বাচন করে পরিষেবাটি নির্বাচন করুন৷
    Vertex AI API নির্বাচন করুন
  4. ডানদিকের তথ্য প্যানেলে, "ডেটা রিড" অডিট টাইপ নির্বাচন করুন।
    ডাটা রিড লগ চেক করুন
  5. Save এ ক্লিক করুন।

অডিট লগ তৈরি করতে পরিষেবা URL খুলুন। বিভিন্ন ফলাফল পেতে ?animal= প্যারামিটারের মান পরিবর্তন করার সময় পৃষ্ঠাটি রিফ্রেশ করুন।

অডিট লগ এক্সপ্লোর করুন

  1. ক্লাউড কনসোলে লগ এক্সপ্লোরার পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন:

  2. ক্যোয়ারী প্যানে নিম্নলিখিত ফিল্টারটি আটকান।
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND
    protoPayload.serviceName="aiplatform.googleapis.com"
    
    ক্যোয়ারী ফলকটি লগ এক্সপ্লোরার পৃষ্ঠার শীর্ষে অবস্থিত একটি সম্পাদক:
    প্রশ্ন নিরীক্ষা লগ
  3. রান ক্যোয়ারী ক্লিক করুন.
  4. অডিট লগ এন্ট্রিগুলির মধ্যে একটি নির্বাচন করুন এবং লগে ক্যাপচার করা তথ্য পরিদর্শন করতে ক্ষেত্রগুলি প্রসারিত করুন৷
    আপনি Vertex API কলের পদ্ধতি এবং ব্যবহৃত মডেল সহ বিস্তারিত দেখতে পারেন। এছাড়াও আপনি আমন্ত্রণকারীর পরিচয় এবং কোন অনুমতিগুলি কলটি অনুমোদন করেছে তাও দেখতে পারেন৷

8. Gen AI এর সাথে ইন্টারঅ্যাকশন লগ করুন

আপনি অডিট লগগুলিতে API অনুরোধের পরামিতি বা প্রতিক্রিয়া ডেটা খুঁজে পান না৷ যাইহোক, এই তথ্য সমস্যা সমাধানের অ্যাপ্লিকেশন এবং কর্মপ্রবাহ বিশ্লেষণের জন্য গুরুত্বপূর্ণ হতে পারে। এই ধাপে আমরা অ্যাপ্লিকেশন লগিং যোগ করে এই ফাঁক পূরণ করি।

ইমপ্লিমেন্টেশন স্প্রিং বুটের সাথে লগব্যাক ব্যবহার করে স্ট্যান্ডার্ড আউটপুটে অ্যাপ্লিকেশন লগ প্রিন্ট করতে। এই পদ্ধতিতে স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করা তথ্য ক্যাপচার করার এবং ক্লাউড লগিং-এ স্বয়ংক্রিয়ভাবে এটি গ্রহণ করার ক্ষমতা ক্লাউড রানের বৈশিষ্ট্য রয়েছে। কাঠামোগত ডেটা হিসাবে তথ্য ক্যাপচার করার জন্য, মুদ্রিত লগগুলি সেই অনুযায়ী ফর্ম্যাট করা উচিত। অ্যাপ্লিকেশানে কাঠামোবদ্ধ লগিং ক্ষমতা যুক্ত করতে নীচের নির্দেশাবলী অনুসরণ করুন৷

  1. আপনার ব্রাউজারে 'ক্লাউড শেল' উইন্ডোতে (বা ট্যাব) ফিরে যান।
  2. ক্লাউড শেল এডিটরে একটি নতুন ফাইল LoggingEventGoogleCloudEncoder.java তৈরি করুন এবং খুলুন:
    cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
    
  3. লগব্যাক এনকোডার প্রয়োগ করতে নিম্নলিখিত কোডটি অনুলিপি করুন এবং আটকান যা Google ক্লাউড কাঠামোবদ্ধ লগ বিন্যাস অনুসরণ করে একটি স্ট্রিংফাইড JSON হিসাবে লগকে এনকোড করে:
    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 তৈরি করুন এবং খুলুন:
    cloudshell edit "${HOME}/codelab-o11y/src/main/resources/logback.xml"
    
  5. লগব্যাক অ্যাপেন্ডারের সাথে এনকোডার ব্যবহার করতে লগব্যাক কনফিগার করতে নিম্নলিখিত XML অনুলিপি করুন এবং আটকান যা স্ট্যান্ডার্ড আউটপুটে লগ প্রিন্ট করে:
    <?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 ফাইলটি পুনরায় খুলুন:
    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);
        }
    }
    

কয়েক সেকেন্ড পরে, ক্লাউড শেল এডিটর স্বয়ংক্রিয়ভাবে আপনার পরিবর্তনগুলি সংরক্ষণ করে।

ক্লাউড রানে জেনারেল এআই অ্যাপ্লিকেশনের কোড স্থাপন করুন

  1. টার্মিনাল উইন্ডোতে ক্লাউড রানে অ্যাপ্লিকেশনটির সোর্স কোড স্থাপন করতে কমান্ডটি চালান।
    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টি অনুলিপি করুন৷ বিকল্পভাবে, পরিষেবা 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. ক্লাউড কনসোলে লগ এক্সপ্লোরার পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন:

  2. নিম্নলিখিত ফিল্টারটি ক্যোয়ারী প্যানে আটকান ( লগ এক্সপ্লোরার ইন্টারফেসে #2):
    LOG_ID("run.googleapis.com%2Fstdout") AND
    severity=DEBUG
    
  3. রান ক্যোয়ারী ক্লিক করুন.

কোয়েরির ফলাফল নিরাপত্তা রেটিং সহ প্রম্পট এবং Vertex AI প্রতিক্রিয়া সহ লগগুলি দেখায়৷

9. Gen AI এর সাথে মিথস্ক্রিয়া গণনা করুন

ক্লাউড রান পরিচালিত মেট্রিক্স লেখে যা স্থাপন করা পরিষেবা নিরীক্ষণ করতে ব্যবহার করা যেতে পারে। ব্যবহারকারী-পরিচালিত মনিটরিং মেট্রিকগুলি মেট্রিক আপডেটের ডেটা এবং ফ্রিকোয়েন্সির উপর আরও নিয়ন্ত্রণ প্রদান করে। এই ধরনের মেট্রিক বাস্তবায়নের জন্য একটি কোড লিখতে হবে যা ডেটা সংগ্রহ করে এবং ক্লাউড মনিটরিং- এ লিখে। OpenTelemetry SDK ব্যবহার করে এটি বাস্তবায়নের উপায়ের জন্য পরবর্তী (ঐচ্ছিক) ধাপটি দেখুন।

এই ধাপটি কোড - লগ-ভিত্তিক মেট্রিক্সে ব্যবহারকারীর মেট্রিক প্রয়োগ করার বিকল্প দেখায়। লগ-ভিত্তিক মেট্রিকগুলি আপনাকে লগ এন্ট্রিগুলি থেকে পর্যবেক্ষণের মেট্রিক্স তৈরি করতে দেয় যা আপনার অ্যাপ্লিকেশনটি ক্লাউড লগিং-এ লেখে। টাইপ কাউন্টারের লগ-ভিত্তিক মেট্রিক সংজ্ঞায়িত করার জন্য আমরা পূর্ববর্তী ধাপে প্রয়োগ করা অ্যাপ্লিকেশন লগগুলি ব্যবহার করব। মেট্রিকটি 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. ক্লাউড কনসোলে মেট্রিক্স এক্সপ্লোরার পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন:

  2. ক্যোয়ারী-বিল্ডার প্যানের টুলবারে, বোতামটি নির্বাচন করুন যার নাম হয় < > MQL বা < > PromQL । বোতামের অবস্থানের জন্য নীচের ছবিটি দেখুন।
    মেট্রিক্স এক্সপ্লোরারে MQL বোতামের অবস্থান
  3. ভাষা টগল এ PromQL নির্বাচন করা হয়েছে তা যাচাই করুন। ভাষা টগল একই টুলবারে রয়েছে যা আপনাকে আপনার ক্যোয়ারী ফর্ম্যাট করতে দেয়।
  4. প্রশ্ন সম্পাদকে আপনার প্রশ্ন লিখুন:
    sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
    
    PromQL ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ক্লাউড মনিটরিং-এ PromQL দেখুন।
  5. রান কোয়েরি ক্লিক করুন। আপনি এই স্ক্রিনশটের অনুরূপ একটি লাইন চার্ট দেখতে পাবেন:
    জিজ্ঞাসা করা মেট্রিক্স দেখান

    মনে রাখবেন যখন স্বয়ংক্রিয়-রান টগল সক্রিয় থাকে, রান কোয়েরি বোতামটি দেখানো হয় না।

10. (ঐচ্ছিক) পর্যবেক্ষণ এবং ট্রেসিংয়ের জন্য ওপেন টেলিমেট্রি ব্যবহার করুন

আগের ধাপে উল্লিখিত হিসাবে OpenTelemetry (Otel) SDK ব্যবহার করে মেট্রিক্স বাস্তবায়ন করা সম্ভব। মাল্টি-সার্ভিস আর্কিটেকচারে OTel ব্যবহার করা একটি প্রস্তাবিত অনুশীলন। এই ধাপটি স্প্রিং বুট অ্যাপ্লিকেশনে OTel ইন্সট্রুমেন্টেশন যোগ করা দেখায়। এই ধাপে আপনি নিম্নলিখিত কাজ করবেন:

  • স্বয়ংক্রিয় ট্রেসিং ক্ষমতা সহ স্প্রিং বুট অ্যাপ্লিকেশন ইন্সট্রুমেন্টিং
  • বেশ কয়েকটি সফল মডেল কল নিরীক্ষণের জন্য একটি কাউন্টার মেট্রিক প্রয়োগ করা
  • অ্যাপ্লিকেশান লগের সাথে ট্রেসিংকে সম্পর্কযুক্ত করুন

পণ্য-স্তরের পরিষেবাগুলির জন্য প্রস্তাবিত আর্কিটেকচার হল একাধিক পরিষেবা থেকে সমস্ত পর্যবেক্ষণযোগ্যতা ডেটা সংগ্রহ এবং গ্রহণ করতে OTel সংগ্রাহক ব্যবহার করা। এই ধাপে কোডটি সরলতার জন্য সংগ্রাহক ব্যবহার করে না। পরিবর্তে এটি OTel এক্সপোর্ট ব্যবহার করে যা সরাসরি Google ক্লাউডে ডেটা লেখে।

OTel উপাদান এবং স্বয়ংক্রিয় ট্রেসিং সহ স্প্রিং বুট অ্যাপ্লিকেশন সেট আপ করুন

  1. আপনার ব্রাউজারে 'ক্লাউড শেল' উইন্ডোতে (বা ট্যাব) ফিরে যান।
  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
    
    এই প্যারামিটারগুলি ক্লাউড ট্রেস এবং ক্লাউড মনিটরিং-এ পর্যবেক্ষণযোগ্য ডেটা রপ্তানি করা সংজ্ঞায়িত করে এবং সমস্ত ট্রেসের নমুনা প্রয়োগ করে৷
  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. ক্লাউড শেল এডিটরে 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. ক্লাউড শেল এডিটরে 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";
            }
        }
    }
    

কয়েক সেকেন্ড পরে, ক্লাউড শেল এডিটর স্বয়ংক্রিয়ভাবে আপনার পরিবর্তনগুলি সংরক্ষণ করে।

ক্লাউড রানে জেনারেল এআই অ্যাপ্লিকেশনের কোড স্থাপন করুন

  1. টার্মিনাল উইন্ডোতে ক্লাউড রানে অ্যাপ্লিকেশনটির সোর্স কোড স্থাপন করার জন্য কমান্ডটি চালান।
    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টি অনুলিপি করুন৷ বিকল্পভাবে, পরিষেবা URL মুদ্রণ করতে টার্মিনালে নিম্নলিখিত কমান্ডটি চালান এবং URL খুলতে Ctrl কী ধরে রেখে দেখানো URL-এ ক্লিক করুন:
    gcloud run services list \
         --format='value(URL)' \
         --filter='SERVICE:"codelab-o11y-service"'
    
    ইউআরএল খোলা হলে, আপনি 500 ত্রুটি পেতে পারেন বা বার্তাটি দেখতে পারেন:
    Sorry, this is just a placeholder...
    
    এর মানে হল যে পরিষেবাগুলি তার স্থাপনা শেষ করেনি। কয়েক মুহূর্ত অপেক্ষা করুন এবং পৃষ্ঠাটি রিফ্রেশ করুন। শেষে আপনি একটি টেক্সট দেখতে পাবেন যা ফান ডগ ফ্যাক্টস দিয়ে শুরু হবে এবং এতে কুকুর সম্পর্কে 10টি মজার তথ্য রয়েছে।

টেলিমেট্রি ডেটা জেনারেট করতে পরিষেবা URL খুলুন। বিভিন্ন ফলাফল পেতে ?animal= প্যারামিটারের মান পরিবর্তন করার সময় পৃষ্ঠাটি রিফ্রেশ করুন।

অ্যাপ্লিকেশন ট্রেস অন্বেষণ

  1. ক্লাউড কনসোলে ট্রেস এক্সপ্লোরার পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন:

  2. সাম্প্রতিকতম ট্রেসগুলির মধ্যে একটি নির্বাচন করুন৷ আপনি 5 বা 6টি স্প্যান দেখতে পাবেন যা নীচের স্ক্রিনশটের মতো দেখাচ্ছে৷
    ট্রেস এক্সপ্লোরারে অ্যাপ স্প্যানের দৃশ্য
  3. ইভেন্ট হ্যান্ডলারের কাছে কলটি ট্রেস করে এমন স্প্যানটি খুঁজুন ( fun_facts পদ্ধতি)। এটি / নামের সাথে শেষ স্প্যান হবে।
  4. ট্রেস বিবরণ ফলকে লগ এবং ইভেন্ট নির্বাচন করুন। আপনি এই নির্দিষ্ট স্প্যানের সাথে সম্পর্কযুক্ত অ্যাপ্লিকেশন লগগুলি দেখতে পাবেন। ট্রেস এবং লগে ট্রেস এবং স্প্যান আইডি ব্যবহার করে পারস্পরিক সম্পর্ক সনাক্ত করা হয়। আপনি প্রম্পট এবং Vertex API এর প্রতিক্রিয়া লিখেছিলেন এমন অ্যাপ্লিকেশন লগটি দেখতে হবে।

কাউন্টার মেট্রিক অন্বেষণ করুন

  1. ক্লাউড কনসোলে মেট্রিক্স এক্সপ্লোরার পৃষ্ঠা খুলতে নীচের বোতামে ক্লিক করুন:

  2. ক্যোয়ারী-বিল্ডার প্যানের টুলবারে, বোতামটি নির্বাচন করুন যার নাম হয় < > MQL বা < > PromQL । বোতামের অবস্থানের জন্য নীচের ছবিটি দেখুন।
    মেট্রিক্স এক্সপ্লোরারে MQL বোতামের অবস্থান
  3. ভাষা টগল এ PromQL নির্বাচন করা হয়েছে তা যাচাই করুন। ভাষা টগল একই টুলবারে রয়েছে যা আপনাকে আপনার ক্যোয়ারী ফর্ম্যাট করতে দেয়।
  4. প্রশ্ন সম্পাদকে আপনার প্রশ্ন লিখুন:
    sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
    
  5. রান কোয়েরি ক্লিক করুন। যখন স্বয়ংক্রিয়-রান টগল সক্রিয় থাকে, তখন রান কোয়েরি বোতামটি দেখানো হয় না।

11. (ঐচ্ছিক) লগ থেকে অস্পষ্ট সংবেদনশীল তথ্য

ধাপ 10-এ আমরা মিথুন মডেলের সাথে অ্যাপ্লিকেশনটির মিথস্ক্রিয়া সম্পর্কে তথ্য লগ করেছি। এই তথ্যে প্রাণীর নাম, প্রকৃত প্রম্পট এবং মডেলের প্রতিক্রিয়া অন্তর্ভুক্ত রয়েছে। লগে এই তথ্য সংরক্ষণ করার সময় নিরাপদ হওয়া উচিত, এটি অন্যান্য অনেক পরিস্থিতিতে সত্য নয়। প্রম্পটে কিছু ব্যক্তিগত বা অন্যথায় সংবেদনশীল তথ্য থাকতে পারে যা একজন ব্যবহারকারী সংরক্ষণ করতে চান না। এটি মোকাবেলা করার জন্য আপনি ক্লাউড লগিং-এ লেখা সংবেদনশীল ডেটা অস্পষ্ট করতে পারেন। কোড পরিবর্তন কমাতে নিম্নলিখিত সমাধান সুপারিশ করা হয়.

  1. ইনকামিং লগ এন্ট্রি সংরক্ষণ করতে একটি PubSub বিষয় তৈরি করুন৷
  2. একটি লগ সিঙ্ক তৈরি করুন যা ইনজেস্ট করা লগগুলিকে PubSub বিষয়ে পুনর্নির্দেশ করে৷
  3. একটি ডেটাফ্লো পাইপলাইন তৈরি করুন যা এই পদক্ষেপগুলি অনুসরণ করে PubSub বিষয়ে পুনঃনির্দেশিত লগগুলিকে সংশোধন করে:
    1. PubSub বিষয় থেকে একটি লগ এন্ট্রি পড়ুন
    2. DLP পরিদর্শন API ব্যবহার করে সংবেদনশীল তথ্যের জন্য এন্ট্রির পেলোড পরিদর্শন করুন
    3. ডিএলপি রিডাকশন পদ্ধতির একটি ব্যবহার করে পেলোডে সংবেদনশীল তথ্য রিড্যাক্ট করুন
    4. ক্লাউড লগিং-এ অস্পষ্ট লগ এন্ট্রি লিখুন
  4. পাইপলাইন স্থাপন করুন

12. (ঐচ্ছিক) পরিষ্কার করুন

কোডল্যাবে ব্যবহৃত রিসোর্স এবং API-এর জন্য চার্জ নেওয়ার ঝুঁকি এড়াতে ল্যাব শেষ করার পরে পরিষ্কার করার পরামর্শ দেওয়া হয়। বিলিং দূর করার সবচেয়ে সহজ উপায় হল কোডল্যাবের জন্য তৈরি করা প্রকল্পটি মুছে ফেলা।

  1. প্রকল্পটি মুছতে টার্মিনালে ডিলিট প্রজেক্ট কমান্ডটি চালান:
    PROJECT_ID=$(gcloud config get-value project)
    gcloud projects delete ${PROJECT_ID} --quiet
    
    আপনার ক্লাউড প্রকল্প মুছে ফেলা সেই প্রকল্পের মধ্যে ব্যবহৃত সমস্ত সংস্থান এবং APIগুলির জন্য বিলিং বন্ধ করে দেয়৷ আপনি এই বার্তাটি দেখতে পাবেন যেখানে PROJECT_ID হবে আপনার প্রকল্প 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 অ্যাপ্লিকেশন তৈরি করেছেন যা ভবিষ্যদ্বাণী করতে জেমিনি মডেল ব্যবহার করে। এবং প্রয়োজনীয় নিরীক্ষণ এবং লগিং ক্ষমতা সহ অ্যাপ্লিকেশনটিকে যন্ত্রযুক্ত করেছে। আপনি অ্যাপ্লিকেশনটি স্থাপন করেছেন এবং সোর্স কোড থেকে ক্লাউড রানে পরিবর্তন করেছেন। তারপর আপনি অ্যাপ্লিকেশনের কর্মক্ষমতা ট্র্যাক করার জন্য Google ক্লাউড পর্যবেক্ষণযোগ্য পণ্য, যাতে আপনি অ্যাপ্লিকেশনের নির্ভরযোগ্যতা নিশ্চিত করতে পারেন।

আপনি যদি আজকে যে পণ্যগুলির সাথে কাজ করেছেন তার উন্নতির জন্য ব্যবহারকারীর অভিজ্ঞতা (UX) গবেষণা গবেষণায় অন্তর্ভুক্ত হতে আগ্রহী হন, এখানে নিবন্ধন করুন

আপনার শেখা চালিয়ে যাওয়ার জন্য এখানে কিছু বিকল্প রয়েছে: