নেটওয়ার্ক ত্রুটি লগিং (NEL)

ভূমিকা

নেটওয়ার্ক ত্রুটি লগিং (NEL) হল একটি মূল থেকে ক্লায়েন্ট-সাইড নেটওয়ার্ক ত্রুটিগুলি সংগ্রহ করার জন্য একটি প্রক্রিয়া।

এটি নেটওয়ার্ক ত্রুটিগুলি সংগ্রহ করতে ব্রাউজারকে বলার জন্য NEL HTTP প্রতিক্রিয়া শিরোনাম ব্যবহার করে, তারপরে একটি সার্ভারে ত্রুটিগুলি রিপোর্ট করতে রিপোর্টিং API এর সাথে সংহত করে৷

লিগ্যাসি রিপোর্টিং API এর ওভারভিউ

লিগ্যাসি রিপোর্টিং এপিআই ব্যবহার করতে, আপনাকে একটি Report-To HTTP প্রতিক্রিয়া শিরোনাম সেট করতে হবে। এর মান হল একটি বস্তু যা ব্রাউজারকে ত্রুটি রিপোর্ট করার জন্য একটি এন্ডপয়েন্ট গ্রুপ বর্ণনা করে:

Report-To:
{
    "max_age": 10886400,
    "endpoints": [{
    "url": "https://analytics.provider.com/browser-errors"
    }]
}

যদি আপনার এন্ডপয়েন্ট ইউআরএলটি আপনার সাইটের থেকে ভিন্ন উৎসে থাকে, তাহলে এন্ডপয়েন্টটি CORS প্রিফ্লাইট অনুরোধ সমর্থন করবে। (যেমন Access-Control-Allow-Origin: *; Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS; Access-Control-Allow-Headers: Content-Type, Authorization, Content-Length, X-Requested-With )।

উদাহরণে, আপনার প্রধান পৃষ্ঠার সাথে এই প্রতিক্রিয়া শিরোনামটি পাঠানো ব্রাউজারটিকে কনফিগার করে ব্রাউজার-উত্পাদিত সতর্কতাগুলিকে শেষবিন্দুতে রিপোর্ট করতে https://analytics.provider.com/browser-errors max_age সেকেন্ডের জন্য। এটা মনে রাখা গুরুত্বপূর্ণ যে পৃষ্ঠার (ছবি, স্ক্রিপ্ট ইত্যাদির জন্য) পরবর্তী সমস্ত HTTP অনুরোধ উপেক্ষা করা হয়। মূল পৃষ্ঠার প্রতিক্রিয়ার সময় কনফিগারেশন সেটআপ করা হয়।

হেডার ক্ষেত্রগুলির ব্যাখ্যা

প্রতিটি এন্ডপয়েন্ট কনফিগারেশনে একটি group নাম, max_age এবং endpoints অ্যারে থাকে। আপনি include_subdomains ক্ষেত্র ব্যবহার করে ত্রুটি প্রতিবেদন করার সময় সাবডোমেন বিবেচনা করবেন কিনা তাও চয়ন করতে পারেন।

মাঠ টাইপ বর্ণনা
group স্ট্রিং ঐচ্ছিক। যদি একটি group নাম নির্দিষ্ট করা না থাকে, তাহলে শেষ বিন্দুটিকে "ডিফল্ট" নাম দেওয়া হয়।
max_age সংখ্যা প্রয়োজন একটি অ-নেতিবাচক পূর্ণসংখ্যা যা সেকেন্ডে শেষ বিন্দুর জীবনকাল নির্ধারণ করে। "0" এর মান ব্যবহারকারী এজেন্টের রিপোর্টিং ক্যাশে থেকে এন্ডপয়েন্ট গ্রুপটিকে সরিয়ে দেবে।
endpoints অ্যারে<অবজেক্ট> প্রয়োজন JSON অবজেক্টের একটি অ্যারে যা আপনার রিপোর্ট সংগ্রাহকের প্রকৃত URL নির্দিষ্ট করে।
include_subdomains বুলিয়ান ঐচ্ছিক। একটি বুলিয়ান যা বর্তমান মূল হোস্টের সমস্ত সাবডোমেনের জন্য এন্ডপয়েন্ট গ্রুপকে সক্ষম করে। যদি বাদ দেওয়া হয় বা "সত্য" ব্যতীত অন্য কিছু, সাবডোমেনগুলি শেষ পয়েন্টে রিপোর্ট করা হয় না।

group নাম হল একটি অনন্য নাম যা একটি স্ট্রিংকে শেষবিন্দুর সাথে সংযুক্ত করতে ব্যবহৃত হয়। একটি নির্দিষ্ট এন্ডপয়েন্ট গোষ্ঠীকে উল্লেখ করার জন্য রিপোর্টিং API এর সাথে একীভূত হওয়া অন্য জায়গায় এই নামটি ব্যবহার করুন৷

