Instrument the historian plugin with runtime query health counters and read-only cluster failover so operators can detect silent query degradation and keep serving history when a single cluster node goes down
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ZB.MOM.WW.LmxOpcUa.Host.Historian
|
||||
{
|
||||
/// <summary>
|
||||
/// Point-in-time runtime health of the historian plugin, surfaced to the status dashboard
|
||||
/// and health check service. Fills the gap between the load-time plugin status
|
||||
/// (<see cref="HistorianPluginLoader.LastOutcome"/>) and actual query behavior so operators
|
||||
/// can detect silent query degradation.
|
||||
/// </summary>
|
||||
public sealed class HistorianHealthSnapshot
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the total number of historian read operations attempted since startup
|
||||
/// across all read paths (raw, aggregate, at-time, events).
|
||||
/// </summary>
|
||||
public long TotalQueries { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the total number of read operations that completed without an exception
|
||||
/// being caught by the plugin's error handler. Includes empty result sets as successes —
|
||||
/// the counter reflects "the SDK call returned" not "the SDK call returned data".
|
||||
/// </summary>
|
||||
public long TotalSuccesses { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the total number of read operations that raised an exception. Each failure
|
||||
/// also resets and closes the underlying SDK connection via the existing reconnect path.
|
||||
/// </summary>
|
||||
public long TotalFailures { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number of consecutive failures since the last success. Latches until
|
||||
/// a successful query clears it. The health check service uses this as a degradation signal.
|
||||
/// </summary>
|
||||
public int ConsecutiveFailures { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the UTC timestamp of the last successful read, or <see langword="null"/>
|
||||
/// when no query has succeeded since startup.
|
||||
/// </summary>
|
||||
public DateTime? LastSuccessTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the UTC timestamp of the last failure, or <see langword="null"/> when no
|
||||
/// query has failed since startup.
|
||||
/// </summary>
|
||||
public DateTime? LastFailureTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the exception message from the most recent failure. Cleared on the next
|
||||
/// successful query.
|
||||
/// </summary>
|
||||
public string? LastError { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the plugin currently holds an open SDK
|
||||
/// connection for the process (historical values) path.
|
||||
/// </summary>
|
||||
public bool ProcessConnectionOpen { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the plugin currently holds an open SDK
|
||||
/// connection for the event (alarm history) path.
|
||||
/// </summary>
|
||||
public bool EventConnectionOpen { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the node the plugin is currently connected to for the process path,
|
||||
/// or <see langword="null"/> when no connection is open.
|
||||
/// </summary>
|
||||
public string? ActiveProcessNode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the node the plugin is currently connected to for the event path,
|
||||
/// or <see langword="null"/> when no event connection is open.
|
||||
/// </summary>
|
||||
public string? ActiveEventNode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the total number of configured historian cluster nodes. A value of 1
|
||||
/// reflects a legacy single-node deployment.
|
||||
/// </summary>
|
||||
public int NodeCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number of configured nodes that are currently healthy (not in cooldown).
|
||||
/// </summary>
|
||||
public int HealthyNodeCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the per-node cluster state in configuration order.
|
||||
/// </summary>
|
||||
public List<HistorianClusterNodeState> Nodes { get; set; } = new();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user