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

การตรวจสอบแอปพลิเคชัน Ruby on Rails ระดับถัดไปด้วย AppSignal

ในชุดสองส่วนแรกนี้ เราได้กล่าวถึงวิธีตั้งค่า AppSignal ในแอปพลิเคชัน Ruby on Rails เพื่อให้ได้ข้อมูลเชิงลึกที่ยอดเยี่ยมมากมายตั้งแต่แกะกล่อง AppSignal สามารถติดตามข้อผิดพลาด ตรวจสอบประสิทธิภาพ และรายงานตัวชี้วัดเกี่ยวกับการพึ่งพาบางรายการได้โดยอัตโนมัติ

แต่ในหลายกรณี แอปพลิเคชันแต่ละอันของเรามีพฤติกรรมแตกต่างกัน เราจึงต้องการมากกว่าการตรวจสอบทั่วไป

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

ข้อกำหนดเบื้องต้นหากคุณต้องการปฏิบัติตามโค้ด:

  • บัญชีบน www.appsignal.com
  • ติดตั้งและใช้งาน Docker (เพื่อใช้ docker-compose )

หากต้องการติดตามบทความนี้ คุณจะต้องตั้งค่า AppSignal ในแอปพลิเคชันตัวอย่างด้วยบัญชี AppSignal ของคุณเอง

เครื่องมือวัดและการตรวจสอบแบบกำหนดเอง

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

ส่วนประกอบต่างๆ ของโค้ด

สมมติว่าคุณต้องการเพิ่มคุณลักษณะใหม่ให้กับแอปพลิเคชัน เมื่อผู้ใช้เยี่ยมชม/posts ในการดูโพสต์ทั้งหมด พวกเขาควรจะสามารถกรองโพสต์ที่ชื่อขึ้นต้นด้วยตัวอักษรเฉพาะ (หรืออะไรที่ซับซ้อนกว่านั้น 🪄)

ฟังก์ชันการค้นหาใหม่นี้ได้ถูกนำไปใช้ใน Post . แล้ว modelwith the method 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 กำลังทำการประมวลผลอย่างหนัก ในกรณีนี้ เราจะใช้เครื่องมือ method เพื่อกำหนดวิธีการทั้งหมดให้แม่นยำยิ่งขึ้น:

# 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

ข้อมูลเชิงลึก

ไม่กี่นาทีหลังจากบันทึกด้านบนลงในแอปพลิเคชัน ให้ดูข้อมูลใหม่ที่มีบนแดชบอร์ด AppSignal ของคุณ (หากคุณไม่เห็นข้อมูล คุณอาจต้องรีสตาร์ทคอนเทนเนอร์ Docker อีกครั้ง) คุณสามารถตรวจสอบว่าคุณลักษณะใหม่นี้ใช้งานได้โดยไปที่หน้าดัชนีโพสต์ด้วยการค้นหา param:https://localhost:3000/posts?starts_with=f

ขึ้นอยู่กับจำนวนโพสต์ที่สร้างในฐานข้อมูล /posts จุดสิ้นสุดจะช้าลงมาก

หากคุณเปิดปัญหาด้านประสิทธิภาพใน AppSignal ('ประสิทธิภาพ' -> 'ผู้ออก') และดู PostsController#index ให้เลื่อนลงมาที่หน้า คุณควรจะเห็น 'เส้นเวลาของกิจกรรม' ข้อมูลนี้จะให้รายละเอียดเวลาที่ใช้ไปกับโค้ดเฉพาะ:

ไทม์ไลน์นี้มีอยู่สำหรับกิจกรรมประสิทธิภาพทั้งหมด แต่ที่นี่ เรายังสามารถดูเหตุการณ์เครื่องมือวัดที่กำหนดเองได้ มันแสดงให้เราเห็นว่ากำลังเรียก Post.where_title_starts_with ใช้เวลา8.84 วินาทีในการทำงาน โดย Analytics.track_post_title_search ใช้หมด 2.01 วินาที เมธอด และเวลาที่เหลืออยู่โดยคิวรีเรกคอร์ดแอกทีฟที่ใช้จนหมด คุณยังสามารถคลิกเข้าสู่เหตุการณ์ส่วนบุคคลเพื่อตรวจสอบเพิ่มเติมและดูข้อมูลเพิ่มเติมเกี่ยวกับประสิทธิภาพของพวกเขาได้ เช่น sql.active_record เหตุการณ์

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

