Renames all 11 projects (5 src + 6 tests), the .slnx solution file, all source-file namespaces, all axaml namespace references, and all v1 documentation references in CLAUDE.md and docs/*.md (excluding docs/v2/ which is already in OtOpcUa form). Also updates the TopShelf service registration name from "LmxOpcUa" to "OtOpcUa" per Phase 0 Task 0.6.
Preserves runtime identifiers per Phase 0 Out-of-Scope rules to avoid breaking v1/v2 client trust during coexistence: OPC UA `ApplicationUri` defaults (`urn:{GalaxyName}:LmxOpcUa`), server `EndpointPath` (`/LmxOpcUa`), `ServerName` default (feeds cert subject CN), `MxAccessConfiguration.ClientName` default (defensive — stays "LmxOpcUa" for MxAccess audit-trail consistency), client OPC UA identifiers (`ApplicationName = "LmxOpcUaClient"`, `ApplicationUri = "urn:localhost:LmxOpcUaClient"`, cert directory `%LocalAppData%\LmxOpcUaClient\pki\`), and the `LmxOpcUaServer` class name (class rename out of Phase 0 scope per Task 0.5 sed pattern; happens in Phase 1 alongside `LmxNodeManager → GenericDriverNodeManager` Core extraction). 23 LmxOpcUa references retained, all enumerated and justified in `docs/v2/implementation/exit-gate-phase-0.md`.
Build clean: 0 errors, 30 warnings (lower than baseline 167). Tests at strict improvement over baseline: 821 passing / 1 failing vs baseline 820 / 2 (one flaky pre-existing failure passed this run; the other still fails — both pre-existing and unrelated to the rename). `Client.UI.Tests`, `Historian.Aveva.Tests`, `Client.Shared.Tests`, `IntegrationTests` all match baseline exactly. Exit gate compliance results recorded in `docs/v2/implementation/exit-gate-phase-0.md` with all 7 checks PASS or DEFERRED-to-PR-review (#7 service install verification needs Windows service permissions on the reviewer's box).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
98 lines
4.1 KiB
C#
98 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.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();
|
|
}
|
|
}
|