ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
prometheus_handler.h
Go to the documentation of this file.
1#pragma once
3#if defined(USE_NETWORK) && !defined(USE_ZEPHYR)
4#include <map>
5#include <utility>
6
11#ifdef USE_CLIMATE
12#include "esphome/core/log.h"
13#endif
14
16
17class PrometheusHandler : public AsyncWebHandler, public Component {
18 public:
20
26 void set_include_internal(bool include_internal) { include_internal_ = include_internal; }
27
33 void add_label_id(EntityBase *obj, const std::string &value) { relabel_map_id_.insert({obj, value}); }
34
40 void add_label_name(EntityBase *obj, const std::string &value) { relabel_map_name_.insert({obj, value}); }
41
42 bool canHandle(AsyncWebServerRequest *request) const override {
43 if (request->method() != HTTP_GET)
44 return false;
45#ifdef USE_ESP32
46 char url_buf[AsyncWebServerRequest::URL_BUF_SIZE];
47 return request->url_to(url_buf) == "/metrics";
48#else
49 return request->url() == ESPHOME_F("/metrics");
50#endif
51 }
52
53 void handleRequest(AsyncWebServerRequest *req) override;
54
55 void setup() override {
56 this->base_->init();
57 this->base_->add_handler(this);
58 }
59 float get_setup_priority() const override {
60 // After WiFi
61 return setup_priority::WIFI - 1.0f;
62 }
63
64 protected:
65 std::string relabel_id_(EntityBase *obj);
66 std::string relabel_name_(EntityBase *obj);
67 void add_area_label_(AsyncResponseStream *stream, std::string &area);
68 void add_node_label_(AsyncResponseStream *stream, std::string &node);
69 void add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name);
71#ifdef USE_ESP8266
72 void print_metric_labels_(AsyncResponseStream *stream, const __FlashStringHelper *metric_name, EntityBase *obj,
73 std::string &area, std::string &node, std::string &friendly_name);
74#else
75 void print_metric_labels_(AsyncResponseStream *stream, const char *metric_name, EntityBase *obj, std::string &area,
76 std::string &node, std::string &friendly_name);
77#endif
78
79#ifdef USE_SENSOR
81 void sensor_type_(AsyncResponseStream *stream);
83 void sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area, std::string &node,
84 std::string &friendly_name);
85#endif
86
87#ifdef USE_BINARY_SENSOR
89 void binary_sensor_type_(AsyncResponseStream *stream);
91 void binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj, std::string &area,
92 std::string &node, std::string &friendly_name);
93#endif
94
95#ifdef USE_FAN
97 void fan_type_(AsyncResponseStream *stream);
99 void fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node,
100 std::string &friendly_name);
101#endif
102
103#ifdef USE_LIGHT
105 void light_type_(AsyncResponseStream *stream);
107 void light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area, std::string &node,
108 std::string &friendly_name);
109#endif
110
111#ifdef USE_COVER
113 void cover_type_(AsyncResponseStream *stream);
115 void cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node,
116 std::string &friendly_name);
117#endif
118
119#ifdef USE_SWITCH
121 void switch_type_(AsyncResponseStream *stream);
123 void switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area, std::string &node,
124 std::string &friendly_name);
125#endif
126
127#ifdef USE_LOCK
129 void lock_type_(AsyncResponseStream *stream);
131 void lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node,
132 std::string &friendly_name);
133#endif
134
135#ifdef USE_EVENT
137 void event_type_(AsyncResponseStream *stream);
139 void event_row_(AsyncResponseStream *stream, event::Event *obj, std::string &area, std::string &node,
140 std::string &friendly_name);
141#endif
142
143#ifdef USE_TEXT
145 void text_type_(AsyncResponseStream *stream);
147 void text_row_(AsyncResponseStream *stream, text::Text *obj, std::string &area, std::string &node,
148 std::string &friendly_name);
149#endif
150
151#ifdef USE_TEXT_SENSOR
153 void text_sensor_type_(AsyncResponseStream *stream);
155 void text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area, std::string &node,
156 std::string &friendly_name);
157#endif
158
159#ifdef USE_NUMBER
161 void number_type_(AsyncResponseStream *stream);
163 void number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area, std::string &node,
164 std::string &friendly_name);
165#endif
166
167#ifdef USE_SELECT
169 void select_type_(AsyncResponseStream *stream);
171 void select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area, std::string &node,
172 std::string &friendly_name);
173#endif
174
175#ifdef USE_MEDIA_PLAYER
177 void media_player_type_(AsyncResponseStream *stream);
179 void media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj, std::string &area,
180 std::string &node, std::string &friendly_name);
181#endif
182
183#ifdef USE_UPDATE
185 void update_entity_type_(AsyncResponseStream *stream);
187 void update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area, std::string &node,
188 std::string &friendly_name);
189 void handle_update_state_(AsyncResponseStream *stream, update::UpdateState state);
190#endif
191
192#ifdef USE_VALVE
194 void valve_type_(AsyncResponseStream *stream);
196 void valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
197 std::string &friendly_name);
198#endif
199
200#ifdef USE_CLIMATE
202 void climate_type_(AsyncResponseStream *stream);
204 void climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node,
205 std::string &friendly_name);
206 void climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node,
207 std::string &friendly_name, std::string &category, bool is_failed_value);
208 void climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node,
209 std::string &friendly_name, std::string &setting, const LogString *setting_value);
210 void climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node,
211 std::string &friendly_name, std::string &category, const char *climate_value);
212#endif
213
215 bool include_internal_{false};
216 std::map<EntityBase *, std::string> relabel_map_id_;
217 std::map<EntityBase *, std::string> relabel_map_name_;
218};
219
220} // namespace esphome::prometheus
221
222#endif // USE_NETWORK && !USE_ZEPHYR
Base class for all binary_sensor-type classes.
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:187
Base class for all cover devices.
Definition cover.h:110
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
Definition light_state.h:93
Base class for all locks.
Definition lock.h:112
Base-class for all numbers.
Definition number.h:29
void number_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void add_label_id(EntityBase *obj, const std::string &value)
Add the value for an entity's "id" label.
void add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name)
void add_label_name(EntityBase *obj, const std::string &value)
Add the value for an entity's "name" label.
web_server_base::WebServerBase * base_
void handle_update_state_(AsyncResponseStream *stream, update::UpdateState state)
void climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &setting, const LogString *setting_value)
void event_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the media player state as prometheus data point.
void light_type_(AsyncResponseStream *stream)
Return the type for prometheus.
bool canHandle(AsyncWebServerRequest *request) const override
void print_metric_labels_(AsyncResponseStream *stream, const char *metric_name, EntityBase *obj, std::string &area, std::string &node, std::string &friendly_name)
void text_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void set_include_internal(bool include_internal)
Determine whether internal components should be exported as metrics.
void update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the update state and info as prometheus data point.
std::map< EntityBase *, std::string > relabel_map_id_
void fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the fan state as prometheus data point.
void climate_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void binary_sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the switch values state as prometheus data point.
std::map< EntityBase *, std::string > relabel_map_name_
void sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the sensor state as prometheus data point.
void light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the light values state as prometheus data point.
void climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the climate state as prometheus data point.
void update_entity_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &category, bool is_failed_value)
void binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the binary sensor state as prometheus data point.
void number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the number state as prometheus data point.
void valve_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void switch_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void media_player_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void print_metric_labels_(AsyncResponseStream *stream, const __FlashStringHelper *metric_name, EntityBase *obj, std::string &area, std::string &node, std::string &friendly_name)
Print metric name and common labels (id, area, node, friendly_name, name)
void event_row_(AsyncResponseStream *stream, event::Event *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the event values state as prometheus data point.
void text_sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
std::string relabel_id_(EntityBase *obj)
void text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the text sensor values state as prometheus data point.
void add_area_label_(AsyncResponseStream *stream, std::string &area)
void select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the select state as prometheus data point.
std::string relabel_name_(EntityBase *obj)
void cover_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void select_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void add_node_label_(AsyncResponseStream *stream, std::string &node)
void handleRequest(AsyncWebServerRequest *req) override
void text_row_(AsyncResponseStream *stream, text::Text *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the text values state as prometheus data point.
PrometheusHandler(web_server_base::WebServerBase *base)
void cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the cover values state as prometheus data point.
void lock_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the valve state as prometheus data point.
void climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &category, const char *climate_value)
void fan_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the lock values state as prometheus data point.
Base-class for all selects.
Definition select.h:29
Base-class for all sensors.
Definition sensor.h:47
Base class for all switches.
Definition switch.h:38
Base-class for all text inputs.
Definition text.h:21
Base class for all valve devices.
Definition valve.h:103
void add_handler(AsyncWebHandler *handler)
bool state
Definition fan.h:2
constexpr float WIFI
Definition component.h:48