परिचय
नेटवर्क एरर लॉगिंग (एनईएल), किसी ऑरिजिन से क्लाइंट-साइड नेटवर्क की गड़बड़ियां इकट्ठा करने का एक तरीका है.
यह NEL एचटीटीपी रिस्पॉन्स हेडर का इस्तेमाल करके, ब्राउज़र को नेटवर्क की गड़बड़ियों को इकट्ठा करने के लिए कहता है. इसके बाद, गड़बड़ियों की जानकारी सर्वर को देने के लिए, Reporting API के साथ इंटिग्रेट करता है.
लेगसी Reporting API के बारे में खास जानकारी
लेगसी Report-To हेडर
Reporting API के लेगसी वर्शन का इस्तेमाल करने के लिए, आपको Report-To एचटीटीपी रिस्पॉन्स हेडर सेट करना होगा. इसकी वैल्यू एक ऑब्जेक्ट होती है, जो ब्राउज़र के लिए एंडपॉइंट ग्रुप के बारे में बताती है. इससे ब्राउज़र को गड़बड़ियों की रिपोर्ट करने में मदद मिलती है:
Report-To:
{
"max_age": 10886400,
"endpoints": [{
"url": "https://analytics.provider.com/browser-errors"
}]
}
अगर आपका एंडपॉइंट यूआरएल आपकी साइट के अलावा किसी दूसरी साइट पर मौजूद है, तो एंडपॉइंट को सीओआरएस प्रीफ़्लाइट अनुरोधों के साथ काम करना चाहिए. (उदाहरण के लिए, 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 सेकंड के लिए भेज सके.
यह ध्यान रखना ज़रूरी है कि पेज से किए गए सभी एचटीटीपी अनुरोधों (इमेज, स्क्रिप्ट वगैरह के लिए) को अनदेखा कर दिया जाता है. मुख्य पेज के रिस्पॉन्स के दौरान,
कॉन्फ़िगरेशन सेटअप किया जाता है.
हेडर फ़ील्ड के बारे में जानकारी
हर एंडपॉइंट कॉन्फ़िगरेशन में group नाम, max_age, और endpoints
अरे शामिल होता है. include_subdomains फ़ील्ड का इस्तेमाल करके, गड़बड़ियों की रिपोर्ट करते समय यह भी चुना जा सकता है कि सबडोमेन को शामिल करना है या नहीं.
| फ़ील्ड | टाइप | ब्यौरा |
|---|---|---|
group |
स्ट्रिंग | ज़रूरी नहीं. अगर group का नाम नहीं दिया गया है, तो एंडपॉइंट को "डिफ़ॉल्ट" नाम दिया जाता है. |
max_age |
संख्या | ज़रूरी है. एक धनात्मक पूर्णांक, जो एंडपॉइंट के लाइफ़टाइम को सेकंड में तय करता है. "0" वैल्यू होने पर, एंडपॉइंट ग्रुप को उपयोगकर्ता एजेंट के रिपोर्टिंग कैश से हटा दिया जाएगा. |
endpoints |
Array<Object> | ज़रूरी है. JSON ऑब्जेक्ट का एक कलेक्शन, जो आपकी रिपोर्ट इकट्ठा करने वाले टूल का असल यूआरएल बताता है. |
include_subdomains |
बूलियन | ज़रूरी नहीं. यह एक बूलियन है, जो मौजूदा ऑरिजिन के होस्ट के सभी सबडोमेन के लिए एंडपॉइंट ग्रुप को चालू करता है. अगर इसे शामिल नहीं किया जाता है या "सही है" के अलावा कुछ और सेट किया जाता है, तो सबडोमेन की रिपोर्ट एंडपॉइंट को नहीं भेजी जाती है. |
group नाम एक यूनीक नाम है. इसका इस्तेमाल, किसी स्ट्रिंग को एंडपॉइंट से जोड़ने के लिए किया जाता है. इस नाम का इस्तेमाल, Reporting API के साथ इंटिग्रेट होने वाली अन्य जगहों पर करें, ताकि किसी खास एंडपॉइंट ग्रुप के बारे में बताया जा सके.
max-age फ़ील्ड भी ज़रूरी है. इससे यह तय होता है कि ब्राउज़र को एंडपॉइंट का इस्तेमाल कब तक करना चाहिए और गड़बड़ियों की रिपोर्ट कब तक करनी चाहिए.
endpoints फ़ील्ड एक ऐरे है. इसका इस्तेमाल, फ़ेलओवर और लोड बैलेंसिंग की सुविधाएं देने के लिए किया जाता है. फ़ेलओवर और लोड बैलेंसिंग सेक्शन देखें. यह ध्यान रखना ज़रूरी है कि ब्राउज़र सिर्फ़ एक एंडपॉइंट चुनेगा, भले ही ग्रुप की सूची में endpoints में कई कलेक्टर शामिल हों. अगर आपको एक साथ कई सर्वर पर रिपोर्ट भेजनी है, तो आपके बैकएंड को रिपोर्ट फ़ॉरवर्ड करनी होंगी.
ब्राउज़र, रिपोर्ट कैसे भेजता है?
ब्राउज़र, समय-समय पर रिपोर्ट को बैच में बांटता है और उन्हें आपके कॉन्फ़िगर किए गए रिपोर्टिंग एंडपॉइंट पर भेजता है.
रिपोर्ट भेजने के लिए, ब्राउज़र POST के साथ Content-Type: application/reports+json का अनुरोध जारी करता है. साथ ही, इसमें कैप्चर की गई चेतावनियों/गड़बड़ियों का कलेक्शन शामिल होता है.
ब्राउज़र, रिपोर्ट कब भेजता है?
रिपोर्ट, आपके ऐप्लिकेशन से आउट-ऑफ़-बैंड डिलीवर की जाती हैं. इसका मतलब है कि ब्राउज़र यह कंट्रोल करता है कि रिपोर्ट आपके सर्वर पर कब भेजी जाएं.
ब्राउज़र, कतार में मौजूद रिपोर्ट को सबसे सही समय पर डिलीवर करने की कोशिश करता है. ऐसा हो सकता है कि रिपोर्ट तैयार होते ही भेज दी जाएं, ताकि डेवलपर को समय पर सुझाव मिल सके. हालांकि, अगर ब्राउज़र ज़्यादा प्राथमिकता वाले काम को प्रोसेस करने में व्यस्त है, तो रिपोर्ट भेजने में देरी हो सकती है. इसके अलावा, अगर उपयोगकर्ता उस समय धीमे और/या भीड़भाड़ वाले नेटवर्क पर है, तो भी रिपोर्ट भेजने में देरी हो सकती है. अगर उपयोगकर्ता किसी साइट पर बार-बार आता है, तो ब्राउज़र उस साइट के बारे में रिपोर्ट भेजने को प्राथमिकता दे सकता है.
Reporting API का इस्तेमाल करने पर, परफ़ॉर्मेंस से जुड़ी कोई समस्या नहीं होती या बहुत कम होती है. जैसे, आपके ऐप्लिकेशन के साथ नेटवर्क की समस्या. यह कंट्रोल करने का भी कोई तरीका नहीं है कि ब्राउज़र, सूची में मौजूद रिपोर्ट कब भेजेगा.
एक से ज़्यादा एंडपॉइंट कॉन्फ़िगर करना
एक ही रिस्पॉन्स में कई 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"
}]
}
या उन्हें एक ही एचटीटीपी हेडर में जोड़कर:
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 वैल्यू के हिसाब से कैश मेमोरी में सेव करता है. साथ ही, कंसोल की उन सभी खराब चेतावनियों/गड़बड़ियों को आपके यूआरएल पर भेजता है.
फ़ेलओवर और लोड बैलेंसिंग
ज़्यादातर मामलों में, हर ग्रुप के लिए एक यूआरएल कलेक्टर कॉन्फ़िगर किया जाएगा. हालांकि, रिपोर्टिंग से काफ़ी ट्रैफ़िक जनरेट हो सकता है. इसलिए, स्पेसिफ़िकेशन में डीएनएस एसआरवी रिकॉर्ड से प्रेरित फ़ेलओवर और लोड-बैलेंसिंग की सुविधाएं शामिल हैं.
ब्राउज़र, किसी ग्रुप में ज़्यादा से ज़्यादा एक एंडपॉइंट पर रिपोर्ट डिलीवर करने की पूरी कोशिश करेगा. लोड को बांटने के लिए, एंडपॉइंट को 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}
]
}
नेटवर्क की गड़बड़ी को लॉग करने की सुविधा सेट अप करना
सेटअप
एनईएल का इस्तेमाल करने के लिए, Report-To हेडर को ऐसे कलेक्टर के साथ सेट अप करें जो नाम वाले ग्रुप का इस्तेमाल करता हो:
Report-To: {
...
}, {
"group": "network-errors",
"max_age": 2592000,
"endpoints": [{
"url": "https://analytics.provider.com/networkerrors"
}]
}
इसके बाद, गड़बड़ियों की जानकारी इकट्ठा करने के लिए, 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के एनईएल कलेक्टर को सूचना दी गईexample.comके एनईएल कलेक्टर को सूचना नहीं दी गई है
आम तौर पर, एनईएल सर्वर-साइड लॉग को फिर से जनरेट करता है. ये लॉग, क्लाइंट पर जनरेट होते हैं.
example.com के पास foobar.com के सर्वर लॉग का ऐक्सेस नहीं है. इसलिए, उसके पास एनईएल रिपोर्ट का भी ऐक्सेस नहीं है.
डीबगिंग रिपोर्ट के कॉन्फ़िगरेशन
अगर आपको अपने सर्वर पर रिपोर्ट नहीं दिख रही हैं, तो chrome://net-export/ पर जाएं. यह पेज, यह पुष्टि करने के लिए काम का है कि चीज़ें सही तरीके से कॉन्फ़िगर की गई हैं और रिपोर्ट सही तरीके से भेजी जा रही हैं.
ReportingObserver के बारे में क्या जानकारी है?
ReportingObserver, शिकायत करने का एक मिलता-जुलता, लेकिन अलग तरीका है. यह JavaScript कॉल पर आधारित है.
इसका इस्तेमाल, नेटवर्क की गड़बड़ी को लॉग करने के लिए नहीं किया जा सकता. ऐसा इसलिए, क्योंकि नेटवर्क की गड़बड़ियों को JavaScript की मदद से नहीं पकड़ा जा सकता.
उदाहरण के लिए सर्वर
यहां Express का इस्तेमाल करने वाले Node सर्वर का उदाहरण दिया गया है. इसमें नेटवर्क की गड़बड़ियों के लिए रिपोर्टिंग को कॉन्फ़िगर करने का तरीका बताया गया है. साथ ही, नतीजे को कैप्चर करने के लिए एक खास हैंडलर बनाया गया है.
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}`);
});