Ottenere la cronologia delle prestazioni del cluster
Si applica a: Locale di Azure 2311.2 e versioni successive; Windows Server 2022, Windows Server 2019
Il servizio Integrità riduce il lavoro necessario per ottenere informazioni sulla capacità e sulle prestazioni dal cluster Spazi di archiviazione diretta. Un cmdlet fornisce un elenco curato di metriche essenziali, raccolte in modo efficiente e aggregato in modo dinamico tra i nodi, con logica predefinita per rilevare l'appartenenza al cluster. Tutti i valori sono solo in tempo reale e temporizzati.
Uso in PowerShell
Usare il cmdlet seguente per ottenere le metriche per l'intero cluster Spazi di archiviazione diretta:
Get-ClusterPerformanceHistory
Suggerimento
Usare l'alias Get-ClusterPerf per salvare alcune sequenze di tasti.
È anche possibile ottenere metriche per un volume o un server specifico:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Utilizzo in .NET e C#
In questa sezione viene illustrato come connettersi al Servizio integrità, usare gli oggetti di individuazione e implementare un observer per iniziare a trasmettere le metriche.
Connessione
Per eseguire una query sul Servizio integrità, si stabilisce una CimSession con il cluster. A tale scopo, sono necessarie alcune operazioni disponibili solo in Microsoft .NET completo, ovvero non è possibile eseguire questa operazione direttamente da un'app Web o per dispositivi mobili. Gli esempi di codice in questa sezione usano C#, la scelta più semplice per questo livello di accesso ai dati.
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;
}
Il nome utente specificato deve essere un amministratore locale del computer di destinazione.
È consigliabile costruire password SecureString direttamente dall'input dell'utente in tempo reale, in modo che la password non venga mai archiviata in memoria in testo non crittografato. In questo modo è possibile attenuare un'ampia gamma di problemi di sicurezza. Ma in pratica, costruire come sopra è comune a scopo di prototipazione.
Individuare gli oggetti
Dopo aver stabilito CimSession, è possibile eseguire query su Strumentazione gestione Windows (WMI) nel cluster.
Prima di poter ottenere errori o metriche, è necessario ottenere istanze di diversi oggetti pertinenti. Ottenere prima di tutto il MSFT_StorageSubSystem che rappresenta Spazi di archiviazione diretta nel cluster. A tale scopo, è possibile ottenere ogni MSFT_StorageNode nel cluster e ogni MSFT_Volume dei volumi di dati. Infine, è necessario ottenere il MSCluster_ClusterHealthService, il Servizio integrità stesso.
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();
}
Si tratta degli stessi oggetti che si ottengono in PowerShell usando cmdlet come Get-StorageSubSystem, Get-StorageNode e Get-Volume.
È possibile accedere a tutte le stesse proprietà, documentate in Classi API di gestione archiviazione.
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());
}
Richiamare GetMetric per avviare lo streaming di esempi di un elenco curato da esperti di metriche essenziali in base ai nomi delle metriche forniti dal parametro MetricName , raccolti in modo efficiente e aggregato in modo dinamico tra i nodi, con logica predefinita per rilevare l'appartenenza al cluster. Gli esempi arrivano in base all'intervallo di tempo specificato dal parametro StreamName .
Per l'elenco completo delle metriche disponibili, vedere Cronologia delle prestazioni per Spazi di archiviazione diretta.
IObserver.OnNext()
Questo codice di esempio usa il modello di progettazione Observer per implementare un Observer il cui metodo OnNext() viene richiamato quando arriva ogni nuovo esempio di metriche. Il metodo OnCompleted() viene chiamato if/when streaming termina. Ad esempio, è possibile usarlo per reinizializzare lo streaming, in modo che continui a tempo indeterminato.
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
}
}
Avviare lo streaming
Dopo aver definito Observer, è possibile iniziare a trasmettere.
Specificare la CimInstance di destinazione a cui si desidera definire l'ambito delle metriche. Può essere il cluster, qualsiasi nodo o qualsiasi volume.
Il parametro count è il numero di campioni prima del termine del flusso.
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);
}
Queste metriche possono essere visualizzate, archiviate in un database o usate in qualsiasi modo.