OpenTelemetry ব্যবহার করে ইনস্ট্রুমেন্ট ট্রেস তথ্য

১. ভূমিকা

5af4a7e43b0feaab.png

সর্বশেষ হালনাগাদ: ২০২১-০৩-০৫

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

পর্যবেক্ষণযোগ্যতা এবং ওপেনটেলিমেট্রি

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

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

বিতরণকৃত ট্রেস

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

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

স্প্যান একটি ডিস্ট্রিবিউটেড সিস্টেমে সম্পাদিত কাজের একটি স্বতন্ত্র একককে প্রতিনিধিত্ব করে এবং এর শুরু ও শেষের সময় রেকর্ড করে। স্প্যানগুলোর মধ্যে প্রায়শই একটি শ্রেণিবদ্ধ সম্পর্ক থাকে — নিচের ছবিতে সমস্ত ছোট স্প্যানগুলো একটি বড় /messages স্প্যানের চাইল্ড স্প্যান, এবং এগুলোকে একত্রিত করে একটি একক ট্রেস তৈরি করা হয়েছে যা একটি সিস্টেমের মধ্য দিয়ে কাজের পথ দেখায়।

adbd3ecd69d410cb.png

গুগল ক্লাউড ট্রেস হলো ডিস্ট্রিবিউটেড ট্রেস ব্যাকএন্ডের অন্যতম একটি বিকল্প এবং এটি গুগল ক্লাউডের অন্যান্য প্রোডাক্টের সাথে ভালোভাবে সমন্বিত।

আপনি যা তৈরি করবেন

এই কোডল্যাবে, আপনি "Shakesapp" নামক সার্ভিসগুলোতে ট্রেস তথ্য ইন্সট্রুমেন্ট করবেন, যা গুগল কুবারনেটিস ইঞ্জিনে চালিত একটি কুবারনেটিস ক্লাস্টারে চলে। Shakesapp-এর আর্কিটেকচার নিচে বর্ণনা করা হলো:

68873c018a7be7de.png

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

আপনি অনুরোধ জুড়ে ট্রেস তথ্য স্থাপন করবেন।

আপনি যা শিখবেন

  • পাইথন প্রজেক্টে ওপেনটেলিমেট্রি ট্রেস লাইব্রেরিগুলো দিয়ে কীভাবে কাজ শুরু করবেন
  • লাইব্রেরি ব্যবহার করে কীভাবে স্প্যান তৈরি করবেন
  • অ্যাপ কম্পোনেন্টগুলোর মধ্যে নেটওয়ার্কের মাধ্যমে স্প্যান কনটেক্সট কীভাবে প্রচার করা যায়
  • Google Cloud Trace-এ ট্রেস ডেটা কীভাবে পাঠাবেন
  • গুগল ক্লাউড ট্রেসে ট্রেস কীভাবে বিশ্লেষণ করবেন

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

আপনার যা যা লাগবে

  • পাইথন ৩ সম্পর্কে জ্ঞান

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

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

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

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

15b8b6ac4d917005.png

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

7136b3ee36ebaf89.png

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

90977ce514204b51.png

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

6d9573e346e930b4.png

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

এরপরে, যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে Google Cloud রিসোর্স ব্যবহার করতে এবং Cloud Trace API চালু করতে আপনাকে ডেভেলপার কনসোলে বিলিং সক্ষম করতে হবে।

eb5325f65619ad6a.png

এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়, কিন্তু আপনি যদি আরও রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলোকে চালু রাখেন, তাহলে খরচ আরও বেশি হতে পারে (এই ডকুমেন্টের শেষে 'ক্লিনআপ' অংশটি দেখুন)। Google Cloud Trace, Google Kubernetes Engine এবং Google Artifacat Registry-এর মূল্যতালিকা অফিসিয়াল ডকুমেন্টেশনে উল্লেখ করা আছে।

গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে পাওয়া যাবে।

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

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

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

ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন। gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।

