2012-08-04 36 views
13

Chúng tôi muốn thu thập dữ liệu hiệu suất về ứng dụng (ví dụ 80% WinApp) của chúng tôi, cả nội bộ trong dev, cũng như tại các trang web của khách hàng. Mục tiêu của chúng tôi như sau:Giám sát/số liệu hiệu suất trong ứng dụng .NET

  • Nó phải là rất nhanh
  • Nó sẽ được nhẹ
  • Nó sẽ cho phép để theo dõi/thời gian & đếm nhiều loại khác nhau của các sự kiện trên các ứng dụng của chúng tôi.
  • Nó sẽ có thể thu thập (hiệu quả) lượng dữ liệu hợp lý như Tên miền, Tên máy tính, Người dùng, Hệ điều hành, Bộ nhớ, v.v.
  • Tất cả dữ liệu được thu thập phải được phân tích (khi dữ liệu được truyền đến nhà của chúng tôi Cơ sở dữ liệu BI) trên tất cả các thứ nguyên được đề cập ở trên.

Nó sẽ cũng có, lý tưởng, là tương đối có thể cấu hình trên cơ sở từng trang rộng hoặc sử dụng bởi người dùng để kiểm soát:

  • Nếu những số liệu hiệu suất thậm chí còn thu thập
  • Làm thế nào một cách chi tiết để thu thập chúng
  • cho dù để báo cáo kết quả lại cho chúng tôi

Chúng tôi đã lên kế hoạch về cơ bản viết hệ thống riêng của chúng tôi để thực hiện hầu hết các thứ Là. Sau đó chúng tôi xem xét một số mô hình "kiên trì" khác nhau, bao gồm Định dạng nhị phân của "gói hiệu suất", XmlSerialization và chức năng Ghi nhật ký đã là một phần của khung công tác .NET.

Trước khi tham gia vào điều này, tôi muốn kiểm tra kỹ để xem những đề xuất "đám đông" gợi ý. Tôi đã mô tả những gì chúng tôi đang cố gắng làm, và về cơ bản kế hoạch hành động hiện tại của chúng tôi - nhưng tôi đang tìm kiếm bất kỳ và tất cả các đề xuất về cách giải quyết tốt nhất vấn đề trong tầm tay.

Xin cảm ơn trước.

Trả lời

6

Đi với kế hoạch của bạn tôi muốn áp dụng cách này:

  1. Bạn sẽ viết tất cả các dữ liệu hiệu suất vào một tập tin log. Sử dụng một trong các thư viện đăng nhập C# nhanh như log4net hoặc nlog. Các khung công tác này hỗ trợ các ứng dụng nhị phân nếu cần thiết.
  2. Khi ứng dụng bắt đầu ghi RAM, CPU, v.v.
  3. Sử dụng bộ phun khía cạnh như PostSharp để tự động thêm bộ hẹn giờ vào mọi phương thức (không phải nội tuyến) trong ứng dụng của bạn. Lớp Đồng hồ bấm giờ sẽ không tạo ra hiệu suất đáng kể. Để làm cho cấu hình này có bộ phận thay đổi khía cạnh mức nhật ký theo mức độ ưu tiên ước tính của phương thức (hoặc sử dụng các thuộc tính của riêng bạn để chỉ định điều đó).
  4. Nhắc người dùng tại lối ra (hoặc bắt đầu) để gửi dữ liệu hiệu suất đã ghi tới máy chủ web của bạn.
  5. Nén dữ liệu trên đường ra.

Bạn cũng có thể muốn xem xét viết lớp khóa của riêng mình. Thay vì sử dụng lock(blah) hoặc Monitor.Enter(blah), hãy kết thúc Monitor.Enter/Exit trong lớp dùng một lần của riêng bạn để ghi lại thời gian bạn phải đợi để vào khóa.

1

Tôi sẽ bắt đầu thử nghiệm xem có hay không using the EventLog sẽ giải quyết được sự cố của tôi. Tin nhắn EventLog chứa rất nhiều thông tin và bạn có thể thêm thông tin của riêng mình.

