Golang ORM Performance and Errors Monitoring

OpenTelemetry

Bun relies on OpenTelemetry to monitor database performance and errors using distributed tracingopen in new window and metricsopen in new window.

OpenTelemetryopen 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.

Bun comes with an OpenTelemetry instrumentation called bunotelopen in new window that is distributed as a separate module:

go get github.com/uptrace/bun/extra/bunotel

To instrument Bun database, you need to add the hook provided by bunotel:

import "github.com/uptrace/bun/extra/bunotel"

db := bun.NewDB(sqldb, dialect)
db.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("mydb")))

To make tracing work, you must use the active span contextopen in new window when executing queries, for example:

ctx := req.Context()
err := db.NewSelect().Scan(ctx)

As expected, Bun creates spansopen in new window for processed queries and records any errors as they occur. Here is how the collected information is displayed at Uptraceopen in new window:

Bun trace

You can find a runnable example at GitHubopen in new window.

Prometheus

You can send OpenTelemetry metrics to Prometheus using OpenTelemetry Prometheus exporteropen in new window. Alternatively, you can also use j2gg0s/otsqlopen in new window that directly works with Prometheus.

See also

Last Updated: