概述
StreamInstruments 是 Orleans 流系统的性能监控和指标收集组件,它基于 .NET 的 System.Diagnostics.Metrics 框架,用于收集和暴露流系统的关键性能指标。
1. 核心作用
1.1 性能监控
- 实时监控:收集流系统的实时性能数据
- 指标暴露:将指标暴露给监控系统(如 Prometheus、Grafana)
- 问题诊断:帮助识别性能瓶颈和系统问题
1.2 运维支持
- 容量规划:基于历史数据规划系统容量
- 性能调优:识别需要优化的组件
- 健康检查:监控系统健康状态
2. 指标分类
2.1 发布-订阅指标 (PubSub Metrics)
生产者指标
// 生产者添加计数器
public static Counter<int> PubSubProducersAdded =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_PRODUCERS_ADDED);
// 生产者移除计数器
public static Counter<int> PubSubProducersRemoved =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_PRODUCERS_REMOVED);
// 生产者总数计数器
public static Counter<int> PubSubProducersTotal =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_PRODUCERS_TOTAL);
消费者指标
// 消费者添加计数器
public static Counter<int> PubSubConsumersAdded =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_CONSUMERS_ADDED);
// 消费者移除计数器
public static Counter<int> PubSubConsumersRemoved =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_CONSUMERS_REMOVED);
// 消费者总数计数器
public static Counter<int> PubSubConsumersTotal =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_CONSUMERS_TOTAL);
2.2 持久流指标 (Persistent Stream Metrics)
拉取代理指标
// 可观察的拉取代理数量
public static ObservableGauge<int> PersistentStreamPullingAgents;
public static void RegisterPersistentStreamPullingAgentsObserve(Func<Measurement<int>> observeValue)
{
PersistentStreamPullingAgents = Instruments.Meter.CreateObservableGauge<int>(
InstrumentNames.STREAMS_PERSISTENT_STREAM_NUM_PULLING_AGENTS,
observeValue);
}
消息处理指标
// 读取消息计数器
public static Counter<int> PersistentStreamReadMessages =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PERSISTENT_STREAM_NUM_READ_MESSAGES);
// 发送消息计数器
public static Counter<int> PersistentStreamSentMessages =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PERSISTENT_STREAM_NUM_SENT_MESSAGES);
缓存指标
// 可观察的发布-订阅缓存大小
public static ObservableGauge<int> PersistentStreamPubSubCacheSize;
public static void RegisterPersistentStreamPubSubCacheSizeObserve(Func<Measurement<int>> observeValue)
{
PersistentStreamPubSubCacheSize = Instruments.Meter.CreateObservableGauge<int>(
InstrumentNames.STREAMS_PERSISTENT_STREAM_PUBSUB_CACHE_SIZE,
observeValue);
}
3. 使用场景分析
3.1 生产者注册监控
// 在 PubSubRendezvousGrain.cs 中
public async Task<ISet<PubSubSubscriptionState>> RegisterProducer(QualifiedStreamId streamId, GrainId streamProducer)
{
StreamInstruments.PubSubProducersAdded.Add(1); // 记录生产者添加事件
try
{
var publisherState = new PubSubPublisherState(streamId, streamProducer);
State.Producers.Add(publisherState);
await WriteStateAsync();
StreamInstruments.PubSubProducersTotal.Add(1); // 增加生产者总数
}
catch (Exception exc)
{
// 错误处理...
}
}
监控价值:
- 生产者活跃度:监控有多少生产者正在工作
- 注册成功率:通过 Added 和 Total 的差异判断注册成功率
- 系统负载:生产者数量反映系统负载
3.2 消费者注册监控
// 在 PubSubRendezvousGrain.cs 中
public async Task RegisterConsumer(GuidId subscriptionId, QualifiedStreamId streamId, GrainId streamConsumer, string filterData)
{
StreamInstruments.PubSubConsumersAdded.Add(1); // 记录消费者添加事件
try
{
var pubSubState = new PubSubSubscriptionState(subscriptionId, streamId, streamConsumer);
State.Consumers.Add(pubSubState);
await WriteStateAsync();
StreamInstruments.PubSubConsumersTotal.Add(1); // 增加消费者总数
}
catch (Exception exc)
{
// 错误处理...
}
}
监控价值:
- 消费者活跃度:监控有多少消费者正在工作
- 订阅健康度:消费者数量变化反映订阅健康状态
- 消息处理能力:消费者数量影响消息处理能力
3.3 消息投递监控
// 在 PersistentStreamPullingAgent.cs 中
try
{
StreamInstruments.PersistentStreamSentMessages.Add(1); // 记录消息发送
if (batch != null)
{
StreamHandshakeToken newToken = await AsyncExecutorWithRetries.ExecuteWithRetries(
i => DeliverBatchToConsumer(consumerData, batch),
// ... 重试逻辑
);
}
}
catch (Exception exc)
{
// 错误处理...
}
监控价值:
- 消息吞吐量:监控每秒发送的消息数量
- 投递成功率:通过发送和接收的差异判断投递成功率
- 系统性能:消息处理速度反映系统性能
4. 指标类型说明
4.1 Counter(计数器)
- 用途:累计计数,只增不减
- 示例:
PubSubProducersAdded、PersistentStreamSentMessages - 监控:速率、累计值
4.2 ObservableGauge(可观察仪表)
- 用途:当前状态值,可增可减
- 示例:
PersistentStreamPullingAgents、PersistentStreamPubSubCacheSize - 监控:当前值、变化趋势
5. 监控集成
5.1 与 .NET Metrics 集成
// 基于 System.Diagnostics.Metrics
using System.Diagnostics.Metrics;
// 创建 Meter
public static Counter<int> PubSubProducersAdded =
Instruments.Meter.CreateCounter<int>(InstrumentNames.STREAMS_PUBSUB_PRODUCERS_ADDED);
5.2 指标名称规范
// 在 InstrumentNames.cs 中定义
public const string STREAMS_PUBSUB_PRODUCERS_ADDED = "orleans-streams-pubsub-producers-added";
public const string STREAMS_PERSISTENT_STREAM_NUM_SENT_MESSAGES = "orleans-streams-persistent-stream-messages-sent";
命名规范:
- 前缀:
orleans-streams- - 分类:
pubsub-、persistent-stream- - 指标类型:
producers、consumers、messages - 操作:
added、removed、sent、read
6. 实际应用价值
6.1 性能监控仪表板
# Prometheus 查询示例
# 生产者注册速率
rate(orleans_streams_pubsub_producers_added_total[5m])
# 消息发送速率
rate(orleans_streams_persistent_stream_messages_sent_total[5m])
# 当前活跃消费者数量
orleans_streams_pubsub_consumers_total
6.2 告警规则
# Grafana 告警规则示例
- alert: HighMessageBacklog
expr: orleans_streams_persistent_stream_pubsub_cache_size > 10000
for: 5m
labels:
severity: warning
annotations:
summary: "High message backlog detected"
- alert: LowConsumerCount
expr: orleans_streams_pubsub_consumers_total < 5
for: 2m
labels:
severity: critical
annotations:
summary: "Low consumer count detected"
6.3 容量规划
- 生产者数量趋势:预测未来生产者需求
- 消息吞吐量:规划消息队列容量
- 消费者负载:优化消费者分布
7. 最佳实践
7.1 监控配置
// 在应用启动时注册可观察指标
StreamInstruments.RegisterPersistentStreamPullingAgentsObserve(() =>
new Measurement<int>(GetCurrentPullingAgentCount()));
StreamInstruments.RegisterPersistentStreamPubSubCacheSizeObserve(() =>
new Measurement<int>(GetCurrentCacheSize()));
7.2 指标收集
// 在关键操作点记录指标
public async Task ProcessMessage(StreamMessage message)
{
try
{
StreamInstruments.PersistentStreamSentMessages.Add(1);
await DeliverMessage(message);
}
catch (Exception ex)
{
// 记录错误指标
StreamInstruments.PersistentStreamErrors.Add(1);
throw;
}
}
8. 总结
StreamInstruments 是 Orleans 流系统的重要监控组件,它:
- 提供关键指标:生产者、消费者、消息处理等核心指标
- 支持实时监控:基于 .NET Metrics 框架的实时指标收集
- 便于集成:与 Prometheus、Grafana 等监控系统无缝集成
- 支持运维:帮助运维团队监控系统健康状态和性能
- 支持调优:为性能调优提供数据支持
通过这些指标,开发者和运维人员可以:
- 监控系统性能
- 识别性能瓶颈
- 进行容量规划
- 设置告警规则
- 优化系统配置
这是现代分布式系统可观测性的重要组成部分。

596

被折叠的 条评论
为什么被折叠?



