6-1-elastic aget说明

熊 1 阅读 日志平台

1. 基础概念

1.1 elastic agent

Elastic Agent是一种向主机添加日志、指标和其他类型数据的监控的单一、统一的方法。 它还可以保护主机免受安全威胁、从操作系统查询数据、从远程服务或硬件转发数据等等。 单个代理可以更轻松、更快速地在您的基础架构中部署监控。 每个代理都有一个可以更新的策略 , 以添加新数据源、安全保护等的集成。 如下图所示 , Elastic Agent可以监控部署它的主机 , 并且可以从无法直接部署的远程服务和硬件收集和转发数据。

9b5c41927a88538c3abbfbb068a1fbac

1.2 Fleet

Fleet是一个组件 , 用于在你的环境中管理 Elastic Agent 配置。 Fleet 由两部分组成:

  • Fleet UI是一个带有用户界面的Kibana应用程序 , 供用户载入和配置代理、管理载入数据以及管理整个环境中的代理。

  • Fleet Server 是一个后端组件 , 你环境中的弹性代理可以连接到该组件 , 以检索代理策略、更新和管理命令。

Fleet Server是Elastic Agent的一种特殊模式 , 可以与你的Elastic Stack部署一起集中部署。 你可以在负载平衡设置中配置 Fleet Server的多个实例 , 以扩展性能并增加可用性。Fleet Server需要连接到支持 Elasticsearch 集群才能运行。

涉及Elastic Agent 和 Fleet 的架构如下所示:

af3b152b8d29458fa3b7957a48aa0a15

整个环境中的代理会定期与Fleet Server通信 , 以检索代理策略配置和管理命令。 Fleet Server与支持的 Elasticsearch 集群交互 , 为代理创建安全凭证、检索代理策略并保持状态。

Kibana 上的 Fleet UI 将代理策略存储在 Elasticsearch 上 , 管理用于数据载入的数据流的创建 , 并为正在使用的数据源加载索引模板和仪表板等工件。

根据代理策略的配置 , Elastic Agent 将数据直接发送到目标 Elasticsearch 集群(或其他受支持的输出 , 例如 Logstash 或 Kafka)以供摄取。

1.3 代理策略和集成

代理策略 , 也就是agent policy。集成为integration。代理策略是一个 YAML 文件 , 它定义代理将收集并发送到Elasticsearch(或其他受支持的目的地)的各种输入和设置。 当你在独立模式下使用 Elastic Agent 时 , 可以使用 /etc/elasticagent/elastic-agent.yml 文件配置策略。 当代理由 Fleet 管理时 , 策略会从 Elasticsearch 中检索并在代理启动时自动应用到代理。 Kibana 上的 Fleet 界面可用于创建和管理代理策略。 创建策略后 , 用户可以添加定义代理收集的数据源的集成。

在 7.13 之前是这样的一种架构:

20211011103435490

在 7.13 及之后是这样的一种架构:

20210902095953936
20210727174241216
20210902092401420

通过添加Fleet server , 我们可以得到如下的好处:

  • Scale: 在之前的架构中 , 我们如果有1000个 agents , 那么在 Kibana 中将会有1000个显示的 agent。通过改造之后 , 我们的 Kibana 将只会和Fleet Server进行交互。它可以支持更多的agents。

  • Secuirty: 它可以使得我们使用较少的访问权限。因为 Kibana 只需要和 Fleet Server 进行交互 , Fleet Server 相比较而言 , 设计较为简单 , 而且它具有更少的访问权限。

  • More flexibility: 给我们的部署带来更多的灵活性。你可以把你的 Fleet Server安装在你的agents附近 , 而不需要 Kibana 安装于你的数据采集附近

Fleet Server是 Elastic Agent 用来与 Elasticsearch 通信的机制:

  • 创建新的代理策略后 , 它会保存到 Elasticsearch。

  • 为了注册该策略 , Elastic Agents 使用为身份验证生成的注册密钥向 Fleet Server 发送请求。

  • Fleet Server 接收请求并从 Elasticsearch 获取代理策略 , 然后将该策略发送到在该策略中注册的所有 Elastic Agent。

  • Elastic Agent 使用策略中的配置信息来收集数据并将其发送到 Elasticsearch。

  • Fleet Server 会定期检查 Elastic Agent 的状态信息。

  • 当策略更新时 , Fleet Server 从 Elasticsearch 检索更新的策略并将其发送到连接的 Elastic Agent。

