Files
Zane C. Bowers-Hadley 0bbcde1227 add the ability for storing app data to prevent spamming of the event log via via component usage (#14087)
* initial work on add the ability to save/fetch app data

* update to use get_app_data for ZFS

* update the poller for the new app_data stuff

* ZFS now logs changes to pools

* add schema update for app_data stuff

* small formatting fix

* add a missing \

* now adds a column

* sql-schema is no longer used, so remove the file that was added here

* misc cleanups

* rename the method in database/migrations/2022_07_03_1947_add_app_data.php

* hopefully fix the migration bit

* add the column to misc/db_schema.yaml

* more misc small DB fixes

* update the test as the json column uses collat of utf8mb4_bin

* revert the last change and try manually setting it to what is expected

* remove a extra ;

* update suricata as well

* correct the instance -> instances in one location to prevent the old instance list from being stomped

* remove a extra ;

* update fail2ban to use it as well

* remove two unused functions as suricata and fail2ban no longer use components

* style cleanup

* postgres poller updated to use it

* update html side of the postgres bits

* chronyd now uses app data bits now as well

* portactivity now uses it as well

* style fix

* sort the returned arrays from app_data

* correct log message for port activity

* collocation change

* try re-ordering it

* add in the new data column to the tests

* remove a extra ,

* hmm... ->collate('utf8mb4_unicode_ci') is not usable as apparently collate does not exist

* change the column type from json to longtext

* mv chronyd stuff while I sort out the rest of the tests... damn thing is always buggy

* hmm... fix a missing line then likely move stuff back

* style fix

* add fillable

* add the expexcted data for fail2ban json

* escape a " I missed

* add data for portactivity

* add suricata app data

* add app data to zfs legacy test

* put the moved tests back into place and update zfs-v1 test

* add app data for chronyd test

* add app data for fail2ban legacy test

* update zfs v1 app data

* add some notes on application dev work

* add Developing/Application-Notes.md to mkdocs.yml

* add data column to it

* added various suggestions from bennet-esyoil

* convert from isset to sizeof

* type fix

* fully remove the old save app data function and move it into a helper function... the other still needs cleaned up prior to removal

* update docs

* get_app_data is fully removed now as well

* a few style fixes

* add $casts

* update chronyd test

* attempt to fix the data

* more doc cleanup and try changing the cast

* style fix

* revert the changes to the chronyd test

* apply a few of murrant's suggestions

* document working with ->data as json and non-josn

* remove two no-longer used in this PR exceptions

* ->data now operates transparently

* style fix

* update data tests

* fix json

* test fix

* update the app notes to reflect how app data now works

* app test fix

* app data fix for linux_lsi

* json fix

* minor doc cleanup

* remove duplicate querty and use json_decode instead

* style fix

* modelize the app poller

* use a anon func instead of foreach

* test update

* style cleanup

* style cleanup

* another test cleanup

* more test cleanup

* reverse the test changes and add in some more glue code

* revert one of the test changes

* another small test fix

* Make things use models
Left some array access, but those will still work just fine.

* missed chronyd and portactivity

* rename poll to avoid make it any confusion

* Remove extra save and fix timestamp

* save any changes made to app->data

* nope, that was not it

* What are magic methods and how do they work?

* fix two typos

* update linux_lsi test

* change quote type

Co-authored-by: Tony Murray <murraytony@gmail.com>
2022-07-22 16:01:55 -05:00

175 lines
5.2 KiB
PHP

<?php
/*
LibreNMS Application for monitoring power consumption
@link https://www.upaya.net.au/
@copyright 2021 Ben Carbery
@author Ben Carbery <yrebrac@upaya.net.au>
LICENSE - GPLv3
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 3. See https://www.gnu.org/licenses/gpl-3.0.txt
DESCRIPTION
Displays the crrent watts being consumed by a host and uses that data series
to estimate total power consumption in kWh over the graph. Finally, displays
the cost of the kWh consumed based on the cost defined below.
Watts (power) is an instantaneous value. Hence this graph will be more accurate
when these is a fairly consistent load on the server between polling cycles.
Watts is easily converted to kilowatt hours which most electricity providers
will charge in terms of. The graph will display the total kWh hours consumed at
the bottom. You can update the default cost_per_kWh below and currency symbol
below under LOCAL OPTIONS
*/
$name = 'powermon';
$rrd_filename = Rrd::name($device['hostname'], ['app', $name, $app->app_id]);
$ds_list[0]['vname'] = 'watts';
$ds_list[0]['ds'] = 'watts-gauge';
$ds_list[0]['filename'] = $rrd_filename;
$ds_list[0]['descr'] = 'Average Power';
$ds_list[0]['units_text'] = ' W';
$ds_list[0]['colour'] = 'FF6600'; // orange
$ds_list[0]['colour'] = 'F9F900'; // yellow
$ds_list[0]['areacolour'] = 'FAFAB2'; // yellow
$ds_list[1]['vname'] = 'rate';
$ds_list[1]['ds'] = 'rate';
$ds_list[1]['filename'] = $rrd_filename;
$ds_list[1]['descr'] = ' Total Cost';
$ds_list[1]['units_text'] = '$';
$ds_list[1]['colour'] = '006600'; // money green
if ($_GET['debug']) {
print_r($ds_list);
}
// COMMON OPTIONS
//$from = ;
//$to = ;
//$width = 200;
//$height = 100;
//$inverse = false;
//$nototal = true;
//$nodetails = false;
//$noagg = true;
//$title = '';
$scale_min = 0;
//$scale_max = 0;
//$scale_rigid = anything;
//$norigid = false;
$float_precision = 0;
// LOCAL OPTIONS
$line_width = 2.5;
$pad_to = 18; // padding for left-hand column in legend
$currency_symbol = '$'; // update this if required
require 'includes/html/graphs/common.inc.php';
//if ($nototal) {
// $pad_to += '2';
//}
$rrd_options .= ' COMMENT:\s'; // spacer in legend
$i = 0;
foreach ($ds_list as $ds_item) {
$vname = $ds_item['vname'];
$ds = $ds_item['ds'];
$filename = $ds_item['filename'];
$descr = \LibreNMS\Data\Store\Rrd::fixedSafeDescr($ds_item['descr'], $pad_to);
// CF to use
$use_cf_last = ['nothing', 'nothing'];
if (in_array($vname, $use_cf_last)) {
$cf = 'LAST';
} else {
$cf = 'AVERAGE';
}
$rrd_options .= ' DEF:' . "$vname=$filename:$ds:" . $cf;
// Units
if (isset($ds_item['units_text'])) {
$units_text = $ds_item['units_text'];
} else {
$units_text = '';
}
// Line Width
if (isset($ds_item['line_width'])) {
$ds_line_width = $ds_item['line_width'];
} else {
$ds_line_wdith = $line_width;
}
// Line Colour
if (isset($ds_item['colour'])) {
$colour = $ds_item['colour'];
} else {
if (! \LibreNMS\Config::get("graph_colours.$colours.$i")) {
$i = 0;
}
$colour = \LibreNMS\Config::get("graph_colours.$colours.$i");
$i++;
}
// Area Colour
if (isset($ds_item['areacolour'])) {
$areacolour = $ds_item['areacolour'];
} else {
$areacolour = $colour . '20';
}
// Graph command
if ($vname == 'watts') {
$rrd_options .= ' AREA:' . $vname . '#' . $areacolour;
$rrd_options .= " LINE{$ds_line_width}:{$vname}#{$colour}:'{$descr}'";
$rrd_options .= " GPRINT:{$vname}:AVERAGE:%12.{$float_precision}lf'{$units_text}'\l";
$rrd_options .= ' COMMENT:\s'; // spacer in legend
/*
// Watt Seconds
$descr = ' Total Consumed';
$units_text = ' Ws';
$descr = rrdtool_escape($descr, $pad_to + 2);
$rrd_options .= " COMMENT:'{$descr}'";
$rrd_options .= ' VDEF:wattsecs=watts,TOTAL';
$rrd_options .= " GPRINT:wattsecs:%12.{$float_precision}lf'{$units_text}'\l";
*/
// Kilowatt Hours
$units_text = ' kWh';
$float_precision = 2;
$descr = ' Total Consumed';
$descr = \LibreNMS\Data\Store\Rrd::fixedSafeDescr($descr, $pad_to + 2);
$rrd_options .= " COMMENT:'{$descr}'";
$rrd_options .= ' CDEF:series_a=watts,3600000,/';
$rrd_options .= ' VDEF:kilowatthours=series_a,TOTAL';
$rrd_options .= " GPRINT:kilowatthours:%12.{$float_precision}lf'{$units_text}'\l";
} elseif ($vname == 'rate') {
// Consumption Charge
$float_precision = 2;
$descr = \LibreNMS\Data\Store\Rrd::fixedSafeDescr($descr, $pad_to + 7);
$rrd_options .= " COMMENT:'{$descr}{$currency_symbol}'";
$rrd_options .= " CDEF:series_b=watts,{$vname},*,3600000,/";
$rrd_options .= ' VDEF:total_cost=series_b,TOTAL';
$rrd_options .= " GPRINT:total_cost:%6.{$float_precision}lf' @ average rate of'";
$rrd_options .= ' VDEF:average_rate=rate,AVERAGE';
$rrd_options .= " GPRINT:average_rate:%0.6lf' per kWh\l'";
}
}