Integritätsdienstberichte

Gilt für: Windows Server 2016

Was sind Berichte?

Der Integritätsdienst verringert den Arbeitsaufwand zum Abrufen aktueller Leistungs- und Kapazitätsinformationen aus Ihrem „Direkte Speicherplätze“-Cluster. Ein neues Cmdlet bietet eine geordnete Liste wichtiger Metriken, die effizient gesammelt und knotenübergreifend dynamisch aggregiert werden, und zwar mithilfe integrierter Logik zum Erkennen der Clustermitgliedschaft. Alle Werte sind in Echtzeit und ausschließlich zeitpunktbezogen.

Verwendung in PowerShell

Verwenden Sie dieses Cmdlet, um Metriken für den gesamten „Direkte Speicherplätze“-Cluster abzurufen:

Get-StorageSubSystem Cluster* | Get-StorageHealthReport

Der optionale Count-Parameter gibt an, wie viele Gruppen mit Werten in 1-Sekunden-Intervallen zurückgegeben werden.

Get-StorageSubSystem Cluster* | Get-StorageHealthReport -Count <Count>

Sie können auch Metriken für ein bestimmtes Volume oder einen bestimmten Server abrufen:

Get-Volume -FileSystemLabel <Label> | Get-StorageHealthReport -Count <Count>

Get-StorageNode -Name <Name> | Get-StorageHealthReport -Count <Count>

Verwendung in .NET und C#

Verbinden

Zum Abfragen des Integritätsdiensts müssen Sie eine CimSession-Sitzung mit dem Cluster einrichten. Dazu benötigen Sie einige Funktionen, die nur in der Vollversion von .NET zur Verfügung stehen, d. h. eine direkte Durchführung über eine Web-App oder eine mobile App ist nicht möglich. In diesen Codebeispielen wird C# verwendet, die unkomplizierteste Wahl für diese Datenzugriffsschicht.

using System.Security;
using Microsoft.Management.Infrastructure;

public CimSession Connect(string Domain = "...", string Computer = "...", string Username = "...", string Password = "...")
{
    SecureString PasswordSecureString = new SecureString();
    foreach (char c in Password)
    {
        PasswordSecureString.AppendChar(c);
    }

    CimCredential Credentials = new CimCredential(
        PasswordAuthenticationMechanism.Default, Domain, Username, PasswordSecureString);
    WSManSessionOptions SessionOptions = new WSManSessionOptions();
    SessionOptions.AddDestinationCredentials(Credentials);
    Session = CimSession.Create(Computer, SessionOptions);
    return Session;
}

Der angegebene Benutzername muss ein lokaler Administrator des Zielcomputers sein.

Es wird empfohlen, das Kennwort SecureString direkt aus der Benutzereingabe in Echtzeit zu erstellen, damit das Kennwort niemals im Klartext im Arbeitsspeicher gespeichert wird. Dies trägt dazu bei, eine Reihe von Sicherheitsrisiken zu entschärfen. In der Praxis ist es jedoch üblich, für Prototypen die oben beschriebene Vorgehensweise zu verwenden.

Objekte ermitteln

Sobald die CimSession-Sitzung eingerichtet ist, können Sie Windows Management Instrumentation (WMI) im Cluster abfragen.

Bevor Sie Fehler oder Metriken abrufen können, müssen Sie Instanzen mehrerer relevanter Objekte abrufen. Zuerst MSFT_StorageSubSystem, das „Direkte Speicherplätze“ im Cluster darstellt. Damit können Sie jeden MSFT_StorageNode im Cluster und jedes MSFT_Volume, die Datenvolumes, abrufen. Schließlich benötigen Sie auch MSFT_StorageHealth, den Integritätsdienst selbst.

CimInstance Cluster;
List<CimInstance> Nodes;
List<CimInstance> Volumes;
CimInstance HealthService;

