mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Add more prometheus metrics (#7683)
This commit is contained in:
		| @@ -50,6 +50,12 @@ void PrometheusHandler::handleRequest(AsyncWebServerRequest *req) { | ||||
|     this->lock_row_(stream, obj); | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_TEXT_SENSOR | ||||
|   this->text_sensor_type_(stream); | ||||
|   for (auto *obj : App.get_text_sensors()) | ||||
|     this->text_sensor_row_(stream, obj); | ||||
| #endif | ||||
|  | ||||
|   req->send(stream); | ||||
| } | ||||
|  | ||||
| @@ -349,6 +355,43 @@ void PrometheusHandler::lock_row_(AsyncResponseStream *stream, lock::Lock *obj) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| // Type-specific implementation | ||||
| #ifdef USE_TEXT_SENSOR | ||||
| void PrometheusHandler::text_sensor_type_(AsyncResponseStream *stream) { | ||||
|   stream->print(F("#TYPE esphome_text_sensor_value gauge\n")); | ||||
|   stream->print(F("#TYPE esphome_text_sensor_failed gauge\n")); | ||||
| } | ||||
| void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj) { | ||||
|   if (obj->is_internal() && !this->include_internal_) | ||||
|     return; | ||||
|   if (obj->has_state()) { | ||||
|     // We have a valid value, output this value | ||||
|     stream->print(F("esphome_text_sensor_failed{id=\"")); | ||||
|     stream->print(relabel_id_(obj).c_str()); | ||||
|     stream->print(F("\",name=\"")); | ||||
|     stream->print(relabel_name_(obj).c_str()); | ||||
|     stream->print(F("\"} 0\n")); | ||||
|     // Data itself | ||||
|     stream->print(F("esphome_text_sensor_value{id=\"")); | ||||
|     stream->print(relabel_id_(obj).c_str()); | ||||
|     stream->print(F("\",name=\"")); | ||||
|     stream->print(relabel_name_(obj).c_str()); | ||||
|     stream->print(F("\",value=\"")); | ||||
|     stream->print(obj->state.c_str()); | ||||
|     stream->print(F("\"} ")); | ||||
|     stream->print(F("1.0")); | ||||
|     stream->print(F("\n")); | ||||
|   } else { | ||||
|     // Invalid state | ||||
|     stream->print(F("esphome_text_sensor_failed{id=\"")); | ||||
|     stream->print(relabel_id_(obj).c_str()); | ||||
|     stream->print(F("\",name=\"")); | ||||
|     stream->print(relabel_name_(obj).c_str()); | ||||
|     stream->print(F("\"} 1\n")); | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| }  // namespace prometheus | ||||
| }  // namespace esphome | ||||
| #endif | ||||
|   | ||||
| @@ -110,6 +110,13 @@ class PrometheusHandler : public AsyncWebHandler, public Component { | ||||
|   void lock_row_(AsyncResponseStream *stream, lock::Lock *obj); | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_TEXT_SENSOR | ||||
|   /// Return the type for prometheus | ||||
|   void text_sensor_type_(AsyncResponseStream *stream); | ||||
|   /// Return the lock Values state as prometheus data point | ||||
|   void text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj); | ||||
| #endif | ||||
|  | ||||
|   web_server_base::WebServerBase *base_; | ||||
|   bool include_internal_{false}; | ||||
|   std::map<EntityBase *, std::string> relabel_map_id_; | ||||
|   | ||||
| @@ -13,9 +13,23 @@ sensor: | ||||
|       } | ||||
|     update_interval: 60s | ||||
|  | ||||
| text_sensor: | ||||
|   - platform: template | ||||
|     id: template_text_sensor1 | ||||
|     lambda: |- | ||||
|       if (millis() > 10000) { | ||||
|         return {"Hello World"}; | ||||
|       } else { | ||||
|         return {"Goodbye (cruel) World"}; | ||||
|       } | ||||
|     update_interval: 60s | ||||
|  | ||||
| prometheus: | ||||
|   include_internal: true | ||||
|   relabel: | ||||
|     template_sensor1: | ||||
|       id: hellow_world | ||||
|       name: Hello World | ||||
|     template_text_sensor1: | ||||
|       id: hello_text | ||||
|       name: Text Substitution | ||||
|   | ||||
		Reference in New Issue
	
	Block a user