১. ভূমিকা

সর্বশেষ হালনাগাদ: ২০২২-০৭-১৪
অ্যাপ্লিকেশনটির পর্যবেক্ষণযোগ্যতা
পর্যবেক্ষণযোগ্যতা এবং অবিচ্ছিন্ন প্রোফাইলার
অবজার্ভেবিলিটি হলো একটি সিস্টেমের বৈশিষ্ট্য বর্ণনা করার জন্য ব্যবহৃত পরিভাষা। অবজার্ভেবিলিটি সম্পন্ন একটি সিস্টেম টিমগুলোকে তাদের সিস্টেম সক্রিয়ভাবে ডিবাগ করার সুযোগ দেয়। সেই প্রেক্ষাপটে, অবজার্ভেবিলিটির তিনটি স্তম্ভ হলো লগ, মেট্রিক্স এবং ট্রেস, যা একটি সিস্টেমের অবজার্ভেবিলিটি অর্জনের জন্য মৌলিক উপকরণ হিসেবে কাজ করে।
এছাড়াও অবজার্ভেবিলিটির তিনটি স্তম্ভের পাশাপাশি, কন্টিনিউয়াস প্রোফাইলিং হলো এর আরেকটি মূল উপাদান এবং এটি ইন্ডাস্ট্রিতে এর ব্যবহারকারীর সংখ্যা বাড়িয়ে চলেছে । ক্লাউড প্রোফাইলার এর অন্যতম প্রবর্তক এবং এটি অ্যাপ্লিকেশন কল স্ট্যাকের পারফরম্যান্স মেট্রিক্স গভীরভাবে বিশ্লেষণ করার জন্য একটি সহজ ইন্টারফেস প্রদান করে।
এই কোডল্যাবটি সিরিজের দ্বিতীয় পর্ব এবং এতে একটি কন্টিনিউয়াস প্রোফাইলার এজেন্টকে ইনস্ট্রুমেন্ট করার বিষয়টি আলোচনা করা হয়েছে। প্রথম পর্বে ওপেনটেলিমেট্রি এবং ক্লাউড ট্রেস ব্যবহার করে ডিস্ট্রিবিউটেড ট্রেসিং নিয়ে আলোচনা করা হয়েছে, এবং সেই পর্বের মাধ্যমে আপনি মাইক্রোসার্ভিসগুলোর বটলনেক আরও ভালোভাবে শনাক্ত করার বিষয়ে শিখবেন।
আপনি যা তৈরি করবেন
এই কোডল্যাবে, আপনি গুগল কুবারনেটিস ইঞ্জিন ক্লাস্টারে চলমান 'শেক্সপিয়ার অ্যাপ্লিকেশন' (শেক্সঅ্যাপ নামেও পরিচিত)-এর সার্ভার সার্ভিসে কন্টিনিউয়াস প্রোফাইলার এজেন্ট ইন্সট্রুমেন্ট করবেন। শেকসঅ্যাপ-এর আর্কিটেকচার নিচে বর্ণনা করা হলো:

- লোডজেন HTTP-এর মাধ্যমে ক্লায়েন্টের কাছে একটি কোয়েরি স্ট্রিং পাঠায়।
- ক্লায়েন্টরা gRPC-এর মাধ্যমে লোডজেন থেকে সার্ভারে কোয়েরিটি প্রেরণ করে।
- সার্ভার ক্লায়েন্টের কাছ থেকে কোয়েরি গ্রহণ করে, গুগল ক্লাউড স্টোরেজ থেকে টেক্সট ফরম্যাটে শেক্সপিয়রের সমস্ত রচনা সংগ্রহ করে, কোয়েরিযুক্ত লাইনগুলো অনুসন্ধান করে এবং মিলে যাওয়া লাইনের নম্বরটি ক্লায়েন্টকে ফেরত পাঠায়।
প্রথম অংশে, আপনি সার্ভার সার্ভিসের কোথাও প্রতিবন্ধকতাটি খুঁজে পেয়েছিলেন, কিন্তু এর সঠিক কারণ শনাক্ত করতে পারেননি।
আপনি যা শিখবেন
- প্রোফাইলার এজেন্ট কীভাবে এম্বেড করবেন
- ক্লাউড প্রোফাইলার-এ বাধাটি কীভাবে অনুসন্ধান করবেন
এই কোডল্যাবটি ব্যাখ্যা করে, কীভাবে আপনার অ্যাপ্লিকেশনে একটি কন্টিনিউয়াস প্রোফাইলার এজেন্টকে ইন্সট্রুমেন্ট করতে হয়।
আপনার যা যা লাগবে
- গো সম্পর্কে প্রাথমিক জ্ঞান
- কুবারনেটিস সম্পর্কে প্রাথমিক জ্ঞান
২. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিতে পরিবেশ সেটআপ
আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট (জিমেইল বা গুগল অ্যাপস) না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে। গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন।
আপনার যদি আগে থেকেই কোনো প্রজেক্ট থাকে, তাহলে কনসোলের উপরের বাম দিকের প্রজেক্ট সিলেকশন পুল-ডাউন মেনুতে ক্লিক করুন:

এবং একটি নতুন প্রজেক্ট তৈরি করতে, প্রাপ্ত ডায়ালগ বক্সে থাকা 'NEW PROJECT' বোতামটিতে ক্লিক করুন:

আপনার যদি আগে থেকে কোনো প্রজেক্ট না থাকে, তাহলে আপনার প্রথম প্রজেক্টটি তৈরি করার জন্য এইরকম একটি ডায়ালগ বক্স দেখতে পাবেন:

পরবর্তী প্রজেক্ট তৈরির ডায়ালগ বক্সে আপনি আপনার নতুন প্রজেক্টের বিবরণ লিখতে পারবেন:

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।
এরপরে, যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে Google Cloud রিসোর্স ব্যবহার করতে এবং Cloud Trace API চালু করতে আপনাকে ডেভেলপার কনসোলে বিলিং সক্ষম করতে হবে।

এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়, কিন্তু আপনি যদি আরও রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলোকে চালু রাখেন, তাহলে খরচ আরও বেশি হতে পারে (এই ডকুমেন্টের শেষে 'ক্লিনআপ' অংশটি দেখুন)। Google Cloud Trace, Google Kubernetes Engine এবং Google Artifact Registry-এর মূল্যতালিকা অফিসিয়াল ডকুমেন্টেশনে উল্লেখ করা আছে।
- গুগল ক্লাউডের অপারেশনস স্যুটের মূল্য | অপারেশনস স্যুট
- মূল্য নির্ধারণ | কুবারনেটিস ইঞ্জিন ডকুমেন্টেশন
- আর্টিফ্যাক্ট রেজিস্ট্রি মূল্য নির্ধারণ | আর্টিফ্যাক্ট রেজিস্ট্রি ডকুমেন্টেশন
গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে পাওয়া যাবে।
গুগল ক্লাউড শেল সেটআপ
যদিও গুগল ক্লাউড এবং গুগল ক্লাউড ট্রেস আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।
এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এর মানে হলো, এই কোডল্যাবের জন্য আপনার শুধু একটি ব্রাউজার প্রয়োজন হবে (হ্যাঁ, এটি ক্রোমবুকেও কাজ করে)।
ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন।
(পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।


ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার PROJECT_ID তে সেট করা আছে।
gcloud auth list
কমান্ড আউটপুট
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি কোনো কারণে প্রজেক্টটি সেট করা না থাকে, তাহলে নিম্নলিখিত কমান্ডটি দিন:
gcloud config set project <PROJECT_ID>
আপনার PROJECT_ID খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।
echo $GOOGLE_CLOUD_PROJECT
কমান্ড আউটপুট
<PROJECT_ID>
অবশেষে, ডিফল্ট জোন এবং প্রজেক্ট কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f
আপনি বিভিন্ন ধরনের জোন বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল ও জোন দেখুন।
ভাষা সেটআপে যান
এই কোডল্যাবে আমরা সমস্ত সোর্স কোডের জন্য Go ব্যবহার করেছি। ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান এবং Go-এর ভার্সনটি 1.17+ কিনা তা নিশ্চিত করুন।
go version
কমান্ড আউটপুট
go version go1.18.3 linux/amd64
একটি গুগল কুবারনেটিস ক্লাস্টার সেটআপ করুন
এই কোডল্যাবে, আপনি গুগল কুবারনেটিস ইঞ্জিন (GKE)-এ মাইক্রোসার্ভিসের একটি ক্লাস্টার চালাবেন। এই কোডল্যাবের প্রক্রিয়াটি নিম্নরূপ:
- বেসলাইন প্রজেক্টটি ক্লাউড শেলে ডাউনলোড করুন
- কন্টেইনারে মাইক্রোসার্ভিস তৈরি করুন
- Google Artifact Registry (GAR)-এ কন্টেইনারগুলি আপলোড করুন
- GKE-তে কন্টেইনারগুলি স্থাপন করুন
- ট্রেস ইন্সট্রুমেন্টেশনের জন্য সার্ভিসগুলোর সোর্স কোড পরিবর্তন করুন।
- ধাপ ২-এ যান
কুবারনেটিস ইঞ্জিন সক্রিয় করুন
প্রথমে, আমরা একটি Kubernetes ক্লাস্টার সেট আপ করব যেখানে Shakesapp GKE-তে চলে, তাই আমাদের GKE সক্রিয় করতে হবে। 'Kubernetes Engine' মেনুতে যান এবং ENABLE বোতামটি চাপুন।

এখন আপনি একটি কুবারনেটিস ক্লাস্টার তৈরি করার জন্য প্রস্তুত।
কুবারনেটিস ক্লাস্টার তৈরি করুন
ক্লাউড শেলে, একটি কুবারনেটিস ক্লাস্টার তৈরি করতে নিম্নলিখিত কমান্ডটি চালান। অনুগ্রহ করে নিশ্চিত করুন যে জোন ভ্যালুটি সেই অঞ্চলের অধীনে রয়েছে যা আপনি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরির জন্য ব্যবহার করবেন। যদি আপনার রিপোজিটরি অঞ্চলটি এই জোনকে অন্তর্ভুক্ত না করে, তবে জোন ভ্যালু us-central1-f পরিবর্তন করুন।
gcloud container clusters create otel-trace-codelab2 \ --zone us-central1-f \ --release-channel rapid \ --preemptible \ --enable-autoscaling \ --max-nodes 8 \ --no-enable-ip-alias \ --scopes cloud-platform
কমান্ড আউটপুট
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s). Creating cluster otel-trace-codelab2 in us-central1-f... Cluster is being health-checked (master is healthy)...done. Created [https://container.googleapis.com/v1/projects/development-215403/zones/us-central1-f/clusters/otel-trace-codelab2]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-f/otel-trace-codelab2?project=development-215403 kubeconfig entry generated for otel-trace-codelab2. NAME: otel-trace-codelab2 LOCATION: us-central1-f MASTER_VERSION: 1.23.6-gke.1501 MASTER_IP: 104.154.76.89 MACHINE_TYPE: e2-medium NODE_VERSION: 1.23.6-gke.1501 NUM_NODES: 3 STATUS: RUNNING
আর্টিফ্যাক্ট রেজিস্ট্রি এবং স্কাফোল্ড সেটআপ
এখন আমাদের কাছে ডেপ্লয়মেন্টের জন্য প্রস্তুত একটি কুবারনেটিস ক্লাস্টার আছে। এরপর আমরা কন্টেইনার পুশ এবং ডেপ্লয় করার জন্য একটি কন্টেইনার রেজিস্ট্রি প্রস্তুত করব। এই ধাপগুলোর জন্য, আমাদের একটি আর্টিফ্যাক্ট রেজিস্ট্রি (GAR) সেট আপ করতে হবে এবং এটি ব্যবহার করার জন্য স্কাফোল্ড তৈরি করতে হবে।
আর্টিফ্যাক্ট রেজিস্ট্রি সেটআপ
'আর্টিফ্যাক্ট রেজিস্ট্রি' মেনুতে যান এবং ENABLE বোতামটি চাপুন।

কিছুক্ষণ পর আপনি GAR-এর রিপোজিটরি ব্রাউজারটি দেখতে পাবেন। "CREATE REPOSITORY" বোতামে ক্লিক করুন এবং রিপোজিটরির নাম লিখুন।

এই কোডল্যাবে, আমি নতুন রিপোজিটরিটির নাম দিয়েছি trace-codelab । আর্টিফ্যাক্টের ফরম্যাট হলো "Docker" এবং লোকেশন টাইপ হলো "Region"। আপনি Google Compute Engine-এর ডিফল্ট জোনের জন্য যে অঞ্চলটি সেট করেছেন, তার কাছাকাছি একটি অঞ্চল বেছে নিন। উদাহরণস্বরূপ, উপরের এই উদাহরণে "us-central1-f" বেছে নেওয়া হয়েছে, তাই এখানে আমরা "us-central1 (Iowa)" বেছে নেব। তারপর "CREATE" বোতামে ক্লিক করুন।

এখন আপনি রিপোজিটরি ব্রাউজারে 'trace-codelab' দেখতে পাচ্ছেন।

রেজিস্ট্রি পাথটি যাচাই করার জন্য আমরা পরে এখানে ফিরে আসব।
স্ক্যাফোল্ড সেটআপ
Kubernetes-এ চালিত মাইক্রোসার্ভিস তৈরির ক্ষেত্রে Skaffold একটি অত্যন্ত দরকারি টুল। এটি অল্প কিছু কমান্ডের সাহায্যে অ্যাপ্লিকেশনের কন্টেইনার তৈরি, পুশ এবং ডিপ্লয় করার ওয়ার্কফ্লো পরিচালনা করে। Skaffold ডিফল্টভাবে কন্টেইনার রেজিস্ট্রি হিসেবে Docker Registry ব্যবহার করে, তাই কন্টেইনার পুশ করার সময় GAR-কে চেনার জন্য আপনাকে Skaffold কনফিগার করতে হবে।
আবার ক্লাউড শেল খুলুন এবং skaffold ইনস্টল করা আছে কিনা তা নিশ্চিত করুন। (ক্লাউড শেল ডিফল্টরূপে পরিবেশে skaffold ইনস্টল করে।) নিম্নলিখিত কমান্ডটি চালান এবং skaffold সংস্করণটি দেখুন।
skaffold version
কমান্ড আউটপুট
v1.38.0
এখন, আপনি স্কাফোল্ডের ব্যবহারের জন্য ডিফল্ট রিপোজিটরিটি রেজিস্টার করতে পারেন। রেজিস্ট্রি পাথটি পাওয়ার জন্য, আর্টিফ্যাক্ট রেজিস্ট্রি ড্যাশবোর্ডে যান এবং আগের ধাপে সেট আপ করা রিপোজিটরিটির নামে ক্লিক করুন।

এরপর আপনি পেজের উপরে ব্রেডক্রাম্ব ট্রেইল দেখতে পাবেন। ক্লিক করুন।
রেজিস্ট্রি পাথটি ক্লিপবোর্ডে কপি করার আইকন।

কপি বোতামে ক্লিক করলে, আপনি ব্রাউজারের নীচে এই ধরনের বার্তা সহ একটি ডায়ালগ বক্স দেখতে পাবেন:
"us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab" কপি করা হয়েছে
ক্লাউড শেলে ফিরে যান। ড্যাশবোর্ড থেকে এইমাত্র কপি করা মানটি দিয়ে skaffold config set default-repo কমান্ডটি চালান।
skaffold config set default-repo us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab
কমান্ড আউটপুট
set value default-repo to us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab for context gke_stackdriver-sandbox-3438851889_us-central1-b_stackdriver-sandbox
এছাড়াও, আপনাকে ডকার কনফিগারেশনের জন্য রেজিস্ট্রি কনফিগার করতে হবে। নিম্নলিখিত কমান্ডটি চালান:
gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
কমান্ড আউটপুট
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud",
"us-central1-docker.pkg.dev": "gcloud"
}
}
Adding credentials for: us-central1-docker.pkg.dev
এখন আপনি GKE-তে একটি Kubernetes কন্টেইনার সেট আপ করার পরবর্তী ধাপের জন্য প্রস্তুত।
সারসংক্ষেপ
এই ধাপে, আপনি আপনার কোডল্যাব পরিবেশ সেট আপ করবেন:
- ক্লাউড শেল সেট আপ করুন
- কন্টেইনার রেজিস্ট্রির জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করা হয়েছে।
- কন্টেইনার রেজিস্ট্রি ব্যবহার করার জন্য স্কাফোল্ড সেট আপ করুন।
- একটি কুবারনেটিস ক্লাস্টার তৈরি করা হয়েছে যেখানে কোডল্যাব মাইক্রোসার্ভিসগুলো চলে।
এরপরে
পরবর্তী ধাপে, আপনি সার্ভার সার্ভিসে কন্টিনিউয়াস প্রোফাইলার এজেন্ট ইন্সট্রুমেন্ট করবেন।
৩. মাইক্রোসার্ভিসগুলো বিল্ড, পুশ এবং ডিপ্লয় করুন
কোডল্যাব উপকরণ ডাউনলোড করুন
পূর্ববর্তী ধাপে, আমরা এই কোডল্যাবের জন্য সমস্ত পূর্বশর্ত প্রস্তুত করেছি। এখন আপনি সেগুলোর উপর সম্পূর্ণ মাইক্রোসার্ভিসগুলো চালানোর জন্য প্রস্তুত। কোডল্যাবের উপাদানগুলো গিটহাবে হোস্ট করা আছে, তাই নিম্নলিখিত গিট কমান্ডের মাধ্যমে সেগুলো ক্লাউড শেল এনভায়রনমেন্টে ডাউনলোড করুন।
cd ~ git clone https://github.com/ymotongpoo/opentelemetry-trace-codelab-go.git cd opentelemetry-trace-codelab-go
প্রকল্পটির ডিরেক্টরি কাঠামোটি নিম্নরূপ:
.
├── README.md
├── step0
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
├── step1
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
├── step2
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
├── step3
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
├── step4
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
├── step5
│ ├── manifests
│ ├── proto
│ ├── skaffold.yaml
│ └── src
└── step6
├── manifests
├── proto
├── skaffold.yaml
└── src
- ম্যানিফেস্ট: কুবারনেটিস ম্যানিফেস্ট ফাইল
- প্রোটো: ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের জন্য প্রোটো সংজ্ঞা।
- src: প্রতিটি সার্ভিসের সোর্স কোডের জন্য ডিরেক্টরি
- skaffold.yaml: skaffold-এর কনফিগারেশন ফাইল
এই কোডল্যাবে, আপনি step4 ফোল্ডারের অধীনে অবস্থিত সোর্স কোড আপডেট করবেন। শুরু থেকে পরিবর্তনগুলো দেখার জন্য আপনি step[1-6] ফোল্ডারের সোর্স কোডও দেখতে পারেন। (পার্ট ১-এ step0 থেকে step4 এবং পার্ট ২-এ step 5 ও 6 অন্তর্ভুক্ত)
skaffold কমান্ড চালান
অবশেষে আপনি আপনার সদ্য তৈরি করা কুবারনেটিস ক্লাস্টারে সম্পূর্ণ কন্টেন্ট বিল্ড, পুশ এবং ডিপ্লয় করার জন্য প্রস্তুত। শুনে মনে হতে পারে এতে একাধিক ধাপ রয়েছে, কিন্তু আসল ব্যাপার হলো স্কাফোল্ড আপনার জন্য সবকিছু করে দেয়। চলুন, নিচের কমান্ডটি দিয়ে তা চেষ্টা করে দেখা যাক:
cd step4 skaffold dev
As soon as running the command, you see the log output of docker build and can confirm that they are successfully pushed to the registry.
কমান্ড আউটপুট
... ---> Running in c39b3ea8692b ---> 90932a583ab6 Successfully built 90932a583ab6 Successfully tagged us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step1 The push refers to repository [us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice] cc8f5a05df4a: Preparing 5bf719419ee2: Preparing 2901929ad341: Preparing 88d9943798ba: Preparing b0fdf826a39a: Preparing 3c9c1e0b1647: Preparing f3427ce9393d: Preparing 14a1ca976738: Preparing f3427ce9393d: Waiting 14a1ca976738: Waiting 3c9c1e0b1647: Waiting b0fdf826a39a: Layer already exists 88d9943798ba: Layer already exists f3427ce9393d: Layer already exists 3c9c1e0b1647: Layer already exists 14a1ca976738: Layer already exists 2901929ad341: Pushed 5bf719419ee2: Pushed cc8f5a05df4a: Pushed step1: digest: sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe size: 2001
সমস্ত সার্ভিস কন্টেইনার পুশ করার পর, কুবারনেটিস ডিপ্লয়মেন্টগুলো স্বয়ংক্রিয়ভাবে শুরু হয়ে যায়।
কমান্ড আউটপুট
sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8 size: 1997 Tags used in deployment: - serverservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step4@sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe - clientservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/clientservice:step4@sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8 - loadgen -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/loadgen:step4@sha256:eea2e5bc8463ecf886f958a86906cab896e9e2e380a0eb143deaeaca40f7888a Starting deploy... - deployment.apps/clientservice created - service/clientservice created - deployment.apps/loadgen created - deployment.apps/serverservice created - service/serverservice created
ডেপ্লয়মেন্টের পরে, আপনি প্রতিটি কন্টেইনারের stdout-এ প্রকৃত অ্যাপ্লিকেশন লগগুলি এইভাবে নির্গত হতে দেখবেন:
কমান্ড আউটপুট
[client] 2022/07/14 06:33:15 {"match_count":3040}
[loadgen] 2022/07/14 06:33:15 query 'love': matched 3040
[client] 2022/07/14 06:33:15 {"match_count":3040}
[loadgen] 2022/07/14 06:33:15 query 'love': matched 3040
[client] 2022/07/14 06:33:16 {"match_count":3040}
[loadgen] 2022/07/14 06:33:16 query 'love': matched 3040
[client] 2022/07/14 06:33:19 {"match_count":463}
[loadgen] 2022/07/14 06:33:19 query 'tear': matched 463
[loadgen] 2022/07/14 06:33:20 query 'world': matched 728
[client] 2022/07/14 06:33:20 {"match_count":728}
[client] 2022/07/14 06:33:22 {"match_count":463}
[loadgen] 2022/07/14 06:33:22 query 'tear': matched 463
মনে রাখবেন, এই পর্যায়ে আপনি সার্ভার থেকে আসা যেকোনো বার্তা দেখতে চাইবেন। ঠিক আছে, অবশেষে আপনি সার্ভিসগুলোর ডিস্ট্রিবিউটেড ট্রেসিংয়ের জন্য ওপেনটেলিমেট্রি দিয়ে আপনার অ্যাপ্লিকেশনটি ইন্সট্রুমেন্ট করা শুরু করতে প্রস্তুত।
সার্ভিসটি ইন্সট্রুমেন্টেশন শুরু করার আগে, অনুগ্রহ করে Ctrl-C চেপে আপনার ক্লাস্টারটি শাট ডাউন করুন।
কমান্ড আউটপুট
...
[client] 2022/07/14 06:34:57 {"match_count":1}
[loadgen] 2022/07/14 06:34:57 query 'what's past is prologue': matched 1
^CCleaning up...
- W0714 06:34:58.464305 28078 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
- To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
- deployment.apps "clientservice" deleted
- service "clientservice" deleted
- deployment.apps "loadgen" deleted
- deployment.apps "serverservice" deleted
- service "serverservice" deleted
সারসংক্ষেপ
এই ধাপে, আপনি আপনার পরিবেশে কোডল্যাবের উপকরণ প্রস্তুত করেছেন এবং নিশ্চিত করেছেন যে স্ক্যাফোল্ড প্রত্যাশা অনুযায়ী চলছে।
এরপরে
পরবর্তী ধাপে, আপনি ট্রেস তথ্য ইন্সট্রুমেন্ট করার জন্য লোডজেন সার্ভিসের সোর্স কোড পরিবর্তন করবেন।
৪. ক্লাউড প্রোফাইলার এজেন্টের ইন্সট্রুমেন্টেশন
ক্রমাগত প্রোফাইলিং এর ধারণা
কন্টিনিউয়াস প্রোফাইলিং-এর ধারণা ব্যাখ্যা করার আগে, আমাদের প্রথমে প্রোফাইলিং সম্পর্কে বুঝতে হবে। প্রোফাইলিং হলো অ্যাপ্লিকেশনকে ডাইনামিকভাবে (ডাইনামিক প্রোগ্রাম অ্যানালাইসিস) বিশ্লেষণ করার অন্যতম একটি উপায় এবং এটি সাধারণত অ্যাপ্লিকেশন ডেভেলপমেন্টের সময় লোড টেস্টিং ইত্যাদির প্রক্রিয়ায় করা হয়ে থাকে। এটি একটি নির্দিষ্ট সময়কালে সিপিইউ এবং মেমরি ব্যবহারের মতো সিস্টেম মেট্রিকগুলো পরিমাপ করার জন্য এককালীন একটি কার্যক্রম। প্রোফাইল ডেটা সংগ্রহ করার পর, ডেভেলপাররা কোডের বাইরে সেগুলো বিশ্লেষণ করেন।
কন্টিনিউয়াস প্রোফাইলিং হলো সাধারণ প্রোফাইলিং-এর একটি বর্ধিত পদ্ধতি: এটি দীর্ঘ সময় ধরে চলমান অ্যাপ্লিকেশনের উপর পর্যায়ক্রমে স্বল্প সময়ের প্রোফাইল চালায় এবং প্রচুর প্রোফাইল ডেটা সংগ্রহ করে। তারপর এটি অ্যাপ্লিকেশনের নির্দিষ্ট অ্যাট্রিবিউট, যেমন ভার্সন নম্বর, ডেপ্লয়মেন্ট জোন, পরিমাপের সময় ইত্যাদির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে পরিসংখ্যানগত বিশ্লেষণ তৈরি করে। আপনি আমাদের ডকুমেন্টেশনে এই ধারণাটির আরও বিস্তারিত বিবরণ পাবেন।
যেহেতু টার্গেটটি একটি চলমান অ্যাপ্লিকেশন, তাই পর্যায়ক্রমে প্রোফাইল ডেটা সংগ্রহ করে সেগুলোকে কোনো ব্যাকএন্ডে পাঠানোর একটি উপায় আছে, যা পরিসংখ্যানগত ডেটাগুলোকে পোস্ট-প্রসেস করে। সেটিই হলো ক্লাউড প্রোফাইলার এজেন্ট এবং আপনি শীঘ্রই এটিকে সার্ভার সার্ভিসে এমবেড করতে চলেছেন।
ক্লাউড প্রোফাইলার এজেন্ট এম্বেড করুন
বাটনটি চেপে ক্লাউড শেল এডিটর খুলুন
ক্লাউড শেলের উপরের ডানদিকে। বাম দিকের প্যানেলের এক্সপ্লোরার থেকে step4/src/server/main.go ফাইলটি খুলুন এবং main ফাংশনটি খুঁজুন।
step4/src/server/main.go
func main() {
...
// step2. setup OpenTelemetry
tp, err := initTracer()
if err != nil {
log.Fatalf("failed to initialize TracerProvider: %v", err)
}
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
log.Fatalf("error shutting down TracerProvider: %v", err)
}
}()
// step2. end setup
svc := NewServerService()
// step2: add interceptor
interceptorOpt := otelgrpc.WithTracerProvider(otel.GetTracerProvider())
srv := grpc.NewServer(
grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor(interceptorOpt)),
grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor(interceptorOpt)),
)
// step2: end adding interceptor
shakesapp.RegisterShakespeareServiceServer(srv, svc)
healthpb.RegisterHealthServer(srv, svc)
if err := srv.Serve(lis); err != nil {
log.Fatalf("error serving server: %v", err)
}
}
main ফাংশনে আপনি OpenTelemetry এবং gRPC-এর জন্য কিছু সেটআপ কোড দেখতে পাচ্ছেন, যা কোডল্যাব পার্ট ১-এ করা হয়েছে। এখন আপনি এখানে Cloud Profiler এজেন্টের জন্য ইন্সট্রুমেন্টেশন যোগ করবেন। initTracer() এর জন্য আমরা যা করেছিলাম, ঠিক সেভাবেই সহজে পড়ার সুবিধার জন্য আপনি initProfiler() নামে একটি ফাংশন লিখতে পারেন।
step4/src/server/main.go
import (
...
"cloud.google.com/go/profiler" // step5. add profiler package
"cloud.google.com/go/storage"
...
)
// step5: add Profiler initializer
func initProfiler() {
cfg := profiler.Config{
Service: "server",
ServiceVersion: "1.0.0",
NoHeapProfiling: true,
NoAllocProfiling: true,
NoGoroutineProfiling: true,
NoCPUProfiling: false,
}
if err := profiler.Start(cfg); err != nil {
log.Fatalf("failed to launch profiler agent: %v", err)
}
}
চলুন profiler.Config{} অবজেক্টে নির্দিষ্ট করা অপশনগুলো ভালোভাবে দেখে নেওয়া যাক।
- পরিষেবা : পরিষেবার নাম যা আপনি প্রোফাইলার ড্যাশবোর্ডে নির্বাচন এবং চালু করতে পারেন।
- সার্ভিসভার্সন : সার্ভিস ভার্সনের নাম। আপনি এই মানের উপর ভিত্তি করে প্রোফাইল ডেটা সেটগুলির তুলনা করতে পারেন।
- NoHeapProfiling : মেমরি ব্যবহারের প্রোফাইলিং নিষ্ক্রিয় করুন
- NoAllocProfiling : মেমরি বরাদ্দ প্রোফাইলিং নিষ্ক্রিয় করুন
- NoGoroutineProfiling : গোরুটিন প্রোফাইলিং নিষ্ক্রিয় করুন
- NoCPUProfiling : সিপিইউ প্রোফাইলিং নিষ্ক্রিয় করুন
এই কোডল্যাবে আমরা শুধুমাত্র সিপিইউ প্রোফাইলিং সক্রিয় করেছি।
এখন আপনাকে যা করতে হবে তা হলো, main ফাংশনের মধ্যে এই ফাংশনটিকে কল করা। ইম্পোর্ট ব্লকে ক্লাউড প্রোফাইলার প্যাকেজটি ইম্পোর্ট করতে ভুলবেন না।
step4/src/server/main.go
func main() {
...
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
log.Fatalf("error shutting down TracerProvider: %v", err)
}
}()
// step2. end setup
// step5. start profiler
go initProfiler()
// step5. end
svc := NewServerService()
// step2: add interceptor
...
}
লক্ষ্য করুন যে আপনি initProfiler() ফাংশনটিকে ` go কীওয়ার্ড দিয়ে কল করছেন। যেহেতু profiler.Start() ` ব্লক করে, তাই আপনাকে এটি অন্য একটি `goroutine`-এর মধ্যে চালাতে হবে। এখন এটি বিল্ড করার জন্য প্রস্তুত। ডিপ্লয়মেন্টের আগে go mod tidy রান করতে ভুলবেন না।
go mod tidy
এখন আপনার নতুন সার্ভার পরিষেবা দিয়ে আপনার ক্লাস্টারটি স্থাপন করুন।
skaffold dev
ক্লাউড প্রোফাইলার-এ ফ্লেম গ্রাফটি দেখতে সাধারণত কয়েক মিনিট সময় লাগে। উপরের সার্চ বক্সে "profiler" টাইপ করুন এবং প্রোফাইলারের আইকনে ক্লিক করুন।

