构建认证器扩展
OpenTelemetry Collector 允许您将接收器和导出器连接到认证器,以便您可以在接收器端对传入连接进行身份验证,并在导出器端向传出请求添加身份验证数据。
认证器通过 扩展 实现。本文档将指导您实现自己的认证器。如果您想了解如何使用现有认证器,请参阅该特定认证器的文档。您可以在此网站的 注册表 中找到现有认证器的列表。
使用本指南了解构建自定义认证器的一般方向,并参阅 API 参考指南 以了解每种类型和函数的语义。
如果您需要帮助,请加入 #opentelemetry-collector-dev 频道,该频道位于 CNCF Slack 工作区。
架构
认证器 在 OpenTelemetry 中与其他扩展一样,但它们还必须实现一个或多个定义身份验证方式的特定接口(例如,身份验证 HTTP 或 gRPC 请求)。将 服务器认证器 与接收器一起使用,以拦截 HTTP 和 gRPC 请求。将客户端认证器与导出器一起使用,以向 HTTP 和 gRPC 请求添加身份验证数据。认证器也可以同时实现这两个接口,允许扩展的一个实例处理传入和传出的请求。
一旦认证器扩展在 Collector 分发版中可用,您就可以在配置文件中像其他扩展一样引用它。但是,只有当认证器被消耗组件引用时,它才会生效。以下配置显示了一个名为 otlp/auth 的接收器,它使用了 oidc 认证器扩展。
extensions:
oidc:
receivers:
otlp/auth:
protocols:
grpc:
endpoint: 0.0.0.0:4317
auth:
authenticator: oidc
processors:
exporters:
service:
extensions:
- oidc
pipelines:
traces:
receivers:
- otlp/auth
processors: []
exporters: []
如果您需要多个认证器实例,请为它们指定不同的名称。
extensions:
oidc/some-provider:
oidc/another-provider:
receivers:
otlp/auth:
protocols:
grpc:
endpoint: 0.0.0.0:4317
auth:
authenticator: oidc/some-provider
processors:
exporters:
service:
extensions:
- oidc/some-provider
- oidc/another-provider
pipelines:
traces:
receivers:
- otlp/auth
processors: []
exporters: []
服务器认证器
一个 服务器认证器 是一个具有 Authenticate 方法的扩展。每当有请求进来时,都会调用此函数,它会检查请求的标头以进行身份验证。如果认证器认为请求有效,它将返回一个 nil 错误。如果请求无效,它将返回一个说明原因的错误。
由于它是一个扩展,认证器应该在 Start 时设置它需要的资源(如密钥、客户端或缓存),并在 Shutdown 时清理所有资源。
Authenticate 函数会为每个传入请求运行,并且在函数完成之前管道无法继续前进。因此,您的认证器必须避免缓慢或不必要的阻塞操作。如果 context 设置了截止时间,请确保您的代码遵守它,以免管道延迟或被挂起。
您还应该为您的认证器添加良好的可观察性,尤其是指标和跟踪。这有助于用户在错误开始增加时设置警报,并使他们更容易排查身份验证问题。
客户端认证器
客户端认证器 是实现了一个或多个已定义接口的附加功能的扩展。每个认证器都会收到一个对象,允许它注入身份验证数据。例如,HTTP 客户端认证器提供一个 http.RoundTripper,而 gRPC 客户端认证器可以生成一个 credentials.PerRPCCredentials。
将您的自定义认证器添加到分发版
自定义认证器必须与 Collector 本身在同一个二进制文件中。构建自己的认证器时,您有两个选择:
- 您可以使用 OpenTelemetry Collector Builder 构建自定义 Collector 分发版。
- 您可以提供一种方法(例如发布 Go 模块)供用户将其扩展添加到他们自己的分发版中。