diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index b856cb129184..0e5321338912 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -27793,9 +27793,7 @@ type: float Google Cloud Compute metrics - - -*`gcp.compute.instance.firewall.dropped_bytes_count.value`*:: +*`gcp.compute.firewall.dropped_bytes_count.value`*:: + -- Incoming bytes dropped by the firewall @@ -27804,7 +27802,7 @@ type: long -- -*`gcp.compute.instance.firewall.dropped_packets_count.value`*:: +*`gcp.compute.firewall.dropped_packets_count.value`*:: + -- Incoming packets dropped by the firewall @@ -27813,7 +27811,6 @@ type: long -- - *`gcp.compute.instance.cpu.reserved_cores.value`*:: + -- @@ -27823,25 +27820,24 @@ type: double -- -*`gcp.compute.instance.cpu.utilization.value`*:: +*`gcp.compute.instance.cpu.usage_time.value`*:: + -- -The fraction of the allocated CPU that is currently in use on the instance +Usage for all cores in seconds type: double -- -*`gcp.compute.instance.cpu.usage_time.value`*:: +*`gcp.compute.instance.cpu.utilization.value`*:: + -- -Usage for all cores in seconds +The fraction of the allocated CPU that is currently in use on the instance type: double -- - *`gcp.compute.instance.disk.read_bytes_count.value`*:: + -- @@ -27878,84 +27874,91 @@ type: long -- -*`gcp.compute.instance.uptime.value`*:: +*`gcp.compute.instance.memory.balloon.ram_size.value`*:: + -- -How long the VM has been running, in seconds +The total amount of memory in the VM. This metric is only available for VMs that belong to the e2 family. type: long -- - -*`gcp.compute.instance.network.received_bytes_count.value`*:: +*`gcp.compute.instance.memory.balloon.ram_used.value`*:: + -- -Count of bytes received from the network +Memory currently used in the VM. This metric is only available for VMs that belong to the e2 family. type: long -- -*`gcp.compute.instance.network.received_packets_count.value`*:: +*`gcp.compute.instance.memory.balloon.swap_in_bytes_count.value`*:: + -- -Count of packets received from the network +The amount of memory read into the guest from its own swap space. This metric is only available for VMs that belong to the e2 family. type: long -- -*`gcp.compute.instance.network.sent_bytes_count.value`*:: +*`gcp.compute.instance.memory.balloon.swap_out_bytes_count.value`*:: + -- -Count of bytes sent over the network +The amount of memory written from the guest to its own swap space. This metric is only available for VMs that belong to the e2 family. type: long -- -*`gcp.compute.instance.network.sent_packets_count.value`*:: +*`gcp.compute.instance.network.received_bytes_count.value`*:: + -- -Count of packets sent over the network +Count of bytes received from the network type: long -- +*`gcp.compute.instance.network.received_packets_count.value`*:: ++ +-- +Count of packets received from the network -*`gcp.compute.instance.memory.balloon.ram_size.value`*:: +type: long + +-- + +*`gcp.compute.instance.network.sent_bytes_count.value`*:: + -- -The total amount of memory in the VM. This metric is only available for VMs that belong to the e2 family. +Count of bytes sent over the network type: long -- -*`gcp.compute.instance.memory.balloon.ram_used.value`*:: +*`gcp.compute.instance.network.sent_packets_count.value`*:: + -- -Memory currently used in the VM. This metric is only available for VMs that belong to the e2 family. +Count of packets sent over the network type: long -- -*`gcp.compute.instance.memory.balloon.swap_in_bytes_count.value`*:: +*`gcp.compute.instance.uptime.value`*:: + -- -The amount of memory read into the guest from its own swap space. This metric is only available for VMs that belong to the e2 family. +Number of seconds the VM has been running. type: long -- -*`gcp.compute.instance.memory.balloon.swap_out_bytes_count.value`*:: +*`gcp.compute.instance.uptime_total.value`*:: + -- -The amount of memory written from the guest to its own swap space. This metric is only available for VMs that belong to the e2 family. +Elapsed time since the VM was started, in seconds. Sampled every 60 seconds. After sampling, data is not visible for up to 120 seconds. type: long diff --git a/x-pack/metricbeat/module/gcp/compute/_meta/fields.yml b/x-pack/metricbeat/module/gcp/compute/_meta/fields.yml index 06895b421291..b4e05a8ff519 100644 --- a/x-pack/metricbeat/module/gcp/compute/_meta/fields.yml +++ b/x-pack/metricbeat/module/gcp/compute/_meta/fields.yml @@ -1,77 +1,62 @@ - name: compute + description: Google Cloud Compute metrics release: beta type: group - description: Google Cloud Compute metrics fields: - - name: instance - type: group - fields: - - name: firewall - type: group - fields: - - name: dropped_bytes_count.value - type: long - description: Incoming bytes dropped by the firewall - - name: dropped_packets_count.value - type: long - description: Incoming packets dropped by the firewall - - name: cpu - type: group - fields: - - name: reserved_cores.value - type: double - description: Number of cores reserved on the host of the instance - - name: utilization.value - type: double - description: The fraction of the allocated CPU that is currently in use on the instance - - name: usage_time.value - type: double - description: Usage for all cores in seconds - - name: disk - type: group - fields: - - name: read_bytes_count.value - type: long - description: Count of bytes read from disk - - name: read_ops_count.value - type: long - description: Count of disk read IO operations - - name: write_bytes_count.value - type: long - description: Count of bytes written to disk - - name: write_ops_count.value - type: long - description: Count of disk write IO operations - - name: uptime.value - type: long - description: How long the VM has been running, in seconds - - name: network - type: group - fields: - - name: received_bytes_count.value - type: long - description: Count of bytes received from the network - - name: received_packets_count.value - type: long - description: Count of packets received from the network - - name: sent_bytes_count.value - type: long - description: Count of bytes sent over the network - - name: sent_packets_count.value - type: long - description: Count of packets sent over the network - - name: memory.balloon - type: group - fields: - - name: ram_size.value - type: long - description: The total amount of memory in the VM. This metric is only available for VMs that belong to the e2 family. - - name: ram_used.value - type: long - description: Memory currently used in the VM. This metric is only available for VMs that belong to the e2 family. - - name: swap_in_bytes_count.value - type: long - description: The amount of memory read into the guest from its own swap space. This metric is only available for VMs that belong to the e2 family. - - name: swap_out_bytes_count.value - type: long - description: The amount of memory written from the guest to its own swap space. This metric is only available for VMs that belong to the e2 family. + - name: firewall.dropped_bytes_count.value + type: long + description: Incoming bytes dropped by the firewall + - name: firewall.dropped_packets_count.value + type: long + description: Incoming packets dropped by the firewall + - name: instance.cpu.reserved_cores.value + type: double + description: Number of cores reserved on the host of the instance + - name: instance.cpu.usage_time.value + type: double + description: Usage for all cores in seconds + - name: instance.cpu.utilization.value + type: double + description: The fraction of the allocated CPU that is currently in use on the instance + - name: instance.disk.read_bytes_count.value + type: long + description: Count of bytes read from disk + - name: instance.disk.read_ops_count.value + type: long + description: Count of disk read IO operations + - name: instance.disk.write_bytes_count.value + type: long + description: Count of bytes written to disk + - name: instance.disk.write_ops_count.value + type: long + description: Count of disk write IO operations + - name: instance.memory.balloon.ram_size.value + type: long + description: The total amount of memory in the VM. This metric is only available for VMs that belong to the e2 family. + - name: instance.memory.balloon.ram_used.value + type: long + description: Memory currently used in the VM. This metric is only available for VMs that belong to the e2 family. + - name: instance.memory.balloon.swap_in_bytes_count.value + type: long + description: The amount of memory read into the guest from its own swap space. This metric is only available for VMs that belong to the e2 family. + - name: instance.memory.balloon.swap_out_bytes_count.value + type: long + description: The amount of memory written from the guest to its own swap space. This metric is only available for VMs that belong to the e2 family. + - name: instance.network.received_bytes_count.value + type: long + description: Count of bytes received from the network + - name: instance.network.received_packets_count.value + type: long + description: Count of packets received from the network + - name: instance.network.sent_bytes_count.value + type: long + description: Count of bytes sent over the network + - name: instance.network.sent_packets_count.value + type: long + description: Count of packets sent over the network + - name: instance.uptime.value + type: long + description: Number of seconds the VM has been running. + - name: instance.uptime_total.value + type: long + description: Elapsed time since the VM was started, in seconds. Sampled every 60 seconds. After sampling, data is not visible for up to 120 seconds. diff --git a/x-pack/metricbeat/module/gcp/compute/compute_integration_test.go b/x-pack/metricbeat/module/gcp/compute/compute_integration_test.go index 522b9ba04010..71d41a283a01 100644 --- a/x-pack/metricbeat/module/gcp/compute/compute_integration_test.go +++ b/x-pack/metricbeat/module/gcp/compute/compute_integration_test.go @@ -11,11 +11,27 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/assert" + "github.com/elastic/beats/v7/libbeat/common" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" "github.com/elastic/beats/v7/x-pack/metricbeat/module/gcp/metrics" ) +func TestFetch(t *testing.T) { + config := metrics.GetConfigForTest(t, "compute") + fmt.Printf("%+v\n", config) + + metricSet := mbtest.NewReportingMetricSetV2WithContext(t, config) + events, errs := mbtest.ReportingFetchV2WithContext(metricSet) + if len(errs) > 0 { + t.Fatalf("Expected 0 error, had %d. %v\n", len(errs), errs) + } + + assert.NotEmpty(t, events) + mbtest.TestMetricsetFieldsDocumented(t, metricSet, events) +} + func TestData(t *testing.T) { metricPrefixIs := func(metricPrefix string) func(e common.MapStr) bool { return func(e common.MapStr) bool { diff --git a/x-pack/metricbeat/module/gcp/compute/manifest.yml b/x-pack/metricbeat/module/gcp/compute/manifest.yml index f5013e3a21c2..4b9fe69dc432 100644 --- a/x-pack/metricbeat/module/gcp/compute/manifest.yml +++ b/x-pack/metricbeat/module/gcp/compute/manifest.yml @@ -24,3 +24,4 @@ input: - "instance/network/sent_bytes_count" - "instance/network/sent_packets_count" - "instance/uptime" + - "instance/uptime_total" diff --git a/x-pack/metricbeat/module/gcp/fields.go b/x-pack/metricbeat/module/gcp/fields.go index 16d31715cf72..56b20c4eca10 100644 --- a/x-pack/metricbeat/module/gcp/fields.go +++ b/x-pack/metricbeat/module/gcp/fields.go @@ -19,5 +19,5 @@ func init() { // AssetGcp returns asset data. // This is the base64 encoded zlib format compressed contents of module/gcp. func AssetGcp() string { - return "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" + return "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" }