max-age ক্ষেত্রটিও প্রয়োজনীয় এবং নির্দিষ্ট করে কতক্ষণ ব্রাউজারটি এন্ডপয়েন্ট ব্যবহার করবে এবং এতে ত্রুটির প্রতিবেদন করবে।

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

কিভাবে ব্রাউজার রিপোর্ট পাঠায়?

ব্রাউজার পর্যায়ক্রমে রিপোর্টগুলি ব্যাচ করে এবং আপনার কনফিগার করা রিপোর্টিং এন্ডপয়েন্টগুলিতে পাঠায়।

রিপোর্ট পাঠানোর জন্য, ব্রাউজারটি Content-Type: application/reports+json এবং ক্যাপচার করা সতর্কতা/ত্রুটির অ্যারে সমন্বিত একটি বডি সহ একটি POST অনুরোধ জারি করে।

ব্রাউজার কখন রিপোর্ট পাঠায়?

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

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

রিপোর্টিং এপিআই ব্যবহার করার সময় কোন পারফরম্যান্স উদ্বেগ নেই (যেমন আপনার অ্যাপের সাথে নেটওয়ার্ক বিরোধ)। ব্রাউজার কখন সারিবদ্ধ প্রতিবেদন পাঠায় তা নিয়ন্ত্রণ করার কোনো উপায়ও নেই।

একাধিক শেষ পয়েন্ট কনফিগার করা হচ্ছে

একটি একক প্রতিক্রিয়া একাধিক Report-To শিরোনাম পাঠিয়ে একসাথে একাধিক শেষ পয়েন্ট কনফিগার করতে পারে:

Report-To: {
             "group": "default",
             "max_age": 10886400,
             "endpoints": [{
               "url": "https://example.com/browser-reports"
             }]
           }
Report-To: {
             "group": "network-errors-endpoint",
             "max_age": 10886400,
             "endpoints": [{
               "url": "https://example.com/network-errors"
             }]
           }

অথবা একটি একক HTTP শিরোনামে তাদের একত্রিত করে:

Report-To: {
             "group": "network-errors-endpoint",
             "max_age": 10886400,
             "endpoints": [{
               "url": "https://example.com/network-errors"
             }]
           },
           {
             "max_age": 10886400,
             "endpoints": [{
               "url": "https://example.com/browser-errors"
             }]
           }

একবার আপনি Report-To শিরোনামটি পাঠিয়ে দিলে, ব্রাউজারটি তাদের max_age মান অনুযায়ী শেষ পয়েন্টগুলিকে ক্যাশ করে এবং আপনার URLগুলিতে সেই সমস্ত বাজে কনসোল সতর্কতা/ত্রুটি পাঠায়৷

ব্যর্থতা এবং লোড ব্যালেন্সিং

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

ব্রাউজার একটি গ্রুপের সর্বাধিক একটি শেষ পয়েন্টে একটি প্রতিবেদন সরবরাহ করার জন্য যথাসাধ্য চেষ্টা করবে। লোড বিতরণ করার জন্য এন্ডপয়েন্টগুলিকে একটি weight নির্ধারণ করা যেতে পারে, প্রতিটি এন্ডপয়েন্ট রিপোর্টিং ট্র্যাফিকের একটি নির্দিষ্ট ভগ্নাংশ গ্রহণ করে। ফলব্যাক সংগ্রাহক সেট আপ করার জন্য এন্ডপয়েন্টগুলিকে priority দেওয়া যেতে পারে।

প্রাথমিক সংগ্রাহকগুলিতে আপলোড ব্যর্থ হলেই ফলব্যাক সংগ্রাহকদের চেষ্টা করা হয়।

উদাহরণ : https://backup.com/reports এ একটি ফলব্যাক সংগ্রাহক তৈরি করুন :

Report-To: {
             "group": "endpoint-1",
             "max_age": 10886400,
             "endpoints": [
               {"url": "https://example.com/reports", "priority": 1},
               {"url": "https://backup.com/reports", "priority": 2}
             ]
           }

নেটওয়ার্ক ত্রুটি লগিং সেট আপ করা হচ্ছে৷

সেটআপ

NEL ব্যবহার করতে, একটি নামযুক্ত গ্রুপ ব্যবহার করে এমন একটি সংগ্রাহকের সাথে Report-To শিরোনাম সেট আপ করুন:

Report-To: {
    ...
  }, {
    "group": "network-errors",
    "max_age": 2592000,
    "endpoints": [{
      "url": "https://analytics.provider.com/networkerrors"
    }]
  }

