如何配置Telegraf拆分气象数据并发送至MQTT队列?
单次API调用实现数据拆分并发送到MQTT的Telegraf配置方案
完全可行,不需要创建两个独立配置或发起两次API调用。Telegraf的处理器插件(如starlark)和多输出插件支持在单次数据采集后,将原始数据拆分为多组指定格式的指标,再分别发送到MQTT队列。
核心实现步骤
- 单次数据采集:通过
openweathermap或http输入插件完成一次API调用,获取包含humidity、temperature等字段的原始数据。 - 数据拆分:使用
starlark处理器(灵活性最高)将原始数据拆分为两个独立的指标集,分别对应你需要的JSON格式。 - 多目标发送:配置两个
mqtt输出插件,通过指标名称筛选,将拆分后的两组数据分别发送到指定MQTT队列。
完整配置示例
1. 输入插件(二选一)
方案A:使用OpenWeatherMap输入
[[inputs.openweathermap]] apikey = "你的API密钥" city_id = "目标城市ID" interval = "5m" # 采集间隔 units = "metric" # 单位配置,按需调整
方案B:自定义HTTP请求输入
[[inputs.http]] urls = ["https://你的自定义API地址/weather-data"] interval = "5m" data_format = "json" # 确保API返回JSON格式数据
2. Starlark处理器(数据拆分)
该脚本会将原始数据拆分为"湿度指标"和"温度指标"两组,你可以根据需求调整字段保留规则和指标命名:
[[processors.starlark]] source = ''' def apply(metric): # 生成湿度相关指标 humidity_metric = metric.copy() humidity_metric.name = "weather_humidity" # 保留需要的字段,删除其他 required_humidity_fields = ["humidity", "dew_point"] for field in list(humidity_metric.fields.keys()): if field not in required_humidity_fields: del humidity_metric.fields[field] # 生成温度相关指标 temp_metric = metric.copy() temp_metric.name = "weather_temperature" required_temp_fields = ["temperature", "feels_like"] for field in list(temp_metric.fields.keys()): if field not in required_temp_fields: del temp_metric.fields[field] # 返回拆分后的两个指标,替换原始数据 return [humidity_metric, temp_metric] '''
3. MQTT输出插件(分队列发送)
配置两个独立的MQTT输出,通过namepass筛选对应指标发送到指定主题:
# 发送湿度数据到MQTT主题 [[outputs.mqtt]] servers = ["tcp://你的MQTT Broker地址:1883"] topic = "weather/sensor/humidity" data_format = "json" namepass = ["weather_humidity"] # 只匹配湿度指标 # 发送温度数据到MQTT主题 [[outputs.mqtt]] servers = ["tcp://你的MQTT Broker地址:1883"] topic = "weather/sensor/temperature" data_format = "json" namepass = ["weather_temperature"] # 只匹配温度指标
补充说明
- 若只需简单的字段过滤,也可省略
starlark处理器,直接在每个MQTT输出中用fieldpass/fielddrop筛选字段,但starlark更适合自定义复杂JSON结构。 - 确保你的Telegraf版本在1.17及以上(
starlark处理器从该版本开始支持)。 - 可根据实际需求调整指标名称、字段列表、MQTT主题和采集间隔。
内容的提问来源于stack exchange,提问作者lmasikl
相关产品推荐
相关产品推荐

