इस दो-भाग श्रृंखला के पहले में, हमने बॉक्स से बाहर कई महान अंतर्दृष्टि के लिए रूबी ऑन रेल्स एप्लिकेशन में ऐपसिग्नल को कैसे सेट किया जाए, इसे कवर किया। AppSignal स्वचालित रूप से त्रुटियों को ट्रैक कर सकता है, प्रदर्शन की निगरानी कर सकता है, और कुछ निर्भरताओं के बारे में मीट्रिक रिपोर्ट कर सकता है।
लेकिन, कई मामलों में, हमारा प्रत्येक एप्लिकेशन अलग-अलग तरीकों से व्यवहार करता है, इसलिए हम केवल सामान्य निगरानी से अधिक चाहते हैं।
इस पोस्ट में, हम रूबी ऑन रेल्स एप्लिकेशन में कस्टम इंस्ट्रूमेंटेशन और मॉनिटरिंग जोड़कर चलेंगे। यह आपको इस बारे में गहन जानकारी देगा कि आपका एप्लिकेशन कैसा व्यवहार कर रहा है।
यदि आप कोड के साथ पालन करना चाहते हैं तो आवश्यक शर्तें:
- www.appsignal.com पर एक खाता
- डॉकर स्थापित और चल रहा है (
docker-compose
का उपयोग करने के लिए) )
इस पोस्ट का अनुसरण करने के लिए, आपको अपने स्वयं के ऐपसिग्नल खाते के साथ नमूना एप्लिकेशन में ऐपसिग्नल सेट करना होगा।
कस्टम इंस्ट्रुमेंटेशन और मॉनिटरिंग
जब आपको बॉक्स से बाहर के AppSignal उपकरणों से अधिक की आवश्यकता होती है, तो AppSignalgem आपको अपने रेल एप्लिकेशन में कस्टम इंस्ट्रूमेंटेशन जोड़ने की अनुमति देता है।
संहिता के वाद्य यंत्र
मान लें कि आप किसी एप्लिकेशन में एक नई सुविधा जोड़ना चाहते हैं। जब कोई उपयोगकर्ता /posts
पर जाता है सभी पोस्ट देखने के लिए, उन्हें उन पोस्ट के लिए फ़िल्टर करने में सक्षम होना चाहिए जहां शीर्षक एक विशिष्ट अक्षर (या कुछ अधिक जटिल 🪄) से शुरू होता है।
यह नई खोज कार्यक्षमता Post
. में पहले ही लागू की जा चुकी है मॉडल के साथ विधि Post.where_title_starts_with
. आइए अपडेट करें PostsController#index
यदि कोई विशिष्ट क्वेरी पैरामीटर मौजूद है तो नई विधि का उपयोग करने के लिए:
# app/controllers/posts_controller.rb
def index
starts_with = params[:starts_with]
@posts = if starts_with.present?
Post.where_title_starts_with(starts_with)
else
Post.all
end
end
यह आपके एप्लिकेशन का इतना महत्वपूर्ण हिस्सा है कि आप जानना चाहेंगे कि यह कैसा प्रदर्शन करता है और यह प्रदर्शन कब बदलता है। AppSignal ऐसा करने के कुछ तरीके प्रदान करता है।
सबसे पहले, हम Post.where_title_starts_with
. की सामग्री को लिखेंगे तरीका। यदि आप किसी भी कोड ब्लॉक के बारे में जानकारी प्राप्त करना चाहते हैं, तो आप कोड ब्लॉक को लपेटने के लिए इंस्ट्रूमेंटेशन ब्लॉक का उपयोग कर सकते हैं। विधि को इस तरह अपडेट करें:
# app/models/post.rb
def self.where_title_starts_with(letter)
Appsignal.instrument('Post.where_title_starts_with', "Fetch posts that start with letter") do
Analytics.track_post_title_search(letter.downcase)
select('*, pg_sleep(0.01)').where("title ILIKE :letter", letter: "#{letter.downcase}%").load
end
end
दूसरे, हम Analytics.track_post_title_search
. का भी उपकरण बनाना चाहते हैं विधि कहा जा रहा है क्योंकिapp/services/analytics.rb
कुछ भारी प्रसंस्करण कर रहा है। इस मामले में, हम पूरी विधि को अधिक सटीक रूप से साधने के लिए मेथड इंस्ट्रूमेंटेशन का उपयोग करेंगे:
# app/services/analytics.rb
require 'appsignal/integrations/object'
class Analytics
def self.track_post_title_search(letter, sleep = sleep(1))
# Some heavy processing
sleep 1
end
appsignal_instrument_class_method :track_post_title_search
end
अंतर्दृष्टि
उपरोक्त को एप्लिकेशन में सहेजने के कुछ मिनट बाद, अपने ऐपसिग्नल डैशबोर्ड पर जो भी नई जानकारी उपलब्ध है, उस पर एक नज़र डालें (यदि आपको जानकारी नहीं दिखाई देती है, तो आपको डॉकटर कंटेनरों को फिर से शुरू करने की आवश्यकता हो सकती है)। आप यह सत्यापित कर सकते हैं कि नई सुविधा एक खोज पैरामीटर के साथ पोस्ट इंडेक्स पेज पर जाकर काम करती है:https://localhost:3000/posts?starts_with=f
डेटाबेस में सृजित पदों की संख्या के आधार पर,/posts
समापन बिंदु बहुत धीमा हो गया होगा।
यदि आप AppSignal ('प्रदर्शन' -> 'जारीकर्ता') पर प्रदर्शन समस्याओं को खोलते हैं और PostsController#index
देखते हैं कार्रवाई, पृष्ठ पर नीचे, आप एक 'ईवेंट टाइमलाइन' देखने में सक्षम होना चाहिए। यह आपको इस बात का विश्लेषण देता है कि विशिष्ट कोड को चलाने में कितना समय व्यतीत होता है:
यह समयरेखा सभी प्रदर्शन घटनाओं के लिए मौजूद है, लेकिन यहां, हम कस्टम इंस्ट्रूमेंटेशन इवेंट भी देख सकते हैं। यह हमें दिखाता है कि Post.where_title_starts_with
calling पर कॉल करना चलने में 8.84 सेकंड लगे, जिसमें 2.01 सेकंड का उपयोग Analytics.track_post_title_search
द्वारा किया गया विधि, और शेष समय सक्रिय रिकॉर्ड क्वेरी द्वारा उपयोग किया जाता है। आप आगे की जांच के लिए अलग-अलग इवेंट में भी क्लिक कर सकते हैं और उनके प्रदर्शन के बारे में अधिक जानकारी देख सकते हैं - उदा। sql.active_record
घटना।
ऐपसिग्नल के इंस्ट्रूमेंटेशन हेल्पर्स आपको एप्लिकेशन कोड का अधिक विस्तृत विवरण देते हैं, इसलिए कोड के विशिष्ट टुकड़ों में अंतर्दृष्टि प्राप्त करना आसान है जो आपको लगता है कि किसी एप्लिकेशन के प्रदर्शन को प्रभावित कर सकता है। आप इसके बारे में AppSignal की इंस्ट्रूमेंटेशन गाइड में अधिक जान सकते हैं।
अपवाद प्रबंधन
अपने कोड के प्रदर्शन की निगरानी के अलावा, आपको यह भी जानना होगा कि एप्लिकेशन कब अपेक्षित व्यवहार नहीं करता है और कहां चीजें गलत हो जाती हैं। हमने पहले ही देखा है कि ऐपसिग्नल उन अपवादों की रिपोर्ट कैसे करता है जिन्हें हमारे कोड द्वारा नियंत्रित नहीं किया गया है। लेकिन जो लीक से हटकर आता है उससे हमेशा थोड़ा अधिक होता है।
आप मौजूदा कोड को हटाकर शुरू कर सकते हैं जो एक आंतरायिक त्रुटि का कारण बनता है। हम देखते हैं कि डैशबोर्ड पर त्रुटि देखते समय बैकट्रेस में यह त्रुटि कहां होती है। app/controllers/pages_controller.rb
. के अंदर if
को हटा दें कथन:
class PagesController < ApplicationController
def home
CreateRandomPostsJob.perform_later
end
end
अब, ओवरव्यू डैशबोर्ड में, एप्लिकेशन की त्रुटि दर काफी कम हो जाएगी।
वर्तमान में, जब कोई उपयोगकर्ता किसी ऐसी पोस्ट को देखने का प्रयास करता है जो मौजूद नहीं है, तो एप्लिकेशन क्रैश हो जाता है - जैसे, https://localhost:3000/posts/doesnotexist. इसके बजाय, आप उन्हें एक संदेश दिखाना चाह सकते हैं। PostsController
. के अंदर यह कहां हो सकता है, इसके बारे में जानकारी जोड़ें . #set_post
अपडेट करें विधि:
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
.
.
.
private
def set_post
@post = Post.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
render json: { error: "Oops. That post isn't here" } , status: :not_found
end
.
.
end
चूंकि हम अपवाद को मैन्युअल रूप से प्रबंधित कर रहे हैं, यह स्वचालित रूप से ऐपसिग्नल को रिपोर्ट नहीं किया जाएगा। आप अभी भी Appsignal.set_error
. का उपयोग करके मैन्युअल रूप से त्रुटियों को ट्रैक कर सकते हैं ।
किसी त्रुटि को ट्रैक करने का सबसे आसान तरीका है कि इसे केवल फ़ंक्शन के एकमात्र तर्क के रूप में जोड़ें जैसे Appsignal.set_error(e)
. हम अनुरोध में और संदर्भ जोड़ने की क्षमता का भी लाभ उठाना चाहते हैं। AppSignal आपको Appsignal.tag_request
का उपयोग करके अपनी मनमानी जानकारी के साथ ईवेंट को टैग करने की अनुमति देता है :
def set_post
Appsignal.tag_request(user_id: 'user-from-params', post_id: params[:id])
@post = Post.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
Appsignal.set_error(e)
render json: { error: "Oops. That post isn't here" }, status: :not_found
end
अब यह सत्यापित करने के लिए https://localhost:3000/posts/doesnotexist पर जाएं कि आपको एप्लिकेशन क्रैश होने के बजाय अपेक्षित रूप से JSON प्रतिक्रिया वापस मिल जाए।
अंतर्दृष्टि
जब आप किसी ऐसी पोस्ट को देखने का प्रयास करते हैं जो मौजूद नहीं है, तो जोड़े गए अपडेट सुनिश्चित करते हैं कि त्रुटियों की रिपोर्ट AppSignal को की जाती है। AppSignal डैशबोर्ड पर, 'त्रुटियों -> जारी सूची' में , नई रिपोर्ट की गई त्रुटि को ढूंढें और देखें (ActiveRecord::RecordNotFound
)।
त्रुटि विवरण पृष्ठ हमें त्रुटि के बारे में उपयोगी संदर्भ देता है, जिसमें डिफ़ॉल्ट रूप से, अनुरोध के बारे में जानकारी शामिल होती है जैसे HTTP विधि, पैरामीटर और सत्र डेटा। आप देख सकते हैं कि कस्टम टैग भी शामिल हैं, जो आपको मेल खाने वाले टैग के साथ सभी त्रुटियों को फ़िल्टर करने की क्षमता देता है।
चूंकि हमने अनुरोध को टैग किया है, इसलिए यह इस जानकारी को त्रुटियों और अन्य इंस्ट्रूमेंटेड इवेंट में जोड़ता है। यदि आप किसी एक पोस्ट को बार-बार देखते हैं, उदाहरण के लिए, https://localhost:3000/posts/1, तो आप देखेंगे कि जब आप प्रदर्शन माप ('प्रदर्शन' -> 'समस्या सूची' -> देखते हैं तो टैग भी शामिल होते हैं। 'पोस्टकंट्रोलर#शो')। आप मार्गदर्शिका में लेन-देन को टैग करने के बारे में अधिक पढ़ सकते हैं।
लेन-देन में कस्टम मेटाडेटा जोड़ने की यह क्षमता उत्पादन में समस्याओं के निदान में मदद करने के लिए कई अवसर खोलती है। इसका एक बेहतरीन उदाहरण कुबेरनेट्स मेटाडेटा को आपकी त्रुटियों में जोड़ना है।
मीट्रिक
अब जबकि कुछ कस्टम इंस्ट्रुमेंटेशन और एरर मॉनिटरिंग मौजूद है, तो आप महसूस कर सकते हैं कि कभी-कभी, पोस्ट खोजों में बड़ी वृद्धि होती है। जब भी उपयोगकर्ता खोज करता है, Analytics#track_post_title_search
कहा जाता है, जो कुछ गणना करता है और किसी तृतीय-पक्ष सेवा को API कॉल करता है। इस तृतीय पक्ष की API पर दर सीमाएं हैं। हम यह ट्रैक करना चाहते हैं कि एप्लिकेशन कितनी बार इसकी सीमा के करीब है, इस पर नज़र रखने के लिए इसे कितनी बार कॉल किया जाता है।
AppSignal आपको अपनी इच्छानुसार पूरे एप्लिकेशन में कस्टम मेट्रिक्स को ट्रैक करने की अनुमति देता है।
सबसे पहले, हम काउंटर और टैग का उपयोग करके ट्रैक करेंगे कि हम कितनी बार अपनी एनालिटिक्स सेवा और किस डेटा से कॉल कर रहे हैं:
#app/services/analytics.rb
require 'appsignal/integrations/object'
class Analytics
def self.track_post_title_search(letter, sleep = sleep(1))
Appsignal.increment_counter("track_post_search", 1, { letter: letter })
# Some heavy processing
sleep 1
end
appsignal_instrument_class_method :track_post_title_search
end
दूसरे, हम PostsController#index
में लौटाई जा रही पोस्ट की संख्या को भी ट्रैक करेंगे , क्योंकि यह एप्लिकेशन के व्यवहार का एक मुख्य भाग है, और हम जानते हैं कि यह बढ़ता रहता है:
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
.
.
def index
.
.
Appsignal.set_gauge("posts_index", @posts.size, starts_with: params[:starts_with])
end
end
नकली ट्रैफिक स्क्रिप्ट अभी भी एप्लिकेशन पर चल रही है, कुछ डेटा उत्पन्न करेगी, लेकिन अधिक विविधता जोड़ने के लिए, आइए एफ, एल, और वी से शुरू होने वाली पोस्ट भी खोजें।
अंतर्दृष्टि
कस्टम मेट्रिक्स देखने के लिए, आपको AppSignal पर कस्टमग्राफ के साथ एक डैशबोर्ड बनाना होगा। यह UI के माध्यम से किया जा सकता है, लेकिन हम इस उदाहरण के लिए केवल एक आयात करेंगे। 'डैशबोर्ड' अनुभाग के अंतर्गत, 'डैशबोर्ड जोड़ें' पर क्लिक करें और निम्नलिखित के साथ एक डैशबोर्ड आयात करें:
{
"title": "Post Search",
"description": "Sample dashboard about posts search activity",
"visuals": [
{
"title": "Analytics",
"line_label": "%name% %letter%",
"display": "LINE",
"format": "number",
"draw_null_as_zero": true,
"metrics": [
{
"name": "track_post_search",
"fields": [
{
"field": "COUNTER"
}
],
"tags": [
{
"key": "letter",
"value": "*"
}
]
}
],
"type": "timeseries"
},
{
"title": "Search",
"line_label": "%name% %starts_with%",
"display": "LINE",
"format": "number",
"draw_null_as_zero": true,
"metrics": [
{
"name": "posts_index",
"fields": [
{
"field": "GAUGE"
}
],
"tags": [
{
"key": "starts_with",
"value": "*"
}
]
}
],
"type": "timeseries"
}
]
}
<वीडियो चौड़ाई ="100%" लूप ="" म्यूट ="" नियंत्रण =""> वीडियो> आपको कुछ ही मिनटों में अपने ग्राफ़ पर डेटा देखना चाहिए। पंक्तियों के ऊपर मँडराते हुए आपको उस समय-सीमा के भीतर एकत्रित मेट्रिक की एक किंवदंती दिखाई देती है जिसे आप देख रहे हैं।
ध्यान दें कि यह प्रत्येक टैग मान के लिए अलग-अलग लाइनें दिखाता है। वर्तमान में, हमारा नकली ट्रैफिक केवल e
. अक्षर की खोज कर रहा है , लेकिन चूंकि हमने मैन्युअल रूप से अन्य अक्षरों की खोज की है, इसलिए आपको ग्राफ़ पर एक नई लाइन दिखाई देगी, जिसमें प्रत्येक एक डेटा बिंदु को इंगित करेगा।
सोचा था कि यह पर्याप्त था? ऐपसिग्नल के पास अधिक कस्टम इंस्ट्रूमेंटेशन समाधान हैं जिन्हें हम यहां कवर नहीं करेंगे। एक त्वरित उल्लेख के लायक है ब्रेडक्रंब। ब्रेडक्रंब आपको अपने आवेदन में कार्यों की एक सूची को ट्रैक करने की अनुमति देता है, जिसे तब एक त्रुटि में रिपोर्ट किया जाएगा। त्रुटि के कारण के बारे में आपके पास और भी विशिष्ट और व्यवस्थित जानकारी होगी।
गाइड में कस्टम इंस्ट्रूमेंटेशन के बारे में सब कुछ पढ़ें।
रैप-अप:AppSignal के साथ रूबी ऐप्स के लिए कस्टम इंस्ट्रुमेंटेशन और मॉनिटरिंग
इस श्रृंखला के भाग 1 में आपके रूबी अनुप्रयोगों के लिए मूल सेटअप और ऐपसिग्नल के उपयोग को शामिल किया गया है।
इस भाग में, हमने एक ऐसा एप्लिकेशन लिया है जिसमें पहले से ही बेहतरीन आउट-ऑफ़-द-बॉक्स निगरानी है और ऐपसिग्नल रत्न का उपयोग करके इसे और भी बेहतर बना दिया है।
ऐपसिग्नल का कस्टम इंस्ट्रुमेंटेशन, त्रुटि ट्रैकिंग, और प्रदर्शन निगरानी सुविधाएं आपको यह जानकारी देती हैं कि आपके एप्लिकेशन कैसे व्यवहार कर रहे हैं। जरूरत पड़ने पर आपको नियंत्रण करने की सुविधा देते हुए यह आपके एप्लिकेशन को बहुत कुछ देता है।
अब समय आ गया है कि जब तक आप इस पर नज़र रखें कि यह कैसा काम कर रहा है, तब तक आप अपने कोड को जंगली में मुक्त रूप से चलने दें। हैप्पी कोडिंग!
पी.एस. यदि आप रूबी मैजिक की पोस्ट प्रेस से बाहर होते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर की सदस्यता लें और एक भी पोस्ट मिस न करें!