public void DiscoverObjects(CimSession Session)
{
    // Get MSFT_StorageSubSystem for Storage Spaces Direct
    Cluster = Session.QueryInstances(@"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageSubSystem")
        .First(Instance => (Instance.CimInstanceProperties["FriendlyName"].Value.ToString()).Contains("Cluster"));

    // Get MSFT_StorageNode for each cluster node
    Nodes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
        Cluster, "MSFT_StorageSubSystemToStorageNode", null, "StorageSubSystem", "StorageNode").ToList();

    // Get MSFT_Volumes for each data volume
    Volumes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
        Cluster, "MSFT_StorageSubSystemToVolume", null, "StorageSubSystem", "Volume").ToList();

    // Get MSFT_StorageHealth itself
    HealthService = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
        Cluster, "MSFT_StorageSubSystemToStorageHealth", null, "StorageSubSystem", "StorageHealth").First();
}

Dies sind die gleichen Objekte, die Sie in PowerShell mit Cmdlets wie Get-StorageSubSystem, Get-StorageNode und Get-Volume abrufen.

Sie können auf die gleichen Eigenschaften zugreifen, die unter Klassen der Speicherverwaltungs-API dokumentiert sind.

using System.Diagnostics;

foreach (CimInstance Node in Nodes)
{
    // For illustration, write each node's Name to the console. You could also write State (up/down), or anything else!
    Debug.WriteLine("Discovered Node " + Node.CimInstanceProperties["Name"].Value.ToString());
}

Rufen Sie GetReport auf, um mit dem Streaming von Beispielen einer von Experten zusammengestellten Liste wichtiger Metriken zu beginnen, die effizient gesammelt und knotenübergreifend dynamisch aggregiert werden, und zwar mithilfe integrierter Logik zum Erkennen der Clustermitgliedschaft. Die Beispiele werden anschließend jede Sekunde eintreffen. Alle Werte sind in Echtzeit und ausschließlich zeitpunktbezogen.

Metriken können für drei Bereiche gestreamt werden: den Cluster, einen beliebigen Knoten oder ein beliebiges Volume.

Die vollständige Liste der Metriken, die für jeden Bereich in Windows Server 2016 verfügbar sind, finden Sie weiter unten.

IObserver.OnNext()

In diesem Codebeispiel wird das Entwurfsmuster für Beobachter verwendet, um einen Beobachter zu implementieren, dessen OnNext()-Methode beim Eingang jedes neuen Metrikbeispiels aufgerufen wird. Seine OnCompleted()-Methode wird aufgerufen, wenn das Streaming endet. Sie können damit beispielsweise das Streaming neu starten, sodass es auf unbegrenzte Zeit fortgesetzt wird.

class MetricsObserver<T> : IObserver<T>
{
    public void OnNext(T Result)
    {
        // Cast
        CimMethodStreamedResult StreamedResult = Result as CimMethodStreamedResult;

        if (StreamedResult != null)
        {
            // For illustration, you could store the metrics in this dictionary
            Dictionary<string, string> Metrics = new Dictionary<string, string>();

            // Unpack
            CimInstance Report = (CimInstance)StreamedResult.ItemValue;
            IEnumerable<CimInstance> Records = (IEnumerable<CimInstance>)Report.CimInstanceProperties["Records"].Value;
            foreach (CimInstance Record in Records)
            {
                /// Each Record has "Name", "Value", and "Units"
                Metrics.Add(
                    Record.CimInstanceProperties["Name"].Value.ToString(),
                    Record.CimInstanceProperties["Value"].Value.ToString()
                    );
            }

            // TODO: Whatever you want!
        }
    }
    public void OnError(Exception e)
    {
        // Handle Exceptions
    }
    public void OnCompleted()
    {
        // Reinvoke BeginStreamingMetrics(), defined in the next section
    }
}

Beginnen des Streamings

Wenn der Beobachter festgelegt ist, können Sie mit dem Streaming beginnen.