ff81d016724c4f67.png

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

a3e716fc9e7454e9.png

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

echo $GOOGLE_CLOUD_PROJECT

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

<PROJECT_ID>

অবশেষে, ডিফল্ট জোন এবং প্রজেক্ট কনফিগারেশন সেট করুন।

gcloud config set compute/zone us-central1-f

আপনি বিভিন্ন ধরনের জোন বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল ও জোন দেখুন।

পাইথন সেটআপ

এই কোডল্যাবে আমরা প্যাকেজ ভার্সন কঠোরভাবে পরিচালনা করার জন্য 'পোয়েট্রি' ব্যবহার করি। ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 -
source $HOME/.poetry/env

একটি গুগল কুবারনেটিস ক্লাস্টার সেটআপ করুন

এই কোডল্যাবে, আপনি গুগল কুবারনেটিস ইঞ্জিন (GKE)-এ মাইক্রোসার্ভিসের একটি ক্লাস্টার চালাবেন। এই কোডল্যাবের প্রক্রিয়াটি নিম্নরূপ:

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

কুবারনেটিস ইঞ্জিন সক্রিয় করুন

প্রথমে, আমরা একটি Kubernetes ক্লাস্টার সেট আপ করব যেখানে Shakesapp GKE-তে চলে, তাই আমাদের GKE সক্রিয় করতে হবে। 'Kubernetes Engine' মেনুতে যান এবং ENABLE বোতামটি চাপুন।

56c680e93e169731.png

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

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

ক্লাউড শেলে, একটি কুবারনেটিস ক্লাস্টার তৈরি করতে নিম্নলিখিত কমান্ডটি চালান। অনুগ্রহ করে নিশ্চিত করুন যে জোন ভ্যালুটি সেই অঞ্চলের অধীনে রয়েছে যা আপনি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরির জন্য ব্যবহার করেছেন। যদি আপনার রিপোজিটরি অঞ্চলটি এই জোনকে অন্তর্ভুক্ত না করে, তবে জোন ভ্যালু us-central1-f পরিবর্তন করুন।

gcloud container clusters create otel-trace-codelab --zone us-central1-f \
--num-nodes 1 \
--machine-type e2-highcpu-4

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

Creating cluster otel-trace-codelab in us-central1-f... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/psychic-order-307806/zones/us-central1-f/clusters/otel-trace-codelab].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-f/otel-trace-codelab?project=psychic-order-307806
kubeconfig entry generated for otel-trace-codelab.
NAME                LOCATION       MASTER_VERSION    MASTER_IP        MACHINE_TYPE  NODE_VERSION      NUM_NODES  STATUS
otel-trace-codelab  us-central1-f  1.18.12-gke.1210  104.154.162.176  e2-medium     1.18.12-gke.1210  3          RUNNING

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

এখন আমাদের কাছে ডেপ্লয় করার জন্য একটি কুবারনেটিস ক্লাস্টার প্রস্তুত আছে। এরপর আমরা কন্টেইনার পুশ এবং ডেপ্লয় করার জন্য একটি কন্টেইনার রেজিস্ট্রি প্রস্তুত করব। এই ধাপগুলোর জন্য, আমাদের GAR এবং skaffold সেট আপ করতে হবে।

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

'আর্টিফ্যাক্ট রেজিস্ট্রি' মেনুতে যান এবং ENABLE বোতামটি চাপুন।

f7493243bae0cdf7.png

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

f97f337f5476651.png

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

2f04143077ca56db.png

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

7a3c1f47346bea15.png

রেজিস্ট্রি পাথটি যাচাই করার জন্য আমরা পরে এখানে ফিরে আসব।

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