তারপর আপনি নিম্নলিখিত শিখা গ্রাফটি দেখতে পাবেন।

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

ফ্লেম গ্রাফ বিশ্লেষণ
পূর্ববর্তী অংশে আপনি শিখেছেন যে, ফ্লেম গ্রাফের প্রতিটি বার একটি ফাংশন/মেথড কলকে প্রকাশ করে এবং এর দৈর্ঘ্য সেই ফাংশন/মেথডে ব্যবহৃত রিসোর্সের পরিমাণ বোঝায়। ক্লাউড প্রোফাইলারের ফ্লেম গ্রাফ বারগুলোকে বাম থেকে ডানে দৈর্ঘ্যের অবরোহী ক্রমে সাজায়, তাই আপনি গ্রাফের উপরের বাম দিক থেকে দেখা শুরু করতে পারেন।

আমাদের ক্ষেত্রে, এটা সুস্পষ্ট যে grpc.(*Server).serveStreams.func1.2 সিপিইউ-এর সর্বাধিক সময় ব্যবহার করছে, এবং কল স্ট্যাকটি উপর থেকে নিচে দেখলে বোঝা যায় যে, এই সময়ের বেশিরভাগই ব্যয় হয় main.(*serverService).GetMatchCount , যা সার্ভার সার্ভিসের gRPC সার্ভার হ্যান্ডলার।
GetMatchCount-এর অধীনে, আপনি regexp.MatchString এবং regexp.Compile মতো কয়েকটি রেজেক্স (regexp) ফাংশন দেখতে পাবেন। এগুলো স্ট্যান্ডার্ড প্যাকেজের অংশ: অর্থাৎ, পারফরম্যান্সসহ বিভিন্ন দিক থেকে এগুলো ভালোভাবে পরীক্ষিত হওয়ার কথা। কিন্তু এখানকার ফলাফল দেখাচ্ছে যে regexp.MatchString এবং regexp.Compile এ সিপিইউ (CPU) রিসোর্সের ব্যবহার অনেক বেশি। এই তথ্যগুলোর পরিপ্রেক্ষিতে, এখানে ধরে নেওয়া হচ্ছে যে পারফরম্যান্স সংক্রান্ত সমস্যার সাথে regexp.MatchString এর ব্যবহারের কোনো সম্পর্ক আছে। তাই চলুন, যেখানে ফাংশনটি ব্যবহৃত হয়েছে সেখানকার সোর্স কোডটি পড়া যাক।
step4/src/server/main.go
func (s *serverService) GetMatchCount(ctx context.Context, req *shakesapp.ShakespeareRequest) (*shakesapp.ShakespeareResponse, error) {
resp := &shakesapp.ShakespeareResponse{}
texts, err := readFiles(ctx, bucketName, bucketPrefix)
if err != nil {
return resp, fmt.Errorf("fails to read files: %s", err)
}
for _, text := range texts {
for _, line := range strings.Split(text, "\n") {
line, query := strings.ToLower(line), strings.ToLower(req.Query)
isMatch, err := regexp.MatchString(query, line)
if err != nil {
return resp, err
}
if isMatch {
resp.MatchCount++
}
}
}
return resp, nil
}
এই সেই জায়গা যেখানে regexp.MatchString কল করা হয়েছে। সোর্স কোড পড়লে আপনি হয়তো লক্ষ্য করবেন যে, ফাংশনটি একটি নেস্টেড ফর-লুপের ভিতরে কল করা হয়েছে। তাই এই ফাংশনটির ব্যবহার ভুল হতে পারে। চলুন regexp- এর GoDoc দেখে নেওয়া যাক।

