Golang ORM Performance and Errors Monitoring
What is OpenTelemetry?
Bun relies on OpenTelemetry to monitor database performance and errors using distributed tracing
open in new window and metrics
open in new window.
OpenTelemetry
open in new window is a vendor-neutral API for distributed traces and metrics. It specifies how to collect and send telemetry data to backend platforms. It means that you can instrument your application once and then add or change vendors (backends) as required.
OpenTelemetry instrumentaton
Bun comes with an OpenTelemetry instrumentation called bunotel
open in new window that is distributed as a separate module:
1. go get github.com/uptrace/bun/extra/bunotel
To instrument Bun database, you need to add the hook provided by bunotel:
1. import "github.com/uptrace/bun/extra/bunotel"
3. db := bun.NewDB(sqldb, dialect)
4. db.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("mydb")))
To make tracing work, you must use the active span context
open in new window when executing queries, for example:
1. ctx := req.Context()
2. err := db.NewSelect().Scan(ctx)
Uptrace
Uptrace
open in new window is an open source DataDog alternative
open in new window that helps developers pinpoint failures and find performance bottlenecks. Uptrace can process billions of spans on a single server and allows to monitor your software at 10x lower cost.
You can install Uptrace
open in new window by downloading a DEB/RPM package or a pre-compiled binary.
As expected, otelbun creates spans
open in new window for processed queries and records any errors as they occur. Here is how the collected information is displayed at Uptrace
open in new window:

You can find a runnable example at GitHub
open in new window.
Prometheus
You can send OpenTelemetry metrics to Prometheus using OpenTelemetry Prometheus exporter
open in new window. Alternatively, you can also use j2gg0s/otsql
open in new window that directly works with Prometheus.