Kubernetes-এ চালিত মাইক্রোসার্ভিস তৈরির কাজে Skaffold একটি অত্যন্ত দরকারি টুল। এটি অল্প কিছু কমান্ডের সাহায্যে অ্যাপ্লিকেশনের কন্টেইনার তৈরি, পুশ এবং ডিপ্লয় করার ওয়ার্কফ্লো পরিচালনা করে। Skaffold ডিফল্টভাবে কন্টেইনার রেজিস্ট্রি হিসেবে Docker Registry ব্যবহার করে, তাই কন্টেইনার পুশ করার সময় GAR শনাক্ত করার জন্য আপনাকে Skaffold কনফিগার করতে হবে।

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

skaffold version

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

v1.20.0

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

55173fe922f40327.png

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

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

সারসংক্ষেপ

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

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

এরপরে

পরবর্তী ধাপে, আপনি আপনার মাইক্রোসার্ভিসগুলো বিল্ড করে ক্লাস্টারে পুশ ও ডিপ্লয় করবেন।

৩. মাইক্রোসার্ভিসগুলো বিল্ড, পুশ এবং ডিপ্লয় করুন

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

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

cd ~
git clone https://github.com/GoogleCloudPlatform/opentelemetry-trace-codelab-python.git

প্রকল্পটির ডিরেক্টরি কাঠামোটি নিম্নরূপ:

shakesapp-python
├── LICENSE
├── manifests
│   ├── client.yaml
│   ├── loadgen.yaml
│   └── server.yaml
├── proto
│   └── shakesapp.proto
├── skaffold.yaml
└── src
    ├── client
    ├── loadgen
    └── server
  • ম্যানিফেস্ট: কুবারনেটিস ম্যানিফেস্ট ফাইল
  • প্রোটো: ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের জন্য প্রোটো সংজ্ঞা।
  • src: প্রতিটি পরিষেবার সোর্স কোডের জন্য ডিরেক্টরি
  • skaffold.yaml: skaffold-এর কনফিগারেশন ফাইল

skaffold কমান্ড চালান

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

cd shakesapp-python
skaffold run --tail

কমান্ডটি চালানোর সাথে সাথেই আপনি 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

সতর্কতা : যদি আপনি "No push access to specified image repository"-এর মতো কোনো ত্রুটি পান, তাহলে পরীক্ষা করে দেখুন যে skaffold কমান্ডটি আপনার ডিফল্ট রিপো-এর কনফিগারেশন নির্বিশেষে Docker Hub (docker.io)-তে ইমেজ পুশ করার চেষ্টা করছে কিনা। সেক্ষেত্রে, নিচের মতো করে "skaffold run"-এ "–default-repo" অপশনটি যোগ করার চেষ্টা করুন।

$ skaffold run –tail –default-repo=us-central1-docker.pkg.dev/[প্রজেক্ট আইডি]/[রিপোজিটরি নাম]

ডেপ্লয়মেন্টের পরে, আপনি প্রতিটি কন্টেইনারের stdout-এ প্রকৃত অ্যাপ্লিকেশন লগগুলি এইভাবে নির্গত হতে দেখবেন:

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

[server] {"event": "starting server: 0.0.0.0:5050", "severity": "info", "timestamp": "2021-03-17T05:25:56.758575Z"}
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Starting gunicorn 20.0.4
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Using worker: threads
[client] [2021-03-17 05:25:54 +0000] [7] [INFO] Booting worker with pid: 7
[client] {"event": "server address is serverservice:5050", "severity": "info", "timestamp": "2021-03-17T05:25:54.888627Z"}
[client] {"event": "request to server with query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.550923Z"}
[server] {"event": "query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.567048Z"}
[loadgen] {"event": "check connectivity: http://clientservice:8080/_healthz", "severity": "info", "timestamp": "2021-03-17T05:26:11.533605Z"}
[loadgen] {"event": "/_healthz response: ok", "severity": "info", "timestamp": "2021-03-17T05:26:11.544267Z"}
[loadgen] {"event": "confirmed connection ot clientservice", "severity": "info", "timestamp": "2021-03-17T05:26:11.544527Z"}

অবশেষে আপনি সার্ভিসগুলোর ডিস্ট্রিবিউটেড ট্রেসিংয়ের জন্য ওপেনটেলিমেট্রি দিয়ে আপনার অ্যাপ্লিকেশনটি ইন্সট্রুমেন্টেশন শুরু করতে প্রস্তুত।

সারসংক্ষেপ

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

এরপরে

পরবর্তী ধাপে, ট্রেস তথ্য ইন্সট্রুমেন্ট করার জন্য আপনাকে লোডজেন সার্ভিসের সোর্স কোড পরিবর্তন করতে হবে।

৪. HTTP এর জন্য ইন্সট্রুমেন্টেশন

ট্রেস ইনস্ট্রুমেন্টেশন এবং প্রসারণের ধারণা

সোর্স কোড সম্পাদনা করার আগে, একটি সহজ ডায়াগ্রামের মাধ্যমে ডিস্ট্রিবিউটেড ট্রেস কীভাবে কাজ করে তা সংক্ষেপে ব্যাখ্যা করি।

c8c659deaa9c9091.png

এই উদাহরণে, আমরা কোডটিকে এমনভাবে সাজিয়েছি যাতে এটি ক্লাউড ট্রেস-এ ট্রেস এবং স্প্যান তথ্য এক্সপোর্ট করে এবং লোডজেন সার্ভিস থেকে সার্ভার সার্ভিসে পাঠানো রিকোয়েস্ট জুড়ে ট্রেস কনটেক্সট ছড়িয়ে দেয়।

অ্যাপ্লিকেশনটিকে ট্রেস মেটাডেটা, যেমন ট্রেস আইডি এবং স্প্যান আইডি, পাঠাতে হবে যাতে ক্লাউড ট্রেস একই ট্রেস আইডিযুক্ত সমস্ত স্প্যানকে একটি ট্রেসে একত্রিত করতে পারে। এছাড়াও, অ্যাপ্লিকেশনটিকে অনুরোধকারী ডাউনস্ট্রিম পরিষেবাগুলিতে ট্রেস কনটেক্সট (প্যারেন্ট স্প্যানের ট্রেস আইডি এবং স্প্যান আইডির সমন্বয়) প্রচার করতে হবে, যাতে তারা জানতে পারে যে তারা কোন ট্রেস কনটেক্সটটি পরিচালনা করছে।

ওপেনটেলিমেট্রি আপনাকে সাহায্য করে:

  • অনন্য ট্রেস আইডি এবং স্প্যান আইডি তৈরি করতে
  • ব্যাকএন্ডে ট্রেস আইডি এবং স্প্যান আইডি রপ্তানি করতে
  • অন্যান্য পরিষেবাগুলিতে ট্রেস প্রসঙ্গগুলি প্রচার করতে

যন্ত্রের প্রথম স্প্যান

ইন্সট্রুমেন্ট লোড জেনারেটর পরিষেবা

বাটনটি চেপে ক্লাউড শেল এডিটর খুলুন 776a11bfb2122549.png ক্লাউড শেলের উপরের ডানদিকে। বাম দিকের প্যানেলের এক্সপ্লোরার থেকে src/loadgen/loadgen.py খুলুন এবং main ফাংশনটি খুঁজুন।

src/loadgen/loadgen.py

def main():
    ...
    # start request loop to client service
    logger.info("start client request loop")
    addr = f"http://{target}"
    while True:
        logger.info("start request to client")
        call_client(addr)
        logger.info("end request to client")
        time.sleep(2.0)

main ফাংশনের ভেতরে আপনি একটি লুপ দেখতে পাচ্ছেন, যা call_client ফাংশনটিকে কল করছে। বর্তমান ইমপ্লিমেন্টেশনে, সেকশনটিতে ২টি লগ লাইন আছে যা ফাংশন কলের শুরু এবং শেষ রেকর্ড করে। এখন চলুন ফাংশন কলের ল্যাটেন্সি ট্র্যাক করার জন্য Span তথ্য ইন্সট্রুমেন্ট করি।

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

 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.instrumentation.requests import RequestsInstrumentor
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

