Compartir a través de


Visualización de los errores del Servicio de mantenimiento

Se aplica a: Azure Local 2311.2 y versiones posteriores; Windows Server 2022, Windows Server 2019

En este artículo se proporciona información detallada sobre los fallos del Servicio de Salud en Azure Local y Windows Server.

Acerca de los fallos del servicio de salud

El Servicio de mantenimiento supervisa constantemente el clúster de Espacios de almacenamiento directo para detectar problemas y generar "errores". Un cmdlet muestra los errores actuales, lo que le permite comprobar fácilmente el estado de la implementación sin tener que mirar cada entidad o característica. Los errores están diseñados para ser precisos, fáciles de entender y accionable.

Cada error contiene cinco campos importantes:

  • severity
  • Descripción del problema
  • Pasos siguientes recomendados para solucionar el problema
  • Información de identificación de la entidad con errores
  • Su ubicación física (si procede)

Por ejemplo, este es un error habitual:

Severity: MINOR
Reason: Connectivity has been lost to the physical disk.
Recommendation: Check that the physical disk is working and properly connected.
Part: Manufacturer Contoso, Model XYZ9000, Serial 123456789
Location: Seattle DC, Rack B07, Node 4, Slot 11

Nota

La ubicación física procede de la configuración del dominio de error. Para obtener más información sobre los dominios de error, consulte Reconocimiento de dominios de error. Si no proporciona esta información, el campo de ubicación será menos útil. Por ejemplo, solo puede mostrar el número de ranura.

Para obtener información de referencia sobre los errores, consulte Referencia de errores del servicio de mantenimiento.

Análisis de la causa raíz

El Servicio de mantenimiento puede evaluar el potencial de causalidad entre entidades con errores para identificar y combinar los errores que son consecuencia del mismo problema subyacente. Al reconocer las cadenas de efectos, habrá menos informes innecesarios. Por ejemplo, si un servidor está fuera de servicio, se espera que las unidades del servidor también estén sin conectividad. Por lo tanto, solo se provocará un único error para la causa principal, en este caso, el servidor.

Uso en PowerShell

Para ver los errores actuales en PowerShell, ejecute el cmdlet siguiente:

Get-HealthFault

Se devuelven los errores que afectan al clúster Espacios de almacenamiento directo. A menudo, estos errores están relacionados con el hardware o la configuración. Si no hay ningún error, el cmdlet no devuelve nada.

Nota

En un entorno que no sea de producción y bajo su propio riesgo, puede experimentar con esta característica desencadenando errores por sí mismo. Por ejemplo, puede hacerlo eliminando un disco físico o apagando un nodo. Una vez que aparezca el error, vuelva a insertar el disco físico o reinicie el nodo para que el error desaparezca.

Uso en .NET y C#

En esta sección se muestra cómo conectarse al Servicio de mantenimiento, usar la detección de objetos y ejecutar consultas de error.

Conectar

Para consultar el servicio de salud, establezca un CimSession con el clúster. Para ello, necesitará algunas cosas que solo están disponibles en Microsoft .NET completo, lo que significa que no puede hacerlo directamente desde una aplicación web o móvil. Los ejemplos de código de esta sección usan 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 password SecureString directamente a partir de la entrada del usuario en tiempo real, de modo que la contraseña nunca se almacene 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 que se haya establecido CimSession, puede consultar la Instrumentación de administración de Windows (WMI) en el clúster.

Para poder obtener errores o métricas, debe obtener instancias de varios objetos pertinentes. En primer lugar, obtenga el MSFT_StorageSubSystem que representa Storage Spaces Direct en el clúster. Con eso, puede obtener cada MSFT_StorageNode en el clúster y cada MSFT_Volume de los volúmenes de datos. Por último, debe obtener la clase MSCluster_ClusterHealthService, el Servicio de mantenimiento en sí mismo.

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 mismas propiedades, documentadas en Clases de 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());
}

Errores de consulta

Invoque Diagnose para obtener los errores actuales en el ámbito del elemento CimInstance de destino, que puede ser el clúster o cualquier volumen.

