Лучший способ проверить, остановился ли сервис Ubuntu в C # - PullRequest
0 голосов
/ 06 марта 2019

Я хочу получить уведомление, когда служба (grafana или influenxdb) в виртуальной машине Azure (Ubuntu 16.04) остановлена. Я хотел бы использовать c # для подключения к виртуальной машине и проверки состояния сервисов grafana и influenxdb. Кто-нибудь может поделиться примером кода, который реализует это?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Обе службы предоставляют конечные точки работоспособности, которые можно использовать для проверки их состояния с удаленного сервера.Там нет необходимости открывать удаленное подключение оболочки.Фактически, было бы невозможно контролировать большие фермы серверов, если бы приходилось использовать SSH для каждой из них.

В простейшем случае, игнорируя проблемы с сетью, можно просто попасть в конечные точки работоспособности, чтобы проверить состояние обеих служб.Примерная реализация может выглядеть следующим образом:

public async Task<bool> CheckBoth()
{
    var client = new HttpClient
    {
        Timeout = TimeSpan.FromSeconds(30)
    };

    const string grafanaHealthUrl = "https://myGrafanaURL/api/health";
    const string influxPingUrl = "https://myInfluxURL/ping";

    var (grafanaOK, grafanaError) = await CheckAsync(client, grafanaHealthUrl,
                                                     HttpStatusCode.OK, "Grafana error");
    var (influxOK, influxError) = await CheckAsync(client, influxPingUrl, 
                                                   HttpStatusCode.NoContent,"InfluxDB error");

    if (!influxOK || !grafanaOK)
    {
                //Do something with the errors
                return false;
    }
    return true;

}

public async Task<(bool ok, string result)> CheckAsync(HttpClient client,
                                                       string healthUrl, 
                                                       HttpStatusCode expected,
                                                       string errorMessage)
{
    try
    {
        var status = await client.GetAsync(healthUrl);
        if (status.StatusCode != expected)
        {
            //Failure message, get it and log it
            var statusBody = await status.Content.ReadAsStringAsync();
            //Possibly log it ....
            return (ok: false, result: $"{errorMessage}: {statusBody}");
        }
    }
    catch (TaskCanceledException)
    {
        return (ok: false, result: $"{errorMessage}: Timeout");
    }
    return (ok: true, "");
}

Возможно, лучшим решением будет использование Azure Monitor для периодической проверки URL-адресов работоспособности и отправки оповещения, если они не работают.

0 голосов
/ 07 марта 2019

Вот кое-что, что вы можете использовать для подключения к Linux Azure с использованием SSH в c #

using (var client = new SshClient("my-vm.cloudapp.net", 22, "username", "password​"))
        {
            client.Connect();
            Console.WriteLine("it worked!");
            client.Disconnect();
            Console.ReadLine();
        }

Обычно SSH-сервер разрешает только аутентификацию с открытым ключом или двухфакторную аутентификацию.

Измените ваш / etc / ssh / sshd_configuncomment #PasswordAuthentication yes

# Change to no to disable tunnelled clear text passwords
 #PasswordAuthentication yes

Позже вы можете опросить установленные службы.

Также для альтернативного решения вы можете развернуть API отдыха в вашей виртуальной машине Linux, чтобы проверить состояние вашей службы и вызвать его из C # httpclient для получения статуса.

Надеюсь, это поможет

...