From 8ab527b1746aae4626eab0d5a0e1026704d2d731 Mon Sep 17 00:00:00 2001 From: Amol Umbark Date: Fri, 10 Feb 2023 23:53:45 +0530 Subject: [PATCH 1/3] feat: support printing threshold in alert summary and description (#1827) --- .../src/container/CreateAlertRule/defaults.ts | 26 ++++++++++--------- pkg/query-service/rules/apiParams.go | 4 +-- pkg/query-service/rules/promRule.go | 12 +++++++-- pkg/query-service/rules/templates.go | 17 +++++++----- pkg/query-service/rules/thresholdRule.go | 4 +-- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/frontend/src/container/CreateAlertRule/defaults.ts b/frontend/src/container/CreateAlertRule/defaults.ts index c12233bb13..5ce07a03be 100644 --- a/frontend/src/container/CreateAlertRule/defaults.ts +++ b/frontend/src/container/CreateAlertRule/defaults.ts @@ -6,6 +6,16 @@ import { defaultMatchType, } from 'types/api/alerts/def'; +const defaultAlertDescription = + 'This alert is fired when the defined metric (current value: {{$value}}) crosses the threshold ({{$threshold}})'; +const defaultAlertSummary = + 'The rule threshold is set to {{$threshold}}, and the observed metric value is {{$value}}'; + +const defaultAnnotations = { + description: defaultAlertDescription, + summary: defaultAlertSummary, +}; + export const alertDefaults: AlertDef = { alertType: AlertTypes.METRICS_BASED_ALERT, condition: { @@ -38,9 +48,7 @@ export const alertDefaults: AlertDef = { labels: { severity: 'warning', }, - annotations: { - description: 'A new alert', - }, + annotations: defaultAnnotations, evalWindow: defaultEvalWindow, }; @@ -85,9 +93,7 @@ export const logAlertDefaults: AlertDef = { severity: 'warning', details: `${window.location.protocol}//${window.location.host}/logs`, }, - annotations: { - description: 'A new log-based alert', - }, + annotations: defaultAnnotations, evalWindow: defaultEvalWindow, }; @@ -132,9 +138,7 @@ export const traceAlertDefaults: AlertDef = { severity: 'warning', details: `${window.location.protocol}//${window.location.host}/traces`, }, - annotations: { - description: 'A new trace-based alert', - }, + annotations: defaultAnnotations, evalWindow: defaultEvalWindow, }; @@ -179,8 +183,6 @@ export const exceptionAlertDefaults: AlertDef = { severity: 'warning', details: `${window.location.protocol}//${window.location.host}/exceptions`, }, - annotations: { - description: 'A new exceptions-based alert', - }, + annotations: defaultAnnotations, evalWindow: defaultEvalWindow, }; diff --git a/pkg/query-service/rules/apiParams.go b/pkg/query-service/rules/apiParams.go index aad672c99a..53503c6c52 100644 --- a/pkg/query-service/rules/apiParams.go +++ b/pkg/query-service/rules/apiParams.go @@ -197,8 +197,8 @@ func testTemplateParsing(rl *PostableRule) (errs []error) { } // Trying to parse templates. - tmplData := AlertTemplateData(make(map[string]string), 0) - defs := "{{$labels := .Labels}}{{$value := .Value}}" + tmplData := AlertTemplateData(make(map[string]string), 0, 0) + defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}" parseTest := func(text string) error { tmpl := NewTemplateExpander( context.TODO(), diff --git a/pkg/query-service/rules/promRule.go b/pkg/query-service/rules/promRule.go index d4654becd2..bd4ff4d134 100644 --- a/pkg/query-service/rules/promRule.go +++ b/pkg/query-service/rules/promRule.go @@ -108,6 +108,14 @@ func (r *PromRule) Condition() *RuleCondition { return r.ruleCondition } +func (r *PromRule) targetVal() float64 { + if r.ruleCondition == nil || r.ruleCondition.Target == nil { + return 0 + } + + return *r.ruleCondition.Target +} + func (r *PromRule) Type() RuleType { return RuleTypeProm } @@ -327,10 +335,10 @@ func (r *PromRule) Eval(ctx context.Context, ts time.Time, queriers *Queriers) ( l[lbl.Name] = lbl.Value } - tmplData := AlertTemplateData(l, smpl.V) + tmplData := AlertTemplateData(l, smpl.V, r.targetVal()) // Inject some convenience variables that are easier to remember for users // who are not used to Go's templating system. - defs := "{{$labels := .Labels}}{{$value := .Value}}" + defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}" expand := func(text string) string { diff --git a/pkg/query-service/rules/templates.go b/pkg/query-service/rules/templates.go index 955a7b3761..473a5cfa87 100644 --- a/pkg/query-service/rules/templates.go +++ b/pkg/query-service/rules/templates.go @@ -21,8 +21,9 @@ import ( // related to go templating in rule labels and annotations type tmplQueryRecord struct { - Labels map[string]string - Value float64 + Labels map[string]string + Value float64 + Threshold float64 } type tmplQueryResults []*tmplQueryRecord @@ -200,13 +201,15 @@ func NewTemplateExpander( } // AlertTemplateData returns the interface to be used in expanding the template. -func AlertTemplateData(labels map[string]string, value float64) interface{} { +func AlertTemplateData(labels map[string]string, value float64, threshold float64) interface{} { return struct { - Labels map[string]string - Value float64 + Labels map[string]string + Value float64 + Threshold float64 }{ - Labels: labels, - Value: value, + Labels: labels, + Value: value, + Threshold: threshold, } } diff --git a/pkg/query-service/rules/thresholdRule.go b/pkg/query-service/rules/thresholdRule.go index c351d96b0f..9da34d2ef3 100644 --- a/pkg/query-service/rules/thresholdRule.go +++ b/pkg/query-service/rules/thresholdRule.go @@ -673,10 +673,10 @@ func (r *ThresholdRule) Eval(ctx context.Context, ts time.Time, queriers *Querie l[lbl.Name] = lbl.Value } - tmplData := AlertTemplateData(l, smpl.V) + tmplData := AlertTemplateData(l, smpl.V, r.targetVal()) // Inject some convenience variables that are easier to remember for users // who are not used to Go's templating system. - defs := "{{$labels := .Labels}}{{$value := .Value}}" + defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}" // utility function to apply go template on labels and annots expand := func(text string) string { From 93b6749920bdd266379dabd030dee67d86586b34 Mon Sep 17 00:00:00 2001 From: Kolesnyk Anton <50579516+KolesnikAntony@users.noreply.github.com> Date: Sat, 11 Feb 2023 05:09:34 +0200 Subject: [PATCH 2/3] fix: filters applied in the logs page (#2210) * fix: filters applied in the logs page * fix: remove console * fix: adding of query params from query string to input * fix: added parser * chore: useSearch parser is updated with previous hooks --------- Co-authored-by: palashgdev --- .../container/LogsSearchFilter/useSearchParser.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/container/LogsSearchFilter/useSearchParser.ts b/frontend/src/container/LogsSearchFilter/useSearchParser.ts index d2ad16d1bb..11b501400f 100644 --- a/frontend/src/container/LogsSearchFilter/useSearchParser.ts +++ b/frontend/src/container/LogsSearchFilter/useSearchParser.ts @@ -1,9 +1,10 @@ import { getMinMax } from 'container/TopNav/AutoRefresh/config'; +import useUrlQuery from 'hooks/useUrlQuery'; import history from 'lib/history'; import { parseQuery, reverseParser } from 'lib/logql'; import { ILogQLParsedQueryItem } from 'lib/logql/types'; import isEqual from 'lodash-es/isEqual'; -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Dispatch } from 'redux'; import { AppState } from 'store/reducers'; @@ -27,6 +28,10 @@ export function useSearchParser(): { const { searchFilter: { parsedQuery, queryString }, } = useSelector((store) => store.logs); + + const urlQuery = useUrlQuery(); + const parsedFilters = useMemo(() => urlQuery.get('q'), [urlQuery]); + const { minTime, maxTime, selectedTime } = useSelector< AppState, GlobalReducer @@ -63,8 +68,12 @@ export function useSearchParser(): { ); useEffect(() => { - updateQueryString(queryString); - }, [queryString, updateQueryString]); + if (!queryString && parsedFilters) { + updateQueryString(parsedFilters); + } else if (queryString) { + updateQueryString(queryString); + } + }, [queryString, updateQueryString, parsedFilters]); const updateParsedQuery = useCallback( (updatedParsedPayload: ILogQLParsedQueryItem[]) => { From a906f94b8af953f3bfc34bee8a70c77054b63bb4 Mon Sep 17 00:00:00 2001 From: Ankit Nayan Date: Sat, 11 Feb 2023 23:15:07 +0530 Subject: [PATCH 3/3] chore: reduce events --- .../telemetry/{ignoredPaths.go => ignored.go} | 15 +++++++++++++++ pkg/query-service/telemetry/telemetry.go | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) rename pkg/query-service/telemetry/{ignoredPaths.go => ignored.go} (50%) diff --git a/pkg/query-service/telemetry/ignoredPaths.go b/pkg/query-service/telemetry/ignored.go similarity index 50% rename from pkg/query-service/telemetry/ignoredPaths.go rename to pkg/query-service/telemetry/ignored.go index e564cce2a2..e0faad4461 100644 --- a/pkg/query-service/telemetry/ignoredPaths.go +++ b/pkg/query-service/telemetry/ignored.go @@ -11,3 +11,18 @@ func IgnoredPaths() map[string]struct{} { return ignoredPaths } + +func ignoreEvents(event string, attributes map[string]interface{}) bool { + + if event == TELEMETRY_EVENT_ACTIVE_USER || event == TELEMETRY_EVENT_ACTIVE_USER_PH { + for attr_key, attr_val := range attributes { + + if attr_key == "any" && attr_val.(int8) == 0 { + return true + } + + } + } + + return false +} diff --git a/pkg/query-service/telemetry/telemetry.go b/pkg/query-service/telemetry/telemetry.go index a2b6031fad..8d1967dbc4 100644 --- a/pkg/query-service/telemetry/telemetry.go +++ b/pkg/query-service/telemetry/telemetry.go @@ -46,13 +46,14 @@ const IP_NOT_FOUND_PLACEHOLDER = "NA" const DEFAULT_NUMBER_OF_SERVICES = 6 const HEART_BEAT_DURATION = 6 * time.Hour + const ACTIVE_USER_DURATION = 30 * time.Minute // const HEART_BEAT_DURATION = 30 * time.Second // const ACTIVE_USER_DURATION = 30 * time.Second const RATE_LIMIT_CHECK_DURATION = 1 * time.Minute -const RATE_LIMIT_VALUE = 2 +const RATE_LIMIT_VALUE = 1 // const RATE_LIMIT_CHECK_DURATION = 20 * time.Second // const RATE_LIMIT_VALUE = 5 @@ -301,6 +302,11 @@ func (a *Telemetry) SendEvent(event string, data map[string]interface{}, opts .. return } + // drop events with properties matching + if ignoreEvents(event, data) { + return + } + if rateLimitFlag { if a.rateLimits[event] < RATE_LIMIT_VALUE { a.rateLimits[event] += 1