Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การจัดโครงสร้างข้อมูลการตรวจสอบในแอปพลิเคชันแบบเสาหินด้วยเนมสเปซ

เนมสเปซคืออะไร

ทุกสิ่งที่เกิดขึ้นในแอปพลิเคชันที่ตรวจสอบด้วย AppSignal จะถูกบันทึกภายใต้เนมสเปซ เนมสเปซทำงานเหมือนโฟลเดอร์ การจัดกลุ่มเหตุการณ์ ปัญหา และการตรวจสอบข้อมูลเป็นส่วนๆ ที่จัดการได้

โดยค่าเริ่มต้น ทุกแอปพลิเคชันจะเริ่มต้นด้วยเนมสเปซเริ่มต้นสามรายการ:web , background และ frontend .

  • เนมสเปซเว็บเก็บคำขอ HTTP ทั้งหมดของคุณ ในเฟรมเวิร์กที่เน้น MVC เช่น Rails หรือ Sinatra ซึ่งรวมถึงการดำเนินการควบคุมด้วย
  • เนมสเปซพื้นหลังเก็บกิจกรรมจากงานเบื้องหลัง ไลบรารี และงาน
  • เนมสเปซส่วนหน้าจะบันทึกเหตุการณ์ที่ส่งโดย AppSignal สำหรับการผสานรวม JavaScript

AppSignal จับคู่เหตุการณ์ที่เข้ามาโดยใช้กฎในตัวต่อแอปพลิเคชันและต่อการผสานรวม อย่างไรก็ตาม คุณสามารถเปลี่ยนการแมปเหล่านี้ได้ทุกเมื่อ หรือแม้แต่สร้างเนมสเปซใหม่เพื่อสร้างแบบจำลองโครงสร้างแอปพลิเคชันของคุณ

ลองใช้เนมสเปซใน Ruby

ลองใช้เนมสเปซในแอปพลิเคชัน Ruby on Rails (ROR) หลังจากสร้างโครงการ Rails ใหม่ด้วย rails new และตั้งค่าการรวมราง คุณจะพบ web เนมสเปซในแดชบอร์ดของคุณ

AppSignal จะแสดงเนมสเปซทันทีที่ได้รับธุรกรรมจากตัวควบคุมใดๆ

เนมสเปซเริ่มต้นที่เหลือจะไม่ปรากฏจนกว่าจะมีกิจกรรมบางอย่างอยู่ในนั้น มาเพิ่มบางอย่างในเนมสเปซพื้นหลังเพื่อทำให้สิ่งต่างๆ น่าสนใจยิ่งขึ้น นี่คือลักษณะที่แดชบอร์ดดูแลหลังจากเพิ่ม Sidekiq ให้กับโปรเจ็กต์ (ตรวจสอบโค้ดในที่เก็บตัวอย่าง)

AppSignal กำหนดการดำเนินการให้กับเนมสเปซพื้นหลังเนื่องจากรู้จัก Sidekiq เป็นตัวประมวลผลงาน AppSignal ทำงานร่วมกับโปรเซสเซอร์พื้นหลังยอดนิยมส่วนใหญ่ได้ แต่ถ้าโปรเซสเซอร์ของคุณถูกละไว้ คุณสามารถเพิ่มเครื่องมือสำหรับงานของคุณด้วยตนเองได้เสมอ

การสร้างเนมสเปซที่กำหนดเอง

ในแอปพลิเคชันแบบเสาหินขนาดใหญ่ เนมสเปซเริ่มต้นอาจดูธรรมดาเกินไป เว็บไซต์ขนาดใหญ่มักให้บริการเนื้อหาแบบคงที่ หน้าแบบไดนามิก จุดปลาย API และบริการเว็บอื่นๆ ทั้งหมดนี้จะจบลงที่ web เนมสเปซ

นอกจากนี้ ทุกส่วนของแอปพลิเคชันมีลำดับความสำคัญที่แตกต่างกัน ปัญหาหน้าเข้าสู่ระบบเป็นเรื่องเร่งด่วนมากกว่าปัญหาในแผงการดูแลระบบภายใน AppSignal ถือว่าปัญหาทั้งหมดภายในเนมสเปซเท่าเทียมกัน เมื่อมีกิจกรรมมากมาย การระบุปัญหาที่สำคัญที่สุดอาจเป็นเรื่องยาก

