Skip to content

Commit

Permalink
Add option to control publish request metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
luiscantero committed Jul 31, 2024
1 parent 55ee8bd commit b79747a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/Configuration/CliOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public static (PlcSimulation PlcSimulationInstance, List<string> 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)
Expand Down
9 changes: 9 additions & 0 deletions src/Configuration/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ public class OpcPlcConfiguration
/// </summary>
public string OtlpExportProtocol { get; set; } = "grpc";

/// <summary>
/// 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.
/// </summary>
public string OtlpPublishMetrics { get; set; } = "auto";

/// <summary>
/// Show OPC Publisher configuration file using IP address as EndpointUrl.
/// </summary>
Expand Down
22 changes: 18 additions & 4 deletions src/PlcServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -70,7 +70,7 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe
IList<Subscription> subscriptions = ServerInternal.SubscriptionManager.GetSubscriptions();
int monitoredItemsCount = subscriptions.Sum(s => s.MonitoredItemCount);
_disablePublishMetrics = sessionCount > 40 || monitoredItemsCount > 500;
_autoDisablePublishMetrics = sessionCount > 40 || monitoredItemsCount > 500;
LogPeriodicInfo(
sessionCount,
Expand All @@ -87,7 +87,7 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe
_countPublish,
_countRead,
_countWrite,
MetricsHelper.IsEnabled && !_disablePublishMetrics);
PublishMetricsEnabled);
_countCreateSession = 0;
_countCreateSubscription = 0;
Expand All @@ -106,6 +106,20 @@ public PlcServer(OpcPlcConfiguration config, PlcSimulation plcSimulation, TimeSe
MetricsHelper.IsEnabled = Config.OtlpEndpointUri is not null;
}

/// <summary>
/// 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.
/// </summary>
private bool PublishMetricsEnabled =>
MetricsHelper.IsEnabled &&
(
(Config.OtlpPublishMetrics == "enable" && Config.OtlpPublishMetrics != "disable") ||
(Config.OtlpPublishMetrics == "auto" && !_autoDisablePublishMetrics)
);

public override ResponseHeader CreateSession(
RequestHeader requestHeader,
ApplicationDescription clientDescription,
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit b79747a

Please sign in to comment.