Fleet Server作为 Elastic Agent 内的子进程运行。Agent 使用描述 Fleet Server 配置的特殊策略。 在大规模 self-managed 部署或在 Elastic Cloud 上托管的 Elasticsearch 服务中 , Fleet Server通常作为专用的Elastic Agent` 通信主机运行 , 但你可以选择将其用于自我管理集群上的数据收集。

2. 安装

2.1 elastic agent 安装

2.1.1 安装准备

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

xpack.security.authc.api_key.enabled: true

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

 xpack.encryptedSavedObjects.encryptionKey: 'fhjskloppd678ehkdfdlliverpoolfcr'

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

./bin/kibana-encryption-keys generate
8a47c72550ec4de2815a1c6ab509834c

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

2.1.2 添加代理策略

  1. 点击代理策略页面

    image-20240418171441691
    image-20240418171459190
  2. 创建代理策略

    image-20240418171648627
  3. 点击刚创建好的代理策略

    image-20240418171924857
  4. 在这个 policy 里面 , 它已经包含了一个叫做 system-1 的 integration

    image-20240418172104007
  5. 点击编辑集成

    image-20240418172302810

    可以看到这个集成里面主要由一些系统日志信息

    image-20240418172623857

    如上所示 , 它采集系统的日志 , Windows系统的事件以及系统的指标等等。当然对于我们的 nginx_demo 这个 policy 来说 , 我们甚至可以删除 system-1 这个 integration , 如果我们不是对它里面所采集的信息感兴趣的话。针对我的配置 , 我选择保留。接下来 , 我们来添加 nginx 这个 integration

  6. 点击添加集成

    image-20240418173640905
  7. 搜索nginx集成策略

    image-20240418173723519
  8. 点击添加nginx集成

    image-20240418173800052
  9. 点击保存并继续

    image-20240418173911251
  10. 我们可以看见一个新增加的nginx-1的 integration。

    image-20240418174017351
  11. 新增加了一个叫做 fleet server 的元件。我们至少需要在一个机器上部署一次 , 这样各个 elastic-agent 可以对它进行连接。针对我们的情况 , 我们按照上面添加 nginx integration 相同的方法来添加 fleet-server。

    image-20240418174137488
    image-20240418174200964
  12. 最终我们的 nginx-demo policy 是这样的:

    image-20240418174753943

2.1.3 配置fleet

  1. 在fleet的设置中, 调整输出设备

    image-20240418202242965
    image-20240419012603603

  2. 点击添加Fleet服务器

    image-20240418192303632
    image-20240418192357519
    image-20240418192449336

    我们必须添加 Fleet 服务器。这是一个从 7.13 开始的要求。我们添加一个 Fleet 服务器的地址:

    点击生成服务令牌

    image-20240418192543406
  3. 点击拷贝生成的命令

    image-20240418192749508
  4. 将拷贝的命令在具体的fleet服务器上面运行命令

    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.1-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.1-linux-x86_64.tar.gz
    cd elastic-agent-8.13.1-linux-x86_64
    sudo ./elastic-agent install \
      --fleet-server-es=<ELASTICSEARCH_HOST> \
      --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3MTM0NTk4Nzg2MDY6dWVqakxBeW5UYW1sVGVZaWN0c0p1Zw \
      --fleet-server-policy=4fd2f8a8-15e5-499d-b9d4-cb1e1f28b46a \
      --fleet-server-port=8220

    复制为以上内容。修改为以下命令内容:

    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.1-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.1-linux-x86_64.tar.gz
    cd elastic-agent-8.13.1-linux-x86_64
    sudo ./elastic-agent install \
      --fleet-server-es=https://192.168.71.30:9200 \
      --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3MTM0NTk4Nzg2MDY6dWVqakxBeW5UYW1sVGVZaWN0c0p1Zw \
      --fleet-server-policy=4fd2f8a8-15e5-499d-b9d4-cb1e1f28b46a \
      --fleet-server-port=8220 \
       --certificate-authorities=/etc/ca.crt 
       
    #这里因为elasticsearch中添加了内容ca.crt证书文件,
    ​
    image-20240419012334389

    这里需要注意, 官方推荐,在正式使用的过程中, 推荐使用证书的https模式。但是需要证书

    image-20240419232831672

    使用以下命令生成对应的证书文件,我们使用 CA 来为 Fleet Server 生成证书:

    ./bin/elasticsearch-certutil cert \
      --name fleet-server \
      --ca-cert /path/to/ca/ca.crt \
      --ca-key /path/to/ca/ca.key \
      --dns your.host.name.here \
      --ip 192.0.2.1 \
      --pem

    之后使用以下类型命令安装

    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.1-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.1-linux-x86_64.tar.gz
    cd elastic-agent-8.13.1-linux-x86_64
    sudo ./elastic-agent install --url=https://192.168.71.46:8220 \
      --fleet-server-es=https://192.168.71.29:9200 \
      --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3MTM1MjIyMjMxMTM6U1plMkk1ZWNTOS0yaXFzOF9Day1ZZw \
      --fleet-server-policy=fleet-server-policy \
      --certificate-authorities=/etc/ca.crt \
      --fleet-server-es-ca=/etc/elasticsearch01.crt \
      --fleet-server-cert=/etc/fleet.crt \
      --fleet-server-cert-key=/etc/fleet.key \
      --fleet-server-port=8220

  5. 检查fleet服务器中的端口

    image-20240419012748575
  6. 检查页面,可以看到已经配置正常

    image-20240419013137435

2.1.4 配置nginx服务

这里单独找一台服务器, 添加elasitc-agent服务

  1. 在fleet页面点击添加代理

    image-20240419013503811
    image-20240419013607392
  2. 复制命令之后,在nginx节点中运行复制的命令。复制的命令为如下内容

    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.2-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.2-linux-x86_64.tar.gz
    cd elastic-agent-8.13.2-linux-x86_64
    sudo ./elastic-agent install --url=https://192.168.71.47:8220 --enrollment-token=WHl4QThvNEJ1bU4tc3hUdHJSYW06WEdxaU96YnlUWlNxd0s1Z2M3S2JLQQ==

    这里因为是https

    所以运行命令需要多添加--insecure

    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.2-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.2-linux-x86_64.tar.gz
    cd elastic-agent-8.13.2-linux-x86_64
    sudo ./elastic-agent install --url=https://192.168.71.47:8220 --enrollment-token=WHl4QThvNEJ1bU4tc3hUdHJSYW06WEdxaU96YnlUWlNxd0s1Z2M3S2JLQQ==  --insecure

    这里可以使用以下命令信任对应的根证书颁发机构

    在运行之前,我们把证书拷贝到 Ubuntu 机器的如下地址:
    
    sudo cp ca.crt /usr/local/share/ca-certificates
    然后,我们使用如下的方法来进行更新:
    
    sudo update-ca-certificates

  3. 运行命令之后, 可以在页面看到已经添加了一台elastic agent服务器

    image-20240419021407488

2.1.5 页面检查

  1. dashboard页面

    image-20240419164457486

  1. nginx页面

    image-20240419233554399
  2. 我们在 Discover 上查看数据。我查找 logs-* 索引模式。

    image-20240419233714462

2.2 elastic-agent命令使用

Elastic Agent提供用于运行Elastic代理、管理Fleet Server和执行常见任务的命令。此处列出的命令适用于Fleet管理的和独立的Elastic Agent。

需要以root用户(或Windows上的管理员)身份登录才能运行此处描述的命令。安装并运行Elastic Agent服务后,请确保运行这些命令时不使用。以避免调用错误的二进制文件。

2.2.1 elastic-agent diagnostics

从Elastic Agent及其正在运行的组件/单元收集诊断信息。该命令生成的存档文件包含:

  • version.txt : 版本信息

  • pre-config.yaml : 变量替换之前的预配置

  • variables.yaml : 来自提供者的当前变量上下文

  • computed-config.yaml : 变量替换后的配置

  • components-expected.yaml : 预期计算组件模型

  • components-actual.yaml : 运行时管理器报告的实际运行组件模型

  • state.yaml : 所有运行组件的当前状态信息

  • Components Directory : 每个运行组件的分析信息

    • goroutine.txt : gooutine转储

    • heap.txt : 活动对象的内存分配

    • allocs.txt : 对过去的内存分配进行采样

    • threadcreate.txt : 跟踪导致创建新的操作系统线程

    • block.txt : 导致同步原语阻塞的堆栈跟踪

    • mutex.txt : 争用互斥对象持有者的堆栈跟踪

    • Unit Directory : 如果给定的单元提供特定的诊断,它将被放置在这里

2.2.2 elastic-agent enroll

在Fleet中注册elastic agent组件

使用此命令在Fleet中注册elastic agent,而无需将agent作为服务安装。如果您从DEB或RPM包中安装了Elastic Agent,并计划使用systemd命令启动和管理服务,则需要这样做。此命令对于在安装Elastic Agent之前测试它也很有用。

我们建议您以root用户身份运行enroll(或install)命令,因为有些集成需要root权限来收集敏感数据。该命令覆盖elastic-agent.yml文件。

此命令将elastic-agent注册到Fleet中;它不会启动代理。若要启动代理,请启动对应services服务(如果存在),或者使用run命令从终端启动代理。

  • fleet中注册elastic agent

    elastic-agent enroll --url <string>
                         --enrollment-token <string>
                         [--ca-sha256 <string>]
                         [--certificate-authorities <string>]
                         [--elastic-agent-cert <string>]
                         [--elastic-agent-cert-key <string>]
                         [--daemon-timeout <duration>]
                         [--delay-enroll]
                         [--force]
                         [--header <strings>]
                         [--help]
                         [--insecure ]
                         [--proxy-disabled]
                         [--proxy-header <strings>]
                         [--proxy-url <string>]
                         [--staging <string>]
                         [--tag <string>]
                         [global-flags]
    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.2-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.2-linux-x86_64.tar.gz
    cd elastic-agent-8.13.2-linux-x86_64
    sudo ./elastic-agent install --url=https://192.168.71.46:8220 --enrollment-token=cFhGLThJNEJYdGZUTzI0QnBuSFE6bjlJbGluVmtUcWlpa25UMllWWHVuUQ==

  • 要在Fleet中注册elastic agent并设置`Fleet Server

    elastic-agent enroll --fleet-server-es <string>
                         --fleet-server-service-token <string>
                         [--fleet-server-service-token-path <string>]
                         [--ca-sha256 <string>]
                         [--certificate-authorities <string>]
                         [--elastic-agent-cert <string>]
                         [--elastic-agent-cert-key <string>]
                         [--daemon-timeout <duration>]
                         [--delay-enroll]
                         [--fleet-server-cert <string>] 
                         [--fleet-server-cert-key <string>]
                         [--fleet-server-cert-key-passphrase <string>]
                         [--fleet-server-client-auth <string>]
                         [--fleet-server-es-ca <string>]
                         [--fleet-server-es-ca-trusted-fingerprint <string>] 
                         [--fleet-server-es-cert <string>]
                         [--fleet-server-es-cert-key <string>]
                         [--fleet-server-es-insecure]
                         [--fleet-server-host <string>]
                         [--fleet-server-insecure-http]
                         [--fleet-server-policy <string>]
                         [--fleet-server-port <uint16>]
                         [--fleet-server-timeout <duration>]
                         [--force]
                         [--header <strings>]
                         [--help]
                         [--non-interactive]
                         [--proxy-disabled]
                         [--proxy-header <strings>]
                         [--proxy-url <string>]
                         [--staging <string>]
                         [--tag <string>]
                         [--url <string>] 
                         [global-flags]
    curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.13.1-linux-x86_64.tar.gz
    tar xzvf elastic-agent-8.13.1-linux-x86_64.tar.gz
    cd elastic-agent-8.13.1-linux-x86_64
    sudo ./elastic-agent install --url=https://192.168.71.46:8220 \
      --fleet-server-es=<ELASTICSEARCH_HOST> \
      --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3MTM3MTc3ODc4MTg6VjV1MC1VVVRRZ2kteW9qT2Q4Um1PQQ \
      --fleet-server-policy=fleet-server-policy \
      --certificate-authorities=<PATH_TO_CA> \
      --fleet-server-es-ca=<PATH_TO_ES_CERT> \
      --fleet-server-cert=<PATH_TO_FLEET_SERVER_CERT> \
      --fleet-server-cert-key=<PATH_TO_FLEET_SERVER_CERT_KEY> \
      --fleet-server-port=8220

