diff --git a/src/Configuration/CliOptions.cs b/src/Configuration/CliOptions.cs index cb31af8b..ee2e664b 100644 --- a/src/Configuration/CliOptions.cs +++ b/src/Configuration/CliOptions.cs @@ -77,6 +77,7 @@ public static (PlcSimulation PlcSimulationInstance, List ExtraArgs) Init { "otlpee|otlpendpoint=", $"the endpoint URI to which the OTLP exporter is going to send information.\nDefault: '{config.OtlpEndpointUri}'", (s) => config.OtlpEndpointUri = s }, { "otlpei|otlpexportinterval=", $"the interval for exporting OTLP information in seconds.\nDefault: {config.OtlpExportInterval.TotalSeconds}", (uint i) => config.OtlpExportInterval = TimeSpan.FromSeconds(i) }, { "otlpep|otlpexportprotocol=", $"the protocol for exporting OTLP information.\n(allowed values: grpc, protobuf).\nDefault: {config.OtlpExportProtocol}", (string s) => config.OtlpExportProtocol = s }, + { "otlpub|otlpublishmetrics=", $"how to handle metrics for publish requests.\n(allowed values: disable=Always disabled, enable=Always enabled, auto=Auto-disable when sessions > 40 or monitored items > 500).\nDefault: {config.OtlpPublishMetrics}", (string s) => config.OtlpPublishMetrics = s }, { "lr|ldsreginterval=", $"the LDS(-ME) registration interval in ms. If 0, then the registration is disabled.\nDefault: {config.OpcUa.LdsRegistrationInterval}", (int i) => { if (i >= 0) diff --git a/src/Configuration/Configuration.cs b/src/Configuration/Configuration.cs index a9f0ae6a..9e64014c 100644 --- a/src/Configuration/Configuration.cs +++ b/src/Configuration/Configuration.cs @@ -51,6 +51,15 @@ public class OpcPlcConfiguration /// public string OtlpExportProtocol { get; set; } = "grpc"; + /// + /// Gets or sets how to handle metrics for publish requests. + /// Allowed values: + /// disable=Always disabled, + /// enable=Always enabled, + /// auto=Auto-disable when sessions > 40 or monitored items > 500. + /// + public string OtlpPublishMetrics { get; set; } = "auto"; + /// /// Show OPC Publisher configuration file using IP address as EndpointUrl. /// diff --git a/src/PlcServer.cs b/src/PlcServer.cs index 9a62e970..27fb9efe 100644 --- a/src/PlcServer.cs +++ b/src/PlcServer.cs @@ -42,7 +42,7 @@ public partial class PlcServer : StandardServer private readonly ILogger _logger; private readonly Timer _periodicLoggingTimer; - private bool _disablePublishMetrics; + private bool _autoDisablePublishMetrics; private uint _countCreateSession; private uint _countCreateSubscription; private uint _countCreateMonitoredItems; @@ -70,7 +70,7 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe IList subscriptions = ServerInternal.SubscriptionManager.GetSubscriptions(); int monitoredItemsCount = subscriptions.Sum(s => s.MonitoredItemCount); - _disablePublishMetrics = sessionCount > 40 || monitoredItemsCount > 500; + _autoDisablePublishMetrics = sessionCount > 40 || monitoredItemsCount > 500; LogPeriodicInfo( sessionCount, @@ -87,7 +87,7 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe _countPublish, _countRead, _countWrite, - MetricsHelper.IsEnabled && !_disablePublishMetrics); + PublishMetricsEnabled); _countCreateSession = 0; _countCreateSubscription = 0; @@ -106,6 +106,20 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe MetricsHelper.IsEnabled = Config.OtlpEndpointUri is not null; } + /// + /// Enable publish requests metrics only if the following apply: + /// 1) Metrics are enabled by specifying OtlpEndpointUri, + /// 2) OtlpPublishMetrics is "enable", + /// 3) OtlpPublishMetrics is not "disable", + /// 4) When OtlpPublishMetrics is "auto": sessions <= 40 and monitored items <= 500. + /// + private bool PublishMetricsEnabled => + MetricsHelper.IsEnabled && + ( + (Config.OtlpPublishMetrics == "enable" && Config.OtlpPublishMetrics != "disable") || + (Config.OtlpPublishMetrics == "auto" && !_autoDisablePublishMetrics) + ); + public override ResponseHeader CreateSession( RequestHeader requestHeader, ApplicationDescription clientDescription, @@ -249,7 +263,7 @@ public override ResponseHeader Publish( var responseHeader = base.Publish(requestHeader, subscriptionAcknowledgements, out subscriptionId, out availableSequenceNumbers, out moreNotifications, out notificationMessage, out results, out diagnosticInfos); - if (MetricsHelper.IsEnabled && !_disablePublishMetrics) + if (PublishMetricsEnabled) { MetricsHelper.AddPublishedCount(context.SessionId.ToString(), subscriptionId.ToString(), notificationMessage, _logger); }