Chore: Update pyroscope error sources logging (#113175)
* remove loggers * more downstream errors * more downstream errors 2 * uber nit
This commit is contained in:
@@ -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"}`),
|
||||
|
||||
Reference in New Issue
Block a user