2.2.3 elastic-agent install

在系统上永久安装Elastic Agent,并使用系统的服务管理器进行管理。安装完成后,代理将自动启动。在Linux(tar包)上 , 此命令需要类似systemd的系统和服务管理器

如果您是从DEB或RPM软件包安装Elastic Agent的,那么install命令将跳过安装本身,改为作为register命令的别名。请注意,使用DEB或RPM升级弹性代理后,需要重新启动弹性代理服务。 您必须以root用户(或Windows上的管理员)的身份运行此命令才能将文件写入正确的位置。此命令将覆盖代理目录中的elastic-agent.yml文件。 运行此命令的语法因平台而异。

  • 要将Elastic Agent作为服务安装,将其注册到Fleet中,并启动elastic-agent服务:

    elastic-agent install --url <string>
                          --enrollment-token <string>
                          [--base-path <string>]
                          [--ca-sha256 <string>]
                          [--certificate-authorities <string>]
                          [--daemon-timeout <duration>]
                          [--delay-enroll]
                          [--elastic-agent-cert <string>]
                          [--elastic-agent-cert-key <string>]
                          [--delay-enroll]
                          [--force]
                          [--header <strings>]
                          [--help]
                          [--insecure ]
                          [--non-interactive]
                          [--proxy-disabled]
                          [--proxy-header <strings>]
                          [--proxy-url <string>]
                          [--staging <string>]
                          [--tag <string>]
                          [global-flags]
  • 要将elastic-agent作为服务安装,请将其注册到Fleet中,并在elastic-agent服务旁边启动Fleet server 进程:

    elastic-agent install --fleet-server-es <string>
                          --fleet-server-service-token <string>
                          [--fleet-server-service-token-path <string>]
                          [--base-path <string>]
                          [--ca-sha256 <string>]
                          [--certificate-authorities <string>]
                          [--daemon-timeout <duration>]
                          [--delay-enroll]
                          [--elastic-agent-cert <string>]
                          [--elastic-agent-cert-key <string>]
                          [--delay-enroll]
                          [--fleet-server-cert <string>] 
                          [--fleet-server-cert-key <string>]
                          [--fleet-server-cert-key-passphrase <string>]
                          [--fleet-server-client-auth <string>]
                          [--fleet-server-es-ca <string>]
                          [--fleet-server-es-ca-trusted-fingerprint <string>] 
                          [--fleet-server-es-cert <string>]
                          [--fleet-server-es-cert-key <string>]
                          [--fleet-server-es-insecure]
                          [--fleet-server-host <string>]
                          [--fleet-server-insecure-http]
                          [--fleet-server-policy <string>]
                          [--fleet-server-port <uint16>]
                          [--fleet-server-timeout <duration>]
                          [--force]
                          [--header <strings>]
                          [--help]
                          [--non-interactive]
                          [--proxy-disabled]
                          [--proxy-header <strings>]
                          [--proxy-url <string>]
                          [--staging <string>]
                          [--tag <string>]
                          [--url <string>] 
                          [global-flags]

    [--fleet-server-cert <string>] : 如果没有指定fleet-server-cert*标志,Elastic Agent会自动生成一个带有机器主机名的自签名证书。使用自签名证书注册到Fleet server的远程弹性代理必须指定--insecure标志。

    [--fleet-server-es-ca <string>] ,[--fleet-server-es-ca-trusted-fingerprint <string>] : 在Elasticsearch端使用自签名证书时需要。

    [--url <string>] : 使用自定义证书注册fleet server时必需。该URL必须与用于生成--fleet-server-cert指定的证书的DNS名称匹配。

