mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Update cloud monitoring and Azure data sources to support contextual logs (#57844)
* update cloud monitoring to use log from context * update azure monitor to use contextual logger
This commit is contained in:
@@ -8,6 +8,8 @@ import (
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
)
|
||||
|
||||
type annotationEvent struct {
|
||||
@@ -17,11 +19,11 @@ type annotationEvent struct {
|
||||
Text string
|
||||
}
|
||||
|
||||
func (s *Service) executeAnnotationQuery(ctx context.Context, req *backend.QueryDataRequest, dsInfo datasourceInfo) (
|
||||
func (s *Service) executeAnnotationQuery(ctx context.Context, logger log.Logger, req *backend.QueryDataRequest, dsInfo datasourceInfo) (
|
||||
*backend.QueryDataResponse, error) {
|
||||
resp := backend.NewQueryDataResponse()
|
||||
|
||||
queries, err := s.buildQueryExecutors(req)
|
||||
queries, err := s.buildQueryExecutors(logger, req)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
@@ -60,7 +62,7 @@ func (timeSeriesQuery cloudMonitoringTimeSeriesQuery) transformAnnotationToFrame
|
||||
frame.AppendRow(a.Time, a.Title, a.Tags, a.Text)
|
||||
}
|
||||
result.Frames = append(result.Frames, frame)
|
||||
slog.Info("anno", "len", len(annotations))
|
||||
timeSeriesQuery.logger.Info("anno", "len", len(annotations))
|
||||
}
|
||||
|
||||
func formatAnnotationText(annotationText string, pointValue string, metricType string, metricLabels map[string]string, resourceLabels map[string]string) string {
|
||||
|
||||
@@ -222,6 +222,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
|
||||
// QueryData takes in the frontend queries, parses them into the CloudMonitoring query format
|
||||
// executes the queries against the CloudMonitoring API and parses the response into data frames
|
||||
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||
logger := slog.FromContext(ctx)
|
||||
resp := backend.NewQueryDataResponse()
|
||||
if len(req.Queries) == 0 {
|
||||
return resp, fmt.Errorf("query contains no queries")
|
||||
@@ -240,20 +241,20 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
|
||||
switch model.Type {
|
||||
case "annotationQuery":
|
||||
resp, err = s.executeAnnotationQuery(ctx, req, *dsInfo)
|
||||
resp, err = s.executeAnnotationQuery(ctx, logger, req, *dsInfo)
|
||||
case "timeSeriesQuery":
|
||||
fallthrough
|
||||
default:
|
||||
resp, err = s.executeTimeSeriesQuery(ctx, req, *dsInfo)
|
||||
resp, err = s.executeTimeSeriesQuery(ctx, logger, req, *dsInfo)
|
||||
}
|
||||
|
||||
return resp, err
|
||||
}
|
||||
|
||||
func (s *Service) executeTimeSeriesQuery(ctx context.Context, req *backend.QueryDataRequest, dsInfo datasourceInfo) (
|
||||
func (s *Service) executeTimeSeriesQuery(ctx context.Context, logger log.Logger, req *backend.QueryDataRequest, dsInfo datasourceInfo) (
|
||||
*backend.QueryDataResponse, error) {
|
||||
resp := backend.NewQueryDataResponse()
|
||||
queryExecutors, err := s.buildQueryExecutors(req)
|
||||
queryExecutors, err := s.buildQueryExecutors(logger, req)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
@@ -304,7 +305,7 @@ func queryModel(query backend.DataQuery) (grafanaQuery, error) {
|
||||
return q, nil
|
||||
}
|
||||
|
||||
func (s *Service) buildQueryExecutors(req *backend.QueryDataRequest) ([]cloudMonitoringQueryExecutor, error) {
|
||||
func (s *Service) buildQueryExecutors(logger log.Logger, req *backend.QueryDataRequest) ([]cloudMonitoringQueryExecutor, error) {
|
||||
var cloudMonitoringQueryExecutors []cloudMonitoringQueryExecutor
|
||||
startTime := req.Queries[0].TimeRange.From
|
||||
endTime := req.Queries[0].TimeRange.To
|
||||
@@ -326,6 +327,7 @@ func (s *Service) buildQueryExecutors(req *backend.QueryDataRequest) ([]cloudMon
|
||||
cmtsf := &cloudMonitoringTimeSeriesFilter{
|
||||
RefID: query.RefID,
|
||||
GroupBys: []string{},
|
||||
logger: logger,
|
||||
}
|
||||
switch q.QueryType {
|
||||
case metricQueryType:
|
||||
@@ -369,7 +371,7 @@ func (s *Service) buildQueryExecutors(req *backend.QueryDataRequest) ([]cloudMon
|
||||
cmtsf.Params = params
|
||||
|
||||
if setting.Env == setting.Dev {
|
||||
slog.Debug("CloudMonitoring request", "params", params)
|
||||
logger.Debug("CloudMonitoring request", "params", params)
|
||||
}
|
||||
|
||||
cloudMonitoringQueryExecutors = append(cloudMonitoringQueryExecutors, queryInterface)
|
||||
@@ -606,7 +608,7 @@ func calcBucketBound(bucketOptions cloudMonitoringBucketOptions, n int) string {
|
||||
return bucketBound
|
||||
}
|
||||
|
||||
func (s *Service) createRequest(ctx context.Context, dsInfo *datasourceInfo, proxyPass string, body io.Reader) (*http.Request, error) {
|
||||
func (s *Service) createRequest(logger log.Logger, dsInfo *datasourceInfo, proxyPass string, body io.Reader) (*http.Request, error) {
|
||||
u, err := url.Parse(dsInfo.url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -619,7 +621,7 @@ func (s *Service) createRequest(ctx context.Context, dsInfo *datasourceInfo, pro
|
||||
}
|
||||
req, err := http.NewRequest(method, dsInfo.services[cloudMonitor].url, body)
|
||||
if err != nil {
|
||||
slog.Error("Failed to create request", "error", err)
|
||||
logger.Error("Failed to create request", "error", err)
|
||||
return nil, fmt.Errorf("failed to create request: %w", err)
|
||||
}
|
||||
|
||||
@@ -636,7 +638,7 @@ func (s *Service) getDefaultProject(ctx context.Context, dsInfo datasourceInfo)
|
||||
return dsInfo.defaultProject, nil
|
||||
}
|
||||
|
||||
func unmarshalResponse(res *http.Response) (cloudMonitoringResponse, error) {
|
||||
func unmarshalResponse(logger log.Logger, res *http.Response) (cloudMonitoringResponse, error) {
|
||||
body, err := io.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
return cloudMonitoringResponse{}, err
|
||||
@@ -644,19 +646,19 @@ func unmarshalResponse(res *http.Response) (cloudMonitoringResponse, error) {
|
||||
|
||||
defer func() {
|
||||
if err := res.Body.Close(); err != nil {
|
||||
slog.Warn("Failed to close response body", "err", err)
|
||||
logger.Warn("Failed to close response body", "err", err)
|
||||
}
|
||||
}()
|
||||
|
||||
if res.StatusCode/100 != 2 {
|
||||
slog.Error("Request failed", "status", res.Status, "body", string(body))
|
||||
logger.Error("Request failed", "status", res.Status, "body", string(body))
|
||||
return cloudMonitoringResponse{}, fmt.Errorf("query failed: %s", string(body))
|
||||
}
|
||||
|
||||
var data cloudMonitoringResponse
|
||||
err = json.Unmarshal(body, &data)
|
||||
if err != nil {
|
||||
slog.Error("Failed to unmarshal CloudMonitoring response", "error", err, "status", res.Status, "body", string(body))
|
||||
logger.Error("Failed to unmarshal CloudMonitoring response", "error", err, "status", res.Status, "body", string(body))
|
||||
return cloudMonitoringResponse{}, fmt.Errorf("failed to unmarshal query response: %w", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
|
||||
t.Run("Parse migrated queries from frontend and build Google Cloud Monitoring API queries", func(t *testing.T) {
|
||||
t.Run("and query has no aggregation set", func(t *testing.T) {
|
||||
qes, err := service.buildQueryExecutors(baseReq())
|
||||
qes, err := service.buildQueryExecutors(slog, baseReq())
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -64,7 +64,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"filters": ["key", "=", "value", "AND", "key2", "=", "value2", "AND", "resource.type", "=", "another/resource/type"]
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(query)
|
||||
qes, err := service.buildQueryExecutors(slog, query)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, 1, len(queries))
|
||||
@@ -96,7 +96,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"filters": ["key", "=", "value", "AND", "key2", "=", "value2"]
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+1000s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -124,7 +124,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"filters": ["key", "=", "value", "AND", "key2", "=", "value2"]
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+60s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -158,7 +158,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "cloud-monitoring-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+60s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -173,7 +173,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "cloud-monitoring-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+60s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -188,7 +188,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "cloud-monitoring-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+300s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -203,7 +203,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "cloud-monitoring-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+3600s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -222,7 +222,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "stackdriver-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+60s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -252,7 +252,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "stackdriver-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+60s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -282,7 +282,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "stackdriver-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+300s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -312,7 +312,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "stackdriver-auto"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+3600s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -342,7 +342,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"alignmentPeriod": "+600s"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `+600s`, queries[0].Params["aggregation.alignmentPeriod"][0])
|
||||
@@ -372,7 +372,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"view": "FULL"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -416,7 +416,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"view": "FULL"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -476,7 +476,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
},
|
||||
}
|
||||
t.Run("and query type is metrics", func(t *testing.T) {
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -523,7 +523,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"sloQuery": {}
|
||||
}`)
|
||||
|
||||
qes, err = service.buildQueryExecutors(req)
|
||||
qes, err = service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
tqueries := make([]*cloudMonitoringTimeSeriesQuery, 0)
|
||||
for _, qi := range qes {
|
||||
@@ -554,7 +554,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"metricQuery": {}
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -582,7 +582,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"metricQuery": {}
|
||||
}`)
|
||||
|
||||
qes, err = service.buildQueryExecutors(req)
|
||||
qes, err = service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
qqueries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, "ALIGN_NEXT_OLDER", qqueries[0].Params["aggregation.perSeriesAligner"][0])
|
||||
@@ -605,7 +605,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"metricQuery": {}
|
||||
}`)
|
||||
|
||||
qes, err = service.buildQueryExecutors(req)
|
||||
qes, err = service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
qqqueries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
assert.Equal(t, `aggregation.alignmentPeriod=%2B60s&aggregation.perSeriesAligner=ALIGN_NEXT_OLDER&filter=select_slo_burn_rate%28%22projects%2Ftest-proj%2Fservices%2Ftest-service%2FserviceLevelObjectives%2Ftest-slo%22%2C+%221h%22%29&interval.endTime=2018-03-15T13%3A34%3A00Z&interval.startTime=2018-03-15T13%3A00%3A00Z`, qqqueries[0].Target)
|
||||
@@ -710,7 +710,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"view": "FULL"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -738,7 +738,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"preprocessor": "none"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -766,7 +766,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"preprocessor": "rate"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -792,7 +792,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"preprocessor": "rate"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -820,7 +820,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"preprocessor": "delta"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
@@ -846,7 +846,7 @@ func TestCloudMonitoring(t *testing.T) {
|
||||
"preprocessor": "delta"
|
||||
}`)
|
||||
|
||||
qes, err := service.buildQueryExecutors(req)
|
||||
qes, err := service.buildQueryExecutors(slog, req)
|
||||
require.NoError(t, err)
|
||||
queries := getCloudMonitoringQueriesFromInterface(t, qes)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) doRequestFilterPage(ctx
|
||||
return cloudMonitoringResponse{}, err
|
||||
}
|
||||
|
||||
dnext, err := unmarshalResponse(res)
|
||||
dnext, err := unmarshalResponse(timeSeriesFilter.logger, res)
|
||||
if err != nil {
|
||||
return cloudMonitoringResponse{}, err
|
||||
}
|
||||
@@ -45,9 +45,9 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) run(ctx context.Context
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
}
|
||||
slog.Info("No project name set on query, using project name from datasource", "projectName", projectName)
|
||||
timeSeriesFilter.logger.Info("No project name set on query, using project name from datasource", "projectName", projectName)
|
||||
}
|
||||
r, err := s.createRequest(ctx, &dsInfo, path.Join("/v3/projects", projectName, "timeSeries"), nil)
|
||||
r, err := s.createRequest(timeSeriesFilter.logger, &dsInfo, path.Join("/v3/projects", projectName, "timeSeries"), nil)
|
||||
if err != nil {
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
"github.com/grafana/grafana/pkg/tsdb/intervalv2"
|
||||
)
|
||||
@@ -35,7 +36,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) appendGraphPeriod(req *ba
|
||||
return ""
|
||||
}
|
||||
|
||||
func doRequestQueryPage(requestBody map[string]interface{}, r *http.Request, dsInfo datasourceInfo) (cloudMonitoringResponse, error) {
|
||||
func doRequestQueryPage(log log.Logger, requestBody map[string]interface{}, r *http.Request, dsInfo datasourceInfo) (cloudMonitoringResponse, error) {
|
||||
buf, err := json.Marshal(requestBody)
|
||||
if err != nil {
|
||||
return cloudMonitoringResponse{}, err
|
||||
@@ -46,7 +47,7 @@ func doRequestQueryPage(requestBody map[string]interface{}, r *http.Request, dsI
|
||||
return cloudMonitoringResponse{}, err
|
||||
}
|
||||
|
||||
dnext, err := unmarshalResponse(res)
|
||||
dnext, err := unmarshalResponse(log, res)
|
||||
if err != nil {
|
||||
return cloudMonitoringResponse{}, err
|
||||
}
|
||||
@@ -65,7 +66,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) run(ctx context.Context,
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
}
|
||||
slog.Info("No project name set on query, using project name from datasource", "projectName", projectName)
|
||||
timeSeriesQuery.logger.Info("No project name set on query, using project name from datasource", "projectName", projectName)
|
||||
}
|
||||
|
||||
timeSeriesQuery.Query += timeSeriesQuery.appendGraphPeriod(req)
|
||||
@@ -84,7 +85,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) run(ctx context.Context,
|
||||
requestBody := map[string]interface{}{
|
||||
"query": timeSeriesQuery.Query,
|
||||
}
|
||||
r, err := s.createRequest(ctx, &dsInfo, p, bytes.NewBuffer([]byte{}))
|
||||
r, err := s.createRequest(timeSeriesQuery.logger, &dsInfo, p, bytes.NewBuffer([]byte{}))
|
||||
if err != nil {
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
@@ -92,7 +93,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) run(ctx context.Context,
|
||||
tracer.Inject(ctx, r.Header, span)
|
||||
r = r.WithContext(ctx)
|
||||
|
||||
d, err := doRequestQueryPage(requestBody, r, dsInfo)
|
||||
d, err := doRequestQueryPage(timeSeriesQuery.logger, requestBody, r, dsInfo)
|
||||
if err != nil {
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
@@ -102,7 +103,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) run(ctx context.Context,
|
||||
"query": timeSeriesQuery.Query,
|
||||
"pageToken": d.NextPageToken,
|
||||
}
|
||||
nextPage, err := doRequestQueryPage(requestBody, r, dsInfo)
|
||||
nextPage, err := doRequestQueryPage(timeSeriesQuery.logger, requestBody, r, dsInfo)
|
||||
if err != nil {
|
||||
dr.Error = err
|
||||
return dr, cloudMonitoringResponse{}, "", nil
|
||||
@@ -184,7 +185,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) parseResponse(queryRes *b
|
||||
|
||||
metricName := formatLegendKeys(d.Key, defaultMetricName, seriesLabels, nil,
|
||||
&cloudMonitoringTimeSeriesFilter{
|
||||
ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy,
|
||||
ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy, logger: timeSeriesQuery.logger,
|
||||
})
|
||||
dataField := frame.Fields[1]
|
||||
dataField.Name = metricName
|
||||
@@ -218,7 +219,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) parseResponse(queryRes *b
|
||||
timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, []time.Time{})
|
||||
valueField := data.NewField(data.TimeSeriesValueFieldName, nil, []float64{})
|
||||
|
||||
frameName := formatLegendKeys(d.Key, defaultMetricName, nil, additionalLabels, &cloudMonitoringTimeSeriesFilter{ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy})
|
||||
frameName := formatLegendKeys(d.Key, defaultMetricName, nil, additionalLabels, &cloudMonitoringTimeSeriesFilter{ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy, logger: timeSeriesQuery.logger})
|
||||
valueField.Name = frameName
|
||||
valueField.Labels = seriesLabels
|
||||
setDisplayNameAsFieldName(valueField)
|
||||
@@ -246,7 +247,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) parseResponse(queryRes *b
|
||||
additionalLabels := data.Labels{"bucket": bucketBound}
|
||||
timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, []time.Time{})
|
||||
valueField := data.NewField(data.TimeSeriesValueFieldName, nil, []float64{})
|
||||
frameName := formatLegendKeys(d.Key, defaultMetricName, seriesLabels, additionalLabels, &cloudMonitoringTimeSeriesFilter{ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy})
|
||||
frameName := formatLegendKeys(d.Key, defaultMetricName, seriesLabels, additionalLabels, &cloudMonitoringTimeSeriesFilter{ProjectName: timeSeriesQuery.ProjectName, AliasBy: timeSeriesQuery.AliasBy, logger: timeSeriesQuery.logger})
|
||||
valueField.Name = frameName
|
||||
valueField.Labels = seriesLabels
|
||||
setDisplayNameAsFieldName(valueField)
|
||||
@@ -340,7 +341,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) parseToAnnotations(queryR
|
||||
func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) buildDeepLink() string {
|
||||
u, err := url.Parse("https://console.cloud.google.com/monitoring/metrics-explorer")
|
||||
if err != nil {
|
||||
slog.Error("Failed to generate deep link: unable to parse metrics explorer URL", "projectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
timeSeriesQuery.logger.Error("Failed to generate deep link: unable to parse metrics explorer URL", "projectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -373,7 +374,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) buildDeepLink() string {
|
||||
|
||||
blob, err := json.Marshal(pageState)
|
||||
if err != nil {
|
||||
slog.Error("Failed to generate deep link", "pageState", pageState, "ProjectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
timeSeriesQuery.logger.Error("Failed to generate deep link", "pageState", pageState, "ProjectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -382,7 +383,7 @@ func (timeSeriesQuery *cloudMonitoringTimeSeriesQuery) buildDeepLink() string {
|
||||
|
||||
accountChooserURL, err := url.Parse("https://accounts.google.com/AccountChooser")
|
||||
if err != nil {
|
||||
slog.Error("Failed to generate deep link: unable to parse account chooser URL", "ProjectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
timeSeriesQuery.logger.Error("Failed to generate deep link: unable to parse account chooser URL", "ProjectName", timeSeriesQuery.ProjectName, "query", timeSeriesQuery.RefID)
|
||||
return ""
|
||||
}
|
||||
accountChooserQuery := accountChooserURL.Query()
|
||||
|
||||
@@ -6,6 +6,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
)
|
||||
|
||||
@@ -30,6 +32,7 @@ type (
|
||||
Selector string
|
||||
Service string
|
||||
Slo string
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
// Used to build MQL queries
|
||||
@@ -41,6 +44,7 @@ type (
|
||||
AliasBy string
|
||||
timeRange backend.TimeRange
|
||||
GraphPeriod string
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
metricQuery struct {
|
||||
|
||||
Reference in New Issue
Block a user