Skip to content

Commit 7386a19

Browse files
committed
Merge branch 'v10.4.x-logzio' into DEV-45405-fix-grafana-unit-tests
2 parents 7dd9924 + 63db252 commit 7386a19

File tree

13 files changed

+71
-49
lines changed

13 files changed

+71
-49
lines changed

custom.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,6 @@ min_refresh_interval = 30s
8484
enabled = true
8585
custom_endpoint = log
8686

87+
8788
[feature_toggles]
8889
dashgpt = false

pkg/api/metrics.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/grafana/grafana/pkg/api/routing"
1414
"github.com/grafana/grafana/pkg/infra/appcontext"
1515
"github.com/grafana/grafana/pkg/middleware/requestmeta"
16+
"github.com/grafana/grafana/pkg/models" // LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
1617
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
1718
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
1819
"github.com/grafana/grafana/pkg/services/datasources"
@@ -79,7 +80,7 @@ func (hs *HTTPServer) QueryMetricsV2(c *contextmodel.ReqContext) response.Respon
7980
}
8081

8182
// LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
82-
ctxWithLogzHeaders := context.WithValue(c.Req.Context(), "logzioHeaders", c.Req.Header)
83+
ctxWithLogzHeaders := models.WithLogzHeaders(c.Req.Context(), c.Req.Header)
8384
resp, err := hs.queryDataService.QueryData(ctxWithLogzHeaders, c.SignedInUser, c.SkipDSCache, reqDTO)
8485
// LOGZ.IO GRAFANA CHANGE :: End
8586
if err != nil {

pkg/expr/nodes.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/grafana/grafana/pkg/expr/classic"
1919
"github.com/grafana/grafana/pkg/expr/mathexp"
2020
"github.com/grafana/grafana/pkg/infra/log"
21+
"github.com/grafana/grafana/pkg/models" // LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
2122
"github.com/grafana/grafana/pkg/services/datasources"
2223
"github.com/grafana/grafana/pkg/services/featuremgmt"
2324
)
@@ -353,7 +354,7 @@ func (dn *DSNode) Execute(ctx context.Context, now time.Time, _ mathexp.Vars, s
353354
for k, v := range req.Headers {
354355
logzHeaders[k] = []string{v}
355356
}
356-
ctxWithLogzio := context.WithValue(ctx, "logzioHeaders", logzHeaders)
357+
ctxWithLogzio := models.WithLogzHeaders(ctx, logzHeaders)
357358

358359
resp, err := s.dataService.QueryData(ctxWithLogzio, req)
359360
// LOGZ.IO GRAFANA CHANGE :: End

pkg/models/headers_logzio.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package models
33

44
import (
5+
"context"
56
"net/http"
67
"net/url"
78
)
@@ -10,12 +11,23 @@ type LogzIoHeaders struct {
1011
RequestHeaders http.Header
1112
}
1213

14+
type logzHeaders struct{}
15+
1316
var logzioHeadersWhitelist = []string{
1417
"user-context",
1518
"X-Logz-Query-Context",
1619
"Query-Source",
1720
}
1821

22+
func WithLogzHeaders(ctx context.Context, requestHeaders http.Header) context.Context {
23+
return context.WithValue(ctx, logzHeaders{}, &LogzIoHeaders{RequestHeaders: requestHeaders})
24+
}
25+
26+
func LogzIoHeadersFromContext(ctx context.Context) (*LogzIoHeaders, bool) {
27+
key, ok := ctx.Value(logzHeaders{}).(*LogzIoHeaders)
28+
return key, ok
29+
}
30+
1931
func (logzioHeaders *LogzIoHeaders) GetDatasourceQueryHeaders(grafanaGeneratedHeaders http.Header) http.Header {
2032
datasourceRequestHeaders := grafanaGeneratedHeaders.Clone()
2133
logzioGrafanaRequestHeaders := logzioHeaders.RequestHeaders

pkg/services/ngalert/accesscontrol.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ var (
181181
},
182182
},
183183
},
184-
Grants: []string{string(org.RoleAdmin)},
184+
Grants: []string{string(org.RoleEditor), string(org.RoleAdmin)}, // LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
185185
}
186186

