diff options
Diffstat (limited to 'classes')
| -rw-r--r-- | classes/Article.php | 24 | ||||
| -rw-r--r-- | classes/Config.php | 10 | ||||
| -rw-r--r-- | classes/Counters.php | 14 | ||||
| -rw-r--r-- | classes/Digest.php | 3 | ||||
| -rw-r--r-- | classes/DiskCache.php | 46 | ||||
| -rw-r--r-- | classes/Feeds.php | 31 | ||||
| -rw-r--r-- | classes/PluginHost.php | 39 | ||||
| -rw-r--r-- | classes/Pref_Feeds.php | 6 | ||||
| -rw-r--r-- | classes/RPC.php | 27 | ||||
| -rw-r--r-- | classes/RSSUtils.php | 35 | ||||
| -rw-r--r-- | classes/Sanitizer.php | 8 | ||||
| -rw-r--r-- | classes/Tracer.php | 216 | ||||
| -rw-r--r-- | classes/UrlHelper.php | 25 |
13 files changed, 21 insertions, 463 deletions
diff --git a/classes/Article.php b/classes/Article.php index c496ea131..550e42842 100644 --- a/classes/Article.php +++ b/classes/Article.php @@ -298,8 +298,6 @@ class Article extends Handler_Protected { * @return array{'formatted': string, 'entries': array<int, array<string, mixed>>} */ static function _format_enclosures(int $id, bool $always_display_enclosures, string $article_content, bool $hide_images = false): array { - $span = Tracer::start(__METHOD__); - $enclosures = self::_get_enclosures($id); $enclosures_formatted = ""; @@ -326,7 +324,6 @@ class Article extends Handler_Protected { $enclosures_formatted, $enclosures, $id, $always_display_enclosures, $article_content, $hide_images); if (!empty($enclosures_formatted)) { - $span->end(); return [ 'formatted' => $enclosures_formatted, 'entries' => [] @@ -370,7 +367,6 @@ class Article extends Handler_Protected { } } - $span->end(); return $rv; } @@ -378,8 +374,6 @@ class Article extends Handler_Protected { * @return array<int, string> */ static function _get_tags(int $id, int $owner_uid = 0, ?string $tag_cache = null): array { - $span = Tracer::start(__METHOD__); - $a_id = $id; if (!$owner_uid) $owner_uid = $_SESSION["uid"]; @@ -427,7 +421,6 @@ class Article extends Handler_Protected { $sth->execute([$tags_str, $id, $owner_uid]); } - $span->end(); return $tags; } @@ -522,8 +515,6 @@ class Article extends Handler_Protected { * @return array<int, array<int, int|string>> */ static function _get_labels(int $id, ?int $owner_uid = null): array { - $span = Tracer::start(__METHOD__); - $rv = array(); if (!$owner_uid) $owner_uid = $_SESSION["uid"]; @@ -569,8 +560,6 @@ class Article extends Handler_Protected { else Labels::update_cache($owner_uid, $id, array("no-labels" => 1)); - $span->end(); - return $rv; } @@ -581,8 +570,6 @@ class Article extends Handler_Protected { * @return array<int, Article::ARTICLE_KIND_*|string> */ static function _get_image(array $enclosures, string $content, string $site_url, array $headline) { - $span = Tracer::start(__METHOD__); - $article_image = ""; $article_stream = ""; $article_kind = 0; @@ -603,6 +590,7 @@ class Article extends Handler_Protected { $tmpxpath = new DOMXPath($tmpdoc); $elems = $tmpxpath->query('(//img[@src]|//video[@poster]|//iframe[contains(@src , "youtube.com/embed/")])'); + /** @var DOMElement $e */ foreach ($elems as $e) { if ($e->nodeName == "iframe") { $matches = []; @@ -660,8 +648,6 @@ class Article extends Handler_Protected { if ($article_stream && $cache->exists(sha1($article_stream))) $article_stream = $cache->get_url(sha1($article_stream)); - $span->end(); - return [$article_image, $article_stream, $article_kind]; } @@ -675,8 +661,6 @@ class Article extends Handler_Protected { if (count($article_ids) == 0) return []; - $span = Tracer::start(__METHOD__); - $entries = ORM::for_table('ttrss_entries') ->table_alias('e') ->join('ttrss_user_entries', ['ref_id', '=', 'id'], 'ue') @@ -696,8 +680,6 @@ class Article extends Handler_Protected { } } - $span->end(); - return array_unique($rv); } @@ -709,8 +691,6 @@ class Article extends Handler_Protected { if (count($article_ids) == 0) return []; - $span = Tracer::start(__METHOD__); - $entries = ORM::for_table('ttrss_entries') ->table_alias('e') ->join('ttrss_user_entries', ['ref_id', '=', 'id'], 'ue') @@ -723,8 +703,6 @@ class Article extends Handler_Protected { array_push($rv, $entry->feed_id); } - $span->end(); - return array_unique($rv); } } diff --git a/classes/Config.php b/classes/Config.php index e9d44063c..ab7f4baef 100644 --- a/classes/Config.php +++ b/classes/Config.php @@ -192,12 +192,6 @@ class Config { /** delay updates for this feed if received HTTP 429 (Too Many Requests) for this amount of seconds (base value, actual delay is base...base*2) */ const HTTP_429_THROTTLE_INTERVAL = "HTTP_429_THROTTLE_INTERVAL"; - /** host running Jaeger collector to receive traces (disabled if empty) */ - const OPENTELEMETRY_ENDPOINT = "OPENTELEMETRY_ENDPOINT"; - - /** Jaeger service name */ - const OPENTELEMETRY_SERVICE = "OPENTELEMETRY_SERVICE"; - /** default values for all global configuration options */ private const _DEFAULTS = [ Config::DB_TYPE => [ "pgsql", Config::T_STRING ], @@ -255,9 +249,7 @@ class Config { Config::AUTH_MIN_INTERVAL => [ 5, Config::T_INT ], Config::HTTP_USER_AGENT => [ 'Tiny Tiny RSS/%s (https://tt-rss.org/)', Config::T_STRING ], - Config::HTTP_429_THROTTLE_INTERVAL => [ 3600, Config::T_INT ], - Config::OPENTELEMETRY_ENDPOINT => [ "", Config::T_STRING ], - Config::OPENTELEMETRY_SERVICE => [ "tt-rss", Config::T_STRING ], + Config::HTTP_429_THROTTLE_INTERVAL => [ 3600, Config::T_INT ] ]; /** @var Config|null */ diff --git a/classes/Counters.php b/classes/Counters.php index b3cba162c..0f6b419ba 100644 --- a/classes/Counters.php +++ b/classes/Counters.php @@ -145,8 +145,6 @@ class Counters { * @return array<int, array<string, int|string>> */ private static function get_feeds(?array $feed_ids = null): array { - $span = Tracer::start(__METHOD__); - $ret = []; $pdo = Db::pdo(); @@ -212,8 +210,6 @@ class Counters { } - $span->end(); - return $ret; } @@ -221,8 +217,6 @@ class Counters { * @return array<int, array<string, int|string>> */ private static function get_global(): array { - $span = Tracer::start(__METHOD__); - $ret = [ [ "id" => "global-unread", @@ -239,8 +233,6 @@ class Counters { "counter" => $subcribed_feeds ]); - $span->end(); - return $ret; } @@ -248,8 +240,6 @@ class Counters { * @return array<int, array<string, int|string>> */ private static function get_virt(): array { - $span = Tracer::start(__METHOD__); - $ret = []; foreach ([Feeds::FEED_ARCHIVED, Feeds::FEED_STARRED, Feeds::FEED_PUBLISHED, @@ -295,7 +285,6 @@ class Counters { } } - $span->end(); return $ret; } @@ -304,8 +293,6 @@ class Counters { * @return array<int, array<string, int|string>> */ static function get_labels(?array $label_ids = null): array { - $span = Tracer::start(__METHOD__); - $ret = []; $pdo = Db::pdo(); @@ -356,7 +343,6 @@ class Counters { array_push($ret, $cv); } - $span->end(); return $ret; } } diff --git a/classes/Digest.php b/classes/Digest.php index 6005f5fe4..cad808711 100644 --- a/classes/Digest.php +++ b/classes/Digest.php @@ -2,8 +2,6 @@ class Digest { static function send_headlines_digests(): void { - $span = Tracer::start(__METHOD__); - $user_limit = 15; // amount of users to process (e.g. emails to send out) $limit = 1000; // maximum amount of headlines to include @@ -77,7 +75,6 @@ class Digest } } - $span->end(); Debug::log("All done."); } diff --git a/classes/DiskCache.php b/classes/DiskCache.php index d6335a9e7..249079b36 100644 --- a/classes/DiskCache.php +++ b/classes/DiskCache.php @@ -221,11 +221,7 @@ class DiskCache implements Cache_Adapter { } public function remove(string $filename): bool { - $span = Tracer::start(__METHOD__); - $span->setAttribute('file.name', $filename); - $rc = $this->adapter->remove($filename); - $span->end(); return $rc; } @@ -251,9 +247,6 @@ class DiskCache implements Cache_Adapter { } public function exists(string $filename): bool { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent("DiskCache::exists: $filename"); - $rc = $this->adapter->exists(basename($filename)); return $rc; @@ -263,11 +256,7 @@ class DiskCache implements Cache_Adapter { * @return int|false -1 if the file doesn't exist, false if an error occurred, size in bytes otherwise */ public function get_size(string $filename) { - $span = Tracer::start(__METHOD__); - $span->setAttribute('file.name', $filename); - $rc = $this->adapter->get_size(basename($filename)); - $span->end(); return $rc; } @@ -278,11 +267,7 @@ class DiskCache implements Cache_Adapter { * @return int|false Bytes written or false if an error occurred. */ public function put(string $filename, $data) { - $span = Tracer::start(__METHOD__); - $rc = $this->adapter->put(basename($filename), $data); - $span->end(); - - return $rc; + return $this->adapter->put(basename($filename), $data); } /** @deprecated we can't assume cached files are local, and other storages @@ -326,17 +311,12 @@ class DiskCache implements Cache_Adapter { } public function send(string $filename) { - $span = Tracer::start(__METHOD__); - $span->setAttribute('file.name', $filename); - $filename = basename($filename); if (!$this->exists($filename)) { header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); echo "File not found."; - $span->setAttribute('error', '404 not found'); - $span->end(); return false; } @@ -346,8 +326,6 @@ class DiskCache implements Cache_Adapter { if (($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '') == $gmt_modified || ($_SERVER['HTTP_IF_NONE_MATCH'] ?? '') == $file_mtime) { header('HTTP/1.1 304 Not Modified'); - $span->setAttribute('error', '304 not modified'); - $span->end(); return false; } @@ -365,9 +343,6 @@ class DiskCache implements Cache_Adapter { header("Content-type: text/plain"); print "Stored file has disallowed content type ($mimetype)"; - - $span->setAttribute('error', '400 disallowed content type'); - $span->end(); return false; } @@ -389,13 +364,7 @@ class DiskCache implements Cache_Adapter { header_remove("Pragma"); - $span->setAttribute('mimetype', $mimetype); - - $rc = $this->adapter->send($filename); - - $span->end(); - - return $rc; + return $this->adapter->send($filename); } public function get_full_path(string $filename): string { @@ -424,13 +393,9 @@ class DiskCache implements Cache_Adapter { // plugins work on original source URLs used before caching // NOTE: URLs should be already absolutized because this is called after sanitize() static public function rewrite_urls(string $str): string { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent("DiskCache::rewrite_urls"); - $res = trim($str); if (!$res) { - $span->end(); return ''; } @@ -439,13 +404,12 @@ class DiskCache implements Cache_Adapter { $xpath = new DOMXPath($doc); $cache = DiskCache::instance("images"); - $entries = $xpath->query('(//img[@src]|//source[@src|@srcset]|//video[@poster|@src])'); - $need_saving = false; - foreach ($entries as $entry) { - $span->addEvent("entry: " . $entry->tagName); + $entries = $xpath->query('(//img[@src]|//source[@src|@srcset]|//video[@poster|@src])'); + /** @var DOMElement $entry */ + foreach ($entries as $entry) { foreach (array('src', 'poster') as $attr) { if ($entry->hasAttribute($attr)) { $url = $entry->getAttribute($attr); diff --git a/classes/Feeds.php b/classes/Feeds.php index 71379762f..f44be22bf 100644 --- a/classes/Feeds.php +++ b/classes/Feeds.php @@ -62,9 +62,6 @@ class Feeds extends Handler_Protected { $disable_cache = false; - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); - $reply = []; $rgba_cache = []; $topmost_article_ids = []; @@ -166,7 +163,6 @@ class Feeds extends Handler_Protected { $reply['search_query'] = [$search, $search_language]; $reply['vfeed_group_enabled'] = $vfeed_group_enabled; - $span->addEvent('plugin_menu_items'); $plugin_menu_items = ""; PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM2, @@ -200,13 +196,10 @@ class Feeds extends Handler_Protected { }, $feed, $cat_view, $qfh_ret); - $span->addEvent('articles'); - $headlines_count = 0; if ($result instanceof PDOStatement) { while ($line = $result->fetch(PDO::FETCH_ASSOC)) { - $span->addEvent('article: ' . $line['id']); ++$headlines_count; @@ -366,8 +359,6 @@ class Feeds extends Handler_Protected { //setting feed headline background color, needs to change text color based on dark/light $fav_color = $line['favicon_avg_color'] ?? false; - $span->addEvent("colors"); - require_once "colors.php"; if (!isset($rgba_cache[$feed_id])) { @@ -382,8 +373,6 @@ class Feeds extends Handler_Protected { $line['feed_bg_color'] = 'rgba(' . implode(",", $rgba_cache[$feed_id]) . ',0.3)'; } - $span->addEvent("HOOK_RENDER_ARTICLE_CDM"); - PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_RENDER_ARTICLE_CDM, function ($result, $plugin) use (&$line) { $line = $result; @@ -461,8 +450,6 @@ class Feeds extends Handler_Protected { } } - $span->end(); - return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $reply); } @@ -926,10 +913,6 @@ class Feeds extends Handler_Protected { * @throws PDOException */ static function _get_counters($feed, bool $is_cat = false, bool $unread_only = false, ?int $owner_uid = null): int { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - - $span->addEvent(__METHOD__ . ": $feed ($is_cat)"); - $n_feed = (int) $feed; $need_entries = false; @@ -952,14 +935,11 @@ class Feeds extends Handler_Protected { $handler = PluginHost::getInstance()->get_feed_handler($feed_id); if (implements_interface($handler, 'IVirtualFeed')) { /** @var IVirtualFeed $handler */ - //$span->end(); return $handler->get_unread($feed_id); } else { - //$span->end(); return 0; } } else if ($n_feed == Feeds::FEED_RECENTLY_READ) { - //$span->end(); return 0; // tags } else if ($feed != "0" && $n_feed == 0) { @@ -973,7 +953,6 @@ class Feeds extends Handler_Protected { $row = $sth->fetch(); // Handle 'SUM()' returning null if there are no results - //$span->end(); return $row["count"] ?? 0; } else if ($n_feed == Feeds::FEED_STARRED) { @@ -1007,7 +986,6 @@ class Feeds extends Handler_Protected { $label_id = Labels::feed_to_label_id($feed); - //$span->end(); return self::_get_label_unread($label_id, $owner_uid); } @@ -1027,7 +1005,6 @@ class Feeds extends Handler_Protected { $sth->execute([$owner_uid]); $row = $sth->fetch(); - //$span->end(); return $row["unread"]; } else { @@ -1040,7 +1017,6 @@ class Feeds extends Handler_Protected { $sth->execute([$feed, $owner_uid]); $row = $sth->fetch(); - //$span->end(); return $row["unread"]; } } @@ -1433,10 +1409,6 @@ class Feeds extends Handler_Protected { * @return array<int, mixed> $result, $feed_title, $feed_site_url, $last_error, $last_updated, $highlight_words, $first_id, $is_vfeed, $query_error_override */ static function _get_headlines($params): array { - - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); - $pdo = Db::pdo(); // WARNING: due to highly dynamic nature of this query its going to quote parameters @@ -1928,8 +1900,6 @@ class Feeds extends Handler_Protected { $res = $pdo->query($query); } - $span->end(); - return array($res, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id, $vfeed_query_part != "", $query_error_override); } @@ -2048,6 +2018,7 @@ class Feeds extends Handler_Protected { $entries = $xpath->query('/html/*[self::head or self::body]/link[@rel="alternate" and '. '(contains(@type,"rss") or contains(@type,"atom"))]|/html/*[self::head or self::body]/link[@rel="feed"]'); + /** @var DOMElement|null $entry */ foreach ($entries as $entry) { if ($entry->hasAttribute('href')) { $title = $entry->getAttribute('title'); diff --git a/classes/PluginHost.php b/classes/PluginHost.php index f3febc431..23ff03661 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -342,16 +342,8 @@ class PluginHost { */ function chain_hooks_callback(string $hook, Closure $callback, &...$args): void { $method = strtolower((string)$hook); - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent("chain_hooks_callback: $hook"); foreach ($this->get_hooks((string)$hook) as $plugin) { - //Debug::log("invoking: " . get_class($plugin) . "->$hook()", Debug::$LOG_VERBOSE); - - //$p_span = Tracer::start("$hook - " . get_class($plugin)); - - $span->addEvent("$hook - " . get_class($plugin)); - try { if ($callback($plugin->$method(...$args), $plugin)) break; @@ -360,11 +352,7 @@ class PluginHost { } catch (Error $err) { user_error($err, E_USER_WARNING); } - - //$p_span->end(); } - - //$span->end(); } /** @@ -430,9 +418,6 @@ class PluginHost { * @param PluginHost::KIND_* $kind */ function load_all(int $kind, ?int $owner_uid = null, bool $skip_init = false): void { - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); - $plugins = [...(glob("plugins/*") ?: []), ...(glob("plugins.local/*") ?: [])]; $plugins = array_filter($plugins, "is_dir"); $plugins = array_map("basename", $plugins); @@ -440,17 +425,12 @@ class PluginHost { asort($plugins); $this->load(join(",", $plugins), (int)$kind, $owner_uid, $skip_init); - - $span->end(); } /** * @param PluginHost::KIND_* $kind */ function load(string $classlist, int $kind, ?int $owner_uid = null, bool $skip_init = false): void { - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); - $plugins = explode(",", $classlist); $this->owner_uid = (int) $owner_uid; @@ -459,8 +439,6 @@ class PluginHost { $class = trim($class); $class_file = strtolower(basename(clean($class))); - $span->addEvent("$class_file: load"); - // try system plugin directory first $file = Config::get_self_dir() . "/plugins/$class_file/init.php"; @@ -485,8 +463,6 @@ class PluginHost { } $_SESSION["safe_mode"] = 1; - - $span->setAttribute('error', 'plugin is blacklisted'); continue; } @@ -497,8 +473,6 @@ class PluginHost { } catch (Error $err) { user_error($err, E_USER_WARNING); - - $span->setAttribute('error', $err); continue; } @@ -508,8 +482,6 @@ class PluginHost { if ($plugin_api < self::API_VERSION) { user_error("Plugin $class is not compatible with current API version (need: " . self::API_VERSION . ", got: $plugin_api)", E_USER_WARNING); - - $span->setAttribute('error', 'plugin is not compatible with API version'); continue; } @@ -518,8 +490,6 @@ class PluginHost { _bind_textdomain_codeset($class, "UTF-8"); } - $span->addEvent("$class_file: initialize"); - try { switch ($kind) { case $this::KIND_SYSTEM: @@ -549,7 +519,6 @@ class PluginHost { } $this->load_data(); - $span->end(); } function is_system(Plugin $plugin): bool { @@ -638,17 +607,12 @@ class PluginHost { } private function load_data(): void { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent('load plugin data'); - if ($this->owner_uid && !$this->data_loaded && Config::get_schema_version() > 100) { $sth = $this->pdo->prepare("SELECT name, content FROM ttrss_plugin_storage WHERE owner_uid = ?"); $sth->execute([$this->owner_uid]); while ($line = $sth->fetch()) { - $span->addEvent($line["name"] . ': unserialize'); - $this->storage[$line["name"]] = unserialize($line["content"]); } @@ -658,9 +622,6 @@ class PluginHost { private function save_data(string $plugin): void { if ($this->owner_uid) { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent(__METHOD__ . ": $plugin"); - if (!$this->pdo_data) $this->pdo_data = Db::instance()->pdo_connect(); diff --git a/classes/Pref_Feeds.php b/classes/Pref_Feeds.php index 8f6423801..5ca557c84 100644 --- a/classes/Pref_Feeds.php +++ b/classes/Pref_Feeds.php @@ -1077,9 +1077,6 @@ class Pref_Feeds extends Handler_Protected { * @return array<string, mixed> */ private function feedlist_init_cat(int $cat_id): array { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent(__METHOD__ . ": $cat_id"); - return [ 'id' => 'CAT:' . $cat_id, 'items' => array(), @@ -1094,9 +1091,6 @@ class Pref_Feeds extends Handler_Protected { * @return array<string, mixed> */ private function feedlist_init_feed(int $feed_id, ?string $title = null, bool $unread = false, string $error = '', string $updated = ''): array { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent(__METHOD__ . ": $feed_id"); - if (!$title) $title = Feeds::_get_title($feed_id, false); diff --git a/classes/RPC.php b/classes/RPC.php index e21671d78..ca8021877 100644 --- a/classes/RPC.php +++ b/classes/RPC.php @@ -106,8 +106,6 @@ class RPC extends Handler_Protected { } function getAllCounters(): void { - $span = Tracer::start(__METHOD__); - @$seq = (int) $_REQUEST['seq']; $feed_id_count = (int) ($_REQUEST["feed_id_count"] ?? -1); @@ -134,7 +132,6 @@ class RPC extends Handler_Protected { 'seq' => $seq ]; - $span->end(); print json_encode($reply); } @@ -176,8 +173,6 @@ class RPC extends Handler_Protected { } function sanityCheck(): void { - $span = Tracer::start(__METHOD__); - $_SESSION["hasSandbox"] = self::_param_to_bool($_REQUEST["hasSandbox"] ?? false); $_SESSION["clientTzOffset"] = clean($_REQUEST["clientTzOffset"]); @@ -209,8 +204,6 @@ class RPC extends Handler_Protected { } else { print Errors::to_json($error, $error_params); } - - $span->end(); } /*function completeLabels() { @@ -254,8 +247,6 @@ class RPC extends Handler_Protected { } static function updaterandomfeed_real(): void { - $span = Tracer::start(__METHOD__); - $default_interval = (int) Prefs::get_default(Prefs::DEFAULT_UPDATE_INTERVAL); // Test if the feed need a update (update interval exceded). @@ -344,8 +335,6 @@ class RPC extends Handler_Protected { } else { print json_encode(array("message" => "NOTHING_TO_UPDATE")); } - - $span->end(); } function updaterandomfeed(): void { @@ -401,8 +390,6 @@ class RPC extends Handler_Protected { } function log(): void { - $span = Tracer::start(__METHOD__); - $msg = clean($_REQUEST['msg'] ?? ""); $file = basename(clean($_REQUEST['file'] ?? "")); $line = (int) clean($_REQUEST['line'] ?? 0); @@ -414,13 +401,9 @@ class RPC extends Handler_Protected { echo json_encode(array("message" => "HOST_ERROR_LOGGED")); } - - $span->end(); } function checkforupdates(): void { - $span = Tracer::start(__METHOD__); - $rv = ["changeset" => [], "plugins" => []]; $version = Config::get_version(false); @@ -446,8 +429,6 @@ class RPC extends Handler_Protected { $rv["plugins"] = Pref_Prefs::_get_updated_plugins(); } - $span->end(); - print json_encode($rv); } @@ -455,8 +436,6 @@ class RPC extends Handler_Protected { * @return array<string, mixed> */ private function _make_init_params(): array { - $span = Tracer::start(__METHOD__); - $params = array(); foreach ([Prefs::ON_CATCHUP_SHOW_NEXT_FEED, Prefs::HIDE_READ_FEEDS, @@ -509,8 +488,6 @@ class RPC extends Handler_Protected { $params["icon_blank"] = $this->image_to_base64("images/blank_icon.gif"); $params["labels"] = Labels::get_all($_SESSION["uid"]); - $span->end(); - return $params; } @@ -530,8 +507,6 @@ class RPC extends Handler_Protected { * @return array<string, mixed> */ static function _make_runtime_info(): array { - $span = Tracer::start(__METHOD__); - $data = array(); $pdo = Db::pdo(); @@ -597,8 +572,6 @@ class RPC extends Handler_Protected { } } - $span->end(); - return $data; } diff --git a/classes/RSSUtils.php b/classes/RSSUtils.php index 10cfb6d43..cfd0b3b61 100644 --- a/classes/RSSUtils.php +++ b/classes/RSSUtils.php @@ -69,8 +69,6 @@ class RSSUtils { * @param array<string, false|string> $options */ static function update_daemon_common(int $limit = 0, array $options = []): int { - $span = Tracer::start(__METHOD__); - if (!$limit) $limit = Config::get(Config::DAEMON_FEED_LIMIT); if (Config::get_schema_version() != Config::SCHEMA_VERSION) { @@ -312,8 +310,6 @@ class RSSUtils { // Send feed digests by email if needed. Digest::send_headlines_digests(); - $span->end(); - return $nf; } @@ -380,9 +376,6 @@ class RSSUtils { static function update_rss_feed(int $feed, bool $no_cache = false, bool $html_output = false) : bool { - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); - Debug::enable_html($html_output); Debug::log("start", Debug::LOG_VERBOSE); @@ -418,19 +411,16 @@ class RSSUtils { if ($user) { if ($user->access_level == UserHelper::ACCESS_LEVEL_READONLY) { Debug::log("error: denied update for $feed: permission denied by owner access level"); - $span->end(); return false; } } else { // this would indicate database corruption of some kind Debug::log("error: owner not found for feed: $feed"); - $span->end(); return false; } } else { Debug::log("error: feeds table record not found for feed: $feed"); - $span->end(); return false; } @@ -589,7 +579,6 @@ class RSSUtils { $feed_obj->save(); } - $span->end(); return $error_message == ""; } @@ -731,7 +720,6 @@ class RSSUtils { ]); $feed_obj->save(); - $span->end(); return true; // no articles } @@ -740,8 +728,6 @@ class RSSUtils { $tstart = time(); foreach ($items as $item) { - $a_span = Tracer::start('article'); - $pdo->beginTransaction(); Debug::log(Debug::SEPARATOR, Debug::LOG_VERBOSE); @@ -1327,7 +1313,6 @@ class RSSUtils { Debug::log("article processed.", Debug::LOG_VERBOSE); $pdo->commit(); - $a_span->end(); } Debug::log(Debug::SEPARATOR, Debug::LOG_VERBOSE); @@ -1368,12 +1353,10 @@ class RSSUtils { unset($rss); Debug::log("update failed.", Debug::LOG_VERBOSE); - $span->end(); return false; } Debug::log("update done.", Debug::LOG_VERBOSE); - $span->end(); return true; } @@ -1446,6 +1429,7 @@ class RSSUtils { $entries = $xpath->query('(//img[@src]|//source[@src|@srcset]|//video[@poster|@src])'); + /** @var DOMElement $entry */ foreach ($entries as $entry) { foreach (array('src', 'poster') as $attr) { if ($entry->hasAttribute($attr) && strpos($entry->getAttribute($attr), "data:") !== 0) { @@ -1538,8 +1522,6 @@ class RSSUtils { * @return array<int, array<string, string>> An array of filter action arrays with keys "type" and "param" */ static function get_article_filters(array $filters, string $title, string $content, string $link, string $author, array $tags, ?array &$matched_rules = null, ?array &$matched_filters = null): array { - $span = Tracer::start(__METHOD__); - $matches = array(); foreach ($filters as $filter) { @@ -1626,8 +1608,6 @@ class RSSUtils { } } - $span->end(); - return $matches; } @@ -2033,20 +2013,21 @@ class RSSUtils { $xpath = new DOMXPath($doc); $base = $xpath->query('/html/head/base[@href]'); + + /** @var DOMElement $b */ foreach ($base as $b) { $url = UrlHelper::rewrite_relative($url, $b->getAttribute("href")); break; } $entries = $xpath->query('/html/head/link[@rel="shortcut icon" or @rel="icon" or @rel="alternate icon"]'); - if (count($entries) > 0) { - foreach ($entries as $entry) { - $favicon_url = UrlHelper::rewrite_relative($url, $entry->getAttribute("href")); - if ($favicon_url) - array_push($favicon_urls, $favicon_url); + /** @var DOMElement $entry */ + foreach ($entries as $entry) { + $favicon_url = UrlHelper::rewrite_relative($url, $entry->getAttribute("href")); - } + if ($favicon_url) + array_push($favicon_urls, $favicon_url); } } } diff --git a/classes/Sanitizer.php b/classes/Sanitizer.php index 2a5b031df..0bbb30586 100644 --- a/classes/Sanitizer.php +++ b/classes/Sanitizer.php @@ -9,6 +9,8 @@ class Sanitizer { $entries = $xpath->query('//*'); foreach ($entries as $entry) { + /** @var DOMElement $entry */ + if (!in_array($entry->nodeName, $allowed_elements)) { $entry->parentNode->removeChild($entry); } @@ -63,9 +65,6 @@ class Sanitizer { * @return false|string The HTML, or false if an error occurred. */ public static function sanitize(string $str, ?bool $force_remove_images = false, ?int $owner = null, ?string $site_url = null, ?array $highlight_words = null, ?int $article_id = null) { - $span = OpenTelemetry\API\Trace\Span::getCurrent(); - $span->addEvent("Sanitizer::sanitize"); - if (!$owner && isset($_SESSION["uid"])) $owner = $_SESSION["uid"]; @@ -81,6 +80,7 @@ class Sanitizer { $entries = $xpath->query('(//a[@href]|//img[@src]|//source[@srcset|@src]|//video[@poster])'); + /** @var DOMElement $entry */ foreach ($entries as $entry) { if ($entry->hasAttribute('href')) { @@ -143,6 +143,8 @@ class Sanitizer { } $entries = $xpath->query('//iframe'); + + /** @var DOMElement $entry */ foreach ($entries as $entry) { if (!self::iframe_whitelisted($entry)) { $entry->setAttribute('sandbox', 'allow-scripts'); diff --git a/classes/Tracer.php b/classes/Tracer.php deleted file mode 100644 index 7163adb90..000000000 --- a/classes/Tracer.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php - -use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator; -use OpenTelemetry\API\Trace\SpanContextInterface; -use OpenTelemetry\API\Trace\SpanInterface; -use OpenTelemetry\API\Trace\SpanKind; -use OpenTelemetry\API\Trace\TraceFlags; -use OpenTelemetry\API\Trace\TraceStateInterface; -use OpenTelemetry\Context\ContextInterface; -use OpenTelemetry\Context\ContextKey; -use OpenTelemetry\Context\ContextKeyInterface; -use OpenTelemetry\Context\ImplicitContextKeyedInterface; -use OpenTelemetry\Context\ScopeInterface; -use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; -use OpenTelemetry\Contrib\Otlp\SpanExporter; -use OpenTelemetry\SDK\Common\Attribute\Attributes; -use OpenTelemetry\SDK\Resource\ResourceInfo; -use OpenTelemetry\SDK\Resource\ResourceInfoFactory; -use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler; -use OpenTelemetry\SDK\Trace\Sampler\ParentBased; -use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor; -use OpenTelemetry\SDK\Trace\TracerProvider; -use OpenTelemetry\SemConv\ResourceAttributes; - -class DummyContextInterface implements ContextInterface { - - /** @var DummyContextInterface */ - private static $instance; - - public function __construct() { - self::$instance = $this; - } - - /** @phpstan-ignore-next-line */ - public static function createKey(string $key): ContextKeyInterface { return new ContextKey(); } - - public static function getCurrent(): ContextInterface { return self::$instance; } - - public function activate(): ScopeInterface { return new DummyScopeInterface(); } - - public function with(ContextKeyInterface $key, $value): ContextInterface { return $this; } - - public function withContextValue(ImplicitContextKeyedInterface $value): ContextInterface { return $this; } - - public function get(ContextKeyInterface $key) { return new ContextKey(); } - -} - -class DummySpanContextInterface implements SpanContextInterface { - - /** @var DummySpanContextInterface $instance */ - private static $instance; - - public function __construct() { - self::$instance = $this; - } - - public static function createFromRemoteParent(string $traceId, string $spanId, int $traceFlags = TraceFlags::DEFAULT, ?TraceStateInterface $traceState = null): SpanContextInterface { return self::$instance; } - - public static function getInvalid(): SpanContextInterface { return self::$instance; } - - public static function create(string $traceId, string $spanId, int $traceFlags = TraceFlags::DEFAULT, ?TraceStateInterface $traceState = null): SpanContextInterface { return self::$instance; } - - public function getTraceId(): string { return ""; } - - public function getTraceIdBinary(): string { return ""; } - - public function getSpanId(): string { return ""; } - - public function getSpanIdBinary(): string { return ""; } - - public function getTraceFlags(): int { return 0; } - - public function getTraceState(): ?TraceStateInterface { return null; } - - public function isValid(): bool { return false; } - - public function isRemote(): bool { return false; } - - public function isSampled(): bool { return false; } -} - -class DummyScopeInterface implements ScopeInterface { - public function detach(): int { return 0; } -} - -class DummySpanInterface implements SpanInterface { - - /** @var DummySpanInterface $instance */ - private static $instance; - - public function __construct() { - self::$instance = $this; - } - - public static function fromContext(ContextInterface $context): SpanInterface { return self::$instance; } - - public static function getCurrent(): SpanInterface { return self::$instance; } - - public static function getInvalid(): SpanInterface { return self::$instance; } - - public static function wrap(SpanContextInterface $spanContext): SpanInterface { return self::$instance; } - - public function getContext(): SpanContextInterface { return new DummySpanContextInterface(); } - - public function isRecording(): bool { return false; } - - /** @phpstan-ignore-next-line */ - public function setAttribute(string $key, $value): SpanInterface { return self::$instance; } - - /** @phpstan-ignore-next-line */ - public function setAttributes(iterable $attributes): SpanInterface { return self::$instance; } - - /** @phpstan-ignore-next-line */ - public function addEvent(string $name, iterable $attributes = [], ?int $timestamp = null): SpanInterface { return $this; } - - /** @phpstan-ignore-next-line */ - public function recordException(Throwable $exception, iterable $attributes = []): SpanInterface { return $this; } - - public function updateName(string $name): SpanInterface { return $this; } - - public function setStatus(string $code, ?string $description = null): SpanInterface { return $this; } - - public function end(?int $endEpochNanos = null): void { } - - public function activate(): ScopeInterface { return new DummyScopeInterface(); } - - public function storeInContext(ContextInterface $context): ContextInterface { return new DummyContextInterface(); } - -} - -class Tracer { - /** @var Tracer $instance */ - private static $instance = null; - - /** @var OpenTelemetry\SDK\Trace\TracerProviderInterface $tracerProvider */ - private $tracerProvider = null; - - /** @var OpenTelemetry\API\Trace\TracerInterface $tracer */ - private $tracer = null; - - public function __construct() { - $OPENTELEMETRY_ENDPOINT = Config::get(Config::OPENTELEMETRY_ENDPOINT); - - if ($OPENTELEMETRY_ENDPOINT) { - $transport = (new OtlpHttpTransportFactory())->create($OPENTELEMETRY_ENDPOINT, 'application/x-protobuf'); - $exporter = new SpanExporter($transport); - - $resource = ResourceInfoFactory::emptyResource()->merge( - ResourceInfo::create(Attributes::create( - [ResourceAttributes::SERVICE_NAME => Config::get(Config::OPENTELEMETRY_SERVICE)] - ), ResourceAttributes::SCHEMA_URL), - ); - - $this->tracerProvider = TracerProvider::builder() - ->addSpanProcessor(new SimpleSpanProcessor($exporter)) - ->setResource($resource) - ->setSampler(new ParentBased(new AlwaysOnSampler())) - ->build(); - - $this->tracer = $this->tracerProvider->getTracer('io.opentelemetry.contrib.php'); - - $context = TraceContextPropagator::getInstance()->extract(getallheaders()); - - $span = $this->tracer->spanBuilder($_SESSION['name'] ?? 'not logged in') - ->setParent($context) - ->setSpanKind(SpanKind::KIND_SERVER) - ->setAttribute('php.request', json_encode($_REQUEST)) - ->setAttribute('php.server', json_encode($_SERVER)) - ->setAttribute('php.session', json_encode($_SESSION ?? [])) - ->startSpan(); - - $scope = $span->activate(); - - register_shutdown_function(function() use ($span, $scope) { - $span->end(); - $scope->detach(); - $this->tracerProvider->shutdown(); - }); - } - } - - /** - * @param string $name - * @return OpenTelemetry\API\Trace\SpanInterface - */ - private function _start(string $name) { - if ($this->tracer != null) { - $span = $this->tracer - ->spanBuilder($name) - ->setSpanKind(SpanKind::KIND_SERVER) - ->startSpan(); - - $span->activate(); - } else { - $span = new DummySpanInterface(); - } - - return $span; - } - - /** - * @param string $name - * @return OpenTelemetry\API\Trace\SpanInterface - */ - public static function start(string $name) { - return self::get_instance()->_start($name); - } - - public static function get_instance() : Tracer { - if (self::$instance == null) - self::$instance = new self(); - - return self::$instance; - } -} diff --git a/classes/UrlHelper.php b/classes/UrlHelper.php index ba1f474bc..bd9eff71d 100644 --- a/classes/UrlHelper.php +++ b/classes/UrlHelper.php @@ -202,8 +202,6 @@ class UrlHelper { * @return false|string */ static function resolve_redirects(string $url, int $timeout) { - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); $client = self::get_client(); try { @@ -218,14 +216,11 @@ class UrlHelper { ], ]); } catch (Exception $ex) { - $span->setAttribute('error', (string) $ex); - $span->end(); return false; } // If a history header value doesn't exist there was no redirection and the original URL is fine. $history_header = $response->getHeader(GuzzleHttp\RedirectMiddleware::HISTORY_HEADER); - $span->end(); return ($history_header ? end($history_header) : $url); } @@ -238,8 +233,6 @@ class UrlHelper { public static function fetch($options /* previously: 0: $url , 1: $type = false, 2: $login = false, 3: $pass = false, 4: $post_query = false, 5: $timeout = false, 6: $timestamp = 0, 7: $useragent = false, 8: $encoding = false, 9: $auth_type = "basic" */) { - $span = Tracer::start(__METHOD__); - $span->setAttribute('func.args', json_encode(func_get_args())); self::$fetch_last_error = ""; self::$fetch_last_error_code = -1; @@ -299,8 +292,6 @@ class UrlHelper { if (!$url) { self::$fetch_last_error = 'Requested URL failed extended validation.'; - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } @@ -309,8 +300,6 @@ class UrlHelper { if (!$ip_addr || strpos($ip_addr, '127.') === 0) { self::$fetch_last_error = "URL hostname failed to resolve or resolved to a loopback address ($ip_addr)"; - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } @@ -392,8 +381,6 @@ class UrlHelper { } catch (\LengthException $ex) { // Either 'Content-Length' indicated the download limit would be exceeded, or the transfer actually exceeded the download limit. self::$fetch_last_error = $ex->getMessage(); - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } catch (GuzzleHttp\Exception\GuzzleException $ex) { self::$fetch_last_error = $ex->getMessage(); @@ -407,7 +394,6 @@ class UrlHelper { // to attempt compatibility with unusual configurations. if ($login && $pass && self::$fetch_last_error_code === 403 && $auth_type !== 'any') { $options['auth_type'] = 'any'; - $span->end(); return self::fetch($options); } @@ -424,15 +410,11 @@ class UrlHelper { if (($errno === \CURLE_WRITE_ERROR || $errno === \CURLE_BAD_CONTENT_ENCODING) && $ex->getRequest()->getHeaderLine('accept-encoding') !== 'none') { $options['encoding'] = 'none'; - $span->end(); return self::fetch($options); } } } - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); - return false; } @@ -449,8 +431,6 @@ class UrlHelper { // This shouldn't be necessary given the checks that occur during potential redirects, but we'll do it anyway. if (!self::validate(self::$fetch_effective_url, true)) { self::$fetch_last_error = "URL received after redirection failed extended validation."; - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } @@ -459,8 +439,6 @@ class UrlHelper { if (!self::$fetch_effective_ip_addr || strpos(self::$fetch_effective_ip_addr, '127.') === 0) { self::$fetch_last_error = 'URL hostname received after redirection failed to resolve or resolved to a loopback address (' . self::$fetch_effective_ip_addr . ')'; - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } @@ -468,12 +446,9 @@ class UrlHelper { if (!$body) { self::$fetch_last_error = 'Successful response, but no content was received.'; - $span->setAttribute('error', self::$fetch_last_error); - $span->end(); return false; } - $span->end(); return $body; } |