Re: POC: Extension for adding distributed tracing - pg_tracing

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Anthonin Bonnefoy <anthonin(dot)bonnefoy(at)datadoghq(dot)com>, Peter Smith <smithpb2250(at)gmail(dot)com>
Cc: Jelte Fennema-Nio <postgres(at)jeltef(dot)nl>, Aleksander Alekseev <aleksander(at)timescale(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>, Nikita Malakhov <hukutoc(at)gmail(dot)com>, Craig Ringer <craig(dot)ringer(at)enterprisedb(dot)com>, Shlok Kyal <shlok(dot)kyal(dot)oss(at)gmail(dot)com>
Subject: Re: POC: Extension for adding distributed tracing - pg_tracing
Date: 2024-02-02 12:41:18
Message-ID: 787b5ad0-f727-473c-ba25-5b9f6813fb80@iki.fi
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Anthonin,

I'm only now catching up on this thread. Very exciting feature!

My first observation is that you were able to implement this purely as
an extension, without any core changes. That's very cool, because:

- You don't need buy-in or blessing from anyone else. You can just put
this on github and people can immediately start using it.
- As an extension, it's not tied to the PostgreSQL release cycle. Users
can immediately start using it with existing PostgreSQL versions.

There are benefits to being in contrib/ vs. an extension outside the
PostgreSQL source tree, but there are significant downsides too.
Out-of-tree, you get more flexibility, and you can develop much faster.
I think this should live out-of-tree, at least until it's relatively
stable. By stable, I mean "not changing much", not that it's bug-free.

# Core changes

That said, there are a lot of things that would make sense to integrate
in PostgreSQL itself. For example:

- You're relying on various existing hooks, but it might be better to
have the 'begin_span'/'end_span' calls directly in PostgreSQL source
code in the right places. There are more places where spans might be
nice, like when performing a large sort in tuplesort.c to name one
example. Or even across every I/O; not sure how much overhead the spans
incur and how much we'd be willing to accept. 'begin_span'/'end_span'
could be new hooks that normally do nothing, but your extension would
implement them.

- Other extensions could include begin_span/end_span calls too. (It's
complicated for an extension to call functions in another extension.)

- Extensions like postgres_fdw could get the tracing context and
propagate it to the remote system too.

- How to pass the tracing context from the client? You went with
SQLCommenter and others proposed a GUC. A protocol extension would make
sense too. I can see merits to all of those. It probably would be good
to support multiple mechanisms, but some might need core changes. It
might be good to implement the mechanism for accepting trace context in
core. Without the extension, we could still include the trace ID in the
logs, for example.

# Further ideas

Some ideas on cool extra features on top of this:

- SQL functions to begin/end a span. Could be handy if you have
complicated PL/pgSQL functions, for example.
- Have spans over subtransactions.
- Include elog() messages in the traces. You might want to have a lower
elevel for what's included in traces; something like the
client_min_messages and log_min_messages settings.
- Include EXPLAIN plans in the traces.

# Comments on the implementation

There was discussion already on push vs pull model. Currently, you
collect the traces in memory / files, and require a client to poll them.
A push model is more common in applications that support tracing. If
Postgres could connect directly to the OTEL collector, you'd need one
fewer running component. You could keep the traces in backend-private
memory, no need to deal with shared memory and spilling to files.

Admittedly supporting the OTEL wire protocol is complicated unless you
use an existing library. Nevertheless, it might be a better tradeoff.
OTEL/HTTP with JSON format seems just about feasible to implement from
scratch. Or bite the bullet and use some external library. If this lives
as an extension, you have more freedom to rely on 3rd party libraries.

(If you publish this as an out-of-tree extension, then this is up to
you, of course, and doesn't need consensus here on pgsql-hackers)

# Suggested next steps with this

Here's how I'd suggest to proceed with this:

1. Publish this as an extension on github, as it is. I think you'll get
a lot of immediate adoption.

2. Start a new pgsql-hackers thread on in-core changes that would
benefit the extension. Write patches for them. I'm thinking of the
things I listed in the Core changes section above, but maybe there are
others.

PS. Does any other DBMS implement this? Any lessons to be learned from them?

--
Heikki Linnakangas
Neon (https://neon.tech)

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Thomas Munro 2024-02-02 13:42:46 Re: InstallXLogFileSegment() vs concurrent WAL flush
Previous Message Alvaro Herrera 2024-02-02 12:19:38 Re: [EXTERNAL] Re: Add non-blocking version of PQcancel