নীচে নির্বাচিত ব্লগ পোস্টগুলির কোড উদাহরণ এবং কোট সহ এই বিষয়টির বিভিন্ন সূত্রের সংক্ষিপ্তসার এবং ক্রিউশন রয়েছে। সেরা অনুশীলনের সম্পূর্ণ তালিকা এখানে পাওয়া যাবে
নোড.জেএস ত্রুটি পরিচালনার সেরা অনুশীলন
সংখ্যা 1: অ্যাসিঙ্ক ত্রুটি পরিচালনার জন্য প্রতিশ্রুতি ব্যবহার করুন
টিএল; ডিআর: কলব্যাক শৈলীতে অ্যাসিঙ্ক ত্রুটিগুলি পরিচালনা করা সম্ভবত জাহান্নামের দ্রুততম পথ (ডুমের পিরামিড ওরফে)। আপনি আপনার কোডটিতে সেরা উপহারটি দিতে পারেন তার পরিবর্তে একটি নামী প্রতিশ্রুতি গ্রন্থাগার ব্যবহার করা হচ্ছে যা চেষ্টা করার মতো অনেক কমপ্যাক্ট এবং পরিচিত কোড সিনট্যাক্স সরবরাহ করে
অন্যথায়: নুড.জেএস কলব্যাক শৈলী, ফাংশন (ত্রুটি, প্রতিক্রিয়া), নৈমিত্তিক কোড, অতিরিক্ত বাসা বাঁধা এবং বিশ্রী কোডিং নিদর্শনগুলির সাথে ত্রুটি পরিচালনা করার মিশ্রণের কারণে অ-রক্ষণাবেক্ষণযোগ্য কোডের প্রতিশ্রুতিবদ্ধ উপায় is
কোড উদাহরণ - ভাল
doWork()
.then(doWork)
.then(doError)
.then(doWork)
.catch(errorHandler)
.then(verify);
কোড উদাহরণ বিরোধী প্যাটার্ন - কলব্যাক শৈলীর ত্রুটি পরিচালনা ling
getData(someParameter, function(err, result){
if(err != null)
//do something like calling the given callback function and pass the error
getMoreData(a, function(err, result){
if(err != null)
//do something like calling the given callback function and pass the error
getMoreData(b, function(c){
getMoreData(d, function(e){
...
});
});
});
});
});
ব্লগের উদ্ধৃতি: "প্রতিশ্রুতি নিয়ে আমাদের সমস্যা আছে"
("নোড প্রতিশ্রুতি" কীওয়ার্ডগুলির জন্য ব্লগ পাউচডিবি, ১১ নম্বরে)
"... এবং প্রকৃতপক্ষে কলব্যাকগুলি আরও ভয়াবহ কিছু করে: এগুলি আমাদের স্ট্যাক থেকে বঞ্চিত করে, যা আমরা সাধারণত প্রোগ্রামিং ভাষায় মর্যাদাবোধ করি। স্ট্যাক ছাড়াই রাইটিং কোড অনেকটা ব্রেক প্যাডেল ছাড়াই গাড়ি চালানোর মতো: আপনি আপনি যতটা খারাপভাবে এটির প্রয়োজন তা বুঝতে পারবেন না, যতক্ষণ না আপনি এটির জন্য পৌঁছান এবং এটি সেখানে না promises প্রতিশ্রুতির পুরো বিন্দুটি হ'ল আমরা যখন অ্যাসিঙ্কে গিয়েছিলাম তখন আমরা যে ভাষার মূলসূত্রগুলি হারিয়েছিলাম তা ফিরিয়ে দেওয়া: ফিরে আসুন, নিক্ষেপ করুন এবং স্ট্যাক করুন you তবে আপনি প্রতিশ্রুতিগুলির সদ্ব্যবহারের জন্য কীভাবে সঠিকভাবে ব্যবহার করতে হয় তা জানতে হবে "
সংখ্যা 2: কেবল বিল্ট-ইন ত্রুটি অবজেক্টটি ব্যবহার করুন
টিএল; ডিআর: স্ট্রিং হিসাবে বা কাস্টম ধরণের হিসাবে ত্রুটিগুলি ছুঁড়ে এমন কোডটি দেখতে খুব সাধারণ - এটি ত্রুটিটি পরিচালনা করার যুক্তিকে এবং মডিউলগুলির মধ্যে আন্তঃব্যবহারকে জটিল করে তোলে। আপনি কোনও প্রতিশ্রুতি প্রত্যাখ্যান করুন, ব্যতিক্রম নিক্ষেপ করুন বা ত্রুটি নির্গত করুন - নোড.জেএস অন্তর্নির্মিত ত্রুটিযুক্ত বস্তুটি ব্যবহার করে অভিন্নতা বৃদ্ধি করে এবং ত্রুটির তথ্য হ্রাস রোধ করে
অন্যথায়: কিছু মডিউল সম্পাদন করার সময়, কোন ধরণের ত্রুটিগুলি প্রত্যাশায় আসে তা অনিশ্চিত হয়ে পড়ে - আসন্ন ব্যতিক্রম সম্পর্কে যুক্তি প্রদর্শন এবং এটি পরিচালনা করা আরও শক্ত করে তোলে। তবুও মূল্যবান, ত্রুটিগুলি বর্ণনা করতে কাস্টম প্রকারগুলি ব্যবহার করা স্ট্যাক ট্রেসের মতো সমালোচনামূলক ত্রুটির তথ্য হারাতে পারে!
কোড উদাহরণ - এটি সঠিকভাবে করা
//throwing an Error from typical function, whether sync or async
if(!productToAdd)
throw new Error("How can I add new product when no value provided?");
//'throwing' an Error from EventEmitter
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
//'throwing' an Error from a Promise
return new promise(function (resolve, reject) {
DAL.getProduct(productToAdd.id).then((existingProduct) =>{
if(existingProduct != null)
return reject(new Error("Why fooling us and trying to add an existing product?"));
কোড উদাহরণ বিরোধী প্যাটার্ন
//throwing a String lacks any stack trace information and other important properties
if(!productToAdd)
throw ("How can I add new product when no value provided?");
ব্লগের উক্তি: "একটি স্ট্রিং কোনও ত্রুটি নয়"
(ব্লগ ডেথচিট থেকে, "নোড.জেএস এরর ত্রুটিযুক্ত বিষয়" কীওয়ার্ডের জন্য 6 তম স্থানে রয়েছে)
"... মডিউল মধ্যে হ্রাস ইনটেরোপিরাবিলিটি একটি ত্রুটি ফলাফল পরিবর্তে একটি স্ট্রিং ক্ষণস্থায়ী। এটি API গুলি যে ত্রুটি চেক instanceof করণ করা যেতে পারে, বা যে ত্রুটি সম্পর্কে আরো জানতে চান চুক্তিপত্রে ভঙ্গ । ত্রুটি বস্তু, হিসাবে আমরা দেখতে পাবেন, খুব আছে আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলির আকর্ষণীয় বৈশিষ্ট্যগুলি কনস্ট্রাক্টরকে দেওয়া বার্তাটি ধরে রাখার পাশাপাশি .. "
সংখ্যা 3: কর্মক্ষম বনাম প্রোগ্রামার ত্রুটিগুলি পার্থক্য করুন
টিএল; ডিআর: অপারেশন ত্রুটি (উদাহরণস্বরূপ এপিআই একটি অবৈধ ইনপুট পেয়েছে) এমন ত্রুটিযুক্ত প্রভাবগুলিকে পুরোপুরি বোঝা যায় এবং চিন্তার সাথে পরিচালনা করা যায় এমন পরিচিত ক্ষেত্রে উল্লেখ করে। অন্যদিকে, প্রোগ্রামার ত্রুটি (উদাহরণস্বরূপ অপরিজ্ঞাত ভেরিয়েবলটি পড়ার চেষ্টা করা) অজানা কোড ব্যর্থতাগুলিকে বোঝায় যা অ্যাপ্লিকেশনটি দক্ষতার সাথে পুনরায় আরম্ভ করার নির্দেশ দেয়
অন্যথায়: কোনও ত্রুটি দেখা দিলে আপনি সর্বদা অ্যাপ্লিকেশনটি পুনঃসূচনা করতে পারেন, তবে কেন একটি গৌণ এবং পূর্বাভাসযুক্ত ত্রুটির কারণে (অপারেশনাল ত্রুটি) ~ 5000 অনলাইন ব্যবহারকারীকে বঞ্চিত করবেন? বিপরীতটিও আদর্শ নয় - অজানা সমস্যা (প্রোগ্রামার ত্রুটি) দেখা দিলে অ্যাপ্লিকেশনটি রাখা অপ্রত্যাশিত আচরণের কারণ হতে পারে। দু'জনের পার্থক্যটি দক্ষতার সাথে অভিনয় করতে এবং প্রদত্ত প্রসঙ্গে ভিত্তিতে ভারসাম্যযুক্ত পদ্ধতির প্রয়োগের অনুমতি দেয়
কোড উদাহরণ - এটি সঠিকভাবে করা
//throwing an Error from typical function, whether sync or async
if(!productToAdd)
throw new Error("How can I add new product when no value provided?");
//'throwing' an Error from EventEmitter
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
//'throwing' an Error from a Promise
return new promise(function (resolve, reject) {
DAL.getProduct(productToAdd.id).then((existingProduct) =>{
if(existingProduct != null)
return reject(new Error("Why fooling us and trying to add an existing product?"));
কোড উদাহরণ - ক্রিয়াকলাপ হিসাবে চিহ্নিত একটি ত্রুটি চিহ্নিত করা (বিশ্বস্ত)
//marking an error object as operational
var myError = new Error("How can I add new product when no value provided?");
myError.isOperational = true;
//or if you're using some centralized error factory (see other examples at the bullet "Use only the built-in Error object")
function appError(commonType, description, isOperational) {
Error.call(this);
Error.captureStackTrace(this);
this.commonType = commonType;
this.description = description;
this.isOperational = isOperational;
};
throw new appError(errorManagement.commonErrors.InvalidInput, "Describe here what happened", true);
//error handling code within middleware
process.on('uncaughtException', function(error) {
if(!error.isOperational)
process.exit(1);
});
ব্লগের উক্তি : "অন্যথায় আপনি রাষ্ট্রের ঝুঁকি নিয়ে যান" (ব্লগ ডিবাগযোগ্য থেকে, "নোড.জেএস ব্যতীত ব্যতীত" কীওয়ার্ডগুলির জন্য 3 স্থান পেয়েছে)
" ... জাভাস্ক্রিপ্টে নিক্ষেপ কীভাবে কাজ করে তার প্রকৃতি অনুসারে, রেফারেন্স ফাঁস না করে বা অন্য কোনও সংজ্ঞায়িত ভঙ্গুর অবস্থা তৈরি না করে নিরাপদে" আপনি যেখানে গিয়েছিলেন সেখানে তুলে নেওয়ার "কোনও উপায় নেই। সাড়া দেওয়ার সবচেয়ে নিরাপদ উপায় প্রক্রিয়াটি বন্ধ করে দেওয়া একটি ত্রুটিযুক্ত ত্রুটি । অবশ্যই একটি সাধারণ ওয়েব সার্ভারে আপনার অনেকগুলি সংযোগ খোলা থাকতে পারে এবং হঠাৎ করে সেগুলি বন্ধ করা যুক্তিসঙ্গত নয় কারণ অন্য কেউ দ্বারা ত্রুটি ঘটেছে The অন্যদের তাদের স্বাভাবিক সময় শেষ করার সময় এবং অনুরোধের জন্য একটি ত্রুটি প্রতিক্রিয়া প্রেরণ করুন যা অন্যদেরকে তাদের স্বাভাবিক সময় শেষ করে দেয় এবং সেই কর্মীর মধ্যে নতুন অনুরোধ শুনতে শোনায় "
সংখ্যা 4: মিডলওয়্যারের মধ্যে নয় তবে কেন্দ্রীয়ভাবে ত্রুটিগুলি পরিচালনা করুন
টিএল; ডিআর: অ্যাডমিনকে মেল এবং লগিংয়ের মতো লজিক হ্যান্ডল করার সময় ত্রুটি এলে সমস্ত শেষ পয়েন্ট (যেমন এক্সপ্রেস মিডলওয়্যার, ক্রোন জবস, ইউনিট-টেস্টিং) কলটি একটি ডেডিকেটেড এবং সেন্ট্রালাইজড অবজেক্টে আবশ্যক।
অন্যথায়: একক স্থানে ত্রুটিগুলি পরিচালনা না করা কোড ডুপ্লিকেশন এবং সম্ভবত ত্রুটিগুলি যা ভুলভাবে পরিচালিত হয় তার দিকে পরিচালিত করবে
কোড উদাহরণ - একটি সাধারণ ত্রুটি প্রবাহ
//DAL layer, we don't handle errors here
DB.addDocument(newCustomer, (error, result) => {
if (error)
throw new Error("Great error explanation comes here", other useful parameters)
});
//API route code, we catch both sync and async errors and forward to the middleware
try {
customerService.addNew(req.body).then(function (result) {
res.status(200).json(result);
}).catch((error) => {
next(error)
});
}
catch (error) {
next(error);
}
//Error handling middleware, we delegate the handling to the centrzlied error handler
app.use(function (err, req, res, next) {
errorHandler.handleError(err).then((isOperationalError) => {
if (!isOperationalError)
next(err);
});
});
ব্লগের উদ্ধৃতি: "কখনও কখনও নিম্ন স্তরগুলি তাদের কলারে ত্রুটি প্রচার করা ব্যতীত দরকারী কিছু করতে পারে না" ("নোড.জেএস এরর হ্যান্ডলিং" কীওয়ার্ডগুলির জন্য 1 নম্বরে জোয়েন্ট ব্লগ থেকে)
"... আপনি স্ট্যাকের বিভিন্ন স্তরে একই ত্রুটিটি পরিচালনা করতে পারেন This এটি তখন ঘটে যখন নীচের স্তরগুলি তাদের আহ্বানকারীকে ত্রুটি প্রচার করা ব্যতীত দরকারী কিছু করতে পারে না, যা ত্রুটিটিকে তার কলকারীকে প্রচার করে, ইত্যাদি Often প্রায়ই, অপারেশনটি পুনরায় চেষ্টা করা, ব্যবহারকারীকে বা অন্য কোনও কিছুর প্রতিবেদন করার জন্য উপযুক্ত প্রতিক্রিয়া কী তা কেবল শীর্ষ স্তরের কলারই জানে But তবে এর অর্থ এই নয় যে আপনার সমস্ত ত্রুটিগুলি একটি একক শীর্ষ-স্তরে রিপোর্ট করার চেষ্টা করা উচিত কলব্যাক, কারণ সেই কলব্যাক নিজেই জানতে পারে না যে প্রসঙ্গে ত্রুটিটি ঘটেছিল "
সংখ্যা 5: সোয়াগার ব্যবহার করে দস্তাবেজ এপিআই ত্রুটি
টিএল; ডিআর: আপনার এপিআই কলকারীদের জানিয়ে দিন যে কোন ত্রুটিগুলি এর পরিবর্তে আসতে পারে যাতে তারা ক্রাশ না করে এগুলি চিন্তাভাবনা করে পরিচালনা করতে পারে। এটি সাধারণত সোয়াগারের মতোই আরএসটি এপিআই ডকুমেন্টেশন ফ্রেমওয়ার্কগুলির সাহায্যে করা হয়
অন্যথায়: একটি API ক্লায়েন্ট কেবল ক্রাশ এবং পুনরায় চালু করার সিদ্ধান্ত নিতে পারে কারণ সে বুঝতে পারে না এমন একটি ত্রুটি ফিরে পেয়েছিল। দ্রষ্টব্য: আপনার এপিআই এর কলার আপনি হতে পারেন (একটি মাইক্রোসার্চেস পরিবেশে খুব সাধারণ)
ব্লগের উক্তি: "আপনার কলকারীদের বলতে হবে যে ত্রুটিগুলি কী ঘটতে পারে" (ব্লগ জয়েয়েন্ট থেকে, "নোড.জেএস লগিং" কীওয়ার্ডগুলির জন্য 1 স্থান রয়েছে)
… আমরা কীভাবে ত্রুটিগুলি পরিচালনা করব সে সম্পর্কে কথা বলেছি, কিন্তু আপনি যখন একটি নতুন ফাংশন লিখছেন, তখন আপনি কীভাবে কোডটিতে ত্রুটি বিতরণ করবেন যা আপনার ফাংশন বলে? … আপনি যদি না জানেন কোন ত্রুটিগুলি ঘটতে পারে বা সেটির অর্থ কী তা জানেন না, তবে আপনার প্রোগ্রামটি দুর্ঘটনা ছাড়া সঠিক হতে পারে না। সুতরাং আপনি যদি একটি নতুন ফাংশন লিখছেন তবে আপনার কলকারীদের বলতে হবে কী ত্রুটি ঘটতে পারে এবং তারা কী করে me
সংখ্যা 6: কোনও অপরিচিত শহরে এলে মনোযোগ দিয়ে প্রক্রিয়াটি বন্ধ করুন
টিএল; ডিআর: যখন কোনও অজানা ত্রুটি ঘটে (একজন বিকাশকারী ত্রুটি, সেরা অনুশীলন নম্বর # 3 দেখুন) - অ্যাপ্লিকেশনটির স্বাস্থ্যকরতা সম্পর্কে অনিশ্চয়তা রয়েছে। একটি সাধারণ অনুশীলনটি ফরওয়ার এবং পিএম 2 এর মতো 'পুনরায় চালুকরণ' সরঞ্জাম ব্যবহার করে সাবধানতার সাথে প্রক্রিয়াটি পুনরায় চালু করার পরামর্শ দেয়
অন্যথায়: যখন অপরিচিত ব্যতিক্রম ধরা পড়ে তখন কিছু বস্তু ত্রুটিযুক্ত অবস্থানে থাকতে পারে (যেমন একটি ইভেন্ট ইমিটার যা বিশ্বজুড়ে ব্যবহৃত হয় এবং কিছু অভ্যন্তরীণ ব্যর্থতার কারণে ইভেন্টগুলিতে গুলি চালানো হয় না) এবং ভবিষ্যতের সমস্ত অনুরোধগুলি ব্যর্থ বা ক্রেজি আচরণ করতে পারে
কোড উদাহরণ - ক্রাশ হবে কিনা তা স্থির করে
//deciding whether to crash when an uncaught exception arrives
//Assuming developers mark known operational errors with error.isOperational=true, read best practice #3
process.on('uncaughtException', function(error) {
errorManagement.handler.handleError(error);
if(!errorManagement.handler.isTrustedError(error))
process.exit(1)
});
//centralized error handler encapsulates error-handling related logic
function errorHandler(){
this.handleError = function (error) {
return logger.logError(err).then(sendMailToAdminIfCritical).then(saveInOpsQueueIfCritical).then(determineIfOperationalError);
}
this.isTrustedError = function(error)
{
return error.isOperational;
}
ব্লগের উদ্ধৃতি: "ত্রুটি পরিচালনার বিষয়ে তিনটি চিন্তাভাবনা রয়েছে" (ব্লগ জ্রেসিপেস থেকে)
… ত্রুটি পরিচালনার জন্য প্রাথমিকভাবে তিনটি চিন্তাভাবনা রয়েছে: ১. অ্যাপ্লিকেশনটি ক্রাশ হতে দিন এবং এটি পুনরায় চালু করতে দিন। ২. সমস্ত সম্ভাব্য ত্রুটিগুলি পরিচালনা করুন এবং কখনই ক্রাশ হবে না। ৩. দুজনের মধ্যে ভারসাম্যযুক্ত পন্থা
সংখ্যা 7: ত্রুটির দৃশ্যমানতা বাড়াতে একটি পরিপক্ক লগার ব্যবহার করুন
টিএল; ডিআর: উইনস্টন, বুনিয়ান বা লগ ৪ জে এর মতো পরিপক্ক লগিং সরঞ্জামগুলির একটি সেট ত্রুটি আবিষ্কার এবং বোঝার গতি বাড়িয়ে তুলবে। সুতরাং কনসোল.লগ সম্পর্কে ভুলবেন না
অন্যথায়: কনসোল.লগগুলির মাধ্যমে বা ম্যানুয়ালি মেশিন টেক্সট ফাইলের মাধ্যমে অনুসন্ধানের সরঞ্জামগুলি বা কোনও শালীন লগ ভিউয়ারের সাহায্যে আপনাকে দেরি না হওয়া পর্যন্ত কাজের মধ্যে ব্যস্ত রাখতে পারে
কোড উদাহরণ - ক্রিয়ায় উইনস্টন লগার
//your centralized logger object
var logger = new winston.Logger({
level: 'info',
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'somefile.log' })
]
});
//custom code somewhere using the logger
logger.log('info', 'Test Log Message with some parameter %s', 'some parameter', { anything: 'This is metadata' });
ব্লগের উদ্ধৃতি: "কয়েকটি প্রয়োজনীয়তা সনাক্ত করতে দিন (লগারের জন্য):" (ব্লগ স্ট্রংব্লগ থেকে)
… কয়েকটি প্রয়োজনীয়তা সনাক্ত করতে দিন (লগারের জন্য): 1. প্রতিটি লগ লাইনের সময় স্ট্যাম্প করুন। এটি একটি স্ব স্ব বিবৃতিমূলক - প্রতিটি লগ এন্ট্রি কখন হয়েছিল তা আপনার জানা উচিত। ২. লগিং ফর্ম্যাটটি মানুষের পাশাপাশি মেশিনগুলির দ্বারা সহজে হজমযোগ্য হওয়া উচিত। ৩. একাধিক কনফিগারযোগ্য গন্তব্য প্রবাহের জন্য অনুমতি দেয়। উদাহরণস্বরূপ, আপনি কোনও ফাইলে ট্রেস লগ লিখতে পারেন তবে কোনও ত্রুটি দেখা দিলে একই ফাইলটিতে লিখুন, তারপরে ত্রুটি ফাইলে লিখুন এবং একই সাথে একটি ইমেল প্রেরণ করুন…
সংখ্যা 8: এপিএম পণ্যগুলি ব্যবহার করে ত্রুটি এবং ডাউনটাইম আবিষ্কার করুন
টিএল; ডিআর: মনিটরিং এবং পারফরম্যান্সের পণ্যগুলি (ওরফে এপিএম) আপনার কোডবেস বা এপিআইর সক্রিয়ভাবে গেজ করে যাতে তারা আপনাকে হারিয়ে যাওয়া ত্রুটি, ক্র্যাশ এবং ধীর অংশগুলি স্বয়ংক্রিয়ভাবে হাইলাইট করতে পারে they
অন্যথায়: আপনি API এর কার্যকারিতা এবং ডাউনটাইমগুলি পরিমাপ করার জন্য দুর্দান্ত প্রচেষ্টা ব্যয় করতে পারেন, সম্ভবত আপনি কখনও সচেতন হতে পারবেন না যে আসল বিশ্বের দৃশ্যের আওতায় আপনার সবচেয়ে ধীরতম কোড অংশগুলি কী কী এবং এটি কীভাবে ইউএক্সকে প্রভাবিত করে
ব্লগের উদ্ধৃতি: "এপিএম পণ্য বিভাগ" (ইয়োনি গোল্ডবার্গ ব্লগ থেকে)
"... এপিএম পণ্যগুলি তিনটি প্রধান বিভাগ গঠন করে: ১. ওয়েবসাইট বা এপিআই মনিটরিং - এইচটিটিপি অনুরোধের মাধ্যমে অব্যাহতভাবে আপটাইম এবং কর্মক্ষমতা নিরীক্ষণ করে এমন বাহ্যিক পরিষেবাগুলি few কয়েক মিনিটের মধ্যে সেটআপ করা যেতে পারে Following নীচে কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: পিংডম, আপটাইম রোবট এবং নিউ রেলিক
২ কোড ইন্সট্রুমেন্টেশন - পণ্য পরিবারে ধীরে কোড সনাক্তকরণ, ব্যতিক্রম পরিসংখ্যান, কর্মক্ষমতা নিরীক্ষণ এবং আরও অনেক কিছু উপকারের জন্য আবেদনের মধ্যে কোনও এজেন্ট এম্বেড করা দরকার Following নীচে কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: নতুন রেলিক, অ্যাপ ডায়নামিক্স
৩. অপারেশনাল ইন্টেলিজেন্স ড্যাশবোর্ড -এই পণ্যগুলির লাইনটি ম্যাট্রিক্স এবং কিউরেটেড কন্টেন্টের সাহায্যে অপস দলকে সুবিধার্থে ফোকাস করে যা সহজেই অ্যাপ্লিকেশন কর্মক্ষমতা শীর্ষে থাকতে সহায়তা করে। এটি সাধারণত একাধিক তথ্যের উত্স (অ্যাপ্লিকেশন লগস, ডিবি লগস, সার্ভার লগ, ইত্যাদি) এবং ডানবোর্ড নকশার কাজকে সামনে রেখে জড়িত। নিম্নলিখিত কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: ডেটাডোগ, স্প্লঙ্ক "
উপরেরটি একটি সংক্ষিপ্ত সংস্করণ - এখানে আরও সেরা অনুশীলন এবং উদাহরণ দেখুন