ডকুমেন্ট অনুসারে, regexp.MatchString প্রতিটি কলে রেগুলার এক্সপ্রেশন প্যাটার্নটি কম্পাইল করে। সুতরাং, বিপুল পরিমাণ রিসোর্স খরচের কারণটি এইরকম শোনাচ্ছে।
সারসংক্ষেপ
এই ধাপে, আপনি ফ্লেম গ্রাফ বিশ্লেষণ করে সম্পদ খরচের কারণ সম্পর্কে একটি অনুমান করেছেন।
এরপরে
পরবর্তী ধাপে, আপনি সার্ভার সার্ভিসের সোর্স কোড আপডেট করবেন এবং ভার্সন 1.0.0 থেকে পরিবর্তনটি নিশ্চিত করবেন।
৬. সোর্স কোড আপডেট করুন এবং ফ্লেম গ্রাফগুলোর মধ্যে পার্থক্য নির্ণয় করুন।
সোর্স কোড আপডেট করুন
আগের ধাপে, আপনি ধরে নিয়েছিলেন যে বেশি রিসোর্স খরচের পেছনে regexp.MatchString এর ব্যবহারের ভূমিকা আছে। তাই চলুন এর সমাধান করা যাক। কোডটি খুলুন এবং ঐ অংশটি কিছুটা পরিবর্তন করুন।
step4/src/server/main.go
func (s *serverService) GetMatchCount(ctx context.Context, req *shakesapp.ShakespeareRequest) (*shakesapp.ShakespeareResponse, error) {
resp := &shakesapp.ShakespeareResponse{}
texts, err := readFiles(ctx, bucketName, bucketPrefix)
if err != nil {
return resp, fmt.Errorf("fails to read files: %s", err)
}
// step6. considered the process carefully and naively tuned up by extracting
// regexp pattern compile process out of for loop.
query := strings.ToLower(req.Query)
re := regexp.MustCompile(query)
for _, text := range texts {
for _, line := range strings.Split(text, "\n") {
line = strings.ToLower(line)
isMatch := re.MatchString(line)
// step6. done replacing regexp with strings
if isMatch {
resp.MatchCount++
}
}
}
return resp, nil
}
যেমনটি দেখছেন, এখন রেজেক্স প্যাটার্ন কম্পাইলেশন প্রক্রিয়াটি regexp.MatchString থেকে আলাদা করে নেস্টেড for লুপের বাইরে নিয়ে আসা হয়েছে।
এই কোডটি ডেপ্লয় করার আগে, initProfiler() ফাংশনে ভার্সন স্ট্রিংটি আপডেট করে নিতে ভুলবেন না।
step4/src/server/main.go
func initProfiler() {
cfg := profiler.Config{
Service: "server",
ServiceVersion: "1.1.0", // step6. update version
NoHeapProfiling: true,
NoAllocProfiling: true,
NoGoroutineProfiling: true,
NoCPUProfiling: false,
}
if err := profiler.Start(cfg); err != nil {
log.Fatalf("failed to launch profiler agent: %v", err)
}
}
এবার দেখা যাক এটি কীভাবে কাজ করে। skaffold কমান্ড দিয়ে ক্লাস্টারটি ডেপ্লয় করুন।
skaffold dev
এবং কিছুক্ষণ পর, ক্লাউড প্রোফাইলার ড্যাশবোর্ডটি পুনরায় লোড করে দেখুন এটি কেমন দেখায়।

