Orleans 可观察性

可观测性是分布式系统最重要的方面之一。 它是在任何给定时间了解系统状态的能力。 可以通过各种方式实现此目的,包括日志记录、指标和分布式跟踪。

伐木业

Orleans 对所有服务粒度和客户端日志使用 Microsoft.Extensions.Logging 。 可以使用与Microsoft.Extensions.Logging兼容的任何日志记录提供程序。 应用代码依赖于 依赖项注入 来获取一个实例 ILogger<TCategoryName> ,并使用它来记录消息。 有关详细信息,请参阅 .NET 中的日志记录

指标

指标是一段时间内报告的数字度量值。 你最常使用它们来监视应用程序的运行状况并生成警报。 有关详细信息,请参阅 .NET 中的指标。 Orleans 使用 System.Diagnostics.Metrics API 收集指标。 这些指标将公开给 OpenTelemetry 项目,该项目将其导出到各种监视系统。

若要在不进行任何代码更改的情况下监视应用,请使用 dotnet counters .NET 诊断工具。 要监视特定<ProcessName>的OrleansActivitySource计数器,请使用如下所示的dotnet counters monitor命令:

dotnet counters monitor -n <ProcessName> --counters Microsoft.Orleans

假设你正在运行 Orleans GPS 跟踪器示例应用 ,并使用命令在单独的终端 dotnet counters monitor 中对其进行监视。 以下输出是典型的:

Press p to pause, r to resume, q to quit.
    Status: Running
