{"record":{"id":"e3b145885c291be3","repo":"dotnet/orleans","slug":"monitor","errorCode":null,"errorMessage":"monitor","messagePattern":"monitor","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Azure/Orleans.Streaming.EventHubs/Providers/Streams/EventHub/EventHubAdapterReceiver.cs","lineNumber":106,"sourceCode":"                eventHubReceiverFactory)\n        {\n        }\n\n        public EventHubAdapterReceiver(EventHubPartitionSettings settings,\n            Func<string, IStreamQueueCheckpointer<string>, ILoggerFactory, IEventHubQueueCache> cacheFactory,\n            Func<string, CancellationToken, Task<IStreamQueueCheckpointer<string>>> checkpointerFactory,\n            ILoggerFactory loggerFactory,\n            IQueueAdapterReceiverMonitor monitor,\n            LoadSheddingOptions loadSheddingOptions,\n            IEnvironmentStatisticsProvider environmentStatisticsProvider,\n            Func<EventHubPartitionSettings, string, ILogger, IEventHubReceiver>? eventHubReceiverFactory = null)\n        {\n            this.settings = settings ?? throw new ArgumentNullException(nameof(settings));\n            this.cacheFactory = cacheFactory ?? throw new ArgumentNullException(nameof(cacheFactory));\n            this.checkpointerFactory = checkpointerFactory ?? throw new ArgumentNullException(nameof(checkpointerFactory));\n            this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));\n            this.logger = this.loggerFactory.CreateLogger<EventHubAdapterReceiver>();\n            this.monitor = monitor ?? throw new ArgumentNullException(nameof(monitor));\n            this.loadSheddingOptions = loadSheddingOptions ?? throw new ArgumentNullException(nameof(loadSheddingOptions));\n            this.environmentStatisticsProvider = environmentStatisticsProvider;\n            this.eventHubReceiverFactory = eventHubReceiverFactory == null ? EventHubAdapterReceiver.CreateReceiver : eventHubReceiverFactory;\n        }\n\n        public async Task Initialize(TimeSpan timeout)\n        {\n            LogInfoInitializingEventHubPartition(this.settings.Hub.EventHubName, this.settings.Partition);\n\n            // if receiver was already running, do nothing\n            if (ReceiverRunning == Interlocked.Exchange(ref this.receiverState, ReceiverRunning))\n            {\n                return;\n            }\n\n            using var cancellation = new CancellationTokenSource(timeout);\n            await Initialize(cancellation.Token);\n        }","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Orleans.Streaming.EventHubs/Providers/Streams/EventHub/EventHubAdapterReceiver.cs#L88-L124","documentation":"EventHubAdapterReceiver requires a non-null IQueueAdapterReceiverMonitor because it reports initialization success/failure, read latency, message counts, and shutdown metrics for each Event Hub partition. The monitor is called with TrackInitialization, TrackRead, TrackMessagesReceived, and TrackShutdown throughout the receiver lifecycle. Without it the runtime cannot detect slow or failing partitions.","triggerScenarios":"Constructing EventHubAdapterReceiver with monitor set to null. In the factory path, the monitor is created by ReceiverMonitorFactory (defaulting to DefaultEventHubReceiverMonitor) during EventHubAdapterFactory.MakeReceiver and is always non-null. Fires on direct construction or if a custom ReceiverMonitorFactory returns null.","commonSituations":"Manual construction in tests without wiring a monitor; overriding ReceiverMonitorFactory in a subclass of EventHubAdapterFactory and having it return null; passing a test double that is unintentionally null.","solutions":["Pass a valid IQueueAdapterReceiverMonitor such as DefaultEventHubReceiverMonitor or a test implementation.","If overriding ReceiverMonitorFactory in a subclass, ensure it never returns null.","In tests, create a no-op or mock IQueueAdapterReceiverMonitor implementation."],"exampleFix":"// before\nvar receiver = new EventHubAdapterReceiver(\n    settings, cacheFactory, checkpointerFactory, loggerFactory,\n    null /* monitor */, loadSheddingOptions, envStats);\n\n// after\nvar dimensions = new EventHubReceiverMonitorDimensions { EventHubPartition = \"0\", EventHubPath = \"myhub\" };\nvar monitor = new DefaultEventHubReceiverMonitor(dimensions, orleansInstruments);\nvar receiver = new EventHubAdapterReceiver(\n    settings, cacheFactory, checkpointerFactory, loggerFactory,\n    monitor, loadSheddingOptions, envStats);","handlingStrategy":"validation","validationCode":"// Ensure monitor is non-null before constructing the receiver:\nif (monitor is null)\n    monitor = new DefaultEventHubReceiverMonitor(dimensions, orleansInstruments);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the default ReceiverMonitorFactory which creates DefaultEventHubReceiverMonitor.","When overriding ReceiverMonitorFactory in a subclass, ensure it never returns null.","In tests, create a simple no-op IQueueAdapterReceiverMonitor implementation."],"tags":["configuration","eventhub","constructor","null-argument","receiver","monitoring"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}