菜单
文档breadcrumb arrow Grafana Alloybreadcrumb arrow 收集和转发数据breadcrumb arrow 收集 Prometheus 指标
开源

收集 Prometheus 指标

您可以配置 Alloy 来收集 Prometheus 指标,并将其转发到任何 Prometheus 兼容的数据库。

本主题介绍如何:

  • 配置指标投递。
  • 从 Kubernetes Pods 收集指标。

本主题中使用的组件

开始之前

  • 确保您对使用 Prometheus 埋点应用有基本的了解。
  • 准备一组 Prometheus exporter 或暴露 Prometheus 指标的应用,您想要从它们收集指标。
  • 确定写入收集到的指标的位置。指标可以写入 Prometheus 或 Prometheus 兼容的端点,如 Grafana Mimir、Grafana Cloud 或 Grafana Enterprise Metrics。
  • 熟悉 Alloy 中的组件概念。

配置指标投递

在组件收集 Prometheus 指标之前,您必须有一个负责将这些指标写入某个位置的组件。

prometheus.remote_write 组件负责将 Prometheus 指标投递到一个或多个 Prometheus 兼容的端点。定义 prometheus.remote_write 组件后,您可以使用其他 Alloy 组件将指标转发给它。

要配置用于指标投递的 prometheus.remote_write 组件,请完成以下步骤:

  1. 将以下 prometheus.remote_write 组件添加到您的配置文件中。

    alloy
    prometheus.remote_write "<LABEL>" {
      endpoint {
        url = "<PROMETHEUS_URL>"
      }
    }

    替换以下内容:

    • <LABEL>:组件的标签,例如 default。您使用的标签在同一配置文件中的所有 prometheus.remote_write 组件中必须是唯一的。
    • <PROMETHEUS_URL> 指标发送到的 Prometheus 兼容端点的完整 URL,例如 Prometheus 的 https://prometheus-us-central1.grafana.net/api/v1/write 或 Mimir 的 https://mimir-us-central1.grafana.net/api/v1/push/。端点 URL 取决于您使用的数据库。
  2. 如果您的端点需要基本身份验证,请将以下内容粘贴到 endpoint 块中。

    alloy
    basic_auth {
      username = "<USERNAME>"
      password = "<PASSWORD>"
    }

    替换以下内容:

    • <USERNAME>:基本身份验证的用户名。
    • <PASSWORD>:基本身份验证的密码或 API 密钥。
  3. 如果您有多个要写入指标的端点,请为其他端点重复 endpoint 块。

以下示例演示了如何配置包含多个端点、混合使用基本身份验证以及将指标转发到其中的 prometheus.remote_write 组件和 prometheus.scrape 组件。

alloy
prometheus.remote_write "default" {
  endpoint {
    url = "https://:9009/api/prom/push"
  }

  endpoint {
    url = "https://prometheus-us-central1.grafana.net/api/prom/push"

    // Get basic authentication based on environment variables.
    basic_auth {
      username = sys.env("<REMOTE_WRITE_USERNAME>")
      password = sys.env("<REMOTE_WRITE_PASSWORD>")
    }
  }
}

prometheus.scrape "example" {
  // Collect metrics from the default listen address.
  targets = [{
    __address__ = "127.0.0.1:12345",
  }]

  forward_to = [prometheus.remote_write.default.receiver]
}

有关配置指标投递的更多信息,请参阅prometheus.remote_write

从 Kubernetes Pods 收集指标

Alloy 可以通过以下方式配置从 Kubernetes Pods 收集指标:

  1. 发现要收集指标的 Kubernetes Pods。
  2. 从发现的 Pods 收集指标。