যেহেতু লোড জেনারেটরটি requests মডিউলের মাধ্যমে HTTP-তে ক্লায়েন্ট অ্যাপ্লিকেশনকে কল করে, তাই আমরা requests জন্য এক্সটেনশন প্যাকেজ ব্যবহার করি এবং ইন্সট্রুমেন্টেশন সক্রিয় করি।

 from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
+
+RequestsInstrumentor().instrument()

এরপর ট্রেসার ইনস্ট্যান্সটি সেট আপ করুন যা ট্রেস কনটেক্সট এবং এক্সপোর্টার সেটিংস পরিচালনা করে।

     target = os.environ.get("CLIENT_ADDR", "0.0.0.0:8080")

+    exporter = CloudTraceSpanExporter()
+    trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+    tracer = trace.get_tracer(__name__)
+    propagate.set_global_textmap(CloudTraceFormatPropagator())
+    trace.set_tracer_provider(TracerProvider())
+
     # connectivity check to client service
     healthz = f"http://{target}/_healthz"
     logger.info(f"check connectivity: {healthz}")

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

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

     logger.info("start client request loop")
     addr = f"http://{target}"
     while True:
-        logger.info("start request to client")
-        call_client(addr)
-        logger.info("end request to client")
+        with tracer.start_as_current_span("loadgen") as root_span:
+            root_span.add_event(name="request_start")
+            logger.info("start request to client")
+            call_client(addr)
+            root_span.add_event(name="request_end")
+            logger.info("end request to client")
         time.sleep(2.0)

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

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-requests=^0.20b0"

আপনি নিশ্চিত করতে পারেন যে সংশ্লিষ্ট ডিপেন্ডেন্সি বিবরণ pyproject.toml এ লেখা আছে।

যন্ত্র গ্রাহক পরিষেবা

পূর্ববর্তী অংশে, আমরা নীচের চিত্রে লাল আয়তক্ষেত্র দ্বারা আবদ্ধ অংশটিকে ইনস্ট্রুমেন্ট করেছিলাম। আমরা লোড জেনারেটর সার্ভিসে স্প্যান তথ্য ইনস্ট্রুমেন্ট করেছিলাম। লোড জেনারেটর সার্ভিসের মতোই, এখন আমাদের ক্লায়েন্ট সার্ভিসকে ইনস্ট্রুমেন্ট করতে হবে। লোড জেনারেটর সার্ভিসের সাথে পার্থক্য হলো, ক্লায়েন্ট সার্ভিসকে HTTP হেডারে লোড জেনারেটর সার্ভিস থেকে প্রেরিত ট্রেস আইডি (Trace ID) তথ্য বের করতে হবে এবং সেই আইডি ব্যবহার করে স্প্যান তৈরি করতে হবে।

ae074d4513c9931f.png

ক্লাউড শেল এডিটর খুলুন এবং লোড জেনারেটর সার্ভিসের জন্য আমরা যেভাবে করেছিলাম, সেভাবে প্রয়োজনীয় মডিউলগুলো যোগ করুন।

src/client/client.py

 import flask
 import grpc
 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import \
+    CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc

আপনি লক্ষ্য করেছেন যে আপনি এইমাত্র FlaskInstrumentor ইম্পোর্ট করেছেন, যা ব্যবহারকারীদের পক্ষ থেকে Flask অ্যাপ্লিকেশনের জন্য স্বয়ংক্রিয় ইন্সট্রুমেন্টেশন সক্ষম করে এবং এক লাইনের কোডের মাধ্যমে HTTP হেডার এক্সট্র্যাক্ট করে ট্রেস কনটেক্সট (Trace Contexts) পেতে সাহায্য করে। OpenTelemetry কমিউনিটি অন্যান্য প্রধান লাইব্রেরির সাথেও অনুরূপ দরকারি ইন্টিগ্রেশন প্রদান করে। আরও তথ্যের জন্য, আপনি অফিসিয়াল ডকুমেন্টেশন দেখতে পারেন।

 app = flask.Flask(__name__)
