/* PROMETHEUS METRICS MODULE Copyright (C) 2020 by Maxim Prokhorov */ #include "espurna.h" #if WEB_SUPPORT && PROMETHEUS_SUPPORT #include "prometheus.h" #include "api.h" #include "relay.h" #include "sensor.h" #include "web.h" #include void _prometheusRequestHandler(AsyncWebServerRequest* request) { static_assert(RELAY_SUPPORT || SENSOR_SUPPORT, ""); // TODO: Add more stuff? // Note: Response 'stream' backing buffer is customizable. Default is 1460 bytes (see ESPAsyncWebServer.h) // In case printf overflows, memory of CurrentSize+N{overflow} will be allocated to replace // the existing buffer. Previous buffer will be copied into the new and destroyed after that. AsyncResponseStream *response = request->beginResponseStream("text/plain"); #if RELAY_SUPPORT for (unsigned char index = 0; index < relayCount(); ++index) { response->printf("relay%u %d\n", index, static_cast(relayStatus(index))); } #endif #if SENSOR_SUPPORT char buffer[64] { 0 }; for (unsigned char index = 0; index < magnitudeCount(); ++index) { auto value = magnitudeValue(index); if (std::isnan(value.get()) || std::isinf(value.get())) { continue; } String topic(magnitudeTopicIndex(index)); topic.replace("/", ""); magnitudeFormat(value, buffer, sizeof(buffer)); response->printf("%s %s\n", topic.c_str(), buffer); } #endif response->write('\n'); request->send(response); } bool _prometheusRequestCallback(AsyncWebServerRequest* request) { if (request->url().equals(F("/api/metrics"))) { webLog(request); if (apiAuthenticate(request)) { _prometheusRequestHandler(request); } return true; } return false; } void prometheusSetup() { webRequestRegister(_prometheusRequestCallback); } #endif // PROMETHEUS_SUPPORT