[Microsoft.Orleans]
    orleans-app-requests-latency-bucket (Count / 1 sec)                    0
        duration=10000ms                                                   0
        duration=1000ms                                                    0
        duration=100ms                                                     0
        duration=10ms                                                      0
        duration=15000ms                                                   0
        duration=1500ms                                                    0
        duration=1ms                                                   2,530
        duration=2000ms                                                    0
        duration=200ms                                                     0
        duration=2ms                                                       0
        duration=400ms                                                     0
        duration=4ms                                                       0
        duration=5000ms                                                    0
        duration=50ms                                                      0
        duration=6ms                                                       0
        duration=800ms                                                     0
        duration=8ms                                                       0
        duration=9223372036854775807ms                                     0
    orleans-app-requests-latency-count (Count / 1 sec)                 2,530
    orleans-app-requests-latency-sum (Count / 1 sec)                       0
    orleans-catalog-activation-working-set                                36
    orleans-catalog-activations                                           38
    orleans-consistent-ring-range-percentage-average                     100
    orleans-consistent-ring-range-percentage-local                       100
    orleans-consistent-ring-size                                           1
    orleans-directory-cache-size                                          27
    orleans-directory-partition-size                                      26
    orleans-directory-ring-local-portion-average-percentage              100
    orleans-directory-ring-local-portion-distance                          0
    orleans-directory-ring-local-portion-percentage                        0
    orleans-directory-ring-size                                        1,295
    orleans-gateway-received (Count / 1 sec)                           1,291
    orleans-gateway-sent (Count / 1 sec)                               2,582
    orleans-messaging-processing-activation-data                           0
    orleans-messaging-processing-dispatcher-forwarded (Count / 1           0
    orleans-messaging-processing-dispatcher-processed (Count / 1       2,543
        Direction=Request,Status=Ok                                    2,582
    orleans-messaging-processing-dispatcher-received (Count / 1        1,271
        Context=Grain,Direction=Request                                1,291
        Context=None,Direction=Request                                 1,291
    orleans-messaging-processing-ima-enqueued (Count / 1 sec)          5,113

有关详细信息,请参阅调查性能计数器 (dotnet-counters)

Orleans 米

Orleans 使用 System.Diagnostics.Metrics API 收集指标。 Orleans 将每个计量分类为以域为中心的问题,例如网络、消息传送、网关等。以下小节描述了计量 Orleans 的使用。

网络

下表显示了用于监视 Orleans 网络层的网络计量的集合。

计量器名称 类型 DESCRIPTION
orleans-networking-sockets-closed Counter<T> 已关闭的套接字计数。
orleans-networking-sockets-opened Counter<T> 已打开的套接字计数。

消息传送

下表显示了用于监视 Orleans 消息层的消息计量集合。

计量器名称 类型 DESCRIPTION
orleans-messaging-sent-messages-size Histogram<T> 一个直方图,表示已发送的消息的大小(以字节为单位)。
orleans-messaging-received-messages-size Histogram<T> 一个直方图,表示已接收的消息的大小(以字节为单位)。
orleans-messaging-sent-header-size ObservableCounter<T> 一个可观察计数器,表示发送的标头字节数。
orleans-messaging-received-header-size ObservableCounter<T> 一个可观察计数器,表示收到的标头字节数。
orleans-messaging-sent-failed Counter<T> 发送失败的消息计数
orleans-messaging-sent-dropped Counter<T> 已删除的消息计数。
orleans-messaging-processing-dispatcher-received ObservableCounter<T> 一个可观察计数器,表示调度程序接收的消息数。
orleans-messaging-processing-dispatcher-processed ObservableCounter<T> 一个可观察计数器,表示调度程序处理的消息数。
orleans-messaging-processing-dispatcher-forwarded ObservableCounter<T> 一个可观察的计数器,用于表示调度程序转发的消息数量。
orleans-messaging-processing-ima-received ObservableCounter<T> 一个可观察计数器,表示收到的传入消息数。
orleans-messaging-processing-ima-enqueued ObservableCounter<T> 一个可以监控的计数器,表示排队的传入消息数。
orleans-messaging-processing-activation-data ObservableGauge<T> 可观测的仪表,表示所有处理激活数据。
orleans-messaging-pings-sent Counter<T> 发送的 ping 计数。
orleans-messaging-pings-received Counter<T> 收到的 ping 计数。
orleans-messaging-pings-reply-received Counter<T> 收到的 ping 答复计数。
orleans-messaging-pings-reply-missed Counter<T> 未收到的 ping 回复计数。
orleans-messaging-expired" Counter<T> 已过期消息的数量。
orleans-messaging-rejected Counter<T> 被拒绝消息的计数
orleans-messaging-rerouted Counter<T> 重新路由消息的数量。
orleans-messaging-sent-local ObservableCounter<T> 一个可观察计数器,表示发送的本地消息数。

网关

下表显示了用于监视网关层的 Orleans 网关计量集合。

计量器名称 类型 DESCRIPTION
orleans-gateway-connected-clients UpDownCounter<T> 一个向上/向下计数器,表示连接的客户端数。
orleans-gateway-sent Counter<T> 发送的网关消息计数。
orleans-gateway-received Counter<T> 接收到的网关消息数量。
orleans-gateway-load-shedding Counter<T> 由于网关过载而被拒绝的网关负载卸载消息计数。

运行时

下表显示了用于监视运行时层的 Orleans 运行时计量集合。

计量器名称 类型 DESCRIPTION
orleans-scheduler-long-running-turns Counter<T> 调度器中长期运行调度的计数。
orleans-runtime-total-physical-memory ObservableCounter<T> 一个可观测计数器,表示运行时的总内存(以 MB 为单位)。Orleans
orleans-runtime-available-memory ObservableCounter<T> 表示 Orleans 运行时可用内存(以 MB 为单位)的可监控计数器。

目录

下表显示了用于监视 Orleans 目录层的目录计量的集合。

计量器名称 类型 DESCRIPTION
orleans-catalog-activations ObservableGauge<T> 表示目录激活数的可观察仪表。
orleans-catalog-activation-working-set ObservableGauge<T> 一个用于表示工作集中的激活次数的可观察仪表。
orleans-catalog-activation-created Counter<T> 已创建的激活计数。
orleans-catalog-activation-destroyed Counter<T> 销毁的激活计数。
orleans-catalog-activation-failed-to-activate Counter<T> 激活失败次数统计。
orleans-catalog-activation-collections Counter<T> 空闲激活集合计数。
orleans-catalog-activation-shutdown Counter<T> 关闭激活次数。
orleans-catalog-activation-non-existent Counter<T> 不存在的激活计数。
orleans-catalog-activation-concurrent-registration-attempts Counter<T> 并发激活注册尝试的总计数。

目录

下表显示了用于监视 Orleans 目录层的目录计量的集合。

计量器名称 类型 DESCRIPTION
orleans-directory-lookups-local-issued Counter<T> 执行的本地查找请求数量。
orleans-directory-lookups-local-successes Counter<T> 本地成功查找的次数统计。
orleans-directory-lookups-full-issued Counter<T> 执行的全目录查询计数。
orleans-directory-lookups-remote-sent Counter<T> 已发送的远程目录查询次数计数。
orleans-directory-lookups-remote-received Counter<T> 收到的远程目录查找数量计数。
orleans-directory-lookups-local-directory-issued Counter<T> 已进行的本地目录查找次数。
orleans-directory-lookups-local-directory-successes Counter<T> 本地目录成功查询的计数。
orleans-directory-lookups-cache-issued Counter<T> 已发出的缓存查找计数。
orleans-directory-lookups-cache-successes Counter<T> 缓存中成功查找的次数计数。
orleans-directory-validations-cache-sent Counter<T> 发送的目录缓存验证计数。
orleans-directory-validations-cache-received Counter<T> 收到的目录缓存验证计数。
orleans-directory-partition-size ObservableGauge<T> 表示目录分区大小的可观察仪表。
orleans-directory-cache-size ObservableGauge<T> 表示目录缓存大小的可观察仪表。
orleans-directory-ring-size ObservableGauge<T> 一个可用于监测目录环大小的仪表。
orleans-directory-ring-local-portion-distance ObservableGauge<T> 一个可观测仪表,表示本地目录分区拥有的环范围。
orleans-directory-ring-local-portion-percentage ObservableGauge<T> 一个可观测的仪表,用于显示本地目录所拥有的环范围,以总范围的百分比表示。
orleans-directory-ring-local-portion-average-percentage ObservableGauge<T> 一个可观测仪表,表示每个孤岛拥有的目录环范围的平均百分比,从而表示平衡目录所有权的方式。
orleans-directory-registrations-single-act-issued Counter<T> 已颁发的目录单一激活注册数量。
orleans-directory-registrations-single-act-local Counter<T> 由本地目录分区处理的单次激活注册计数。
orleans-directory-registrations-single-act-remote-sent Counter<T> 发送到远程目录分区的目录单一激活注册计数。
orleans-directory-registrations-single-act-remote-received Counter<T> 从远程主机收到的目录单次激活注册计数。
orleans-directory-unregistrations-issued Counter<T> 目录取消注册的数量。
orleans-directory-unregistrations-local Counter<T> 由本地目录分区处理的目录注销计数。
orleans-directory-unregistrations-remote-sent Counter<T> 发送到远程目录分区的取消注册目录的计数。
orleans-directory-unregistrations-remote-received Counter<T> 从远程主机接收的目录注销计数。
orleans-directory-unregistrations-many-issued Counter<T> 目录多重激活注销数量。
orleans-directory-unregistrations-many-remote-sent Counter<T> 发送到远程目录分区的目录多次激活注销计数。
orleans-directory-unregistrations-many-remote-received Counter<T> 从远程主机接收的目录多次激活注销的计数。

一致的环

下表显示了一组用于监控环状层的一致环形仪表。

计量器名称 类型 DESCRIPTION
orleans-consistent-ring-size ObservableGauge<T> 一个可观测的量表,表示恒定的环尺寸。
orleans-consistent-ring-range-percentage-local ObservableGauge<T> 一个可观测的指标,表示稳定的环形区域的百分比。
orleans-consistent-ring-range-percentage-average ObservableGauge<T> 一个可观测的仪表,表示环形平均百分比的一致性。

看门狗

下表显示了一组用于监测 Orleans 监视层的检测仪表。

计量器名称 类型 DESCRIPTION
orleans-watchdog-health-checks Counter<T> 看门狗健康检查计数。
orleans-watchdog-health-checks-failed Counter<T> 监视程序状况检查失败的计数。

客户

下表显示了用于监视客户端层的 Orleans 客户端计量集合。

计量器名称 类型 DESCRIPTION
orleans-client-connected-gateways ObservableGauge<T> 表示连接的网关客户端数的可观察仪表。

其他

下表显示了用于监视各种层的杂项计量的集合。

计量器名称 类型 DESCRIPTION
orleans-grains Counter<T> 表示谷粒数量的计数。
orleans-system-targets Counter<T> 表示系统目标数量的计数值。

应用请求

下表显示了用于监视 Orleans 应用请求层的应用请求计量的集合。

计量器名称 类型 DESCRIPTION
orleans-app-requests-latency ObservableCounter<T> 表示应用请求延迟的可观察计数器。
orleans-app-requests-timedout ObservableCounter<T> 一个可观察计数器,表示已超时的应用请求。

提醒事项

下表显示了用于监视提醒层的 Orleans 提醒计量集合。

计量器名称 类型 DESCRIPTION
orleans-reminders-tardiness Histogram<T> 一个直方图,表示提醒延迟的秒数。
orleans-reminders-active ObservableGauge<T> 用于表示活动提醒数量的可观测仪表。
orleans-reminders-ticks-delivered Counter<T> 一个计数,表示已发送的提醒提示次数。

储存

下表显示了用于监视 Orleans 存储层的存储计量集合。

计量器名称 类型 DESCRIPTION
orleans-storage-read-errors Counter<T> 表示存储读取错误的计数。
orleans-storage-write-errors Counter<T> 一个表示存储写入错误数量的计数。
orleans-storage-clear-errors Counter<T> 表示存储清除错误数量的计数。
orleans-storage-read-latency Histogram<T> 一个直方图,表示存储读取延迟(以毫秒为单位)。
orleans-storage-write-latency Histogram<T> 一个直方图,表示存储写入延迟(以毫秒为单位)。
orleans-storage-clear-latency Histogram<T> 一个直方图,表示存储清除延迟(以毫秒为单位)。

溪流

下表显示了用于监视 Orleans 流层的流计量集合。

计量器名称 类型 DESCRIPTION
orleans-streams-pubsub-producers-added Counter<T> 添加了流式发布订阅制作者的计数。
orleans-streams-pubsub-producers-removed Counter<T> 删除了流式发布订阅制作者的计数。
orleans-streams-pubsub-producers Counter<T> 流式发布订阅制作者的计数。
orleans-streams-pubsub-consumers-added Counter<T> 添加了流式处理发布订阅使用者的计数。
orleans-streams-pubsub-consumers-removed Counter<T> 删除了流式发布订阅使用者的计数。
orleans-streams-pubsub-consumers Counter<T> 流媒体发布订阅系统中的订阅者计数。
orleans-streams-persistent-stream-pulling-agents ObservableGauge<T> 一个可观察的仪表,表示持久流拉取代理的数量。
orleans-streams-persistent-stream-messages-read Counter<T> 读取的持久流消息计数。
orleans-streams-persistent-stream-messages-sent Counter<T> 发送的持久流消息计数。
orleans-streams-persistent-stream-pubsub-cache-size ObservableGauge<T> 一个可观察的仪表,表示持久性流 pubsub 缓存大小。
orleans-streams-queue-initialization-failures Counter<T> 蒸汽队列初始化失败计数。
orleans-streams-queue-initialization-duration Counter<T> 蒸汽队列初始化次数的计数。
orleans-streams-queue-initialization-exceptions Counter<T> 蒸汽队列初始化异常计数。
orleans-streams-queue-read-failures Counter<T> 蒸汽系统队列读取失败次数。
orleans-streams-queue-read-duration Counter<T> Steam 队列读取次数记录。
orleans-streams-queue-read-exceptions Counter<T> Steam 队列读取异常计数。
orleans-streams-queue-shutdown-failures Counter<T> 蒸汽队列的关闭失败次数统计。
orleans-streams-queue-shutdown-duration Counter<T> 关于蒸汽队列关闭次数的统计。
orleans-streams-queue-shutdown-exceptions Counter<T> Steam队列关闭异常计数。
orleans-streams-queue-messages-received ObservableCounter<T> 一个可观察计数器,表示收到的流队列消息数。
orleans-streams-queue-oldest-message-enqueue-age ObservableGauge<T> 一个可观测仪表,表示最早排队消息的年龄。
orleans-streams-queue-newest-message-enqueue-age ObservableGauge<T> 一个可观测的指示器,表示最新入队消息的时间。
orleans-streams-block-pool-total-memory ObservableCounter<T> 一个可观察计数器,表示流块池的总内存(以字节为单位)。
orleans-streams-block-pool-available-memory ObservableCounter<T> 一个可观察计数器,表示流块池可用内存(以字节为单位)。
orleans-streams-block-pool-claimed-memory ObservableCounter<T> 一个可观察计数器,表示流块池声明的内存(以字节为单位)。
orleans-streams-block-pool-released-memory ObservableCounter<T> 一个可观察计数器,表示流块池释放的内存(以字节为单位)。
orleans-streams-block-pool-allocated-memory ObservableCounter<T> 一个可观察计数器,表示流块池分配的内存(以字节为单位)。
orleans-streams-queue-cache-size ObservableCounter<T> 一个可观察计数器,表示流队列缓存大小(以字节为单位)。
orleans-streams-queue-cache-length ObservableCounter<T> 表示流队列长度的可观察计数器。
orleans-streams-queue-cache-messages-added ObservableCounter<T> 一个可观察的计数器,用于表示已添加到流队列中的消息数量。
orleans-streams-queue-cache-messages-purged ObservableCounter<T> 一个可观察计数器,表示清除的流队列消息。
orleans-streams-queue-cache-memory-allocated ObservableCounter<T> 一个可观察计数器,表示分配的流队列内存。
orleans-streams-queue-cache-memory-released ObservableCounter<T> 表示释放的流队列内存的可观察计数器。
orleans-streams-queue-cache-oldest-to-newest-duration ObservableGauge<T> 一个可观测仪表,表示从最早到最新的流队列缓存的持续时间。
orleans-streams-queue-cache-oldest-age ObservableGauge<T> 一个可观测仪表,表示最早缓存消息的年龄。
orleans-streams-queue-cache-pressure ObservableGauge<T> 表示流队列缓存压力的可观察量表。
orleans-streams-queue-cache-under-pressure ObservableGauge<T> 一个可观察的仪表,表示流队列缓存是否处于压力之下。
orleans-streams-queue-cache-pressure-contribution-count ObservableCounter<T> 表示流队列缓存压力贡献的可观察计数器。

交易

下表显示了用于监视 Orleans 事务层的事务计量集合。

计量器名称 类型 DESCRIPTION
orleans-transactions-started ObservableCounter<T> 表示已启动事务数的可观察计数器。
orleans-transactions-successful ObservableCounter<T> 表示成功事务数的可观察计数器。
orleans-transactions-failed ObservableCounter<T> 一个可用于显示失败事务数量的计数器。
orleans-transactions-throttled ObservableCounter<T> 表示受限制事务数的可观察计数器。

普罗 米修斯

可以将各种第三方指标提供程序用于Orleans。 一个常用示例是 Prometheus,可用于使用 OpenTelemetry 从应用中收集指标。

若要将 OpenTelemetry 和 Prometheus 与 Orleans 一起使用,请调用以下 IServiceCollection 扩展方法:

builder.Services.AddOpenTelemetry()
    .WithMetrics(metrics =>
    {
        metrics
            .AddPrometheusExporter()
            .AddMeter("Microsoft.Orleans");
    });

重要

OpenTelemetry.Exporter.PrometheusOpenTelemetry.Exporter.Prometheus.AspNetCore NuGet 包目前都作为发布候选项处于预览状态。 不建议将其用于生产用途。

AddPrometheusExporter方法可确保将PrometheusExporter添加到builder中。 Orleans使用一个Meter,它名叫"Microsoft.Orleans",来为多个Orleans特定指标创建Counter<T>实例。 使用AddMeter 方法指定要订阅的计量的名称,在本例中使用 "Microsoft.Orleans"

配置导出程序并生成应用后,在 IEndpointRouteBuilder 上调用 MapPrometheusScrapingEndpointapp 实例),以将指标暴露给 Prometheus。 例如:

WebApplication app = builder.Build();

app.MapPrometheusScrapingEndpoint();
app.Run();

分布式跟踪

分布式跟踪是一组用于监视和故障排除分布式应用程序的工具和做法。 它是可观测性的关键组成部分,是了解应用行为的关键工具。 Orleans 支持使用 OpenTelemetry 进行分布式跟踪。

无论选择了哪个分布式跟踪导出程序,请调用:

引用回 Orleans GPS 跟踪器示例应用,可以使用 Zipkin 分布式跟踪系统通过更新 Program.cs来监视应用。 要将 OpenTelemetry 和 Zipkin 与 Orleans 一起使用,请调用以下 IServiceCollection 扩展方法:

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        // Set a service name
        tracing.SetResourceBuilder(
            ResourceBuilder.CreateDefault()
                .AddService(serviceName: "GPSTracker", serviceVersion: "1.0"));

        tracing.AddSource("Microsoft.Orleans.Runtime");
        tracing.AddSource("Microsoft.Orleans.Application");

        tracing.AddZipkinExporter(zipkin =>
        {
            zipkin.Endpoint = new Uri("http://localhost:9411/api/v2/spans");
        });
    });

