Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add website metrics to LogicMonitor [PC-15088] #359

Merged
merged 5 commits into from
Jan 23, 2025
Merged
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
60 changes: 45 additions & 15 deletions docs/resources/slo.md
Original file line number Diff line number Diff line change
Expand Up @@ -561,10 +561,16 @@ Optional:

Required:

- `device_data_source_instance_id` (Number) Device Datasource Instance ID
- `graph_id` (Number) Graph ID
- `line` (String) Line
- `query_type` (String) Query type: device_metrics
- `query_type` (String) Query type: device_metrics or website_metrics

Optional:

- `checkpoint_id` (String) Checkpoint ID. Used by Query type = website_metrics
- `device_data_source_instance_id` (Number) Device Datasource Instance ID. Used by Query type = device_metrics
- `graph_id` (Number) Graph ID. Used by Query type = device_metrics
- `graph_name` (String) Graph Name. Used by Query type = website_metrics
- `website_id` (String) Website ID. Used by Query type = website_metrics


<a id="nestedblock--objective--count_metrics--bad--newrelic"></a>
Expand Down Expand Up @@ -926,10 +932,16 @@ Optional:

Required:

- `device_data_source_instance_id` (Number) Device Datasource Instance ID
- `graph_id` (Number) Graph ID
- `line` (String) Line
- `query_type` (String) Query type: device_metrics
- `query_type` (String) Query type: device_metrics or website_metrics

Optional:

- `checkpoint_id` (String) Checkpoint ID. Used by Query type = website_metrics
- `device_data_source_instance_id` (Number) Device Datasource Instance ID. Used by Query type = device_metrics
- `graph_id` (Number) Graph ID. Used by Query type = device_metrics
- `graph_name` (String) Graph Name. Used by Query type = website_metrics
- `website_id` (String) Website ID. Used by Query type = website_metrics


<a id="nestedblock--objective--count_metrics--good--newrelic"></a>
Expand Down Expand Up @@ -1291,10 +1303,16 @@ Optional:

Required:

- `device_data_source_instance_id` (Number) Device Datasource Instance ID
- `graph_id` (Number) Graph ID
- `line` (String) Line
- `query_type` (String) Query type: device_metrics
- `query_type` (String) Query type: device_metrics or website_metrics

Optional:

- `checkpoint_id` (String) Checkpoint ID. Used by Query type = website_metrics
- `device_data_source_instance_id` (Number) Device Datasource Instance ID. Used by Query type = device_metrics
- `graph_id` (Number) Graph ID. Used by Query type = device_metrics
- `graph_name` (String) Graph Name. Used by Query type = website_metrics
- `website_id` (String) Website ID. Used by Query type = website_metrics


<a id="nestedblock--objective--count_metrics--good_total--newrelic"></a>
Expand Down Expand Up @@ -1656,10 +1674,16 @@ Optional:

Required:

- `device_data_source_instance_id` (Number) Device Datasource Instance ID
- `graph_id` (Number) Graph ID
- `line` (String) Line
- `query_type` (String) Query type: device_metrics
- `query_type` (String) Query type: device_metrics or website_metrics

Optional:

- `checkpoint_id` (String) Checkpoint ID. Used by Query type = website_metrics
- `device_data_source_instance_id` (Number) Device Datasource Instance ID. Used by Query type = device_metrics
- `graph_id` (Number) Graph ID. Used by Query type = device_metrics
- `graph_name` (String) Graph Name. Used by Query type = website_metrics
- `website_id` (String) Website ID. Used by Query type = website_metrics


<a id="nestedblock--objective--count_metrics--total--newrelic"></a>
Expand Down Expand Up @@ -2029,10 +2053,16 @@ Optional:

Required:

- `device_data_source_instance_id` (Number) Device Datasource Instance ID
- `graph_id` (Number) Graph ID
- `line` (String) Line
- `query_type` (String) Query type: device_metrics
- `query_type` (String) Query type: device_metrics or website_metrics

Optional:

- `checkpoint_id` (String) Checkpoint ID. Used by Query type = website_metrics
- `device_data_source_instance_id` (Number) Device Datasource Instance ID. Used by Query type = device_metrics
- `graph_id` (Number) Graph ID. Used by Query type = device_metrics
- `graph_name` (String) Graph Name. Used by Query type = website_metrics
- `website_id` (String) Website ID. Used by Query type = website_metrics


