From ca12bd49f2b5d825f59c3c7b9b4704fdc4530c5f Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Tue, 8 Nov 2022 09:59:29 -0800 Subject: [PATCH 1/2] Validate monitor config values and send max changes configuration on startup --- src/TriggerBinding/SqlTableChangeMonitor.cs | 19 +++++++++++++------ src/TriggerBinding/SqlTriggerListener.cs | 13 +++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/TriggerBinding/SqlTableChangeMonitor.cs b/src/TriggerBinding/SqlTableChangeMonitor.cs index e9f4e6027..4bd2dab74 100644 --- a/src/TriggerBinding/SqlTableChangeMonitor.cs +++ b/src/TriggerBinding/SqlTableChangeMonitor.cs @@ -130,19 +130,26 @@ public SqlTableChangeMonitor( int? configuredBatchSize = configuration.GetValue(ConfigKey_SqlTrigger_BatchSize); int? configuredPollingInterval = configuration.GetValue(ConfigKey_SqlTrigger_PollingInterval); this._batchSize = configuredBatchSize ?? this._batchSize; + if (this._batchSize <= 0) + { + throw new InvalidOperationException($"Invalid value for configuration setting '{ConfigKey_SqlTrigger_BatchSize}'. Ensure that the value is a positive integer."); + } this._pollingIntervalInMs = configuredPollingInterval ?? this._pollingIntervalInMs; - var monitorStartProps = new Dictionary(telemetryProps) + if (this._pollingIntervalInMs <= 0) { - { TelemetryPropertyName.HasConfiguredBatchSize, (configuredBatchSize != null).ToString() }, - { TelemetryPropertyName.HasConfiguredPollingInterval, (configuredPollingInterval != null).ToString() }, - }; + throw new InvalidOperationException($"Invalid value for configuration setting '{ConfigKey_SqlTrigger_PollingInterval}'. Ensure that the value is a positive integer."); + } TelemetryInstance.TrackEvent( TelemetryEventName.TriggerMonitorStart, - monitorStartProps, + new Dictionary(telemetryProps) { + { TelemetryPropertyName.HasConfiguredBatchSize, (configuredBatchSize != null).ToString() }, + { TelemetryPropertyName.HasConfiguredPollingInterval, (configuredPollingInterval != null).ToString() }, + }, new Dictionary() { { TelemetryMeasureName.BatchSize, this._batchSize }, { TelemetryMeasureName.PollingIntervalMs, this._pollingIntervalInMs } - }); + } + ); // Prep search-conditions that will be used besides WHERE clause to match table rows. this._rowMatchConditions = Enumerable.Range(0, this._batchSize) diff --git a/src/TriggerBinding/SqlTriggerListener.cs b/src/TriggerBinding/SqlTriggerListener.cs index f542958cd..c8d54ea3e 100644 --- a/src/TriggerBinding/SqlTriggerListener.cs +++ b/src/TriggerBinding/SqlTriggerListener.cs @@ -47,6 +47,7 @@ internal sealed class SqlTriggerListener : IListener, IScaleMonitor _telemetryProps = new Dictionary(); private readonly int _maxChangesPerWorker; + private readonly bool _hasConfiguredMaxChangesPerWorker = false; private SqlTableChangeMonitor _changeMonitor; private int _listenerState = ListenerNotStarted; @@ -74,13 +75,13 @@ public SqlTriggerListener(string connectionString, string tableName, string user // Do not convert the scale-monitor ID to lower-case string since SQL table names can be case-sensitive // depending on the collation of the current database. this._scaleMonitorDescriptor = new ScaleMonitorDescriptor($"{userFunctionId}-SqlTrigger-{tableName}"); - configuredMaxChangesPerWorker = configuration.GetValue(ConfigKey_SqlTrigger_MaxChangesPerWorker); this._maxChangesPerWorker = configuredMaxChangesPerWorker ?? DefaultMaxChangesPerWorker; if (this._maxChangesPerWorker <= 0) { throw new InvalidOperationException($"Invalid value for configuration setting '{ConfigKey_SqlTrigger_MaxChangesPerWorker}'. Ensure that the value is a positive integer."); } + this._hasConfiguredMaxChangesPerWorker = configuredMaxChangesPerWorker != null; } public void Cancel() @@ -105,7 +106,15 @@ public async Task StartAsync(CancellationToken cancellationToken) } this.InitializeTelemetryProps(); - TelemetryInstance.TrackEvent(TelemetryEventName.StartListenerStart, this._telemetryProps); + TelemetryInstance.TrackEvent( + TelemetryEventName.StartListenerStart, + new Dictionary(this._telemetryProps) { + { TelemetryPropertyName.HasConfiguredMaxChangesPerWorker, this._hasConfiguredMaxChangesPerWorker.ToString() } + }, + new Dictionary() { + { TelemetryMeasureName.MaxChangesPerWorker, this._maxChangesPerWorker } + } + ); try { From 255a8c70509f6ecd68609571722571898f2a5012 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Tue, 8 Nov 2022 10:21:42 -0800 Subject: [PATCH 2/2] Add enum values --- src/Telemetry/Telemetry.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Telemetry/Telemetry.cs b/src/Telemetry/Telemetry.cs index 79997b85a..961c1b8ec 100644 --- a/src/Telemetry/Telemetry.cs +++ b/src/Telemetry/Telemetry.cs @@ -362,6 +362,7 @@ public enum TelemetryPropertyName ExceptionType, HasIdentityColumn, HasConfiguredBatchSize, + HasConfiguredMaxChangesPerWorker, HasConfiguredPollingInterval, LeasesTableName, QueryType, @@ -392,6 +393,7 @@ public enum TelemetryMeasureName GetPrimaryKeysDurationMs, GetUnprocessedChangesDurationMs, InsertGlobalStateTableRowDurationMs, + MaxChangesPerWorker, PollingIntervalMs, ReleaseLeasesDurationMs, RetryAttemptNumber,