Skip to content

Commit c6e1061

Browse files
Add support for dataproc oss metric collection (#7087) (#13480)
fixes #12848 Signed-off-by: Modular Magician <[email protected]> Signed-off-by: Modular Magician <[email protected]>
1 parent 82fee5e commit c6e1061

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed

.changelog/7087.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
dataproc: added support for `dataproc_metric_config` to resource `google_dataproc_cluster`
3+
```

google/resource_dataproc_cluster.go

+92
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ var (
8484
"cluster_config.0.software_config.0.optional_components",
8585
}
8686

87+
dataprocMetricConfigKeys = []string{
88+
"cluster_config.0.dataproc_metric_config.0.metrics",
89+
}
90+
91+
metricKeys = []string{
92+
"cluster_config.0.dataproc_metric_config.0.metrics.0.metric_source",
93+
"cluster_config.0.dataproc_metric_config.0.metrics.0.metric_overrides",
94+
}
95+
8796
clusterConfigKeys = []string{
8897
"cluster_config.0.staging_bucket",
8998
"cluster_config.0.temp_bucket",
@@ -99,6 +108,7 @@ var (
99108
"cluster_config.0.metastore_config",
100109
"cluster_config.0.lifecycle_config",
101110
"cluster_config.0.endpoint_config",
111+
"cluster_config.0.dataproc_metric_config",
102112
}
103113
)
104114

@@ -1086,6 +1096,24 @@ by Dataproc`,
10861096
},
10871097
},
10881098
},
1099+
1100+
"dataproc_metric_config": {
1101+
Type: schema.TypeList,
1102+
Optional: true,
1103+
MaxItems: 1,
1104+
Description: `The config for Dataproc metrics.`,
1105+
AtLeastOneOf: clusterConfigKeys,
1106+
Elem: &schema.Resource{
1107+
Schema: map[string]*schema.Schema{
1108+
"metrics": {
1109+
Type: schema.TypeList,
1110+
Required: true,
1111+
Description: `Metrics sources to enable.`,
1112+
Elem: metricsSchema(),
1113+
},
1114+
},
1115+
},
1116+
},
10891117
},
10901118
},
10911119
},
@@ -1094,6 +1122,28 @@ by Dataproc`,
10941122
}
10951123
}
10961124

1125+
// We need to pull metrics' schema out so we can use it to make a set hash func
1126+
func metricsSchema() *schema.Resource {
1127+
return &schema.Resource{
1128+
Schema: map[string]*schema.Schema{
1129+
"metric_source": {
1130+
Type: schema.TypeString,
1131+
ForceNew: true,
1132+
Required: true,
1133+
ValidateFunc: validation.StringInSlice([]string{"MONITORING_AGENT_DEFAULTS", "HDFS", "SPARK", "YARN", "SPARK_HISTORY_SERVER", "HIVESERVER2"}, false),
1134+
Description: `A source for the collection of Dataproc OSS metrics (see [available OSS metrics] (https://cloud.google.com//dataproc/docs/guides/monitoring#available_oss_metrics)).`,
1135+
},
1136+
"metric_overrides": {
1137+
Type: schema.TypeSet,
1138+
Elem: &schema.Schema{Type: schema.TypeString},
1139+
Optional: true,
1140+
ForceNew: true,
1141+
Description: `Specify one or more [available OSS metrics] (https://cloud.google.com/dataproc/docs/guides/monitoring#available_oss_metrics) to collect.`,
1142+
},
1143+
},
1144+
}
1145+
}
1146+
10971147
func instanceConfigSchema(parent string) *schema.Schema {
10981148
var instanceConfigKeys = []string{
10991149
"cluster_config.0." + parent + ".0.num_instances",
@@ -1544,6 +1594,10 @@ func expandClusterConfig(d *schema.ResourceData, config *Config) (*dataproc.Clus
15441594
conf.EndpointConfig = expandEndpointConfig(cfg)
15451595
}
15461596

1597+
if cfg, ok := configOptions(d, "cluster_config.0.dataproc_metric_config"); ok {
1598+
conf.DataprocMetricConfig = expandDataprocMetricConfig(cfg)
1599+
}
1600+
15471601
if cfg, ok := configOptions(d, "cluster_config.0.master_config"); ok {
15481602
log.Println("[INFO] got master_config")
15491603
conf.MasterConfig = expandInstanceGroupConfig(cfg)
@@ -1762,6 +1816,23 @@ func expandEndpointConfig(cfg map[string]interface{}) *dataproc.EndpointConfig {
17621816
return conf
17631817
}
17641818

1819+
func expandDataprocMetricConfig(cfg map[string]interface{}) *dataproc.DataprocMetricConfig {
1820+
conf := &dataproc.DataprocMetricConfig{}
1821+
metricsConfigs := cfg["metrics"].([]interface{})
1822+
metricsSet := make([]*dataproc.Metric, 0, len(metricsConfigs))
1823+
1824+
for _, raw := range metricsConfigs {
1825+
data := raw.(map[string]interface{})
1826+
metric := dataproc.Metric{
1827+
MetricSource: data["metric_source"].(string),
1828+
MetricOverrides: convertStringSet(data["metric_overrides"].(*schema.Set)),
1829+
}
1830+
metricsSet = append(metricsSet, &metric)
1831+
}
1832+
conf.Metrics = metricsSet
1833+
return conf
1834+
}
1835+
17651836
func expandMetastoreConfig(cfg map[string]interface{}) *dataproc.MetastoreConfig {
17661837
conf := &dataproc.MetastoreConfig{}
17671838
if v, ok := cfg["dataproc_metastore_service"]; ok {
@@ -2171,6 +2242,7 @@ func flattenClusterConfig(d *schema.ResourceData, cfg *dataproc.ClusterConfig) (
21712242
"metastore_config": flattenMetastoreConfig(d, cfg.MetastoreConfig),
21722243
"lifecycle_config": flattenLifecycleConfig(d, cfg.LifecycleConfig),
21732244
"endpoint_config": flattenEndpointConfig(d, cfg.EndpointConfig),
2245+
"dataproc_metric_config": flattenDataprocMetricConfig(d, cfg.DataprocMetricConfig),
21742246
}
21752247

21762248
if len(cfg.InitializationActions) > 0 {
@@ -2277,6 +2349,26 @@ func flattenEndpointConfig(d *schema.ResourceData, ec *dataproc.EndpointConfig)
22772349
return []map[string]interface{}{data}
22782350
}
22792351

2352+
func flattenDataprocMetricConfig(d *schema.ResourceData, dmc *dataproc.DataprocMetricConfig) []map[string]interface{} {
2353+
if dmc == nil {
2354+
return nil
2355+
}
2356+
2357+
metrics := map[string]interface{}{}
2358+
metricsTypeList := schema.NewSet(schema.HashResource(metricsSchema()), []interface{}{}).List()
2359+
for _, metric := range dmc.Metrics {
2360+
data := map[string]interface{}{
2361+
"metric_source": metric.MetricSource,
2362+
"metric_overrides": metric.MetricOverrides,
2363+
}
2364+
2365+
metricsTypeList = append(metricsTypeList, &data)
2366+
}
2367+
metrics["metrics"] = metricsTypeList
2368+
2369+
return []map[string]interface{}{metrics}
2370+
}
2371+
22802372
func flattenMetastoreConfig(d *schema.ResourceData, ec *dataproc.MetastoreConfig) []map[string]interface{} {
22812373
if ec == nil {
22822374
return nil

google/resource_dataproc_cluster_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,31 @@ func TestAccDataprocCluster_withReservationAffinity(t *testing.T) {
389389
})
390390
}
391391

392+
func TestAccDataprocCluster_withDataprocMetricConfig(t *testing.T) {
393+
t.Parallel()
394+
395+
var cluster dataproc.Cluster
396+
rnd := randString(t, 10)
397+
vcrTest(t, resource.TestCase{
398+
PreCheck: func() { testAccPreCheck(t) },
399+
Providers: testAccProviders,
400+
CheckDestroy: testAccCheckDataprocClusterDestroy(t),
401+
Steps: []resource.TestStep{
402+
{
403+
Config: testAccDataprocCluster_withDataprocMetricConfig(rnd),
404+
Check: resource.ComposeTestCheckFunc(
405+
testAccCheckDataprocClusterExists(t, "google_dataproc_cluster.basic", &cluster),
406+
407+
resource.TestCheckResourceAttr("google_dataproc_cluster.basic", "cluster_config.0.dataproc_metric_config.0.metrics.#", "2"),
408+
409+
resource.TestCheckResourceAttr("google_dataproc_cluster.basic", "cluster_config.0.dataproc_metric_config.0.metrics.0.metric_source", "HDFS"),
410+
resource.TestCheckResourceAttr("google_dataproc_cluster.basic", "cluster_config.0.dataproc_metric_config.0.metrics.0.metric_overrides.#", "1"),
411+
),
412+
},
413+
},
414+
})
415+
}
416+
392417
func TestAccDataprocCluster_withNodeGroupAffinity(t *testing.T) {
393418
t.Parallel()
394419

@@ -1430,6 +1455,29 @@ resource "google_dataproc_cluster" "basic" {
14301455
`, rnd, rnd)
14311456
}
14321457

1458+
func testAccDataprocCluster_withDataprocMetricConfig(rnd string) string {
1459+
return fmt.Sprintf(`
1460+
resource "google_dataproc_cluster" "basic" {
1461+
name = "tf-test-dproc-%s"
1462+
region = "us-central1"
1463+
1464+
cluster_config {
1465+
dataproc_metric_config {
1466+
metrics {
1467+
metric_source = "HDFS"
1468+
metric_overrides = ["yarn:ResourceManager:QueueMetrics:AppsCompleted"]
1469+
}
1470+
1471+
metrics {
1472+
metric_source = "SPARK"
1473+
metric_overrides = ["spark:driver:DAGScheduler:job.allJobs"]
1474+
}
1475+
}
1476+
}
1477+
}
1478+
`, rnd)
1479+
}
1480+
14331481
func testAccDataprocCluster_withNodeGroupAffinity(rnd string) string {
14341482
return fmt.Sprintf(`
14351483

website/docs/r/dataproc_cluster.html.markdown

+23
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,9 @@ resource "google_dataproc_cluster" "accelerated_cluster" {
372372
* `endpoint_config` (Optional) The config settings for port access on the cluster.
373373
Structure [defined below](#nested_endpoint_config).
374374

375+
* `dataproc_metric_config` (Optional) The Compute Engine accelerator (GPU) configuration for these instances. Can be specified multiple times.
376+
Structure [defined below](#nested_dataproc_metric_config).
377+
375378
* `metastore_config` (Optional) The config setting for metastore service with the cluster.
376379
Structure [defined below](#nested_metastore_config).
377380
- - -
@@ -792,6 +795,26 @@ cluster_config {
792795

793796
- - -
794797

798+
<a name="nested_dataproc_metric_config"></a>The `dataproc_metric_config` block supports:
799+
800+
```hcl
801+
dataproc_metric_config {
802+
metrics {
803+
metric_source = "HDFS"
804+
metric_overrides = ["yarn:ResourceManager:QueueMetrics:AppsCompleted"]
805+
}
806+
}
807+
```
808+
809+
810+
* `metrics` - (Required) Metrics sources to enable.
811+
812+
* `metric_source` - (Required) A source for the collection of Dataproc OSS metrics (see [available OSS metrics](https://cloud.google.com//dataproc/docs/guides/monitoring#available_oss_metrics)).
813+
814+
* `metric_overrides` - (Optional) One or more [available OSS metrics] (https://cloud.google.com/dataproc/docs/guides/monitoring#available_oss_metrics) to collect for the metric course.
815+
816+
- - -
817+
795818
<a name="nested_lifecycle_config"></a>The `lifecycle_config` block supports:
796819

797820
```hcl

0 commit comments

Comments
 (0)