<a id="nestedblock--objective--raw_metric--query--newrelic"></a>
Expand Down
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0
github.com/hashicorp/terraform-plugin-testing v1.11.0
github.com/kelseyhightower/envconfig v1.4.0
github.com/nobl9/nobl9-go v0.92.2
github.com/nobl9/nobl9-go v0.93.0
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.10.0
github.com/teambition/rrule-go v1.8.2
Expand All @@ -26,15 +26,15 @@ require (
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.2.0 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/MicahParks/jwkset v0.7.0 // indirect
github.com/MicahParks/keyfunc/v3 v3.3.5 // indirect
github.com/MicahParks/jwkset v0.8.0 // indirect
github.com/MicahParks/keyfunc/v3 v3.3.10 // indirect
github.com/ProtonMail/go-crypto v1.1.0-alpha.2 // indirect
github.com/agext/levenshtein v1.2.3 // indirect
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
github.com/armon/go-radix v1.0.0 // indirect
github.com/aws/aws-sdk-go v1.55.5 // indirect
github.com/aws/aws-sdk-go v1.55.6 // indirect
github.com/bgentry/speakeasy v0.1.0 // indirect
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.18.0 // indirect
Expand Down
20 changes: 10 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7Y
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
github.com/MicahParks/jwkset v0.7.0 h1:CXWuiYBk5NuTl+N/3UI3UcYNH79yWuKAZWZkc/y+7Ok=
github.com/MicahParks/jwkset v0.7.0/go.mod h1:fVrj6TmG1aKlJEeceAz7JsXGTXEn72zP1px3us53JrA=
github.com/MicahParks/keyfunc/v3 v3.3.5 h1:7ceAJLUAldnoueHDNzF8Bx06oVcQ5CfJnYwNt1U3YYo=
github.com/MicahParks/keyfunc/v3 v3.3.5/go.mod h1:SdCCyMJn/bYqWDvARspC6nCT8Sk74MjuAY22C7dCST8=
github.com/MicahParks/jwkset v0.8.0 h1:jHtclI38Gibmu17XMI6+6/UB59srp58pQVxePHRK5o8=
github.com/MicahParks/jwkset v0.8.0/go.mod h1:fVrj6TmG1aKlJEeceAz7JsXGTXEn72zP1px3us53JrA=
github.com/MicahParks/keyfunc/v3 v3.3.10 h1:JtEGE8OcNeI297AMrR4gVXivV8fyAawFUMkbwNreJRk=
github.com/MicahParks/keyfunc/v3 v3.3.10/go.mod h1:1TEt+Q3FO7Yz2zWeYO//fMxZMOiar808NqjWQQpBPtU=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg=
Expand All @@ -25,12 +25,12 @@ github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk=
github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bmatcuk/doublestar/v4 v4.8.0 h1:DSXtrypQddoug1459viM9X9D3dp1Z7993fw36I2kNcQ=
github.com/bmatcuk/doublestar/v4 v4.8.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
Expand Down Expand Up @@ -194,8 +194,8 @@ github.com/nobl9/go-yaml v1.0.1 h1:Aj1kSaYdRQTKlvS6ihvXzQJhCpoHhtf9nfA95zqWH4Q=
github.com/nobl9/go-yaml v1.0.1/go.mod h1:t7vCO8ctYdBweZxU5lUgxzAw31+ZcqJYeqRtrv+5RHI=
github.com/nobl9/govy v0.11.0 h1:8Z+tj/eEz9YcFetg53K/jb4FYKB1gk6AiDtUq6NOrEg=
github.com/nobl9/govy v0.11.0/go.mod h1:O+xSiKwZ6gs/orRvH5qLkfkgyT7CkuXprRIq3C5uNXQ=
github.com/nobl9/nobl9-go v0.92.2 h1:WYYupYy8zYbSECVJ334m0bgubtZh4i0B1JGiihHgSiQ=
github.com/nobl9/nobl9-go v0.92.2/go.mod h1:SWvmmfSGCairnWDCdRLusRB0zROxF+7XiA9aho2f7rA=
github.com/nobl9/nobl9-go v0.93.0 h1:b0hAX9SHthPG07DnNB2eMkJBqksZxwmZCpjDYNB1Uqw=
github.com/nobl9/nobl9-go v0.93.0/go.mod h1:nini79JJ6FfUtPCiiToIIkv9azqmoEqVjYO1jUnijaQ=
github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
Expand Down
62 changes: 52 additions & 10 deletions nobl9/resource_slo.go
Original file line number Diff line number Diff line change
Expand Up @@ -2267,6 +2267,20 @@ func unmarshalLightstepMetric(metric interface{}) map[string]interface{} {
const logicMonitorMetric = "logic_monitor"

func schemaLogicMonitorMetric() map[string]*schema.Schema {
validateQueryType := func(v any, p cty.Path) diag.Diagnostics {
value := v.(string)
var diags diag.Diagnostics
if value != v1alphaSLO.LMQueryTypeDeviceMetrics && value != v1alphaSLO.LMQueryTypeWebsiteMetrics {
diagnostic := diag.Diagnostic{
Severity: diag.Error,
Summary: "wrong value",
Detail: fmt.Sprintf("%q is not %q or %q", value,
v1alphaSLO.LMQueryTypeDeviceMetrics, v1alphaSLO.LMQueryTypeWebsiteMetrics),
}
diags = append(diags, diagnostic)
}
return diags
}
return map[string]*schema.Schema{
logicMonitorMetric: {
Type: schema.TypeSet,
Expand All @@ -2275,19 +2289,35 @@ func schemaLogicMonitorMetric() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"query_type": {
Type: schema.TypeString,
Required: true,
Description: "Query type: device_metrics",
Type: schema.TypeString,
Required: true,
Description: "Query type: device_metrics or website_metrics",
ValidateDiagFunc: validateQueryType,
},
"device_data_source_instance_id": {
Type: schema.TypeInt,
Required: true,
Description: "Device Datasource Instance ID",
Optional: true,
Description: "Device Datasource Instance ID. Used by Query type = device_metrics",
},
"graph_id": {
Type: schema.TypeInt,
Required: true,
Description: "Graph ID",
Optional: true,
Description: "Graph ID. Used by Query type = device_metrics",
},
"website_id": {
Type: schema.TypeString,
Optional: true,
Description: "Website ID. Used by Query type = website_metrics",
},
"checkpoint_id": {
Type: schema.TypeString,
Optional: true,
Description: "Checkpoint ID. Used by Query type = website_metrics",
},
"graph_name": {
Type: schema.TypeString,
Optional: true,
Description: "Graph Name. Used by Query type = website_metrics",
},
"line": {
Type: schema.TypeString,
Expand All @@ -2311,17 +2341,22 @@ func marshalLogicMonitorMetric(s *schema.Set) *v1alphaSLO.LogicMonitorMetric {
if value := metric["query_type"].(string); value != "" {
QueryType = value
}
line := metric["line"].(string)

deviceDataSourceInstanceID := metric["device_data_source_instance_id"].(int)

graphId := metric["graph_id"].(int)

line := metric["line"].(string)
websiteID := metric["website_id"].(string)
checkpointID := metric["checkpoint_id"].(string)
graphName := metric["graph_name"].(string)

return &v1alphaSLO.LogicMonitorMetric{
QueryType: QueryType,
DeviceDataSourceInstanceID: deviceDataSourceInstanceID,
GraphID: graphId,
WebsiteID: websiteID,
CheckpointID: checkpointID,
GraphName: graphName,
Line: line,
}
}
Expand All @@ -2333,9 +2368,16 @@ func unmarshalLogicMonitorMetric(metric interface{}) map[string]interface{} {
}
res := make(map[string]interface{})
res["query_type"] = lMetric.QueryType
res["line"] = lMetric.Line

// For QueryType = LMQueryTypeDeviceMetrics
res["device_data_source_instance_id"] = lMetric.DeviceDataSourceInstanceID
res["graph_id"] = lMetric.GraphID
res["line"] = lMetric.Line

// For QueryType = LMQueryTypeWebsiteMetrics
res["website_id"] = lMetric.WebsiteID
res["checkpoint_id"] = lMetric.CheckpointID
res["graph_name"] = lMetric.GraphName

return res
}
Expand Down
69 changes: 67 additions & 2 deletions nobl9/resource_slo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ func TestAcc_Nobl9SLO(t *testing.T) {
{"test-instana-infra", testInstanaInfrastructureSLO},
{"test-instana-app", testInstanaApplicationSLO},
{"test-lightstep", testLightstepSLO},
{"test-logic-monitor", testLogicMonitorMetricsSLO},
{"test-logic-monitor", testLogicMonitorDeviceMetricsSLO},
{"test-logic-monitor-website", testLogicMonitorWebsiteMetricsSLO},
{"test-multiple-ap", testMultipleAlertPolicies},
{"test-newrelic", testNewRelicSLO},
{"test-opentsdb", testOpenTSDBSLO},
Expand Down Expand Up @@ -1799,7 +1800,7 @@ resource "nobl9_slo" ":name" {
return config
}

func testLogicMonitorMetricsSLO(name string) string {
func testLogicMonitorDeviceMetricsSLO(name string) string {
var serviceName = name + "-tf-service"
var agentName = name + "-tf-agent"
config :=
Expand Down Expand Up @@ -1862,6 +1863,70 @@ resource "nobl9_slo" ":name" {
return config
}

func testLogicMonitorWebsiteMetricsSLO(name string) string {
var serviceName = name + "-tf-service"
var agentName = name + "-tf-agent"
config :=
testService(serviceName) +
testLogicMonitorAgent(agentName) + `
resource "nobl9_slo" ":name" {
name = ":name"
display_name = ":name"
project = ":project"
service = nobl9_service.:serviceName.name

label {
key = "team"
values = ["green","sapphire"]
}

label {
key = "env"
values = ["dev", "staging", "prod"]
}

budgeting_method = "Occurrences"

objective {
display_name = "obj1"
name = "tf-objective-1"
target = 0.7
value = 1
op = "lt"
raw_metric {
query {
logic_monitor {
query_type = "website_metrics"
website_id = "1"
checkpoint_id = "775430648"
graph_name = "responseTime"
line = "AVERAGE"
}
}
}
}

time_window {
count = 10
is_rolling = true
unit = "Minute"
}

indicator {
name = nobl9_agent.:agentName.name
project = ":project"
kind = "Agent"
}
}
`
config = strings.ReplaceAll(config, ":name", name)
config = strings.ReplaceAll(config, ":serviceName", serviceName)
config = strings.ReplaceAll(config, ":agentName", agentName)
config = strings.ReplaceAll(config, ":project", testProject)

return config
}

func testMultipleAlertPolicies(name string) string {
var serviceName = name + "-tf-service"
var agentName = name + "-tf-agent"
Expand Down
Loading