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

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. একটি Gen AI Go অ্যাপ্লিকেশন তৈরি করুন৷

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

  1. টার্মিনালে, codelab-o11y ডিরেক্টরি তৈরি করুন:
    mkdir ~/codelab-o11y
    
  2. বর্তমান ডিরেক্টরিকে codelab-o11y এ পরিবর্তন করুন:
    cd ~/codelab-o11y
    
  3. Go মডিউল শুরু করুন:
    go mod init codelab
    
  4. Go এর জন্য Vertex AI SDK ইনস্টল করুন:
    go get cloud.google.com/go/vertexai/genai
    
  5. বর্তমান প্রকল্প আইডি পেতে Go এর জন্য মেটাডেটা লাইব্রেরি ইনস্টল করুন:
    go get cloud.google.com/go/compute/metadata
    
  6. একটি setup.go ফাইল তৈরি করুন এবং ক্লাউড শেল এডিটরে ফাইলটি খুলুন:
    cloudshell edit setup.go
    
    এটি ইনিশিয়ালাইজেশন কোড হোস্ট করতে ব্যবহার করা হবে। setup.go নামের একটি নতুন খালি ফাইল সম্পাদক উইন্ডোতে প্রদর্শিত হবে।
  7. নিম্নলিখিত কোডটি অনুলিপি করুন এবং খোলা setup.go ফাইলে পেস্ট করুন:
    package main
    
    import (
        "context"
        "os"
    
        "cloud.google.com/go/compute/metadata"
    )
    
    func projectID(ctx context.Context) (string, error) {
        var projectID = os.Getenv("GOOGLE_CLOUD_PROJECT")
        if projectID == "" {
               return metadata.ProjectIDWithContext(ctx)
        }
        return projectID, nil
    }
    
  8. টার্মিনাল উইন্ডোতে ফিরে যান এবং ক্লাউড শেল এডিটরে একটি main.go ফাইল তৈরি এবং খুলতে নিম্নলিখিত কমান্ডটি চালান:
    cloudshell edit main.go
    
    একটি খালি ফাইল এখন টার্মিনালের উপরে সম্পাদক উইন্ডোতে উপস্থিত হওয়া উচিত। আপনার পর্দা নিচের মত দেখাবে:
    main.go সম্পাদনা শুরু করার পরে ক্লাউড শেল সম্পাদক দেখান৷
  9. নিম্নলিখিত কোডটি অনুলিপি করুন এবং খোলা main.go ফাইলে পেস্ট করুন:
    package main
    
    import (
        "context"
        "fmt"
        "net/http"
        "os"
    
        "cloud.google.com/go/vertexai/genai"
    )
    
    var model *genai.GenerativeModel
    
    func main() {
        ctx := context.Background()
        projectID, err := projectID(ctx)
        if err != nil {
            return
        }
    
        var client *genai.Client
        client, err = genai.NewClient(ctx, projectID, "us-central1")
        if err != nil {
            return
        }
        defer client.Close()
           model = client.GenerativeModel("gemini-1.5-flash-001")
           http.HandleFunc("/", Handler)
           port := os.Getenv("PORT")
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            return
        }
    }
    
    func Handler(w http.ResponseWriter, r *http.Request) {
        animal := r.URL.Query().Get("animal")
        if animal == "" {
            animal = "dog"
        }
    
        prompt := fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)
        resp, err := model.GenerateContent(r.Context(), genai.Text(prompt))
        if err != nil {
            w.WriteHeader(http.StatusTooManyRequests)
            return
        }
    
        if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 {
            htmlContent := resp.Candidates[0].Content.Parts[0]
            w.Header().Set("Content-Type", "text/html; charset=utf-8")
            fmt.Fprint(w, htmlContent)
        }
    }
    
    কয়েক সেকেন্ড পরে, ক্লাউড শেল এডিটর আপনার কোড স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে।

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

  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 অনুরোধের পরামিতি বা প্রতিক্রিয়া ডেটা খুঁজে পান না৷ যাইহোক, এই তথ্য সমস্যা সমাধানের অ্যাপ্লিকেশন এবং কর্মপ্রবাহ বিশ্লেষণের জন্য গুরুত্বপূর্ণ হতে পারে। এই ধাপে আমরা অ্যাপ্লিকেশন লগিং যোগ করে এই ফাঁক পূরণ করি। লগিং স্ট্রাকচার্ড লগ লেখার জন্য স্ট্যান্ডার্ড গো log/slog প্যাকেজ ব্যবহার করে। log/slog প্যাকেজ Google ক্লাউডে লগ লিখতে জানে না। এটি স্ট্যান্ডার্ড আউটপুটে লেখা সমর্থন করে। যাইহোক, ক্লাউড রান বৈশিষ্ট্যগুলি স্ট্যান্ডার্ড আউটপুটে মুদ্রিত তথ্য ক্যাপচার করে এবং স্বয়ংক্রিয়ভাবে ক্লাউড লগিং-এ এটি গ্রহণ করে। কাঠামোবদ্ধ লগগুলি সঠিকভাবে ক্যাপচার করার জন্য, মুদ্রিত লগগুলি সেই অনুযায়ী ফর্ম্যাট করা উচিত। আমাদের Go অ্যাপ্লিকেশনে কাঠামোবদ্ধ লগিং ক্ষমতা যোগ করতে নীচের নির্দেশাবলী অনুসরণ করুন।

  1. আপনার ব্রাউজারে 'ক্লাউড শেল' উইন্ডোতে (বা ট্যাব) ফিরে যান।
  2. টার্মিনালে, setup.go পুনরায় খুলুন:
    cloudshell edit ~/codelab-o11y/setup.go
    
  3. লগিং সেট আপ করে এমন সংস্করণ দিয়ে কোডটি প্রতিস্থাপন করুন। কোডটি প্রতিস্থাপন করতে, ফাইলের বিষয়বস্তু মুছুন এবং তারপরে নীচের কোডটি অনুলিপি করুন এবং সম্পাদকে পেস্ট করুন:
    package main
    
    import (
    	"context"
    	"os"
    	"log/slog"
    	"cloud.google.com/go/compute/metadata"
    )
    
    func projectID(ctx context.Context) (string, error) {
        var projectID = os.Getenv("GOOGLE_CLOUD_PROJECT")
        if projectID == "" {
               return metadata.ProjectIDWithContext(ctx)
        }
        return projectID, nil
    }
    
    func setupLogging() {
        opts := &slog.HandlerOptions{
            Level: slog.LevelDebug,
            ReplaceAttr: func(group []string, a slog.Attr) slog.Attr {
                switch a.Key {
                case slog.LevelKey:
                    a.Key = "severity"
                    if level := a.Value.Any().(slog.Level); level == slog.LevelWarn {
                        a.Value = slog.StringValue("WARNING")
                    }
                case slog.MessageKey:
                    a.Key = "message"
                case slog.TimeKey:
                    a.Key = "timestamp"
                }
                return a
            },
        }
        jsonHandler := slog.NewJSONHandler(os.Stdout, opts)
        slog.SetDefault(slog.New(jsonHandler))
    }
    
  4. টার্মিনালে ফিরে যান এবং main.go পুনরায় খুলুন:
    cloudshell edit ~/codelab-o11y/main.go
    
  5. মডেলের সাথে ইন্টারঅ্যাকশন লগ করা সংস্করণের সাথে অ্যাপ্লিকেশন কোডটি প্রতিস্থাপন করুন। কোডটি প্রতিস্থাপন করতে, ফাইলের বিষয়বস্তু মুছুন এবং তারপরে নীচের কোডটি অনুলিপি করুন এবং সম্পাদকে পেস্ট করুন:
    package main
    
    import (
        "context"
        "fmt"
        "net/http"
        "os"
    
        "encoding/json"
        "log/slog"
    
        "cloud.google.com/go/vertexai/genai"
    )
    
    var model *genai.GenerativeModel
    
    func main() {
        ctx := context.Background()
        projectID, err := projectID(ctx)
        if err != nil {
            return
        }
    
        setupLogging()
    
        var client *genai.Client
        client, err = genai.NewClient(ctx, projectID, "us-central1")
        if err != nil {
            slog.ErrorContext(ctx, "Failed to marshal response to JSON", slog.Any("error", err))
            os.Exit(1)
        }
        defer client.Close()
        model = client.GenerativeModel("gemini-1.5-flash-001")
        http.HandleFunc("/", Handler)
        port := os.Getenv("PORT")
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            slog.ErrorContext(ctx, "Failed to start the server", slog.Any("error", err))
            os.Exit(1)
        }
    }
    
    func Handler(w http.ResponseWriter, r *http.Request) {
        animal := r.URL.Query().Get("animal")
        if animal == "" {
            animal = "dog"
        }
    
        prompt := fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)
        resp, err := model.GenerateContent(r.Context(), genai.Text(prompt))
        if err != nil {
            w.WriteHeader(http.StatusTooManyRequests)
            return
        }
    
        jsonBytes, err := json.Marshal(resp)
        if err != nil {
            slog.Error("Failed to marshal response to JSON", slog.Any("error", err))
        } else {
            slog.DebugContext(r.Context(), "content is generated", slog.String("animal", animal),
                slog.String("prompt", prompt), slog.String("response", string(jsonBytes)))
        }
    
        if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 {
            htmlContent := resp.Candidates[0].Content.Parts[0]
            w.Header().Set("Content-Type", "text/html; charset=utf-8")
            fmt.Fprint(w, htmlContent)
        }
    }
    