এরপরে, ত্রুটি সংগ্রহ শুরু করতে NEL প্রতিক্রিয়া শিরোনামটি পাঠান। যেহেতু NEL একটি মূলের জন্য অপ্ট-ইন করেছে, তাই আপনাকে শুধুমাত্র একবার হেডার পাঠাতে হবে। NEL এবং Report-To উভয়ই একই উত্সের ভবিষ্যতের অনুরোধগুলিতে প্রযোজ্য হবে এবং সংগ্রাহক সেট আপ করতে ব্যবহৃত max_age মান অনুযায়ী ত্রুটিগুলি সংগ্রহ করা চালিয়ে যাবে৷

শিরোনাম মান একটি JSON অবজেক্ট হওয়া উচিত যাতে একটি max_age এবং report_to ক্ষেত্র থাকে। আপনার নেটওয়ার্ক ত্রুটি সংগ্রাহকের গোষ্ঠীর নাম উল্লেখ করতে পরবর্তীটি ব্যবহার করুন:

GET /index.html HTTP/1.1
NEL: {"report_to": "network-errors", "max_age": 2592000}

উপসম্পদ

উদাহরণ : যদি example.com foobar.com/cat.gif লোড করে এবং সেই সম্পদ লোড হতে ব্যর্থ হয়:

  • foobar.com এর NEL সংগ্রাহককে অবহিত করা হয়েছে
  • example.com এর NEL সংগ্রাহককে অবহিত করা হয়নি

থাম্বের নিয়ম হল যে NEL সার্ভার-সাইড লগগুলি পুনরুত্পাদন করে, শুধুমাত্র ক্লায়েন্টে তৈরি করা হয়।

যেহেতু example.com foobar.com এর সার্ভার লগগুলিতে কোনও দৃশ্যমানতা নেই, তাই এটির NEL রিপোর্টগুলিতেও কোনও দৃশ্যমানতা নেই।

ডিবাগিং রিপোর্ট কনফিগারেশন

আপনি যদি আপনার সার্ভারে রিপোর্টগুলি দেখতে না পান, chrome://net-export/ এ যান। জিনিসগুলি সঠিকভাবে কনফিগার করা হয়েছে এবং রিপোর্টগুলি সঠিকভাবে পাঠানো হচ্ছে তা যাচাই করার জন্য সেই পৃষ্ঠাটি কার্যকর।

ReportingObserver সম্পর্কে কি?

ReportingObserver একটি সম্পর্কিত, কিন্তু ভিন্ন রিপোর্টিং প্রক্রিয়া। এটি জাভাস্ক্রিপ্ট কলের উপর ভিত্তি করে। নেটওয়ার্ক ত্রুটি লগিং এর জন্য এটি উপযুক্ত নয় , কারণ নেটওয়ার্ক ত্রুটিগুলি জাভাস্ক্রিপ্টের মাধ্যমে আটকানো যায় না৷

উদাহরণ সার্ভার

নীচে একটি উদাহরণ নোড সার্ভার যা এক্সপ্রেস ব্যবহার করে। এটা দেখায় কিভাবে নেটওয়ার্ক ত্রুটির জন্য রিপোর্টিং কনফিগার করতে হয়, এবং ফলাফল ক্যাপচার করার জন্য একটি ডেডিকেটেড হ্যান্ডলার তৈরি করে।

const express = require('express');

const app = express();
app.use(
  express.json({
    type: ['application/json', 'application/reports+json'],
  }),
);
app.use(express.urlencoded());

app.get('/', (request, response) => {
  // Note: report_to and not report-to for NEL.
  response.set('NEL', `{"report_to": "network-errors", "max_age": 2592000}`);

  // The Report-To header tells the browser where to send network errors.
  // The default group (first example below) captures interventions and
  // deprecation reports. Other groups, like the network-error group, are referenced by their "group" name.
  response.set(
    'Report-To',
    `{
    "max_age": 2592000,
    "endpoints": [{
      "url": "https://reporting-observer-api-demo.glitch.me/reports"
    }],
  }, {
    "group": "network-errors",
    "max_age": 2592000,
    "endpoints": [{
      "url": "https://reporting-observer-api-demo.glitch.me/network-reports"
    }]
  }`,
  );

  response.sendFile('./index.html');
});

function echoReports(request, response) {
  // Record report in server logs or otherwise process results.
  for (const report of request.body) {
    console.log(report.body);
  }
  response.send(request.body);
}

app.post('/network-reports', (request, response) => {
  console.log(`${request.body.length} Network error reports:`);
  echoReports(request, response);
});

const listener = app.listen(process.env.PORT, () => {
  console.log(`Your app is listening on port ${listener.address().port}`);
});

আরও পড়া