১. ভূমিকা
এই ল্যাবে, আপনি গুগল ক্লাউডের একটি এআই-চালিত সহযোগী জেমিনি (Gemini) ব্যবহার করে এরর লগ বিশ্লেষণ, সমস্যার মূল কারণ শনাক্তকরণ এবং এর সমাধান খুঁজে বের করার মাধ্যমে ক্লাউড ফাংশন ডিপ্লয়মেন্টের একটি সমস্যার সমাধান করবেন।
আপনি যা করবেন...
- আপনি ক্লাউড শেল টার্মিনাল এবং gcloud CLI ব্যবহার করে পরিবেশ সেটআপ করবেন, যার মধ্যে প্রাসঙ্গিক গুগল এপিআই সক্রিয় করা এবং প্রদত্ত কোড থেকে একটি ক্লাউড ফাংশন তৈরি করা অন্তর্ভুক্ত।
- সংগৃহীত তথ্য বোঝার জন্য আপনি ক্লাউড লগিং লগ সামারাইজেশন ব্যবহার করে লগ সামারি তৈরি করবেন।
- সমস্যাটির সমস্যা চিহ্নিতকরণ ও সমাধানে জেমিনির সহায়তা পেতে আপনি তার সাথে চ্যাট করবেন।
আপনি যা শিখবেন...
- গুগল ক্লাউড অবজার্ভেবিলিটির সাথে জেমিনি কীভাবে ব্যবহার করবেন এবং সমস্যা সমাধানে কীভাবে কাজে লাগাবেন।
- জেমিনির সাহায্যে কীভাবে ক্লাউড ফাংশন লগ খুঁজে বের করবেন এবং বুঝবেন
আপনার যা যা লাগবে...
- ক্রোম ওয়েব ব্রাউজার
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
- প্রকল্পে অ্যাক্সেসের অনুমতিসহ একটি গুগল অ্যাকাউন্ট, যা আপনাকে এপিআই (API) সক্রিয় করতে এবং রিসোর্স পরিচালনা করতে দেয়।
এই ল্যাবটি ডেভঅপ্স ও প্ল্যাটফর্ম ইঞ্জিনিয়ার এবং শিক্ষানবিশসহ সকল স্তরের সফটওয়্যার ডেভেলপারদের জন্য। আমাদের মূল লক্ষ্য হবে ট্রাবলশুটিং-এর ক্ষেত্রে জেমিনির সক্ষমতা নিয়ে হাতে-কলমে অভিজ্ঞতা অর্জন করা।
২. সেটআপ
এই ল্যাবটি শুরু করার জন্য আপনার যা যা করা প্রয়োজন, তার সবকিছু এই বিভাগে আলোচনা করা হয়েছে।
পরিবেশ কনফিগার করুন
১. https://console.cloud.google.com খুলে ক্লাউড কনসোলে লগ-ইন করুন।
২. এই ল্যাবের জন্য আপনি যে গুগল ক্লাউড প্রজেক্টটি নিয়ে কাজ করতে চান, সেটি নির্বাচন করুন।

৩. কনসোলে ক্লাউড ফাংশনস পৃষ্ঠাটি খুলুন। কনসোল উইন্ডোর উপরের বাম দিকের আইকন ☰ থেকে নেভিগেশন মেনু ব্যবহার করে ক্লাউড ফাংশনস নির্বাচন করে আপনি এটি করতে পারেন।

বিকল্পভাবে, আপনি কনসোলের সার্চ এরিয়াতে 'ক্লাউড ফাংশন' লিখে সার্চ করতে পারেন:

ফাংশনগুলোর তালিকার উপরে থাকা 'Create Function' বাটনটিতে ক্লিক করুন। 
আপনি যদি এই প্রকল্পে আগে ক্লাউড ফাংশন ব্যবহার না করে থাকেন, তাহলে কাজ করার জন্য আপনাকে গুগল এপিআই (Google APIs) সক্রিয় করতে বলা হবে।

চালিয়ে যেতে ENABLE-এ ক্লিক করুন।
৪. নতুন ক্লাউড ফাংশনের মৌলিক বৈশিষ্ট্যগুলো সংজ্ঞায়িত করুন।
- নামটি "
codelab-cf" হিসেবে সেট করুন। - প্রমাণীকরণবিহীন আহ্বানের অনুমতি বিকল্পটি নির্বাচন করুন

ধাপটি সম্পন্ন করতে, উইন্ডোর নিচের বাম দিকের NEXT বাটনে ক্লিক করুন:

NEXT-এ ক্লিক করার পর আপনাকে অতিরিক্ত Google API(গুলি) সক্রিয় করতে বলা হতে পারে। ধাপ ৪-এর মতো, ENABLE-এ ক্লিক করুন।

