[librsvg: 5/45] Convert the observability doc to rst




commit 143b02fa460d126aba0b61de9a1663a60ae7d958
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Aug 19 11:37:57 2022 -0500

    Convert the observability doc to rst
    
    Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/731>

 devel-docs/api-observability.md  | 185 ------------------------------------
 devel-docs/api_observability.rst | 196 +++++++++++++++++++++++++++++++++++++++
 devel-docs/index.rst             |   4 +-
 3 files changed, 198 insertions(+), 187 deletions(-)
---
diff --git a/devel-docs/api_observability.rst b/devel-docs/api_observability.rst
new file mode 100644
index 000000000..5a19b424b
--- /dev/null
+++ b/devel-docs/api_observability.rst
@@ -0,0 +1,196 @@
+Observability
+=============
+
+Librsvg supports basic, mostly ad-hoc logging with an ``RSVG_LOG=1``
+environment variable. This has not been very effective in letting me,
+the maintainer, know what went wrong when someone reports a bug about
+librsvg doing the wrong thing in an application. Part of it is because
+the code could be more thorough about logging (e.g. log at all error
+points), but also part of it is that there is no logging about what API
+calls are made into the library. On each bug reported on behalf of a
+particular application, my thought process goes something like this:
+
+-  What was the app doing?
+
+-  Can I obtain the problematic SVG?
+
+-  Does the bug reporter even know what the problematic SVG was?
+
+-  Was the app rendering with direct calls to the librsvg API?
+
+-  Or was it using the gdk-pixbuf loader, and thus has very little
+   control of how librsvg is used?
+
+-  If non-pixbuf, what was the Cairo state when librsvg was called?
+
+-  What sort of interesting API calls are being used? Stylesheet
+   injection? Re-rendering single elements with different styles?
+
+And every time, I must ask the bug reporter for information related to
+that, or to point me to the relevant source code where they were using
+librsvg… which is not terribly useful, since building their code and
+reproducing the bug with it is A Yak That Should Not Have To Be Shaved.
+
+Desiderata
+----------
+
+Know exactly what an application did with librsvg:
+
+-  All API calls and their parameters.
+
+-  State of the Cairo context at entry.
+
+-  “What SVG?” - be careful and explicit about exfiltrating SVG data to
+   the logs.
+
+-  Basic platform stuff? Is the platform triple enough? Distro ID?
+
+-  Versions of dependencies.
+
+-  Version of librsvg itself.
+
+Internals of the library:
+
+-  Regular debug tracing. We may have options to enable/disable tracing
+   domains: parsing, cascading, referencing elements, temporary surfaces
+   during filtering, render tree, etc.
+
+-  Log all points where an error is detected/generated, even if it will
+   be discarded later (e.g. invalid CSS values are silently ignored, per
+   the spec).
+
+Enabling logging
+----------------
+
+It may be useful to be able to enable logging in various ways:
+
+-  Programmatically, for when one has control of the source code of the
+   problematic application. Enable logging at the problem spot, for the
+   SVG you know that exhibits the problem, and be done with it. This can
+   probably be at the individual ``RsvgHandle`` level, not globally. For
+   global logging within a single process, see the next point.
+
+-  For a single process which one can easily launch via the command
+   line; e.g. with an environment variable. This works well for
+   non-sandboxed applications. Something like
+   ``RSVG_LOG_CONFIG=my_log_config.toml``.
+
+-  With a configuration file, a la ``~/.config/librsvg.toml``. Many
+   programs use librsvg and you don’t want logs for all of them; allow
+   the configuration file to specify a process name, or maybe other ways
+   of determining when to log. For session programs like gnome-shell,
+   you can’t easily set an environment variable to enable logging -
+   hence, a configuration file that only turns on logging from the
+   gnome-shell process.
+
+All of the above should be well documented, and then we can deprecate
+``RSVG_LOG``.
+
+Which SVG caused a crash?
+-------------------------
+
+Every once in a while, a bug report comes in like “$application crashed
+in librsvg”. The application renders many SVGs, often indirectly via
+gdk-pixbuf, and it is hard to know exactly which SVG caused the problem.
+Think of gnome-shell or gnome-software.
+
+For applications that call librsvg directly, if they pass the filename
+or a GFile then it is not hard to find out the source SVG.
+
+But for those that feed bytes into librsvg, including those that use it
+indirectly via gdk-pixbuf, librsvg has no knowledge of the filename. We
+need to use the base_uri then, or see if the pixbuf loader can be
+modified to propagate this information (is it even available from the
+GdkPixbufLoader machinery?).
+
+If all else fails, we can have an exfiltration mechanism. How can we
+avoid logging *all* the SVG data that gnome-shell renders, for example?
+Configure the logger to skip the first N SVGs, and hope that the order
+is deterministic? We can’t really “log only if there is a crash during
+rendering”.
+
+Log only the checksums of SVGs or data lengths, and use that to find
+which SVG caused the crash? I.e. have the user use a two-step process to
+find a crash: get a log (written synchronously) of all SVG
+checksums/lengths, and then reconfigure the logger to only exfiltrate
+the last one that got logged - presumably that one caused the crash.
+
+Which dynamically-created SVG caused a problem?
+-----------------------------------------------
+
+Consider a bug like
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5415 where an
+application dynamically generates an SVG and feeds it to librsvg. That
+bug was not a crash; it was about incorrect values returned from an
+librsvg API function. For those cases it may be useful to be able to
+exfiltrate an SVG and its stylesheets only if it matches a user-provided
+substring.
+
+Global configuration
+--------------------
+
+``$(XDG_CONFIG_HOME)/librsvg.toml`` - for startup-like processes like
+gnome-shell, for which it is hard to set an environment variable:
+
+Per-process configuration
+-------------------------
+
+``RSVG_LOG_CONFIG=my_log_config.toml my_process``
+
+Programmatic API
+----------------
+
+FIXME
+
+Configuration format
+--------------------
+
+.. code:: toml
+
+   [logging]
+   enabled=true
+   process=gnome-shell              # mandatory for global config - don't want to log all processes - warn 
to g_log if key is not set
+   output=/home/username/rsvg.log   # if missing, log to g_log only - or use a output_to_g_log=true instead?
+
+API logging
+-----------
+
+Log cr state at entry, surface type, starting transform.
+
+Log name/base_uri of rendered document.
+
+Can we know if it is a gresource? Or a byte buffer? Did it come from
+gdk-pixbuf?
+
+Log contents
+------------
+
+/home/username/rsvg.log - json doesn’t have comments; put one of these
+in a string somehow:
+
+::
+
+     ******************************************************************************
+     * This log file exists because you enabled logging in ~/.config/librsvg.toml *
+     * for the "gnome-shell" process.                                             *
+     *                                                                            *
+     * If you want to disable this kind of log, please turn it off in that file   *
+     * or delete that file entirely.                                              *
+     ******************************************************************************
+
+     ******************************************************************************
+     * This log file exists because you enabled logging with                      *
+     * RSVG_LOG_CONFIG=config.toml for the "single-process-name" process.         *
+     *                                                                            *
+     * If you want to disable this kind of log, FIXME                             */
+     ******************************************************************************
+
+To-do list
+----------
+
+- Audit code for GIO errors; log there.
+
+- Audit code for Cairo calls that yield errors; log there.
+
+- Log the entire ancestry of the element that caused the error? Is
+  that an insta-reproducer?
diff --git a/devel-docs/index.rst b/devel-docs/index.rst
index ddb1f68b4..0d8f08d0a 100644
--- a/devel-docs/index.rst
+++ b/devel-docs/index.rst
@@ -8,6 +8,7 @@ Development guide for librsvg
    contributing
    ci
    text_layout
+   api_observability
    :maxdepth: 1
    :caption: Contents:
 
@@ -61,13 +62,12 @@ request.  We can then discuss it before coding.  This way we will have
 a sort of big-picture development history apart from commit messages.
 
 - :doc:`text_layout`
+- :doc:`api_observability`
 
 See https://rustc-dev-guide.rust-lang.org/walkthrough.html, section
 Overview, to formalize the RFC process for features vs. drive-by
 contributions.
 
-FIXME: link the md here.
-
 Information for maintainers
 ---------------------------
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]