+FlaskInstrumentor().instrument_app(app)

ইন্সট্রুমেন্টেশন শুরু করার আগে, লোড জেনারেটর সার্ভিসে আমরা যা করেছিলাম, ঠিক সেভাবেই আপনাকে আবার ট্রেসার ইনস্ট্যান্স প্রস্তুত করতে হবে।

 logger.info(f"server address is {SERVER_ADDR}")

+exporter = CloudTraceSpanExporter()
+trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+propagate.set_global_textmap(CloudTraceFormatPropagator())
+trace.set_tracer_provider(TracerProvider())

 @app.route("/")
 def main_handler():
    ....

এখন হ্যান্ডলারে ইন্সট্রুমেন্টেশন যোগ করার জন্য এটি প্রস্তুত। main_handler() খুঁজুন এবং সার্ভার সার্ভিসে gRPC রিকোয়েস্ট পাঠানোর অংশটি পরিবর্তন করুন।

@app.route("/")
def main_handler():
    q, count = random.choice(list(queries.items()))

    # get Tracer
    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("client") as cur_span:
        channel = grpc.insecure_channel(SERVER_ADDR)
        stub = shakesapp_pb2_grpc.ShakespeareServiceStub(channel)
        logger.info(f"request to server with query: {q}")
        cur_span.add_event("server_call_start")
        resp = stub.GetMatchCount(shakesapp_pb2.ShakespeareRequest(query=q))
        cur_span.add_event("server_call_end")
        if count != resp.match_count:
            raise UnexpectedResultError(
                f"The expected count for '{q}' was {count}, but result was {resp.match_count } obtained"
            )
        result = str(resp.match_count)
        logger.info(f"matched count for '{q}' is {result}")
    return result

জেনারেটর সার্ভিস লোড করার মতোই, নিচের কমান্ডটি ব্যবহার করে pyproject.toml এ প্রয়োজনীয় প্যাকেজগুলো যোগ করুন।

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-flask=^0.20b0"

এরপর skaffold run কমান্ড দিয়ে অ্যাপ্লিকেশনটি চালু করার চেষ্টা করুন এবং দেখুন Cloud Trace ড্যাশবোর্ডে কী দেখাচ্ছে:

skaffold run --tail

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

f7440360551980e.png

