Go-তে আপনার অ্যাপে আরও ভালো পারফরম্যান্সের জন্য যন্ত্র (পার্ট 2: প্রোফাইলার)

1. ভূমিকা

e0509e8a07ad5537.png

শেষ আপডেট: 2022-07-14

আবেদনের পর্যবেক্ষণযোগ্যতা

পর্যবেক্ষণযোগ্যতা এবং ক্রমাগত প্রোফাইলার

পর্যবেক্ষণযোগ্যতা একটি সিস্টেমের একটি বৈশিষ্ট্য বর্ণনা করতে ব্যবহৃত শব্দ। পর্যবেক্ষণযোগ্যতা সহ একটি সিস্টেম দলগুলিকে তাদের সিস্টেম সক্রিয়ভাবে ডিবাগ করতে দেয়। সেই প্রেক্ষাপটে পর্যবেক্ষণযোগ্যতার তিনটি স্তম্ভ; লগ, মেট্রিক্স এবং ট্রেস হল পর্যবেক্ষণযোগ্যতা অর্জনের জন্য সিস্টেমের জন্য মৌলিক উপকরণ।

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

এই কোডল্যাবটি সিরিজের 2 অংশ এবং এটি একটি অবিচ্ছিন্ন প্রোফাইলার এজেন্টকে কভার করে। অংশ 1 ওপেনটেলিমেট্রি এবং ক্লাউড ট্রেসের সাথে বিতরণ করা ট্রেসিং কভার করে, এবং আপনি অংশ 1 এর সাথে মাইক্রোসার্ভিসেসের বাধা আরও ভালভাবে চিহ্নিত করার বিষয়ে আরও শিখবেন।

আপনি কি নির্মাণ করবেন

এই কোডল্যাবে, আপনি "শেক্সপীয়ার অ্যাপ্লিকেশন" (ওরফে শেক্সঅ্যাপ) সার্ভার পরিষেবাতে অবিচ্ছিন্ন প্রোফাইলার এজেন্টের জন্য যাচ্ছেন যা Google Kubernetes ইঞ্জিন ক্লাস্টারে চলে৷ Shakesapp এর স্থাপত্য নিচে বর্ণনা করা হয়েছে:

44e243182ced442f.png

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

পার্ট 1-এ, আপনি খুঁজে পেয়েছেন যে সার্ভার পরিষেবার কোথাও বাধা রয়েছে, কিন্তু আপনি সঠিক কারণ চিহ্নিত করতে পারেননি।

আপনি কি শিখবেন

  • প্রোফাইলার এজেন্ট এম্বেড কিভাবে
  • ক্লাউড প্রোফাইলারে বোতলের ঘাড় কীভাবে তদন্ত করবেন

এই কোডল্যাবটি ব্যাখ্যা করে কিভাবে আপনার আবেদনে একটি অবিচ্ছিন্ন প্রোফাইলার এজেন্টকে ইন্সট্রুমেন্ট করতে হয়।

আপনি কি প্রয়োজন হবে

  • Go এর একটি প্রাথমিক জ্ঞান
  • কুবারনেটসের একটি প্রাথমিক জ্ঞান

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে (Gmail বা Google Apps), তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে। Google ক্লাউড প্ল্যাটফর্ম কনসোলে সাইন-ইন করুন ( console.cloud.google.com ) এবং একটি নতুন প্রকল্প তৈরি করুন৷

আপনার যদি ইতিমধ্যে একটি প্রকল্প থাকে, তাহলে কনসোলের উপরের বাম দিকে প্রজেক্ট নির্বাচন পুল ডাউন মেনুতে ক্লিক করুন:

7a32e5469db69e9.png

এবং একটি নতুন প্রকল্প তৈরি করতে ফলাফল ডায়ালগে 'নতুন প্রকল্প' বোতামে ক্লিক করুন:

7136b3ee36ebaf89.png

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

870a3cbd6541ee86.png

পরবর্তী প্রকল্প তৈরির ডায়ালগ আপনাকে আপনার নতুন প্রকল্পের বিশদ বিবরণ প্রবেশ করতে দেয়:

affdc444517ba805.png

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত Google ক্লাউড প্রকল্প জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে নেওয়া হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এটিকে পরে এই কোডল্যাবে PROJECT_ID হিসাবে উল্লেখ করা হবে৷

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

15d0ef27a8fbab27.png

এই কোডল্যাবের মাধ্যমে চালানোর জন্য আপনার কয়েক ডলারের বেশি খরচ করা উচিত নয়, তবে আপনি যদি আরও সংস্থান ব্যবহার করার সিদ্ধান্ত নেন বা আপনি যদি সেগুলিকে চলমান রেখে দেন তবে এটি আরও বেশি হতে পারে (এই নথির শেষে "পরিষ্কার" বিভাগটি দেখুন)। গুগল ক্লাউড ট্রেস, গুগল কুবারনেটস ইঞ্জিন এবং গুগল আর্টিফ্যাক্ট রেজিস্ট্রির মূল্য অফিসিয়াল ডকুমেন্টেশনে উল্লেখ করা হয়েছে।

Google ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা $300 বিনামূল্যের ট্রায়ালের জন্য যোগ্য, যা এই কোডল্যাবটিকে সম্পূর্ণ বিনামূল্যে করতে হবে৷

গুগল ক্লাউড শেল সেটআপ

যদিও Google ক্লাউড এবং Google ক্লাউড ট্রেস আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যেতে পারে, এই কোডল্যাবে আমরা Google ক্লাউড শেল ব্যবহার করব, ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত বিকাশের সরঞ্জামগুলির সাথে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এর মানে হল যে এই কোডল্যাবের জন্য আপনার যা দরকার তা হল একটি ব্রাউজার (হ্যাঁ, এটি একটি Chromebook এ কাজ করে)।

ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল ক্লাউড শেল সক্রিয় করুন ক্লিক করুন gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHKLJXOgOg39g ddS2A (পরিবেশের সাথে সংযোগ স্থাপন এবং সংযোগের জন্য এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে)।

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvDu64GoM8 Rw

স্ক্রীন শট 2017-06-14 10.13.43 PM.png এ

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রকল্পটি ইতিমধ্যেই আপনার 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 খুঁজছেন? সেটআপ ধাপে আপনি কোন আইডি ব্যবহার করেছেন তা দেখুন বা ক্লাউড কনসোল ড্যাশবোর্ডে দেখুন:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvOBziBc35650

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা আপনার ভবিষ্যত কমান্ড চালানোর সময় কার্যকর হতে পারে।

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

একটি Google Kubernetes ক্লাস্টার সেটআপ করুন

এই কোডল্যাবে, আপনি Google Kubernetes Engine (GKE) এ মাইক্রোসার্ভিসের একটি ক্লাস্টার চালাবেন। এই কোডল্যাবের প্রক্রিয়াটি নিম্নরূপ:

  1. ক্লাউড শেল এ বেসলাইন প্রকল্প ডাউনলোড করুন
  2. পাত্রে মাইক্রোসার্ভিস তৈরি করুন
  3. Google আর্টিফ্যাক্ট রেজিস্ট্রিতে (GAR) পাত্রে আপলোড করুন
  4. GKE-এ কন্টেইনার স্থাপন করুন
  5. ট্রেস ইন্সট্রুমেন্টেশনের জন্য পরিষেবার সোর্স কোড পরিবর্তন করুন
  6. ধাপ 2 এ যান

কুবারনেটস ইঞ্জিন সক্ষম করুন

প্রথমে, আমরা একটি Kubernetes ক্লাস্টার সেট আপ করি যেখানে শেক্সঅ্যাপ GKE-তে চলে, তাই আমাদের GKE সক্ষম করতে হবে। "Kubernetes Engine" মেনুতে নেভিগেট করুন এবং ENABLE বোতাম টিপুন।

548cfd95bc6d344d.png

এখন আপনি একটি Kubernetes ক্লাস্টার তৈরি করতে প্রস্তুত।

Kubernetes ক্লাস্টার তৈরি করুন

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

আর্টিফ্যাক্ট রেজিস্ট্রি এবং স্ক্যাফোল্ড সেটআপ

এখন আমাদের কাছে একটি Kubernetes ক্লাস্টার স্থাপনের জন্য প্রস্তুত আছে। এরপরে আমরা পাত্রে পুশ এবং স্থাপনার জন্য একটি কন্টেইনার রেজিস্ট্রির জন্য প্রস্তুত করি। এই পদক্ষেপগুলির জন্য, আমাদের এটি ব্যবহার করার জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি (GAR) এবং স্ক্যাফোল্ড সেট আপ করতে হবে।

আর্টিফ্যাক্ট রেজিস্ট্রি সেটআপ

"আর্টিফ্যাক্ট রেজিস্ট্রি" এর মেনুতে নেভিগেট করুন এবং সক্ষম বোতাম টিপুন৷

45e384b87f7cf0db.png

কিছুক্ষণ পর, আপনি GAR এর সংগ্রহস্থল ব্রাউজার দেখতে পাবেন। "রিপোজিটরি তৈরি করুন" বোতামে ক্লিক করুন এবং সংগ্রহস্থলের নাম লিখুন।

d6a70f4cb4ebcbe3.png

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

9c2d1ce65258ef70.png

এখন আপনি সংগ্রহস্থল ব্রাউজারে "ট্রেস-কোডল্যাব" দেখতে পাচ্ছেন।

7a3c1f47346bea15.png

আমরা রেজিস্ট্রি পথ চেক করতে পরে এখানে ফিরে আসব.

স্ক্যাফোল্ড সেটআপ

আপনি যখন কুবারনেটে চালিত মাইক্রোসার্ভিস তৈরিতে কাজ করেন তখন স্ক্যাফোল্ড একটি সহজ টুল। এটি কমান্ডের একটি ছোট সেট সহ অ্যাপ্লিকেশনগুলির পাত্রে নির্মাণ, পুশিং এবং স্থাপনের কার্যপ্রবাহ পরিচালনা করে। স্ক্যাফোল্ড ডিফল্টরূপে ডকার রেজিস্ট্রি কনটেইনার রেজিস্ট্রি হিসাবে ব্যবহার করে, তাই আপনাকে স্ক্যাফোল্ড কনফিগার করতে হবে যাতে কনটেইনার পুশ করার সময় GAR চিনতে পারে।

আবার ক্লাউড শেল খুলুন এবং স্ক্যাফোল্ড ইনস্টল করা আছে কিনা তা নিশ্চিত করুন। (ক্লাউড শেল ডিফল্টরূপে পরিবেশে স্ক্যাফোল্ড ইনস্টল করে।) নিম্নলিখিত কমান্ডটি চালান এবং স্ক্যাফোল্ড সংস্করণটি দেখুন।

skaffold version

কমান্ড আউটপুট

v1.38.0

এখন, আপনি স্ক্যাফোল্ড ব্যবহারের জন্য ডিফল্ট সংগ্রহস্থল নিবন্ধন করতে পারেন। রেজিস্ট্রি পাথ পাওয়ার জন্য, নিজেকে আর্টিফ্যাক্ট রেজিস্ট্রি ড্যাশবোর্ডে নেভিগেট করুন এবং আগের ধাপে আপনি যে রিপোজিটরি সেট আপ করেছেন তার নামে ক্লিক করুন।

7a3c1f47346bea15.png

তারপরে আপনি পৃষ্ঠার শীর্ষে ব্রেডক্রাম্বস ট্রেইল দেখতে পাবেন। ক্লিক করুন e157b1359c3edc06.png ক্লিপবোর্ডে রেজিস্ট্রি পাথ কপি করতে আইকন।

e0f2ae2144880b8b.png

অনুলিপি বোতামে ক্লিক করলে, আপনি ব্রাউজারের নীচে ডায়ালগ দেখতে পাবেন যেমন বার্তা সহ:

"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 কন্টেইনার সেট আপ করার জন্য পরবর্তী ধাপে যেতে পারেন।

সারাংশ

