ASP.NET Core: Ghi nhật ký và chẩn đoán trong gRPC trên .NET
Trong bài viết này
Bài viết này cung cấp hướng dẫn thu thập các chẩn đoán từ ứng dụng gRPC để giúp khắc phục sự cố. Các chủ đề được đề cập bao gồm:
- Ghi nhật ký (Logging) - Nhật ký có cấu trúc được ghi vào ghi nhật ký .NET Core. ILogger được các framework ứng dụng sử dụng để ghi nhật ký và được người dùng sử dụng để đăng nhập vào ứng dụng của riêng họ.
- Theo dõi (Tracing) - Các sự kiện liên quan đến thao tác được viết bằng cách sử dụng
DiaganosticSource
vàActivity
. Dấu vết từ nguồn chẩn đoán thường được các thư viện như Application Insights và OpenTelemetry sử dụng để thu thập dữ liệu đo từ xa của ứng dụng. - Số liệu (Metric) - Trình bày các thước đo dữ liệu theo khoảng thời gian, ví dụ: yêu cầu mỗi giây. Các số liệu được phát ra bằng cách sử dụng
EventCounter
và có thể được quan sát bằng công cụ dòng lệnh dotnet-counters hoặc với Thông tin chi tiết về ứng dụng.
Ghi nhật ký (Logging)
Các dịch vụ gRPC và máy khách gRPC ghi nhật ký bằng cách sử dụng tính năng ghi nhật ký .NET Core. Nhật ký là nơi tốt để bắt đầu khi gỡ lỗi hành vi không mong muốn trong ứng dụng khách và dịch vụ.
Ghi nhật ký dịch vụ gRPC
Cảnh báo
Nhật ký phía máy chủ có thể chứa thông tin nhạy cảm từ ứng dụng của bạn. Không bao giờ đăng nhật ký thô từ ứng dụng production lên các diễn đàn công khai như GitHub.
Vì các dịch vụ gRPC được lưu trữ trên ASP.NET Core nên nó sử dụng hệ thống ghi nhật ký ASP.NET Core. Trong cấu hình mặc định, gRPC ghi lại thông tin tối thiểu nhưng có thể định cấu hình ghi nhật ký. Xem tài liệu về ghi nhật ký ASP.NET Core để biết chi tiết về cách định cấu hình ghi nhật ký ASP.NET Core.
gRPC thêm nhật ký vào danh mục Grpc
. Để bật nhật ký chi tiết từ gRPC, hãy định cấu hình tiền tố Grpc
theo cấp độ Debug
trong file appsettings.json
bằng cách thêm các mục sau vào tiểu mục LogLevel
trong Logging
:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Grpc": "Debug"
}
}
}
Ghi nhật ký cũng có thể được cấu hình trong Program.cs
bằng ConfigureLogging
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddFilter("Grpc", LogLevel.Debug);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Khi không sử dụng cấu hình dựa trên JSON, hãy đặt giá trị cấu hình sau trong hệ thống cấu hình:
Logging:LogLevel:Grpc
=Debug
Kiểm tra tài liệu dành cho hệ thống cấu hình của bạn để xác định cách chỉ định các giá trị cấu hình lồng nhau. Ví dụ: khi sử dụng biến môi trường, hai ký tự _
được sử dụng thay vì :
(ví dụ: Logging__LogLevel__Grpc
).
Bạn nên sử dụng cấp độ Debug
khi thu thập chẩn đoán chi tiết cho một ứng dụng. Cấp độ Trace
sẽ tạo ra chẩn đoán ở mức độ thấp và hiếm khi cần thiết để chẩn đoán sự cố.
Mẫu đầu ra (output) ghi nhật ký
Dưới đây là ví dụ về đầu ra của console ở cấp độ Debug
của dịch vụ gRPC:
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
dbug: Grpc.AspNetCore.Server.ServerCallHandler[1]
Reading message.
info: GrpcService.GreeterService[0]
Hello World
dbug: Grpc.AspNetCore.Server.ServerCallHandler[6]
Sending message.
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 1.4113ms 200 application/grpc
Truy cập nhật ký phía máy chủ
Cách truy cập nhật ký phía máy chủ tùy thuộc vào môi trường của ứng dụng.
Là một ứng dụng console
Nếu bạn đang chạy trong ứng dụng console thì Nhật ký console sẽ được bật theo mặc định. Nhật ký gRPC sẽ xuất hiện trong console.
Các môi trường khác
Nếu ứng dụng được triển khai sang môi trường khác (ví dụ: Docker, Kubernetes hoặc Windows Service), hãy xem Đăng nhập .NET Core và ASP.NET Core để biết thêm thông tin về cách định cấu hình nhà cung cấp dịch vụ ghi nhật ký phù hợp với môi trường.
Ghi nhật ký máy khách gRPC
Cảnh báo
Nhật ký phía máy khách có thể chứa thông tin nhạy cảm từ ứng dụng của bạn. Không bao giờ đăng nhật ký thô từ ứng dụng production lên các diễn đàn công khai như GitHub.
Để lấy nhật ký từ máy khách .NET, hãy đặt property GrpcChannelOptions.LoggerFactory
khi kênh của máy khách được tạo. Khi gọi dịch vụ gRPC từ ứng dụng ASP.NET Core, thì factory ghi nhật ký có thể được giải quyết bằng cách chèn phụ thuộc (DI):
[ApiController]
[Route("[controller]")]
public class GreetingController : ControllerBase
{
private ILoggerFactory _loggerFactory;
public GreetingController(ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
}
[HttpGet]
public async Task<ActionResult<string>> Get(string name)
{
var channel = GrpcChannel.ForAddress("https://localhost:5001",
new GrpcChannelOptions { LoggerFactory = _loggerFactory });
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = name });
return Ok(reply.Message);
}
}
Một cách khác để kích hoạt tính năng ghi nhật ký ứng dụng khách là sử dụng factory ứng dụng khách gRPC để tạo ứng dụng khách. Máy khách gRPC đã đăng ký với factory máy khách và được phân giải từ DI sẽ tự động sử dụng tính năng ghi nhật ký đã định cấu hình của ứng dụng.
Nếu ứng dụng không sử dụng DI, hãy tạo một thể hiện ILoggerFactory
mới bằng LoggerFactory.Create. Để truy cập phương pháp này, hãy thêm gói Microsoft.Extensions.Logging vào ứng dụng của bạn.
var loggerFactory = LoggerFactory.Create(logging =>
{
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Debug);
});
var channel = GrpcChannel.ForAddress("https://localhost:5001",
new GrpcChannelOptions { LoggerFactory = loggerFactory });
var client = Greeter.GreeterClient(channel);
Phạm vi nhật ký máy khách gRPC
Máy khách gRPC thêm phạm vi ghi nhật ký vào nhật ký được thực hiện trong lời gọi gRPC. Phạm vi có siêu dữ liệu liên quan đến lệnh gọi gRPC:
- GrpcMethodType - Loại phương thức gRPC. Giá trị có thể là tên từ enum
Grpc.Core.MethodType
. Ví dụ:Unary
. - GrpcUri - URI tương đối của phương thức gRPC. Ví dụ: /greet.Greeter/SayHellos.
Mẫu đầu ra ghi nhật ký
Dưới đây là ví dụ về đầu ra của console ở cấp độ Debug
của máy khách gRPC:
dbug: Grpc.Net.Client.Internal.GrpcCall[1]
Starting gRPC call. Method type: 'Unary', URI: 'https://localhost:5001/Greet.Greeter/SayHello'.
dbug: Grpc.Net.Client.Internal.GrpcCall[6]
Sending message.
dbug: Grpc.Net.Client.Internal.GrpcCall[1]
Reading message.
dbug: Grpc.Net.Client.Internal.GrpcCall[4]
Finished gRPC call.
Theo dõi (Tracing)
Các dịch vụ gRPC và ứng dụng khách gRPC cung cấp thông tin về các lệnh gọi gRPC bằng DiagnosticSource và Activity.
- .NET gRPC sử dụng một action để thể hiện lời gọi gRPC.
- Các sự kiện theo dõi được ghi vào nguồn chẩn đoán khi bắt đầu và kết thúc action lời gọi gRPC.
- Việc theo dõi không nắm bắt được thông tin về thời điểm tin nhắn (message) được gửi trong suốt thời gian của lời gọi truyền phát gRPC.
Theo dõi dịch vụ gRPC
Các dịch vụ gRPC được lưu trữ trên ASP.NET Core, nơi báo cáo các sự kiện về các yêu cầu HTTP đến. Siêu dữ liệu cụ thể của gRPC được thêm vào chẩn đoán yêu cầu HTTP hiện có mà ASP.NET Core cung cấp.
- Tên nguồn chẩn đoán là
Microsoft.AspNetCore
. - Tên action là
Microsoft.AspNetCore.Hosting.HttpRequestIn
.- Tên của phương thức gRPC được lời gọi gRPC gọi sẽ được thêm dưới dạng thẻ có tên
grpc.method
. - Mã trạng thái của lời gọi gRPC khi hoàn tất sẽ được thêm dưới dạng thẻ có tên
grpc.status_code
.
- Tên của phương thức gRPC được lời gọi gRPC gọi sẽ được thêm dưới dạng thẻ có tên
Theo dõi máy khách gRPC
Máy khách .NET gRPC sử dụng HttpClient
để thực hiện lời gọi gRPC. Mặc dù HttpClient
ghi các sự kiện chẩn đoán, ứng dụng khách .NET gRPC vẫn cung cấp nguồn, hoạt động và sự kiện chẩn đoán tùy chỉnh để có thể thu thập thông tin đầy đủ về lời gọi gRPC.
- Tên nguồn chẩn đoán là
Grpc.Net.Client
. - Tên hoạt động là
Grpc.Net.Client.GrpcOut
.- Tên của phương thức gRPC được lời gọi gRPC gọi sẽ được thêm dưới dạng thẻ có tên
grpc.method
. - Mã trạng thái của lời gọi gRPC khi hoàn tất sẽ được thêm dưới dạng thẻ có tên
grpc.status_code
.
- Tên của phương thức gRPC được lời gọi gRPC gọi sẽ được thêm dưới dạng thẻ có tên
Thu thập dấu vết
Cách dễ nhất để sử dụng DiagnosticSource
là định cấu hình thư viện đo từ xa (telemetry library) như Thông tin chi tiết về ứng dụng hoặc OpenTelemetry trong ứng dụng của bạn. Thư viện sẽ xử lý thông tin về các lệnh gọi gRPC cùng với việc đo từ xa của ứng dụng khác.
Bạn có thể xem tính năng theo dõi trong dịch vụ được quản lý như Thông tin chi tiết về ứng dụng hoặc chạy dưới dạng hệ thống theo dõi được phân phối của riêng bạn. OpenTelemetry hỗ trợ xuất dữ liệu theo dõi sang Jaeger và Zipkin.
DiagnosticSource
có thể sử dụng các sự kiện theo dõi trong mã bằng cách sử dụng DiagnosticListener
. Để biết thông tin về cách nghe nguồn chẩn đoán có mã, hãy xem hướng dẫn sử dụng DiagnosticSource.
Ghi chú
Các thư viện đo từ xa hiện không thu thập dữ liệu đo từ xa cụ thể
Grpc.Net.Client.GrpcOut
của gRPC. Công việc cải thiện các thư viện đo từ xa ghi lại dấu vết này đang được tiến hành.
Số liệu (Metric)
Số liệu là sự thể hiện các thước đo dữ liệu theo khoảng thời gian, chẳng hạn như số yêu cầu mỗi giây. Dữ liệu số liệu cho phép quan sát trạng thái của ứng dụng ở mức cao. Số liệu .NET gRPC được phát ra bằng cách sử dụng EventCounter
.
Số liệu dịch vụ gRPC
Số liệu máy chủ gRPC được báo cáo trên nguồn sự kiện Grpc.AspNetCore.Server
.
Tên | Mô tả |
---|---|
total-calls |
Tổng số lời gọi |
current-calls |
Lời gọi hiện tại |
calls-failed |
Tổng số lời gọi không thành công |
calls-deadline-exceeded |
Tổng số lời gọi đã vượt quá thời hạn |
messages-sent |
Tổng số tin nhắn đã gửi |
messages-received |
Tổng số tin nhắn đã nhận |
calls-unimplemented |
Tổng số lời gọi chưa thực hiện |
ASP.NET Core cũng cung cấp số liệu riêng về nguồn sự kiện Microsoft.AspNetCore.Hosting
.
Số liệu máy khách gRPC
Số liệu máy khách gRPC được báo cáo trên nguồn sự kiện Grpc.Net.Client
.
Tên | Mô tả |
---|---|
total-calls |
Tổng số lời gọi |
current-calls |
Lời gọi hiện tại |
calls-failed |
Tổng số lời gọi không thành công |
calls-deadline-exceeded |
Tổng số lời gọi đã vượt quá thời hạn |
messages-sent |
Tổng số tin nhắn đã gửi |
messages-received |
Tổng số tin nhắn đã nhận |
Giám sát số liệu
dotnet-counters là một công cụ giám sát hiệu suất để theo dõi tình trạng đặc biệt và điều tra hiệu suất cấp độ đầu tiên. Giám sát ứng dụng .NET bằng tên nhà cung cấp Grpc.AspNetCore.Server
hoặc tên nhà cung cấp Grpc.Net.Client
.
> dotnet-counters monitor --process-id 1902 Grpc.AspNetCore.Server
Press p to pause, r to resume, q to quit.
Status: Running
[Grpc.AspNetCore.Server]
Total Calls 300
Current Calls 5
Total Calls Failed 0
Total Calls Deadline Exceeded 0
Total Messages Sent 295
Total Messages Received 300
Total Calls Unimplemented 0
Một cách khác để giám sát số liệu gRPC là thu thập dữ liệu bộ đếm bằng cách sử dụng gói Microsoft.ApplicationInsights.EventCounterCollector của Application Insights. Sau khi thiết lập, Thông tin chi tiết về ứng dụng sẽ thu thập các bộ đếm .NET phổ biến trong thời gian chạy. Bộ đếm của gRPC không được thu thập theo mặc định nhưng Thông tin chi tiết về ứng dụng có thể được tùy chỉnh để bao gồm các bộ đếm bổ sung.
Chỉ định bộ đếm gRPC để Application Insight thu thập trong Startup.cs
:
using Microsoft.ApplicationInsights.Extensibility.EventCounterCollector;
public void ConfigureServices(IServiceCollection services)
{
//... other code...
services.ConfigureTelemetryModule<EventCounterCollectionModule>(
(module, o) =>
{
// Configure App Insights to collect gRPC counters gRPC services hosted in an ASP.NET Core app
module.Counters.Add(new EventCounterCollectionRequest("Grpc.AspNetCore.Server", "current-calls"));
module.Counters.Add(new EventCounterCollectionRequest("Grpc.AspNetCore.Server", "total-calls"));
module.Counters.Add(new EventCounterCollectionRequest("Grpc.AspNetCore.Server", "calls-failed"));
}
);
}
Tài nguyên bổ sung
- Đăng nhập .NET Core và ASP.NET Core
- gRPC cho cấu hình .NET
- Tích hợp factory máy khách gRPC trong .NET