সেগুলোর যেকোনো একটিতে ক্লিক করলে, আপনি নীচের মতো একটি ওয়াটারফল গ্রাফ দেখতে পাবেন যা অনুরোধ এবং প্রতিক্রিয়া প্রক্রিয়ার প্রতিটি অংশের লেটেন্সি ব্যাখ্যা করে। "ইভেন্ট দেখান" (Show Events) এর পাশের চেকবক্সটি খুঁজুন, তাহলে আপনি ওয়াটারফল গ্রাফের ভিতরে অ্যানোটেশনগুলো দেখতে পাবেন। এই অ্যানোটেশনগুলো হলো সেগুলো যা আপনি span.add_event() ` মেথড ব্যবহার করে কোডে যুক্ত করেছেন।

67596a4a313738.png

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

সারসংক্ষেপ

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

এরপরে

পরবর্তী ধাপে, gRPC-এর মাধ্যমে কীভাবে ট্রেস কনটেক্সট প্রেরণ করা যায় তা নিশ্চিত করতে আপনি ক্লায়েন্ট সার্ভিস এবং সার্ভার সার্ভিসকে ইন্সট্রুমেন্ট করবেন।

৫. gRPC-এর জন্য যন্ত্রপাতি

পূর্ববর্তী ধাপে, আমরা এই মাইক্রোসার্ভিসগুলোতে অনুরোধের প্রথম অর্ধেককে ইনস্ট্রুমেন্ট করেছিলাম। এই ধাপে, আমরা ক্লায়েন্ট সার্ভিস এবং সার্ভার সার্ভিসের মধ্যে gRPC যোগাযোগকে ইনস্ট্রুমেন্ট করার চেষ্টা করব। (নীচের ছবিতে সবুজ এবং বেগুনি আয়তক্ষেত্র)

c4dec3e741c3ab4f.png

gRPC ক্লায়েন্টের জন্য স্বয়ংক্রিয় ইন্সট্রুমেন্টেশন

ওপেনটেলিমেট্রির ইকোসিস্টেমে অনেকগুলো দরকারি লাইব্রেরি রয়েছে যা ডেভেলপারদের অ্যাপ্লিকেশন ইন্সট্রুমেন্ট করতে সাহায্য করে। আগের ধাপে, আমরা 'রিকোয়েস্টস' মডিউলের জন্য অটোমেটিক ইন্সট্রুমেন্টেশন ব্যবহার করেছিলাম। এই ধাপে, যেহেতু আমরা gRPC-এর মাধ্যমে ট্রেস কনটেক্সট প্রচার করার চেষ্টা করছি, তাই আমরা এর জন্য লাইব্রেরিটি ব্যবহার করছি।

src/client/client.py

 import flask
 import grpc
 import structlog
 from opentelemetry import propagate, trace
 from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
 from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient
 from opentelemetry.sdk.trace import TracerProvider
 from opentelemetry.sdk.trace.export import SimpleSpanProcessor
 from opentelemetry.propagators.cloud_trace_propagator import \
     CloudTraceFormatPropagator
 import shakesapp_pb2
 import shakesapp_pb2_grpc


 app = flask.Flask(__name__)
 FlaskInstrumentor().instrument_app(app)
+GrpcInstrumentorClient().instrument()

ক্লায়েন্ট সার্ভিসের জন্য, ইন্সট্রুমেন্টেশনের ক্ষেত্রে আমাদের যা করতে হয় তা বেশ সামান্য। আমরা যা করতে চাই তা হলো gRPC-এর মাধ্যমে ট্রেস কনটেক্সট (Trace Context) প্রচার করা, যা হলো বর্তমান স্প্যানের (Span) ট্রেস আইডি (Trace ID) এবং স্প্যান আইডির (Span ID) সমন্বয়। এজন্য আমরা GrpcInstrumentatorClient.instrument() কল করি, যাতে হ্যান্ডলার ফাংশনের মধ্যে থাকা gRPC ক্লায়েন্ট ট্রেস কনটেক্সটটিকে তার নিচের HTTP হেডারে এম্বেড করতে পারে।

poetry add কমান্ড ব্যবহার করে pyproject.toml এ নতুন ডিপেন্ডেন্সিগুলো যোগ করতে ভুলবেন না:

poetry add "opentelemetry-instrumentation-grpc=^0.20b0"

gRPC সার্ভারের জন্য স্বয়ংক্রিয় ইন্সট্রুমেন্টেশন

gRPC ক্লায়েন্টের জন্য আমরা যা করেছিলাম, ঠিক সেভাবেই gRPC সার্ভারের জন্য স্বয়ংক্রিয় ইন্সট্রুমেন্টেশন কল করব। নিচের মতো ইম্পোর্টগুলো যোগ করুন এবং ফাইলের শুরুতে GrpcInstrumentationServer().instrument() কল করুন।

সতর্কতা : ফোন করতে ভুলবেন না

GrpcInstrumentationServe() 

এই ধাপে, না

GrpcInstrumentationClient()

.

src/server/server.py

 import grpc
 import structlog
 from google.cloud import storage
 from grpc_health.v1 import health_pb2, health_pb2_grpc
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorServer
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc


 BUCKET_NAME = "dataflow-samples"
 BUCKET_PREFIX = "shakespeare/"

+# enable auto gRPC server trace instrumentation
+GrpcInstrumentorServer().instrument()
+

এরপরে, ক্লাউড ট্রেস ব্যাকএন্ডে ট্রেস তথ্য পাঠানোর জন্য আপনি এক্সপোর্টারটি যুক্ত করবেন। serve() ফাংশনে নিম্নলিখিত কোডটি যোগ করুন।

def serve():
+    # start trace exporter
+    trace.set_tracer_provider(TracerProvider())
+    trace.get_tracer_provider().add_span_processor(
+        SimpleSpanProcessor(CloudTraceSpanExporter())
+    )
+    propagators.set_global_textmap(CloudTraceFormatPropagator())
+
+    # add gRPC services to server
     server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
     service = ShakesappService()
     shakesapp_pb2_grpc.add_ShakespeareServiceServicer_to_server(service, server)
     health_pb2_grpc.add_HealthServicer_to_server(service, server)

সার্ভার সার্ভিসে নতুন যোগ করা প্যাকেজগুলো যুক্ত করতে ভুলবেন না।

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-grpc=^0.20b0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation=^0.20b0"

মাইক্রোসার্ভিসটি চালান এবং ট্রেসটি নিশ্চিত করুন।

এরপর skaffold কমান্ড দিয়ে আপনার পরিবর্তিত কোডটি চালান।

skaffold run --tail

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

141cb620245b689d.png

সারসংক্ষেপ

এই ধাপে, আপনি OpenTelemetry ইকোসিস্টেম লাইব্রেরির সহায়তায় gRPC ভিত্তিক যোগাযোগ ব্যবস্থা স্থাপন করেছেন। এছাড়াও, আপনি নিশ্চিত করেছেন যে লোড জেনারেটর সার্ভিসে তৈরি হওয়া ট্রেস কনটেক্সটটি সার্ভার সার্ভিসে সফলভাবে পৌঁছে দেওয়া হয়েছে।

৬. অভিনন্দন

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

বিস্তারিত অনুশীলনের জন্য, আপনি নিম্নলিখিত বিষয়গুলো নিজে নিজে চেষ্টা করতে পারেন।

  • বর্তমান বাস্তবায়নটি হেলথ চেক দ্বারা তৈরি সমস্ত স্প্যান পাঠিয়ে দেয়। ক্লাউড ট্রেস থেকে সেই স্প্যানগুলো কীভাবে ফিল্টার করবেন? ইঙ্গিতটি এখানে দেওয়া আছে।
  • ইভেন্ট লগগুলোকে স্প্যানের সাথে সংযুক্ত করুন এবং দেখুন এটি গুগল ক্লাউড ট্রেস ও গুগল ক্লাউড লগিং-এ কীভাবে কাজ করে। ইঙ্গিতটি এখানে দেওয়া আছে
  • কোনো একটি সার্ভিসকে অন্য ভাষার সার্ভিস দিয়ে প্রতিস্থাপন করুন এবং সেই ভাষার জন্য OpenTelemetry ব্যবহার করে সেটিকে ইনস্ট্রুমেন্ট করার চেষ্টা করুন।

সতর্কতা : গুগল কুবারনেটিস ইঞ্জিন এবং গুগল আর্টিফ্যাক্ট রেজিস্ট্রি ক্রমাগত রিসোর্স ব্যবহার করে।

পরিষ্কার করা

এই কোডল্যাবটির পর, অনুগ্রহ করে কুবারনেটিস ক্লাস্টারটি বন্ধ করুন এবং প্রজেক্টটি ডিলিট করে দিন, যাতে গুগল কুবারনেটিস ইঞ্জিন, গুগল ক্লাউড ট্রেস, গুগল আর্টিফ্যাক্ট রেজিস্ট্রি-তে কোনো অপ্রত্যাশিত চার্জ যুক্ত না হয়।

প্রথমে, নিম্নলিখিত কমান্ডটি ব্যবহার করে ক্লাস্টারটি ডিলিট করুন:

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" বোতামে ক্লিক করুন।

578ca2b72a161e9d.png

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