এই ধাপে, আপনি আপনার কোডল্যাব পরিবেশ সেট আপ করুন:

  • ক্লাউড শেল সেট আপ করুন
  • কন্টেইনার রেজিস্ট্রির জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি সংগ্রহস্থল তৈরি করা হয়েছে
  • কন্টেইনার রেজিস্ট্রি ব্যবহার করতে স্ক্যাফোল্ড সেট আপ করুন
  • একটি কুবারনেটস ক্লাস্টার তৈরি করা হয়েছে যেখানে কোডল্যাব মাইক্রোসার্ভিসগুলি চলে৷

পরবর্তী আপ

পরবর্তী ধাপে, আপনি সার্ভার পরিষেবাতে অবিচ্ছিন্ন প্রোফাইলার এজেন্টকে যন্ত্র দেবেন।

3. মাইক্রো সার্ভিসগুলি তৈরি করুন, পুশ করুন এবং স্থাপন করুন

কোডল্যাব উপাদান ডাউনলোড করুন

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

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] ফোল্ডারে সোর্স কোডটিও উল্লেখ করতে পারেন। (অংশ 1 ধাপ 0 থেকে ধাপ 4 কভার করে, এবং অংশ 2 ধাপ 5 এবং 6 কভার করে)

স্ক্যাফোল্ড কমান্ড চালান

অবশেষে আপনি আপনার তৈরি করা Kubernetes ক্লাস্টারে সম্পূর্ণ বিষয়বস্তু তৈরি, পুশ এবং স্থাপন করতে প্রস্তুত। মনে হচ্ছে এতে একাধিক ধাপ রয়েছে কিন্তু প্রকৃতপক্ষে স্ক্যাফোল্ড আপনার জন্য সবকিছু করে। আসুন নিম্নলিখিত কমান্ড দিয়ে এটি চেষ্টা করুন:

cd step4
skaffold dev

কমান্ডটি চালানোর সাথে সাথে, আপনি docker build লগ আউটপুট দেখতে পাবেন এবং নিশ্চিত করতে পারেন যে সেগুলি সফলভাবে রেজিস্ট্রিতে পুশ করা হয়েছে।

কমান্ড আউটপুট

...
---> 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

মনে রাখবেন যে এই সময়ে, আপনি সার্ভার থেকে কোনো বার্তা দেখতে চান। ঠিক আছে, পরিশেষে আপনি পরিষেবাগুলির বিতরণ ট্রেসিংয়ের জন্য OpenTelemetry-এর সাথে আপনার অ্যাপ্লিকেশনটি ইনস্ট্রুমেন্ট করা শুরু করতে প্রস্তুত।

পরিষেবাটি শুরু করার আগে, দয়া করে 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

সারাংশ

এই ধাপে, আপনি আপনার পরিবেশে কোডল্যাব উপাদান প্রস্তুত করেছেন এবং প্রত্যাশিত স্ক্যাফোল্ড রান নিশ্চিত করেছেন।

পরবর্তী আপ

পরবর্তী ধাপে, আপনি লোডজেন পরিষেবার সোর্স কোড পরিবর্তন করবেন যাতে ট্রেস তথ্যের উপকরণ তৈরি হয়।

4. ক্লাউড প্রোফাইলার এজেন্টের ইনস্ট্রুমেন্টেশন

ক্রমাগত প্রোফাইলিংয়ের ধারণা

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

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

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

ক্লাউড প্রোফাইলার এজেন্ট এম্বেড করুন

বোতাম টিপে ক্লাউড শেল এডিটর খুলুন 776a11bfb2122549.png ক্লাউড শেলের উপরের ডানদিকে। বাম ফলকে এক্সপ্লোরার থেকে step4/src/server/main.go খুলুন এবং প্রধান ফাংশন খুঁজুন।

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-এর জন্য কিছু সেটআপ কোড দেখতে পাচ্ছেন, যা কোডল্যাব অংশ 1-এ করা হয়েছে। এখন আপনি এখানে ক্লাউড প্রোফাইলার এজেন্টের জন্য উপকরণ যোগ করবেন। আমরা 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 : মেমরি বরাদ্দ প্রোফাইলিং অক্ষম করুন
  • NoGoroutine Profiling : goroutine প্রোফাইলিং অক্ষম করুন
  • NoCUPprofiling : CPU প্রোফাইলিং অক্ষম করুন

