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

1. ভূমিকা

505827108874614d.png

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

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

পর্যবেক্ষণযোগ্যতা এবং OpenTelemetry

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

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

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

এই কোডল্যাবটি সিরিজের ১ম অংশ এবং ওপেনটেলিমেট্রি এবং ক্লাউড ট্রেস সহ মাইক্রোসার্ভিসেসে ইন্সট্রুমেন্টিং ডিস্ট্রিবিউটেড ট্রেস কভার করে। পার্ট 2 ক্লাউড প্রোফাইলারের সাথে ক্রমাগত প্রোফাইলিং কভার করবে।

বিতরণ ট্রেস

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

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

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

একটি ট্রেস

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

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

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

44e243182ced442f.png

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

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

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

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

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

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

  • 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 এর জন্য কনফিগারেশন ফাইল

এই কোডল্যাবে, আপনি step0 ফোল্ডারের অধীনে অবস্থিত সোর্স কোড আপডেট করবেন। আপনি নিম্নলিখিত ধাপে উত্তরগুলির জন্য step[1-6] ফোল্ডারে সোর্স কোডটিও উল্লেখ করতে পারেন। (অংশ 1 ধাপ 0 থেকে ধাপ 4 কভার করে, এবং অংশ 2 ধাপ 5 এবং 6 কভার করে)

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

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

cd step0
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. HTTP এর জন্য ইন্সট্রুমেন্টেশন

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

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

6be42e353b9bfd1d.png

এই উদাহরণে, আমরা ক্লাউড ট্রেসে ট্রেস এবং স্প্যান তথ্য রপ্তানি করতে এবং লোডজেন পরিষেবা থেকে সার্ভার পরিষেবাতে অনুরোধ জুড়ে ট্রেস প্রসঙ্গ প্রচার করার জন্য কোডটি ইনস্ট্রুমেন্ট করি৷

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

OpenTelemetry আপনাকে সাহায্য করে:

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

OpenTelemetry ট্রেসে উপাদান

b01f7bb90188db0d.png

ওপেনটেলিমেট্রির সাহায্যে ইন্সট্রুমেন্ট অ্যাপ্লিকেশন ট্রেস করার প্রক্রিয়াটি নিম্নরূপ:

  1. একটি রপ্তানিকারক তৈরি করুন
  2. 1-এ রপ্তানিকারককে আবদ্ধ করে একটি TracerProvider তৈরি করুন এবং এটিকে বিশ্বব্যাপী সেট করুন।
  3. প্রচার পদ্ধতি সেট করতে TextMapPropagaror সেট করুন
  4. TracerProvider থেকে Tracer পান
  5. ট্রেসার থেকে স্প্যান তৈরি করুন

এখন পর্যন্ত, আপনাকে প্রতিটি উপাদানের বিশদ বৈশিষ্ট্যগুলি বোঝার দরকার নেই, তবে মনে রাখা সবচেয়ে গুরুত্বপূর্ণ বিষয় হল:

  • এখানে রপ্তানিকারক TracerProvider এ প্লাগযোগ্য
  • TracerProvider ট্রেস নমুনা এবং রপ্তানি সংক্রান্ত সমস্ত কনফিগারেশন ধারণ করে
  • সমস্ত ট্রেস ট্রেসার অবজেক্টে বান্ডিল করা হয়

এটি বোঝার সাথে, আসুন আসল কোডিং কাজের দিকে এগিয়ে যাই।

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

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

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

step0/src/loadgen/main.go

func main() {
        ...
        for range t.C {
                log.Printf("simulating client requests, round %d", i)
                if err := run(numWorkers, numConcurrency); err != nil {
                        log.Printf("aborted round with error: %v", err)
                }
                log.Printf("simulated %d requests", numWorkers)
                if numRounds != 0 && i > numRounds {
                        break
                }
                i++
        }
}

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

প্রথমে, পূর্ববর্তী বিভাগে উল্লিখিত হিসাবে, আসুন OpenTelemetry-এর জন্য সম্পূর্ণ কনফিগারেশন সেট আপ করি। নিম্নরূপ OpenTelemetry প্যাকেজ যোগ করুন:

step0/src/loadgen/main.go