2.2.4 elastic-agent 状态命令

  • elastic-agent run : 启动elastic-agent服务。

    • -c <string> : 指定默认的配置文件。如果没有特意指定, Elastic Agent 将使用 {path.config}/elastic-agent.yml.

    • --e : 日志传输到stderr并禁用syslog/file输出。

    • --environment <environmentVar> : 指定agent运行时的环境变量

    • --path.config <string> : 指定elastic agent配置文件的目录

    • --path.home <string> : Elastic Agent的根目录path.home确定配置文件和数据目录的位置。 如果未指定,Elastic Agent将使用当前工作目录。

    • --path.logs <string> : elastic agent的日志输出路径。

    elastic-agent run -c myagentconfig.yml
  • elastic-agent status : 返回正在运行的elastic agent守护进程以及elastic agent中每个进程的当前状态。fleet server的最后一个已知状态也会返回。输出选项控制信息的详细程度和格式。

    #指定输出格式, json yaml human
    root@ubuntu2204:~# elastic-agent status  --output yaml
    
    root@ubuntu2204:~# elastic-agent status 
    ┌─ fleet
    │  └─ status: (HEALTHY) Connected
    └─ elastic-agent
       └─ status: (HEALTHY) Running

  • elastic-agent restart : 重新启动当前正在运行的Elastic Agent守护进程。

