test/plugin/base_test.rb in fluent-plugin-google-cloud-0.8.7 vs test/plugin/base_test.rb in fluent-plugin-google-cloud-0.9.0
- old
+ new
@@ -17,15 +17,16 @@
Coveralls.wear!
require 'google/apis'
require 'helper'
require 'mocha/test_unit'
-require 'webmock/test_unit'
require 'prometheus/client'
+require 'webmock/test_unit'
require_relative 'asserts'
require_relative 'constants'
+require_relative 'utils'
module Monitoring
# Prevent OpenCensus from writing to the network.
class OpenCensusMonitoringRegistry
def export
@@ -36,35 +37,25 @@
# Unit tests for Google Cloud Logging plugin
module BaseTest
include Asserts
include Constants
+ include Utils
def setup
Fluent::Test.setup
- # delete environment variables that googleauth uses to find credentials.
- ENV.delete(CREDENTIALS_PATH_ENV_VAR)
- # service account env.
- ENV.delete(PRIVATE_KEY_VAR)
- ENV.delete(CLIENT_EMAIL_VAR)
- ENV.delete(PROJECT_ID_VAR)
- # authorized_user env.
- ENV.delete(CLIENT_ID_VAR)
- ENV.delete(CLIENT_SECRET_VAR)
- ENV.delete(REFRESH_TOKEN_VAR)
- # home var, which is used to find $HOME/.gcloud/...
- ENV.delete('HOME')
+ delete_env_vars
# Unregister Prometheus metrics.
registry = Prometheus::Client.registry
registry.unregister(:stackdriver_successful_requests_count)
registry.unregister(:stackdriver_failed_requests_count)
registry.unregister(:stackdriver_ingested_entries_count)
registry.unregister(:stackdriver_dropped_entries_count)
registry.unregister(:stackdriver_retried_entries_count)
- setup_auth_stubs
+ setup_auth_stubs('https://www.googleapis.com/oauth2/v4/token')
@logs_sent = []
end
# Shared tests.
@@ -129,12 +120,12 @@
end
end
def test_configure_ignores_unknown_monitoring_type
# Verify that driver creation succeeds when monitoring type is not
- # "prometheus" (in which case, we simply don't record metrics),
- # and that the counters are set to nil.
+ # "prometheus" or "opencensus" (in which case, we simply don't record
+ # metrics), and that the counters are set to nil.
setup_gce_metadata_stubs
create_driver(CONFIG_UNKNOWN_MONITORING_TYPE)
assert_nil(Prometheus::Client.registry.get(
:stackdriver_successful_requests_count))
assert_nil(Prometheus::Client.registry.get(
@@ -143,12 +134,73 @@
:stackdriver_ingested_entries_count))
assert_nil(Prometheus::Client.registry.get(
:stackdriver_dropped_entries_count))
assert_nil(Prometheus::Client.registry.get(
:stackdriver_retried_entries_count))
+ assert_nil(OpenCensus::Stats::MeasureRegistry.get(
+ Monitoring::MetricTranslator.new(
+ :stackdriver_successful_requests_count, {})))
+ assert_nil(OpenCensus::Stats::MeasureRegistry.get(
+ Monitoring::MetricTranslator.new(
+ :stackdriver_failed_requests_count, {})))
+ assert_nil(OpenCensus::Stats::MeasureRegistry.get(
+ Monitoring::MetricTranslator.new(
+ :stackdriver_ingested_entries_count, {})))
+ assert_nil(OpenCensus::Stats::MeasureRegistry.get(
+ Monitoring::MetricTranslator.new(
+ :stackdriver_dropped_entries_count, {})))
+ assert_nil(OpenCensus::Stats::MeasureRegistry.get(
+ Monitoring::MetricTranslator.new(
+ :stackdriver_retried_entries_count, {})))
end
+ def test_configure_uses_metrics_resource
+ setup_gce_metadata_stubs
+ [CONFIG_METRICS_RESOURCE_JSON,
+ CONFIG_METRICS_RESOURCE_HASH,
+ CONFIG_METRICS_RESOURCE_JSON_HASH
+ ].each_with_index do |config, index|
+ d = create_driver(config)
+ assert_equal 'custom_resource', d.instance.monitoring_resource.type, \
+ "Index #{index}"
+ assert_equal '123', d.instance.monitoring_resource.labels['label1'], \
+ "Index #{index}"
+ assert_equal 'abc', d.instance.monitoring_resource.labels['label2'], \
+ "Index #{index}"
+ assert_true d.instance.instance_variable_get(:@enable_monitoring)
+ registry = d.instance.instance_variable_get(:@registry)
+ assert_not_nil registry
+ exporter = registry.instance_variable_get(:@exporter)
+ assert_equal 'custom_resource', exporter.resource_type, "Index #{index}"
+ assert_equal({ 'label1' => '123', 'label2' => 'abc' },
+ exporter.resource_labels, "Index #{index}")
+ end
+ end
+
+ def test_configure_metrics_resource_validation
+ setup_gce_metadata_stubs
+ {
+ CONFIG_METRICS_RESOURCE_JSON_NO_TYPE => /type must be a string/,
+ CONFIG_METRICS_RESOURCE_JSON_BAD_LABELS => /labels must be a hash/,
+ CONFIG_METRICS_RESOURCE_JSON_BAD_KEYS =>
+ /unrecognized keys: \[:random\]/,
+ CONFIG_METRICS_RESOURCE_JSON_BAD_KEYS_LABELS =>
+ /unrecognized keys: \[:"labels\.random"\]/,
+ CONFIG_METRICS_RESOURCE_JSON_BAD_KEYS_NO_LABELS =>
+ /unrecognized keys: \[:random\]/
+ }.each_with_index do |(config, pattern), index|
+ begin
+ create_driver(config)
+ assert false,
+ "Invalid config at index #{index} should have raised an error."
+ rescue Fluent::ConfigError => error
+ assert error.message.match?(pattern), \
+ "Index #{index} failed: got #{error.message}."
+ end
+ end
+ end
+
def test_metadata_loading
setup_gce_metadata_stubs
d = create_driver
d.run
assert_equal PROJECT_ID, d.instance.project_id
@@ -1922,119 +1974,9 @@
assert_not_equal 3, retries
end
end
private
-
- def stub_metadata_request(metadata_path, response_body)
- stub_request(:get, 'http://169.254.169.254/computeMetadata/v1/' +
- metadata_path)
- .to_return(body: response_body, status: 200,
- headers: { 'Content-Length' => response_body.length })
- end
-
- def setup_no_metadata_service_stubs
- # Simulate a machine with no metadata service present
- stub_request(:any, %r{http://169.254.169.254/.*})
- .to_raise(Errno::EHOSTUNREACH)
- end
-
- def setup_gce_metadata_stubs
- # Stub the root, used for platform detection by the plugin and 'googleauth'.
- stub_request(:get, 'http://169.254.169.254')
- .to_return(status: 200, headers: { 'Metadata-Flavor' => 'Google' })
-
- # Create stubs for all the GCE metadata lookups the agent needs to make.
- stub_metadata_request('project/project-id', PROJECT_ID)
- stub_metadata_request('instance/zone', FULLY_QUALIFIED_ZONE)
- stub_metadata_request('instance/id', VM_ID)
- stub_metadata_request('instance/attributes/',
- "attribute1\nattribute2\nattribute3")
-
- # Used by 'googleauth' to fetch the default service account credentials.
- stub_request(:get, 'http://169.254.169.254/computeMetadata/v1/' \
- 'instance/service-accounts/default/token')
- .to_return(body: %({"access_token": "#{FAKE_AUTH_TOKEN}"}),
- status: 200,
- headers: { 'Content-Length' => FAKE_AUTH_TOKEN.length,
- 'Content-Type' => 'application/json' })
- end
-
- def setup_ec2_metadata_stubs
- # Stub the root, used for platform detection.
- stub_request(:get, 'http://169.254.169.254')
- .to_return(status: 200, headers: { 'Server' => 'EC2ws' })
-
- # Stub the identity document lookup made by the agent.
- stub_request(:get, 'http://169.254.169.254/latest/dynamic/' \
- 'instance-identity/document')
- .to_return(body: EC2_IDENTITY_DOCUMENT, status: 200,
- headers: { 'Content-Length' => EC2_IDENTITY_DOCUMENT.length })
- end
-
- def setup_auth_stubs
- # Used when loading credentials from a JSON file.
- stub_request(:post, 'https://www.googleapis.com/oauth2/v4/token')
- .with(body: hash_including(grant_type: AUTH_GRANT_TYPE))
- .to_return(body: %({"access_token": "#{FAKE_AUTH_TOKEN}"}),
- status: 200,
- headers: { 'Content-Length' => FAKE_AUTH_TOKEN.length,
- 'Content-Type' => 'application/json' })
-
- stub_request(:post, 'https://www.googleapis.com/oauth2/v4/token')
- .with(body: hash_including(grant_type: 'refresh_token'))
- .to_return(body: %({"access_token": "#{FAKE_AUTH_TOKEN}"}),
- status: 200,
- headers: { 'Content-Length' => FAKE_AUTH_TOKEN.length,
- 'Content-Type' => 'application/json' })
- end
-
- def setup_managed_vm_metadata_stubs
- stub_metadata_request(
- 'instance/attributes/',
- "attribute1\ngae_backend_name\ngae_backend_version\nlast_attribute")
- stub_metadata_request('instance/attributes/gae_backend_name',
- MANAGED_VM_BACKEND_NAME)
- stub_metadata_request('instance/attributes/gae_backend_version',
- MANAGED_VM_BACKEND_VERSION)
- end
-
- def setup_k8s_metadata_stubs(should_respond = true)
- if should_respond
- stub_metadata_request(
- 'instance/attributes/',
- "attribute1\ncluster-location\ncluster-name\nlast_attribute")
- stub_metadata_request('instance/attributes/cluster-location',
- K8S_LOCATION2)
- stub_metadata_request('instance/attributes/cluster-name',
- K8S_CLUSTER_NAME)
- else
- ['cluster-location', 'cluster-name'].each do |metadata_name|
- stub_request(:get, %r{.*instance/attributes/#{metadata_name}.*})
- .to_return(status: 404,
- body: 'The requested URL /computeMetadata/v1/instance/' \
- "attributes/#{metadata_name} was not found on this" \
- ' server.')
- end
- end
- end
-
- def setup_dataproc_metadata_stubs
- stub_metadata_request(
- 'instance/attributes/',
- "attribute1\ndataproc-cluster-uuid\ndataproc-cluster-name")
- stub_metadata_request('instance/attributes/dataproc-cluster-name',
- DATAPROC_CLUSTER_NAME)
- stub_metadata_request('instance/attributes/dataproc-cluster-uuid',
- DATAPROC_CLUSTER_UUID)
- stub_metadata_request('instance/attributes/dataproc-region',
- DATAPROC_REGION)
- end
-
- def clear_metrics
- Prometheus::Client.registry.instance_variable_set('@metrics', {})
- OpenCensus::Stats.ensure_recorder.clear_stats
- end
# Provide a stub context that initializes @logs_sent, executes the block and
# resets WebMock at the end.
def new_stub_context
@logs_sent = []