Đối với một số chẩn đoán, tôi có thể xem (custom) Performance Counters. Đặt cược của tôi là rất khó để tạo ra một cái gì đó mà đánh bại hiệu suất của các cửa sổ Performance Counters.

Viết lại toàn bộ điều này có thể không đáng.

Nó có thể được yêu cầu để tạo ra các bộ lọc đặc biệt trong trình xem sự kiện để nhận được đầu ra bạn đang tìm kiếm hoặc để thu thập sự kiện trên máy tính (thậm chí bạn có thể viết xem của riêng bạn)

15

Có một cái nhìn tại Metrics.NET, một dự án tương đối mới nên bao gồm hầu hết các nhu cầu này. Đó là một cổng của dự án 'số liệu' của Java.

(Đã thêm tháng 3 năm 2016 :) Dự án Metrics.NET đã được chuyển giao cho người mới sau một thời gian dài không có cập nhật.

+0

Có hai gói dấu chấm câu 1) https://github.com/danielcrenna/metrics-net 2) https://github.com/etishor/Metrics.NET mà một trong những đang được giới thiệu? – BozoJoe

+0

Áp phích gốc đề cập đến hình ảnh danielcrenna (kiểm tra liên kết). Tuy nhiên, dự án etishor được tạo ra bởi vì dự án danielcrenna không được duy trì tích cực. – Quango

7

Bạn có thể có một cái nhìn tại xây dựng một cái gì đó trên đầu trang của StatsD:

https://github.com/etsy/statsd/

Có một gói NET cho rằng có thể được tìm thấy ở đây:

https://github.com/robbihun/NStatsD.Client

Đó là trọng lượng nhẹ như về cơ bản nó chỉ kích hoạt gói UDP đến một máy chủ từ xa. Máy chủ từ xa đó sau đó tổng hợp nó và lưu trữ nó trong Graphite, việc lấy dữ liệu này và biến nó thành đồ thị và nó quản lý những thứ như giữ dữ liệu cho bạn. Để phân tích, Graphite cũng cho phép bạn xuất dữ liệu dưới dạng JSON (về cơ bản biến số liệu của bạn thành một mảng tăng gấp đôi) và có nhiều chức năng và bộ lọc bạn có thể áp dụng cho các chỉ số đã ghi mà sau đó bạn có thể nạp vào các hệ thống khác của mình.

Xem ở đây cho một số ví dụ về những gì có thể với Graphite:

http://matt.aimonetti.net/posts/2013/06/26/practical-guide-to-graphite-monitoring

Nó không đáp ứng tuy nhiên tất cả các yêu cầu của bạn, chẳng hạn như có thể ghi lại dữ liệu về khách hàng như tên máy tính. Nhưng bạn có thể đạt được mục tiêu đó bằng cách sử dụng tính năng đặt tên trong tên chỉ số của bạn; vì vậy bạn sẽ ghi lại số liệu của mình bằng một khóa như "client567.orders.loadtime" và "client567" sẽ là mục nhập trong một số cơ sở dữ liệu khác lưu trữ client567 đó sử dụng IE11 trên Windows 7, chẳng hạn.

Vì vậy, nó không phải là một giải pháp hoàn toàn vượt trội, nhưng nó tạo thành một cơ sở tốt đẹp mà tôi nghĩ.

Một lựa chọn khác là sử dụng một nền tảng thương mại như NewRelic:

http://newrelic.com/

Nó đi kèm với giám sát hoạt động cho rất nhiều công nghệ (từ ASP.NET với SQL Server để Solr). Tuy nhiên nó đòi hỏi một quy trình tác nhân (một dịch vụ trên Windows) chạy trong nền xử lý việc giám sát cho bạn, mà có thể hoặc không thể là một lựa chọn cho bạn. Nó có nghĩa là nhiều hơn hoặc ít hơn có nghĩa là cho máy chủ web và có lẽ sẽ không được rất thích hợp để theo dõi một ứng dụng WPF phía khách hàng.

Các vấn đề liên quan