নেমস্পেস কী?
এ্যাপসিগনেল-নিরীক্ষিত একটি অ্যাপ্লিকেশনে ঘটা সব কিছু একটি নেমস্পেসের অধীনে লগ করা হয়। নেমস্পেস ফোল্ডারের মতো কাজ করে, ইভেন্ট, সমস্যা এবং মনিটরিং ডেটা পরিচালনাযোগ্য খণ্ডে গ্রুপ করে।
ডিফল্টভাবে, প্রতিটি অ্যাপ্লিকেশন তিনটি ডিফল্ট নেমস্পেস দিয়ে শুরু হয়: web, background, এবং frontend।
- ওয়েব নেমস্পেস আপনার সকল HTTP রিকোয়েস্ট ধারণ করে। রেলস বা সিনատ্রা মতো MVC-ওরিয়েন্টেড ফ্রেমওয়ার্কে, এতে কন্ট্রোলার অ্যাকশনগুলো অন্তর্ভুক্ত থাকে।
- ব্যাকগ্রাউন্ড নেমস্পেস ব্যাকগ্রাউন্ড জব, লাইব্রেরি এবং টাস্ক থেকে এক্টিভিটি ধারণ করে।
- ফ্রন্টএন্ড নেমস্পেস অ্যাপসিগনেল ফর জাভাস্ক্রিপ্ট ইন্টিগ্রেশন দ্বারা পাঠানো ইভেন্ট লগ করে।
অ্যাপসিগনেল বিল্ট-ইন প্রতি-অ্যাপ্লিকেশন এবং প্রতি-ইন্টিগ্রেশন রুল ব্যবহার করে ইনকামিং ইভেন্ট ম্যাপ করে। তবে, আপনি যেকোনো সময় এই ম্যাপিং পরিবর্তন করতে পারেন এবং আপনার অ্যাপ্লিকেশন কাঠামো মডেল করার জন্য নতুন নেমস্পেস তৈরি করতে পারেন।
রুবিতে নেমস্পেস ব্যবহার করে দেখা যাক
রুবি অন রেলস (ROR) অ্যাপ্লিকেশনে নেমস্পেস ব্যবহার করে দেখি। rails new দিয়ে একটি নতুন রেলস প্রজেক্ট তৈরি করার পর এবং রেলস ইন্টিগ্রেশন সেট আপ করার পর, আপনি আপনার ড্যাশবোর্ডে web নেমস্পেস পাবেন।
অ্যাপসিগনেল নেমস্পেসটি দেখায় যতক্ষণ না কোনো কন্ট্রোলার থেকে ট্রানজ্যাকশন পায়।
বাকি ডিফল্ট নেমস্পেসগুলো তখন পর্যন্ত দেখা যাবে না যতক্ষণ না সেগুলোতে কিছু এক্টিভিটি থাকে। চলুন ব্যাকগ্রাউন্ড নেমস্পেসে কিছু যোগ করি যাতে জিনিসগুলো আরও আকর্ষণীয় হয়। এটা ড্যাশবোর্ড কেমন দেখায় সাইডকিউই প্রজেক্টে যোগ করার পর (উদাহরণ রিপোজিটরিতে কোড চেক করুন)।
অ্যাপসিগনেল অ্যাকশনকে ব্যাকগ্রাউন্ড নেমস্পেসে অ্যাসাইন করে কারণ এটি সাইডকিউই জব প্রসেসর হিসেবে চিনে। অ্যাপসিগনেল অধিকাংশ জনপ্রিয় ব্যাকগ্রাউন্ড প্রসেসরের সাথে ইন্টিগ্রেট করা থাকে, কিন্তু আপনার যদি ছুটে যাওয়া থাকে, তবে আপনি সবসময় ম্যানুয়ালি আপনার জবগুলিতে ইনস্ট্রুমেন্টেশন যোগ করতে পারেন।
কাস্টম নেমস্পেস তৈরি করা
বড় মনোলিথিক অ্যাপ্লিকেশনে, ডিফল্ট নেমস্পেসগুলো খুব জেনেরিক লাগতে পারে। একটি বড় ওয়েবসাইট সাধারণত স্ট্যাটিক কন্টেন্ট, ডাইনামিক পেজ, API এন্ডপয়েন্ট, ইত্যাদি ওয়েব সার্ভিস সার্ভ করে। এর অধিকাংশ web নেমস্পেসে পড়ে যাবে।
এছাড়া, অ্যাপ্লিকেশনের প্রতিটি অংশের আলাদা প্রায়োরিটি থাকে। লগইন পেজের সমস্যা ইন্টারন্যাল অ্যাডমিন প্যানেলের সমস্য থেকে कहीं জরুরি। তবুও অ্যাপসিগনেল একটি নেমস্পেসের সকল ইস্যুকে সমান বিবেচনা করে। অনেক এক্টিভিটি থাকলে, সবচেয়ে ক্রিটিক্যাল ইস্যু চিহ্নিত করা কঠিন হতে পারে।
তাই, আমাদের নেমস্পেসগুলো প্রায়োরিটি এবং দায়িত্বের এলাকা অনুযায়ী সংগঠিত করা উচিত। তখন আমরা আলাদা নোটিফিকেশন পলিসি আটাচ করতে পারি এবং শুধু सम्बद्ध পার্টিগুলোকে অ্যালার্ট করতে পারি। এই যুক্তি অনুসরণ করে, আমরা login_page, api_endpoints, এবং admin_panel এর জন্য কাস্টম নেমস্পেস তৈরি করতে পারি।
রুবিতে একটি নতুন নেমস্পেস তৈরি করতে, আমরা Appsignal.set_namespace ব্যবহার করব। নিচের কোডটি দেখুন, যা urgent_background নামে একটি নেমস্পেসে একটি জব তৈরি করে:
class FetchPricesWorker include Sidekiq::Worker def perform Appsignal.set_namespace("urgent_background") # worker code ... end end
এই পরিবর্তনটি করার পর এবং অ্যাপ রিস্টার্ট করার পর, এই নতুন জবগুলো নতুন তৈরি করা নেমস্পেসে দেখা যাবে:
আমরা ড্যাশবোর্ডে একশন নাম চেক করে একচুَلك আসল জবটি লগ হয়েছে কিনা নিশ্চিত করতে পারি:
কাস্টম নেমস্পেস সব ইন্টিগ্রেশনে কাজ করে।
নেমস্পেস উপেক্ষা করা
কাস্টম নেমস্পেসের আরেকটি সুবিধা হল সেগুলো আমাদের অ্যাপ্লিকেশনের যেসব অংশের জন্য আমরা চিন্তা করি না সেগুলো থেকে ইভেন্ট উপেক্ষা করতে দেয়। উদাহরণস্বরূপ, আমরা admin_panel- থেকে ইভেন্ট সম্পূর্ণ উপেক্ষা করতে বেছে নিতে পারি।
এক নেমস্পেস উপেক্ষা করার তিন ধাপ:
- যেসব অংশ আমরা মনিটর করতে চাই না সেগুলো একটি কাস্টম নেমস্পেসে অ্যাসাইন করুন।
- নেমস্পেস উপেক্ষা করার জন্য ইন্টিগ্রেশন কনফিগার করুন।
- আপনার অ্যাপ রিস্টার্ট করুন।
রুবির জন্য, অ্যাপসিগনেল কনফিগ ফাইলে ignore_namespaces অপশন যোগ করুন:
production: ignore_namespaces: - "admin_panel"
একটি নেমস্পেস উপেক্ষা করা সোর্সে সব ট্রানজ্যাকশন এবং স্প্যান ডেটা স্কিপ করে। কাস্টম মেট্রিক ডেটা এখনও রিপোর্ট করা হয়।
ইলিক্সির এবং জাভাস্ক্রিপ্ট ইন্টিগ্রেশনেও একই तरहের অপশন রয়েছে। বিস্তারিত জানতে ইগনোরিং নেমস্পেস গাইড চেক করুন।
মনোলিথিক অ্যাপ্লিকেশনের জন্য নেমস্পেস
এখন যেহেতু আমরা জানি নেমস্পেস কীভাবে কাজ করে, চলুন কিছু উপায় দেখি যেগুলো দিয়ে একটি মনোলিথিক অ্যাপ্লিকেশন পার্টিশন করা যায়।
যদিও কোনো সেট রুল নেই, পার্টিশনিং মূলত দুটি Стра্যাটেজির ওপর নির্ভর করে। আপনি যেকোনো একটি বেছে নিতে পারেন বা উভয়ের মিশ্রণ ব্যবহার করতে পারেন শুরুর পয়েন্ট হিসেবে:
- ভূমিকা অনুযায়ী: আমরা প্রজেক্টের ফাংশনাল বা লজিক্যাল ইউনিটগুলোর জন্য নেমস্পেস অ্যাসাইন করি। এইভাবে, আমরা
billing,sign_inবাsign_up,admin_panel, এবংhomepageএর মতো নেমস্পেস ডিফাইন করতে পারি। অ্যাপসিগনেল ড্যাশবোর্ডে এক নজর দিলেই আপনি বুঝতে পারবেন অ্যাপ্লিকেশনের প্রতিটি অংশে কী হচ্ছে। এই পদ্ধতি ভালো কাজ করে যখন কোডকে স্পষ্ট সীমানা দিয়ে ভাগ করা যায়। - গুরুতরতা অনুযায়ী: এখানে আমরা নেমস্পেসকে একটি প্রায়োরিটাইজিং ডিভাইস হিসেবে ব্যবহার করি। আপনার ওপর নির্ভর করে কোডের কোন অংশ
critical,important,medium, বাlow। এই পদ্ধতিটি আপনাকে তাৎক্ষণিকভাবে সাজাতে দেয় কোন সমস্যা আপনি প্রথমে সমাধান করতে চান।
ধরুন у нас কন্ট্রোলার আছে যা ইউজার সাইন ইন এবং রেজিস্ট্রেশন হ্যান্ডেল করে। ভূমিকা অনুযায়ী পার্টিশন বেছে নিলে, আমরা সেগুলো user_login নেমস্পেসে ম্যাপ করতে পারি।
# রেলসে আমরা before_action কলব্যাক ব্যবহার করি # রিকোয়েস্ট শুরু হওয়ার আগে নেমস্পেস পরিবর্তন করার জন্য class LoginController < ApplicationController before_action :set_appsignal_namespace def set_appsignal_namespace # নেমস্পেস সেট করে Appsignal.set_namespace("user_login") end # controller actions ... end
কিন্তু আপনি যদি প্রায়োরিটি নেমস্পেস পছন্দ করেন, তবে বিলিং-এর দায়িত্বপ্রাপ্ত কন্ট্রোলার সম্ভবত critical নেমস্পেসে যাবে।
class BillingPageController < ApplicationController before_action :set_appsignal_namespace def set_appsignal_namespace Appsignal.set_namespace("critical") end end
এই কন্ট্রোলারগুলো থেকে ইনহেরিট করা কন্ট্রোলারগুলো তাদের পেরেন্টের মতো একই নেমস্পেস শেয়ার করে:
# LoginController থেকে ইনহেরিট করা যেকোনো কন্ট্রোলার # "user_login" নেমস্পেসের অংশও হবে class RegistrationController < LoginController # এখানে before_action দরকার নেই # এই কন্ট্রোলার ইতিমধ্যে পেরেন্টের নেমস্পেসে রিপোর্ট করে end
যেমন আমরা দেখেছি, জব এবং টাস্ক অটোমেটিক্যালি background নেমস্পেসে অ্যাসাইন হয়। যতদূর সম্ভব, আমাদের সেগুলো আরও স্পেসিফিক নেমস্পেসে অ্যাসাইন করা উচিত। উদাহরণস্বরূপ, একটি ডেটাবেস ক্লিনআপ জব database নেমস্পেসে যেতে পারে, এইভাবে:
class ActiveJobDatabaseCleanupJob < ActiveJob::Base queue_as :default def perform(argument = nil, options = {}) Appsignal.set_namespace("database")
প্রায়োরিটি জবের জন্যও কাজ করে। আমরা অমহত্বপূর্ণ টাস্কগুলোকে low-এ অ্যাসাইন করতে পারি, এই রেক টাস্কের মতো:
task :unimportant_job do # এই রেক জবটি low নেমস্পেসে চালান Appsignal.set_namespace("low") # job code ... end
কিছু কেসে, আপনি ম্যানুয়াল ট্রানজ্যাকশন ব্যবহার করে অ্যাকশন লগ করতে চাবেন। আপনি সেটি তৈরি করার সময় নেমস্পেস ডিফাইন করতে পারেন, নিচের উদাহরণের মতো, যা একটি কাস্টম মেইলার জব কোড করে:
class Job def perform # এই জবের জন্য একটি ট্রানজ্যাকশন তৈরি করুন এবং নেমস্পেস সেট করুন transaction = Appsignal::Transaction.create( SecureRandom.uuid, "mailer", Appsignal::Transaction::GenericRequest.new(ENV.to_hash) ) # job code ... end end
নেমস্পেস এবং নোটিফিকেশন
टीমের সব সদস্যকে সব সমস্যা সম্পর্কে নোটিফাই করার দরকার নেই। ফ্রন্টএন্ড স্পেশালিস্টরা ব্যাকগ্রাউন্ড জবের মতো ব্যাকএন্ড ডেভেলপারদের চিন্তা করেন না। তারপরও, তারা ব্যাকএন্ডে সমস্যা হলে জানতে চাইতে পারে। ব্যাকএন্ড ডেভেলপাররা নিশ্চিত रूपে web নেমস্পেসে পারফরম্যান্স ইস্যু সম্পর্কে নোটিফাই হতে চাইবেন। নেমস্পেস আমাদের নোটিফিকেশন সঠিক মানুষের কাছে পাঠাতে সাহায্য করে।
প্রতি-নেমস্পেস নোটিফায়ার সেট আপ করা
আমরা নোটিফিকেশন গ্রুপ তৈরি করতে পারি যা শুধু নির্দিষ্ট নেমস্পেসের জন্য সক্রিয় থাকে। উদাহরণস্বরূপ, আমরা web নেমস্পেসে এরর জন্য ইমেইল পাঠাতে পারি, অথবা frontend নেমস্পেসে ইস্যু জন্য #frontend স্ল্যাক চ্যানেলে মেসেজ পাঠাতে পারি।
প্রতি-নেমস্পেস নোটিফিকেশন গ্রুপ তৈরি করতে, অ্যাপ সেটিংস > নোটিফিকেশন > নোটিফায়ারসে যান এবং Add Integration-এ ক্লিক করুন।
ইন্টিগ্রেশনগুলির একটি সিলেক্ট করুন এবং এর নাম টাইপ করুন। কোন ধরনের মেসেজ পাঠাতে হবে এবং কোন নেমস্পেসের জন্য সেটি বেছে নিন। উদাহরণস্বরূপ, আসুন #frontend চ্যানেলের জন্য একটি স্ল্যাক নোটিফিকেশন তৈরি করি।
আমরা এখনও এখানে আছি, ব্যাকএন্ড ডেভেলপারদের জন্য একটি دومি নোটিফিকেশন তৈরি করি:
আপনি টিমকে সব কিছু আপ টু ডেট রাখতে যতগুলো নোটিফায়ার দরকার ততগুলো কনফিগার করতে পারেন।
প্রতি-নেমস্পেস নোটিফিকেশন পরিবর্তন করা
যখন একটি ইন্সিডেন্ট তৈরি হয়, অ্যাপসিগনেল একটি নোটিফিকেশন পলিসি প্রয়োগ করে। এই পলিসি নেমস্পেসের ওপর ভিত্তি করে যা ইররটি আসছে। আমরা প্রতিটি নেমস্পেসের জন্য আলাদা পলিসি ডিফাইন করতে পারি।
আপনার অ্যাপ্লিকেশনের নেমস্পেস ডিফল্টস দেখতে, অ্যাপ সেটিংস > নোটিফিকেশন > Namespace defaults-এ যান।
এখানে, আপনি প্রতিটি নেমস্পেসের জন্য এরর এবং পারফরম্যান্স নোটিফিকেশন কাস্টমাইজ করার অপশন পাবেন:
- Every occurrence: প্রতি বার ইন্সিডেন্ট ট্রিগার হলে নোটিফিকেশন পাঠায়, ৫ মিনিট কুলডাউন সহ।
- First on deploy: অ্যাপ্লিকেশন ডিপ্লয় করার পর প্রথম এরর নোটিফাই করে।
- First after close: একটি বন্ধ ইস্যু পুনরায় খোলা হলে প্রথমবার নোটিফিকেশন পাঠায়।
- Never notify: নোটিফিকেশন সম্পূর্ণ ডিজেবল করে।
প্রতি-নেমস্পেস ট্রিগার তৈরি করা
ট্রিগার অ্যাপসিগনেলকে বলে যখন একটি মেট্রিক একটি পূর্বনির্ধারিত মানের উপরে বা নিচে চলে যায় তখন একটি ইন্সিডেন্ট তৈরি করুন এবং নোটিফিকেশন পাঠান। যেহেতু অ্যাপ্লিকেশনের বিভিন্ন অংশের বিভিন্ন থ্রেশহোল্ড থাকতে পারে, আমাদের প্রতিটি নেমস্পেসের জন্য আলাদা ট্রিগার তৈরি করা উচিত। Клаসিক উদাহরণ হল একটি ট্রিগার যা আমাদের সতর্ক করে যখন web নেমস্পেসে থ্রুপুট খুব কম।
একটি ট্রিগার তৈরি করতে, Anomaly Detection > Triggers-এ যান, এবং Add your first trigger-এ ক্লিক করুন।
বাম মেনু থেকে Actions ট্রিগার টাইপ সিলেক্ট করুন এবং প্রাসঙ্গিক নেমস্পেস বেছে নিন। তারপর, সেটিংস দিন যা অ্যালার্ট ট্রিগার করবে।
এখানে আপনি সংজ্ঞায়িত করতে পারেন কোন গ্রুপগুলো নোটিফাই হবে। চূড়ান্ত করতে Save Trigger-এ ক্লিক করুন।
উপসংহার
নেমস্পেস আপনার অ্যাপ্লিকেশনের মনিটরিং ডেটা বুঝতে সাহায্য করে। সেগুলো নোটিফিকেশন এবং ইন্সিডেন্ট ফাইন-গ্রেইনড লেভেলে ফায়ার করার জন্যও অপরিহার্য, নয়েজ লিমিট করা এবং ফাল্স পজিটিভ এড়াতে।
রুবি, Node.js, এবং ইলিক্সিরে কাস্টম নেমস্পেস কীভাবে কাজ করে চেক করার পর, এগুলো পড়ুন নেমস্পেস ব্যবহার শিখতে থাকার জন্য:
- Namespaces in AppSignal
- Grouping with namespaces
- What's The Difference Between Monitoring Webhooks and Background Jobs
- Gem 2.2 - Custom namespaces!