def test_datastore_instance(name, system_hostname, db_hostname, product, port,
                            unix_socket, database_path,
                            expected_instance_metric, monkeypatch):

    monkeypatch.setattr('newrelic.common.system_info.gethostname',
                        lambda: system_hostname)

    class FakeModule():
        pass

    register_database_client(FakeModule, product)
    enable_datastore_instance_feature(FakeModule)

    port_path_or_id = port or database_path or unix_socket

    node = DatabaseNode(
        dbapi2_module=FakeModule,
        sql='',
        children=[],
        start_time=0,
        end_time=1,
        duration=1,
        exclusive=1,
        stack_trace=None,
        sql_format='obfuscated',
        connect_params=None,
        cursor_params=None,
        sql_parameters=None,
        execute_params=None,
        host=db_hostname,
        port_path_or_id=port_path_or_id,
        database_name=database_path,
        guid=None,
        agent_attributes={},
        user_attributes={},
    )

    empty_stats = StatsEngine()
    transaction = current_transaction()
    unscoped_scope = ''

    # Check 'Datastore/instance' metric to confirm that:
    #   1. metric name is reported correctly
    #   2. metric scope is always unscoped

    for metric in node.time_metrics(empty_stats, transaction, None):
        if metric.name.startswith("Datastore/instance/"):
            assert metric.name == expected_instance_metric, name
            assert metric.scope == unscoped_scope