Filebeat注入环境变量方案

本文针对 filebeat 8.11.0

k8s 容器中获取环境变量

在 Kubernetes 中部署的 Filebeat,其 JavaScript 处理器无法直接访问容器的环境变量

但我们可以通过下面的方式来实现:

方案 1:通过 Filebeat 字段传递环境变量

步骤1:在 Kubernetes 编排文件中为 Filebeat 设置环境变量

env:
  - name: APP_ENV
    value: user-center-server

步骤2:在 Filebeat 配置中通过环境变量获取值

在 Filebeat 配置中使用 add_fields,将环境变量注入日志事件中,然后在 JS 脚本中引用字段。

# filebeat.yaml 配置
filebeat.inputs:
  - type: container
    paths:
      - /var/log/containers/*.log
    processors:
      - add_fields:
          fields:
            app_env: "${APP_ENV}"  # 从环境变量注入
      - script:
          lang: javascript
          id: my_script
          source: >
            function process(event) {
              var env = event.Get("fields.app_env");
              event.Put("target_env", env); // 使用环境变量值
            }

方案二:通过 Kubernetes Metadata 附加环境变量

将目标容器的环境变量添加到 Pod 的 Annotations/Labels 中,Filebeat 通过 add_kubernetes_metadata 获取。

步骤1:在 Deployment 中暴露环境变量到 Annotation

# 应用容器的 Deployment
template:
  metadata:
    annotations:
      app-env: "$(MY_ENV)"  # 通过 Downward API 传递
  spec:
    containers:
      - name: app
        env:
          - name: MY_ENV
            value: "production"

步骤2:配置 Filebeat 获取 Annotations

processors:
  - add_kubernetes_metadata:
      in_cluster: true
      resource: pod
      include_annotations: ["app-env"]  # 包含目标注解
  - script:
      lang: javascript
      source: >
        function process(event) {
          var env = event.Get("kubernetes.annotations.app-env");
          event.Put("env", env);
        }

虚拟机环境获取环境变量

如果是在虚拟机上部署的 filebeat,可以直接采用下面两种方式。

方式一:

processors:
 - script:
    lang: javascript
    id: my_script
      source: >
        function process(event) {
          var env = process.env.APP_ENV; // 获取环境变量值
          event.Put("target_env", env); 
        }

方式二:

processors:
 - script:
    lang: javascript
    id: my_script
      source: >
        function process(event) {
          var env = env.APP_ENV; // 获取环境变量值
          event.Put("target_env", env); 
        }

你可能感兴趣的:(Filebeat注入环境变量方案)