কম্পিউটার

AppSignal-এর সাথে রেলের অ্যাপ্লিকেশন মনিটরিং-এ নেক্সট লেভেল রুবি

এই দুই-অংশের সিরিজের প্রথমটিতে, আমরা বক্সের বাইরে অনেক দুর্দান্ত অন্তর্দৃষ্টির জন্য একটি রুবি অন রেল অ্যাপ্লিকেশনে অ্যাপসিগন্যাল কীভাবে সেট আপ করব তা কভার করেছি। AppSignal স্বয়ংক্রিয়ভাবে ত্রুটিগুলি ট্র্যাক করতে পারে, কর্মক্ষমতা নিরীক্ষণ করতে পারে এবং কিছু নির্ভরতা সম্পর্কে মেট্রিক্স রিপোর্ট করতে পারে৷

কিন্তু, অনেক ক্ষেত্রে, আমাদের প্রতিটি অ্যাপ্লিকেশান বিভিন্ন উপায়ে আচরণ করে, তাই আমরা সাধারণ পর্যবেক্ষণের চেয়ে আরও বেশি কিছু চাইব৷

এই পোস্টে, আমরা একটি রুবি অন রেল অ্যাপ্লিকেশনে কাস্টম ইন্সট্রুমেন্টেশন এবং মনিটরিং যোগ করব। এটি আপনাকে আপনার অ্যাপ্লিকেশনটি কীভাবে আচরণ করছে সে সম্পর্কে গভীর অন্তর্দৃষ্টি দেবে৷

কোড সহ অনুসরণ করতে চাইলে পূর্বশর্ত:

  • www.appsignal.com-এ একটি অ্যাকাউন্ট
  • ডকার ইনস্টল এবং চলমান (docker-compose ব্যবহার করতে )

এই পোস্টটি অনুসরণ করতে, আপনাকে আপনার নিজের AppSignal অ্যাকাউন্টের সাথে নমুনা অ্যাপ্লিকেশনটিতে AppSignal সেট আপ করতে হবে৷

কাস্টম ইন্সট্রুমেন্টেশন এবং মনিটরিং

যখন আপনার বাক্সের বাইরে AppSignal যন্ত্রের চেয়ে বেশি প্রয়োজন হয়, তখন AppSignalgem আপনাকে আপনার Rails অ্যাপ্লিকেশনে কাস্টম ইন্সট্রুমেন্টেশন যোগ করার অনুমতি দেয়৷

কোডের ইন্সট্রুমেন্টিং পার্টস

ধরা যাক আপনি একটি অ্যাপ্লিকেশনে একটি নতুন বৈশিষ্ট্য যোগ করতে চান। যখন একজন ব্যবহারকারী /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

এটি আপনার অ্যাপ্লিকেশানের এমন একটি মূল অংশ যা আপনি জানতে চাইবেন এটি কীভাবে কাজ করে এবং কখন সেই কর্মক্ষমতা পরিবর্তন হয়। অ্যাপসিগন্যাল এটি করার কয়েকটি উপায় প্রদান করে।

প্রথমে, আমরা 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 কল করা Analytics.track_post_title_search 2.01 সেকেন্ড ব্যবহার করে দৌড়াতে 8.84 সেকেন্ড সময় নিয়েছে পদ্ধতি, এবং নিষ্ক্রিয় রেকর্ড ক্যোয়ারী দ্বারা ব্যবহৃত অবশিষ্ট সময়। আপনি আরও তদন্তের জন্য পৃথক ইভেন্টগুলিতে ক্লিক করতে পারেন এবং তাদের কর্মক্ষমতা সম্পর্কে আরও তথ্য দেখতে পারেন — যেমন sql.active_record ঘটনা।

AppSignal-এর ইন্সট্রুমেন্টেশন সাহায্যকারীরা আপনাকে অ্যাপ্লিকেশন কোডের আরও বিস্তারিত ব্রেকডাউন দেয়, তাই কোডের বিশেষ অংশগুলির অন্তর্দৃষ্টি অর্জন করা সহজ হয় যা আপনি মনে করেন একটি অ্যাপ্লিকেশনের কর্মক্ষমতা প্রভাবিত করতে পারে। আপনি AppSignal এর ইন্সট্রুমেন্টেশন গাইডে এই সম্পর্কে আরও জানতে পারেন৷

ব্যতিক্রম পরিচালনা

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

আপনি বিদ্যমান কোডটি সরিয়ে দিয়ে শুরু করতে পারেন যা একটি অন্তর্বর্তী ত্রুটির কারণ হয়। ড্যাশবোর্ডে ত্রুটি দেখার সময় ব্যাকট্রেসে এই ত্রুটিটি কোথায় ঘটে তা দেখুন। app/controllers/pages_controller.rb এর ভিতরে if সরান বিবৃতি:

class PagesController < ApplicationController
  def home
    CreateRandomPostsJob.perform_later
  end
end

এখন, ওভারভিউ ড্যাশবোর্ডে, অ্যাপ্লিকেশনের ত্রুটির হার উল্লেখযোগ্যভাবে কমে যাবে।

