Compartir a través de


Informes del Servicio de mantenimiento

Se aplica a: Windows Server 2016

Qué son los informes

El Servicio de mantenimiento reduce el trabajo necesario para obtener información sobre la capacidad y el rendimiento en vivo desde el clúster de Espacios de almacenamiento directo. Un cmdlet nuevo proporciona una lista de las métricas esenciales, que se recopilan de forma eficaz y se agregan dinámicamente por los nodos, con lógica integrada para detectar la pertenencia al clúster. Todos los valores son en tiempo real y únicamente en un momento dado.

Uso en PowerShell

Use este cmdlet para obtener métricas para todo el clúster de Espacios de almacenamiento directo:

Get-StorageSubSystem Cluster* | Get-StorageHealthReport

El parámetro opcional Count indica cuántos conjuntos de valores se devuelven, en intervalos de un segundo.

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

También puede obtener métricas de un volumen o servidor específico:

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

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

Uso en .NET y C#

Conectar

Para consultar el Servicio de mantenimiento, deberá establecer el valor de CimSession con el clúster. Para ello, necesitará algunos elementos que solo están disponibles en la versión completa de .NET, lo que significa que no puede hacerlo directamente desde una aplicación móvil o web. En estos ejemplos de código se usa C#, la opción más sencilla para esta capa de acceso a datos.

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

El nombre de usuario proporcionado debe ser un administrador local del equipo de destino.

Se recomienda construir PasswordSecureString directamente desde la entrada del usuario en tiempo real, para que la contraseña no se almacene nunca en memoria en texto no cifrado. Esto ayuda a mitigar diversos problemas de seguridad. Pero, en la práctica, construirlo tal como se ha mencionado anteriormente es algo frecuente para la creación de prototipos.

Detectar objetos

Una vez establecido CimSession, puede consultar Instrumental de administración de Windows (WMI) en el clúster.

Para poder obtener errores o métricas, primero debe obtener instancias de varios objetos pertinentes. En primer lugar, obtenga el objeto MSFT_StorageSubSystem que representa Espacios de almacenamiento directo en el clúster. Con este objeto, puede obtener cada MSFT_StorageNode del clúster y cada MSFT_Volume (los volúmenes de datos). Por último, también necesitará el objeto MSFT_StorageHealth, que es el propio Servicio de mantenimiento.

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

Estos son los mismos objetos que se obtienen en PowerShell mediante cmdlets como Get-StorageSubSystem, Get-StorageNode y Get-Volume.

Puede acceder a todas las propiedades, documentadas en Clases de la API de administración de almacenamiento.

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

Invoque GetReport para comenzar a hacer streaming de ejemplos de una lista seleccionada por expertos de las métricas esenciales, que se recopilan de forma eficaz y se agregan dinámicamente por los nodos, con lógica integrada para detectar la pertenencia al clúster. Las muestras llegarán cada segundo después. Todos los valores son en tiempo real y únicamente en un momento dado.

Las métricas se pueden hacer streaming para tres ámbitos: el clúster, cualquier nodo o cualquier volumen.

La lista completa de métricas disponibles en cada ámbito de Windows Server 2016 se documenta más adelante.

IObserver.OnNext()

Este código de ejemplo usa el Modelo de diseño de observador para implementar un observador cuyo método OnNext() se invocará cada vez que llegue una muestra de métricas nueva. Se llamará a su método OnCompleted() si o cuando finaliza el streaming. Por ejemplo, puede usarlo para reiniciar el streaming, de modo que continúe indefinidamente.

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

Inicio del streaming

Una vez definido el observador, puede iniciar el streaming.

Especifique el elemento CimInstance de destino en el que desea establecer el ámbito de las métricas. Puede ser el clúster, cualquier nodo o volumen.

El parámetro count es el número de muestras antes de que finalice el streaming.

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

Obviamente, estas métricas se pueden visualizar, almacenar en una base de datos o usar de la forma que considere oportuna.

Propiedades de informes

Cada ejemplo de métricas es un "informe" que contiene muchos "registros" correspondientes a métricas individuales.

Para el esquema completo, inspeccione las clases MSFT_StorageHealthReport y MSFT_HealthRecord en storagewmi.mof.

Cada métrica tiene solo tres propiedades, según esta tabla.

Propiedad Ejemplo
Nombre IOLatencyAverage
Valor 0.00021
Unidades 3

Units = { 0, 1, 2, 3, 4 }, where 0 = "Bytes", 1 = "BytesPerSecond", 2 = "CountPerSecond", 3 = "Seconds", or 4 = "Percentage".

Cobertura

A continuación se muestran las métricas disponibles para cada ámbito en Windows Server 2016.

MSFT_StorageSubSystem

Nombre Unidades
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

Nombre Unidades
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

Nombre Unidades
CapacityAvailable 0
CapacityTotal 0
IOLatencyAverage 3
IOLatencyRead 3
IOLatencyWrite 3
IOPSRead 2
IOPSTotal 2
IOPSWrite 2
IOThroughputRead 1
IOThroughputTotal 1
IOThroughputWrite 1

Referencias adicionales