菜单
开源

洛基.源.云flare

loki.source.cloudflare 从Cloudflare Logpull API获取日志并将其转发到其他 loki.* 组件。

这些日志包含连接客户端的相关数据、通过Cloudflare网络请求的路径以及原始Web服务器的响应,可用于丰富原始服务器上的现有日志。

您可以通过为它们不同的标签来指定多个 loki.source.cloudflare 组件。

用法

loki.source.cloudflare "LABEL" {
  zone_id   = "ZONE_ID"
  api_token = "API_TOKEN"

  forward_to = RECEIVER_LIST
}

参数

loki.source.cloudflare 支持以下参数

名称类型说明默认值必需
forward_to列表(LogsReceiver)要发送日志条目的接收器列表。
api_token字符串用于认证的API令牌。
zone_id字符串要使用的Cloudflare区域ID。
labels映射(string)与传入日志条目关联的标签。{}
workers整数用于解析日志的工作进程数。3
pull_range持续时间每次拉取请求要获取的时间范围。"1m"
fields_type字符串要获取日志条目的字段集。"default"
additional_fields列表(string)通过 fields_type 提供的字段的补充列表。

默认情况下,loki.source.cloudflare 使用 default 集合的字段获取日志。以下是可供选择的不同 fields_type 集合,以及它们包含的字段:

  • "default" 包含
"ClientIP", "ClientRequestHost", "ClientRequestMethod", "ClientRequestURI", "EdgeEndTimestamp", "EdgeResponseBytes", "EdgeRequestHost", "EdgeResponseStatus", "EdgeStartTimestamp", "RayID"

以及通过 additional_fields 参数提供的任何额外字段。

  • "minimal" 包含所有 default 字段和
"ZoneID", "ClientSSLProtocol", "ClientRequestProtocol", "ClientRequestPath", "ClientRequestUserAgent", "ClientRequestReferer", "EdgeColoCode", "ClientCountry", "CacheCacheStatus", "CacheResponseStatus", "EdgeResponseContentType"

以及通过 additional_fields 参数提供的任何额外字段。

  • "extended" 包含所有 minimal 字段和
"ClientSSLCipher", "ClientASN", "ClientIPClass", "CacheResponseBytes", "EdgePathingOp", "EdgePathingSrc", "EdgePathingStatus", "ParentRayID", "WorkerCPUTime", "WorkerStatus", "WorkerSubrequest", "WorkerSubrequestCount", "OriginIP", "OriginResponseStatus", "OriginSSLProtocol", "OriginResponseHTTPExpires", "OriginResponseHTTPLastModified"