এই কোডল্যাবে, আমরা শুধুমাত্র CPU প্রোফাইলিং সক্ষম করি।

এখন আপনাকে যা করতে হবে তা হল এই ফাংশনটিকে 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
        ...
}

লক্ষ্য করুন যে আপনি go কীওয়ার্ড দিয়ে initProfiler() ফাংশনটিকে কল করছেন। কারণ profiler.Start() ব্লক করে তাই আপনাকে এটি অন্য গোরুটিনে চালাতে হবে। এখন এটি নির্মাণের জন্য প্রস্তুত। স্থাপনের আগে go mod tidy চালানো নিশ্চিত করুন।

go mod tidy

এখন আপনার নতুন সার্ভার পরিষেবার সাথে আপনার ক্লাস্টার স্থাপন করুন।

skaffold dev

ক্লাউড প্রোফাইলারে শিখা গ্রাফ দেখতে সাধারণত কয়েক মিনিট সময় লাগে। উপরের অনুসন্ধান বাক্সে "প্রোফাইলার" টাইপ করুন এবং প্রোফাইলারের আইকনে ক্লিক করুন।

3d8ca8a64b267a40.png

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

7f80797dddc0128d.png

সারাংশ

এই ধাপে, আপনি ক্লাউড প্রোফাইলার এজেন্টকে সার্ভার পরিষেবাতে এম্বেড করেছেন এবং নিশ্চিত করেছেন যে এটি শিখা গ্রাফ তৈরি করে।

পরবর্তী আপ

পরবর্তী ধাপে, আপনি শিখা গ্রাফের সাহায্যে অ্যাপ্লিকেশনটিতে বাধার কারণ অনুসন্ধান করবেন।

5. ক্লাউড প্রোফাইলার শিখা গ্রাফ বিশ্লেষণ করুন

শিখা গ্রাফ কি?

ফ্লেম গ্রাফ হল প্রোফাইল ডেটা ভিজ্যুয়ালাইজ করার একটি উপায়। বিস্তারিত ব্যাখ্যার জন্য, অনুগ্রহ করে আমাদের নথি দেখুন, কিন্তু সংক্ষিপ্ত সারাংশ হল:

  • প্রতিটি বার অ্যাপ্লিকেশনে পদ্ধতি/ফাংশন কল প্রকাশ করে
  • উল্লম্ব দিক হল কল স্ট্যাক; কল স্ট্যাক উপরে থেকে নীচে বৃদ্ধি পায়
  • অনুভূমিক দিক হল সম্পদের ব্যবহার; দীর্ঘ, খারাপ

যে দেওয়া, আসুন প্রাপ্ত শিখা গ্রাফ তাকান.

7f80797dddc0128d.png

শিখা গ্রাফ বিশ্লেষণ

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

6d90760c6c1183cd.png

আমাদের ক্ষেত্রে, এটা স্পষ্ট যে grpc.(*Server).serveStreams.func1.2 সবচেয়ে বেশি CPU সময় ব্যয় করছে, এবং কল স্ট্যাকের উপর থেকে নীচের দিকে তাকিয়ে, এটি বেশিরভাগ সময় ব্যয় করে main.(*serverService).GetMatchCount , যা সার্ভার পরিষেবাতে gRPC সার্ভার হ্যান্ডলার।

GetMatchCount-এর অধীনে, আপনি regexp ফাংশনগুলির একটি সিরিজ দেখতে পাচ্ছেন: regexp.MatchString এবং regexp.Compile । তারা স্ট্যান্ডার্ড প্যাকেজ থেকে এসেছে: অর্থাৎ, পারফরম্যান্স সহ অনেক দৃষ্টিকোণ থেকে তাদের ভালভাবে পরীক্ষা করা উচিত। কিন্তু এখানে ফলাফল দেখায় যে 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 দেখুন।

80b8a4ba1931ff7b.png

নথি অনুসারে, regexp.MatchString প্রতিটি কলে রেগুলার এক্সপ্রেশন প্যাটার্ন কম্পাইল করে। তাই বৃহৎ সম্পদ খরচের কারণ এই মত শোনাচ্ছে.

সারাংশ

