| प्लैटफ़ॉर्म चुनें: | iOS+ Android Flutter Unity |
किसी समस्या पर क्लिक करके, उसकी पूरी जानकारी वाली इवेंट रिपोर्ट देखी जा सकती है. इसके लिए, Firebase कंसोल के DevOps और यूज़र ऐक्टिविटी > Crashlytics डैशबोर्ड पर जाएं. इन रिपोर्ट को अपनी ज़रूरत के मुताबिक बनाया जा सकता है. इससे आपको यह समझने में मदद मिलेगी कि आपके ऐप्लिकेशन में क्या हो रहा है. साथ ही, Crashlytics को रिपोर्ट किए गए इवेंट की स्थितियों के बारे में भी जानकारी मिलेगी.
कस्टम कुंजियां, कस्टम लॉग मैसेज, और यूज़र आइडेंटिफ़ायर लॉग करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रुमेंट करें.
Crashlytics को अपवादों की शिकायत करें.
अगर आपका ऐप्लिकेशन Google Analytics के लिए Firebase SDK टूल का इस्तेमाल करता है, तो ब्रेडक्रंब लॉग अपने-आप जनरेट हो जाते हैं. इन लॉग से आपको उपयोगकर्ता की उन कार्रवाइयों के बारे में पता चलता है जिनकी वजह से आपके ऐप्लिकेशन में Crashlytics से इकट्ठा किया गया इवेंट ट्रिगर हुआ.
क्रैश की रिपोर्ट अपने-आप भेजने की सुविधा बंद करें और अपने उपयोगकर्ताओं के लिए, ऑप्ट-इन रिपोर्टिंग की सुविधा चालू करें. ध्यान दें कि डिफ़ॉल्ट रूप से, Crashlytics आपके ऐप्लिकेशन के सभी उपयोगकर्ताओं के लिए, क्रैश रिपोर्ट अपने-आप इकट्ठा करता है.
पसंद के मुताबिक बटन जोड़ना
कस्टम कुंजियों की मदद से, आपको ऐप्लिकेशन के क्रैश होने से पहले की स्थिति के बारे में जानकारी मिलती है. आपके पास अपनी क्रैश रिपोर्ट के साथ, अपनी पसंद के की-वैल्यू पेयर जोड़ने का विकल्प होता है. इसके बाद, कस्टम कुंजियों का इस्तेमाल करके, Firebase कंसोल के DevOps और यूज़र ऐक्टिविटी > Crashlytics डैशबोर्ड में क्रैश रिपोर्ट खोजी और फ़िल्टर की जा सकती हैं.
किसी कस्टम कुंजी से मैच होने वाली समस्याओं को खोजा जा सकता है.
कंसोल में किसी खास समस्या की समीक्षा करते समय, हर इवेंट (कुंजियां सब-टैब) के लिए उससे जुड़ी कस्टम कुंजियां देखी जा सकती हैं. साथ ही, कस्टम कुंजियों (पेज के सबसे ऊपर मौजूद फ़िल्टर मेन्यू) के हिसाब से इवेंट को फ़िल्टर भी किया जा सकता है.
की-वैल्यू पेयर सेट करने के लिए, setCustomValue तरीके का इस्तेमाल करें. उदाहरण के लिए:
Swift
// Set int_key to 100. Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set str_key to "hello". Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")
Objective-C
इंटीजर, बूलियन या फ़्लोट सेट करते समय, वैल्यू को @(value) के तौर पर बॉक्स करें.
// Set int_key to 100. [[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"]; // Set str_key to "hello". [[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];
किसी मौजूदा बटन की वैल्यू में भी बदलाव किया जा सकता है. इसके लिए, बटन को कॉल करें और उसे किसी दूसरी वैल्यू पर सेट करें. उदाहरण के लिए:
Swift
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set int_key to 50 from 100. Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")
Objective-C
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"]; // Set int_key to 50 from 100. [[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];
setCustomKeysAndValues तरीके का इस्तेमाल करके, एक साथ कई की-वैल्यू पेयर जोड़ें. इसमें NSDictionary को एकमात्र पैरामीटर के तौर पर इस्तेमाल करें:
Swift
let keysAndValues = [ "string key" : "string value", "string key 2" : "string value 2", "boolean key" : true, "boolean key 2" : false, "float key" : 1.01, "float key 2" : 2.02 ] as [String : Any] Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)
Objective-C
NSDictionary *keysAndValues = @{@"string key" : @"string value", @"string key 2" : @"string value 2", @"boolean key" : @(YES), @"boolean key 2" : @(NO), @"float key" : @(1.01), @"float key 2" : @(2.02)}; [[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];
कस्टम लॉग मैसेज जोड़ना
ऐप्लिकेशन क्रैश होने से पहले हुए इवेंट के बारे में ज़्यादा जानकारी पाने के लिए, अपने ऐप्लिकेशन में कस्टम Crashlytics लॉग जोड़े जा सकते हैं. Crashlytics, लॉग को आपके क्रैश डेटा से जोड़ता है. साथ ही, किसी समस्या की जानकारी देखने पर, उन्हें लॉग टैब में दिखाता है. अपनी सभी समस्याएं देखने के लिए, Firebase कंसोल के DevOps और यूज़र ऐक्टिविटी > Crashlytics डैशबोर्ड पर जाएं.
Swift
समस्याओं का पता लगाने के लिए, log() या log(format:, arguments:) का इस्तेमाल करें. अगर आपको मैसेज के साथ काम का लॉग आउटपुट चाहिए, तो log() को पास किया जाने वाला ऑब्जेक्ट, CustomStringConvertible प्रॉपर्टी के मुताबिक होना चाहिए. log(), ऑब्जेक्ट के लिए तय की गई ब्यौरे की प्रॉपर्टी दिखाता है. उदाहरण के लिए:
Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")
.log(format:, arguments:), getVaList() को कॉल करने से मिलने वाली वैल्यू को फ़ॉर्मैट करता है. उदाहरण के लिए:
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))
log() या log(format:, arguments:) को इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, Crashlytics
रेफ़रंस दस्तावेज़ देखें.
Objective-C
समस्याओं का पता लगाने के लिए, log या logWithFormat का इस्तेमाल करें. ध्यान दें कि अगर आपको मैसेज के साथ काम का लॉग आउटपुट चाहिए, तो आपको दोनों में से किसी भी तरीके में पास किए जाने वाले ऑब्जेक्ट को description इंस्टेंस प्रॉपर्टी को बदलना होगा.
उदाहरण के लिए:
[[FIRCrashlytics crashlytics] log:@"Simple string message"]; [[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict]; [[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];
log और logWithFormat को इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, Crashlytics रेफ़रंस दस्तावेज़ देखें.
यूज़र आइडेंटिफ़ायर सेट करना
किसी समस्या का पता लगाने के लिए, अक्सर यह जानना मददगार होता है कि आपके किन उपयोगकर्ताओं को ऐप्लिकेशन क्रैश होने की समस्या का सामना करना पड़ा. Crashlytics में, ऐप्लिकेशन क्रैश होने की रिपोर्ट में उपयोगकर्ताओं की पहचान ज़ाहिर किए बिना उनकी पहचान करने का तरीका शामिल है.
अपनी रिपोर्ट में यूज़र आईडी जोड़ने के लिए, हर उपयोगकर्ता को आईडी नंबर, टोकन या हैश वैल्यू के तौर पर एक यूनीक आइडेंटिफ़ायर असाइन करें:
Swift
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
अगर आपको यूज़र आइडेंटिफ़ायर सेट करने के बाद उसे हटाना है, तो वैल्यू को खाली स्ट्रिंग पर रीसेट करें. यूज़र आइडेंटिफ़ायर को मिटाने से, Crashlytics के मौजूदा रिकॉर्ड नहीं मिटते. अगर आपको किसी यूज़र आईडी से जुड़े रिकॉर्ड मिटाने हैं, तो Firebase की सहायता टीम से संपर्क करें.
नुकसान न पहुंचाने वाली गड़बड़ियों की शिकायत करना
Crashlytics, आपके ऐप्लिकेशन के क्रैश होने की जानकारी अपने-आप देने के साथ-साथ, आपको गंभीर नहीं होने वाले अपवादों को रिकॉर्ड करने की सुविधा भी देता है. साथ ही, अगली बार ऐप्लिकेशन लॉन्च होने पर, आपको उनकी जानकारी भेजता है.
recordError तरीके का इस्तेमाल करके, NSError ऑब्जेक्ट रिकॉर्ड करके, नॉन-फ़ेटल एक्सेप्शन रिकॉर्ड किए जा सकते हैं. recordError, [NSThread callStackReturnAddresses] को कॉल करके थ्रेड के कॉल स्टैक को कैप्चर करता है.
Swift
Crashlytics.crashlytics().record(error: error)
Objective-C
[[FIRCrashlytics crashlytics] recordError:error];
recordError तरीके का इस्तेमाल करते समय, NSError के स्ट्रक्चर को समझना ज़रूरी है. साथ ही, यह जानना भी ज़रूरी है कि Crashlytics, क्रैश को ग्रुप करने के लिए डेटा का इस्तेमाल कैसे करता है. recordError तरीके का गलत इस्तेमाल करने से, ऐप्लिकेशन के काम करने के तरीके में गड़बड़ी हो सकती है. साथ ही, इसकी वजह से Crashlytics आपके ऐप्लिकेशन के लिए लॉग की गई गड़बड़ियों की रिपोर्टिंग को सीमित कर सकता है.
NSError ऑब्जेक्ट में तीन आर्ग्युमेंट होते हैं:
domain: Stringcode: IntuserInfo: [AnyHashable : Any]? = nil
गंभीर क्रैश को स्टैक ट्रेस विश्लेषण के ज़रिए ग्रुप किया जाता है. हालांकि, लॉग की गई गड़बड़ियों को domain और code के हिसाब से ग्रुप किया जाता है. यह क्रैश और लॉग की गई गड़बड़ियों के बीच
एक अहम अंतर है. उदाहरण के लिए:
Swift
let userInfo = [ NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""), NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""), "ProductID": "123456", "View": "MainView" ] let error = NSError.init(domain: NSCocoaErrorDomain, code: -1001, userInfo: userInfo)
Objective-C
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil), NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil), @"ProductID": @"123456", @"View": @"MainView", }; NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:-1001 userInfo:userInfo];
ऊपर दी गई गड़बड़ी को लॉग करने पर, एक नई समस्या पैदा होती है. इसे NSSomeErrorDomain और -1001 के हिसाब से ग्रुप किया जाता है. एक ही डोमेन और कोड वैल्यू का इस्तेमाल करने वाली अन्य लॉग की गई गड़बड़ियों को एक ही समस्या के तहत ग्रुप किया जाता है. userInfo ऑब्जेक्ट में मौजूद डेटा को की-वैल्यू पेयर में बदला जाता है. साथ ही, इसे किसी समस्या के अंदर मौजूद कुंजियों/लॉग सेक्शन में दिखाया जाता है.
लॉग और कस्टम बटन
क्रैश रिपोर्ट की तरह ही, NSError में ज़्यादा जानकारी जोड़ने के लिए, लॉग और कस्टम पासकोड एम्बेड किए जा सकते हैं. हालांकि, क्रैश और लॉग की गई गड़बड़ियों के साथ अटैच किए गए लॉग में अंतर होता है. जब कोई ऐप्लिकेशन क्रैश होता है और उसे फिर से लॉन्च किया जाता है, तो Crashlytics डिस्क से वे लॉग वापस लाता है जो क्रैश होने के समय तक लिखे गए थे. NSError को लॉग करने पर, ऐप्लिकेशन तुरंत बंद नहीं होता. ऐसा इसलिए, क्योंकि Crashlytics, लॉग की गई गड़बड़ी की रिपोर्ट को अगली बार ऐप्लिकेशन लॉन्च होने पर ही भेजता है. साथ ही, डिस्क पर लॉग के लिए तय की गई जगह को सीमित रखना ज़रूरी है. इसलिए, NSError रिकॉर्ड होने के बाद, ज़रूरत के मुताबिक लॉग किए जा सकते हैं, ताकि Crashlytics के डिवाइस से रिपोर्ट भेजने तक, काम के सभी लॉग रोटेट हो जाएं. अपने ऐप्लिकेशन में NSErrors को लॉग करते समय और लॉग और कस्टम कुंजियों का इस्तेमाल करते समय, इस संतुलन को ध्यान में रखें.
प्रदर्शन संबंधी विचार
ध्यान रखें कि NSError को लॉग करना काफ़ी महंगा हो सकता है. कॉल करने के समय, Crashlytics स्टैक अनवाइंडिंग नाम की प्रोसेस का इस्तेमाल करके, मौजूदा थ्रेड के कॉल स्टैक को कैप्चर करता है. इस प्रोसेस में सीपीयू और I/O का ज़्यादा इस्तेमाल हो सकता है. खास तौर पर, उन आर्किटेक्चर पर जो DWARF अनवाइंडिंग (arm64 और x86) के साथ काम करते हैं.
अनवाइंड की प्रोसेस पूरी होने के बाद, जानकारी को डिस्क पर सिंक्रोनस तरीके से लिखा जाता है.
इससे, अगली लाइन के क्रैश होने पर डेटा को नुकसान नहीं पहुंचता.
इस एपीआई को बैकग्राउंड थ्रेड पर कॉल करना सुरक्षित है. हालांकि, ध्यान रखें कि इस कॉल को किसी दूसरी सूची में भेजने से, मौजूदा स्टैक ट्रेस का कॉन्टेक्स्ट मिट जाता है.
NSExceptions के बारे में क्या?
Crashlytics, NSException के इंस्टेंस को सीधे तौर पर लॉग और रिकॉर्ड करने की सुविधा नहीं देता. आम तौर पर, Cocoa और Cocoa Touch API, अपवादों से सुरक्षित नहीं होते. इसका मतलब है कि @catch का इस्तेमाल करने से, आपकी प्रोसेस पर अनचाहे और गंभीर असर पड़ सकते हैं. भले ही, इसका इस्तेमाल बहुत सावधानी से किया गया हो. आपको अपने कोड में कभी भी @catch स्टेटमेंट का इस्तेमाल नहीं करना चाहिए. इस विषय पर Apple का दस्तावेज़ देखें.
स्टैक ट्रेस को पसंद के मुताबिक बनाना
अगर आपका ऐप्लिकेशन C++ या Unity जैसे नॉन-नेटिव एनवायरमेंट में चलता है, तो Exception Model API का इस्तेमाल करके, ऐप्लिकेशन के नेटिव एक्सेप्शन फ़ॉर्मैट में क्रैश मेटाडेटा की रिपोर्ट की जा सकती है. रिपोर्ट किए गए अपवादों को नॉन-फ़ेटल के तौर पर मार्क किया जाता है.
Swift
var ex = ExceptionModel(name:"FooException", reason:"There was a foo.") ex.stackTrace = [ StackFrame(symbol:"makeError", file:"handler.js", line:495), StackFrame(symbol:"then", file:"routes.js", line:102), StackFrame(symbol:"main", file:"app.js", line:12), ] crashlytics.record(exceptionModel:ex)
Objective-C
FIRExceptionModel *model = [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."]; model.stackTrace = @[ [FIRStackFrame stackFrameWithSymbol:@"makeError" file:@"handler.js" line:495], [FIRStackFrame stackFrameWithSymbol:@"then" file:@"routes.js" line:102], [FIRStackFrame stackFrameWithSymbol:@"main" file:@"app.js" line:12], ]; [[FIRCrashlytics crashlytics] recordExceptionModel:model];
कस्टम स्टैक फ़्रेम को सिर्फ़ पतों के साथ भी शुरू किया जा सकता है:
Swift
var ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.") ex.stackTrace = [ StackFrame(address:0xfa12123), StackFrame(address:12412412), StackFrame(address:194129124), ] crashlytics.record(exceptionModel:ex)
Objective-C
FIRExceptionModel *model = [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."]; model.stackTrace = @[ [FIRStackFrame stackFrameWithAddress:0xfa12123], [FIRStackFrame stackFrameWithAddress:12412412], [FIRStackFrame stackFrameWithAddress:194129124], ]; [[FIRCrashlytics crashlytics] recordExceptionModel:model];
ब्रेडक्रंब लॉग पाना
ब्रेडक्रंब लॉग से आपको उन इंटरैक्शन के बारे में बेहतर जानकारी मिलती है जो किसी उपयोगकर्ता ने आपके ऐप्लिकेशन के साथ किए थे. इन इंटरैक्शन की वजह से, ऐप्लिकेशन क्रैश, नॉन-फ़ेटल या एएनआर इवेंट हुआ. इन लॉग से, किसी समस्या को फिर से जनरेट करने और उसे डीबग करने में मदद मिल सकती है.
ब्रेडक्रंब लॉग, Google Analytics की मदद से काम करते हैं. इसलिए, ब्रेडक्रंब लॉग पाने के लिए, आपको अपने Firebase प्रोजेक्ट के लिए Google Analytics चालू करना होगा. साथ ही, अपने ऐप्लिकेशन में Google Analytics के लिए Firebase SDK टूल जोड़ना होगा. ये ज़रूरी शर्तें पूरी होने के बाद, ब्रेडक्रंब लॉग अपने-आप किसी इवेंट के डेटा के साथ शामिल हो जाते हैं. यह डेटा, लॉग टैब में मौजूद होता है. यह टैब, किसी समस्या की जानकारी देखने पर दिखता है. अपनी सभी समस्याएं देखने के लिए, Firebase कंसोल के DevOps और यूज़र ऐक्टिविटी > Crashlytics डैशबोर्ड पर जाएं.
Analytics SDK, screen_view इवेंट को अपने-आप लॉग करता है. इससे ब्रेडक्रंब लॉग में, क्रैश, नॉन-फ़ेटल या एएनआर इवेंट से पहले देखी गई स्क्रीन की सूची दिखती है. screen_view ब्रेडक्रंब लॉग में firebase_screen_class पैरामीटर होता है.
ब्रेडक्रंब लॉग में, उपयोगकर्ता के सेशन के दौरान मैन्युअल तरीके से लॉग किए गए कस्टम इवेंट भी शामिल होते हैं. इनमें इवेंट के पैरामीटर का डेटा भी शामिल होता है. इस डेटा से, उपयोगकर्ता की उन कार्रवाइयों की सीरीज़ देखी जा सकती है जिनकी वजह से ऐप्लिकेशन क्रैश हुआ, गंभीर गड़बड़ी हुई या एएनआर इवेंट हुआ.
ध्यान दें कि आपके पास Google Analytics डेटा को इकट्ठा और इस्तेमाल करने की प्रोसेस को कंट्रोल करने का विकल्प होता है. इसमें वह डेटा भी शामिल होता है जिससे ब्रेडक्रंब लॉग जनरेट होते हैं.
ऑप्ट-इन रिपोर्टिंग की सुविधा चालू करना
डिफ़ॉल्ट रूप से, Crashlytics आपके ऐप्लिकेशन के सभी उपयोगकर्ताओं के लिए, ऐप्लिकेशन के क्रैश होने की रिपोर्ट अपने-आप इकट्ठा करता है. उपयोगकर्ताओं को उनके भेजे गए डेटा पर ज़्यादा कंट्रोल देने के लिए, ऑप्ट-इन रिपोर्टिंग की सुविधा चालू की जा सकती है. इसके लिए, अपने-आप रिपोर्टिंग होने की सुविधा बंद करें. साथ ही, अपने कोड में चुने गए विकल्प के मुताबिक ही Crashlytics को डेटा भेजें.
अपनी
Info.plistफ़ाइल में नई कुंजी जोड़कर, डेटा अपने-आप इकट्ठा होने की सुविधा बंद करें:- बटन:
FirebaseCrashlyticsCollectionEnabled - वैल्यू:
false
- बटन:
रनटाइम के दौरान, Crashlytics डेटा कलेक्शन ओवरराइड को कॉल करके, चुनिंदा उपयोगकर्ताओं के लिए डेटा कलेक्शन की सुविधा चालू करें. ओवरराइड वैल्यू, आपके ऐप्लिकेशन के बाद के सभी लॉन्च में बनी रहती है, ताकि Crashlytics उस उपयोगकर्ता के लिए रिपोर्ट अपने-आप इकट्ठा कर सके.
Swift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
अगर उपयोगकर्ता बाद में डेटा कलेक्शन से बाहर होता है, तो बदली गई वैल्यू के तौर पर
falseको पास किया जा सकता है. यह वैल्यू, उपयोगकर्ता के अगली बार ऐप्लिकेशन लॉन्च करने पर लागू होगी. साथ ही, उस उपयोगकर्ता के लिए बाद में होने वाले सभी लॉन्च पर लागू रहेगी.
क्रैश इनसाइट का डेटा मैनेज करना
क्रैश की अहम जानकारी की मदद से, समस्याओं को हल किया जा सकता है. इसके लिए, आपके ऐप्लिकेशन के स्टैक ट्रेस की तुलना, Firebase के अन्य ऐप्लिकेशन के स्टैक ट्रेस से की जाती है. इस दौरान, आपकी पहचान ज़ाहिर नहीं की जाती. इससे आपको यह जानने में मदद मिलती है कि आपकी समस्या किसी बड़े ट्रेंड का हिस्सा है या नहीं. कई समस्याओं के लिए, क्रैश इनसाइट आपको क्रैश को डीबग करने में मदद करने के लिए संसाधन भी उपलब्ध कराता है.
क्रैश इनसाइट, क्रैश से जुड़े एग्रीगेट किए गए डेटा का इस्तेमाल करके, ऐप्लिकेशन के क्रैश होने के सामान्य रुझानों की पहचान करता है. अगर आपको अपने ऐप्लिकेशन का डेटा शेयर नहीं करना है, तो क्रैश इनसाइट से ऑप्ट-आउट किया जा सकता है. इसके लिए, Firebase कंसोल के DevOps और यूज़र ऐक्टिविटी > Crashlytics डैशबोर्ड में, समस्या की सूची में सबसे ऊपर मौजूद क्रैश इनसाइट मेन्यू पर जाएं.
अगले चरण
- अपने डेटा को BigQuery या Cloud Logging में एक्सपोर्ट करें. इससे आपको बेहतर विश्लेषण और सुविधाओं का ऐक्सेस मिलेगा. जैसे, डेटा के बारे में क्वेरी करना, कस्टम डैशबोर्ड बनाना, और कस्टम अलर्ट सेट अप करना.