187187
alertingProvisioningReaderWithSecretsRole = accesscontrol.RoleRegistration{

pkg/services/ngalert/api/alerting_logzio.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (srv *LogzioAlertingService) RouteEvaluateAlert(c *contextmodel.ReqContext,
4545
var evaluationsErrors []apimodels.AlertEvalRunResult
4646

4747
for _, evalRequest := range evalRequests {
48-
c.Logger.Info("Evaluate Alert API", "evalTime", evalRequest.EvalTime, "ruleTitle", evalRequest.AlertRule.Title, "ruleUID", evalRequest.AlertRule.UID)
48+
c.Logger.Info("Evaluate Alert API", "eval_time", evalRequest.EvalTime, "rule_title", evalRequest.AlertRule.Title, "rule_uid", evalRequest.AlertRule.UID, "org_id", evalRequest.AlertRule.OrgID)
4949

5050
evalReq := ngmodels.ExternalAlertEvaluationRequest{
5151
AlertRule: evalRequest.AlertRule,
@@ -67,7 +67,7 @@ func (srv *LogzioAlertingService) RouteEvaluateAlert(c *contextmodel.ReqContext,
6767
}
6868

6969
func (srv *LogzioAlertingService) addQuerySourceHeader(c *contextmodel.ReqContext) http.Header {
70-
requestHeaders := c.Req.Header
70+
requestHeaders := c.Req.Header.Clone()
7171
requestHeaders.Set("Query-Source", "METRICS_ALERTS")
7272
return requestHeaders
7373
}

pkg/services/ngalert/api/api_testing.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/grafana/grafana/pkg/api/response"
2020
"github.com/grafana/grafana/pkg/infra/log"
2121
"github.com/grafana/grafana/pkg/infra/tracing"
22+
m "github.com/grafana/grafana/pkg/models" // LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
2223
"github.com/grafana/grafana/pkg/services/auth/identity"
2324
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
2425
"github.com/grafana/grafana/pkg/services/dashboards"
@@ -84,7 +85,7 @@ func (srv TestingApiSrv) RouteTestGrafanaRuleConfig(c *contextmodel.ReqContext,
8485
}
8586

8687
// LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
87-
ctxWithLogzHeaders := context.WithValue(c.Req.Context(), "logzioHeaders", c.Req.Header)
88+
ctxWithLogzHeaders := m.WithLogzHeaders(c.Req.Context(), c.Req.Header)
8889
evaluator, err := srv.evaluator.Create(eval.NewContext(ctxWithLogzHeaders, c.SignedInUser), rule.GetEvalCondition())
8990
// LOGZ.IO GRAFANA CHANGE :: End
9091
if err != nil {
@@ -187,7 +188,7 @@ func (srv TestingApiSrv) RouteEvalQueries(c *contextmodel.ReqContext, cmd apimod
187188
}
188189

189190
// LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
190-
ctxWithLogzHeaders := context.WithValue(c.Req.Context(), "logzioHeaders", c.Req.Header)
191+
ctxWithLogzHeaders := m.WithLogzHeaders(c.Req.Context(), c.Req.Header)
191192
evaluator, err := srv.evaluator.Create(eval.NewContext(ctxWithLogzHeaders, c.SignedInUser), cond)
192193
// LOGZ.IO GRAFANA CHANGE :: End
193194

pkg/services/ngalert/eval/eval.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ func ParseStateString(repr string) (State, error) {
294294
}
295295
}
296296

297-
func buildDatasourceHeaders(ctx EvaluationContext) map[string]string { // LOGZ.IO GRAFANA CHANGE :: DEV-43744 - change to EvaluationContext
297+
func buildDatasourceHeaders(ctx context.Context) map[string]string {
298298
headers := map[string]string{
299299
// Many data sources check this in query method as sometimes alerting needs special considerations.
300300
// Several existing systems also compare against the value of this header. Altering this constitutes a breaking change.
@@ -307,20 +307,15 @@ func buildDatasourceHeaders(ctx EvaluationContext) map[string]string { // LOGZ.I
307307
models.CacheSkipHeaderName: "true",
308308
}
309309

310-
key, ok := models.RuleKeyFromContext(ctx.Ctx) // LOGZ.IO GRAFANA CHANGE :: DEV-43744 - change to EvaluationContext
310+
key, ok := models.RuleKeyFromContext(ctx)
311311
if ok {
312312
headers["X-Rule-Uid"] = key.UID
313313
headers["X-Grafana-Org-Id"] = strconv.FormatInt(key.OrgID, 10)
314314
}
315315

316316
// LOGZ.IO GRAFANA CHANGE :: DEV-43744 - Pass headers and custom datasource to evaluate alerts
317-
logzIoHeaders := &m.LogzIoHeaders{}
318-
logzHeaders := ctx.Ctx.Value("logzioHeaders")
319-
if logzHeaders != nil {
320-
logzIoHeaders.RequestHeaders = http.Header{}
321-
for k, v := range logzHeaders.(http.Header) {
322-
logzIoHeaders.RequestHeaders[k] = v
323-
}
317+
logzIoHeaders, ok := m.LogzIoHeadersFromContext(ctx)
318+
if ok {
324319
newHeaders := http.Header{}
325320
for k, v := range headers {
326321
newHeaders[k] = []string{v}
@@ -331,7 +326,7 @@ func buildDatasourceHeaders(ctx EvaluationContext) map[string]string { // LOGZ.I
331326
}
332327
}
333328

334-
logger.Debug("Added following headers to request", "headers", headers)
329+
logger.Debug("Added following headers to request", "headers", headers, "rule_uid", key.UID, "org_id", key.OrgID)
335330
// LOGZ.IO GRAFANA CHANGE :: End
336331

337332
return headers
@@ -341,7 +336,7 @@ func buildDatasourceHeaders(ctx EvaluationContext) map[string]string { // LOGZ.I
341336
func getExprRequest(ctx EvaluationContext, condition models.Condition, dsCacheService datasources.CacheService, reader AlertingResultsReader) (*expr.Request, error) {
342337
req := &expr.Request{
343338
OrgId: ctx.User.GetOrgID(),
344-
Headers: buildDatasourceHeaders(ctx), // LOGZ.IO GRAFANA CHANGE :: DEV-43883 - Change to EvaluationContext
339+
Headers: buildDatasourceHeaders(ctx.Ctx),
345340
User: ctx.User,
346341
}
347342
datasources := make(map[string]*datasources.DataSource, len(condition.Data))

pkg/services/ngalert/schedule/schedule.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/grafana/grafana/pkg/infra/log"
1717
"github.com/grafana/grafana/pkg/infra/tracing"
18+
"github.com/grafana/grafana/pkg/models" // LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
1819
"github.com/grafana/grafana/pkg/services/datasources"
1920
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
2021
"github.com/grafana/grafana/pkg/services/ngalert/eval"
@@ -373,13 +374,13 @@ func (sch *schedule) RunRuleEvaluation(ctx context.Context, evalReq ngmodels.Ext
373374
// since we only get if exists then it shouldn't create and routine should exist
374375
ruleInfo, newRoutine := sch.registry.getOrCreateInfo(ctx, alertKey)
375376
if !newRoutine {
376-
logger.Debug("RunRuleEvaluation: sending ruleInfo.eval")
377+
logger.Debug("RunRuleEvaluation: sending ruleInfo.eval", alertKey.LogContext()...)
377378
sent, dropped := ruleInfo.eval(&ev)
378379
if !sent {
379-
return fmt.Errorf("evaluation was not sent")
380+
return fmt.Errorf("evaluation was not sent for alert key %s", alertKey)
380381
}
381382
if dropped != nil {
382-
logger.Warn("RunRuleEvaluation: got dropped eval", "dropped", dropped)
383+
logger.Warn("RunRuleEvaluation: got dropped eval", "dropped", dropped, "rule_uid", alertKey.UID, "org_id", alertKey.OrgID)
383384
}
384385
}
385386
} else {
@@ -426,7 +427,7 @@ func (sch *schedule) ruleRoutine(grafanaCtx context.Context, key ngmodels.AlertR
426427
start := sch.clock.Now()
427428

428429
// LOGZ.IO GRAFANA CHANGE :: DEV-43889 - Add headers for logzio datasources support
429-
ctxWithLogzHeaders := context.WithValue(ctx, "logzioHeaders", e.logzHeaders)
430+
ctxWithLogzHeaders := models.WithLogzHeaders(ctx, e.logzHeaders)
430431
evalCtx := eval.NewContextWithPreviousResults(ctxWithLogzHeaders, SchedulerUserFor(e.rule.OrgID), sch.newLoadedMetricsReader(e.rule))
431432
// LOGZ.IO GRAFANA CHANGE :: End
432433
if sch.evaluatorFactory == nil {

pkg/tests/api/alerting/api_provisioning_test.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,17 @@ func TestIntegrationProvisioning(t *testing.T) {
108108
require.Equal(t, 403, resp.StatusCode)
109109
})
110110

111-
t.Run("editor GET should 403", func(t *testing.T) {
111+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
112+
t.Run("editor GET should succeed", func(t *testing.T) {
112113
req := createTestRequest("GET", url, "editor", "")
113114

114115
resp, err := http.DefaultClient.Do(req)
115116
require.NoError(t, err)
116117
require.NoError(t, resp.Body.Close())
117118

118-
require.Equal(t, 403, resp.StatusCode)
119+
require.Equal(t, 200, resp.StatusCode)
119120
})
121+
// LOGZ.IO GRAFANA CHANGE :: End
120122

121123
t.Run("admin GET should succeed", func(t *testing.T) {
122124
req := createTestRequest("GET", url, "admin", "")
@@ -148,15 +150,17 @@ func TestIntegrationProvisioning(t *testing.T) {
148150
require.Equal(t, 403, resp.StatusCode)
149151
})
150152

151-
t.Run("editor PUT should 403", func(t *testing.T) {
153+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
154+
t.Run("editor PUT should succeed", func(t *testing.T) {
152155
req := createTestRequest("PUT", url, "editor", body)
153156

154157
resp, err := http.DefaultClient.Do(req)
155158
require.NoError(t, err)
156159
require.NoError(t, resp.Body.Close())
157160

158-
require.Equal(t, 403, resp.StatusCode)
161+
require.Equal(t, 202, resp.StatusCode)
159162
})
163+
// LOGZ.IO GRAFANA CHANGE :: End
160164

161165
t.Run("admin PUT should succeed", func(t *testing.T) {
162166
req := createTestRequest("PUT", url, "admin", body)
@@ -200,15 +204,17 @@ func TestIntegrationProvisioning(t *testing.T) {
200204
require.Equal(t, 403, resp.StatusCode)
201205
})
202206

203-
t.Run("editor GET should 403", func(t *testing.T) {
207+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
208+
t.Run("editor GET should succeed", func(t *testing.T) {
204209
req := createTestRequest("GET", url, "editor", "")
205210

206211
resp, err := http.DefaultClient.Do(req)
207212
require.NoError(t, err)
208213
require.NoError(t, resp.Body.Close())
209214

210-
require.Equal(t, 403, resp.StatusCode)
215+
require.Equal(t, 200, resp.StatusCode)
211216
})
217+
// LOGZ.IO GRAFANA CHANGE :: End
212218

213219
t.Run("admin GET should succeed", func(t *testing.T) {
214220
req := createTestRequest("GET", url, "admin", "")
@@ -240,15 +246,17 @@ func TestIntegrationProvisioning(t *testing.T) {
240246
require.Equal(t, 403, resp.StatusCode)
241247
})
242248

243-
t.Run("editor POST should 403", func(t *testing.T) {
249+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
250+
t.Run("editor POST should succeed", func(t *testing.T) {
244251
req := createTestRequest("POST", url, "editor", body)
245252

246253
resp, err := http.DefaultClient.Do(req)
247254
require.NoError(t, err)
248255
require.NoError(t, resp.Body.Close())
249256

250-
require.Equal(t, 403, resp.StatusCode)
257+
require.Equal(t, 202, resp.StatusCode)
251258
})
259+
// LOGZ.IO GRAFANA CHANGE :: End
252260

253261
t.Run("admin POST should succeed", func(t *testing.T) {
254262
req := createTestRequest("POST", url, "admin", body)
@@ -284,15 +292,17 @@ func TestIntegrationProvisioning(t *testing.T) {
284292
require.Equal(t, 403, resp.StatusCode)
285293
})
286294

287-
t.Run("editor GET should 403", func(t *testing.T) {
295+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
296+
t.Run("editor GET should succeed", func(t *testing.T) {
288297
req := createTestRequest("GET", url, "editor", "")
289298

290299
resp, err := http.DefaultClient.Do(req)
291300
require.NoError(t, err)
292301
require.NoError(t, resp.Body.Close())
293302

294-
require.Equal(t, 403, resp.StatusCode)
303+
require.Equal(t, 200, resp.StatusCode)
295304
})
305+
// LOGZ.IO GRAFANA CHANGE :: End
296306

297307
t.Run("admin GET should succeed", func(t *testing.T) {
298308
req := createTestRequest("GET", url, "admin", "")
@@ -328,15 +338,17 @@ func TestIntegrationProvisioning(t *testing.T) {
328338
require.Equal(t, 403, resp.StatusCode)
329339
})
330340

331-
t.Run("editor GET should 403", func(t *testing.T) {
341+
// LOGZ.IO GRAFANA CHANGE :: DEV-46158 - Allow editors to manage alerting provisioning
342+
t.Run("editor GET should succeed", func(t *testing.T) {
332343
req := createTestRequest("GET", url, "editor", "")
333344

334345
resp, err := http.DefaultClient.Do(req)
335346
require.NoError(t, err)
336347
require.NoError(t, resp.Body.Close())
337348

338-
require.Equal(t, 403, resp.StatusCode)
349+
require.Equal(t, 200, resp.StatusCode)
339350
})
351+
// LOGZ.IO GRAFANA CHANGE :: End
340352

341353
t.Run("admin GET should succeed", func(t *testing.T) {
342354
req := createTestRequest("GET", url, "admin", "")

0 commit comments

Comments
 (0)