ভার্সনটি "1.1.0" -এ পরিবর্তন করতে ভুলবেন না, যাতে আপনি শুধুমাত্র 1.1.0 ভার্সনের প্রোফাইলগুলো দেখতে পান। আপনি লক্ষ্য করতে পারেন যে, GetMatchCount-এর বারের দৈর্ঘ্য কমে গেছে এবং সিপিইউ টাইম ব্যবহারের অনুপাতও কমেছে (অর্থাৎ বারটি ছোট হয়ে গেছে)।

শুধু একটি ভার্সনের ফ্লেম গ্রাফ দেখেই নয়, আপনি দুটি ভার্সনের মধ্যকার পার্থক্যগুলোও তুলনা করতে পারেন।

"Compare to" ড্রপ-ডাউন তালিকার মান পরিবর্তন করে "Version" করুন এবং "Compared version"-এর মান পরিবর্তন করে মূল সংস্করণ "1.0.0" করুন।

আপনি এই ধরনের একটি শিখা গ্রাফ দেখতে পাবেন। গ্রাফটির আকৃতি ১.১.০-এর মতোই, কিন্তু এর রঙ ভিন্ন। তুলনা মোডে , রঙটির অর্থ হলো:
- নীল : মান (সম্পদ ব্যবহার) হ্রাস পেয়েছে
- কমলা : অর্জিত মান (সম্পদ ব্যবহার)
- ধূসর : নিরপেক্ষ
লেজেন্ডটি দেওয়া থাকলে, চলুন ফাংশনটি আরও ভালোভাবে দেখি। যে বারটি জুম ইন করতে চান, সেটিতে ক্লিক করে আপনি স্ট্যাকের ভেতরের আরও বিস্তারিত দেখতে পারবেন। অনুগ্রহ করে main.(*serverService).GetMatchCount বারটিতে ক্লিক করুন। এছাড়াও, বারটির উপর মাউস রাখলে আপনি তুলনার বিস্তারিত দেখতে পাবেন।

