Observability:使用 Elastic Agent 来进行 Uptime 监控

2022年9月22日   |   by mebius

在 Elastic Stack7.x 中,Elastic 引入 Heartbeat 来对网站或微服务来进行监控。通过 Heartbeat 的应用,我们可以知道网站及微服务的运行情况,我们甚至可以针对服务器的证书的有效期进行监控。随着 Elastic Agent 的推出,Elastic 更建议我们使用 Elastic Agent 的方法来对网站及微服务来进行监控。为了大家能对 Heartbeat 及 Elastic Agent 有更多的认识和了解,请参阅我之前的文章:

在今天的展示中,我将使用如下的架构来进行展示:

%title插图%num

我将使用最新的 Elastic Stack 8.4.1 来进行展示。在 macOS 机器上安装 Elasticsearch。我将在 Ubutu OS 上安装微服务来进行展示。

安装

在进行下面的练习之前,我们必须安装好 Elasticsearch 及 Kibana。你可以参考我之前的文章:

你需要根据自己的平台选择适合你的文章进行安装。在这里特别指出的是:选择 Elastic Stack 8.x 的文章来进行安装。

我们按照上面的要求进行安装 Elasticsearch 及 Kibana。为了能够让 fleet 正常工作,内置的 API service必须启动。我们必须为 Elasticsearch 的配置文件 config/elasticsearch.yml 文件配置:

config/elasticsearch.yml

xpack.security.authc.api_key.enabled: true

配置完后,我们再重新启动 Elasticsearch。针对 Kibana,我们也需要做一个额外的配置。我们需要修改 config/kibana.yml 文件。在这个文件的最后面,添加如下的一行:

config/kibana.yml


xpack.encryptedSavedObjects.encryptionKey: 'fhjskloppd678ehkdfdlliverpoolfcr'

如果你不想使用上面的这个设置,你可以使用如下的方式来获得:

./bin/kibana-encryption-keys generate

%title插图%num

从上面的输出中,我们可以看出来,有三个输出的 key。我们可以把这三个同时拷贝,并添加到 config/kibana.yml 文件的后面。当然,我们也可以只拷贝其中的一个也可。我们再重新启动 Kibana。

这样我们对 Elasticsearch 及 Kibana 的配置就完成。 针对 Elastic Stack 8.0 以前的版本安装,请阅读我之前的文章 “Observability:如何在最新的 Elastic Stack 中使用 Fleet 摄入 system 日志及指标”。

除此之外,Kibana 需要 Internet 连接才能从 Elastic Package Registry 下载集成包。 确保 Kibana 服务器可以连接到https://epr.elastic.co 的端口 443 上。如果你的环境有网络流量限制,有一些方法可以解决此tgcode要求。 有关详细信息,请参阅气隙环境

目前,Fleet 只能被具有 superuser role 的用户所使用。

配置 Fleet

使用 Kibana 中的 Fleet 将日志、指标和安全数据导入 Elastic Stack。第一次使用 Fleet 时,你可能需要对其进行设置并添加 Fleet Server。在做配置之前,我们首先来查看一下有没有任何的 integration 被安装:

%title插图%num

%title插图%num

我们打开 Fleet 页面:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

我们接下来添加 Agent:

%title插图%num

%title插图%num

上面显示我们的 Fleet Sever policy 被成功地创建了。我们需要把我们的 Fleet Server 安装到 Ubuntu OS 机器上。

%title插图%num

我们的目标机器是 Linux OS。我们点击上面的拷贝按钮,并在 Linux OS 上进行安装:

curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.4.1-linux-x86_64.tar.gz
tar xzvf elastic-agent-8.4.1-linux-x86_64.tar.gz
cd elastic-agent-8.4.1-linux-x86_64
sudo ./elastic-agent install 
  --fleet-server-es=https://192.168.0.3:9200 
  --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2NjM1NjQxNTY5MzI6TGxhdWtjbmdTSnlYNlBEVkxOQUVJQQ 
  --fleet-server-policy=fleet-server-policy 
  --fleet-server-es-ca-trusted-fingerprint=f77c4413ccc6a034ac9767f12b9f8240bf301ce956ce0d96109a7863c4a33463

我们安装上面的命令在 Ubuntu 机器上运行,并安装好 Elastic Agent:

%title插图%num

我们可以使用如下的命令来检查 Elastic Agent 的运行状态:

service elastic-agent status

%title插图%num

上面显示我们的 Elastic Agent 的状态显示是 active 的。

我们回到 Kibana 的界面:

%title插图%num

上面显示我们的连接状态是 connected 状态。

%title插图%num

上面显示我们的 Ubuntu OS 机器是处于 Healthy 的状态。

由于我们的 Elastic Agent 和 Fleet Server 是在一个服务器上运行的,所以,我们直接在 Fleet Server Policy 里添加我们想要的 integration。如果你的 Elastic Agent 可以运行于另外的一个机器上,而不和 Fleet Server 在同一个机器上,你可以创建一个新的 policy,比如 logs。然后让 agent赋予给这个 新创建的 policy。我们需要明白的一点是在我们上面安装 Elastic Agent 的时候,它同时也安装了 Fleet Server。在一个机器上,我们只能运行一个 Elastic Agent 的实例。我们在 Ubuntu OS 机器上使用如下的命令来进行查看:

ps aux | grep fleet

%title插图%num

