210 lines
6.0 KiB
Go
210 lines
6.0 KiB
Go
// Copyright 2021 Prometheus Team
|
|
// 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 v2
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/go-openapi/strfmt"
|
|
prometheus_model "github.com/prometheus/common/model"
|
|
|
|
open_api_models "github.com/prometheus/alertmanager/api/v2/models"
|
|
"github.com/prometheus/alertmanager/silence/silencepb"
|
|
"github.com/prometheus/alertmanager/types"
|
|
)
|
|
|
|
// GettableSilenceFromProto converts *silencepb.Silence to open_api_models.GettableSilence.
|
|
func GettableSilenceFromProto(s *silencepb.Silence) (open_api_models.GettableSilence, error) {
|
|
start := strfmt.DateTime(s.StartsAt)
|
|
end := strfmt.DateTime(s.EndsAt)
|
|
updated := strfmt.DateTime(s.UpdatedAt)
|
|
state := string(types.CalcSilenceState(s.StartsAt, s.EndsAt))
|
|
sil := open_api_models.GettableSilence{
|
|
Silence: open_api_models.Silence{
|
|
StartsAt: &start,
|
|
EndsAt: &end,
|
|
Comment: &s.Comment,
|
|
CreatedBy: &s.CreatedBy,
|
|
},
|
|
ID: &s.Id,
|
|
UpdatedAt: &updated,
|
|
Status: &open_api_models.SilenceStatus{
|
|
State: &state,
|
|
},
|
|
}
|
|
|
|
for _, m := range s.Matchers {
|
|
matcher := &open_api_models.Matcher{
|
|
Name: &m.Name,
|
|
Value: &m.Pattern,
|
|
}
|
|
f := false
|
|
t := true
|
|
switch m.Type {
|
|
case silencepb.Matcher_EQUAL:
|
|
matcher.IsEqual = &t
|
|
matcher.IsRegex = &f
|
|
case silencepb.Matcher_NOT_EQUAL:
|
|
matcher.IsEqual = &f
|
|
matcher.IsRegex = &f
|
|
case silencepb.Matcher_REGEXP:
|
|
matcher.IsEqual = &t
|
|
matcher.IsRegex = &t
|
|
case silencepb.Matcher_NOT_REGEXP:
|
|
matcher.IsEqual = &f
|
|
matcher.IsRegex = &t
|
|
default:
|
|
return sil, fmt.Errorf(
|
|
"unknown matcher type for matcher '%v' in silence '%v'",
|
|
m.Name,
|
|
s.Id,
|
|
)
|
|
}
|
|
sil.Matchers = append(sil.Matchers, matcher)
|
|
}
|
|
|
|
return sil, nil
|
|
}
|
|
|
|
// PostableSilenceToProto converts *open_api_models.PostableSilenc to *silencepb.Silence.
|
|
func PostableSilenceToProto(s *open_api_models.PostableSilence) (*silencepb.Silence, error) {
|
|
sil := &silencepb.Silence{
|
|
Id: s.ID,
|
|
StartsAt: time.Time(*s.StartsAt),
|
|
EndsAt: time.Time(*s.EndsAt),
|
|
Comment: *s.Comment,
|
|
CreatedBy: *s.CreatedBy,
|
|
}
|
|
for _, m := range s.Matchers {
|
|
matcher := &silencepb.Matcher{
|
|
Name: *m.Name,
|
|
Pattern: *m.Value,
|
|
}
|
|
isEqual := true
|
|
if m.IsEqual != nil {
|
|
isEqual = *m.IsEqual
|
|
}
|
|
isRegex := false
|
|
if m.IsRegex != nil {
|
|
isRegex = *m.IsRegex
|
|
}
|
|
|
|
switch {
|
|
case isEqual && !isRegex:
|
|
matcher.Type = silencepb.Matcher_EQUAL
|
|
case !isEqual && !isRegex:
|
|
matcher.Type = silencepb.Matcher_NOT_EQUAL
|
|
case isEqual && isRegex:
|
|
matcher.Type = silencepb.Matcher_REGEXP
|
|
case !isEqual && isRegex:
|
|
matcher.Type = silencepb.Matcher_NOT_REGEXP
|
|
}
|
|
sil.Matchers = append(sil.Matchers, matcher)
|
|
}
|
|
return sil, nil
|
|
}
|
|
|
|
// AlertToOpenAPIAlert converts internal alerts, alert types, and receivers to *open_api_models.GettableAlert.
|
|
func AlertToOpenAPIAlert(alert *types.Alert, status types.AlertStatus, receivers, mutedBy []string) *open_api_models.GettableAlert {
|
|
startsAt := strfmt.DateTime(alert.StartsAt)
|
|
updatedAt := strfmt.DateTime(alert.UpdatedAt)
|
|
endsAt := strfmt.DateTime(alert.EndsAt)
|
|
|
|
apiReceivers := make([]*open_api_models.Receiver, 0, len(receivers))
|
|
for i := range receivers {
|
|
apiReceivers = append(apiReceivers, &open_api_models.Receiver{Name: &receivers[i]})
|
|
}
|
|
|
|
fp := alert.Fingerprint().String()
|
|
|
|
state := string(status.State)
|
|
if len(mutedBy) > 0 {
|
|
// If the alert is muted, change the state to suppressed.
|
|
state = open_api_models.AlertStatusStateSuppressed
|
|
}
|
|
|
|
aa := &open_api_models.GettableAlert{
|
|
Alert: open_api_models.Alert{
|
|
GeneratorURL: strfmt.URI(alert.GeneratorURL),
|
|
Labels: ModelLabelSetToAPILabelSet(alert.Labels),
|
|
},
|
|
Annotations: ModelLabelSetToAPILabelSet(alert.Annotations),
|
|
StartsAt: &startsAt,
|
|
UpdatedAt: &updatedAt,
|
|
EndsAt: &endsAt,
|
|
Fingerprint: &fp,
|
|
Receivers: apiReceivers,
|
|
Status: &open_api_models.AlertStatus{
|
|
State: &state,
|
|
SilencedBy: status.SilencedBy,
|
|
InhibitedBy: status.InhibitedBy,
|
|
MutedBy: mutedBy,
|
|
},
|
|
}
|
|
|
|
if aa.Status.SilencedBy == nil {
|
|
aa.Status.SilencedBy = []string{}
|
|
}
|
|
|
|
if aa.Status.InhibitedBy == nil {
|
|
aa.Status.InhibitedBy = []string{}
|
|
}
|
|
|
|
if aa.Status.MutedBy == nil {
|
|
aa.Status.MutedBy = []string{}
|
|
}
|
|
|
|
return aa
|
|
}
|
|
|
|
// OpenAPIAlertsToAlerts converts open_api_models.PostableAlerts to []*types.Alert.
|
|
func OpenAPIAlertsToAlerts(apiAlerts open_api_models.PostableAlerts) []*types.Alert {
|
|
alerts := []*types.Alert{}
|
|
for _, apiAlert := range apiAlerts {
|
|
alert := types.Alert{
|
|
Alert: prometheus_model.Alert{
|
|
Labels: APILabelSetToModelLabelSet(apiAlert.Labels),
|
|
Annotations: APILabelSetToModelLabelSet(apiAlert.Annotations),
|
|
StartsAt: time.Time(apiAlert.StartsAt),
|
|
EndsAt: time.Time(apiAlert.EndsAt),
|
|
GeneratorURL: string(apiAlert.GeneratorURL),
|
|
},
|
|
}
|
|
alerts = append(alerts, &alert)
|
|
}
|
|
|
|
return alerts
|
|
}
|
|
|
|
// ModelLabelSetToAPILabelSet converts prometheus_model.LabelSet to open_api_models.LabelSet.
|
|
func ModelLabelSetToAPILabelSet(modelLabelSet prometheus_model.LabelSet) open_api_models.LabelSet {
|
|
apiLabelSet := open_api_models.LabelSet{}
|
|
for key, value := range modelLabelSet {
|
|
apiLabelSet[string(key)] = string(value)
|
|
}
|
|
|
|
return apiLabelSet
|
|
}
|
|
|
|
// APILabelSetToModelLabelSet converts open_api_models.LabelSet to prometheus_model.LabelSet.
|
|
func APILabelSetToModelLabelSet(apiLabelSet open_api_models.LabelSet) prometheus_model.LabelSet {
|
|
modelLabelSet := prometheus_model.LabelSet{}
|
|
for key, value := range apiLabelSet {
|
|
modelLabelSet[prometheus_model.LabelName(key)] = prometheus_model.LabelValue(value)
|
|
}
|
|
|
|
return modelLabelSet
|
|
}
|