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 |