我们可以看到 Fleet Server 是正在运行中的。

对于一下开发者来说,他们可能想到会卸载 Elastic Agent。那么我们该如何进行操作呢?我们使用如下的命令:

liuxg@liuxgu:~$ su
Password: 
root@liuxgu:/home/liuxg# cd
root@liuxgu:~# cd /opt/Elastic/Agent/
root@liuxgu:/opt/Elastic/Agent# ls
data                             elastic-agent.yml                               NOTICE.txt
elastic-agent                    elastic-agent.yml.2022-09-19T13-24-57.7474.bak  README.md
elastic-agent-20220919-1.ndjson  fleet.enc                                       vault
elastic-agent-20220919.ndjson    fleet.enc.lock
elastic-agent.reference.yml      LICENSE.txt
root@liuxgu:/opt/Elastic/Agent# ./elastic-agent remove

我们可以在 /opt/Elastic/Agent 这个目录中找到 elastic-agent 这个运行程序。使用上面的命令即可删除 Elastic Agent 的安装。针对我们的情况,我们不需要这么做。我们将继续下面的操作。

由于在 Ubuntu 机器上,我们只能运行一个 Elastic Agent 的实例,而这个 Agent (liuxgu)已经处于 Fleet Server Policy 中,我们直接在这个 policy 中添加一个叫做 Elastic Synthetics 的 integration:

%title插图%num

%title插图%num

%title插图%num

在这里我们必须注意的是目前 Elastic Sythetics 是一个 Beta 的发布。它可能和最终的 GA 发布版有所不同。

%title插图%num

%title插图%num

在上面,我们选用 HTTP 来侦测 Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic 的网站运行情况。

%title插图%num

%title插图%num

我们接下来查看 datastream 里的数据:

%title插图%num

我们在上面的最后一行可以看到 synthetics 的一个列表。它表明我们已经在采集数据了。针对这个条目,它没有对应的 Dashboard。我们需要打开 Uptime 应用来进行查看:

%title插图%num

%title插图%num

在上面,我们已经成功地对 elastic.co 网站进行了监控。当然,我们目前没有办法模拟这个网站的宕机情况。

监控 REST 服务运行状态

我们到网址https://github.com/liu-xiao-guo/uptime_example 下载代码:

git clone https://github.com/liu-xiao-guo/uptime_example

我们把这个 REST 服务部署到 Ubuntu OS 下。下载后的文件如下:

liuxg@liuxgu:~$ cd uptime_example/
liuxg@liuxgu:~/uptime_example$ ls
README.md  heartbeat.yml  monitors.d  services
liuxg@liuxgu:~/uptime_example$ tree -L 3
.
├── README.md
├── heartbeat.yml
├── monitors.d
│ ├── icmp.yml
│ ├── restful.http.yml
│ ├── soap.http.yml
│ └── tcp.yml
└── services
    ├── README.md
    ├── restful
    │ ├── build.gradle
    │ └── src
    └── soap
        ├── build.gradle
        └── src

如上所示,在上面的 services 目录中,有一个叫做 restful 的目录。我们进入到该目录中:

gradle clean
gradle build
liuxg@liuxgu:~/uptime_example/services/restful$ gradle build

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed
liuxg@liuxgu:~/uptime_example/services/restful$ ls build/libs/
restful-1.0.0.jar

如上所示,我们看到一个叫做 restful-1.0.0.jar 的文件。我们可以通过如下的方式来运行:

java -jar restful-1.0.0.jar

%title插图%num

我们可以在浏览器中,通过如下的方式来进行访问:

%title插图%num

或者通过如下的 curl 命令来进行检查这个 RESTful 服务的运行:

$ curl http://ubuntu:9001/product/logstash | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    29    0    29    0     0   2177      0 --:--:-- --:--:-- --:--:--  3222
{
  "name": "Logstash",
  "qty": 900
}

从上面的显示中,我们可以看到我们的链接地址 http://ubuntu:9001/product/logstash 返回一个 JSON 的结果。针对我们的检测来说,我们如果通过这个接口能够返回到这样的一个 JSON 的结果,我们认为我们的微服务是正常工作的,否则,我们认为是处于不正常工作状态。为此,我们再添加一个 Elastic Synthetics 集成:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

保存当前的设置:

%title插图%num

%title插图%num

%title插图%num

按照同样的方法,我们进入到 Uptime 应用中:

%title插图%num

从上面的输出中,我们可以看到服务是运行正常的。我们接下来去 Ubuntu 机器运行的 terminal 中中断这个服务的运行。我们使用 CTRL + C 组合键:

%title插图%num

过一段时间,我们再回到 Uptime 的界面:

%title插图%num

从上面的输出中,我们可以看到该服务已经是 DOWN 的状态了。

我们再次启动 REST 服务:

%title插图%num

过一小会儿,我们再次回到 Kibana 的 Uptime 界面:

%title插图%num

文章来源于互联网:Observability:使用 Elastic Agent 来进行 Uptime 监控

相关推荐: Elasticsearch:我的 Elasticsearch 集群中应该有多少个分片?

作者:Christian Dahlqvist 编者注:“每 GB 堆内存的目标是 20 个或更少分片” 的经验法则在 8.3 版中已弃用。 此博客已更新以反映新建议。 Elasticsearch 是一个非常通用的平台,它支持各种用例,并在数据组织和复制策tgc…