Condividi tramite


Ottenere la cronologia delle prestazioni del cluster

Si applica a: Locale di Azure 2311.2 e versioni successive; Windows Server 2022, Windows Server 2019

Il servizio Integrità riduce il lavoro necessario per ottenere informazioni sulla capacità e sulle prestazioni 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 i nodi, con logica predefinita per rilevare l'appartenenza al cluster. Tutti i valori sono solo in tempo reale e temporizzati.

Uso in PowerShell

Usare il cmdlet seguente per ottenere le 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 specifico:

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

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

Utilizzo in .NET e C#

In questa sezione viene illustrato come connettersi al Servizio integrità, usare gli oggetti di individuazione e implementare un observer per iniziare a trasmettere le metriche.

Connessione

Per eseguire una query sul Servizio integrità, si stabilisce una 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 password SecureString direttamente dall'input dell'utente in tempo reale, in modo che la password non venga mai archiviata in memoria in testo non crittografato. In questo modo è possibile attenuare un'ampia gamma di problemi di sicurezza. Ma in pratica, costruire come sopra è comune a scopo di prototipazione.

Individuare gli oggetti

Dopo aver stabilito CimSession, è possibile eseguire query su Strumentazione gestione Windows (WMI) nel cluster.

Prima di poter 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 il 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();
}

Si tratta degli 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 curato da esperti di metriche essenziali in base ai nomi delle metriche forniti dal parametro MetricName , 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 Observer 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 a tempo indeterminato.

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

Avviare lo streaming

Dopo aver definito Observer, è possibile iniziare a trasmettere.

Specificare la CimInstance di destinazione a cui si desidera definire l'ambito delle metriche. Può essere il cluster, qualsiasi nodo o qualsiasi volume.

Il parametro count è il numero di campioni prima del termine 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.

Altri riferimenti