4,000টি Discord সার্ভারের ওপর নজর: Grafana, PostHog আর এরা আমাদের যা দেখাল
একটা লুপ যা চুপচাপ আমাদের অর্ধেক ট্রাফিক তৈরি করত, দিনে তিন মিলিয়ন অর্থহীন অনুরোধ আর একটা আক্রমণ যা এক মিনিটে শেষ হয়ে গেল। আমাদের মনিটরিং কী দেখে, আর কী ইচ্ছে করেই দেখে না।

AlphaCloud 4,000-এর কিছু বেশি Discord সার্ভারে চলে, চারটি শার্ডে ছড়িয়ে। সেগুলো চারটি প্রসেস, প্রত্যেকটি সার্ভারের একটা অংশ সামলায়, আর সবাই একই API-এর সাথে কথা বলে।
এই আকারে একটা সমস্যা কদাচিৎ কিছু ভেঙে নিজেকে দেখায়। অনেক বেশি ক্ষেত্রে সবকিছু কাজ করে, শুধু যতটা হওয়া উচিত তার চেয়ে বেশি ব্যয়বহুল, ধীর বা কোলাহলপূর্ণভাবে। সেজন্যই আমরা 2026 সালের সেপ্টেম্বরে আমাদের মনিটরিং নতুন করে গড়েছি। এই লেখা দেখায় সেটা কেমন, আর প্রথম কয়েক সপ্তাহে তা আমাদের কী দেখিয়েছে।
দুটি টুল, দুটি প্রশ্ন
Grafana এই প্রশ্নের উত্তর দেয়: বট কী করছে? বট আর API Prometheus-এ মেট্রিক পাঠায় (অনুরোধ, প্রতিক্রিয়ার সময়, ত্রুটির হার, Discord-এর প্রতিক্রিয়া, AI ব্যবহার), আর লগ যায় Loki-তে। প্রতিটি সার্ভার নোডের নিজস্ব স্ট্যাক আছে, আর Grafana শুধু একটা প্রাইভেট নেটওয়ার্ক দিয়ে পৌঁছানো যায়, ইন্টারনেট থেকে নয়।
PostHog এই প্রশ্নের উত্তর দেয়: আমাদের ওয়েবসাইটে মানুষ কী অভিজ্ঞতা পান? পেজ ভিউ, ব্রাউজারের ত্রুটি, লোড হওয়ার সময়, আর সম্মতি থাকলে রেকর্ড করা সেশন। কুকি ব্যানারে আপনি সম্মতি দেওয়ার পরই PostHog শুরু হয়।
এই ভাগ ইচ্ছাকৃত। Grafana মেশিনের দিকে তাকায়, PostHog ইন্টারফেসের দিকে। দুটোকে একটা টুলে চাপিয়ে দিলে হয় সার্ভার লগে ব্যবহারকারীর ডেটা আসে, নয়তো প্রোডাক্ট অ্যানালিটিক্সে সার্ভারের চাপ।
এটা যা খুঁজে পেল
একটা লুপ যা অর্ধেক ট্রাফিক তৈরি করত
শেষ হওয়ার সময়সহ পোলগুলো একটা ব্যাকগ্রাউন্ড টাস্ক বন্ধ করে, যা প্রতি মিনিটে দেখে কিছু মেয়াদোত্তীর্ণ হয়েছে কি না। এটা তা করত প্রতিটি সার্ভারের জন্য আলাদাভাবে। প্রতি শার্ডে মোটামুটি 1,000টি সার্ভার আর চারটি শার্ড মিলিয়ে তা দাঁড়াত প্রায় প্রতি সেকেন্ডে 70টি অনুরোধে, যার প্রায় সবগুলোর উত্তর ছিল "কিছুই মেয়াদোত্তীর্ণ হয়নি"।
আমরা এটা শুধু Grafana-তে লক্ষ করি, যখন বটের API অনুরোধগুলো পাথ অনুযায়ী ভাগ করি: এই একটা এন্ডপয়েন্টই ছিল সমস্ত ট্রাফিকের অর্ধেকের বেশি। সবকিছু কাজ করছিল। শুধু এমন একটা চাপ বহন করছিল যা কেউ চায়নি।
এখন প্রতিটি শার্ড মিনিটে একবার জিজ্ঞেস করে: "কোন সার্ভারগুলোতে আদৌ মেয়াদোত্তীর্ণ পোল আছে?" আর শুধু সেগুলোর বিস্তারিত আনে। মিনিটে প্রায় 4,200টি অনুরোধ নেমে এসেছে মোটামুটি চারটিতে।
তিন মিলিয়ন বার "সেট আপ করা নেই"
একই ধরন, ভিন্ন জায়গা: বেশ কয়েকটি মডিউল (সাপোর্ট এন্ট্রি, অনুপস্থিতি, টিম তালিকা, বটের পরিসংখ্যান, নিউজলেটার) নিজেদের লুপে নিয়মিত প্রতিটি সার্ভারের সেটিংস পড়ত। বেশিরভাগ সার্ভারে একটা নির্দিষ্ট মডিউল আদৌ সেট আপ করা থাকে না, তাই উত্তর ছিল "পাওয়া যায়নি"। দিনে প্রায় তিন মিলিয়ন বার।
সমাধানটা সাদামাটা: "সেট আপ করা নেই" এখন 30 মিনিটের জন্য মনে রাখা হয়। এটা শুধু এই কারণে নিরাপদ যে এই মডিউলগুলোর প্রতিটি ওয়েব প্যানেলে সেভ হওয়ার মুহূর্তেই বটকে একটা আপডেট পাঠায়, তাই একটা মডিউল সেট আপ করলে কখনো 30 মিনিট অপেক্ষা করতে হয় না।
Discord-এর বিভ্রাট আমাদের বাগ নয়
আমাদের টিমের ত্রুটি চ্যানেল প্রতিটি ব্যর্থ অ্যাকশনকে একটা "Runtime Error" হিসেবে পোস্ট করত, একটা অনন্য রেফারেন্স আর সব কিছুসহ। এর মধ্যে সেই মুহূর্তগুলোও ছিল যখন Discord নিজেই সার্ভার ত্রুটি দিয়ে উত্তর দিত। এটা আমাদের দিকের বাগও নয়, আমরা ঠিক করতে পারি এমন কিছুও নয়, আর চ্যানেলে এটা হুবহু একটা আসল ত্রুটির মতো দেখাত।
আজ এটা একটা সতর্কতা হিসেবে লগ হয়, আর সদস্যকে বাগ রিপোর্ট করার লিংকের বদলে কয়েক সেকেন্ড পর আবার চেষ্টা করতে বলা হয়। যে ত্রুটি চ্যানেলের অর্ধেক মেসেজ ত্রুটি নয়, একসময় সেটা আর পড়া হয় না। তখন আসলটা চোখ এড়িয়ে যায়।
একটা আক্রমণ যা এক মিনিট চলেছিল
সেপ্টেম্বরের শেষে এক বিকেলে আমাদের হোম পেজ এক মিনিটের মধ্যে 500,000-এর কিছু বেশি অনুরোধ পেল, একসাথে অনেক দেশ থেকে। বেশিরভাগই আমাদের সার্ভারে পৌঁছানোর আগেই থামানো হয়েছিল, আর এক মিনিট পর ট্রাফিক আবার স্বাভাবিক হয়ে গেল।
কিছু বন্ধ হয়ে গিয়েছিল বলে আমরা এটা দেখিনি। দেখেছি কারণ সংখ্যাটা চার্টের বাকি অংশের সাথে মেলেনি। মনিটরিংয়ের আসল কাজ এটাই: সব জ্বলতে থাকলে অ্যালার্ম বাজানো নয়, বরং দেখানো কোথায় কিছু স্বাভাবিকের সাথে খাপ খায় না।
আমাদের মনিটরিং ইচ্ছে করে যা দেখে না
এখানকার নিয়মগুলো ড্যাশবোর্ডের মতোই গুরুত্বপূর্ণ:
- লগে কোনো ভিজিটরের IP ঠিকানা নয়। আমাদের গোপনীয়তা নীতি এটা প্রতিশ্রুতি দেয়, তাই আমরা দুই জায়গায় এগুলো সরাই: অ্যাক্সেস লগ লেখার সময়, আর সংরক্ষণের আগে আরেকবার।
- মেট্রিকে কোনো সার্ভার, ব্যবহারকারী বা মেসেজ ID নয়। প্রতিটি মেট্রিক শুধু মোটা বৈশিষ্ট্য অনুযায়ী ভাগ করা হয় (মডিউল, স্ট্যাটাস ক্লাস, শার্ড)। এতে ডেটা সুরক্ষিত থাকে আর মেট্রিক ডেটাবেস ছোট থাকে।
- সেশন রেকর্ডিং আমাদের ইন্টারফেস দেখায়, আপনার বিষয়বস্তু নয়। শুধু সেই লেখা পড়া যায় যা হুবহু আমাদের অনুবাদ ফাইল থেকে আসে। সার্ভার, চ্যানেল আর ব্যবহারকারীর নাম, ইনপুট আর প্রিভিউ মাস্ক করা থাকে। অনুমোদিত লেখার তালিকা লোড করা না গেলে সবকিছু মাস্ক করা হয়।
- ওয়েবসাইটে সবকিছু শুধু সম্মতির পর। যার মানে সেখানকার সংখ্যাগুলো একটা নিম্নসীমা। আসল পেজ সংখ্যার জন্য আমরা আমাদের নেটওয়ার্ক প্রদানকারীর বেনামি মোট হিসাব দেখি।
বিস্তারিত গোপনীয়তা নীতিতে আছে।
আমরা এ থেকে কী নিচ্ছি
ব্যয়বহুল জিনিসটা কদাচিৎ ভাঙা জিনিস। ওপরের কোনো ফলাফলই কোনো ত্রুটি তৈরি করেনি। এগুলো তৈরি করেছে চাপ, খরচ আর কোলাহল, আর পরিমাপ ছাড়া এর কোনোটাই চোখে পড়ে না।
প্রতিটি সার্ভারের জন্য আলাদা জিজ্ঞাসা বড় হয় না। দুটি বড় ফলাফলের ধরনই এক: প্রতিটি সার্ভারের ওপর দিয়ে একটা লুপ যা প্রত্যেকটি সম্পর্কে আলাদাভাবে জিজ্ঞেস করে। উত্তর প্রায় সবসময় একই প্রশ্ন, সবার জন্য একবারে জিজ্ঞেস করা।
একটা অ্যালার্ম বিরল হতে হয়, নইলে তা অ্যালার্ম নয়। সেজন্যই শুধু Grafana টিমকে পিং করে, আর শুধু এমন বিষয়ে যেখানে কারও হস্তক্ষেপ দরকার। PostHog থেকে নতুন ধরনের ত্রুটি পিং ছাড়াই চ্যানেলে আসে।
আপনি নিজে একটা Discord সার্ভার চালালে আর এখানে উল্লেখ করা মডিউলগুলো দেখতে চাইলে: পোল, সাপোর্ট এন্ট্রি আর অনুপস্থিতি ওয়েব প্যানেলে আছে, আর সেগুলো ডকুমেন্টেশনে বর্ণনা করা আছে।
আরও নিবন্ধ
2,000+ Discord সার্ভারে একটা বট চালিয়ে আমরা যা শিখেছি
চারটি জিনিস যা বড় পরিসরে কোড লেখার সময় যা মনে হয় তার থেকে আলাদাভাবে কাজ করে।
পর্দার আড়ালেযখন আমাদের AI প্রদানকারী মডেলটা বন্ধ করে দিল
একটা মডেল বদল, ত্রুটি ছাড়াই খালি উত্তর, আর একটা বিল যা হঠাৎ কয়েকগুণ বেড়ে গেল। কী ভেঙেছিল, আর কারণটা দেখা কেন এত কঠিন ছিল।
পর্দার আড়ালেআমাদের কোডের ভেতরের আইন
একটা বাতিল বাটন যা লগইন ছাড়াই কাজ করতে হবে। একটা ফর্ম যা কখনো আপনাকে প্রত্যাখ্যান করতে পারবে না। আমাদের কাছে আইনি দায়িত্ব কেন বাঁধা গৎ নয়, বরং স্থাপত্য।