การจัดการข้อยกเว้น

นอกจากการตรวจสอบประสิทธิภาพของโค้ดของคุณแล้ว คุณยังจำเป็นต้องรู้ด้วยว่าเมื่อไรที่แอปพลิเคชันทำงานไม่เป็นไปตามที่คาดไว้และสิ่งใดที่ผิดพลาด เราได้เห็นแล้วว่า 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 โดยอัตโนมัติ คุณยังคงติดตามข้อผิดพลาดได้ด้วยตนเองโดยใช้ 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 คุณจะสังเกตเห็นว่าแท็กจะรวมอยู่ด้วยเมื่อคุณดูการวัดประสิทธิภาพ ('ประสิทธิภาพ' -> 'รายการปัญหา' -> 'PostsController#show'). คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการติดแท็กธุรกรรมได้ในคู่มือ

ความสามารถในการเพิ่มข้อมูลเมตาที่กำหนดเองลงในธุรกรรมนี้เปิดโอกาสมากมายเพื่อช่วยวินิจฉัยปัญหาในการผลิต ตัวอย่างที่ดีของสิ่งนี้คือการเพิ่มข้อมูลเมตา Kubernetes ให้กับข้อผิดพลาดของคุณ

ตัวชี้วัด

ขณะนี้มีเครื่องมือวัดแบบกำหนดเองและการตรวจสอบข้อผิดพลาดอยู่แล้ว คุณอาจตระหนักดีว่าบางครั้งการค้นหาโพสต์มีเพิ่มขึ้นอย่างรวดเร็ว เมื่อใดก็ตามที่ผู้ใช้ค้นหา 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

สคริปต์การรับส่งข้อมูลปลอมที่ยังคงทำงานอยู่บนแอปพลิเคชันจะสร้างข้อมูลบางส่วน แต่เพื่อเพิ่มความหลากหลาย ให้ค้นหาโพสต์ที่ขึ้นต้นด้วยf,lและv.

ข้อมูลเชิงลึก

หากต้องการดูเมตริกที่กำหนดเอง คุณจะต้องสร้างแดชบอร์ดด้วยกราฟที่กำหนดเองบน 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%" loop="" muted="" controls="">

คุณควรเห็นข้อมูลบนกราฟของคุณภายในไม่กี่นาที การวางเมาส์เหนือเส้นจะแสดงคำอธิบายของเมตริกที่รวบรวมไว้ภายในกรอบเวลาที่คุณกำลังดูอยู่

โปรดสังเกตว่าสิ่งนี้แสดงบรรทัดที่แตกต่างกันสำหรับค่าแท็กแต่ละค่า ขณะนี้ Faketraffic ของเรากำลังค้นหาเฉพาะตัวอักษร e แต่เนื่องจากเราค้นหาตัวอักษรอื่นๆ ด้วยตนเอง คุณจะเห็นบรรทัดใหม่บนกราฟสำหรับแต่ละรายการเพื่อระบุจุดข้อมูลอื่น

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

อ่านทั้งหมดเกี่ยวกับเครื่องมือวัดแบบกำหนดเองในคู่มือ

สรุป:การกำหนดเครื่องมือและการตรวจสอบแบบกำหนดเองสำหรับแอป Ruby ด้วย AppSignal

ส่วนที่ 1 ของชุดนี้ครอบคลุมการตั้งค่าพื้นฐานและการใช้ AppSignal สำหรับแอปพลิเคชัน Ruby ของคุณ

ในส่วนนี้ เราได้นำแอปพลิเคชันที่มีการตรวจสอบแบบสำเร็จรูปที่ยอดเยี่ยมอยู่แล้ว และทำให้ดียิ่งขึ้นไปอีกโดยใช้ AppSignal gem

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

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

ป.ล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่ออกจากสื่อ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!