এতে বলা হয়েছে যে মোট সিপিইউ সময় ৫.২৬ সেকেন্ড থেকে কমে ২.৮৮ সেকেন্ড হয়েছে (মোট ১০ সেকেন্ড = স্যাম্পলিং উইন্ডো)। এটি একটি বিশাল উন্নতি!
এখন আপনি প্রোফাইল ডেটা বিশ্লেষণের মাধ্যমে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে পারবেন।
সারসংক্ষেপ
এই ধাপে, আপনি সার্ভার পরিষেবাতে একটি সম্পাদনা করেছেন এবং ক্লাউড প্রোফাইলারের তুলনা মোডে উন্নতিটি নিশ্চিত করেছেন।
এরপরে
পরবর্তী ধাপে, আপনি সার্ভার সার্ভিসের সোর্স কোড আপডেট করবেন এবং ভার্সন 1.0.0 থেকে পরিবর্তনটি নিশ্চিত করবেন।
৭. অতিরিক্ত ধাপ: ট্রেস ওয়াটারফল-এ উন্নতি নিশ্চিত করুন।
ডিস্ট্রিবিউটেড ট্রেস এবং কন্টিনিউয়াস প্রোফাইলিং এর মধ্যে পার্থক্য
কোডল্যাবের প্রথম অংশে, আপনি নিশ্চিত হয়েছিলেন যে আপনি একটি রিকোয়েস্ট পাথের জন্য মাইক্রোসার্ভিসগুলোর মধ্যে বটলনেক সার্ভিসটি খুঁজে বের করতে পেরেছিলেন, কিন্তু নির্দিষ্ট সার্ভিসটিতে বটলনেকের সঠিক কারণটি খুঁজে বের করতে পারেননি। এই দ্বিতীয় অংশের কোডল্যাবে, আপনি শিখেছেন যে কন্টিনিউয়াস প্রোফাইলিং আপনাকে কল স্ট্যাক থেকে একটিমাত্র সার্ভিসের ভেতরের বটলনেক শনাক্ত করতে সক্ষম করে।
এই ধাপে, চলুন ডিস্ট্রিবিউটেড ট্রেস (ক্লাউড ট্রেস) থেকে ওয়াটারফল গ্রাফটি পর্যালোচনা করি এবং কন্টিনিউয়াস প্রোফাইলিংয়ের সাথে এর পার্থক্য দেখি।
এই ওয়াটারফল গ্রাফটি হলো 'love' কোয়েরিটির ট্রেসগুলোর মধ্যে একটি। এটি সম্পন্ন হতে মোট প্রায় ৬.৭ সেকেন্ড (৬৭০০ মিলিসেকেন্ড) সময় লাগছে।

