Computer >> Máy Tính >  >> Lập trình >> Ruby

Giới thiệu Breadcrumbs

Bạn đã bao giờ xử lý lỗi trong quá trình sản xuất và bất kể bạn thử làm gì , bạn không thể tái tạo sự cố trên môi trường phát triển hoặc môi trường dàn dựng của mình? Thường thì bước tiếp theo là thu thập nhiều dữ liệu hơn bằng cách tung ra một nhật ký gỡ lỗi khi sản xuất. Nếu bạn không có cách tốt để liên kết nhật ký với một yêu cầu, điều đó có thể khiến bạn bực bội, đặc biệt là khi có sự cố.

Chúng tôi đã thêm một tính năng để trợ giúp và nó được gọi là Breadcrumbs.

Giới thiệu Breadcrumbs

A Breadcrumb rất giống một sự kiện nhật ký, nhưng nó được lưu trữ và báo cáo cùng với một lỗi. Giống như một nhật ký, một Breadcrumb chứa một thông báo, nhưng nó cũng có thể chứa siêu dữ liệu (dưới dạng một bản đồ băm). Một tập hợp các đường dẫn được thu thập trong suốt vòng đời của một yêu cầu (hoặc lệnh gọi công việc) và ngay lập tức bị loại bỏ trừ khi có lỗi được báo cáo.

Thêm breadcrumbs của riêng bạn vào ngăn xếp rất đơn giản. Chỉ cần thực hiện cuộc gọi tới Honeybadger.add_breadcrumb bất kỳ nơi nào trong mã của bạn:

Honeybadger.add_breadcrumb("Loading User", metadata: {
  user_name: user_name,
})

Và nếu lỗi được báo cáo sau đó, bạn sẽ thấy lỗi đó trong ngăn xếp Breadcrumb:

Giới thiệu Breadcrumbs

Ôi user_name trông trống rỗng, điều đó có thể gây ra sự cố.

breadcrumbs tự động

Thư viện Honeybadger Ruby chứa các hook vào Ruby &Rails để tự động thu thập breadcrumbs. Ví dụ:tất cả các thông báo nhật ký được phát ra trong Sản xuất (được gửi qua Logger lớp) được bắt và tạo dưới dạng breadcrumbs. Chúng tôi cũng liên kết với Công cụ Rails để thu thập các đường dẫn cho các Hành động của Bộ điều khiển, Truy vấn SQL, Lời gọi Công việc Hoạt động, v.v.

Bạn có thể sử dụng nó như thế nào?

Breadcrumbs hiện có sẵn thông qua ứng dụng khách Ruby của chúng tôi. Bạn phải cập nhật lên phiên bản 4.4.0 và đảm bảo bật nó trong cấu hình vì nó sẽ bị vô hiệu hóa theo mặc định cho đến khi chúng tôi phát hành 5.0.0 phiên bản của đá quý, để đảm bảo chúng tôi tìm ra mọi sai sót.

Vui lòng dùng thử và cho chúng tôi biết nếu bạn gặp bất kỳ sự cố nào.

Mở rộng Breadcrumbs

Bây giờ Breadcrumbs đã được chính thức giới thiệu, chúng ta hãy xem một ví dụ nhanh về cách mở rộng chúng. Nếu bạn bật Breadcrumbs trong ứng dụng Rails, bạn sẽ nhận được một số breadcrumbs tiêu chuẩn cho thiết bị đo đạc miễn phí được đính kèm, nhưng nếu chúng ta muốn nhiều hơn thì sao?

Giả sử chúng tôi muốn tạo Breadcrumb mỗi khi ứng dụng của chúng tôi gửi một yêu cầu HTTP. Thông tin này có thể hữu ích khi gỡ lỗi.

Một cách đơn giản để thực hiện điều này là gọi Honeybadger.add_breadcrumb ở mỗi lần gọi yêu cầu.

def send_a_message
  res = conn.post("/message", { user: user.id, body: "Hey!" }.to_json)
  Honeybadger.add_breadcrumb("Request: /message", metadata: { user: user.id })
  res
end

