Compartilhar via


Relatórios do Serviço de Integridade

Aplica-se a: Windows Server 2016

O que são relatórios

O Serviço de Integridade reduz o trabalho necessário para obter as informações de capacidade e desempenho em tempo real do cluster dos Espaços de Armazenamento Diretos. Um novo cmdlet fornece uma lista coletada de métricas essenciais, que são coletadas com eficiência e agregadas dinamicamente em nós, com lógica interna para detectar a associação de cluster. Todos os valores são apenas pontuais e em tempo real.

Uso no PowerShell

Use esse cmdlet para obter as métricas para todo o cluster dos Espaços de Armazenamento Diretos:

Get-StorageSubSystem Cluster* | Get-StorageHealthReport

O parâmetro Count opcional indica quantos conjuntos de valores deverão ser retornados, em intervalos de um segundo.

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

Você também poderá obter métricas para um volume ou servidor específico:

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

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

Uso em .NET e C#

Conectar

Para consultar o Serviço de Integridade, será necessário estabelecer uma CimSession com o cluster. Para fazer isso, serão necessárias algumas opções que só estarão disponíveis no .NET completo, isso significa que não será possível fazer isso facilmente direto de um aplicativo Web ou móvel. Esses exemplos de código usarão C#, a escolha mais direta para essa camada de acesso a dados.

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

O nome de usuário fornecido deverá ser um administrador local do computador de destino.

É recomendável que você construa a SecureString de Senha diretamente da entrada de usuário em tempo real para que a senha nunca seja armazenada na memória com texto não criptografado. Isso ajudará a mitigar uma variedade de problemas de segurança. Mas, na prática, construí-la conforme indicado acima é comum para fins de prototipagem.

Descobrir objetos

Com a CimSession estabelecida, você poderá consultar a WMI (Instrumentação de Gerenciamento do Windows) no cluster.

Antes de obter as falhas ou métricas, será necessário obter as instâncias de vários objetos relevantes. Primeiro, o MSFT_StorageSubSystem que representa os Espaços de Armazenamento Diretos no cluster. Usando isso, será possível obter cada MSFT_StorageNode no cluster e cada MSFT_Volume, os volumes de dados. Por fim, também será necessário o MSFT_StorageHealth, o próprio Serviço de Integridade.

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

Esses são os mesmos objetos que você obtém no PowerShell usando os cmdlets como Get-StorageSubSystem, Get-StorageNode e Get-Volume.

Você poderá acessar todas as mesmas propriedades, documentadas em Classes de API para Gerenciamento de Armazenamento.

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 começar a transmitir exemplos de uma lista coletada de métricas essenciais, que são coletadas com eficiência e agregadas dinamicamente em nós, com lógica interna para detectar a associação do cluster. Posteriormente, os exemplos chegarão a cada segundo. Todos os valores são apenas pontuais e em tempo real.

As métricas podem ser transmitidas para três escopos: o cluster, qualquer nó ou qualquer volume.

A lista completa de métricas disponíveis em cada escopo no Windows Server 2016 está documentada abaixo.

IObserver.OnNext()

Este código de exemplo usa o Padrão de Design do Observador para implementar um Observador cujo método OnNext() será invocado quando cada novo exemplo de métricas chegar. O método OnCompleted() será chamado se/quando a transmissão encerrar. Por exemplo, você poderá usá-lo para reiniciar a transmissão, para que continue 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
    }
}

Iniciar a transmissão

Com o Observador definido, você poderá começar a transmitir.

Especifique a CimInstance de destino para a qual deseja definir o escopo das métricas. Pode ser o cluster, qualquer nó ou qualquer volume.

O parâmetro count é o número de exemplos antes do término da transmissão.

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

Essas métricas poderão ser visualizadas, armazenadas em um banco de dados ou utilizadas da maneira que for mais adequada para você.

Propriedades de relatórios

Cada exemplo de métricas é um "relatório" que contém muitos "registros" correspondentes a métricas individuais.

Para o esquema completo, inspecione as classes MSFT_StorageHealthReport e MSFT_HealthRecord em storagewmi.mof.

Cada métrica possui apenas três propriedades, de acordo com essa tabela.

Propriedade Exemplo
Nome IOLatencyAverage
Valor 0,00021
Unidades 3

Unidades = { 0, 1, 2, 3, 4 }, em que 0 = "Bytes", 1 = "BytesPerSecond", 2 = "CountPerSecond", 3 = "Seconds" ou 4 = "Percentage".

Cobertura

Abaixo, são apresentadas as métricas disponíveis para cada escopo no Windows Server 2016.

MSFT_StorageSubSystem

Nome 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

Nome 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

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

Referências adicionais