Trong phần đầu tiên của loạt bài gồm hai phần này, chúng tôi đã trình bày cách thiết lập AppSignal trong ứng dụng Ruby on Rails cho nhiều greatinsights ngoài hộp. AppSignal có thể tự động theo dõi lỗi, giám sát hiệu suất và báo cáo số liệu về một số phụ thuộc.
Tuy nhiên, trong nhiều trường hợp, mỗi ứng dụng của chúng tôi hoạt động theo những cách khác nhau, vì vậy chúng tôi sẽ muốn nhiều hơn là chỉ giám sát chung chung.
Trong bài đăng này, chúng tôi sẽ chạy qua việc thêm thiết bị đo đạc tùy chỉnh và điều chỉnh vào ứng dụng Ruby on Rails. Điều này sẽ cung cấp cho bạn thông tin chi tiết sâu hơn về ứng dụng của bạn đang hoạt động như thế nào.
Điều kiện tiên quyết nếu bạn muốn tuân theo mã:
- Một tài khoản trên www.appsignal.com
- Docker đã được cài đặt và đang chạy (để sử dụng
docker-compose
)
Để làm theo bài đăng này, bạn sẽ cần thiết lập AppSignal trong ứng dụng mẫu bằng tài khoản AppSignal của riêng bạn.
Công cụ giám sát và đo đạc tùy chỉnh
Khi bạn cần nhiều hơn những công cụ AppSignal có sẵn, AppSignalgem cho phép bạn thêm thiết bị đo đạc tùy chỉnh vào ứng dụng Rails của mình.
Các phần công cụ của mã
Giả sử bạn muốn thêm một tính năng mới vào một ứng dụng. Khi người dùng truy cập /posts
để xem tất cả các bài đăng, họ sẽ có thể lọc các bài đăng có tiêu đề bắt đầu bằng một chữ cái cụ thể (hoặc một cái gì đó phức tạp hơn nhiều 🪄).
Chức năng tìm kiếm mới này đã được triển khai trong Post
mô hình bằng phương thức Post.where_title_starts_with
. Hãy cập nhật PostsController#index
để sử dụng phương pháp mới nếu có tham số truy vấn cụ thể:
# 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
Đây là một phần cốt lõi của ứng dụng của bạn mà bạn sẽ muốn biết nó hoạt động như thế nào và khi nào hiệu suất thay đổi. AppSignal cung cấp một số cách để chấm điều này.
Đầu tiên, chúng tôi sẽ ghi cụ thể nội dung của Post.where_title_starts_with
phương pháp. Nếu bạn muốn nhận được thông tin chi tiết về bất kỳ khối mã nào, bạn có thể sử dụng các khối thiết bị đo đạc để kết hợp các khối mã. Cập nhật phương pháp như sau:
# 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
Thứ hai, chúng tôi cũng muốn đo lường Analytics.track_post_title_search
phương thức được gọi bởi vì app/services/analytics.rb
đang thực hiện một số xử lý nặng. Trong trường hợp này, chúng tôi sẽ sử dụng công cụ phương pháp để đo lường toàn bộ phương pháp một cách chính xác hơn:
# 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
Thông tin chi tiết
Một vài phút sau khi lưu thông tin trên vào ứng dụng, hãy xem bất kỳ thông tin mới nào có sẵn trên bảng điều khiển AppSignal của bạn (nếu bạn không thấy thông tin, bạn có thể cần phải khởi động lại vùng chứa của bộ khóa). Bạn có thể xác minh rằng tính năng mới hoạt động bằng cách truy cập trang chỉ mục bài đăng với tham số tìm kiếm:https:// localhost:3000 / posts? Start_with =f
Tùy thuộc vào số lượng bài đăng được tạo trong cơ sở dữ liệu, /posts
điểm cuối sẽ trở nên chậm hơn rất nhiều.
Nếu bạn mở các vấn đề về hiệu suất trên AppSignal ('Performance' -> 'Issuelist') và xem chỉ mục PostsController#index
hành động, hạ xuống trên trang, bạn sẽ có thể thấy 'Dòng thời gian sự kiện'. Điều này cung cấp cho bạn bảng phân tích về thời gian dành cho việc chạy mã cụ thể:
Dòng thời gian này tồn tại cho tất cả các sự kiện hiệu suất, nhưng tại đây, chúng ta cũng có thể thấy các dự báo về công cụ tùy chỉnh. Nó cho chúng ta thấy rằng việc gọi Post.where_title_starts_with
mất 8,84 giây để chạy, trong khi Analytics.track_post_title_search
đã sử dụng hết 2,01 giây và thời gian còn lại được truy vấn bản ghi tương tự sử dụng hết. Bạn cũng có thể nhấp vào các sự kiện riêng lẻ để điều tra thêm và xem thêm thông tin về hiệu suất của chúng - ví dụ:sql.active_record
sự kiện.
Trình trợ giúp thiết bị đo đạc của AppSignal cung cấp cho bạn bản phân tích chi tiết hơn về mã ứng dụng, do đó, dễ dàng hơn để có được thông tin chi tiết về các đoạn mã nội bộ mà bạn cho rằng có thể ảnh hưởng đến hiệu suất của ứng dụng. Bạn có thể tìm hiểu thêm về điều này trong hướng dẫn về thiết bị của AppSignal.
Xử lý ngoại lệ
Bên cạnh việc theo dõi hiệu suất của mã của bạn, bạn cũng cần biết khi nào ứng dụng không hoạt động như mong đợi và nơi xảy ra sự cố. Chúng tôi đã thấy cách AppSignal báo cáo các trường hợp ngoại lệ chưa được mã của chúng tôi xử lý. Nhưng luôn có nhiều hơn một chút so với những gì xuất hiện trong hộp.
Bạn có thể bắt đầu bằng cách xóa mã hiện có gây ra lỗi không liên tục. Wesee nơi lỗi này xảy ra trong backtrace khi xem lỗi trên trang tổng quan. Bên trong của app/controllers/pages_controller.rb
loại bỏ if
tuyên bố:
class PagesController < ApplicationController
def home
CreateRandomPostsJob.perform_later
end
end
Bây giờ, trong bảng điều khiển tổng quan, tỷ lệ lỗi của ứng dụng sẽ giảm đáng kể.
Hiện tại, khi người dùng cố gắng xem một bài đăng không tồn tại, ứng dụng sẽ gặp sự cố - ví dụ:https:// localhost:3000 / posts / doesnotexist. Thay vào đó, bạn có thể muốn hiển thị thông báo cho họ. Thêm arescue vào nơi điều này có thể xảy ra bên trong PostsController
. Cập nhật #set_post
phương pháp:
# 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
Vì chúng tôi đang xử lý ngoại lệ theo cách thủ công, ngoại lệ đó sẽ không tự động được báo cáo cho AppSignal. Bạn vẫn có thể theo dõi lỗi theo cách thủ công bằng cách sử dụng Appsignal.set_error
.
Cách dễ nhất để theo dõi lỗi là chỉ cần thêm nó làm đối số duy nhất của hàm như Appsignal.set_error(e)
. Chúng tôi cũng muốn tận dụng khả năng thêm ngữ cảnh vào yêu cầu. AppSignal cho phép bạn giả mạo thông tin tùy ý của riêng mình bằng cách sử dụng 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
Bây giờ, hãy truy cập vào địa chỉ:// localhost:3000 / posts / doesnotexist để xác minh rằng bạn nhận lại phản hồi JSON như mong đợi, thay vì gặp sự cố ứng dụng.
Thông tin chi tiết
Sau khi bạn cố gắng xem một bài đăng không tồn tại, các bản cập nhật được thêm vào đảm bảo rằng các lỗi được báo cáo cho AppSignal.Trên trang tổng quan AppSignal, trong 'Lỗi -> Người phát hành' , tìm và xem lỗi mới được báo cáo (ActiveRecord::RecordNotFound
).
Trang chi tiết lỗi cung cấp cho chúng ta ngữ cảnh hữu ích về lỗi, theo mặc định, bao gồm thông tin về yêu cầu như phương thức HTTP, các tham số và dữ liệu phiên dịch. Bạn có thể thấy rằng các thẻ tùy chỉnh cũng được bao gồm, giúp bạn có khả năng lọc tất cả các lỗi bằng một thẻ phù hợp.
Bởi vì chúng tôi đã gắn thẻ yêu cầu, nó sẽ thêm thông tin này vào các lỗi và các sự kiện công cụ khác. Nếu bạn xem một bài đăng riêng lẻ một vài lần, ví dụ:https:// localhost:3000 / posts / 1, bạn sẽ nhận thấy rằng các thẻ cũng được bao gồm khi bạn nhìn vào bảng đo lường hiệu suất ('Hiệu suất' -> 'Danh sách vấn đề' -> 'PostsController # show'). Bạn có thể đọc thêm về cách gắn thẻ các giao dịch trong hướng dẫn.
Khả năng thêm siêu dữ liệu tùy chỉnh vào giao dịch này sẽ mở ra nhiều cơ hội để giúp chẩn đoán các vấn đề trong quá trình sản xuất. Một ví dụ tuyệt vời về việc này là thêm siêu dữ liệu Kubernetes vào các lỗi của bạn.
Số liệu
Giờ đây, đã có một số công cụ tùy chỉnh và theo dõi lỗi, bạn có thể nhận ra rằng đôi khi, số lượt tìm kiếm bài đăng tăng đột biến. Bất cứ khi nào chuyên gia tìm kiếm, hãy Analytics#track_post_title_search
được gọi, thực hiện một số tính toán và thực hiện lệnh gọi API tới dịch vụ của bên thứ ba. Bên thứ ba này có giới hạn tốc độ đối với API. Chúng tôi muốn theo dõi tần suất nó được gọi để theo dõi mức độ gần của ứng dụng với các giới hạn của nó.
AppSignal cho phép bạn theo dõi các số liệu tùy chỉnh trong toàn bộ ứng dụng khi bạn thích.
Trước tiên, chúng tôi sẽ theo dõi tần suất chúng tôi gọi dịch vụ phân tích của mình và với dữ liệu nào, bằng cách sử dụng bộ đếm và thẻ:
#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
Thứ hai, chúng tôi cũng sẽ theo dõi số lượng bài đăng được trả lại trong chỉ mục PostsController#index
, bởi vì đây là một phần cốt lõi trong hành vi của ứng dụng và chúng tôi biết rằng nó không ngừng phát triển:
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
.
.
def index
.
.
Appsignal.set_gauge("posts_index", @posts.size, starts_with: params[:starts_with])
end
end
Tập lệnh lưu lượng truy cập giả vẫn đang chạy trên ứng dụng sẽ tạo ra somedata, nhưng để thêm đa dạng, hãy cũng tìm kiếm các bài đăng bắt đầu bằngf, l vàv.
Thông tin chi tiết
Để xem các chỉ số tùy chỉnh, bạn sẽ cần tạo trang tổng quan với các đồ thị tùy chỉnh trên AppSignal. Điều này có thể được thực hiện thông qua giao diện người dùng, nhưng chúng tôi sẽ chỉ nhập một giao diện người dùng cho ví dụ này. Trong phần 'Trang tổng quan', hãy nhấp vào 'Thêm trang tổng quan' và nhập một trang tổng quan như sau:
{
"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"
}
]
}
Bạn sẽ thấy dữ liệu trên đồ thị của mình trong vòng vài phút. Di chuột qua các dòng hiển thị cho bạn chú giải về các chỉ số được thu thập trong khung thời gian bạn đang xem.
Lưu ý rằng điều này hiển thị các dòng khác nhau cho mỗi giá trị thẻ. Hiện tại, faketraffic của chúng tôi chỉ tìm kiếm chữ cái e
, nhưng vì chúng tôi đã tìm kiếm các chữ cái khác theo cách thủ công, bạn sẽ thấy một dòng mới trên biểu đồ cho mỗi chữ cái để chỉ ra một điểm dữ liệu khác.
Bạn nghĩ vậy là đủ? AppSignal có nhiều giải pháp thiết bị đo đạc tùy chỉnh hơn để cung cấp mà chúng tôi sẽ không đề cập ở đây. Một trong những điều đáng được đề cập nhanh là đó là đường dẫn. Đường dẫn cho phép bạn theo dõi danh sách các hành động trong ứng dụng của mình, sau đó sẽ được báo cáo có lỗi. Bạn thậm chí sẽ có thông tin cụ thể và có thứ tự hơn về nguyên nhân dẫn đến lỗi.
Đọc tất cả về thiết bị tùy chỉnh trong hướng dẫn.
Tóm tắt:Công cụ tùy chỉnh và giám sát cho các ứng dụng Ruby với AppSignal
Phần 1 của loạt bài này đề cập đến việc thiết lập và sử dụng AppSignal cơ bản cho các ứng dụng Ruby của bạn.
Trong phần này, chúng tôi đã sử dụng một ứng dụng đã có khả năng giám sát tuyệt vời và nó thậm chí còn tốt hơn bằng cách sử dụng đá quý AppSignal.
Các tính năng đo đạc, theo dõi lỗi và giám sát hiệu suất tùy chỉnh của AppSignal cung cấp cho bạn thông tin chi tiết cần thiết về hoạt động của các ứng dụng của bạn. Nó cung cấp cho ứng dụng của bạn rất nhiều thứ trong khi cho phép bạn kiểm soát khi cần thiết.
Đã đến lúc để mã của bạn chạy tự do, miễn là bạn theo dõi cách nó hoạt động. Chúc bạn viết mã vui vẻ!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng xuất hiện trên báo chí, hãy đăng ký bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!