Obtenir l’historique des performances des clusters

S’applique à : Azure Stack HCI, versions 23H2 et 22H2 ; Windows Server 2022, Windows Server 2019

Le service de contrôle d’intégrité permet de réduire le travail nécessaire pour obtenir des informations en direct sur les performances et la capacité de votre cluster d’espaces de stockage direct. Notre applet de commande fournit la liste organisée des mesures essentielles collectées de manière efficace et agrégées de façon dynamique entre les nœuds, avec une logique intégrée pour détecter l’appartenance au cluster. Toutes les valeurs sont en temps réel et ponctuelles uniquement.

Utilisation dans PowerShell

Utilisez l’applet de commande suivante pour obtenir les métriques de l’ensemble du cluster des espaces de stockage direct :

Get-ClusterPerformanceHistory

Conseil

Utilisez l’alias Get-ClusterPerf pour enregistrer des séquences de touches.

Vous pouvez également obtenir des métriques pour un volume ou un serveur spécifique :

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

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

Utilisation dans .NET et C#

Cette section explique comment se connecter au Service de contrôle d’intégrité, utiliser des objets de découverte et implémenter un observateur pour commencer la diffusion des métriques.

Se connecter

Pour interroger le Service de contrôle d’intégrité, vous devez établir une CimSession avec le cluster. Pour ce faire, vous avez besoin de certains éléments qui ne sont disponibles qu’en Microsoft .NET complet, ce qui signifie que vous ne pouvez pas effectuer cette opération directement à partir d’une application Web ou mobile. Les exemples de code de cette section utilisent C#, le choix le plus simple pour cette couche d’accès aux données.

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

Le nom d’utilisateur fourni doit être un administrateur local de l’ordinateur cible.

Nous vous recommandons de construire la SecureString du mot de passe directement à partir de l’entrée utilisateur en temps réel, afin que le mot de passe ne soit jamais stocké en texte clair dans la mémoire. Cela permet d’atténuer un grand nombre de problèmes de sécurité. Toutefois, dans la pratique, il est courant de les construire comme indiqué ci-dessus à des fins de prototypage.

Détecter les objets

Une fois la CimSession établie, vous pouvez interroger Windows Management Instrumentation (WMI) sur le cluster.

Avant de pouvoir récupérer des erreurs ou des métriques, vous devez récupérer les instances de plusieurs objets pertinents. Tout d’abord, récupérez le MSFT_StorageSubSystem qui représente des espaces de stockage direct sur le cluster. Grâce à cela, vous pouvez récupérer chaque MSFT_StorageNode dans le cluster et chaque MSFT_Volume des volumes de données. Enfin, vous devez récupérer le MSCluster_ClusterHealthService, le Service de contrôle d’intégrité lui-même.

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

Ce sont les mêmes objets que ceux que vous recevez dans PowerShell avec des cmdlets, telles que Get-StorageSubSystem, Get-StorageNode et Get-Volume.

Vous pouvez accéder aux mêmes propriétés, documentées dans Classes d’API de gestion de stockage.

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

Appelez GetMetric pour commencer à diffuser des échantillons d'une liste de métriques essentielles sélectionnées par des experts en fonction des noms de métriques fournis par le paramètre MetricName, qui sont collectés efficacement et agrégés dynamiquement sur les nœuds, avec une logique intégrée pour détecter l'appartenance à un cluster. Les échantillons parviennent en fonction de la période fournie par le paramètre StreamName.

Pour obtenir la liste complète des métriques disponibles, consultez Historique des performances pour les espaces de stockage direct.

IObserver.OnNext()

Cet exemple de code utilise le modèle de conception observateur pour implémenter un observateur dont la méthode OnNext() est appelée chaque fois qu’un nouvel échantillon de métriques est reçu. Sa méthode OnCompleted() est appelée si/quand la diffusion en continu prend fin. Par exemple, vous pouvez l’utiliser pour relancer la diffusion en continu afin qu’elle continue indéfiniment.

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

Lancer la diffusion en continu

Une fois l’observateur défini, vous pouvez commencer la diffusion en continu.

Spécifiez le CimInstance cible pour lequel vous souhaitez étendre les métriques. Il peut s’agir du cluster, de n’importe quel nœud ou de n’importe quel volume.

Le paramètre count correspond au nombre d’échantillons avant la fin de la diffusion en continu.

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

Ces métriques peuvent être visualisées, stockées dans une base de données ou utilisées de la façon qui vous convient le mieux.

Références supplémentaires