1

J'ai surveillé les compteurs de performance tels que la mémoire, le disque libre, etc. à l'aide de métriques personnalisées CloudWatch. Puis-je surveiller les services en utilisant CloudWatch? J'ai vérifié les fonctionnalités que les moniteurs de surveillance de nuages, mais n'a rien trouvé lié aux services de surveillance. J'ai juste besoin de surveiller si le service est en cours d'exécution ou non et envoyer une notification lorsque l'état du service change.Surveillance des services de l'instance Windows EC2 à l'aide d'AWS CloudWatch

Répondre

3

Oui, mais les solutions prêtes à l'emploi comme le EC2Config Windows Integration auquel vous avez fait allusion ne sont pas aussi facilement disponibles pour les mesures personnalisées au niveau du service. CloudWatch Custom Metrics vous permet d'étendre CloudWatch avec vos propres métriques et données définies, de sorte que vous pouvez les implémenter vous-même pour surveiller vos propres services. Votre service peut écrire des données de métriques sur CloudWatch lui-même, ou vous pouvez écrire un autre processus qui surveille votre service et écrit des métriques en fonction des réponses de votre service à CloudWatch.


par vos modifications, pour publier les métriques CloudWatch personnalisés pour un ensemble arbitraire de services Windows nécessitera certaines fenêtres spécifiques à Powershell, parce que nous ne pouvons pas supposer que le service aura un point final Web pour ping.

Vous devez créer un moniteur de service qui évalue vos services via Get-Service, puis publie un point de données dans les métriques personnalisées CloudWatch s'ils sont en cours d'exécution.

Voici un exemple d'implémentation dans PowerShell qui va écrire des métriques personnalisées pour les services avec un nom correspondant à *YOURSERVICENAMESHERE* toutes les 300 secondes. Si vous voulez exécuter ceci pour chaque service sur l'instance EC2, vous pouvez remplacer ceci par le caractère générique *, mais cela peut être coûteux à l'échelle. Il peut également nécessiter quelques ajustements si trop de services sont sur la boîte, car vous ne pouvez envoyer autant de métriques à la fois via Write-CwMetricData. Voir les commentaires de code pour plus de détails à ce sujet. En créant uniquement un point de données en cas de succès, vous établissez une condition d'échec (INSUFFICIENT_DATA pendant X secondes) que vous pouvez utiliser pour créer des alarmes CloudWatch répondant à votre contrainte de notification.

Ce script doit être exécuté sur une instance de Windows EC2 avec AWS Tools for PowerShell installé et configuré:

Param 
(
    [string]$Period = 300, 
    [string]$Namespace = 'service-monitor' 
) 

# Use the EC2 metadata service to get the host EC2 instance's ID 
$instanceId = (New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id") 

# Associate current EC2 instance with your custom cloudwatch metric 
$instanceDimension = New-Object -TypeName Amazon.CloudWatch.Model.Dimension; 
$instanceDimension.Name = "instanceid"; 
$instanceDimension.Value = $instanceId; 

# "Job" loop; write to CloudWatch and then sleep for the interval defined by the period variable above, in seconds. 
while($true) 
{ 
    $metrics = @(); 

    $runningServices = Get-Service -Name *YOURSERVICENAMESHERE* | ? { $_.Status -eq 'Running' } 

    # For each running service, add a metric to metrics collection that adds a data point to a CloudWatch Metric named 'Status' with dimensions: instanceid, servicename 
    $runningServices | % { 
     $dimensions = @(); 

     $serviceDimension = New-Object -TypeName Amazon.CloudWatch.Model.Dimension; 
     $serviceDimension.Name = "service" 
     $serviceDimension.Value = $_.Name; 

     $dimensions += $instanceDimension; 
     $dimensions += $serviceDimension; 

     $metric = New-Object -TypeName Amazon.CloudWatch.Model.MetricDatum; 
     $metric.Timestamp = [DateTime]::UtcNow; 
     $metric.MetricName = 'Status'; 
     $metric.Value = 1; 
     $metric.Dimensions = $dimensions; 

     $metrics += $metric;  

     Write-Host "Checking status for: $($_.Name)"   
    } 

    # Write all of the metrics for this run of the job at once, to save on costs for calling the CloudWatch API. 
    # This will fail if there are too many services in metrics collection; if this happens, just reduce the amount of 
    # services monitored, or edit this line into the above foreach loop and write each metric directly. 
    Write-CWMetricData -Namespace $Namespace -MetricData $metrics 

    Write-Host "Sleeping for $Period seconds." 

    Start-Sleep -s $Period 
} 

Enregistrer ce dans un fichier et vous pouvez l'exécuter à partir de la ligne de commande pour lancer des mesures d'écriture. Une fois que vous êtes à l'aise avec cela, n'hésitez pas à abandonner la boucle "while true" pour une tâche planifiée ou un travail PowerShell.

Ressources supplémentaires:

+0

Mon exigence est pas trop compliqué. Il doit simplement surveiller si le service est en cours d'exécution ou non.De cette façon, il doit surveiller tous les services sous la colonne Services de l'instance ec2. Et, encore une chose, je voulais faire cela pour les instances Windows. – prudhvi

+0

J'ai modifié ma question. Vérifie s'il te plaît. – prudhvi

+0

@prudhvi Votre modification ne change pas ma réponse; Pour y parvenir avec CloudWatch, vous devez soit trouver un moniteur tiers qui publie des métriques personnalisées CloudWatch, soit rédiger un moniteur de service qui publie des métriques personnalisées CloudWatch. La documentation liée devrait être suffisante pour commencer. –