要从 Kubernetes Pods 收集指标,请完成以下步骤:

  1. 遵循配置指标投递,确保收集到的指标可以写入某个位置。

  2. 发现 Kubernetes Pods

    1. 将以下 discovery.kubernetes 组件添加到您的配置文件中,以发现集群中所有命名空间中的每个 Pod。

      alloy
      discovery.kubernetes "<DISCOVERY_LABEL>" {
        role = "pod"
      }

      替换以下内容:

      • <DISCOVERY_LABEL>:组件的标签,例如 pods。您使用的标签在同一配置文件中的所有 discovery.kubernetes 组件中必须是唯一的。

      这将为每个发现的 Pod 上的每个暴露的端口生成一个 Prometheus 目标。

    2. 要限制发现 Pod 的命名空间,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      namespaces {
        own_namespace = true
        names         = [<NAMESPACE_NAMES>]
      }

      替换以下内容:

      • <NAMESPACE_NAMES>:一个逗号分隔的字符串列表,表示要搜索的命名空间。每个字符串必须用双引号括起来。例如,"default","kube-system"

      如果您不想在 Alloy 运行的命名空间中搜索 Pods,请将 own_namespace 设置为 false

    3. 要使用字段选择器来限制发现的 Pods 数量,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      selectors {
        role  = "pod"
        field = "<FIELD_SELECTOR>"
      }

      替换以下内容:

      • <FIELD_SELECTOR>:要使用的 Kubernetes 字段选择器,例如 metadata.name=my-service。有关字段选择器的更多信息,请参阅 Kubernetes 文档中的字段选择器

      为您想要应用的每个字段选择器创建额外的 selectors 块。

    4. 要使用标签选择器来限制发现的 Pods 数量,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      selectors {
        role  = "pod"
        label = "LABEL_SELECTOR"
      }

      替换以下内容:

      • <LABEL_SELECTOR>:Kubernetes 标签选择器,例如 environment in (production, qa)。有关标签选择器的更多信息,请参阅 Kubernetes 文档中的标签和选择器

      为您想要应用的每个标签选择器创建额外的 selectors 块。

  3. 从发现的 Pods 收集指标

    1. 将以下 prometheus.scrape 组件添加到您的配置文件中。

      alloy
      prometheus.scrape "<SCRAPE_LABEL>" {
        targets    = discovery.kubernetes.<DISCOVERY_LABEL>.targets
        forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver]
      }

      替换以下内容:

      • <SCRAPE_LABEL>:组件的标签,例如 pods。您使用的标签在同一配置文件中的所有 prometheus.scrape 组件中必须是唯一的。
      • <DISCOVERY_LABEL>discovery.kubernetes 组件的标签。
      • <REMOTE_WRITE_LABEL>:您的 prometheus.remote_write 组件的标签。

以下示例演示了如何配置 Alloy 从 default 命名空间中运行的生产 Kubernetes Pods 收集指标。

alloy
discovery.kubernetes "pods" {
  role = "pod"

  namespaces {
    own_namespace = false

    names = ["default"]
  }

  selectors {
    role  = "pod"
    label = "environment in (production)"
  }
}

prometheus.scrape "pods" {
  targets    = discovery.kubernetes.pods.targets
  forward_to = [prometheus.remote_write.default.receiver]
}

prometheus.remote_write "default" {
  endpoint {
    url = "https://:9009/api/prom/push"
  }
}

有关配置 Kubernetes 服务投递和收集指标的更多信息,请参阅 discovery.kubernetesprometheus.scrape

从 Kubernetes Services 收集指标

您可以配置 Alloy 来收集 Kubernetes Services 的指标,通过:

  1. 发现要收集指标的 Kubernetes Services。
  2. 从发现的 Services 收集指标。

要从 Kubernetes Services 收集指标,请完成以下步骤。

  1. 遵循配置指标投递,确保收集到的指标可以写入某个位置。

  2. 发现 Kubernetes Services

    1. 将以下 discovery.kubernetes 组件添加到您的配置文件中,以发现集群中所有命名空间中的每个 Service。

      alloy
      discovery.kubernetes "<DISCOVERY_LABEL>" {
        role = "service"
      }

      替换以下内容:

      • <DISCOVERY_LABEL>:组件的标签,例如 services。您使用的标签在同一配置文件中的所有 discovery.kubernetes 组件中必须是唯一的。

      这将为每个发现的 Service 上的每个暴露的端口生成一个 Prometheus 目标。

    2. 要限制发现 Service 的命名空间,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      namespaces {
        own_namespace = true
        names         = [<NAMESPACE_NAMES>]
      }

      替换以下内容:

      • <NAMESPACE_NAMES>:一个逗号分隔的字符串列表,表示要搜索的命名空间。每个字符串必须用双引号括起来。例如,"default","kube-system"

      如果您不想在 Alloy 运行的命名空间中搜索 Services,请将 own_namespace 设置为 false

    3. 要使用字段选择器来限制发现的 Services 数量,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      selectors {
        role  = "service"
        field = "<FIELD_SELECTOR>"
      }

      替换以下内容:

      • <FIELD_SELECTOR>:Kubernetes 字段选择器,例如 metadata.name=my-service。有关字段选择器的更多信息,请参阅 Kubernetes 文档中的字段选择器

      为您想要应用的每个字段选择器创建额外的 selectors 块。

    4. 要使用标签选择器来限制发现的 Services 数量,请在 discovery.kubernetes 组件内添加以下块。

      alloy
      selectors {
        role  = "service"
        label = "<LABEL_SELECTOR>"
      }

      替换以下内容:

      • <LABEL_SELECTOR>:Kubernetes 标签选择器,例如 environment in (production, qa)。有关标签选择器的更多信息,请参阅 Kubernetes 文档中的标签和选择器

      为您想要应用的每个标签选择器创建额外的 selectors 块。

  3. 从发现的 Services 收集指标

    1. 将以下 prometheus.scrape 组件添加到您的配置文件中。

      alloy
      prometheus.scrape "<SCRAPE_LABEL>" {
        targets    = discovery.kubernetes.<DISCOVERY_LABEL>.targets
        forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver]
      }

      替换以下内容:

      • <SCRAPE_LABEL>:组件的标签,例如 services。您使用的标签在同一配置文件中的所有 prometeus.scrape 组件中必须是唯一的。
      • <DISCOVERY_LABEL>discovery.kubernetes 组件的标签。
      • <REMOTE_WRITE_LABEL>:您的 prometheus.remote_write 组件的标签。