2.2.5 elastic-agent 其他命令

  • elastic-agent uninstall

    从系统中永久卸载Elastic Agent。 您必须以root用户(或Windows上的管理员)的身份运行此命令才能删除文件

    elastic-agent uninstall
  • elastic-agent inspect

    显示当前弹性代理配置。 如果未指定任何参数,则显示完整的elastic agent配置信息。

    elastic-agent inspect
  • elastic-agent upgrade

    将当前运行的Elastic Agent升级到指定的版本。这只能用于在独立模式下运行的代理。加入Fleet server的agent 应通过Fleet升级。

    elastic-agent upgrade <version> [--source-uri <string>] [--help] [flags]
    • --source-uri <string> : 要从中下载新版本的源URI。默认情况下,Elastic Agent使用Elastic Artifacts URL。

    • --skip-verify : 跳过软件包验证

    • --pgp-path <string> : 使用本地存储的PGP密钥副本验证升级包。

    • --pgp-uri <string> : 使用指定的在线PGP密钥验证升级包

    elastic-agent upgrade 7.10.1
  • elastic-agent logs : 查看正在运行的Elastic Agent的日志。

    elastic-agent logs [--follow] [--number <int>] [--component <string>] [--no-color] [--help] [global-flags]
    • --follow or -f : 跟踪日志更新,直到命令被中断(例如使用'Ctrl-C ')。

    • --number <int> or -n <int> : 要打印多少行日志。如果启用了--follow日,会影响初始输出。

    • --component <string> or -C <string> : 根据组件名称过滤日志。

    • --no-color : 根据每个条目的日志级别禁用颜色。

    elastic-agent logs -n 100 -f -C "system/metrics-default"

  • elastic-agent version : 查看Elastic Agent的版本信息。

    elastic-agent version