Geben Sie als Ziel die CimInstance an, auf die die Metriken begrenzt werden sollen. Dies kann der Cluster, ein beliebiger Knoten oder ein beliebiges Volume sein.

Der Parameter „count“ enthält die Anzahl der Stichproben, bevor das Streaming endet.

CimInstance Target = Cluster; // From among the objects discovered in DiscoverObjects()

public void BeginStreamingMetrics(CimSession Session, CimInstance HealthService, CimInstance Target)
{
    // Set Parameters
    CimMethodParametersCollection MetricsParams = new CimMethodParametersCollection();
    MetricsParams.Add(CimMethodParameter.Create("TargetObject", Target, CimType.Instance, CimFlags.In));
    MetricsParams.Add(CimMethodParameter.Create("Count", 999, CimType.UInt32, CimFlags.In));
    // Enable WMI Streaming
    CimOperationOptions Options = new CimOperationOptions();
    Options.EnableMethodResultStreaming = true;
    // Invoke API
    CimAsyncMultipleResults<CimMethodResultBase> InvokeHandler;
    InvokeHandler = Session.InvokeMethodAsync(
        HealthService.CimSystemProperties.Namespace, HealthService, "GetReport", MetricsParams, Options
        );
    // Subscribe the Observer
    MetricsObserver<CimMethodResultBase> Observer = new MetricsObserver<CimMethodResultBase>(this);
    IDisposable Disposeable = InvokeHandler.Subscribe(Observer);
}

Selbstverständlich können diese Metriken visualisiert, in einer Datenbank gespeichert oder wie gewünscht genutzt werden.

Eigenschaften von Berichten

Jedes Metrikbeispiel ist ein „Bericht“, der viele „Datensätze“ enthält, die einzelnen Metriken entsprechen.

Überprüfen Sie für das vollständige Schema die Klassen MSFT_StorageHealthReport und MSFT_HealthRecord in storagewmi.mof.

Jede Metrik verfügt gemäß der folgenden Tabelle nur über drei Eigenschaften.

Eigenschaft Beispiel
Name IOLatencyAverage
Wert 0.00021
Einheiten 3

Einheiten = { 0, 1, 2, 3, 4 }, wobei gilt: 0 = „Bytes“, 1 = „BytesPerSecond“, 2 = „CountPerSecond“, 3 = „Seconds“ oder 4 = „Percentage“.

Abdeckung

Im Folgenden finden Sie die Metriken, die für jeden Bereich in Windows Server 2016 verfügbar sind.

MSFT_StorageSubSystem

Name Einheiten
CPUUsage 4
CapacityPhysicalPooledAvailable 0
CapacityPhysicalPooledTotal 0
CapacityPhysicalTotal 0
CapacityPhysicalUnpooled 0
CapacityVolumesAvailable 0
CapacityVolumesTotal 0
IOLatencyAverage 3
IOLatencyRead 3
IOLatencyWrite 3
IOPSRead 2
IOPSTotal 2
IOPSWrite 2
IOThroughputRead 1
IOThroughputTotal 1
IOThroughputWrite 1
MemoryAvailable 0
MemoryTotal 0

MSFT_StorageNode

Name Einheiten
CPUUsage 4
IOLatencyAverage 3
IOLatencyRead 3
IOLatencyWrite 3
IOPSRead 2
IOPSTotal 2
IOPSWrite 2
IOThroughputRead 1
IOThroughputTotal 1
IOThroughputWrite 1
MemoryAvailable 0
MemoryTotal 0

MSFT_Volume

Name Einheiten
CapacityAvailable 0
CapacityTotal 0
IOLatencyAverage 3
IOLatencyRead 3
IOLatencyWrite 3
IOPSRead 2
IOPSTotal 2
IOPSWrite 2
IOThroughputRead 1
IOThroughputTotal 1
IOThroughputWrite 1

Zusätzliche Referenzen