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 = []