diff --git a/server/api/flukso/src/flukso.erl b/server/api/flukso/src/flukso.erl index 7862740..deb9853 100644 --- a/server/api/flukso/src/flukso.erl +++ b/server/api/flukso/src/flukso.erl @@ -30,6 +30,7 @@ ensure_started(App) -> end. mysql_prepare() -> + mysql:prepare(watchdog, <<"INSERT INTO watchdog (uid, type, message, variables, severity, location, hostname, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?)">>), mysql:prepare(permissions, <<"SELECT permissions FROM logger_tokens WHERE meter = ? AND token = ?">>), mysql:prepare(device_key, <<"SELECT sha FROM (logger_devices ld INNER JOIN logger_meters lm ON ld.device = lm.device) WHERE lm.meter = ?">>), mysql:prepare(sensor_props, <<"SELECT uid, device, night FROM logger_meters WHERE meter = ?">>), diff --git a/server/api/flukso/src/flukso.hrl b/server/api/flukso/src/flukso.hrl index 02c08b8..d56aa1f 100644 --- a/server/api/flukso/src/flukso.hrl +++ b/server/api/flukso/src/flukso.hrl @@ -165,3 +165,26 @@ time_to_seconds(Time) -> false -> false; {_Time, TimeSec} -> TimeSec end. + +% severity levels +-define(EMERGENCY, 0). +-define(ALERT, 1). +-define(CRITICAL, 2). +-define(ERROR, 3). +-define(WARNING, 4). +-define(NOTICE, 5). +-define(INFO, 6). +-define(DEBUG, 7). + +% log to Drupal's watchdog table +logger(Uid, Type, Message, Severity, ReqData) -> + mysql:execute(pool, watchdog, + [Uid, + Type, + Message, + <<"a:0:{}">>, + Severity, + list_to_binary(wrq:raw_path(ReqData)), + list_to_binary(wrq:peer(ReqData)), + unix_time() + ]). diff --git a/server/api/flukso/src/flukso_sensor_xyz.erl b/server/api/flukso/src/flukso_sensor_xyz.erl index 47044e2..841166e 100644 --- a/server/api/flukso/src/flukso_sensor_xyz.erl +++ b/server/api/flukso/src/flukso_sensor_xyz.erl @@ -153,17 +153,17 @@ process_post(ReqData, #state{rrdSensor = RrdSensor} = State) -> case erlrrd:update([?BASE_PATH, [RrdSensor|".rrd"], " ", RrdData]) of {ok, _RrdResponse} -> RrdResponse = "ok", - NewMidnight = update_night(RrdSensor, Uid, Midnight, LastTimestamp), + NewMidnight = update_night(RrdSensor, Uid, Midnight, LastTimestamp, ReqData), mysql:execute(pool, sensor_update, [unix_time(), NewMidnight, LastValue, RrdSensor]); {error, RrdResponse} -> - true + logger(Uid, <<"rrdupdate.base">>, list_to_binary(RrdResponse), ?ERROR, ReqData) end, JsonResponse = mochijson2:encode({struct, [{<<"response">>, list_to_binary(RrdResponse)}]}), {true , wrq:set_resp_body(JsonResponse, ReqData), State}. -update_night(RrdSensor, Uid, Midnight, LastTimestamp) when LastTimestamp > Midnight + 6 * ?HOUR -> +update_night(RrdSensor, Uid, Midnight, LastTimestamp, ReqData) when LastTimestamp > Midnight + 6 * ?HOUR -> LastMidnight = calculate_midnight(unix_time(), Uid), case erlrrd:fetch(erlrrd:c([[?BASE_PATH, [RrdSensor|".rrd"]], "AVERAGE", ["-s ", integer_to_list(LastMidnight + 2 * ?HOUR)], ["-e ", integer_to_list(LastMidnight + 5 * ?HOUR)], ["-r ", integer_to_list(?QUARTER)]])) of @@ -175,12 +175,12 @@ update_night(RrdSensor, Uid, Midnight, LastTimestamp) when LastTimestamp > Midni %debugging: io:format("~s~n", [[?NIGHT_PATH, [RrdSensor|".rrd"], " ", integer_to_list(LastMidnight + 5 * ?HOUR), ":", float_to_list(NightAverage)]]), erlrrd:update([?NIGHT_PATH, [RrdSensor|".rrd"], " ", integer_to_list(LastMidnight + 5 * ?HOUR), ":", float_to_list(NightAverage)]); - {error, _Reason} -> - true + {error, Reason} -> + logger(Uid, <<"rrdupdate.night">>, list_to_binary(Reason), ?ERROR, ReqData) end, LastMidnight + ?DAY; -update_night(_RrdSensor, _Uid, Midnight, _LastTimestamp) -> +update_night(_RrdSensor, _Uid, Midnight, _LastTimestamp, _ReqData) -> Midnight. calculate_midnight(Timestamp, Uid) ->