
Telegraf HTTP Listener v2 输入插件完全指南从配置到源码级原理【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf导读http_listener_v2是 Telegraf 提供的一个 Service Input 输入插件用于通过 HTTP 协议接收任意被支持的数据格式如 InfluxDB Line Protocol、JSON 等并将其解析为指标是搭建自定义指标采集端点、构建 HTTP 数据写入网关的首选方案。本文将以官方插件文档为主体结合插件源码http_listener_v2.go与测试用例http_listener_v2_test.go系统讲解该插件的完整配置项、请求处理流程、TLS/认证安全机制、数据源采集方式与排障方法帮助你快速上手并深入理解其底层实现。一、插件定位与适用场景http_listener_v2是一个「通用 HTTP 写入监听器」Generic HTTP write listener它启动一个 HTTP 服务等待外部客户端将指标数据通过 HTTP 请求发送进来然后按照配置的data_format解析请求体或查询参数最终将解析出的指标写入 Telegraf 的 Accumulator 管道供后续处理器processors、聚合器aggregators和输出outputs消费。该插件支持任意 Telegraf 支持的数据输入格式完整的格式清单与各格式独立配置选项参见 docs/DATA_FORMATS_INPUT.md。注意官方提示如果你的需求是将 Telegraf 作为 InfluxDB v1 或 v2 的代理 / 中继proxy/relay官方建议改用 influxdb_listener 或 influxdb_v2_listener 插件而非本插件。插件元信息⭐ 引入版本Telegraf v1.9.0️ 插件类型server服务型 支持平台all全平台插件通过 plugins/inputs/all/http_listener_v2.go 注册到默认构建中其构建标签为//go:build !custom || inputs || inputs.http_listener_v2。二、Service Input 特性说明本插件是一个service input服务型输入。与普通插件按照全局或插件级interval定时采集不同服务型插件会启动一个常驻服务持续监听并等待指标或事件的到来。官方文档明确指出服务型插件与普通插件的两个关键差异详见 docs/includes/service_input.md全局或插件专属的interval设置可能不生效http_listener_v2的指标到达节奏完全由外部 HTTP 请求驱动而不是由定时器驱动CLI 选项--test、--test-wait、--once可能不会为它产生输出因为这些模式依赖一次性采集完成而监听类插件需要等待外部数据。对应到源码插件的Gather方法是一个空实现返回nil真正的数据获取全部发生在Start()启动的 HTTP server 及其ServeHTTP处理函数中这正是服务型语义在代码层面的体现。三、完整配置说明逐参数详解以下为官方sample.conf即 plugins/inputs/http_listener_v2/sample.conf由 README 通过sample.conf指令内嵌的完整配置# Generic HTTP write listener [[inputs.http_listener_v2]] ## Address to host HTTP listener on ## can be prefixed by protocol tcp, or unix if not provided defaults to tcp ## if unix network type provided it should be followed by absolute path for unix socket service_address tcp://:8080 ## service_address tcp://:8443 ## service_address unix:///tmp/telegraf.sock ## Permission for unix sockets (only available for unix sockets) ## This setting may not be respected by some platforms. To safely restrict ## permissions it is recommended to place the socket into a previously ## created directory with the desired permissions. ## ex: socket_mode 777 # socket_mode ## Paths to listen to. # paths [/telegraf] ## Save path as http_listener_v2_path tag if set to true # path_tag false ## HTTP methods to accept. # methods [POST, PUT] ## Optional HTTP headers ## These headers are applied to the server that is listening for HTTP ## requests and included in responses. # http_headers {HTTP_HEADER TAG_NAME} ## HTTP Return Success Code ## This is the HTTP code that will be returned on success # http_success_code 204 ## maximum duration before timing out read of the request # read_timeout 10s ## maximum duration before timing out write of the response # write_timeout 10s ## Maximum allowed http request body size in bytes. ## 0 means to use the default of 524,288,000 bytes (500 mebibytes) # max_body_size 500MB ## Part of the request to consume. Available options are body and ## query. # data_source body ## Set one or more allowed client CA certificate file names to ## enable mutually authenticated TLS connections # tls_allowed_cacerts [/etc/telegraf/clientca.pem] ## Add service certificate and key # tls_cert /etc/telegraf/cert.pem # tls_key /etc/telegraf/key.pem ## Minimal TLS version accepted by the server # tls_min_version TLS12 ## Optional username and password to accept for HTTP basic authentication. ## You probably want to make sure you have TLS configured above for this. # basic_username foobar # basic_password barfoo ## Optional setting to map http headers into tags ## If the http header is not present on the request, no corresponding tag will be added ## If multiple instances of the http header are present, only the first value will be used # http_header_tags {HTTP_HEADER TAG_NAME} ## Data format to consume. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format influx3.1 监听地址与传输协议参数类型默认值说明service_addressstring:8080源码默认值HTTP 监听地址可带tcp://或unix://协议前缀不带前缀时默认按tcp处理unix协议须后跟 unix socket 的绝对路径socket_modestring空unix socket 的文件权限仅对 unix socket 生效例如777从源码http_listener_v2.go可以看到Init()中通过正则\w://判断地址是否带协议前缀若无则自动补上tcp://随后用url.Parse解析出 scheme 与 host。Start()中再根据 scheme 分支tcp直接net.Listen(tcp, address)unix先用filepath.FromSlash(u.Path)提取 socket 路径Windows 下会特殊处理盘符前缀若旧 socket 文件存在则先移除再net.Listen(unix, path)随后按socket_mode的八进制字符串如777解析为os.FileMode并os.Chmod应用到 socket 文件。官方文档还提示socket_mode在某些平台上可能不被完全尊重若想严格限制权限建议把 socket 放在一个预先创建好、具有期望权限的目录中。3.2 路由与请求匹配参数类型默认值说明paths[]string[/telegraf]源码默认值允许接收请求的 URL 路径列表请求路径不在列表中则返回 404methods[]string[POST, PUT]源码默认值允许接收的 HTTP 方法不在列表中返回 405path_tagboolfalse为true时把请求路径作为名为http_listener_v2_path的 tag 附加到每条指标源码中ServeHTTP首先用choice.Contains(req.URL.Path, h.Paths)判断路径是否在允许列表内不在则走http.NotFound返回 404serveWrite内则遍历h.Methods判断请求方法是否被允许否则返回 405见methodNotAllowed。测试 TestReceive404ForInvalidEndpoint 验证了访问未注册路径/foobar返回 404 的行为TestWriteHTTPWithMultiplePaths 验证了多个路径同时可用且path_tag会如实记录每个请求的实际路径。3.3 请求体与超时限制参数类型默认值说明read_timeoutduration10s读取请求的最大超时时间write_timeoutduration10s写出响应的最大超时时间max_body_sizesize500MB524,288,000 字节HTTP 请求体的最大字节数超限返回 413设为0表示使用默认值http_success_codeint204解析成功时返回给客户端的 HTTP 状态码源码中read_timeout与write_timeout被注入http.Server{ReadTimeout, WriteTimeout}若配置值小于 1 秒会被强制提升为 10 秒http_listener_v2.go。MaxBodySize默认常量defaultMaxBodySize 500 * 1024 * 1024请求的ContentLength超过该值时通过http.MaxBytesReader与tooLarge返回 HTTP 413 及 JSON 错误体{error:http: request body too large}。测试 TestWriteHTTP 使用 testdata 中的超长指标约 71 KB验证了 413 行为TestWriteHTTPExactMaxBodySize 则验证了恰好等于上限时仍可成功204。http_success_code若未配置或为 0源码会在Init()中回退为http.StatusNoContent204TestWriteHTTPWithReturnCode 验证了配置为 200 时返回 200。3.4 数据来源body 与 query参数类型默认值说明data_sourcestringbody从请求的哪一部分消费数据可选body请求体或queryURL 查询参数当data_source query时源码collectQuery会对req.URL.RawQuery做url.QueryUnescape解码把解码后的查询串整体作为待解析内容否则走collectBody读取请求体。搭配form_urlencoded解析器可以直接把?tagKeytagValuefieldKey42这类查询参数解析成指标——测试 TestWriteHTTPQueryParams 与 TestWriteHTTPFormData 分别验证了 query 与 form 表单两种来源的解析结果。3.5 请求体压缩支持源码级补充虽然 README 未展开说明但从源码可见collectBody会根据请求头Content-Encoding自动解压gzip用gzip.NewReader包装请求体配合http.MaxBytesReader限制解压后大小snappy由于 snappy 块格式不支持 stream reader源码先io.ReadAll整体读取再用snappy.Decode解码其他/未设置直接读取原始字节。对应测试 TestWriteHTTPGzippedData读取 testdata/testmsgs.gz与 TestWriteHTTPSnappyData 验证了两种压缩编码均能正确还原并解析指标。3.6 TLS 服务端配置参数类型说明tls_allowed_cacerts[]string允许的客户端 CA 证书文件列表配置后启用双向 TLSmTLS强制要求并校验客户端证书tls_certstring服务端证书文件路径tls_keystring服务端私钥文件路径tls_min_versionstring服务端接受的最低 TLS 版本如TLS12插件内嵌了通用的服务端 TLS 配置结构common_tls.ServerConfig定义于 plugins/common/tls/server.go。从该结构体可以看到除文档列出的参数外还支持tls_key_pwd私钥密码、tls_cipher_suites密码套件、tls_max_version、tls_allowed_dns_names客户端证书允许的 DNS 名称列表配合 mTLS 做证书域名校验等进阶选项。TLS 的启用逻辑在ServerConfig.TLSConfig()中当tls_cert、tls_key、tls_allowed_cacerts全为空时返回nil表示不启用 TLS只要配置了证书Start()就会改用tls.Listen启动 HTTPS 服务。配置了tls_allowed_cacerts时ClientAuth被设为tls.RequireAndVerifyClientCert即强制双向认证。测试 TestWriteHTTPSNoClientAuth 与 TestWriteHTTPSWithClientAuth使用 testutil/pki 中的测试证书分别覆盖了纯服务端 TLS 与 mTLS 两种场景。3.7 HTTP Basic 认证参数类型说明basic_usernamestringBasic 认证用户名basic_passwordstringBasic 认证密码源码authenticateIfSet中仅当用户名与密码同时非空时才启用认证通过req.BasicAuth()取出请求凭据并使用crypto/subtle的ConstantTimeCompare做常数时间比较以降低时序侧信道风险认证失败返回401 Unauthorized。由于 Basic 认证的凭据以明文Base64随请求传输官方文档明确建议务必配合上文的 TLS 配置一起使用。对应测试见 TestWriteHTTPBasicAuth。3.8 请求头映射与响应头参数类型说明http_headersmap[string]string附加到 HTTP 响应中的响应头键值对http_header_tagsmap[string]string把请求头值映射为指标的 tag格式为{HTTP_HEADER TAG_NAME}两个参数语义不同注意区分http_headers是服务端响应头在ServeHTTP中通过res.Header().Set(key, value)写入每个响应TestServerHeaders 验证了响应头会原样返回http_header_tags是指标 tag 映射在解析出指标后从req.Header.Get(headerName)取值并m.AddTag(measurementName, headerValues)写入每条指标。官方文档特别说明若请求中不存在该头部则不添加对应 tag若存在多个同名头部只取第一个值。测试 TestWriteHTTPTransformHeaderValuesToTagsSingleWrite 与 TestWriteHTTPTransformHeaderValuesToTagsBulkWrite 验证了缺失头部不产生 tag、已有头部正确写入 tag 的行为。3.9 数据格式参数类型默认值说明data_formatstringinflux接收数据的输入格式决定如何解析请求体/查询参数插件实现了telegraf.Parser接口SetParser注入解析器data_format支持 Telegraf 全部输入数据格式各格式有各自的专属配置选项完整说明参见 docs/DATA_FORMATS_INPUT.md。四、全局配置选项与其他插件一样http_listener_v2也支持 Telegraf 的通用插件配置能力例如在指标上修改名称、tag、field创建别名以及配置插件执行顺序等详见 docs/CONFIGURATION.md 中关于插件全局配置的说明该部分由 docs/includes/plugin_config.md 统一提供。五、Metrics指标是如何产生的官方文档对 Metrics 的说明非常精炼指标来自data_source参数指定的请求部分并按data_format的值进行解析。结合源码可以还原完整的指标产生链路请求到达后先经过路径检查404与方法检查405按data_source读取请求体或查询参数期间处理 gzip/snappy 解压与max_body_size限制413调用配置的Parser.Parse(bytes)将字节解析为指标切片解析失败返回 400{error:http: bad request}若解析结果为空插件会以 debug 级别记录No metrics created提示internal.NoMetricsCreatedMsg对每条指标依次应用http_header_tags映射与path_tag若启用然后通过acc.AddMetric(m)写入 Accumulator全部成功后写入http_success_code默认 204。关于指标名称、标签与字段的基本约定可参考 docs/METRICS.md。若需要为生成的指标补充额外信息可以在插件之后串联 processors 对指标做进一步加工。六、实战用 curl 快速验证发送 Line ProtocolInfluxDB 行协议curl -i -XPOST http://localhost:8080/telegraf --data-binary cpu_load_short,hostserver01,regionus-west value0.64 1434055562000000000请求会返回HTTP/1.1 204 No Content同时插件解析出测量名cpu_load_short、taghostserver01、regionus-west、fieldvalue0.64及时间戳1434055562000000000的指标。发送 JSONcurl -i -XPOST http://localhost:8080/telegraf --data-binary {value1: 42, value2: 42}前提是把data_format配置为json默认influx无法解析裸 JSON。JSON 解析器的详细行为如json_query、tag_keys、json_string_fields等选项见 docs/DATA_FORMATS_INPUT.md。发送查询参数curl -i -XGET http://localhost:8080/telegraf?hostserver01value0.42前提是把data_source配置为query并搭配form_urlencoded解析器参考测试 TestWriteHTTPQueryParams。未命中路径时的返回curl -i -XPOST http://localhost:8080/not-exist --data-binary cpu_load_short,hostserver01 value0.64将返回 404因为not-exist不在paths白名单中。七、Troubleshooting 排查指南结合源码与测试用例可归纳出以下常见返回码与排查方向返回码含义触发条件与排查方向204 / 200或配置的http_success_code成功指标已解析并写入 Accumulator400Bad Request数据无法按data_format解析如默认 influx 解析器收到非法行协议检查请求体格式gzip/snappy 解压失败也会返回 400404Not Found请求路径不在paths列表内检查 URL 路径与paths配置405Method Not AllowedHTTP 方法不在methods列表内检查请求方法413Request Entity Too Large请求体超过max_body_size增大上限或分批发送401UnauthorizedBasic 认证失败检查basic_username/basic_password与请求凭据另外两点提示因为本插件是 service inputtelegraf --test、--test-wait、--once等模式可能不会输出该插件的指标验证时建议直接用curl发送真实请求或配合 debug 日志观察若解析得到 0 条指标插件仅以 debug 级别记录No metrics created可通过日志级别查看相关消息常量定义于 internal/internal.go用法见 http_listener_v2.go。八、性能与并发特性源码级佐证从源码结构看插件具备良好的并发处理能力每个 HTTP 请求由 Go 标准库http.Server在独立 goroutine 中并发处理HTTPListenerV2结构体通过sync.WaitGroup管理服务生命周期Stop()会先关闭 listener 再等待所有处理协程退出测试 TestWriteHTTPHighTraffic 用 10 个并发 writer、每个发送 500 次、每次携带 5 条指标合计 25,000 条的压力场景验证了插件的并发吞吐能力最终断言acc.NMetrics() 25000。九、与 influxdb_listener 系列插件的选型官方文档特别提示如需让 Telegraf 充当 InfluxDB v1 / v2 的写入代理或中继请使用 influxdb_listener 或 influxdb_v2_listener。两者的差异在于influxdb_listener/influxdb_v2_listener专门针对 InfluxDB 写入协议Line Protocol做了深度优化支持更多 InfluxDB 专有语义如数据库/存储桶相关行为、保留策略、批量写入语义等http_listener_v2是通用HTTP 写入端点data_format可切换为任意格式适合对接非 InfluxDB 的客户端或自研采集端。十、总结http_listener_v2以极简的配置对外提供通用 HTTP 指标写入能力监听地址TCP/Unix socket、路径与方法白名单、双数据来源body/query、请求体大小与超时限制、gzip/snappy 自动解压、服务端 TLS 与 mTLS、Basic 认证、请求头/路径映射为 tag以及可插拔的data_format解析器构成了一个完整、健壮、可安全暴露的指标采集端点。结合 sample.conf 与 http_listener_v2_test.go 中的用例你可以快速验证每种配置的实际行为并将其稳定地集成进自己的采集架构中。更深入地你可以继续阅读 docs/CONFIGURATION.md 了解插件通用配置阅读 docs/DATA_FORMATS_INPUT.md 掌握所有可用的data_format选项或阅读 docs/PROCESSORS.md 学习如何对接收到的指标做进一步处理。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考