বর্তমানে, যখন একজন ব্যবহারকারী এমন একটি পোস্ট দেখার চেষ্টা করে যা বিদ্যমান নেই, তখন অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে যায় — যেমন,https://localhost:3000/posts/doesnotexist. পরিবর্তে, আপনি তাদের একটি বার্তা দেখাতে চাইতে পারেন৷ যেখানে এটি PostsController এর ভিতরে ঘটতে পারে সেখানে arescue যোগ করুন . #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 এ রিপোর্ট করা হবে না। আপনি এখনও 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 ড্যাশবোর্ডে, 'Errors -> Issuelist'-এ , নতুন রিপোর্ট করা ত্রুটি খুঁজুন এবং দেখুন(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

অ্যাপ্লিকেশনটিতে এখনও চলমান জাল ট্র্যাফিক স্ক্রিপ্ট কিছু ডেটা জেনারেট করবে, তবে আরও বৈচিত্র্য যোগ করতে, আসুন, l, andv দিয়ে শুরু হওয়া পোস্টগুলিও অনুসন্ধান করি৷

অন্তর্দৃষ্টি

কাস্টম মেট্রিক্স দেখতে, আপনাকে 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"
    }
  ]
}

আপনি কয়েক মিনিটের মধ্যে আপনার গ্রাফে ডেটা দেখতে পাবেন। লাইনের ওপরে ঘোরাফেরা করলে আপনি যে সময়সীমা দেখছেন তার মধ্যে সংগৃহীত মেট্রিক্সের একটি কিংবদন্তি দেখায়।

লক্ষ্য করুন যে এটি প্রতিটি ট্যাগের মানের জন্য বিভিন্ন লাইন দেখায়। বর্তমানে, আমাদের নকল ট্রাফিক শুধুমাত্র e অক্ষরটি অনুসন্ধান করছে , কিন্তু যেহেতু আমরা অন্য অক্ষরগুলির জন্য ম্যানুয়ালি অনুসন্ধান করেছি, আপনি অন্য ডেটা পয়েন্ট নির্দেশ করতে প্রতিটিটির জন্য গ্রাফে একটি নতুন লাইন দেখতে পাবেন৷

ভেবেছিলাম এটি যথেষ্ট ছিল? AppSignal-এর কাছে আরও কাস্টম ইন্সট্রুমেন্টেশন সমাধান রয়েছে যা আমরা এখানে কভার করব না। একটি যা দ্রুত উল্লেখ করার যোগ্য তা হল ব্রেডক্রাম্বস৷ ব্রেডক্রাম্বগুলি আপনাকে আপনার অ্যাপ্লিকেশনে অ্যাকশনগুলির একটি তালিকা ট্র্যাক করতে দেয়, যা তারপরে একটি ত্রুটির জন্য রিপোর্ট করা হবে৷ আপনার কাছে আরও সুনির্দিষ্ট এবং নির্দেশিত তথ্য থাকবে কী কারণে একটি ত্রুটি হয়েছে৷

গাইডে কাস্টম ইন্সট্রুমেন্টেশন সম্পর্কে সব পড়ুন।

র্যাপ-আপ:AppSignal সহ রুবি অ্যাপের জন্য কাস্টম ইন্সট্রুমেন্টেশন এবং মনিটরিং

এই সিরিজের পার্ট 1 আপনার রুবি অ্যাপ্লিকেশনের জন্য AppSignal এর প্রাথমিক সেটআপ এবং ব্যবহারকে কভার করেছে৷

এই অংশে, আমরা এমন একটি অ্যাপ্লিকেশন নিয়েছি যেটিতে ইতিমধ্যেই দুর্দান্ত আউট-অফ-দ্য-বক্স মনিটরিং রয়েছে এবং AppSignal রত্ন ব্যবহার করে এটিকে আরও ভাল করে তুলেছে৷

AppSignal-এর কাস্টম ইন্সট্রুমেন্টেশন, ত্রুটি ট্র্যাকিং, এবং কর্মক্ষমতা নিরীক্ষণের বৈশিষ্ট্যগুলি আপনাকে আপনার অ্যাপ্লিকেশনগুলি কীভাবে আচরণ করছে সে সম্পর্কে আপনার প্রয়োজনীয় অন্তর্দৃষ্টি দেয়। এটি আপনার অ্যাপ্লিকেশনকে অনেকটাই বাক্সের বাইরে দেয় যখন প্রয়োজনে আপনাকে নিয়ন্ত্রণ করতে দেয়৷

আপনার কোডটি কীভাবে কাজ করছে তার উপর নজর রাখার সাথে সাথে আপনার কোডটি বন্যের মধ্যে বিনামূল্যে চালানোর সময়। শুভ কোডিং!

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্টও মিস করবেন না!


  1. Vue, Vuex এবং Rails সহ একটি সম্পূর্ণ-স্ট্যাক অ্যাপ্লিকেশন তৈরি করা

  2. রেলের সাথে কৌণিক ব্যবহার 5

  3. রুবি দিয়ে কীভাবে কমান্ড-লাইন অ্যাপ্লিকেশন (সিএলআই) তৈরি করবেন

  4. ওকুলাস গো দিয়ে ভার্চুয়াল রিয়েলিটিকে পরবর্তী স্তরে নিয়ে যান!