এই ধাপে, আপনি শিখা গ্রাফ বিশ্লেষণ করে সম্পদ খরচের কারণ অনুমান করেছেন।

পরবর্তী আপ

পরবর্তী ধাপে, আপনি সার্ভার পরিষেবার সোর্স কোড আপডেট করবেন এবং সংস্করণ 1.0.0 থেকে পরিবর্তন নিশ্চিত করবেন।

6. সোর্স কোড আপডেট করুন এবং শিখা গ্রাফগুলি আলাদা করুন

সোর্স কোড আপডেট করুন

পূর্ববর্তী ধাপে, আপনি অনুমান করেছেন যে 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 প্যাটার্ন সংকলন প্রক্রিয়াটি regexp.MatchString থেকে বের করা হয়েছে এবং নেস্টেড ফর লুপের বাইরে সরানো হয়েছে।

এই কোডটি স্থাপন করার আগে, 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 dev

এবং কিছুক্ষণ পরে, ক্লাউড প্রোফাইলার ড্যাশবোর্ড পুনরায় লোড করুন এবং দেখুন এটি কেমন।

283cfcd4c13716ad.png

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

e3a1456b4aada9a5.png

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

841dec77d8ba5595.png

"তুলনা করুন" ড্রপ ডাউন তালিকার মান "সংস্করণ" এ পরিবর্তন করুন এবং "তুলনামূলক সংস্করণ" এর মান "1.0.0" এ পরিবর্তন করুন, আসল সংস্করণ।

5553844292d6a537.png

আপনি এই ধরনের শিখা গ্রাফ দেখতে পাবেন। গ্রাফের আকৃতি 1.1.0 এর মতো কিন্তু রঙ ভিন্ন। তুলনা মোডে , রঙ মানে কি:

  • নীল : মান (সম্পদ খরচ) কমে গেছে
  • কমলা : অর্জিত মান (সম্পদ খরচ)
  • ধূসর : নিরপেক্ষ

কিংবদন্তি দেওয়া, এর ফাংশনটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক। আপনি যে বারে জুম করতে চান তাতে ক্লিক করে, আপনি স্ট্যাকের ভিতরে আরও বিশদ দেখতে পাবেন। অনুগ্রহ করে main.(*serverService).GetMatchCount বার। এছাড়াও বারের উপর ঘোরার মাধ্যমে, আপনি তুলনার বিবরণ দেখতে পাবেন।

ca08d942dc1e2502.png

এটি বলে যে মোট CPU সময় 5.26s থেকে 2.88s করা হয়েছে (মোট হল 10s = স্যাম্পলিং উইন্ডো)। এটি একটি বিশাল উন্নতি!

এখন আপনি প্রোফাইল ডেটা বিশ্লেষণ থেকে আপনার অ্যাপ্লিকেশন কর্মক্ষমতা উন্নত করতে পারেন.

সারাংশ

এই ধাপে, আপনি সার্ভার পরিষেবাতে একটি সম্পাদনা করেছেন এবং ক্লাউড প্রোফাইলারের তুলনা মোডের উন্নতি নিশ্চিত করেছেন৷

পরবর্তী আপ

পরবর্তী ধাপে, আপনি সার্ভার পরিষেবার সোর্স কোড আপডেট করবেন এবং সংস্করণ 1.0.0 থেকে পরিবর্তন নিশ্চিত করবেন।

7. অতিরিক্ত পদক্ষেপ: ট্রেস জলপ্রপাতের উন্নতি নিশ্চিত করুন

বিতরণ করা ট্রেস এবং ক্রমাগত প্রোফাইলিংয়ের মধ্যে পার্থক্য

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

এই ধাপে, আসুন বিতরণ করা ট্রেস (ক্লাউড ট্রেস) থেকে জলপ্রপাতের গ্রাফ পর্যালোচনা করি এবং ক্রমাগত প্রোফাইলিং থেকে পার্থক্য দেখি।

এই জলপ্রপাত গ্রাফটি "ভালোবাসা" প্রশ্নের সাথে একটি ট্রেস। এটি মোট প্রায় 6.7s (6700ms) নিচ্ছে।

e2b7dec25926ee51.png

