Chore: Update pyroscope error sources logging (#113175)

* remove loggers

* more downstream errors

* more downstream errors 2

* uber nit
This commit is contained in:
ismail simsek
2025-11-10 17:47:29 +01:00
committed by GitHub
parent 70e30df6ce
commit ac9259d6a4
3 changed files with 37 additions and 69 deletions
@@ -3,7 +3,6 @@ package pyroscope
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"slices"
@@ -46,16 +45,13 @@ type PyroscopeDatasource struct {
// NewPyroscopeDatasource creates a new datasource instance.
func NewPyroscopeDatasource(ctx context.Context, httpClientProvider httpclient.Provider, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
ctxLogger := logger.FromContext(ctx)
opt, err := settings.HTTPClientOptions(ctx)
if err != nil {
ctxLogger.Error("Failed to get HTTP client options", "error", err, "function", logEntrypoint())
return nil, err
return nil, backend.DownstreamErrorf("failed to get HTTP client options: %w. function: %s", err, logEntrypoint())
}
httpClient, err := httpClientProvider.New(opt)
if err != nil {
ctxLogger.Error("Failed to create HTTP client", "error", err, "function", logEntrypoint())
return nil, err
return nil, backend.DownstreamErrorf("failed to create HTTP client: %w. function: %s", err, logEntrypoint())
}
return &PyroscopeDatasource{
@@ -88,12 +84,9 @@ func (d *PyroscopeDatasource) CallResource(ctx context.Context, req *backend.Cal
}
func (d *PyroscopeDatasource) profileTypes(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
ctxLogger := logger.FromContext(ctx)
u, err := url.Parse(req.URL)
if err != nil {
ctxLogger.Error("Failed to parse URL", "error", err, "function", logEntrypoint())
return backend.DownstreamErrorf("URL could not be parsed: %w", err)
return backend.DownstreamErrorf("URL could not be parsed: %w. function: %s", err, logEntrypoint())
}
query := u.Query()
@@ -101,14 +94,12 @@ func (d *PyroscopeDatasource) profileTypes(ctx context.Context, req *backend.Cal
if query.Has("start") && query.Has("end") {
start, err = strconv.ParseInt(query.Get("start"), 10, 64)
if err != nil {
ctxLogger.Error("Failed to parse start as int", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("failed to parse start as int: %w", err))
return backend.DownstreamErrorf("failed to parse start as int: %w. function: %s", err, logEntrypoint())
}
end, err = strconv.ParseInt(query.Get("end"), 10, 64)
if err != nil {
ctxLogger.Error("Failed to parse end as int", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("failed to parse end as int: %w", err))
return backend.DownstreamErrorf("failed to parse end as int: %w. function: %s", err, logEntrypoint())
}
} else {
// Make sure to pass a valid time range to the client as v2 will not work without it.
@@ -118,29 +109,23 @@ func (d *PyroscopeDatasource) profileTypes(ctx context.Context, req *backend.Cal
types, err := d.client.ProfileTypes(ctx, start, end)
if err != nil {
ctxLogger.Error("Received error from client", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("received error from client: %w. function: %s", err, logEntrypoint())
}
bodyData, err := json.Marshal(types)
if err != nil {
ctxLogger.Error("Failed to marshal response", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("failed to marshal response: %w. function: %s", err, logEntrypoint())
}
err = sender.Send(&backend.CallResourceResponse{Body: bodyData, Status: 200})
if err != nil {
ctxLogger.Error("Failed to send response", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("failed to send response: %w. function: %s", err, logEntrypoint())
}
return nil
}
func (d *PyroscopeDatasource) labelNames(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
ctxLogger := logger.FromContext(ctx)
u, err := url.Parse(req.URL)
if err != nil {
ctxLogger.Error("Failed to parse URL", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("URL could not be parsed: %w", err))
return backend.DownstreamErrorf("URL could not be parsed: %w. function: %s", err, logEntrypoint())
}
query := u.Query()
@@ -149,14 +134,12 @@ func (d *PyroscopeDatasource) labelNames(ctx context.Context, req *backend.CallR
labelSelector := query.Get("query")
matchers, err := parser.ParseMetricSelector(labelSelector)
if err != nil {
ctxLogger.Error("Could not parse label selector", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("failed parsing label selector: %v", err))
return backend.DownstreamErrorf("failed parsing label selector: %w. function: %s", err, logEntrypoint())
}
labelNames, err := d.client.LabelNames(ctx, labelSelector, start, end)
if err != nil {
ctxLogger.Error("Received error from client", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("error calling LabelNames: %v", err))
return backend.DownstreamErrorf("error calling LabelNames: %w. function: %s", err, logEntrypoint())
}
finalLabels := make([]string, 0)
@@ -171,13 +154,11 @@ func (d *PyroscopeDatasource) labelNames(ctx context.Context, req *backend.CallR
jsonResponse, err := json.Marshal(finalLabels)
if err != nil {
ctxLogger.Error("Failed to marshal response", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("failed to marshal response: %w. function: %s", err, logEntrypoint())
}
err = sender.Send(&backend.CallResourceResponse{Body: jsonResponse, Status: 200})
if err != nil {
ctxLogger.Error("Failed to send response", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("failed to send response: %w. function: %s", err, logEntrypoint())
}
return nil
}
@@ -190,11 +171,9 @@ type LabelValuesPayload struct {
}
func (d *PyroscopeDatasource) labelValues(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
ctxLogger := logger.FromContext(ctx)
u, err := url.Parse(req.URL)
if err != nil {
ctxLogger.Error("Failed to parse URL", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("URL could not be parsed: %w", err))
return backend.DownstreamErrorf("URL could not be parsed: %w. function: %s", err, logEntrypoint())
}
query := u.Query()
@@ -204,20 +183,17 @@ func (d *PyroscopeDatasource) labelValues(ctx context.Context, req *backend.Call
res, err := d.client.LabelValues(ctx, label, query.Get("query"), start, end)
if err != nil {
ctxLogger.Error("Received error from client", "error", err, "function", logEntrypoint())
return backend.DownstreamError(fmt.Errorf("error calling LabelValues: %v", err))
return backend.DownstreamErrorf("error calling LabelValues: %w. function: %s", err, logEntrypoint())
}
data, err := json.Marshal(res)
if err != nil {
ctxLogger.Error("Failed to marshal response", "error", err, "function", logEntrypoint())
return backend.DownstreamErrorf("failed to marshall response: %w", err)
return backend.DownstreamErrorf("failed to marshall response: %w. function: %s", err, logEntrypoint())
}
err = sender.Send(&backend.CallResourceResponse{Body: data, Status: 200})
if err != nil {
ctxLogger.Error("Failed to send response", "error", err, "function", logEntrypoint())
return err
return backend.DownstreamErrorf("failed to send response: %w. function: %s", err, logEntrypoint())
}
return nil
@@ -227,13 +203,10 @@ func (d *PyroscopeDatasource) labelValues(ctx context.Context, req *backend.Call
// for all known profile types, including their aggregation type (cumulative/instant),
// units, descriptions, and grouping information.
func (d *PyroscopeDatasource) profileMetadata(ctx context.Context, _ *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
ctxLogger := logger.FromContext(ctx)
registry := GetProfileMetadataRegistry()
jsonData, err := json.Marshal(registry.profiles)
if err != nil {
ctxLogger.Error("Failed to marshal profile metadata", "error", err, "function", logEntrypoint())
return sender.Send(&backend.CallResourceResponse{
Status: 500,
Body: []byte(`{"error": "Failed to marshal profile metadata"}`),