Share via


Ottenere la cronologia delle prestazioni del cluster

Si applica a: Azure Stack HCI, versioni 23H2 e 22H2; Windows Server 2022, Windows Server 2019

Il servizio integrità riduce il lavoro necessario per ottenere prestazioni live e informazioni sulla capacità dal cluster Spazi di archiviazione diretta. Un cmdlet fornisce un elenco curato di metriche essenziali, raccolte in modo efficiente e aggregato in modo dinamico tra nodi, con logica predefinita per rilevare l'appartenenza al cluster. Tutti i valori sono solo in tempo reale e temporizzati.

Utilizzo in PowerShell

Usare il cmdlet seguente per ottenere metriche per l'intero cluster Spazi di archiviazione diretta:

Get-ClusterPerformanceHistory

Suggerimento

Usare l'alias Get-ClusterPerf per salvare alcune sequenze di tasti.

È anche possibile ottenere metriche per un volume o un server specifici:

Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory

Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory

Utilizzo in .NET e C#

Queste sezioni illustrano come connettersi al servizio integrità, usare oggetti di individuazione e implementare un osservatore per iniziare le metriche di streaming.

Connettere

Per eseguire query sul servizio integrità, si stabilisce un CimSession con il cluster. A tale scopo, sono necessarie alcune operazioni disponibili solo in Microsoft .NET completo, ovvero non è possibile eseguire questa operazione direttamente da un'app Web o per dispositivi mobili. Gli esempi di codice in questa sezione usano C#, la scelta più semplice per questo livello di accesso ai dati.

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;
}

Il nome utente specificato deve essere un amministratore locale del computer di destinazione.

È consigliabile costruire la password SecureString direttamente dall'input dell'utente in tempo reale, in modo che la password non venga mai archiviata in memoria in formato cleartext. Ciò consente di attenuare un'ampia gamma di problemi di sicurezza. Ma in pratica, costruire come sopra è comune per scopi di prototipazione.

Individuazione oggetti

Con cimSession stabilita, è possibile eseguire query su Strumentazione gestione Windows (WMI) nel cluster.

Prima di ottenere errori o metriche, è necessario ottenere istanze di diversi oggetti pertinenti. Ottenere prima di tutto il MSFT_StorageSubSystem che rappresenta Spazi di archiviazione diretta nel cluster. A tale scopo, è possibile ottenere ogni MSFT_StorageNode nel cluster e ogni MSFT_Volume dei volumi di dati. Infine, è necessario ottenere la MSCluster_ClusterHealthService, il servizio integrità stesso.

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 MSCluster_ClusterHealthService itself
    HealthService = session.QueryInstances(@"root\MSCluster", "WQL", "SELECT * FROM MSCluster_ClusterHealthService").First();
}

Questi sono gli stessi oggetti che si ottengono in PowerShell usando cmdlet come Get-StorageSubSystem, Get-StorageNode e Get-Volume.

È possibile accedere a tutte le stesse proprietà, documentate in Classi API di gestione archiviazione.

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());
}

Richiamare GetMetric per avviare lo streaming di esempi di un elenco esperto di metriche essenziali in base ai nomi delle metriche forniti dal parametro MetricName , che vengono raccolti in modo efficiente e aggregato in modo dinamico tra i nodi, con logica predefinita per rilevare l'appartenenza al cluster. Gli esempi arrivano in base all'intervallo di tempo specificato dal parametro StreamName .

Per l'elenco completo delle metriche disponibili, vedere Cronologia delle prestazioni per Spazi di archiviazione diretta.

IObserver.OnNext()

Questo codice di esempio usa il modello di progettazione observer per implementare un osservatore il cui metodo OnNext() viene richiamato quando arriva ogni nuovo esempio di metriche. Il metodo OnCompleted() viene chiamato if/when streaming termina. Ad esempio, è possibile usarlo per reinizializzare lo streaming, in modo che continui indefinito.

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

        if (StreamedResult != null)
        {
            CimInstance Metric = (CimInstance)StreamedResult.ItemValue;
            Console.WriteLine("MetricName: " + Metric.CimInstanceProperties["MetricId"].Value);
            IEnumerable<CimInstance> Records = (IEnumerable<CimInstance>)Metric.CimInstanceProperties["Records"].Value;

            foreach (CimInstance Record in Records)
            {
                // Each Record has "TimeStamp" and "Value. For Illustration, just print the metric"
                Console.WriteLine(record.CimInstanceProperties["TimeStamp"] + ": " + record.CimInstanceProperties["Value"]);

            }

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

Iniziare lo streaming

Con l'Observer definito, è possibile iniziare a trasmettere.

Specificare la destinazione CimInstance a cui si desidera che le metriche sia con ambito. Può essere il cluster, qualsiasi nodo o qualsiasi volume.

Il parametro count è il numero di campioni prima della fine del flusso.

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();
    string[] metricNames = new string[] { "ClusterNode.Cpu.Usage,ClusterNode=RRN44-13-01", "ClusterNode.Cpu.Usage.Host,ClusterNode=RRN44-13-01" };
    MetricsParams.Add(CimMethodParameter.Create("MetricName", metricNames, CimType.StringArray, CimFlags.In));
    MetricsParams.Add(CimMethodParameter.Create("StreamName", "LastHour", CimType.String, CimFlags.In));

    // Enable WMI Streaming
    CimOperationOptions Options = new CimOperationOptions();
    Options.EnableMethodResultStreaming = true;
    // Invoke API
    CimAsyncMultipleResults<CimMethodResultBase> InvokeHandler;
    InvokeHandler = Session.InvokeMethodAsync(
        HealthService.CimSystemProperties.Namespace, HealthService, "GetMetric", MetricsParams, Options
        );
    // Subscribe the Observer
    MetricsObserver<CimMethodResultBase> Observer = new MetricsObserver<CimMethodResultBase>(this);
    IDisposable Disposeable = InvokeHandler.Subscribe(Observer);
}

Queste metriche possono essere visualizzate, archiviate in un database o usate in qualsiasi modo si trovino in modo adatto.

Altri riferimenti