ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OpenTelemetry Collector OTLP Receiver 配置完全指南:gRPC 与 HTTP 协议、TLS、Keepalive 与 CORS 深入解析

OpenTelemetry Collector OTLP Receiver 配置完全指南:gRPC 与 HTTP 协议、TLS、Keepalive 与 CORS 深入解析 OpenTelemetry Collector OTLP Receiver 配置完全指南gRPC 与 HTTP 协议、TLS、Keepalive 与 CORS 深入解析【免费下载链接】opentelemetry-collectorOpenTelemetry Collector项目地址: https://gitcode.com/GitHub_Trending/op/opentelemetry-collector本篇技术指南以 OpenTelemetry Collector 仓库中 receiver/otlpreceiver/config.md 为骨架完整解析 OTLP Receiver组件 ID 为otlp的配置结构与每一项参数的默认值与语义。读完本文你将掌握如何通过 gRPC/HTTP 两种协议接入 OTLP 数据、如何配置 TLS/mTLS 与认证、如何调优 keepalive 与缓冲区以及如何为浏览器端 HTTP/JSON 上报配置 CORS并了解这些配置在 config.go 与 factory.go 中的底层实现。OTLP Receiver 是什么OTLPOpenTelemetry ProtocolReceiver 是 Collector 内置的核心接收器负责通过gRPC或HTTP两种传输协议接收符合 OTLP 规范的数据支持 Protobuf 与 JSON 两种编码。它同时承载四类信号Traces、Metrics、Logs在官方 README 中标为 stable以及 Profiles标为 alpha。从 factory.go 可以看到NewFactory通过xreceiver.NewFactory同时注册了 traces、metrics、logs、profiles 四条创建路径这意味着同一个otlpreceiver 实例可以同时为多条 pipeline 服务。源码中receivers sharedcomponent.NewMap[*Config, *otlpReceiver]()factory.go保证了同一份配置只创建一个底层otlpReceiver对象各信号消费者通过registerTraceConsumer、registerMetricsConsumer等回调挂接其上。快速上手最小可用配置根据官方 README启用 OTLP Receiver 只需在receivers段声明它并列出协议。不列出的协议即被禁用——例如只写grpc:就只开启 gRPC 端口。receivers: otlp: protocols: grpc: http:将该 receiver 加入 pipeline 后即可在默认端口收到数据service: pipelines: traces: receivers: [otlp] processors: [] exporters: [debug] metrics: receivers: [otlp] processors: [] exporters: [debug]receiver/otlpreceiver/testdata/default.yaml展示的就是这个形态grpc:与http:均留空表示全部采用默认值。config_test.go 中的TestUnmarshalDefaultConfig验证了留空协议会完整回落为默认配置。注意顶层配置项只有protocols一个详见下文没有诸如endpoint之类的全局键。端点、TLS 等全部嵌套在protocols.grpc或protocols.http之下。顶层配置结构Config 与 Protocolsconfig.md给出的顶层结构与源码 config.go 一一对应type Config struct { Protocols Protocols mapstructure:protocols } type Protocols struct { GRPC configoptional.Optional[configgrpc.ServerConfig] mapstructure:grpc HTTP configoptional.Optional[HTTPConfig] mapstructure:http }名称类型默认值说明protocolsotlpreceiver-Protocols见下受支持协议当前为 gRPC 与 HTTP的配置名称类型默认值说明grpcconfiggrpc-ServerConfiggRPC 默认配置见下gRPC 服务端配置http[confighttp-HTTPConfig](#confighttp-HTTP 配置)HTTP 默认配置见下HTTP 服务端配置两个协议均使用configoptional.Optional包装这与Protocols.GRPC/Protocols.HTTP的默认值处理密切相关默认配置中两者均被设置为configoptional.Default(...)factory.go因此在未显式配置时两个协议默认都会开启。Config.Validate()config.go有一条硬性校验如果grpc与http都没有被显式指定会直接报错must specify at least one protocol when using the OTLP receiver。这一行为有两个推论均被测试用例覆盖只想开一个协议时显式写出该协议键即可如only_grpc.yaml、only_http.yamlTestUnmarshalConfigOnlyGRPC/TestUnmarshalConfigOnlyHTTP验证了只出现其中一个时不会触发该校验config_test.go。写错协议名时typo_default_proto_config.yaml中把http写成htttp会报错protocols has invalid keys: htttpTestUnmarshalConfigTypoDefaultProtocol对此有专门断言config_test.go。此外配置 schemaconfig.schema.yaml将grpc、http均标记为x-optional: true并分别引用configgrpc.server_config与自定义的http_config后者在confighttp.server_config之上叠加了各信号的 URL path 字段。configgrpc 服务器配置gRPC 协议protocols.grpc下的全部字段来自 config/configgrpc 包的通用 gRPC 服务器配置。config.md整理如下名称类型默认值说明endpointstringlocalhost:4317网络连接地址TCP/UDP 下形如host:port。host 必须是字面 IP 或可解析的主机名IPv6 字面地址需加方括号如[2001:db8::1]:80或[fe80::1%zone]:80zone 为 RFC 4007 中定义的作用域transportstringtcp传输协议支持tcp、tcp4、tcp6、udp、udp4、udp6、ip、ip4、ip6、unix、unixgram、unixpackettlsconfigtls-ServerConfig无不启用TLS 配置默认 nil 表示不启用 TLSmax_recv_msg_size_mibuint64无使用 gRPC 默认值服务端可接受的最大消息体单位 MiBmax_concurrent_streamsuint32无使用 gRPC 默认值每个 ServerTransport 上并发流的数量上限仅对 streaming RPC 生效read_buffer_sizeint524288512 KiBgRPC 服务端读缓冲区大小write_buffer_sizeint无使用 gRPC 默认值gRPC 服务端写缓冲区大小keepalive[configgrpc-KeepaliveServerConfig](#keepalive 配置)无keepalive 相关设置authconfigauth-Authentication无接收器使用的认证扩展默认值在 factory.go 中落地endpoint localhost:4317read_buffer_size 512 * 1024注释说明接收端几乎不写数据因此不调整WriteBufferSize。testdata/config.yaml给出了一份 gRPC 侧完整的调优示例protocols: grpc: tls: cert_file: test.crt key_file: test.key max_recv_msg_size_mib: 32 max_concurrent_streams: 16 read_buffer_size: 1024 write_buffer_size: 1024 keepalive: server_parameters: max_connection_idle: 11s max_connection_age: 12s max_connection_age_grace: 13s time: 30s timeout: 5s enforcement_policy: min_time: 10s permit_without_stream: true注意测试 YAML 中的test.crt/test.key并不存在照搬此配置启动会失败仅用于演示结构。TestUnmarshalConfig对这份配置的解析结果做了完整断言可以对照阅读config_test.go。max_recv_msg_size_mib建议按实际负载设置——超出限制的请求会被 gRPC 层直接拒绝避免超大消息拖垮处理线程max_concurrent_streams则用于控制单连接上流级并发防止突发流压垮下游。confighttp-HTTP 配置protocols.http下除了通用的 HTTP 服务器配置还叠加了 OTLP Receiver 特有的信号 URL path 配置。源码中的HTTPConfigconfig.gotype HTTPConfig struct { ServerConfig confighttp.ServerConfig mapstructure:,squash TracesURLPath SanitizedURLPath mapstructure:traces_url_path,omitempty MetricsURLPath SanitizedURLPath mapstructure:metrics_url_path,omitempty LogsURLPath SanitizedURLPath mapstructure:logs_url_path,omitempty }config.md中来自confighttp的字段名称类型默认值说明endpointstringlocalhost:4318服务器监听地址tlsconfigtls-ServerConfig无不启用TLS 服务器配置corsconfighttp-CORSConfig无HTTP 跨域资源共享CORS配置max_request_body_sizeint2097152020 MiB单个请求允许的最大 body 字节数HTTP 默认端点为localhost:4318与 gRPC 的4317并列构成 OTLP 标准端口对factory.go。默认配置中还对WriteTimeout、ReadHeaderTimeout、IdleTimeout显式置 0以保持向后兼容的“不强制超时”行为。信号 URL path 配置HTTP 协议下每个信号有独立的接收路径默认值定义在 factory.go配置键默认值traces_url_path/v1/tracesmetrics_url_path/v1/metricslogs_url_path/v1/logs配合 HTTP 端点的完整上报地址为[address]/[traces_url_path]、[address]/[metrics_url_path]、[address]/[logs_url_path]。例如默认情况下向http://localhost:4318/v1/traces发送 traces。官方 README 说明profiles_url_path默认对应/v1/profiles从当前源码结构看HTTPConfig仅暴露了 traces/metrics/logs 三个 path 字段profiles 路径仍处于演进之中配置时请以所用版本的实际 schema 为准。URL path 的解析经由自定义类型SanitizedURLPathconfig.go完成它实现encoding.TextUnmarshaler先做一次url.Parse合法性校验解析失败会报invalid HTTP URL path set for signal再把相对路径自动补全前导/。测试TestUnmarshalConfigInvalidSignalPath验证了类似:invalid这样的非法路径会被拒绝config_test.go。testdata/config.yaml展示了自定义路径的写法相对路径会被自动补/protocols: http: traces_url_path: traces # 自动规范化为 /traces metrics_url_path: /v2/metrics # 保留为 /v2/metrics logs_url_path: log/ingest # 自动规范化为 /log/ingest当使用otlphttpexporter作为对端时需通过它的traces_endpoint、metrics_endpoint、logs_endpoint等设置将 URL 与这里的地址和路径对齐。HTTP 编码与内容协商HTTP 端点同时支持 Protobuf 与 JSON 两种编码通过请求的Content-Type头区分encoder.goapplication/x-protobuf→ 使用protoEncoderapplication/json→ 使用jsonEncoder底层为protojson对应 OTLP JSON 规范otlphttp.go 中的readContentType处理了严格的协商逻辑仅接受POST方法否则返回405 Method Not Allowed仅接受上述两种 Content-Type否则返回415 Unsupported Media Type。请求体解析失败返回400导出过程出错返回500。错误响应体按 OTLP 规范包装为rpc.Status消息对于429/503响应若 gRPC 状态中携带RetryInfo还会在响应头写入Retry-After秒数供客户端退避重试otlphttp.go。因此用 curl 手动验证 HTTP 端点时务必带上正确的 Content-Type# 发送 OTLP JSONbody 内容需符合 OTLP JSON 编码规范 curl -X POST http://localhost:4318/v1/traces \ -H Content-Type: application/json \ -d {resourceSpans:[]}configtls 服务器配置TLS / mTLSgRPC 与 HTTP 两个协议共享同一套 TLS 服务器配置configtls.ServerConfig来源为 config/configtls 包。config.md中参数如下名称类型默认值说明ca_filestring无CA 证书路径。服务端场景下用于验证客户端证书留空则使用系统根 CA可选cert_filestring无服务端 TLS 证书路径用于 TLS 必需连接可选key_filestring无服务端 TLS 私钥路径可选client_ca_filestring无服务端用于校验客户端证书的 CA 路径。设置后会同时设置ClientCAs并将ClientAuth置为RequireAndVerifyClientCert即启用双向 TLSmTLS典型用法receivers: otlp: protocols: grpc: tls: cert_file: /etc/otel/server.crt key_file: /etc/otel/server.key http: tls: cert_file: /etc/otel/server.crt key_file: /etc/otel/server.key启用 TLS 后客户端如otlpexporter/otlphttpexporter必须使用https:///tls连接并信任对应 CA。若需要双向认证在服务端补充client_ca_file并在客户端配置自己的cert_file/key_file。仓库内完整示例可参考 config/configtls/testdata 下的证书文件以及各 exporter 的 otlpexporter 配置。Keepalive 配置gRPC 协议下 keepalive 分为服务端参数与强制策略两部分server_parametersKeepaliveServerParameters对应 gRPC 的keepalive.ServerParameters字段均以 Go duration 字符串表示名称类型说明max_connection_idleduration连接空闲多久后关闭max_connection_ageduration连接最长存活时间max_connection_age_graceduration达到最长存活时间后的宽限期timeduration服务端向客户端发送 keepalive ping 的周期timeoutduration等待 ping 响应ACK的超时时间未配置时使用 gRPCkeepalive.ServerParameters自身的默认值。enforcement_policyKeepaliveEnforcementPolicy对应 gRPC 的keepalive.EnforcementPolicy用于约束客户端行为名称类型说明min_timeduration客户端两次 keepalive ping 之间的最小间隔小于此值的 ping 会被拒绝permit_without_streambool是否允许在没有活跃 stream 时发送 keepalive ping配置示例来自testdata/config.yamlkeepalive: server_parameters: max_connection_idle: 11s max_connection_age: 12s max_connection_age_grace: 13s time: 30s timeout: 5s enforcement_policy: min_time: 10s permit_without_stream: true调优建议time/timeout用于探测半开连接例如经过 NAT 的空闲连接max_connection_idle用于回收空闲连接生产环境若限制并发连接数可调大min_time以减少 keepalive 开销。认证配置auth字段在 gRPC 与 HTTP 协议下均可配置语义一致——指定一个已启用的认证扩展来校验入站数据名称类型默认值说明authenticatorstring无用于认证入站数据的扩展名称receivers: otlp: protocols: grpc: auth: authenticator: oidc # 需在 service.extensions 中启用认证扩展的具体实现位于 extension/extensionauth 及 extension/extensioncapabilities 等模块。使用时必须将该扩展同时声明在service.extensions中否则 Collector 启动会报错。认证通过后扩展返回的 client 身份信息会作为属性注入 pipeline供后续处理器/导出器消费。CORS 跨域配置仅 HTTP 协议支持 CORS用于允许浏览器端的 HTTP/JSON 上报例如从 Web 应用直发 OTLP。配置位于protocols.http.cors名称类型默认值说明allowed_origins[]string无允许的Origin头取值。支持通配符*匹配 0 个或多个字符例如https://*.example.com单独的*表示允许任意来源allowed_headers[]string无CORS 请求中允许的自定义头。Accept、Accept-Language、Content-Type、Content-Language隐式放行未配置时默认额外放行X-Requested-With包含*表示放行任意请求头max_ageint无Access-Control-Max-Age响应头的值秒即浏览器对预检preflight响应的缓存时长完整示例来自 README 与testdata/config.yamlreceivers: otlp: protocols: http: endpoint: localhost:4318 cors: allowed_origins: - http://test.com - https://*.example.com # 单独的 * 匹配任意来源 allowed_headers: - Example-Header max_age: 7200testdata/config.yaml还特别注释了通配符的匹配语义https://*.test.com允许https://www.test.com与https://foo.test.com但不匹配https://wwwtest.com通配符只替换 0 个或多个字符不跨域名层级。若前端上报还需携带自定义认证头记得在allowed_headers中显式列出。Duration 类型格式配置中出现time.Duration类型的字段均使用 Go duration 字符串语法一段可选带符号的十进制数序列每段带单位后缀例如300ms、-1.5h、2h45m。合法单位ns、us、ms、s、m、h。单位大小写敏感如s不能写成S相邻段之间不留空格。源码级行为补充共享实例与信号注册最后补充两个阅读源码时容易忽略的实现细节帮助理解“为什么这份配置这样工作”一份配置对应一个底层服务实例无论 pipeline 中引用了多少次otlp只要配置对象相同factory.go 中的receivers.LoadOrStore就只会创建并启动一次 gRPC/HTTP 服务器各 pipeline 的消费者通过register*Consumer注册到该实例。关闭 receiver 时会从 map 中移除以便同名配置可重建。观察性指标按传输类型分别上报newOtlpReceiver为 gRPC 与 HTTP 分别创建receiverhelper.ObsReportotlp.go因此接入数据量、错误数等遥测可按grpc/http两种 transport 维度区分统计排查问题时可以直接在 Collector 的自有指标里按 transport 过滤。常见配置错误速查症状原因解决启动报must specify at least one protocol两个协议都未显式配置如protocols:后为空 map显式写出grpc:或http:参考 default.yaml启动报protocols has invalid keys: htttp协议名拼写错误仅支持grpc、http两个键参考 typo_default_proto_config.yaml配置解析报invalid HTTP URL path set for signal*_url_path不是合法 URL 路径使用合法路径相对路径会自动补/参考 invalid_traces_path.yamlHTTP 上报返回 415Content-Type不是application/x-protobuf或application/json显式设置正确的 Content-Typeotlphttp.goHTTP 上报返回 405使用了非 POST 方法OTLP HTTP 端点仅接受 POST启用 TLS 后客户端连接失败证书/私钥缺失或客户端未信任服务端 CA检查cert_file/key_file路径与客户端 CA 配置小结OTLP Receiver 的配置虽然只有protocols一个顶层键但其内部完整复用了 Collector 的configgrpc、confighttp、configtls、configauth四大通用配置体系覆盖了传输层、安全层、连接生命周期与跨域策略。理解 config.md 中的参数表配合 config.go、factory.go 与 config_test.go 的源码与测试用例你就能针对自己的部署环境本地开发、K8s 集群、互联网暴露精确调优端点、TLS、keepalive 与 CORS同时避开协议未配置、路径非法等常见陷阱。【免费下载链接】opentelemetry-collectorOpenTelemetry Collector项目地址: https://gitcode.com/GitHub_Trending/op/opentelemetry-collector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表