3. 常见使用

3.1 定制的日志摄入到 Elasticsearch

  1. 在集成中 , 添加custom logs集成

    image-20240420003943287
    image-20240420004053280
  2. 配置custom logs集成

    image-20240420004520188
    image-20240420005052404
  3. 手动创建json文件

    root@ubuntu2204:~# cat access.log > /var/log/json.log

  4. 查看导入日志

    image-20240420005507531

    显然, 我们可以看到 message 字段显示的就是我们之前在日志中的信息。它是一个 JSON 格式的信息。这个虽然好, 但是它不是结构化的日志信息。

  5. 之后使用ingest pipeline实现将信息格式化为json格式

    POST _ingest/pipeline/_simulate
    {
      "pipeline": {
        "description": "structure a JSON format message",
        "processors": [
          {
            "json": {
              "field": "message",
              "target_field": "json_fields"
            }
          }
        ]
      },
      "docs": [
        {
          "_source": {
            "message": "{\"user_name\": \"arthur\", \"id\": 42, \"verified\": false, \"event\": \"logged_in\"}"
          }
        }
      ]
    }

    在上面, 我们通过 _simulate 来测试我们的 pipeline:

    {
      "docs": [
        {
          "doc": {
            "_index": "_index",
            "_id": "_id",
            "_source": {
              "json_fields": {
                "verified": false,
                "id": 42,
                "event": "logged_in",
                "user_name": "arthur"
              },
              "message": """{"user_name": "arthur", "id": 42, "verified": false, "event": "logged_in"}"""
            },
            "_ingest": {
              "timestamp": "2022-07-01T00:03:30.040008Z"
            }
          }
        }
      ]
    }
    

    如上所示, 我们的 josn processor 能够非常出色地完成 message 的结构化, 并把结构化的信息保存于一个叫做 json_fields 的字段中。在完成上面的模拟后, 我们使用如下的命令来创建一个 pipeline:

    PUT _ingest/pipeline/message_structure
    {
      "description": "structure a JSON format message",
      "processors": [
        {
          "json": {
            "field": "message",
            "target_field": "json_fields"
          }
        }
      ]
    }

    在上面, 我们创建了一个叫做 message_structure 的 ingest pipeline。

    我们接下来展示如何在 custom logs 里来使用这个 ingest pipeline。我们重新打开 log-1 集成:

    这里的custom configurations 中, 是直接按照filebeat的input的log插件配置一样

    image-20240420192230005

    在上面, 选择nginx_json 为 dataset 的名称, 那么最终形成的索引名称将会是logs-nginx_json-*。我们也可以设定自己想要的 dataset, 比如 my-app。如上所示, 我们在 Custom congfiguration 里填写 pipeline 的定义。点击上面的Save integration:

3.2 配置Beats采集定制日志

我们直接在这个 Fleet Server Policy 里添加一个叫做 custom log 的集成:

18430559d01d41319314cb31f4770323
7776de58cb13442a901fd6064ac4f574
22666717d4ec417598b9f5be9c61f3ae
1e7cbbde70c24f0e9cc1c8b760a1a5ac
6c0583bf83784c68bbd2164b81f76059

elastic-Agent将运行一个 Filebeat 实例, 因此这些可选配置的所有文档都是 Filebeat 的文档。 Custom Log 集成在后台使用 Log input, 因此我们感兴趣的文档是:

  • Processors: 顾名思义, 它们可以丰富、修改我们的事件。

  • Custom configurations: 好吧, 它们是我们输入的自定义配置。

在上面, 我们需要了解如下两个链接的文档:

Procsessors 我们将需要两个处理器:

  • timestamp: 它将解析我们的时间戳并在最终事件上正确设置它

  • drop_fields: 这个是可选的, 但如果我们已经在事件中正确设置了@timestamp, 就不需要保留时间字段。

    - timestamp:
        field: time
        layouts:
          - '2006-01-02T15:04:05Z07:00'
        test:
          - '2022-08-31T12:07:32+02:00'
    - drop_fields:
        fields:
          - time

    这里唯一需要注意的是, 时间戳处理器仍处于测试阶段, 但它足够稳定, 可以使用。 无论如何, 在使用它时请记住这一点。

Custom configuration 自定义配置是关于告诉日志输入我们希望它将数据解析为 JSON, 覆盖事件中已经存在的任何键, 如果有错误, 向最终事件添加一个错误键, 这样我们就可以知道发生了什么。

json:
  keys_under_root: true
  add_error_key: true
  message_key: message
  overwrite_keys: true

在上面, 我们使用 Filebeat 的 processors 来对数据进行加工。

Mappings 让我们确保 Elasticsearch 正确理解我们的数据, 因为我们需要为我们的数据设置映射。

前往 Fleet > Agent Policies, 单击 policy 名称, 然后单击 integration 名称。 在下一个屏幕上, 转到 Change defaults > Advanced options, 在最底部有 Mappings 部分。

0efa52c0719c4a42b3982b3fdf4dc3ac
38e0727215914f489783b5b9c0059e8a

然后点击 Next, 直到 Review 这一步, 再点击 Save component template。

前往 Discover, 搜索一些数据, 展开其中一个文档, 你将看到正确映射的字段。

d387ca010a8b4553b72a9860da665b0f
57c488cddeff43fd856ecdeaa424939e

我们甚至可以针对 status_code 进行一个搜索:

3.3 使用 Elastic Agent 来收集定制的 TCP 日志

  1. 添加对应集成

    b1dc37246b3941daa20e61cbe0a7e2b7
    039e07110bfc4fbbacefc972ae0d9865
    4410fecbf1334376b24f9d48a46fc66f
  2. 我们保存当前的配置

    6dd513634b484a1db455342d4d77d98e
    2140d7f793d64ba882f4e09fe4b41162
    b4004314f8f843429e59665c698fc853
  3. 从上面的配置中, 我们可以看出来, 我们的 tcp-1 集成收集 localhost:9900 端口的 TCP 日志并传入到 Elasticsearch 中。

    经过上面的配置后, 我们可以使用如下的命令来检查当前 Ubuntu 机器上的 9900 端口的使用情况:

    sudo netstat -tulpn | grep LISTEN | grep 9900
    liuxg@liuxgu:~$ sudo netstat -tulpn | grep LISTEN | grep 9900
    [sudo] password for liuxg: 
    tcp        0      0 127.0.0.1:9900          0.0.0.0:*               LISTEN      10368/filebeat

    我们可以看到当前的 9900 是正在使用的。

  4. 为了能够测试这个集成 , 我们在 Ubuntu 机器的一个目录中创建如下的一个 logs 文件。它是一个典型的 Syslog 日志:

    liuxg@liuxgu:~/data/customtcplogs$ pwd
    /home/liuxg/data/customtcplogs
    liuxg@liuxgu:~/data/customtcplogs$ ls
    logs
    liuxg@liuxgu:~/data/customtcplogs$ cat logs
    May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port

    我们接下去 Kibana 查看一下:

    6521a65dc765408aaeb6552a50c4e023

    我们可以看到在过去 15分钟里有一个文档。点击详情:

    376c27b5afbf44768d882133709b4c32
  5. 从上面的 message 字段中 , 我们可以看出来我们发送来的一个日志信息。它就是我们之前发送的。

    我们也可以通过如下的命令来发送信息:

    adf506d4e3144fc0b96bf9cbcebba01e
  6. 在上面 , 我们使用 telnet 来发送一个信息到 TCP 端口 9900。同样 , 我们再去 Kibana 进行查看:

    c037009bc6f943e39959a1034845926c

    这次 , 我们可以看到有两条信息发送进来了。

    从上面显示的信息 , 我们看出来 message 字段还是一个非结构化的字段。它不便于我们对这个信息的分析。为此 , 我们希望使用 ingest pipeline 来对这个信息进行结构化。为了下面的步骤的进行 , 我们先使用如下的命令来删除已经写入的文档:

    POST .ds-logs-tcp.generic-*/_delete_by_query
    {
      "query": {
        "match": {
          "data_stream.dataset": "tcp.generic" 
        }
      }
    }
  7. 结构化输入的信息

    首先,我们使用 ingest pipeline API 来测试我们的 pipelines:

    POST _ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "grok": {
              "field": "message",
              "patterns": [
                "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA:syslog_message}"
              ]
            }
          }
        ]
      },
      "docs": [
        {
          "_source": {
            "message": "May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port"
          }
        }
      ]
    }

    我们使用上面的测试命令,可以看到如下的结果:

    {
      "docs": [
        {
          "doc": {
            "_index": "_index",
            "_id": "_id",
            "_version": "-3",
            "_source": {
              "syslog_program": "xpcproxy[69746]",
              "message": "May  4 00:10:36 liuxg xpcproxy[69746]: libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port",
              "syslog_hostname": "liuxg",
              "syslog_message": " libcoreservices: _dirhelper_userdir: 557: bootstrap_look_up returned (ipc/send) invalid destination port",
              "syslog_timestamp": "May  4 00:10:36"
            },
            "_ingest": {
              "timestamp": "2022-09-21T09:23:14.824894Z"
            }
          }
        }
      ]
    }

    很显然,我们可以看到结构化的字段,比如 syslog_program, syslog_hostname 等。当然,我们还可以使用另外一个 processor 来删除 message 这个字段。

    我们接下来创建一个叫做 structure_message 的 pipeline:

    PUT _ingest/pipeline/structure_message
    {
      "description": "This is used to structure messages",
      "processors": [
        {
          "grok": {
            "field": "message",
            "patterns": [
              "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA:syslog_message}"
            ]
          }
        }
      ]
    }
  8. 我们接下来重新来编辑之前的 integration:

    ac11cf4922e341458465c22f17380702
    444d3ace77f34455b5a1c501ea495301
    dea62cd5107847279603c4a67ef287f2
    5a925b869db245a6934d2b59ea20f7e3
    e5f6935ae8de427e946f9f8545df01cb
  9. 这样,我们就更新成功了。

    接下来,我们再次使用上面的命令来写入一个文档:

    head -n 1 logs| nc localhost 9900
    liuxg@liuxgu:~/data/customtcplogs$ pwd
    /home/liuxg/data/customtcplogs
    liuxg@liuxgu:~/data/customtcplogs$ head -n 1 logs | nc localhost 9900
  10. 我们回到 Kibana 的界面:

    bbb244500de744b199b0ef8e11b49628

    我们可以看到有一个文档被写入进来了。我们点击上面文档的详情:

    fec48feed93446839de45f1fa00a1f41


参考链接

Observability: 运用 Fleet 来轻松地导入 Nginx 日志及指标_elastic agents 开源?-CSDN博客

Observability: 使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0-CSDN博客

Observability: 如何使用 Elastic Agents 把定制的日志摄入到 Elasticsearch 中_epr.elastic.co网络隔离-CSDN博客

Elasticsearch: 如何在 Elastic Agents 中配置 Beats 来采集定制日志_elastic_agen-CSDN博客

Observability: 日志监控和非结构化日志数据, 超越 tail -f_日志 结构化 非结构化-CSDN博客

Observability: 使用 Elastic Agent 来收集定制的 TCP 日志-CSDN博客