ในชุดสองส่วนแรกนี้ เราได้กล่าวถึงวิธีตั้งค่า 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 ของเราและไม่พลาดแม้แต่โพสต์เดียว!