import (
        "context" // step1. add packages
        "encoding/json"
        "fmt"
        "io"
        "log"
        "math/rand"
        "net/http"
        "net/url"
        "time"
        // step1. add packages
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
        stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
        "go.opentelemetry.io/otel/propagation"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
        "go.opentelemetry.io/otel/trace"
        // step1. end add packages
)

পঠনযোগ্যতার জন্য, আমরা initTracer নামে একটি সেটআপ ফাংশন তৈরি করি এবং এটিকে main ফাংশনে কল করি।

step0/src/loadgen/main.go

// step1. add OpenTelemetry initialization function
func initTracer() (*sdktrace.TracerProvider, error) {
        // create a stdout exporter to show collected spans out to stdout.
        exporter, err := stdout.New(stdout.WithPrettyPrint())
        if err != nil {
                return nil, err
        }

        // for the demonstration, we use AlwaysSmaple sampler to take all spans.
        // do not use this option in production.
        tp := sdktrace.NewTracerProvider(
                sdktrace.WithSampler(sdktrace.AlwaysSample()),
                sdktrace.WithBatcher(exporter),
        )
        otel.SetTracerProvider(tp)
        otel.SetTextMapPropagator(propagation.TraceContext{})
        return tp, nil
}

আপনি বুঝতে পারেন যে OpenTelemetry সেট আপ করার পদ্ধতিটি পূর্ববর্তী বিভাগে বর্ণিত হয়েছে। এই বাস্তবায়নে, আমরা একটি stdout রপ্তানিকারক ব্যবহার করি যা একটি কাঠামোগত বিন্যাসে stdout-এ সমস্ত ট্রেস তথ্য রপ্তানি করে।

তারপর আপনি প্রধান ফাংশন থেকে এটি কল. initTracer() কল করুন এবং আপনি অ্যাপ্লিকেশন বন্ধ করার সময় TracerProvider.Shutdown() কল করতে ভুলবেন না।

step0/src/loadgen/main.go

func main() {
        // step1. 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)
                }
        }()
        // step1. end setup

        log.Printf("starting worder with %d workers in %d concurrency", numWorkers, numConcurrency)
        log.Printf("number of rounds: %d (0 is inifinite)", numRounds)
        ...

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

step0/src/loadgen/main.go

import (
        "context"
        "encoding/json"
        "fmt"
        "io"
        "log"
        "math/rand"
        "net/http"
        "net/http/httptrace" // step1. add packages
        "net/url"
        "time"
        // step1. add packages
        "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace"
        "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
        // step1. end add packages
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
        stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
        "go.opentelemetry.io/otel/propagation"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
        "go.opentelemetry.io/otel/trace"
)

যেহেতু লোড জেনারেটর runQuery ফাংশনে net/http দিয়ে HTTP-তে ক্লায়েন্ট পরিষেবা কল করছে, আমরা net/http এর জন্য অবদান প্যাকেজ ব্যবহার করি এবং httptrace এবং otelhttp প্যাকেজের এক্সটেনশনের সাথে ইনস্ট্রুমেন্টেশন সক্ষম করি।

প্রথমে ইনস্ট্রুমেন্টেড ক্লায়েন্টের মাধ্যমে HTTP অনুরোধগুলি কল করার জন্য একটি প্যাকেজ গ্লোবাল ভেরিয়েবল httpClient যোগ করা।

step0/src/loadgen/main.go

var httpClient = http.Client{
        Transport: otelhttp.NewTransport(http.DefaultTransport)
}

এরপর OpenTelemetry ব্যবহার করে কাস্টম স্প্যান তৈরি করতে runQuery ফাংশনে ইন্সট্রুমেন্টেশন যোগ করুন এবং কাস্টম HTTP ক্লায়েন্ট থেকে স্বয়ংক্রিয়ভাবে তৈরি স্প্যান তৈরি করুন। আপনি যা করবেন তা হল:

  1. otel.Tracer() সহ গ্লোবাল TracerProvider থেকে একটি ট্রেসার পান
  2. Tracer.Start() পদ্ধতি দিয়ে একটি রুট স্প্যান তৈরি করুন
  3. একটি নির্বিচারে রুট স্প্যান শেষ করুন (এই ক্ষেত্রে, runQuery ফাংশন শেষ)