এবং এটি একই কোয়েরির উন্নতির পরের অবস্থা। আপনার কথামতো, মোট ল্যাটেন্সি এখন ১.৫ সেকেন্ড (১৫০০ মিলিসেকেন্ড), যা আগের বাস্তবায়নের তুলনায় একটি বিশাল উন্নতি।

এখানে গুরুত্বপূর্ণ বিষয় হলো, ডিস্ট্রিবিউটেড ট্রেস ওয়াটারফল চার্টে কল স্ট্যাকের তথ্য পাওয়া যায় না, যদি না আপনি এর চারপাশের সব জায়গায় স্প্যান ইন্সট্রুমেন্ট করেন। এছাড়াও, ডিস্ট্রিবিউটেড ট্রেস শুধুমাত্র বিভিন্ন সার্ভিসের ল্যাটেন্সির উপর আলোকপাত করে, যেখানে কন্টিনিউয়াস প্রোফাইলিং একটিমাত্র সার্ভিসের কম্পিউটার রিসোর্সের (সিপিইউ, মেমরি, ওএস থ্রেড) উপর মনোযোগ দেয়।
অন্য একটি দিক থেকে, ডিস্ট্রিবিউটেড ট্রেস হলো ইভেন্ট-ভিত্তিক, আর কন্টিনিউয়াস প্রোফাইল হলো পরিসংখ্যান-ভিত্তিক। প্রতিটি ট্রেসের একটি ভিন্ন ল্যাটেন্সি গ্রাফ থাকে এবং ল্যাটেন্সি পরিবর্তনের প্রবণতা বোঝার জন্য ডিস্ট্রিবিউশনের মতো একটি ভিন্ন ফরম্যাটের প্রয়োজন হয়।
সারসংক্ষেপ
এই ধাপে, আপনি ডিস্ট্রিবিউটেড ট্রেস এবং কন্টিনিউয়াস প্রোফাইলিং-এর মধ্যে পার্থক্য যাচাই করেছেন।
৮. অভিনন্দন
আপনি OpenTelemery ব্যবহার করে সফলভাবে ডিস্ট্রিবিউটেড ট্রেস তৈরি করেছেন এবং Google Cloud Trace-এ মাইক্রোসার্ভিস জুড়ে রিকোয়েস্ট ল্যাটেন্সি নিশ্চিত করেছেন।
বিস্তারিত অনুশীলনের জন্য, আপনি নিম্নলিখিত বিষয়গুলো নিজে নিজে চেষ্টা করতে পারেন।
- বর্তমান বাস্তবায়নটি হেলথ চেক দ্বারা তৈরি সমস্ত স্প্যান পাঠিয়ে দেয়। (
grpc.health.v1.Health/Check) আপনি ক্লাউড ট্রেস থেকে সেই স্প্যানগুলি কীভাবে ফিল্টার করবেন? ইঙ্গিতটি এখানে দেওয়া আছে। - ইভেন্ট লগগুলোকে স্প্যানের সাথে সংযুক্ত করুন এবং দেখুন গুগল ক্লাউড ট্রেস ও গুগল ক্লাউড লগিং-এ এটি কীভাবে কাজ করে। ইঙ্গিতটি এখানে দেওয়া আছে ।
- কোনো একটি সার্ভিসকে অন্য ভাষার সার্ভিস দিয়ে প্রতিস্থাপন করুন এবং সেই ভাষার জন্য OpenTelemetry ব্যবহার করে সেটিকে ইনস্ট্রুমেন্ট করার চেষ্টা করুন।
এছাড়াও, এরপর যদি আপনি প্রোফাইলার সম্পর্কে জানতে চান, তবে অনুগ্রহ করে পার্ট ২-এ চলে যান। সেক্ষেত্রে আপনি নীচের পরিষ্করণ অংশটি এড়িয়ে যেতে পারেন।
পরিষ্কার করা
এই কোডল্যাবটির পর, অনুগ্রহ করে কুবারনেটিস ক্লাস্টারটি বন্ধ করুন এবং প্রজেক্টটি ডিলিট করে দিন, যাতে গুগল কুবারনেটিস ইঞ্জিন, গুগল ক্লাউড ট্রেস, গুগল আর্টিফ্যাক্ট রেজিস্ট্রি-তে কোনো অপ্রত্যাশিত চার্জ যুক্ত না হয়।
প্রথমে, ক্লাস্টারটি ডিলিট করুন। আপনি যদি skaffold dev দিয়ে ক্লাস্টারটি চালান, তাহলে শুধু Ctrl-C চাপলেই হবে। আর যদি skaffold run দিয়ে ক্লাস্টারটি চালান, তাহলে নিচের কমান্ডটি চালান:
skaffold delete
কমান্ড আউটপুট
Cleaning up... - deployment.apps "clientservice" deleted - service "clientservice" deleted - deployment.apps "loadgen" deleted - deployment.apps "serverservice" deleted - service "serverservice" deleted
ক্লাস্টারটি মুছে ফেলার পর, মেনু প্যান থেকে "IAM & Admin" > "Settings" নির্বাচন করুন এবং তারপরে "SHUT DOWN" বোতামে ক্লিক করুন।

এরপর ডায়ালগ বক্সের ফর্মে প্রজেক্ট আইডি (প্রজেক্টের নাম নয়) প্রবেশ করান এবং শাটডাউন নিশ্চিত করুন।