以下示例演示了如何配置 Alloy 从 default 命名空间中运行的生产 Kubernetes Services 收集指标。

alloy
discovery.kubernetes "services" {
  role = "service"

  namespaces {
    own_namespace = false

    names = ["default"]
  }

  selectors {
    role  = "service"
    label = "environment in (production)"
  }
}

prometheus.scrape "services" {
  targets    = discovery.kubernetes.services.targets
  forward_to = [prometheus.remote_write.default.receiver]
}

prometheus.remote_write "default" {
  endpoint {
    url = "https://:9009/api/prom/push"
  }
}

有关配置 Kubernetes 服务投递和收集指标的更多信息,请参阅 discovery.kubernetesprometheus.scrape

从自定义目标收集指标

您可以配置 Alloy 从一组自定义目标收集指标,而无需进行服务发现。

要从一组自定义目标收集指标,请完成以下步骤。

  1. 遵循配置指标投递,确保收集到的指标可以写入某个位置。

  2. 将以下 prometheus.scrape 组件添加到您的配置文件中。

    alloy
    prometheus.scrape "<SCRAPE_LABEL>" {
      targets    = [<TARGET_LIST>]
      forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver]
    }

    替换以下内容:

    • _<SCRAPE_LABEL>:组件的标签,例如 custom_targets。您使用的标签在同一配置文件中的所有 prometheus.scrape 组件中必须是唯一的。

    • <TARGET_LIST>:一个逗号分隔的对象列表,表示 Prometheus 目标。每个对象必须符合以下规则:

      • 必须有一个 __address__ 键,表示要收集指标的目标的 HOST:PORT
      • 要明确指定要使用的协议,请将 __scheme__ 键设置为 "http""https"。如果未提供 __scheme__ 键,则使用的协议继承自 prometheus.scrape 组件的设置。默认值为 "http"
      • 要明确指定要收集指标的 HTTP 路径,请将 __metrics_path__ 键设置为要使用的 HTTP 路径。如果未提供 __metrics_path__ 键,则使用的路径继承自 prometheus.scrape 组件的设置。默认值为 "/metrics"
      • 根据需要添加其他键,以便为收集到的指标注入额外的标签。任何以双下划线(__)开头的标签在抓取之前都会被删除。
    • <REMOTE_WRITE_LABEL>:您的 prometheus.remote_write 组件的标签。

以下示例演示了如何配置 prometheus.scrape 从一组自定义端点收集指标。

alloy
prometheus.scrape "custom_targets" {
  targets = [
    {
      __address__ = "prometheus:9090",
    },
    {
      __address__ = "mimir:8080",
      __scheme__  = "https",
    },
    {
      __address__      = "custom-application:80",
      __metrics_path__ = "/custom-metrics–path",
    },
    {
      __address__ = "alloy:12345",
      application = "alloy",
      environment = "production",
    },
  ]

  forward_to = [prometheus.remote_write.default.receiver]
}

prometheus.remote_write "default" {
  endpoint {
    url = "https://:9009/api/prom/push"
  }
}