step0/src/loadgen/main.go

        reqURL.RawQuery = v.Encode()
        // step1. replace http.Get() with custom client call
        // resp, err := http.Get(reqURL.String())

        // step1. instrument trace
        ctx := context.Background()
        tr := otel.Tracer("loadgen")
        ctx, span := tr.Start(ctx, "query.request", trace.WithAttributes(
                semconv.TelemetrySDKLanguageGo,
                semconv.ServiceNameKey.String("loadgen.runQuery"),
                attribute.Key("query").String(s),
        ))
        defer span.End()
        ctx = httptrace.WithClientTrace(ctx, otelhttptrace.NewClientTrace(ctx))
        req, err := http.NewRequestWithContext(ctx, "GET", reqURL.String(), nil)
        if err != nil {
                return -1, fmt.Errorf("error creating HTTP request object: %v", err)
        }
        resp, err := httpClient.Do(req)
        // step1. end instrumentation
        if err != nil {
                return -1, fmt.Errorf("error sending request to %v: %v", reqURL.String(), err)
        }

এখন আপনি লোডজেনে ইনস্ট্রুমেন্টেশন (HTTP ক্লায়েন্ট অ্যাপ্লিকেশন) সম্পন্ন করেছেন। অনুগ্রহ করে আপনার go.mod এবং go.sum go mod কমান্ড দিয়ে আপডেট করা নিশ্চিত করুন।

go mod tidy

উপকরণ ক্লায়েন্ট সেবা

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

bcaccd06691269f8.png

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

step0/src/client/main.go

import (
        "context"
        "encoding/json"
        "fmt"
        "io"
        "log"
        "net/http"
        "net/url"
        "os"
        "time"

        "opentelemetry-trace-codelab-go/client/shakesapp"
        // step1. add new import
        "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
        stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
        "go.opentelemetry.io/otel/propagation"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        "go.opentelemetry.io/otel/trace"
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/insecure"
        // step1. end new import
)

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

step0/src/client/main.go

// step1. add OpenTelemetry initialization function
func initTracer() (*sdktrace.TracerProvider, error) {
        // create a stdout exporter to show collected spans out to stdout.
        exporter, err := stdout.New(stdout.WithPrettyPrint())
        if err != nil {
                return nil, err
        }

        // for the demonstration, we use AlwaysSmaple sampler to take all spans.
        // do not use this option in production.
        tp := sdktrace.NewTracerProvider(
                sdktrace.WithSampler(sdktrace.AlwaysSample()),
                sdktrace.WithBatcher(exporter),
        )
        otel.SetTracerProvider(tp)
        otel.SetTextMapPropagator(propagation.TraceContext{})
        return tp, nil
}

এখন ইন্সট্রুমেন্ট স্প্যান করার সময়। যেহেতু ক্লায়েন্ট পরিষেবাকে লোডজেন পরিষেবা থেকে HTTP অনুরোধগুলি গ্রহণ করতে হবে, এটি হ্যান্ডলারকে উপকরণ করতে হবে। ক্লায়েন্ট পরিষেবাতে HTTP সার্ভারটি net/http দিয়ে প্রয়োগ করা হয় এবং আপনি otelhttp প্যাকেজ ব্যবহার করতে পারেন যেমন আমরা লোডজেনে করেছি।

প্রথমে, আমরা otelhttp হ্যান্ডলার দিয়ে হ্যান্ডলার রেজিস্ট্রেশন প্রতিস্থাপন করি। main ফাংশনে, সেই লাইনগুলি খুঁজুন যেখানে HTTP হ্যান্ডলারটি http.HandleFunc() এর সাথে নিবন্ধিত হয়েছে।

step0/src/client/main.go

        // step1. change handler to intercept OpenTelemetry related headers
        // http.HandleFunc("/", svc.handler)
        otelHandler := otelhttp.NewHandler(http.HandlerFunc(svc.handler), "client.handler")
        http.Handle("/", otelHandler)
        // step1. end intercepter setting
        http.HandleFunc("/_genki", svc.health)

