From: Michael Tremer Date: Thu, 23 Oct 2025 16:32:58 +0000 (+0000) Subject: sources: sensors: Remove the extra callback X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62c51459b0a86341afd16a4ddad763feb922f41c;p=telemetry.git sources: sensors: Remove the extra callback We can just directly send the map to the collection function. Signed-off-by: Michael Tremer --- diff --git a/src/daemon/sources/sensors.c b/src/daemon/sources/sensors.c index 0652a37..61150d6 100644 --- a/src/daemon/sources/sensors.c +++ b/src/daemon/sources/sensors.c @@ -69,11 +69,81 @@ static int __sensors_make_name(char* name, size_t length, const char* chip, cons return 0; } -typedef int (*find_sensors_callback)(td_ctx* ctx, td_source* source, - const sensors_chip_name* chip, const sensors_feature* feature, td_metrics* metrics); +typedef struct sensors_value { + // Field + const char* field; + + // Type + sensors_subfeature_type type; +} sensors_value; + +static int read_values(td_ctx* ctx, const sensors_chip_name* chip, + const sensors_feature* feature, td_metrics* metrics, const sensors_value* values) { + const sensors_subfeature* subfeature = NULL; + double value = 0; + int index = 0; + int r; + + // Iterate over all subfeatures + for (;;) { + subfeature = sensors_get_all_subfeatures(chip, feature, &index); + if (!subfeature) + break; + + // Search for any matching values and read them + for (const sensors_value* v = values; v->field; v++) { + if (subfeature->type == v->type) { + // Read the value + r = sensors_get_value(chip, subfeature->number, &value); + if (r < 0) + return r; + + // Convert some temperature values from Celsius to Kelvin + switch (v->type) { + case SENSORS_SUBFEATURE_TEMP_INPUT: + case SENSORS_SUBFEATURE_TEMP_MAX: + case SENSORS_SUBFEATURE_TEMP_MAX_HYST: + case SENSORS_SUBFEATURE_TEMP_MIN: + case SENSORS_SUBFEATURE_TEMP_CRIT: + case SENSORS_SUBFEATURE_TEMP_CRIT_HYST: + case SENSORS_SUBFEATURE_TEMP_LCRIT: + case SENSORS_SUBFEATURE_TEMP_EMERGENCY: + case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST: + case SENSORS_SUBFEATURE_TEMP_LOWEST: + case SENSORS_SUBFEATURE_TEMP_HIGHEST: + case SENSORS_SUBFEATURE_TEMP_ALARM: + case SENSORS_SUBFEATURE_TEMP_MAX_ALARM: + case SENSORS_SUBFEATURE_TEMP_MIN_ALARM: + case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM: + case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM: + case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM: + case SENSORS_SUBFEATURE_TEMP_FAULT: + case SENSORS_SUBFEATURE_TEMP_TYPE: + case SENSORS_SUBFEATURE_TEMP_OFFSET: + case SENSORS_SUBFEATURE_TEMP_BEEP: + value += 273.15; + break; -static int find_sensors(td_ctx* ctx, td_source* source, - sensors_feature_type type, find_sensors_callback callback) { + default: + break; + } + + // Push the value + r = td_metrics_push_float(metrics, v->field, value); + if (r < 0) + return r; + + // We are done for this subfeature + break; + } + } + } + + return 0; +} + +static int read_sensors(td_ctx* ctx, td_source* source, + sensors_feature_type type, const sensors_value* values) { const sensors_feature* feature = NULL; const sensors_chip_name* chip = NULL; td_metrics* metrics = NULL; @@ -131,8 +201,8 @@ static int find_sensors(td_ctx* ctx, td_source* source, if (r < 0) goto ERROR; - // Call the callback - r = callback(ctx, source, chip, feature, metrics); + // Read the values + r = read_values(ctx, chip, feature, metrics, values); if (r < 0) goto ERROR; @@ -157,85 +227,11 @@ ERROR: return r; } -typedef struct sensors_value { - // Field - const char* field; - - // Type - sensors_subfeature_type type; -} sensors_value; - -static int read_sensors(td_ctx* ctx, const sensors_chip_name* chip, - const sensors_feature* feature, td_metrics* metrics, sensors_value* values) { - const sensors_subfeature* subfeature = NULL; - double value = 0; - int index = 0; - int r; - - // Iterate over all subfeatures - for (;;) { - subfeature = sensors_get_all_subfeatures(chip, feature, &index); - if (!subfeature) - break; - - // Search for any matching values and read them - for (sensors_value* v = values; v->field; v++) { - if (subfeature->type == v->type) { - // Read the value - r = sensors_get_value(chip, subfeature->number, &value); - if (r < 0) - return r; - - // Convert some temperature values from Celsius to Kelvin - switch (v->type) { - case SENSORS_SUBFEATURE_TEMP_INPUT: - case SENSORS_SUBFEATURE_TEMP_MAX: - case SENSORS_SUBFEATURE_TEMP_MAX_HYST: - case SENSORS_SUBFEATURE_TEMP_MIN: - case SENSORS_SUBFEATURE_TEMP_CRIT: - case SENSORS_SUBFEATURE_TEMP_CRIT_HYST: - case SENSORS_SUBFEATURE_TEMP_LCRIT: - case SENSORS_SUBFEATURE_TEMP_EMERGENCY: - case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST: - case SENSORS_SUBFEATURE_TEMP_LOWEST: - case SENSORS_SUBFEATURE_TEMP_HIGHEST: - case SENSORS_SUBFEATURE_TEMP_ALARM: - case SENSORS_SUBFEATURE_TEMP_MAX_ALARM: - case SENSORS_SUBFEATURE_TEMP_MIN_ALARM: - case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM: - case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM: - case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM: - case SENSORS_SUBFEATURE_TEMP_FAULT: - case SENSORS_SUBFEATURE_TEMP_TYPE: - case SENSORS_SUBFEATURE_TEMP_OFFSET: - case SENSORS_SUBFEATURE_TEMP_BEEP: - value += 273.15; - break; - - default: - break; - } - - // Push the value - r = td_metrics_push_float(metrics, v->field, value); - if (r < 0) - return r; - - // We are done for this subfeature - break; - } - } - } - - return 0; -} - /* (Voltage) Input */ -static int read_input_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip, - const sensors_feature* feature, td_metrics* metrics) { - sensors_value values[] = { +static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) { + const sensors_value values[] = { { "current", SENSORS_SUBFEATURE_IN_INPUT }, { "min", SENSORS_SUBFEATURE_IN_MIN }, { "max", SENSORS_SUBFEATURE_IN_MAX }, @@ -253,12 +249,7 @@ static int read_input_sensors(td_ctx* ctx, td_source* source, const sensors_chip { NULL }, }; - // Read values - return read_sensors(ctx, chip, feature, metrics, values); -} - -static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) { - return find_sensors(ctx, source, SENSORS_FEATURE_IN, read_input_sensors); + return read_sensors(ctx, source, SENSORS_FEATURE_IN, values); } const td_source_impl sensors_input_source = { @@ -290,8 +281,7 @@ const td_source_impl sensors_input_source = { /* Temperature */ -static int read_temp_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip, - const sensors_feature* feature, td_metrics* metrics) { +static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) { sensors_value values[] = { { "current", SENSORS_SUBFEATURE_TEMP_INPUT }, { "max", SENSORS_SUBFEATURE_TEMP_MAX }, @@ -318,12 +308,7 @@ static int read_temp_sensors(td_ctx* ctx, td_source* source, const sensors_chip_ { NULL }, }; - // Read values - return read_sensors(ctx, chip, feature, metrics, values); -} - -static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) { - return find_sensors(ctx, source, SENSORS_FEATURE_TEMP, read_temp_sensors); + return read_sensors(ctx, source, SENSORS_FEATURE_TEMP, values); } const td_source_impl sensors_temp_source = {