我想在Azure虚拟机(Ubuntu 16.04)中的服务(grafana或influxdb)停止时得到警报。我想使用c#连接到VM,并检查grafana和influxdb服务的状态。任何人都可以共享实现此目的的代码示例吗?
答案 0 :(得分:0)
这是您可以用来在c#中使用SSH连接到Azure linux的东西
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是
# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes
稍后您可以轮询已安装的服务。
对于另一种解决方案,您还可以在linux VM中部署rest api,以检查服务的状态,并从C#httpclient对其进行调用。
希望有帮助
答案 1 :(得分:0)
这两个服务都提供运行状况终结点,可用于从远程服务器检查其状态。无需打开远程外壳连接。实际上,如果必须对每个服务器场进行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 ping the health URLs并在它们关闭时发送警报。