লগিংটি stdout এ লগ প্রিন্ট করার জন্য কনফিগার করা হয়েছে যেখানে এটি ক্লাউড রান লগিং এজেন্ট দ্বারা সংগ্রহ করা হয় এবং অ্যাসিঙ্ক্রোনাসভাবে ক্লাউড লগিং-এ প্রবেশ করানো হয়। main() ফাংশনটি গো স্ট্যান্ডার্ড স্ট্রাকচার্ড লগ সেটআপ করতে পরিবর্তন করা হয়েছে JSON স্কিমা ব্যবহার করার জন্য যা স্ট্রাকচার্ড ফরম্যাটিং নির্দেশিকা অনুসরণ করে। এর সমস্ত return স্টেটমেন্ট কোড দিয়ে প্রতিস্থাপিত হয় যা প্রস্থান করার আগে ত্রুটি লগ লিখে। Vertex AI API কল থেকে প্রতিক্রিয়া পাওয়ার সময় Handler() ফাংশনটি কাঠামোবদ্ধ লগ লেখার জন্য ব্যবহৃত হয়। লগটি অনুরোধের প্রাণীর প্যারামিটার এবং মডেলের প্রম্পট এবং প্রতিক্রিয়া ক্যাপচার করে।

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

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

  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 সংগ্রাহক ব্যবহার করা। এই ধাপে কোডটি সরলতার জন্য সংগ্রাহক ব্যবহার করে না। পরিবর্তে এটি OTel এক্সপোর্ট ব্যবহার করে যা সরাসরি Google ক্লাউডে ডেটা লেখে।

