使用haproxy的http-request set-header设置唯一的http请求ID

时间:2017-10-02 18:54:49

标签: haproxy

所以我有一些现有的代码在我们的前端负载均衡器中设置了一个唯一的请求ID:

unique-id-format %{+X}o\ %Ts_%ci_%cp_%fi_%fp_%rt_%pid
unique-id-header X-Request-Id
log-format %ci\ %r\ %ST\ %B\ %Tr\ %Tt\ %s\ %ID\ %hr

这可以按预期工作 - 按预期创建X-Request-Id,记录并传递给后端。没问题。但是,我想让这个请求ID生成有条件。没问题 - 我应该只能使用http-request set-header而不是unique-id-header:

unique-id-format %{+X}o\ %Ts_%ci_%cp_%fi_%fp_%rt_%pid
http-request set-header X-Request-Id %ID
log-format %ci\ %r\ %ST\ %B\ %Tr\ %Tt\ %s\ %ID\ %hr

(这些都在front_end部分)。疯狂地,但是当使用这种方式时,%ID似乎评估为空。我可以使用硬编码值而不是使用%ID,它可以工作。我也可以使用另一个日志字段(如%Ts),它可以工作。但是,它不适用于%ID。任何线索都会有所帮助 - 提前谢谢。

编辑:版本是1.6.11

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题,因为我想有条件地设置标题,如果不存在,%ID就不会像你期望的那样工作。我找到了建议使用%[unique-id]的解决方案,但事实证明只有1.7+版本。我随后升级到1.7,现在它完美无缺。

unique-id-format  %{+X}o\ %pid%ci%cp%fi%fp%Ts%ms%rt
acl cid_exists req.hdr(X-Correlation-ID) -m found
http-request set-header X-Correlation-ID %[unique-id] unless cid_exists
http-request capture hdr(X-Correlation-ID) len 64
log-format "%ci:%cp [%tr] %ft %b/%s %Th/%Ti/%TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}r %[capture.req.hdr(0)]"

捕获的X-Correlation-ID标头包含预先存在的CID或此负载均衡器在丢失时自行创建的CID。

unique-id HTTP示例为referenced here