তারপরে, আমরা হ্যান্ডলারের ভিতরে প্রকৃত স্প্যান যন্ত্র করি। func (*clientService) হ্যান্ডলার() খুঁজুন এবং trace.SpanFromContext() এর সাথে স্প্যান ইনস্ট্রুমেন্টেশন যোগ করুন।

step0/src/client/main.go

func (cs *clientService) handler(w http.ResponseWriter, r *http.Request) {
        ...
        ctx := r.Context()
        ctx, cancel := context.WithCancel(ctx)
        defer cancel()
        // step1. instrument trace
        span := trace.SpanFromContext(ctx)
        defer span.End()
        // step1. end instrument
        ...

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

step0/src/client/main.go

func (cs *clientService) handler(w http.ResponseWriter, r *http.Request) {
        ...
        // step1. add span specific attribute
        span.SetAttributes(attribute.Key("matched").Int64(resp.MatchCount))
        // step1. end adding attribute
        log.Println(string(ret))
        ...

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

skaffold dev

GKE ক্লাস্টারে পরিষেবাগুলি চালানোর কিছু সময় পরে, আপনি এইরকম বিপুল পরিমাণ লগ বার্তা দেখতে পাবেন:

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

[loadgen] {
[loadgen]       "Name": "query.request",
[loadgen]       "SpanContext": {
[loadgen]               "TraceID": "cfa22247a542beeb55a3434392d46b89",
[loadgen]               "SpanID": "18b06404b10c418b",
[loadgen]               "TraceFlags": "01",
[loadgen]               "TraceState": "",
[loadgen]               "Remote": false
[loadgen]       },
[loadgen]       "Parent": {
[loadgen]               "TraceID": "00000000000000000000000000000000",
[loadgen]               "SpanID": "0000000000000000",
[loadgen]               "TraceFlags": "00",
[loadgen]               "TraceState": "",
[loadgen]               "Remote": false
[loadgen]       },
[loadgen]       "SpanKind": 1,
[loadgen]       "StartTime": "2022-07-14T13:13:36.686751087Z",
[loadgen]       "EndTime": "2022-07-14T13:14:31.849601964Z",
[loadgen]       "Attributes": [
[loadgen]               {
[loadgen]                       "Key": "telemetry.sdk.language",
[loadgen]                       "Value": {
[loadgen]                               "Type": "STRING",
[loadgen]                               "Value": "go"
[loadgen]                       }
[loadgen]               },
[loadgen]               {
[loadgen]                       "Key": "service.name",
[loadgen]                       "Value": {
[loadgen]                               "Type": "STRING",
[loadgen]                               "Value": "loadgen.runQuery"
[loadgen]                       }
[loadgen]               },
[loadgen]               {
[loadgen]                       "Key": "query",
[loadgen]                       "Value": {
[loadgen]                               "Type": "STRING",
[loadgen]                               "Value": "faith"
[loadgen]                       }
[loadgen]               }
[loadgen]       ],
[loadgen]       "Events": null,
[loadgen]       "Links": null,
[loadgen]       "Status": {
[loadgen]               "Code": "Unset",
[loadgen]               "Description": ""
[loadgen]       },
[loadgen]       "DroppedAttributes": 0,
[loadgen]       "DroppedEvents": 0,
[loadgen]       "DroppedLinks": 0,
[loadgen]       "ChildSpanCount": 5,
[loadgen]       "Resource": [
[loadgen]               {
[loadgen]                       "Key": "service.name",
[loadgen]                       "Value": {
[loadgen]                               "Type": "STRING",
[loadgen]                               "Value": "unknown_service:loadgen"
...

stdout রপ্তানিকারক এই বার্তাগুলি নির্গত করে৷ আপনি লক্ষ্য করবেন যে লোডজেন দ্বারা সমস্ত স্প্যানের অভিভাবকদের TraceID: 00000000000000000000000000000000 , কারণ এটি হল রুট স্প্যান, অর্থাৎ ট্রেসের প্রথম স্প্যান। এছাড়াও আপনি দেখতে পাচ্ছেন যে এমবেড অ্যাট্রিবিউট "query" -তে ক্যোয়ারী স্ট্রিং রয়েছে যা ক্লায়েন্ট পরিষেবাতে পাস করা হয়েছে।

সারাংশ

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

পরবর্তী আপ

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

5. gRPC-এর জন্য ইন্সট্রুমেন্টেশন

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

75310d8e0e3b1a30.png

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

OpenTelemetry এর ইকোসিস্টেম অনেক সহজ লাইব্রেরি অফার করে যা ডেভেলপারদেরকে উপকরণ অ্যাপ্লিকেশনে সাহায্য করে। পূর্ববর্তী ধাপে, আমরা net/http প্যাকেজের জন্য প্রি-বিল্ড ইনস্ট্রুমেন্টেশন ব্যবহার করেছি। এই ধাপে, আমরা gRPC-এর মাধ্যমে ট্রেস কনটেক্সট প্রচার করার চেষ্টা করছি, আমরা এটির জন্য লাইব্রেরি ব্যবহার করি।

প্রথমত, আপনি otelgrpc নামক প্রি-বিল্ট gRPC প্যাকেজ আমদানি করুন।

step0/src/client/main.go

import (
        "context"
        "encoding/json"
        "fmt"
        "io"
        "log"
        "net/http"
        "net/url"
        "os"
        "time"

        "opentelemetry-trace-codelab-go/client/shakesapp"
        // step2. add prebuilt gRPC package (otelgrpc) 
        "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
        "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
        stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
        "go.opentelemetry.io/otel/propagation"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        "go.opentelemetry.io/otel/trace"
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/insecure"
)

এই সময়, ক্লায়েন্ট পরিষেবাটি সার্ভার পরিষেবার বিপরীতে একটি জিআরপিসি ক্লায়েন্ট, তাই আপনাকে জিআরপিসি ক্লায়েন্টকে ইনস্ট্রুমেন্ট করতে হবে। mustConnGRPC ফাংশন খুঁজুন এবং gRPC ইন্টারসেপ্টর যোগ করুন যা ক্লায়েন্ট যখনই সার্ভারে অনুরোধ করে তখন নতুন স্প্যান তৈরি করে।

step0/src/client/main.go

// Helper function for gRPC connections: Dial and create client once, reuse.
func mustConnGRPC(ctx context.Context, conn **grpc.ClientConn, addr string) {
        var err error
        // step2. add gRPC interceptor
        interceptorOpt := otelgrpc.WithTracerProvider(otel.GetTracerProvider())
        *conn, err = grpc.DialContext(ctx, addr,
                grpc.WithTransportCredentials(insecure.NewCredentials()),
                grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor(interceptorOpt)),
                grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor(interceptorOpt)),
                grpc.WithTimeout(time.Second*3),
        )
        // step2: end adding interceptor
        if err != nil {
                panic(fmt.Sprintf("Error %s grpc: failed to connect %s", err, addr))
        }
}

যেহেতু আপনি ইতিমধ্যেই পূর্ববর্তী বিভাগে OpenTelemetry সেট আপ করেছেন, আপনার এটি করার দরকার নেই।

gRPC সার্ভারের জন্য পূর্ব-নির্মিত উপকরণ

আমরা gRPC ক্লায়েন্টের জন্য যা করেছি তার মতো, আমরা জিআরপিসি সার্ভারের জন্য প্রি-বিল্ট ইনস্ট্রুমেন্টেশন বলি। আমদানি বিভাগে নতুন প্যাকেজ যুক্ত করুন যেমন:

step0/src/server/main.go

import (
        "context"
        "fmt"
        "io/ioutil"
        "log"
        "net"
        "os"
        "regexp"
        "strings"

        "opentelemetry-trace-codelab-go/server/shakesapp"

        "cloud.google.com/go/storage"
        // step2. add OpenTelemetry packages including otelgrpc
        "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
        "go.opentelemetry.io/otel"
        stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
        "go.opentelemetry.io/otel/propagation"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        "google.golang.org/api/iterator"
        "google.golang.org/api/option"
        "google.golang.org/grpc"
        healthpb "google.golang.org/grpc/health/grpc_health_v1"
)

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

step0/src/server/main.go

// step2. add OpenTelemetry initialization function
func initTracer() (*sdktrace.TracerProvider, error) {
        // create a stdout exporter to show collected spans out to stdout.
        exporter, err := stdout.New(stdout.WithPrettyPrint())
        if err != nil {
                return nil, err
        }
        // for the demonstration, we use AlwaysSmaple sampler to take all spans.
        // do not use this option in production.
        tp := sdktrace.NewTracerProvider(
                sdktrace.WithSampler(sdktrace.AlwaysSample()),
                sdktrace.WithBatcher(exporter),
        )
        otel.SetTracerProvider(tp)
        otel.SetTextMapPropagator(propagation.TraceContext{})
        return tp, nil
}

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

এবং পরবর্তী, আপনাকে সার্ভার ইন্টারসেপ্টর যোগ করতে হবে। main ফাংশনে, grpc.NewServer() বলা হয় এমন জায়গাটি খুঁজুন এবং ফাংশনে ইন্টারসেপ্টর যোগ করুন।

step0/src/server/main.go

func main() {
        ...
        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)
        ...

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

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

skaffold dev

এখন আবার, আপনি stdout এ স্প্যান তথ্যের একটি গুচ্ছ দেখতে পাচ্ছেন।

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

...
[server] {
[server]        "Name": "shakesapp.ShakespeareService/GetMatchCount",
[server]        "SpanContext": {
[server]                "TraceID": "89b472f213a400cf975e0a0041649667",
[server]                "SpanID": "96030dbad0061b3f",
[server]                "TraceFlags": "01",
[server]                "TraceState": "",
[server]                "Remote": false
[server]        },
[server]        "Parent": {
[server]                "TraceID": "89b472f213a400cf975e0a0041649667",
[server]                "SpanID": "cd90cc3859b73890",
[server]                "TraceFlags": "01",
[server]                "TraceState": "",
[server]                "Remote": true
[server]        },
[server]        "SpanKind": 2,
[server]        "StartTime": "2022-07-14T14:05:55.74822525Z",
[server]        "EndTime": "2022-07-14T14:06:03.449258891Z",
[server]        "Attributes": [
...
[server]        ],
[server]        "Events": [
[server]                {
[server]                        "Name": "message",
[server]                        "Attributes": [
...
[server]                        ],
[server]                        "DroppedAttributeCount": 0,
[server]                        "Time": "2022-07-14T14:05:55.748235489Z"
[server]                },
[server]                {
[server]                        "Name": "message",
[server]                        "Attributes": [
...
[server]                        ],
[server]                        "DroppedAttributeCount": 0,
[server]                        "Time": "2022-07-14T14:06:03.449255889Z"
[server]                }
[server]        ],
[server]        "Links": null,
[server]        "Status": {
[server]                "Code": "Unset",
[server]                "Description": ""
[server]        },
[server]        "DroppedAttributes": 0,
[server]        "DroppedEvents": 0,
[server]        "DroppedLinks": 0,
[server]        "ChildSpanCount": 0,
[server]        "Resource": [
[server]                {
...
[server]        ],
[server]        "InstrumentationLibrary": {
[server]                "Name": "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",
[server]                "Version": "semver:0.33.0",
[server]                "SchemaURL": ""
[server]        }
[server] }
...

আপনি লক্ষ্য করেছেন যে আপনি কোনো স্প্যানের নাম এম্বেড করেননি এবং ম্যানুয়ালি trace.Start() বা span.SpanFromContext() দিয়ে স্প্যান তৈরি করেননি। এখনও আপনি প্রচুর সংখ্যক স্প্যান পাবেন কারণ জিআরপিসি ইন্টারসেপ্টরগুলি সেগুলি তৈরি করেছে৷

সারাংশ

এই ধাপে, আপনি ওপেনটেলিমেট্রি ইকোসিস্টেম লাইব্রেরির সহায়তায় জিআরপিসি ভিত্তিক যোগাযোগের উপকরণ তৈরি করেছেন।

পরবর্তী আপ

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

6. ক্লাউড ট্রেস দিয়ে ট্রেস ভিজ্যুয়ালাইজ করুন

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

ক্লাউড ট্রেস এক্সপোর্টার ব্যবহার করুন

OpenTelemetry এর একটি শক্তিশালী বৈশিষ্ট্য হল এর প্লাগযোগ্যতা। আপনার ইন্সট্রুমেন্টেশন দ্বারা সংগৃহীত সমস্ত স্প্যান কল্পনা করতে, আপনাকে যা করতে হবে তা হল ক্লাউড ট্রেস রপ্তানিকারকের সাথে stdout রপ্তানিকারক প্রতিস্থাপন করা।

প্রতিটি পরিষেবার main.go ফাইল খুলুন, এবং initTracer() ফাংশন খুঁজুন। একটি stdout রপ্তানিকারক তৈরি করতে লাইনটি মুছুন এবং পরিবর্তে ক্লাউড ট্রেস রপ্তানিকারক তৈরি করুন৷

step0/src/loadgen/main.go

import (
        ...
        // step3. add OpenTelemetry for Cloud Trace package
        cloudtrace "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
)

// step1. add OpenTelemetry initialization function
func initTracer() (*sdktrace.TracerProvider, error) {
        // step3. replace stdout exporter with Cloud Trace exporter
        // cloudtrace.New() finds the credentials to Cloud Trace automatically following the
        // rules defined by golang.org/x/oauth2/google.findDefaultCredentailsWithParams.
        // https://pkg.go.dev/golang.org/x/oauth2/google#FindDefaultCredentialsWithParams
        exporter, err := cloudtrace.New()
        // step3. end replacing exporter
        if err != nil {
                return nil, err
        }

        // for the demonstration, we use AlwaysSmaple sampler to take all spans.
        // do not use this option in production.
        tp := sdktrace.NewTracerProvider(
                sdktrace.WithSampler(sdktrace.AlwaysSample()),
                sdktrace.WithBatcher(exporter),
        )
        otel.SetTracerProvider(tp)
        otel.SetTextMapPropagator(propagation.TraceContext{})
        return tp, nil
}

আপনাকে ক্লায়েন্ট এবং সার্ভার পরিষেবাতেও একই ফাংশন সম্পাদনা করতে হবে।

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

সম্পাদনা করার পরে, স্কাফোল্ড কমান্ড দিয়ে ক্লাস্টারটি যথারীতি চালান।

skaffold dev

তারপর এখন আপনি stdout-এ স্ট্রাকচার্ড লগ ফরম্যাটে বেশি স্প্যান তথ্য দেখতে পাচ্ছেন না, কারণ আপনি ক্লাউড ট্রেস ওয়ান দিয়ে এক্সপোর্টার প্রতিস্থাপন করেছেন।

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

[loadgen] 2022/07/14 15:01:07 simulated 20 requests
[loadgen] 2022/07/14 15:01:07 simulating client requests, round 37
[loadgen] 2022/07/14 15:01:14 query 'sweet': matched 958
[client] 2022/07/14 15:01:14 {"match_count":958}
[client] 2022/07/14 15:01:14 {"match_count":3040}
[loadgen] 2022/07/14 15:01:14 query 'love': matched 3040
[client] 2022/07/14 15:01:15 {"match_count":349}
[loadgen] 2022/07/14 15:01:15 query 'hello': matched 349
[client] 2022/07/14 15:01:15 {"match_count":484}
[loadgen] 2022/07/14 15:01:15 query 'faith': matched 484
[loadgen] 2022/07/14 15:01:15 query 'insolence': matched 14
[client] 2022/07/14 15:01:15 {"match_count":14}
[client] 2022/07/14 15:01:21 {"match_count":484}
[loadgen] 2022/07/14 15:01:21 query 'faith': matched 484
[client] 2022/07/14 15:01:21 {"match_count":728}
[loadgen] 2022/07/14 15:01:21 query 'world': matched 728
[client] 2022/07/14 15:01:22 {"match_count":484}
[loadgen] 2022/07/14 15:01:22 query 'faith': matched 484
[loadgen] 2022/07/14 15:01:22 query 'hello': matched 349
[client] 2022/07/14 15:01:22 {"match_count":349}
[client] 2022/07/14 15:01:23 {"match_count":1036}
[loadgen] 2022/07/14 15:01:23 query 'friend': matched 1036
[loadgen] 2022/07/14 15:01:28 query 'tear': matched 463
...

এখন সব স্প্যান সঠিকভাবে ক্লাউড ট্রেসে পাঠানো হয়েছে কিনা তা নিশ্চিত করা যাক। ক্লাউড কনসোল অ্যাক্সেস করুন এবং "ট্রেস তালিকা" এ নেভিগেট করুন। এটি অনুসন্ধান বাক্স থেকে অ্যাক্সেস করা সহজ. অন্যথায়, আপনি বাম ফলকে মেনুতে ক্লিক করতে পারেন। 8b3f8411bd737e06.png

তারপরে আপনি দেখতে পাচ্ছেন লেটেন্সি গ্রাফ জুড়ে প্রচুর নীল দাগ বিতরণ করা হয়েছে। প্রতিটি স্পট একটি একক ট্রেস প্রতিনিধিত্ব করে।

3ecf131423fc4c40.png

তাদের একটি ক্লিক করুন এবং আপনি ট্রেস ভিতরে বিশদ দেখতে পারেন. 4fd10960c6648a03.png

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

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

সারাংশ

এই ধাপে, আপনি ক্লাউড ট্রেস ওয়ান এবং ক্লাউড ট্রেসে ভিজ্যুয়ালাইজড ট্রেস দিয়ে stdout এক্সপোর্টারকে প্রতিস্থাপন করেছেন। এছাড়াও আপনি ট্রেস বিশ্লেষণ শুরু কিভাবে শিখেছি.

পরবর্তী আপ

পরবর্তী ধাপে, আপনি GetMatchCount-এ একটি সাব স্প্যান যোগ করতে সার্ভার পরিষেবার সোর্স কোড পরিবর্তন করবেন।

7. আরও ভাল বিশ্লেষণের জন্য সাব স্প্যান যোগ করুন

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

3b63a1e471dddb8c.png

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

সার্ভারে একটি সাব স্প্যান ইনস্ট্রুমেন্ট করুন

সার্ভারে main.go খুলুন এবং readFiles ফাংশন খুঁজুন। এই ফাংশনটি Google ক্লাউড স্টোরেজের কাছে শেক্সপিয়রের কাজের সমস্ত পাঠ্য ফাইল আনার জন্য একটি অনুরোধ কল করছে৷ এই ফাংশনে, আপনি একটি সাব স্প্যান তৈরি করতে পারেন, যেমন আপনি ক্লায়েন্ট পরিষেবাতে HTTP সার্ভার ইন্সট্রুমেন্টেশনের জন্য করেছেন।

step0/src/server/main.go

func readFiles(ctx context.Context, bucketName, prefix string) ([]string, error) {
        type resp struct {
                s   string
                err error
        }

        // step4: add an extra span
        span := trace.SpanFromContext(ctx)
        span.SetName("server.readFiles")
        span.SetAttributes(attribute.Key("bucketname").String(bucketName))
        defer span.End()
        // step4: end add span
        ...

এবং যে একটি নতুন স্প্যান যোগ করার জন্য সব. অ্যাপটি চালানোর মাধ্যমে এটি কিভাবে যায় তা দেখা যাক।

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

সম্পাদনা করার পরে, স্কাফোল্ড কমান্ড দিয়ে ক্লাস্টারটি যথারীতি চালান।

skaffold dev

এবং ট্রেস তালিকা থেকে query.request নামের একটি ট্রেস বেছে নিন। আপনি shakesapp.ShakespeareService/GetMatchCount অধীনে একটি নতুন স্প্যান ব্যতীত একই ধরনের ট্রেস জলপ্রপাত গ্রাফ দেখতে পাবেন। (নীচে লাল আয়তক্ষেত্র দ্বারা ঘেরা স্প্যান)

3d4a891aa30d7a32.png

আপনি এখন এই গ্রাফ থেকে যা বলতে পারেন তা হল যে Google ক্লাউড স্টোরেজে বাহ্যিক কলটি প্রচুর পরিমাণে লেটেন্সি দখল করে, কিন্তু তারপরও অন্যান্য জিনিসগুলি বেশিরভাগ লেটেন্সি তৈরি করছে৷

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

সারাংশ

এই ধাপে, আপনি সার্ভার পরিষেবাতে আরেকটি স্প্যান তৈরি করেছেন এবং সিস্টেমের লেটেন্সির আরও অন্তর্দৃষ্টি পেয়েছেন।

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

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