ট্রেসিং এবং মেট্রিক পর্যবেক্ষণের জন্য OTel উপাদানগুলি সেটআপ করুন৷

  1. আপনার ব্রাউজারে 'ক্লাউড শেল' উইন্ডোতে (বা ট্যাব) ফিরে যান।
  2. টার্মিনালে, setup.go পুনরায় খুলুন:
    cloudshell edit ~/codelab-o11y/setup.go
    
  3. ওপেনটেলিমেট্রি ট্রেসিং এবং মেট্রিক সংগ্রহ শুরু করে এমন সংস্করণ দিয়ে কোডটি প্রতিস্থাপন করুন। কোডটি প্রতিস্থাপন করতে, ফাইলের বিষয়বস্তু মুছুন এবং তারপরে নীচের কোডটি অনুলিপি করুন এবং সম্পাদকে পেস্ট করুন:
    package main
    
    import (
        "context"
        "errors"
        "fmt"
        "net/http"
        "os"
    
        "log/slog"
    
        "go.opentelemetry.io/contrib/detectors/gcp"
        "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
        "go.opentelemetry.io/contrib/propagators/autoprop"
        "go.opentelemetry.io/otel"
        sdkmetric "go.opentelemetry.io/otel/sdk/metric"
        "go.opentelemetry.io/otel/sdk/resource"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
        "go.opentelemetry.io/otel/trace"
    
        cloudmetric "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric"
        cloudtrace "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
    
        "cloud.google.com/go/compute/metadata"
    )
    
    var (
        projID string
    )
    
    func projectID(ctx context.Context) (string, error) {
        var projectID = os.Getenv("GOOGLE_CLOUD_PROJECT")
        if projectID == "" {
            return metadata.ProjectIDWithContext(ctx)
        }
        return projectID, nil
    }
    
    func setupLogging() {
        opts := &slog.HandlerOptions{
            Level: slog.LevelDebug,
            ReplaceAttr: func(group []string, a slog.Attr) slog.Attr {
                switch a.Key {
                case slog.LevelKey:
                    a.Key = "severity"
                    if level := a.Value.Any().(slog.Level); level == slog.LevelWarn {
                        a.Value = slog.StringValue("WARNING")
                    }
                case slog.MessageKey:
                    a.Key = "message"
                case slog.TimeKey:
                    a.Key = "timestamp"
                }
                return a
            },
        }
        jsonHandler := slog.NewJSONHandler(os.Stdout, opts)
        instrumentedHandler := handlerWithSpanContext(jsonHandler)
        slog.SetDefault(slog.New(instrumentedHandler))
    }
    
    type spanContextLogHandler struct {
        slog.Handler
    }
    
    func handlerWithSpanContext(handler slog.Handler) *spanContextLogHandler {
        return &spanContextLogHandler{Handler: handler}
    }
    
    func (t *spanContextLogHandler) Handle(ctx context.Context, record slog.Record) error {
        if s := trace.SpanContextFromContext(ctx); s.IsValid() {
            trace := fmt.Sprintf("projects/%s/traces/%s", projID, s.TraceID())
            record.AddAttrs(
                slog.Any("logging.googleapis.com/trace", trace),
            )
            record.AddAttrs(
                slog.Any("logging.googleapis.com/spanId", s.SpanID()),
            )
            record.AddAttrs(
                slog.Bool("logging.googleapis.com/trace_sampled", s.TraceFlags().IsSampled()),
            )
        }
        return t.Handler.Handle(ctx, record)
    }
    
    func setupTelemetry(ctx context.Context) (shutdown func(context.Context) error, err error) {
        var shutdownFuncs []func(context.Context) error
        shutdown = func(ctx context.Context) error {
            var err error
            for _, fn := range shutdownFuncs {
                err = errors.Join(err, fn(ctx))
            }
            shutdownFuncs = nil
            return err
        }
    
        projID, err = projectID(ctx)
        if err != nil {
            err = errors.Join(err, shutdown(ctx))
            return
        }
    
        res, err2 := resource.New(
            ctx,
            resource.WithDetectors(gcp.NewDetector()),
            resource.WithTelemetrySDK(),
            resource.WithAttributes(semconv.ServiceNameKey.String(os.Getenv("K_SERVICE"))),
        )
        if err2 != nil {
            err = errors.Join(err2, shutdown(ctx))
            return
        }
    
        otel.SetTextMapPropagator(autoprop.NewTextMapPropagator())
    
        texporter, err2 := cloudtrace.New(cloudtrace.WithProjectID(projID))
        if err2 != nil {
            err = errors.Join(err2, shutdown(ctx))
            return
        }
        tp := sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.AlwaysSample()),
            sdktrace.WithResource(res),
            sdktrace.WithBatcher(texporter))
        shutdownFuncs = append(shutdownFuncs, tp.Shutdown)
        otel.SetTracerProvider(tp)
    
        mexporter, err2 := cloudmetric.New(cloudmetric.WithProjectID(projID))
        if err2 != nil {
            err = errors.Join(err2, shutdown(ctx))
            return
        }
        mp := sdkmetric.NewMeterProvider(
            sdkmetric.WithReader(sdkmetric.NewPeriodicReader(mexporter)),
            sdkmetric.WithResource(res),
        )
        shutdownFuncs = append(shutdownFuncs, mp.Shutdown)
        otel.SetMeterProvider(mp)
    
        return shutdown, nil
    }
    
    func registerHttpHandler(route string, handleFn http.HandlerFunc) {
        instrumentedHandler := otelhttp.NewHandler(otelhttp.WithRouteTag(route, handleFn), route)
        http.Handle(route, instrumentedHandler)
    }
    
  4. টার্মিনালে ফিরে যান এবং go.mod ফাইলে Go মডিউল সংজ্ঞা আপডেট করতে নিম্নলিখিত কমান্ডটি চালান:
    go mod tidy
    
  5. টার্মিনালে ফিরে যান এবং main.go পুনরায় খুলুন:
    cloudshell edit ~/codelab-o11y/main.go
    
  6. বর্তমান কোডটি সেই সংস্করণের সাথে প্রতিস্থাপন করুন যা HTTP ট্রেসিং করে এবং কর্মক্ষমতা মেট্রিক লিখে। কোডটি প্রতিস্থাপন করতে, ফাইলের বিষয়বস্তু মুছুন এবং তারপরে নীচের কোডটি অনুলিপি করুন এবং সম্পাদকে পেস্ট করুন:
    package main
    
    import (
        "context"
        "errors"
        "fmt"
        "net/http"
        "os"
    
        "encoding/json"
        "log/slog"
    
        "cloud.google.com/go/vertexai/genai"
    
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
        "go.opentelemetry.io/otel/metric"
    )
    
    var model *genai.GenerativeModel
    var counter metric.Int64Counter
    
    const scopeName = "genai-o11y/go/workshop/example"
    
    func main() {
        ctx := context.Background()
        projectID, err := projectID(ctx)
        if err != nil {
            return
        }
    
        setupLogging()
        shutdown, err := setupTelemetry(ctx)
        if err != nil {
            slog.ErrorContext(ctx, "error setting up OpenTelemetry", slog.Any("error", err))
            os.Exit(1)
        }
        meter := otel.Meter(scopeName)
        counter, err = meter.Int64Counter("model_call_counter")
        if err != nil {
            slog.ErrorContext(ctx, "error setting up OpenTelemetry", slog.Any("error", err))
            os.Exit(1)
        }
    
        var client *genai.Client
        client, err = genai.NewClient(ctx, projectID, "us-central1")
        if err != nil {
            slog.ErrorContext(ctx, "Failed to marshal response to JSON", slog.Any("error", err))
            os.Exit(1)
        }
        defer client.Close()
        model = client.GenerativeModel("gemini-1.5-flash-001")
    
        registerHttpHandler("/", Handler)
    
        port := os.Getenv("PORT")
        if port == "" {
            port = "8080"
        }
    
        if err = errors.Join(http.ListenAndServe(":"+port, nil), shutdown(ctx)); err != nil {
            slog.ErrorContext(ctx, "Failed to start the server", slog.Any("error", err))
            os.Exit(1)
        }
    }
    
    func Handler(w http.ResponseWriter, r *http.Request) {
        animal := r.URL.Query().Get("animal")
        if animal == "" {
            animal = "dog"
        }
    
        prompt := fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)
        resp, err := model.GenerateContent(r.Context(), genai.Text(prompt))
        if err != nil {
            w.WriteHeader(http.StatusTooManyRequests)
            return
        }
        jsonBytes, err := json.Marshal(resp)
        if err != nil {
            slog.ErrorContext(r.Context(), "Failed to marshal response to JSON", slog.Any("error", err))
        } else {
            slog.DebugContext(r.Context(), "content is generated", slog.String("animal", animal),
                slog.String("prompt", prompt), slog.String("response", string(jsonBytes)))
        }
        if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 {
            clabels := []attribute.KeyValue{attribute.Key("animal").String(animal)}
            counter.Add(r.Context(), 1, metric.WithAttributes(clabels...))
            htmlContent := resp.Candidates[0].Content.Parts[0]
            w.Header().Set("Content-Type", "text/html; charset=utf-8")
            fmt.Fprint(w, htmlContent)
        }
    }
    