public void GetFaults(CimSession Session, CimInstance Target)
{
    // Set Parameters (None)
    CimMethodParametersCollection FaultsParams = new CimMethodParametersCollection();
    // Invoke API
    CimMethodResult Result = Session.InvokeMethod(Target, "Diagnose", FaultsParams);
    IEnumerable<CimInstance> DiagnoseResults = (IEnumerable<CimInstance>)Result.OutParameters["DiagnoseResults"].Value;
    // Unpack
    if (DiagnoseResults != null)
    {
        foreach (CimInstance DiagnoseResult in DiagnoseResults)
        {
            // TODO: Whatever you want!
        }
    }
}

Opcional: clase MyFault

Puede que tenga sentido construir y conservar su propia representación de errores. Por ejemplo, la clase MyFault almacena varias propiedades clave de errores, incluido faultId, que se puede usar más adelante para asociar actualizaciones, quitar notificaciones o desduplicar en caso de que se detecte el mismo error varias veces.

public class MyFault {
    public String FaultId { get; set; }
    public String Reason { get; set; }
    public String Severity { get; set; }
    public String Description { get; set; }
    public String Location { get; set; }

    // Constructor
    public MyFault(CimInstance DiagnoseResult)
    {
        CimKeyedCollection<CimProperty> Properties = DiagnoseResult.CimInstanceProperties;
        FaultId     = Properties["FaultId"                  ].Value.ToString();
        Reason      = Properties["Reason"                   ].Value.ToString();
        Severity    = Properties["PerceivedSeverity"        ].Value.ToString();
        Description = Properties["FaultingObjectDescription"].Value.ToString();
        Location    = Properties["FaultingObjectLocation"   ].Value.ToString();
    }
}
List<MyFault> Faults = new List<MyFault>;

foreach (CimInstance DiagnoseResult in DiagnoseResults)
{
    Faults.Add(new Fault(DiagnoseResult));
}

La lista completa de propiedades de cada error (DiagnosticResult) se documenta más adelante en la sección Propiedades de error .

Eventos de error

Cuando se crean, quitan o actualizan errores, el Servicio de mantenimiento genera eventos WMI. Son esenciales para mantener el estado de la aplicación sincronizado sin sondeos frecuentes y pueden ayudar con aspectos como determinar cuándo se envían alertas de correo electrónico, por ejemplo. Para suscribirse a estos eventos, el código de ejemplo siguiente utiliza el modelo de diseño de observador.

En primer lugar, suscríbase a los eventos MSFT_StorageFaultEvent.

public void ListenForFaultEvents()
{
    IObservable<CimSubscriptionResult> Events = Session.SubscribeAsync(
        @"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageFaultEvent");
    // Subscribe the Observer
    FaultsObserver<CimSubscriptionResult> Observer = new FaultsObserver<CimSubscriptionResult>(this);
    IDisposable Disposeable = Events.Subscribe(Observer);
}

A continuación, implemente un observador cuyo método OnNext() se invoque cada vez que se genere un nuevo evento.

Cada evento contiene ChangeType que indica si se crea, quita o actualiza un error y el FaultId correspondiente.

Además, cada evento contiene todas las propiedades de error en sí.

class FaultsObserver : IObserver
{
    public void OnNext(T Event)
    {
        // Cast
        CimSubscriptionResult SubscriptionResult = Event as CimSubscriptionResult;

        if (SubscriptionResult != null)
        {
            // Unpack
            CimKeyedCollection<CimProperty> Properties = SubscriptionResult.Instance.CimInstanceProperties;
            String ChangeType = Properties["ChangeType"].Value.ToString();
            String FaultId = Properties["FaultId"].Value.ToString();

            // Create
            if (ChangeType == "0")
            {
                Fault MyNewFault = new MyFault(SubscriptionResult.Instance);
                // TODO: Whatever you want!
            }
            // Remove
            if (ChangeType == "1")
            {
                // TODO: Use FaultId to find and delete whatever representation you have...
            }
            // Update
            if (ChangeType == "2")
            {
                // TODO: Use FaultId to find and modify whatever representation you have...
            }
        }
    }
    public void OnError(Exception e)
    {
        // Handle Exceptions
    }
    public void OnCompleted()
    {
        // Nothing
    }
}

Reconocimiento del ciclo de vida de los errores