এবং এটি একই প্রশ্নের জন্য উন্নতির পরে। আপনি যেমন বলছেন, মোট বিলম্ব এখন 1.5s (1500ms), যা পূর্ববর্তী বাস্তবায়ন থেকে একটি বিশাল উন্নতি।

feeb7207f36c7e5e.png

এখানে গুরুত্বপূর্ণ বিষয় হল যে বিতরণ করা ট্রেস জলপ্রপাত চার্টে, কল স্ট্যাকের তথ্য পাওয়া যায় না যদি না আপনি যন্ত্রটি চারপাশে সর্বত্র ছড়িয়ে পড়েন। এছাড়াও বিতরণ করা ট্রেসগুলি শুধুমাত্র পরিষেবাগুলি জুড়ে লেটেন্সির উপর ফোকাস করে যেখানে ক্রমাগত প্রোফাইলিং একটি একক পরিষেবার কম্পিউটার সংস্থানগুলিতে (CPU, মেমরি, OS থ্রেড) ফোকাস করে৷

অন্য দিক থেকে, বিতরণ করা ট্রেস হল ইভেন্ট বেস, ক্রমাগত প্রোফাইল পরিসংখ্যানগত। প্রতিটি ট্রেসের একটি আলাদা লেটেন্সি গ্রাফ রয়েছে এবং লেটেন্সি পরিবর্তনের প্রবণতা পেতে আপনার আলাদা ফর্ম্যাট যেমন বিতরণের প্রয়োজন৷

সারাংশ

এই ধাপে, আপনি বিতরণ করা ট্রেস এবং ক্রমাগত প্রোফাইলিংয়ের মধ্যে পার্থক্য পরীক্ষা করেছেন।

8. অভিনন্দন

আপনি OpenTelemery-এর মাধ্যমে সফলভাবে বিতরণ করা ট্রেস তৈরি করেছেন এবং Google ক্লাউড ট্রেসে মাইক্রোসার্ভিস জুড়ে অনুরোধ বিলম্বের বিষয়টি নিশ্চিত করেছেন।

বর্ধিত ব্যায়ামের জন্য, আপনি নিজের দ্বারা নিম্নলিখিত বিষয়গুলি চেষ্টা করতে পারেন।

  • বর্তমান বাস্তবায়ন স্বাস্থ্য পরীক্ষার দ্বারা উত্পন্ন সমস্ত স্প্যান পাঠায়। ( grpc.health.v1.Health/Check ) আপনি কিভাবে ক্লাউড ট্রেস থেকে সেই স্প্যানগুলিকে ফিল্টার করবেন? ইঙ্গিত এখানে .
  • স্প্যানগুলির সাথে ইভেন্ট লগগুলিকে সংযুক্ত করুন এবং দেখুন কিভাবে এটি Google ক্লাউড ট্রেস এবং Google ক্লাউড লগিং-এ কাজ করে৷ ইঙ্গিত এখানে .
  • কিছু পরিষেবা অন্য ভাষায় একটি দিয়ে প্রতিস্থাপন করুন এবং সেই ভাষার জন্য OpenTelemetry দিয়ে এটিকে ইনস্ট্রুমেন্ট করার চেষ্টা করুন।

এছাড়াও, আপনি যদি এর পরে প্রোফাইলার সম্পর্কে জানতে চান, অনুগ্রহ করে পার্ট 2-এ যান৷ আপনি সেক্ষেত্রে নীচের ক্লিন আপ বিভাগটি এড়িয়ে যেতে পারেন৷

পরিষ্কার করুন

এই কোডল্যাবের পরে, অনুগ্রহ করে Kubernetes ক্লাস্টার বন্ধ করুন এবং প্রকল্পটি মুছে ফেলার বিষয়টি নিশ্চিত করুন যাতে আপনি Google Kubernetes Engine, Google Cloud Trace, Google Artifact Registry-এ অপ্রত্যাশিত চার্জ না পান৷

প্রথমত, ক্লাস্টার মুছে ফেলুন। আপনি যদি 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"> "সেটিংস" নির্বাচন করুন এবং তারপরে "শাট ডাউন" বোতামে ক্লিক করুন।

45aa37b7d5e1ddd1.png

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