summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2024-10-01 14:54:29 +0000
committerAndrew Dolgov <fox@fakecake.org>2024-10-01 14:54:29 +0000
commitdf33ddaea1e46b5b923440d6383fa3ae85c4d60b (patch)
tree89c510638669466453c7451f5eb493f50e850de0 /classes
parent8fcc68baf5b0ff964a0a4a045353462586e0e316 (diff)
parent7e0f5f295c0480023098edca5e3f5a806bd93bab (diff)
Merge branch 'drop-opentelemetry' into 'master'
drop opentelemetry See merge request tt-rss/tt-rss!68
Diffstat (limited to 'classes')
-rw-r--r--classes/Article.php24
-rw-r--r--classes/Config.php10
-rw-r--r--classes/Counters.php14
-rw-r--r--classes/Digest.php3
-rw-r--r--classes/DiskCache.php46
-rw-r--r--classes/Feeds.php31
-rw-r--r--classes/PluginHost.php39
-rw-r--r--classes/Pref_Feeds.php6
-rw-r--r--classes/RPC.php27
-rw-r--r--classes/RSSUtils.php35
-rw-r--r--classes/Sanitizer.php8
-rw-r--r--classes/Tracer.php216
-rw-r--r--classes/UrlHelper.php25
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;
}