以及通过 additional_fields 参数提供的任何额外字段。

  • "all" 包含所有 extended 字段和
 "BotScore", "BotScoreSrc", "BotTags", "ClientRequestBytes", "ClientSrcPort", "ClientXRequestedWith", "CacheTieredFill", "EdgeResponseCompressionRatio", "EdgeServerIP", "FirewallMatchesSources", "FirewallMatchesActions", "FirewallMatchesRuleIDs", "OriginResponseBytes", "OriginResponseTime", "ClientDeviceType", "WAFFlags", "WAFMatchedVar", "EdgeColoID", "RequestHeaders", "ResponseHeaders", "ClientRequestSource"`

以及通过 additional_fields 参数提供的任何额外字段。即使在Cloudflare API中提供了新的字段,但在 all 中尚未包含,这也仍然适用。

  • "custom" 仅包含 additional_fields 中定义的字段。

组件将其上次成功获取的时间戳保存在其位置文件中。如果文件中存在给定区域ID的位置,组件会从该时间戳重新启动拉取日志。如果没有找到位置,组件会从当前时间开始拉取日志。

日志通过多个workers获取,它们不断请求最后的可用pull_range。由于每次拉取要处理的日志行数过多,可能会落后。增加工作者、减小拉取范围或减少获取的字段数量可以缓解此性能问题。

组件获取的最后时间戳记录在调试指标loki_source_cloudflare_target_last_requested_end_timestamp中。

所有来自Cloudflare的日志条目都在JSON格式中。您可以使用loki.process组件和一个JSON处理阶段来提取更多标签或更改日志行格式。一个示例日志如下

json
{
    "CacheCacheStatus": "miss",
    "CacheResponseBytes": 8377,
    "CacheResponseStatus": 200,
    "CacheTieredFill": false,
    "ClientASN": 786,
    "ClientCountry": "gb",
    "ClientDeviceType": "desktop",
    "ClientIP": "100.100.5.5",
    "ClientIPClass": "noRecord",
    "ClientRequestBytes": 2691,
    "ClientRequestHost": "www.foo.com",
    "ClientRequestMethod": "GET",
    "ClientRequestPath": "/comments/foo/",
    "ClientRequestProtocol": "HTTP/1.0",
    "ClientRequestReferer": "https://www.foo.com/foo/168855/?offset=8625",
    "ClientRequestURI": "/foo/15248108/",
    "ClientRequestUserAgent": "some bot",
    "ClientRequestSource": "1"
    "ClientSSLCipher": "ECDHE-ECDSA-AES128-GCM-SHA256",
    "ClientSSLProtocol": "TLSv1.2",
    "ClientSrcPort": 39816,
    "ClientXRequestedWith": "",
    "EdgeColoCode": "MAN",
    "EdgeColoID": 341,
    "EdgeEndTimestamp": 1637336610671000000,
    "EdgePathingOp": "wl",
    "EdgePathingSrc": "macro",
    "EdgePathingStatus": "nr",
    "EdgeRateLimitAction": "",
    "EdgeRateLimitID": 0,
    "EdgeRequestHost": "www.foo.com",
    "EdgeResponseBytes": 14878,
    "EdgeResponseCompressionRatio": 1,
    "EdgeResponseContentType": "text/html",
    "EdgeResponseStatus": 200,
    "EdgeServerIP": "8.8.8.8",
    "EdgeStartTimestamp": 1637336610517000000,
    "FirewallMatchesActions": [],
    "FirewallMatchesRuleIDs": [],
    "FirewallMatchesSources": [],
    "OriginIP": "8.8.8.8",
    "OriginResponseBytes": 0,
    "OriginResponseHTTPExpires": "",
    "OriginResponseHTTPLastModified": "",
    "OriginResponseStatus": 200,
    "OriginResponseTime": 123000000,
    "OriginSSLProtocol": "TLSv1.2",
    "ParentRayID": "00",
    "RayID": "6b0a...",
    "RequestHeaders": [],
    "ResponseHeaders": [
      "x-foo": "bar"
    ],
    "SecurityLevel": "med",
    "WAFAction": "unknown",
    "WAFFlags": "0",
    "WAFMatchedVar": "",
    "WAFProfile": "unknown",
    "WAFRuleID": "",
    "WAFRuleMessage": "",
    "WorkerCPUTime": 0,
    "WorkerStatus": "unknown",
    "WorkerSubrequest": false,
    "WorkerSubrequestCount": 0,
    "ZoneID": 1234
}

导出字段

loki.source.cloudflare不导出任何字段。

组件健康状况

loki.source.cloudflare仅在下发无效配置时报告为不健康。

调试信息

loki.source.cloudflare公开以下调试信息:

  • 目标是否已准备好以及是否从API读取日志。
  • Cloudflare区域ID。
  • 如果有,报告的最后错误。
  • 作为zone_id、标签和最后拉取时间戳组合的存储位置文件条目。
  • 最后拉取的时间戳。
  • 正在获取的字段集。

调试指标

  • loki_source_cloudflare_target_entries_total(计数器):通过云flare目标成功发送的条目总数。
  • loki_source_cloudflare_target_last_requested_end_timestamp(量表计):用于计算目标落后程度的最后Cloudflare请求结束时间戳。

示例

此示例从Cloudflare API检索日志并将它们传递到loki.write组件。

loki.source.cloudflare "dev" {
  zone_id   = env("CF_ZONE_ID")
  api_token = local.file.api.content

  forward_to = [loki.write.local.receiver]
}

loki.write "local" {
  endpoint {
    url = "loki:3100/api/v1/push"
  }
}

兼容组件

loki.source.cloudflare可以接受以下组件的参数

注意

连接某些组件可能不合理,或者组件可能需要进一步配置才能正确连接。请参阅相关文档以获取更多详细信息。