mirror of https://github.com/prometheus/prometheus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
79 lines
2.2 KiB
// Copyright 2023 The Prometheus Authors |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
package rules |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
|
|
"github.com/prometheus/prometheus/model/labels" |
|
) |
|
|
|
type ruleOrigin struct{} |
|
|
|
// RuleDetail contains information about the rule that is being evaluated. |
|
type RuleDetail struct { |
|
Name string |
|
Query string |
|
Labels labels.Labels |
|
Kind string |
|
|
|
// NoDependentRules is set to true if it's guaranteed that in the rule group there's no other rule |
|
// which depends on this one. |
|
NoDependentRules bool |
|
|
|
// NoDependencyRules is set to true if it's guaranteed that this rule doesn't depend on any other |
|
// rule within the rule group. |
|
NoDependencyRules bool |
|
} |
|
|
|
const ( |
|
KindAlerting = "alerting" |
|
KindRecording = "recording" |
|
) |
|
|
|
// NewRuleDetail creates a RuleDetail from a given Rule. |
|
func NewRuleDetail(r Rule) RuleDetail { |
|
var kind string |
|
switch r.(type) { |
|
case *AlertingRule: |
|
kind = KindAlerting |
|
case *RecordingRule: |
|
kind = KindRecording |
|
default: |
|
panic(fmt.Sprintf(`unknown rule type "%T"`, r)) |
|
} |
|
|
|
return RuleDetail{ |
|
Name: r.Name(), |
|
Query: r.Query().String(), |
|
Labels: r.Labels(), |
|
Kind: kind, |
|
NoDependentRules: r.NoDependentRules(), |
|
NoDependencyRules: r.NoDependencyRules(), |
|
} |
|
} |
|
|
|
// NewOriginContext returns a new context with data about the origin attached. |
|
func NewOriginContext(ctx context.Context, rule RuleDetail) context.Context { |
|
return context.WithValue(ctx, ruleOrigin{}, rule) |
|
} |
|
|
|
// FromOriginContext returns the RuleDetail origin data from the context. |
|
func FromOriginContext(ctx context.Context) RuleDetail { |
|
if rule, ok := ctx.Value(ruleOrigin{}).(RuleDetail); ok { |
|
return rule |
|
} |
|
return RuleDetail{} |
|
}
|
|
|