ดังนั้น เราควรจัดระเบียบเนมสเปซตามลำดับความสำคัญและขอบเขตความรับผิดชอบ จากนั้นเราสามารถแนบนโยบายการแจ้งเตือนแยกต่างหากและแจ้งเตือนเฉพาะผู้มีส่วนได้ส่วนเสีย ด้วยเหตุผลนี้ เราสามารถสร้างเนมสเปซที่กำหนดเองสำหรับ login_page , api_endpoints และ admin_panel .

ในการสร้างเนมสเปซใหม่ใน Ruby เราจะใช้ Appsignal.set_namespace . ดูโค้ดต่อไปนี้ ซึ่งสร้างงานในเนมสเปซชื่อ urgent_background :

class FetchPricesWorker
    include Sidekiq::Worker
 
    def perform
        Appsignal.set_namespace("urgent_background")
 
        # worker code ...
 
    end
end

เมื่อเราทำการเปลี่ยนแปลงนี้และรีสตาร์ทแอป งานใหม่เหล่านี้จะปรากฏในเนมสเปซที่สร้างขึ้นใหม่:

เราสามารถยืนยันได้ว่างานจริงได้รับการบันทึกโดยการตรวจสอบชื่อการดำเนินการในแดชบอร์ด:

เนมสเปซที่กำหนดเองยังทำงานในการผสานรวมทั้งหมดด้วย

ละเว้นเนมสเปซ

ประโยชน์อีกประการของเนมสเปซที่กำหนดเองคือช่วยให้เราละเว้นเหตุการณ์จากส่วนต่างๆ ของแอปพลิเคชันที่เราไม่สนใจ ตัวอย่างเช่น เราอาจเลือกที่จะละเว้นเหตุการณ์จาก admin_panel อย่างสมบูรณ์

การละเว้นเนมสเปซมีสามขั้นตอน:

  1. กำหนดส่วนที่เราไม่ต้องการตรวจสอบให้กับเนมสเปซที่กำหนดเอง
  2. กำหนดค่าการรวมเพื่อละเว้นเนมสเปซ
  3. รีสตาร์ทแอปของคุณ

สำหรับ Ruby ให้เพิ่มตัวเลือก dissolve_namespaces ในไฟล์กำหนดค่า AppSignal:

production:
  ignore_namespaces:
    - "admin_panel"

การละเว้นเนมสเปซจะข้ามธุรกรรมทั้งหมดและขยายข้อมูลที่ต้นทาง ข้อมูลเมตริกที่กำหนดเองยังคงรายงานอยู่

การผสานรวม Elixir และ JavaScript มีตัวเลือกที่คล้ายกัน สำหรับรายละเอียดเพิ่มเติม โปรดตรวจสอบคู่มือการละเว้นเนมสเปซ

เนมสเปซสำหรับแอปพลิเคชันเสาหิน

ตอนนี้เรารู้แล้วว่าเนมสเปซทำงานอย่างไร มาดูวิธีการสองสามวิธีที่เราใช้เนมสเปซเพื่อแบ่งพาร์ติชันแอปพลิเคชันแบบเสาหิน

แม้ว่าจะไม่มีกฎกำหนดไว้ แต่การแบ่งพาร์ติชั่นทำให้เหลือสองกลยุทธ์ คุณสามารถเลือกหนึ่งในนั้นหรือทั้งสองอย่างผสมกันเป็นจุดเริ่มต้น:

  • ตามบทบาท :เรากำหนดเนมสเปซให้กับหน่วยการทำงานหรือตรรกะภายในโปรเจ็กต์ ดังนั้น เราอาจพบว่าการกำหนดเนมสเปซ เช่น billing , sign_in หรือ sign_up , admin_panel และ homepage . เหลือบดูที่แดชบอร์ด AppSigal และคุณจะเข้าใจว่าเกิดอะไรขึ้นในแต่ละส่วนของแอปพลิเคชัน วิธีนี้ใช้ได้ผลดีเมื่อโค้ดสามารถแบ่งได้อย่างชัดเจนตามขอบเขตที่ชัดเจน
  • ตามความรุนแรง :ที่นี่เราใช้เนมสเปซเป็นอุปกรณ์จัดลำดับความสำคัญ การกำหนดว่าส่วนใดของโค้ด critical . ขึ้นอยู่กับคุณ , critical , medium , หรือ low . วิธีนี้ช่วยให้คุณระบุปัญหาที่ต้องการแก้ไขก่อนได้ทันที