অ্যাপ্লিকেশানটি এখন ওপেনটেলিমেট্রি SDK ব্যবহার করে ট্রেসিং সহ কোড এক্সিকিউশনের জন্য এবং একটি মেট্রিক হিসাবে সফল এক্সিকিউশনের সংখ্যা গণনা বাস্তবায়ন করতে। main() পদ্ধতিটি ওপেনটেলিমেট্রি রপ্তানিকারকদের ট্রেস এবং মেট্রিক্সের জন্য সরাসরি Google ক্লাউড ট্রেসিং এবং মনিটরিং-এ লিখতে সেটআপ করার জন্য পরিবর্তন করা হয়েছে। এটি ক্লাউড রান এনভায়রনমেন্টের সাথে সম্পর্কিত মেটাডেটা সহ সংগৃহীত ট্রেস এবং মেট্রিকগুলি পূরণ করতে অতিরিক্ত কনফিগারেশনও সম্পাদন করে। Handler() ফাংশনটি মেট্রিক কাউন্টার বাড়াতে আপডেট করা হয় প্রতিবার যখন Vertex AI API কল বৈধ ফলাফল দেয়।

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

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

  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. সাম্প্রতিকতম ট্রেসগুলির মধ্যে একটি নির্বাচন করুন৷ আপনি 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) গবেষণা গবেষণায় অন্তর্ভুক্ত হতে আগ্রহী হন, এখানে নিবন্ধন করুন

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