Tại đây, chúng tôi lưu trữ một breadcrumb sau mỗi lần ĐĂNG tới /message . Lần tiếp theo khi ứng dụng của chúng tôi gặp lỗi sau khi gửi thông báo này, chúng tôi sẽ xem người dùng nào đã gửi thông báo và thời điểm nó xảy ra liên quan đến lỗi, Yay!

Tuy nhiên, điều này hơi rườm rà vì chúng ta sẽ cần một add_breadcrumb gọi tại mỗi địa điểm chúng tôi gửi yêu cầu. Tôi thực sự muốn ghi chú tuy nhiên, có lợi thế để tạo breadcrumbs như thế này. Bạn có thể rất cụ thể về siêu dữ liệu bạn muốn chụp bằng phương pháp này. Thường thì đây là một cách tuyệt vời để thu thập thông tin được nhắm mục tiêu được thúc đẩy bởi một lỗi trong quá trình sản xuất.

Thực sự tôi chỉ muốn biết khi nào và ở đâu một yêu cầu được gửi đi. Thật tuyệt nếu một thư viện có thể làm hầu hết công việc cho tôi;).

Nhạc cụ với Faraday

Chúng tôi sẽ gian lận một chút và giả sử bạn đang sử dụng thư viện yêu cầu Faraday phổ biến.

Chúng tôi có thể xây dựng phần mềm trung gian của riêng mình để hoàn thành nhiệm vụ của mình, nhưng thay vào đó, tôi muốn sử dụng thiết bị đo đạc Rails như một nhà môi giới. May mắn thay, có phần mềm trung gian được cung cấp bởi đá quý faraday_middleware sẽ phát ra các sự kiện cho chúng ta. Đảm bảo đá quý nằm trong Gemfile của bạn và cũng đảm bảo rằng instrumentation phần mềm trung gian được đưa vào kết nối.

connection = Faraday.new do |conn|
  conn.use :instrumentation
  conn.adapter Faraday.default_adapter
end

Điều này có thể yêu cầu một chút công việc nếu bạn không chia sẻ kết nối bên trong ứng dụng của mình. Nếu lười, bạn cũng có thể thêm vào ConnectionOptions để đảm bảo rằng tất cả các yêu cầu đều có phần mềm trung gian được kích hoạt. Tuy nhiên, hãy cẩn thận, vì điều này sẽ cụ thể hóa bất kỳ yêu cầu Faraday nào xảy ra trong ứng dụng của bạn và cũng như đá quý bao gồm (mà bạn có thể muốn)!

Sử dụng thiết bị Rails có một số tác dụng phụ tốt, một là chúng ta có thể tạo nhiều đăng ký cho các trường hợp sử dụng khác (giả sử cho mục đích ghi nhật ký chung).

Ngập ngừng xem các yêu cầu của chúng tôi

Giờ đây, các yêu cầu Faraday của chúng tôi đã được công cụ hóa, chúng tôi có thể đăng ký và bắt đầu tạo một số breadcrumbs:

ActiveSupport::Notifications.subscribe "request.faraday" do |_, _, _, _, data|
  method = data[:method].to_s.upcase
  metadata = data.to_h.slice(:url, :status).merge({method: method})
  Honeybadger.add_breadcrumb("#{method}: #{metadata[:url]}", category: "request", metadata: metadata)
end

Honeybadger hiện đang thêm một breadcrumb cho mỗi yêu cầu gửi đi!

Giới thiệu Breadcrumbs

Lưu ý rằng chúng tôi chỉ đang kiểm tra một vài điểm dữ liệu từ các yêu cầu của chúng tôi. Chúng tôi không thêm tải trọng gửi đi hoặc nội dung phản hồi vì có nhiều khả năng dữ liệu nhạy cảm có thể bị rò rỉ vào siêu dữ liệu đường dẫn của chúng tôi.

Hãy cho chúng tôi biết sự việc diễn ra như thế nào!

Chúng tôi hy vọng rằng Breadcrumbs sẽ là một bổ sung hữu ích cho hộp công cụ gỡ lỗi của bạn. Hãy dùng thử và thông báo cho chúng tôi nếu bạn muốn bổ sung thêm thông tin nào đó.