สมมติว่าเรามีตัวควบคุมที่จัดการการลงชื่อเข้าใช้และการลงทะเบียนของผู้ใช้ เมื่อเลือกแบ่งพาร์ติชันตามบทบาท เราสามารถจับคู่กับ user_login เนมสเปซ

# in Rails we use before_action callback to change
# the namespace before the request starts
class LoginController < ApplicationController
    before_action :set_appsignal_namespace
 
    def set_appsignal_namespace
        # Sets the namespace
        Appsignal.set_namespace("user_login")
    end
 
    # controller actions ...
end

แต่ถ้าคุณชอบใช้เนมสเปซที่มีลำดับความสำคัญมากกว่า ผู้ควบคุมที่รับผิดชอบการเรียกเก็บเงินอาจจะอยู่ใน critical เนมสเปซ

class BillingPageController < ApplicationController
    before_action :set_appsignal_namespace
 
    def set_appsignal_namespace
        Appsignal.set_namespace("critical")
    end
end

ตัวควบคุมที่สืบทอดจากสิ่งเหล่านี้ใช้เนมสเปซเดียวกันกับผู้ปกครอง:

# any controllers that inherit from LoginController
# are also part of the "user_login" namespace
class RegistrationController < LoginController
 
    # there’s no need for before_action here
    # this controller already reports to the parent’s namespace
 
end

ตามที่เราได้เห็น งานและงานถูกกำหนดให้กับbackground .โดยอัตโนมัติ เนมสเปซ เมื่อใดก็ตามที่เป็นไปได้ เราควรกำหนดให้เฉพาะเจาะจงมากขึ้น ตัวอย่างเช่น งานล้างฐานข้อมูลสามารถเข้าไปใน database เนมสเปซเช่นนี้:

class ActiveJobDatabaseCleanupJob < ActiveJob::Base
  queue_as :default
 
  def perform(argument = nil, options = {})
    Appsignal.set_namespace("database")

ลำดับความสำคัญยังทำงานสำหรับงาน เราสามารถมอบหมายงานที่ไม่สำคัญให้กับ low เช่นในงานคราดนี้:

task :unimportant_job do
 
  # Run this rake job in the low namespace
  Appsignal.set_namespace("low")
 
  # job code ...
 
end

ในบางกรณี คุณจะต้องบันทึกการดำเนินการโดยใช้ธุรกรรมด้วยตนเอง คุณสามารถกำหนดเนมสเปซในขณะที่สร้างเนมสเปซได้ เช่นในตัวอย่างต่อไปนี้ ซึ่งกำหนดรหัสงานเมลที่กำหนดเอง:

class Job
    def perform
 
        # Create a transaction for this job and set the namespace
        transaction = Appsignal::Transaction.create(
            SecureRandom.uuid,
            "mailer",
            Appsignal::Transaction::GenericRequest.new(ENV.to_hash)
        )
 
        # job code ...
 
    end
end

เนมสเปซและการแจ้งเตือน

ไม่ใช่ทุกคนในทีมที่จำเป็นต้องได้รับแจ้งเกี่ยวกับทุกปัญหา ผู้เชี่ยวชาญส่วนหน้าไม่สนใจงานเบื้องหลังมากเท่ากับนักพัฒนาส่วนหลัง อย่างไรก็ตาม พวกเขาอาจต้องการทราบว่ามีปัญหาในแบ็กเอนด์เมื่อใด นักพัฒนาแบ็กเอนด์จะต้องได้รับแจ้งปัญหาด้านประสิทธิภาพใน web เนมสเปซ เนมสเปซทำให้เรากำหนดเส้นทางการแจ้งเตือนไปยังบุคคลที่เหมาะสมได้

การตั้งค่าตัวแจ้งเตือนต่อเนมสเปซ

เราสามารถสร้างกลุ่มการแจ้งเตือนที่ใช้งานได้สำหรับเนมสเปซที่ระบุเท่านั้น ตัวอย่างเช่น เราสามารถส่งอีเมลหาข้อผิดพลาดใน web เนมสเปซหรือส่งข้อความไปที่ช่อง #frontend Slack สำหรับปัญหาใน frontend เนมสเปซ

ในการสร้างกลุ่มการแจ้งเตือนสำหรับแต่ละเนมสเปซ ให้ไปที่การตั้งค่าแอป> การแจ้งเตือน> ตัวแจ้งเตือน และคลิกที่ เพิ่มการผสานการทำงาน .