Los errores no están diseñados para que el usuario los marque como "vistos" o resueltos. Se crean cuando el Servicio de mantenimiento observa un problema y se quitan automáticamente solo después de que el Servicio de mantenimiento ya no pueda observar el problema. En general, esto refleja que el problema se ha corregido.

Sin embargo, en algunos casos, el Servicio de mantenimiento puede volver a detectar errores, como después de una conmutación por error, conectividad intermitente, etc. Por este motivo, puede tener sentido conservar su propia representación de errores, para que pueda desduplicarlos fácilmente. Esto es importante sobre todo si envía alertas por correo electrónico o equivalentes.

Propiedades de errores

En la tabla siguiente se presentan varias propiedades clave del objeto de error. Para obtener el esquema completo, inspeccione la clase MSFT_StorageDiagnoseResult en storagewmi.mof.

Propiedad Ejemplo
Id de fallo {12345-12345-12345-12345-12345}
TipoDeFallo Microsoft.Health.FaultType.Volume.Capacity
Motivo "El volumen se está quedando sin espacio disponible."
PerceivedSeverity 5
DescripciónDelObjetoDefectuoso Contoso XYZ9000 S.N. 123456789
UbicaciónDelObjetoDefectuoso Rack A06, RU 25, Ranura 11
AccionesRecomendadas {"Expandir el volumen.", "Migrar cargas de trabajo a otros volúmenes."}

FaultId: identificador único dentro del ámbito de un clúster.

PerceivedSeverity: PerceivedSeverity = { 4, 5, 6 } = { "Informacional", "Advertencia" y "Error" }, o colores equivalentes como azul, amarillo y rojo.

FaultingObjectDescription: información de parte del hardware, normalmente en blanco para objetos de software.

FaultingObjectLocation: información de ubicación del hardware, normalmente en blanco para objetos de software.

RecommendedActions: lista de acciones recomendadas que son independientes y en ningún orden concreto. Actualmente, esta lista suele tener una longitud de 1.

Propiedades del evento de error

En la tabla siguiente se presentan varias propiedades clave del evento de error. Para obtener el esquema completo, inspeccione la clase MSFT_StorageFaultEvent en storagewmi.mof.

Tenga en cuenta el ChangeType que indica si se crea, elimina o actualiza una falla y el FaultId. Un evento también contiene todas las propiedades del error afectado.

Propiedad Ejemplo
ChangeType 0
Id de fallo {12345-12345-12345-12345-12345}
TipoDeFallo Microsoft.Health.FaultType.Volume.Capacity
Motivo "El volumen se está quedando sin espacio disponible."
PerceivedSeverity 5
DescripciónDelObjetoDefectuoso Contoso XYZ9000 S.N. 123456789
UbicaciónDelObjetoDefectuoso Rack A06, RU 25, Ranura 11
AccionesRecomendadas {"Expandir el volumen.", "Migrar cargas de trabajo a otros volúmenes."}

ChangeType: ChangeType = { 0, 1, 2 } = { "Create", "Remove", "Update" }.

Referencia de fallos del servicio de salud

El servicio de mantenimiento en Azure Local y Windows Server puede detectar errores en varios componentes del sistema, como el almacenamiento, las redes y los recursos de proceso.

Para obtener una vista detallada de las fallas de salud, incluidas las asignaciones de gravedad de las fallas, la configuración de salud (tipos de datos, asociaciones de fallas, valores predeterminados y descripciones) y la lista de métricas recopiladas, descargue la hoja de cálculo de fallas del servicio de salud.

Consideraciones para fallos del servicio de salud.

  • Algunos errores están deshabilitados de forma predeterminada. Para habilitar un error, establezca la configuración de salud correspondiente en true.
  • Por ejemplo, el tipo Microsoft.Health.FaultType.PhysicalDisk.HighLatency.AverageIO de error está deshabilitado de forma predeterminada. Para habilitarlo, establezca la configuración de salud System.Storage.PhysicalDisk.HighLatency.Threshold.Tail.Enabled en true.
  • El estado de los componentes del gabinete de almacenamiento, como ventiladores, fuentes de alimentación y sensores, se derivan de SCSI Enclosure Services (SES). Si el proveedor no proporciona esta información, el servicio de salud no puede mostrarla.

Referencias adicionales