重要

OpenTelemetry.Exporter.Zipkin NuGet 包目前以候选版本的形式处于预览状态。 不建议将其用于生产用途。

Zipkin 跟踪显示在 Jaeger UI 中(Jaeger 是一个使用相同数据格式的 Zipkin 替代方案):

Orleans GPS 跟踪器示例应用:Jaeger UI 跟踪。

有关详细信息,请参阅 分布式跟踪

Orleans 通过 ITelemetryConsumer 接口输出其运行时统计信息和指标。 应用程序可以为其接收器和客户端注册一个或多个遥测使用者,以接收运行时定期发布的统计信息和指标 Orleans 。 这些可以是常用遥测分析解决方案的使用者,也可以是用于任何其他目标和用途的自定义解决方案。 目前,代码库中包含 Orleans 三个遥测使用者。

它们作为单独的 NuGet 包发布:

  • Microsoft.Orleans.OrleansTelemetryConsumers.AI:用于发布到 Azure Application Insights

  • Microsoft.Orleans.OrleansTelemetryConsumers.Counters:用于发布到 Windows 性能计数器。 运行时 Orleans 会不断更新其中的许多。 NuGet 包中包含的 Microsoft.Orleans.CounterControlCounterControl.exe 工具有助于注册必要的性能计数器类别。 它必须使用提升的权限运行。 使用任何标准监视工具监视性能计数器。

  • Microsoft.Orleans.OrleansTelemetryConsumers.NewRelic:发布到 New Relic

若要将孤岛和客户端配置为使用遥测使用者,孤岛的配置代码如下所示:

var siloHostBuilder = new HostBuilder()
    .UseOrleans(c =>
    {
        c.AddApplicationInsightsTelemetryConsumer("INSTRUMENTATION_KEY");
    });

客户端配置代码如下所示:

var clientBuilder = new ClientBuilder();
clientBuilder.AddApplicationInsightsTelemetryConsumer("INSTRUMENTATION_KEY");

若要使用自定义的TelemetryConfiguration(例如包含TelemetryProcessorsTelemetrySinks等),silo 配置代码如下所示:

var telemetryConfiguration = TelemetryConfiguration.CreateDefault();
var siloHostBuilder = new HostBuilder()
    .UseOrleans(c =>
    {
        c.AddApplicationInsightsTelemetryConsumer(telemetryConfiguration);
    });

客户端配置代码如下所示:

var clientBuilder = new ClientBuilder();
var telemetryConfiguration = TelemetryConfiguration.CreateDefault();
clientBuilder.AddApplicationInsightsTelemetryConsumer(telemetryConfiguration);

另请参阅