Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions instana/resource-slo-config-def.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ const (
SloConfigAPIFieldTimezone = "timezone"
SloConfigAPIFieldStartTimestamp = "startTimestamp"
SloConfigAPIFieldTrafficType = "trafficType"
SloConfigAPIFieldGoodEventFilter = "goodEventFilterExpression"
SloConfigAPIFieldBadEventFilter = "badEventFilterExpression"
SloConfigAPIFieldGoodEventFilter = "goodEventsFilter"
SloConfigAPIFieldBadEventFilter = "badEventsFilter"

SloConfigAPIFieldFilter = "tagFilterExpression"

Expand Down Expand Up @@ -165,13 +165,15 @@ var (

SloConfigSchemaAggregation = &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"SUM", "MEAN", "MAX", "MIN", "P25", "P50", "P75", "P90", "P95", "P98", "P99", "P99_9", "P99_99", "DISTRIBUTION", "DISTINCT_COUNT", "SUM_POSITIVE", "PER_SECOND"}, true),
Description: "The aggregation type for the metric configuration (SUM, MEAN, MAX, MIN, P25, P50, P75, P90, P95, P98, P99, P99_9, P99_99, DISTRIBUTION, DISTINCT_COUNT, SUM_POSITIVE, PER_SECOND)",
}

