OpenTelemetry đã trở thành tiêu chuẩn công nghiệp cho việc instrument ứng dụng với dữ liệu observability, và việc tích hợp nó vào một dịch vụ Worker C# với khả năng xuất sang Prometheus mang lại những lợi ích vận hành đáng kể.
Một dịch vụ Worker — thường là một tiến trình nền chạy dài — thường hoạt động với tầm nhìn hạn chế về hành vi và hiệu suất của nó. Bằng cách triển khai OpenTelemetry, bạn có được khả năng instrument toàn diện giúp thu thập metrics, traces và logs ở định dạng độc lập với nhà cung cấp. Cách tiếp cận này biến dịch vụ Worker của bạn từ một hộp đen thành một hệ thống minh bạch, có thể quan sát được.
Các lợi ích chính bao gồm khả năng khắc phục sự cố được cải thiện — bạn có thể xác định nhanh chóng các nút thắt cổ chai về hiệu suất và lỗi thay vì chỉ dựa vào log ứng dụng. Bạn có được khả năng hiển thị theo thời gian thực về hành vi ứng dụng, theo dõi các metrics tùy chỉnh cho logic nghiệp vụ, và khả năng thiết lập cảnh báo dựa trên ngưỡng.
Vì OpenTelemetry dựa trên tiêu chuẩn và có khả năng mở rộng, khoản đầu tư instrument của bạn không bị khóa vào bất kỳ nhà cung cấp đơn lẻ nào, và bạn có thể chuyển đổi sang các backend khác mà không cần làm lại tầng instrument.
Ngoài ra, hệ sinh thái xung quanh OpenTelemetry cung cấp khả năng instrument tự động cho các thư viện và framework phổ biến, giảm lượng boilerplate code cần thiết để bắt đầu.
Đối với C#, gói NuGet OpenTelemetry tích hợp mượt mà với dependency injection, giúp việc triển khai trở nên đơn giản trong mô hình hosting của Worker service.
Mục lục
Gói NuGet
Trước tiên, chúng ta cần một số gói NuGet để làm việc với giao thức OpenTelemetry, tôi khuyên bạn nên sử dụng các gói OpenTelemetry chính thức.
dotnet add package OpenTelemetry
Tiếp theo, thêm gói chứa tất cả code cần thiết để thực hiện thao tác xuất metrics:
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
Nếu bạn muốn sử dụng khả năng hosting nền tảng .NET, hãy thêm gói NuGet sau vào dự án của bạn:
dotnet add package OpenTelemetry.Extensions.Hosting
Cấu hình Worker
Bây giờ hãy tạo một dự án worker mới từ dòng lệnh bằng công cụ CLI dotnet và template loại dự án Worker.
dotnet new worker --output WorkerOtel
Mở dự án trong IDE yêu thích của bạn cho .NET và sửa đổi tệp Program.cs như sau:
- Dòng 1 & 2: Thêm các namespace OpenTelemetry
- Dòng 7: Thêm hỗ trợ OpenTelemetry vào Worker của chúng ta
- Dòng 8: Cấu hình metrics. Bạn cũng có thể cung cấp cài đặt tùy chỉnh cho traces và logs bằng các phương thức chuyên dụng
Dòng 12: Tại điểm này chúng ta cấu hình Otlp exporter với các thuộc tính sau:
- Endpoint: Chúng ta sử dụng URL import/export mặc định của Prometheus (
http://localhost:9090/api/v1/otlp/v1/metrics) - Protocol: Trong trường hợp này chúng ta phải sử dụng tùy chọn
HttpProtobuf - Chúng ta cũng có thể đặt khoảng thời gian để xuất metrics worker. Nếu bạn không đặt bất kỳ giá trị nào, mỗi loại metric sẽ có khoảng thời gian riêng
Phần code còn lại thiết lập triển khai BackgroundService nơi chúng ta sử dụng metrics của mình.
Bắt đầu thu thập metrics
Trong ví dụ này tôi sẽ sử dụng các loại metric Counter và Histogram, nhưng namespace System.Diagnostics.Metrics chứa nhiều loại metrics khác nhau mà chúng ta có thể sử dụng trong các dự án của mình.
Bạn phải tạo một Meter với tên và tùy chọn phiên bản, và sử dụng kiểu Meter mới này để tạo các metric khác nhau, trong trường hợp này là một counter và một histogram.
Cả hai loại metric đều chia sẻ các giá trị tham số giống nhau:
- Name: Tên metric. Tôi khuyên bạn nên tuân theo một số quy ước đặt tên để dễ dàng tìm thấy chúng trong Prometheus
- Unit: Tên đơn vị đo lường
- Description: Tùy chọn, thường là một đoạn văn bản trợ giúp ngắn mô tả metric
Và đó là tất cả, metrics của chúng ta sẽ được tải lên Prometheus một cách tự động.
Prometheus Docker Image
Để kiểm tra ví dụ này, chúng ta cần một dịch vụ Prometheus có thể được cài đặt bằng docker image.
Để chạy container Prometheus, hãy thực thi lệnh sau trong Terminal macOS của bạn:
docker run -it \
--publish 9090:9090 \
--name rs-prometheus \
--mount source=rs-prometheus-volume,target=/prometheus \
prom/prometheus \
--web.enable-otlp-receiver
Mở cổng 9090 để cho phép truy cập vào dashboard Prometheus từ bên ngoài container docker.
Để cho phép nhận metrics từ BackgroundService Worker .NET của bạn, bạn phải kích hoạt Otlp với tham số --web.enable-otlp-receiver.
Bây giờ hãy khởi động dự án worker của bạn và truy cập vào dashboard Prometheus.
Về tên metrics
Nếu bạn chạy một truy vấn sử dụng tên metric đã đặt trong code worker, bạn sẽ không tìm thấy gì. Điều này là do Prometheus tạo tên metrics dựa trên tên và đơn vị đã cho.
Vì vậy, tốt nhất là khám phá các metrics hiện có trong instance Prometheus.
Sau khi nhấp vào biểu tượng ba chấm, chọn tùy chọn “Explore metrics”.
Trong giao diện mới, bạn sẽ tìm thấy tên metric của mình, sao chép nó và quay lại trang truy vấn để thực hiện truy vấn.
Kết luận
Việc tích hợp OpenTelemetry vào .NET Worker service và xuất metrics sang Prometheus là một quy trình đơn giản nhưng mang lại giá trị to lớn trong việc giám sát và vận hành hệ thống. Với các gói NuGet chính thức và sự hỗ trợ từ nền tảng .NET, bạn có thể nhanh chóng biến ứng dụng background của mình thành một hệ thống có khả năng quan sát đầy đủ.



