diff --git a/doc/tools.md b/doc/tools.md index fac1f4b392..ef916553ad 100644 --- a/doc/tools.md +++ b/doc/tools.md @@ -78,3 +78,9 @@ The following will compress */var/log/friendica* (assuming this is the location daily rotate 2 } + +### Zabbix + +To monitor the health status of your Friendica installation, you can use for example a tool like Zabbix. Please define 'stats_key' in your local.config.php in the 'system' section to be able to access the statistics page at /stats?key=your-defined-stats_key + +The statistics contain data about the worker performance, the last cron call, number of reports, inbound and outbound packets, posts and comments. diff --git a/src/Model/Item.php b/src/Model/Item.php index 72bf396bf3..78430f1d16 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -4265,4 +4265,22 @@ class Item Logger::warning('Post does not exist although it was supposed to had been fetched.', ['id' => $id, 'url' => $url, 'uid' => $uid]); return 0; } + + public static function incrementInbound(string $network) + { + $packets = DI::keyValue()->get('stats_packets_inbound_' . $network) ?? 0; + if ($packets >= PHP_INT_MAX) { + $packets = 0; + } + DI::keyValue()->set('stats_packets_inbound_' . $network, $packets + 1); + } + + public static function incrementOutbound(string $network) + { + $packets = DI::keyValue()->get('stats_packets_outbound_' . $network) ?? 0; + if ($packets >= PHP_INT_MAX) { + $packets = 0; + } + DI::keyValue()->set('stats_packets_outbound_' . $network, $packets + 1); + } } diff --git a/src/Module/ActivityPub/Inbox.php b/src/Module/ActivityPub/Inbox.php index 5b096c8045..b39081c443 100644 --- a/src/Module/ActivityPub/Inbox.php +++ b/src/Module/ActivityPub/Inbox.php @@ -22,9 +22,11 @@ namespace Friendica\Module\ActivityPub; use Friendica\Core\Logger; +use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Module\BaseApi; use Friendica\Module\Special\HTTPException; @@ -103,6 +105,7 @@ class Inbox extends BaseApi $uid = 0; } + Item::incrementInbound(Protocol::ACTIVITYPUB); ActivityPub\Receiver::processInbox($postdata, $_SERVER, $uid); throw new \Friendica\Network\HTTPException\AcceptedException(); diff --git a/src/Module/DFRN/Notify.php b/src/Module/DFRN/Notify.php index 2e6b3f0f98..76701a036f 100644 --- a/src/Module/DFRN/Notify.php +++ b/src/Module/DFRN/Notify.php @@ -22,8 +22,10 @@ namespace Friendica\Module\DFRN; use Friendica\BaseModule; +use Friendica\Core\Protocol; use Friendica\Model\Contact; use Friendica\Model\Conversation; +use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Module\Response; use Friendica\Network\HTTPException; @@ -45,6 +47,8 @@ class Notify extends BaseModule throw new HTTPException\BadRequestException(); } + Item::incrementInbound(Protocol::DFRN); + $data = json_decode($postdata); if (is_object($data) && !empty($this->parameters['nickname'])) { $user = User::getByNickname($this->parameters['nickname']); diff --git a/src/Module/Diaspora/Receive.php b/src/Module/Diaspora/Receive.php index 57835a37b7..6678695ff5 100644 --- a/src/Module/Diaspora/Receive.php +++ b/src/Module/Diaspora/Receive.php @@ -25,6 +25,8 @@ use Friendica\App; use Friendica\BaseModule; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\L10n; +use Friendica\Core\Protocol; +use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Module\Response; use Friendica\Network\HTTPException; @@ -57,6 +59,8 @@ class Receive extends BaseModule throw new HTTPException\ForbiddenException($this->t('Access denied.')); } + Item::incrementInbound(Protocol::DIASPORA); + if ($this->parameters['type'] === 'public') { $this->receivePublic(); } else if ($this->parameters['type'] === 'users') { diff --git a/src/Module/OStatus/PubSub.php b/src/Module/OStatus/PubSub.php index 34e4900578..bddf43cd3a 100644 --- a/src/Module/OStatus/PubSub.php +++ b/src/Module/OStatus/PubSub.php @@ -28,6 +28,7 @@ use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Model\Contact; use Friendica\Model\GServer; +use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Module\Response; use Friendica\Network\HTTPException; @@ -101,6 +102,7 @@ class PubSub extends \Friendica\BaseModule $this->logger->info('Import item from Contact.', ['nickname' => $nickname, 'contact-nickname' => $contact['nick'], 'contact-id' => $contact['id']]); $feedhub = ''; + Item::incrementOutbound(Protocol::OSTATUS); OStatus::import($xml, $importer, $contact, $feedhub); throw new HTTPException\OKException(); diff --git a/src/Module/OStatus/Salmon.php b/src/Module/OStatus/Salmon.php index 2707fcc4c3..745dbba55b 100644 --- a/src/Module/OStatus/Salmon.php +++ b/src/Module/OStatus/Salmon.php @@ -26,6 +26,7 @@ use Friendica\Core\L10n; use Friendica\Core\Protocol; use Friendica\Database\Database; use Friendica\Model\GServer; +use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Module\Response; use Friendica\Protocol\ActivityNamespace; @@ -210,6 +211,7 @@ class Salmon extends \Friendica\BaseModule $contact = $contact ?: []; + Item::incrementOutbound(Protocol::OSTATUS); OStatus::import($data, $importer, $contact, $hub); throw new HTTPException\OKException(); diff --git a/src/Module/Stats.php b/src/Module/Stats.php index b5afb9a13a..d8bc317fc4 100644 --- a/src/Module/Stats.php +++ b/src/Module/Stats.php @@ -26,6 +26,7 @@ use Friendica\BaseModule; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\KeyValueStorage\Capability\IManageKeyValuePairs; use Friendica\Core\L10n; +use Friendica\Core\Protocol; use Friendica\Core\Worker; use Friendica\Database\Database; use Friendica\Model\Register; @@ -116,6 +117,20 @@ class Stats extends BaseModule 'comments' => intval($this->keyValue->get('nodeinfo_local_comments')), ], ], + 'packets' => [ + 'inbound' => [ + Protocol::ACTIVITYPUB => intval($this->keyValue->get('stats_packets_inbound_' . Protocol::ACTIVITYPUB) ?? 0), + Protocol::DFRN => intval($this->keyValue->get('stats_packets_inbound_' . Protocol::DFRN) ?? 0), + Protocol::DIASPORA => intval($this->keyValue->get('stats_packets_inbound_' . Protocol::DIASPORA) ?? 0), + Protocol::OSTATUS => intval($this->keyValue->get('stats_packets_inbound_' . Protocol::OSTATUS) ?? 0), + ], + 'outbound' => [ + Protocol::ACTIVITYPUB => intval($this->keyValue->get('stats_packets_outbound_' . Protocol::ACTIVITYPUB) ?? 0), + Protocol::DFRN => intval($this->keyValue->get('stats_packets_outbound_' . Protocol::DFRN) ?? 0), + Protocol::DIASPORA => intval($this->keyValue->get('stats_packets_outbound_' . Protocol::DIASPORA) ?? 0), + Protocol::OSTATUS => intval($this->keyValue->get('stats_packets_outbound_' . Protocol::OSTATUS) ?? 0), + ] + ], 'reports' => [ 'newest' => [ 'datetime' => $report_datetime, diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 7e64ac9bd3..3b979bc21f 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1011,6 +1011,7 @@ class DFRN $content_type = ($public_batch ? 'application/magic-envelope+xml' : 'application/json'); $postResult = DI::httpClient()->post($dest_url, $envelope, ['Content-Type' => $content_type], 0, HttpClientRequest::DFRN); + Item::incrementOutbound(Protocol::DFRN); $xml = $postResult->getBodyString(); $curl_stat = $postResult->getReturnCode(); diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 526ef11a90..27cc43ca07 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -2971,6 +2971,7 @@ class Diaspora $postResult = DI::httpClient()->post($dest_url . '/', $envelope, ['Content-Type' => $content_type], 0, HttpClientRequest::DIASPORA); $return_code = $postResult->getReturnCode(); + Item::incrementOutbound(Protocol::DIASPORA); } else { Logger::notice('test_mode'); return 200; diff --git a/src/Protocol/Salmon.php b/src/Protocol/Salmon.php index d4331570a3..bfb374970f 100644 --- a/src/Protocol/Salmon.php +++ b/src/Protocol/Salmon.php @@ -22,7 +22,9 @@ namespace Friendica\Protocol; use Friendica\Core\Logger; +use Friendica\Core\Protocol; use Friendica\DI; +use Friendica\Model\Item; use Friendica\Network\HTTPClient\Client\HttpClientAccept; use Friendica\Network\HTTPClient\Client\HttpClientRequest; use Friendica\Network\Probe; @@ -226,6 +228,7 @@ class Salmon $return_code = $postResult->getReturnCode(); } + Item::incrementOutbound(Protocol::OSTATUS); Logger::info('slapper for ' . $url . ' returned ' . $return_code); if (!$return_code) { diff --git a/src/Util/HTTPSignature.php b/src/Util/HTTPSignature.php index 2cb224ef6f..85a3ed396b 100644 --- a/src/Util/HTTPSignature.php +++ b/src/Util/HTTPSignature.php @@ -29,6 +29,7 @@ use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Model\GServer; +use Friendica\Model\Item; use Friendica\Model\ItemURI; use Friendica\Model\User; use Friendica\Network\HTTPClient\Capability\ICanHandleHttpResponses; @@ -309,6 +310,8 @@ class HTTPSignature self::setInboxStatus($target, ($return_code >= 200) && ($return_code <= 299)); + Item::incrementOutbound(Protocol::ACTIVITYPUB); + return $postResult; } diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 2fa2984bf7..28456b6478 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -655,6 +655,7 @@ class Notifier $delivery_queue_count++; Salmon::slapper($owner, $url, $slap); + Item::incrementOutbound(Protocol::OSTATUS); Post\DeliveryData::incrementQueueDone($target_item['uri-id'], Post\DeliveryData::OSTATUS); } }