ক্লাউড ফাংশনের রানটাইম ও কোড সেট আপ করুন।
এই কোডল্যাবটিতে প্রোগ্রামিং ভাষা হিসেবে পাইথন ব্যবহার করা হয়েছে। আপনি যদি পাইথনের সাথে পরিচিত না হন, তবে চিন্তার কোনো কারণ নেই। এই কোডল্যাবটি সম্পন্ন করার জন্য আপনার পাইথন সম্পর্কে কোনো জ্ঞানের প্রয়োজন হবে না।
৫. ফাংশনের রানটাইম হিসেবে পাইথন ৩.১১ নির্বাচন করুন।

মনে রাখবেন যে, রানটাইম পরিবর্তনের ফলে ইনলাইন এডিটরে প্রদর্শিত সোর্স কোডও পরিবর্তিত হয়।
৬. স্বয়ংক্রিয়ভাবে তৈরি হওয়া কুইকস্টার্ট উদাহরণটি পরিবর্তন করতে নিচের কোডটি ইনলাইন এডিটরে কপি করুন।
from google.cloud import storage
import json
import re
client = storage.Client()
def get_object_list(request):
if request.args and 'path' in request.args:
path = request.args['path']
else:
return '{}'
parsed = re.search('gs:\/\/([a-zA-Z0-9_-]{3,63})\/([-a-zA-Z0-9_\+.\/]*)', path)
bucket, prefix = parsed.group(1), parsed.group(2)
blobs = client.list_blobs(bucket, prefix=prefix, delimiter='/')
objects = []
if (blobs):
for blob in blobs:
objects.append(blob.name)
return json.dumps(objects)
এই কোডটি GET রিকোয়েস্ট থেকে path অ্যাট্রিবিউটটি পড়ে, বাকেটের নামটি নেওয়ার জন্য পাথটি পার্স করে এবং এই পাথে সংরক্ষিত অবজেক্টগুলোর একটি তালিকা পেতে গুগল ক্লাউড স্টোরেজ এপিআই-কে কল করে। ` get_object_list ফাংশনটি ইনপুট আর্গুমেন্ট হিসেবে একটি রিকোয়েস্ট (যা একটি ফ্লাস্ক অবজেক্ট) গ্রহণ করে এবং অবজেক্টগুলোর নাম একটি JSON অ্যারে হিসেবে রিটার্ন করে।
৭. ইনলাইন এডিটরে থাকা ফাইলের তালিকা থেকে requirements.txt ফাইলটি নির্বাচন করুন। নিচের কোডটি ইনলাইন এডিটরে কপি করে বর্তমান ডিপেন্ডেন্সি তালিকাটিকে নতুন তালিকা দিয়ে প্রতিস্থাপন করুন।
google-cloud-storage
৮. ক্লাউড ফাংশন ডেপ্লয় করতে, নিচের বাম দিকে থাকা ডেপ্লয় (DEPLOY) বাটনে ক্লিক করুন।

ডেপ্লয়মেন্ট প্রক্রিয়াটি সম্পূর্ণ হতে আপনাকে কয়েক মিনিট অপেক্ষা করতে হতে পারে। আপনি যদি সেটআপের নির্দেশাবলী সঠিকভাবে অনুসরণ করে থাকেন, তবে ডেপ্লয়মেন্টটি ব্যর্থ হিসেবে রিপোর্ট করা হবে।
৩. সমস্যাটি খুঁজে বের করা এবং সমাধান করা
এই অংশে আপনি সমস্যাটি এবং এর সমাধানের উপায় শনাক্ত করতে লগ ব্যাখ্যা বৈশিষ্ট্য এবং অন্যান্য জেমিনি সহায়তা ব্যবহার করবেন।
১. ডেপ্লয়মেন্ট ব্যর্থ হয়েছে। আপনি একটি এরর মেসেজ দেখতে পাবেন, যেখানে অতিরিক্ত তথ্যসহ ডেপ্লয়মেন্ট লগ দেখার একটি অপশন থাকবে। ডেপ্লয়মেন্টের লগ দেখতে 'VIEW LOGS'-এ ক্লিক করুন।

মনে রাখবেন যে ডেপ্লয়মেন্ট লগগুলো একই ব্রাউজারের একটি আলাদা ট্যাবে খোলা হবে। এই কোডল্যাবটি সম্পূর্ণ করার জন্য আপনাকে ট্যাবগুলোর মধ্যে যাতায়াত করতে হবে।
মনে রাখবেন যে, ‘ভিউ লগস’ (VIEW LOGS)-এ ক্লিক করলে আপনি লগ লাইনগুলো দেখতে নাও পারেন অথবা কেবল কয়েকটি লাইন দেখতে পারেন। এমন ক্ষেত্রে, লগ এক্সপ্লোরারের কোয়েরি প্যানে থাকা টাইম-রেঞ্জ সিলেক্টরটি ব্যবহার করে ‘লাস্ট ৩০ মিনিটস’ (Last 30 minutes) নির্বাচন করুন।

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

কোনো নির্দিষ্ট লগ সম্পর্কে আরও তথ্য দেখতে আপনি যেকোনো লাইনে ক্লিক করতে পারেন। প্রসারিত লগগুলিতে অতিরিক্ত UI উপাদান থাকে, যেগুলিতে ক্লিক করে আপনি লগ সম্পর্কিত সমস্ত তথ্য কপি করতে, লগ এন্ট্রির সমস্ত ডেটা প্রদর্শন করতে সমস্ত ফিল্ড প্রসারিত করতে এবং জেমিনি ব্যবহার করে লগ এন্ট্রিটি ব্যাখ্যা করতে পারবেন।
৪. এক্সেপশন কলস্ট্যাকটি খুব বেশি তথ্যপূর্ণ নয়। এক্সেপশনের স্ট্যাক ট্রেস লগের শেষ অংশটি খুঁজে বের করার জন্য লগগুলো দেখুন। এটি হলো সেই লাইনটি যেখানে লেখা আছে " Container called exit(1) "। নিম্নলিখিত লগ সারাংশটি বলছে:
functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain...
এটি তদন্তের জন্য একটি উপযুক্ত বিষয় বলে মনে হচ্ছে। লগ এন্ট্রিটি বিস্তারিত দেখতে এই লাইনে ক্লিক করুন। এরপর, নির্বাচিত লগটি সম্পর্কে অতিরিক্ত তথ্য দেখতে " এই লগ এন্ট্রিটি ব্যাখ্যা করুন " বোতামে ক্লিক করুন।

এই প্রজেক্টে যদি আগে Gemini ব্যবহার করা না হয়ে থাকে, তাহলে আপনাকে একটি প্রয়োজনীয় API সক্রিয় করতে বলা হবে। যদি আপনাকে API সক্রিয় করতে বলা হয়, তাহলে এগিয়ে যাওয়ার জন্য ENABLE-এ ক্লিক করুন।

মনে রাখবেন যে, জেমিনিকে প্রম্পট করার সময় মাঝে মাঝে আপনি একটি ত্রুটি পেতে পারেন। এমন ক্ষেত্রে, প্রতিক্রিয়া পেতে আপনার প্রম্পট অপারেশনটি আরও একবার পুনরাবৃত্তি করুন। উদাহরণস্বরূপ, " এই লগ এন্ট্রিটি ব্যাখ্যা করুন " বোতামটি আবার ক্লিক করুন।
৫. মিথুন রাশির দেওয়া ব্যাখ্যা পর্যালোচনা করুন। যদি প্রদত্ত ব্যাখ্যাটি অপর্যাপ্ত বা অস্পষ্ট হয়, তবে নিম্নলিখিত ইঙ্গিতগুলির মধ্যে একটি ব্যবহার করে অথবা আপনার নিজের প্রশ্ন তৈরি করে মিথুনকে আরও তথ্য দিতে উৎসাহিত করুন।
আপনি কি এই লগটি সম্পর্কে আরও তথ্য দিতে পারবেন?
আপনি কি ত্রুটিটি সম্পর্কে আরও তথ্য দিতে পারবেন?
৬. এরপর সমস্যা সমাধানের জন্য মিথুন রাশির কাছে পরামর্শ চান। উদাহরণস্বরূপ, মিথুন রাশিকে জিজ্ঞাসা করুন
এই সমস্যাটি কীভাবে সমাধান করা যায়?
এই ত্রুটিটি সমাধান করার জন্য একটি সমাধান প্রস্তাব করুন।
এই ত্রুটিটি কীভাবে সমাধান করা যায়, পরামর্শ দিন।
বর্তমান প্রেক্ষাপট এবং আপনার প্রম্পটের শব্দচয়ন ও বিন্যাসের উপর নির্ভর করে জেমিনির প্রতিক্রিয়া ভিন্ন হতে পারে। আশা করা যায় যে, জেমিনি এই বিষয়টি নিশ্চিত করার জন্য সুপারিশ করবে যে ক্লাউড ফাংশনের সোর্স কোডে hello_http নামের একটি ফাংশন রয়েছে।
৭. আপনি এখন ক্লাউড ফাংশন লগ দেখানোর ট্যাবটি দেখছেন। ত্রুটিসহ ক্লাউড ফাংশন ডেপ্লয়মেন্ট পেজটি দেখানো আগের ট্যাবটি নির্বাচন করুন এবং এডিট (EDIT) এ ক্লিক করুন।

৮. নিশ্চিত করুন যে প্রমাণীকরণ এখনও ‘অনুমোদনবিহীন আহ্বানের অনুমতি দিন’ (Allow unauthenticated invocations) হিসেবে সেট করা আছে এবং প্রয়োজনে নির্বাচনটি আপডেট করুন।

৯. ইনলাইন এডিটর দেখতে নিচে থাকা NEXT বাটনে ক্লিক করুন। জেমিনির পরামর্শ অনুসরণ করে ফাংশনের নাম get_order_list থেকে hello_http তে পরিবর্তন করুন।
সম্পাদনা শেষ হলে DEPLOY-তে ক্লিক করুন।
ডেপ্লয়মেন্ট প্রক্রিয়াটি সম্পূর্ণ হতে আপনার কয়েক মিনিট অপেক্ষা করার প্রয়োজন হতে পারে। ডেপ্লয়মেন্ট সফলভাবে সম্পন্ন হয়েছে এবং কোনো ত্রুটির বার্তা দেখা যাচ্ছে না, তা নিশ্চিত করুন।
মনে রাখবেন যে, ডেপ্লয়মেন্ট প্রক্রিয়া সম্পূর্ণ না হওয়া পর্যন্ত কনসোল আপনাকে শেষ ত্রুটির বার্তাটি দেখানো অব্যাহত রাখতে পারে।
১০. curl ব্যবহার করে নিম্নলিখিত HTTPS অনুরোধটি পাঠিয়ে ক্লাউড ফাংশনটি চালু আছে কিনা তা পরীক্ষা করুন। আপনি ক্লাউড শেল ব্যবহার করতে পারেন অথবা এমন যেকোনো টার্মিনাল থেকে এটি করতে পারেন যেখানে curl এবং gcloud CLI` ইনস্টল করা আছে। ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান।
curl -m 70 -X GET \
https://us-central1-${GOOGLE_CLOUD_PROJECT}.cloudfunctions.net/\
codelab-cf?path=gs://cloud-samples-data/generative-ai/image/ \
-H "Authorization: bearer $(gcloud auth print-identity-token)"
মনে রাখবেন যে, টার্মিনাল থেকে এই কমান্ডটি চালানোর জন্য আপনাকে gcloud CLI ব্যবহার করে প্রমাণীকরণ করতে হবে এবং GOOGLE_CLOUD_PROJECT এনভায়রনমেন্ট ভেরিয়েবলে আপনার প্রজেক্ট আইডির মান সেট করতে হবে।
বোনাস
যখন পাইথন রানটাইম নির্বাচন করা হয়েছিল, তখন hello_http ফাংশনটির নামটি HTTP দ্বারা চালিত ক্লাউড ফাংশনের জন্য একটি ডিফল্ট এন্ট্রি পয়েন্ট হিসাবে সংজ্ঞায়িত করা হয়েছিল। এর বিকল্প সমাধান হতে পারে সোর্স কোডে ফাংশনটির নাম get_order_list রাখা এবং রানটাইম ফিল্ডের ডানদিকে ইনলাইন এডিটরের উপরে অবস্থিত ক্লাউড ফাংশনের এন্ট্রি পয়েন্ট ফিল্ডটি আপডেট করা:

এন্ট্রি পয়েন্ট hello_http থেকে get_order_list এ পরিবর্তন করলে ডিপ্লয়মেন্ট সংক্রান্ত সমস্যার সমাধান হবে।
৪. পরিষ্কার-পরিচ্ছন্নতা
পরিষ্কার করার জন্য আপনি প্রজেক্টটি শাটডাউন করতে পারেন অথবা ক্লাউড ফাংশন ইনস্ট্যান্সটি ডিলিট করতে পারেন। আপনি কনসোল ব্যবহার করে অথবা নিচের মতো CLI কমান্ডের সাহায্যে ক্লাউড ফাংশন ডিলিট করতে পারেন:
gcloud functions delete codelab-cf --region=us-central1
৫. অভিনন্দন!
অভিনন্দন - আপনি সফলভাবে জেমিনি ব্যবহার করে আপনার অ্যাপ্লিকেশনের সমস্যাটি সমাধান করেছেন এবং এখন বুঝতে পারছেন যে এটি কীভাবে লগ বুঝতে ও গুগল ক্লাউড সম্পর্কিত প্রশ্নের উত্তর পেতে সহায়তা করতে পারে।