เลือกหนึ่งในการรวมและพิมพ์ชื่อ เลือกประเภทของข้อความที่จะส่งและเนมสเปซใด ตัวอย่างเช่น มาสร้างการแจ้งเตือน Slack สำหรับ #frontend ช่อง.

ขณะที่เรายังอยู่ที่นี่ ให้สร้างการแจ้งเตือนครั้งที่สองสำหรับนักพัฒนาแบ็กเอนด์:

คุณสามารถกำหนดค่าตัวแจ้งเตือนได้มากเท่าที่ต้องการเพื่อให้ทีมได้รับข้อมูลล่าสุดเกี่ยวกับทุกสิ่งที่เกิดขึ้น

การเปลี่ยนแปลงการแจ้งเตือนต่อเนมสเปซ

เมื่อมีการสร้างเหตุการณ์ AppSignal จะใช้นโยบายการแจ้งเตือน นโยบายนี้อิงตามเนมสเปซที่เกิดข้อผิดพลาด เราสามารถกำหนดนโยบายแยกกันสำหรับแต่ละเนมสเปซ

หากต้องการดูค่าเริ่มต้นของเนมสเปซสำหรับแอปพลิเคชันของคุณ ให้ไปที่การตั้งค่าแอป> การแจ้งเตือน> ค่าเริ่มต้นของเนมสเปซ .

ที่นี่ คุณจะพบตัวเลือกในการปรับแต่งการแจ้งเตือนข้อผิดพลาดและประสิทธิภาพสำหรับทุกเนมสเปซ:

  • ทุกเหตุการณ์ :ส่งการแจ้งเตือนทุกครั้งที่มีเหตุการณ์เกิดขึ้น โดยมีคูลดาวน์ 5 นาที
  • ขั้นแรกในการปรับใช้ :แจ้งให้คุณทราบถึงข้อผิดพลาดแรกหลังจากปรับใช้แอปพลิเคชัน
  • ก่อนปิด :ส่งการแจ้งเตือนในครั้งแรกที่เปิดปัญหาที่ปิดไว้อีกครั้ง
  • ไม่ต้องแจ้งเตือน :ปิดการแจ้งเตือนทั้งหมด

การสร้างทริกเกอร์ต่อเนมสเปซ

ทริกเกอร์บอก AppSignal ให้สร้างเหตุการณ์และส่งการแจ้งเตือนเมื่อตัววัดมีค่าเกินหรือต่ำกว่าค่าที่กำหนดไว้ล่วงหน้า เนื่องจากส่วนต่างๆ ของแอปพลิเคชันอาจมีเกณฑ์ต่างกัน เราควรสร้างทริกเกอร์แยกกันสำหรับแต่ละเนมสเปซ ตัวอย่างคลาสสิกคือทริกเกอร์ที่เตือนเราเมื่อปริมาณงานต่ำเกินไปใน web เนมสเปซ

ในการสร้างทริกเกอร์ ให้ไปที่การตรวจจับความผิดปกติ> ทริกเกอร์ แล้วคลิก เพิ่มทริกเกอร์แรกของคุณ .

เลือกประเภททริกเกอร์การดำเนินการบนเมนูด้านซ้ายและเลือกเนมสเปซที่เกี่ยวข้อง จากนั้น กำหนดเกณฑ์ที่เรียกการแจ้งเตือน

ที่นี่คุณยังสามารถกำหนดได้ว่าควรแจ้งกลุ่มใด ในการสรุป ให้คลิกที่ บันทึกทริกเกอร์ .

บทสรุป

เนมสเปซทำให้ข้อมูลการตรวจสอบแอปพลิเคชันของคุณมีความหมาย นอกจากนี้ยังจำเป็นสำหรับการส่งการแจ้งเตือนและเหตุการณ์ในระดับที่ละเอียด การจำกัดเสียงรบกวน และหลีกเลี่ยงผลบวกที่ผิดพลาด

หลังจากตรวจสอบการทำงานของเนมสเปซที่กำหนดเองบน Ruby, Node.js และ Elixir แล้ว โปรดอ่านข้อมูลต่อไปนี้เพื่อเรียนรู้วิธีใช้เนมสเปซต่อไป:

  • เนมสเปซใน AppSignal
  • การจัดกลุ่มด้วยเนมสเปซ
  • อะไรคือความแตกต่างระหว่างการตรวจสอบ Webhooks และงานเบื้องหลัง
  • Gem 2.2 - เนมสเปซที่กำหนดเอง!