SloConfigSchemaThreshold = &schema.Schema{
Type: schema.TypeFloat,
ForceNew: true,
Required: true,
Description: "The threshold for the metric configuration",
ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) {
Expand Down Expand Up @@ -304,6 +306,7 @@ var (

SloConfigSchemaTrafficType = &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"all", "erroneous"}, true),
Description: "The boundary scope for the entity configuration (ALL, INBOUND)",
Expand Down Expand Up @@ -372,6 +375,7 @@ var (
Type: schema.TypeList,
MinItems: 1,
MaxItems: 1,
ForceNew: true,
Required: true,
Description: "The entity to use for the SLI config.",
Elem: &schema.Resource{
Expand Down
39 changes: 26 additions & 13 deletions instana/resource-slo-config-indicator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"reflect"

"github.com/gessnerfl/terraform-provider-instana/instana/restapi"
"github.com/gessnerfl/terraform-provider-instana/instana/tagfilter"
)

// state -> api
Expand Down Expand Up @@ -38,13 +39,13 @@ func (r *sloConfigResource) mapSliIndicatorListFromState(stateObject map[string]
Aggregation: *GetPointerFromMap[string](data, SloConfigFieldAggregation),
}, nil
}
if _, ok := stateObject["event_based_availability"]; ok {
if details, ok := stateObject["event_based_availability"]; ok && r.isSet(details) {
return restapi.SloEventBasedLatencyIndicator{
Type: SloConfigAPIIndicatorMeasurementTypeEventBased,
Blueprint: SloConfigAPIIndicatorBlueprintAvailability,
}, nil
}
if details, ok := stateObject["custom"]; ok && r.isSet(details) {
if details, ok := stateObject["traffic"]; ok && r.isSet(details) {
data := details.([]interface{})[0].(map[string]interface{})
return restapi.SloTrafficIndicator{
Blueprint: SloConfigAPIIndicatorBlueprintTraffic,
Expand All @@ -53,7 +54,7 @@ func (r *sloConfigResource) mapSliIndicatorListFromState(stateObject map[string]
Aggregation: *GetPointerFromMap[string](data, SloConfigFieldAggregation),
}, nil
}
if details, ok := stateObject["traffic"]; ok && r.isSet(details) {
if details, ok := stateObject["custom"]; ok && r.isSet(details) {
data := details.([]interface{})[0].(map[string]interface{})
var goodEventFilterExpression *restapi.TagFilter
var badEventFilterExpression *restapi.TagFilter
Expand Down Expand Up @@ -114,7 +115,7 @@ func (r *sloConfigResource) mapSloIndicatorToState(sloConfig *restapi.SloConfig)

if indicator[SloConfigAPIFieldType] == SloConfigAPIIndicatorMeasurementTypeTimeBased && indicator[SloConfigAPIFieldBlueprint] == SloConfigAPIIndicatorBlueprintAvailability {
result := map[string]interface{}{
"time_based_latency": []interface{}{
"time_based_availability": []interface{}{
map[string]interface{}{
SloConfigFieldThreshold: indicator[SloConfigAPIFieldThreshold].(float64),
SloConfigFieldAggregation: indicator[SloConfigAPIFieldAggregation].(string),
Expand All @@ -125,7 +126,9 @@ func (r *sloConfigResource) mapSloIndicatorToState(sloConfig *restapi.SloConfig)
}
if indicator[SloConfigAPIFieldType] == SloConfigAPIIndicatorMeasurementTypeEventBased && indicator[SloConfigAPIFieldBlueprint] == SloConfigAPIIndicatorBlueprintAvailability {
result := map[string]interface{}{
"event_based_latency": []interface{}{},
"event_based_availability": []interface{}{
map[string]interface{}{},
},
}
return result, nil
}
Expand All @@ -143,20 +146,30 @@ func (r *sloConfigResource) mapSloIndicatorToState(sloConfig *restapi.SloConfig)
return result, nil
}
if indicator[SloConfigAPIFieldType] == SloConfigAPIIndicatorMeasurementTypeEventBased && indicator[SloConfigAPIFieldBlueprint] == SloConfigAPIIndicatorBlueprintCustom {
goodEventFilterExp, validExp1, err1 := fiterExpFromAPIModel(indicator[SloConfigAPIFieldGoodEventFilter])
if validExp1 {
return nil, err1
var err error
goodTagFilter, err := getTagFilterFromAPIModel(indicator[SloConfigAPIFieldGoodEventFilter])
if err != nil {
return nil, err
}
mappedTagFilter, err := tagfilter.MapTagFilterToNormalizedString(goodTagFilter)
if err != nil {
return nil, err
}

badTagFilter, err := getTagFilterFromAPIModel(indicator[SloConfigAPIFieldBadEventFilter])
if err != nil {
return nil, err
}
badEventFilterExp, validExp2, err2 := fiterExpFromAPIModel(indicator[SloConfigAPIFieldBadEventFilter])
if validExp2 {
return nil, err2
mappedBadTagFilter, err := tagfilter.MapTagFilterToNormalizedString(badTagFilter)
if err != nil {
return nil, err
}

result := map[string]interface{}{
"custom": []interface{}{
map[string]interface{}{
SloConfigFieldGoodEventFilterExpression: goodEventFilterExp,
SloConfigFieldBadEventFilterExpression: badEventFilterExp,
SloConfigFieldGoodEventFilterExpression: mappedTagFilter,
SloConfigFieldBadEventFilterExpression: mappedBadTagFilter,
},
},
}
Expand Down
17 changes: 17 additions & 0 deletions instana/resource-slo-config.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,23 @@ func fiterExpFromAPIModel(filter interface{}) (*tagfilter.FilterExpression, bool
return t, false, nil
}

// helper function to convert a map[string]interface{} from the API response to a *restapi.TagFilter
func getTagFilterFromAPIModel(input interface{}) (*restapi.TagFilter, error) {
m, ok := input.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("failed to convert tag filter from API model: got %T", input)
}
b, err := json.Marshal(m)
if err != nil {
return nil, err
}
var tagFilter restapi.TagFilter
if err := json.Unmarshal(b, &tagFilter); err != nil {
return nil, err
}
return &tagFilter, nil
}

func (r *sloConfigResource) mapTagFilterStringToAPIModel(input string) (*restapi.TagFilter, error) {
parser := tagfilter.NewParser()
expr, err := parser.Parse(input)
Expand Down
2 changes: 2 additions & 0 deletions instana/tag-filter-schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ var tagFilterValidateFunc = func(val interface{}, key string) (warns []string, e

var OptionalTagFilterExpressionSchema = &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
Description: "The tag filter expression",
DiffSuppressFunc: tagFilterDiffSuppressFunc,
Expand All @@ -43,6 +44,7 @@ var OptionalTagFilterExpressionSchema = &schema.Schema{

var RequiredTagFilterExpressionSchema = &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Required: true,
Description: "The tag filter expression",
DiffSuppressFunc: tagFilterDiffSuppressFunc,
Expand Down
Loading