Skip to content

Commit 7b47787

Browse files
Address machineType not being returned in GCP metadata (#1435)
Related: elastic/apm#847
1 parent 0b4a9ac commit 7b47787

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

lib/elastic_apm/metadata/cloud_info.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,18 @@ def fetch_gcp
9494
return unless resp.status == 200
9595
return unless (metadata = JSON.parse(resp.body.to_s))
9696

97-
zone = metadata["instance"]["zone"]&.split("/")&.at(-1)
98-
9997
self.provider = "gcp"
100-
self.instance_id = metadata["instance"]["id"].to_s
101-
self.instance_name = metadata["instance"]["name"]
10298
self.project_id = metadata["project"]["projectId"]
99+
100+
return unless metadata['instance']
101+
102+
zone = metadata["instance"]["zone"]&.split("/")&.at(-1)
103103
self.availability_zone = zone
104104
self.region = zone.split("-")[0..-2].join("-")
105-
self.machine_type = metadata["instance"]["machineType"].split("/")[-1]
105+
106+
self.instance_id = metadata["instance"]["id"].to_s
107+
self.instance_name = metadata["instance"]["name"]
108+
self.machine_type = metadata["instance"]["machineType"]&.split("/")&.at(-1)
106109
rescue HTTP::TimeoutError, HTTP::ConnectionError
107110
nil
108111
end

spec/elastic_apm/metadata/cloud_info_spec.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ module CloudExamples
5454
}
5555
JSON
5656

57+
GCP_NO_MACHINE_EXAMPLE = <<-JSON
58+
{
59+
"instance": {
60+
"id": 4306570268266786072,
61+
"name": "basepi-test",
62+
"zone": "projects/513326162531/zones/us-west3-a"
63+
},
64+
"project": {"numericProjectId": 513326162531, "projectId": "elastic-apm"}
65+
}
66+
JSON
67+
68+
GCP_NO_INSTANCE_EXAMPLE = <<-JSON
69+
{ "project": {"numericProjectId": 513326162531, "projectId": "elastic-apm"} }
70+
JSON
71+
72+
5773
AZURE_EXAMPLE = <<-JSON
5874
{
5975
"location": "westus2",
@@ -118,6 +134,52 @@ module CloudExamples
118134
end
119135
end
120136

137+
context 'gcp no machine_type' do
138+
let (:config) { Config.new(cloud_provider: 'gcp') }
139+
before do
140+
@gcp_mock =
141+
WebMock.stub_request(:get, Metadata::CloudInfo::GCP_URI)
142+
.to_return(body: CloudExamples::GCP_NO_MACHINE_EXAMPLE)
143+
end
144+
145+
it 'fetches metadata from gcp' do
146+
subject.fetch!
147+
148+
expect(subject.provider).to eq('gcp')
149+
expect(subject.instance_id).to eq("4306570268266786072")
150+
expect(subject.instance_name).to eq("basepi-test")
151+
expect(subject.project_id).to eq('elastic-apm')
152+
expect(subject.availability_zone).to eq('us-west3-a')
153+
expect(subject.region).to eq('us-west3')
154+
expect(subject.machine_type).to be nil
155+
156+
expect(@gcp_mock).to have_been_requested
157+
end
158+
end
159+
160+
context 'gcp no instance' do
161+
let (:config) { Config.new(cloud_provider: 'gcp') }
162+
before do
163+
@gcp_mock =
164+
WebMock.stub_request(:get, Metadata::CloudInfo::GCP_URI)
165+
.to_return(body: CloudExamples::GCP_NO_INSTANCE_EXAMPLE)
166+
end
167+
168+
it 'fetches metadata from gcp' do
169+
subject.fetch!
170+
171+
expect(subject.provider).to eq('gcp')
172+
expect(subject.project_id).to eq('elastic-apm')
173+
expect(subject.instance_id).to be nil
174+
expect(subject.instance_name).to be nil
175+
expect(subject.availability_zone).to be nil
176+
expect(subject.region).to be nil
177+
expect(subject.machine_type).to be nil
178+
179+
expect(@gcp_mock).to have_been_requested
180+
end
181+
end
182+
121183
context 'azure' do
122184
let(:config) { Config.new(cloud_provider: 'azure') }
123185

0 commit comments

Comments
 (0)