problems running caravel with mysql metadata db

I'm running into two problems when trying to configure caravel to run with mysql as the metadata store.

The charts in the example dashboards show only the error message "Please define at least one metric for your table".
Some database interactions result in a stacktrace with the error message "OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user<EMAIL_ADDRESS>(using password: NO)")".

I've tried to make this as reproducible as possible by running caravel and mysql as docker containers and using docker-compose to make the pieces work together.  The code is in this repo:
https://github.com/dennisobrien/caravel-mysql-docker-example
I have tested this first with caravel 0.10.0 and then built from source from the tag 'airbnb_prod.<IP_ADDRESS>'.
These errors do not occur when we change the metadata store to sqlite (by commenting out the environment variable SQLALCHEMY_DATABASE_URI lines in docker-compose.yml).
Steps to reproduce:

Install docker and docker-compose.
Clone the repo above and cd into it.
To build caravel from source:

docker-compose up --force-recreate --build
Get a cup of coffee.

To install from a pypi release, uncomment and comment the sections in Dockerfile.
In a browser, open http://localhost:8088 and use the credentials in the fabmanager create-admin line in docker-entrypoint.sh.
Click on a dashboard and notice the error messages.
In 0.10.0:

click Sources -> Databases -> SQL

In later versions

click SQL Lab, the choose 'main' in the Database selector.

Notice the stacktrace in the server log.

2016-09-07 01:52:51,509:ERROR:root:(pymysql.err.OperationalError) (1045, u"Access denied for user<EMAIL_ADDRESS>(using password: NO)")
Traceback (most recent call last):
  File "/home/caravel/caravel/caravel/views.py", line 66, in wraps
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/Flask_AppBuilder-1.8.1-py2.7.egg/flask_appbuilder/security/decorators.py", line 52, in wraps
    return f(self, *args, **kwargs)
  File "/home/caravel/caravel/caravel/views.py", line 1118, in tables
    'tables': database.all_table_names(schema),
  File "/home/caravel/caravel/caravel/models.py", line 445, in all_table_names
    return sorted(self.inspector.get_table_names(schema))
  File "/home/caravel/caravel/caravel/models.py", line 442, in inspector
    return sqla.inspect(engine)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/inspection.py", line 63, in inspect
    ret = reg(subject)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/reflection.py", line 139, in _insp
    return Inspector.from_engine(bind)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/reflection.py", line 135, in from_engine
    return Inspector(bind)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/reflection.py", line 109, in __init__
    bind.connect().close()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2018, in connect
    return self._connection_cls(self, **kwargs)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 72, in __init__
    if connection is not None else engine.raw_connection()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2104, in raw_connection
    self.pool.unique_connection, _connection)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2078, in _wrap_pool_connect
    e, dialect, self)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 1405, in _handle_dbapi_exception_noconnection
    exc_info
  File "build/bdist.linux-x86_64/egg/sqlalchemy/util/compat.py", line 202, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 2074, in _wrap_pool_connect
    return fn()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 318, in unique_connection
    return _ConnectionFairy._checkout(self)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 713, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 480, in checkout
    rec = pool._do_get()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 1060, in _do_get
    self._dec_overflow()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 1057, in _do_get
    return self._create_connection()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 323, in _create_connection
    return _ConnectionRecord(self)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 449, in __init__
    self.connection = self.__connect()
  File "build/bdist.linux-x86_64/egg/sqlalchemy/pool.py", line 607, in __connect
    connection = self.__pool._invoke_creator(self)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/strategies.py", line 97, in connect
    return dialect.connect(*cargs, **cparams)
  File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/default.py", line 385, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/local/lib/python2.7/site-packages/pymysql/__init__.py", line 90, in Connect
    return Connection(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 690, in __init__
    self.connect()
  File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 908, in connect
    self._request_authentication()
  File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 1116, in _request_authentication
    auth_packet = self._read_packet()
  File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 983, in _read_packet
    packet.check_error()
  File "/usr/local/lib/python2.7/site-packages/pymysql/connections.py", line 395, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib/python2.7/site-packages/pymysql/err.py", line 107, in raise_mysql_exception
    raise errorclass(errno, errval)
OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user<EMAIL_ADDRESS>(using password: NO)")

There are a couple suspicious things here:

Why "using password: NO"?  There is a password specified in SQLALCHEMY_DATABASE_URI.
Why an IP address?  If the GRANT was done using the host name from SQLALCHEMY_DATABASE_URI this would be a name, not an IP.

I'm happy to try any debugging ideas others might have.
thanks,
Dennis

It looks like you put a wrong sqlalchemy url. Please open a python shell and try to debug the issue by connecting with sqlalchemy to that url. Please reopen if it's not a configuration issue.

There is a lot of evidence that the sqlalchemy url works.

Dashboards are listed on the welcome page and in the Dashboards tab.
Slices are listed in the Slices tab.
Database 'main' is listed in Sources -> Databases.
Sources -> Databases -> edit record for 'main' -> Test Connection: "localhost:8088 says:  Seems OK!"
Tables are listed in Sources -> Tables

I have also tried this with just 'mysql://' as well as with 'postgresql+psycopg2://'.

@dennisobrien - could you please attach screen shot of the database configuration that is failing?

Hi @bkyryliuk
Here's the view at http://localhost:8088/databaseview/edit/1 after clicking "Test Connection".  It shows the sqlalchemy uri I am using.

And after testing the connection, the Tables appear below:

If I click on SQL Lab (in the latest tag) and select 'main', I see the error OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user<EMAIL_ADDRESS>(using password: NO)")  In I could get this error by going to Sources -> Databases -> SQL, so this is not a new problem, the UI just moved.

Here's the view at http://localhost:8088/caravel/dashboard/births/ which just shows another problem, possibly related to the above.

The build flow goes like this:

Clear the mysql volume to make sure we are initializing from a clean state.

$ docker-compose down --volumes

Launch the stack with docker-compose.  (The first build takes a long time since it is currently building from source.  It's possible to comment/uncomment and pip install 0.10.0.)

$ docker-compose up --force-recreate --build

docker-compose.yml

Spin up mysql and caravel.
Wait until mysql is ready before starting caravel.
Also define the environment variable SQLALCHEMY_DATABASE_URI.

Dockerfile

Build caravel from source.

docker-entrypoint.sh

Initialize and start caravel.

caravel_config.py

Pick up the environment variable SQLALCHEMY_DATABASE_URI.

@dennisobrien could you try to start the sqluri with mysql:// rather than mysql+pymysql://

@bkyryliuk I tried 'mysql://mysqladmin:FIXME_12345@db:3306/db' as well as 'mysql://mysqladmin:FIXME_12345@db/db' and see the same symptoms.
One difference from the screenshot you included is that I have caravel and mysql on different machines.  In the case of this test using docker-compose, they are in running in different containers.  In the case of AWS, caravel is running in a container in ECS and mysql is an RDS, and I'm seeing this exact problem.  Originally I thought it was an AWS issue (or me bungling the RDS configuration) so I made this docker-compose set up to try to get a minimal reproducible case with mysql and caravel running on separate "machines".
I'll continue to experiment but please continue to send along any ideas you'd like me to try.

The output of SHOW GRANTS looks reasonable:
SHOW GRANTS;
"GRANT USAGE ON *.* TO 'mysqladmin'@'%' IDENTIFIED BY PASSWORD <secret>"
"GRANT ALL PRIVILEGES ON `db`.* TO 'mysqladmin'@'%'"

If I'm interpreting this correctly, the user 'mysqladmin' can access the database from any host (the '%' wildcard).  So the issue with the OperationalError above is probably to do with "using password: NO" and not the IP address of the host.  Is something removing the password from the sqlalchemy uri?  I see places where the connection password is masked, but I doubt this is the issue.
I did a dump of the ab_* tables, once from caravel running with mysql and another running with sqlite, just to see if any of the contents were different after the examples were loaded.  I only see two differences:

on mysql ids are longs (e.g., 1L) while on sqlite they are just integers (e.g., 1)
on sqlite strings are unicode (e.g., u'can_this_form_post') while on mysql they are strings (e.g., 'can_this_form_post').

mysql:
select * from ab_role
(1L, 'Admin')
(2L, 'Public')
(3L, 'Alpha')
(4L, 'Gamma')

sqlite:
select * from ab_role
(1, u'Admin')
(2, u'Public')
(3, u'Alpha')
(4, u'Gamma')

I'd be surprised if this caused a problem.

@dennisobrien - are you familiar with ipython ?
If yes - can you connect to the database from the box running caravel using sql alchemy in ipython ?

@bkyryliuk - I am familiar with ipython.  It wasn't included in the docker image so I'm adding that now.  (But since I'm still building from source from the tag 'airbnb_prod.<IP_ADDRESS>' it takes a while.)
In the meantime, I connected to the container running caravel and launched python (not ipython) and can connect fine.  There are some tables that are empty that I would not expect to be empty, but this might be related to the problems.
$ docker exec -it [container_id] bash
root@8a4734ac6dfc:/home/caravel# python
Python 2.7.11 (default, Jun  9 2016, 14:42:54)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy import create_engine
>>> SQLALCHEMY_DATABASE_URI = 'mysql://mysqladmin:FIXME_12345@db/db'
>>> engine = create_engine(SQLALCHEMY_DATABASE_URI)
>>> import pandas as pd
>>>
>>> pd.read_sql("select * from dashboard_user", engine)
Empty DataFrame
Columns: [id, user_id, dashboard_id]
Index: []
>>>
>>> pd.read_sql("select * from dashboards", engine)
           created_on          changed_on  id    dashboard_title  \
0 2016-09-08 00:38:06 2016-09-08 00:38:06   1  World's Bank Data
1 2016-09-08 00:38:09 2016-09-08 00:38:09   2             Births

                                       position_json created_by_fk  \
0  [\n    {\n        "size_y": 2, \n        "size...          None
1  [\n    {\n        "size_y": 4, \n        "size...          None

  changed_by_fk   css description          slug json_metadata
0          None  None        None  world_health          None
1          None  None        None        births          None
>>>
>>> pd.read_sql("select * from datasources", engine)
Empty DataFrame
Columns: [created_on, changed_on, id, datasource_name, is_featured, is_hidden, description, default_endpoint, user_id, cluster_name, created_by_fk, changed_by_fk, offset, cache_timeout]
Index: []
>>>

I also added this debug script at the startup.  It's using the sqlalchemy uri to read the tables.
https://github.com/dennisobrien/caravel-mysql-docker-example/blob/master/debug_db.py
Let me know what you'd like to try with ipython.
thanks,
Dennis

I just updated the mysql image to 5.7 (from 5.6) and I see some debug output that wasn't reported in the previous version.

Dropped connections.  This might be harmless and caused by code no closing connections.  It might be the cause of the final migration not being recorded in 'alembic_version'.

caravel_1  | INFO  [alembic.runtime.migration] Running upgrade 27ae655e4247 -> 960c69cb1f5b, add dttm_format related fields in table_columns
db_1       | 2016-09-08T01:19:57.962460Z 4 [Note] Aborted connection 4 to db: 'db' user: 'mysqladmin' host: '<IP_ADDRESS>' (Got an error reading communication packets)

Access denied.  These errors aren't being reported by caravel but the are being logged from the mysql container.

caravel_1  | 2016-09-08 01:20:03,901:INFO:flask_appbuilder.base:Registering class CssTemplateModelView on menu CSS Templates
db_1       | 2016-09-08T01:20:04.028538Z 8 [Note] Access denied for user<EMAIL_ADDRESS>(using password: NO)
db_1       | 2016-09-08T01:20:17.766845Z 9 [Note] Access denied for user<EMAIL_ADDRESS>(using password: NO)
db_1       | 2016-09-08T01:20:20.943038Z 10 [Note] Access denied for user<EMAIL_ADDRESS>(using password: NO)
db_1       | 2016-09-08T01:20:21.956964Z 11 [Note] Access denied for user<EMAIL_ADDRESS>(using password: NO)
db_1       | 2016-09-08T01:20:34.887068Z 12 [Note] Access denied for user<EMAIL_ADDRESS>(using password: NO)
caravel_1  | /usr/local/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:95: Warning: Incorrect date value: '2017-07-19 13:23:33' for column 'ds' at row 1
caravel_1  |   rowcount = cursor.executemany(statement, parameters)
caravel_1  | /usr/local/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:95: Warning: Incorrect date value: '2016-11-23 00:48:29' for column 'ds' at row 2
caravel_1  |   rowcount = cursor.executemany(statement, parameters)
caravel_1  | /usr/local/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py:95: Warning: Incorrect date value: '2015-02-27 10:03:31' for column 'ds' at row 3
caravel_1  |   rowcount = cursor.executemany(statement, parameters)

@dennisobrien - let's try to import caravel and see if the app has the access in to the mysql:
from caravel import db, models
s = db.session()
dbs = s.(models.Database).all()
dbs = s.query(models.Database).first()
dbs
# it should be main db
db_obj.get_df("SELECT * from tables", None)
# it should output the list of tables
# in case it doesn't work
# check what value is there, make sure that password is stored
db_obj.sqlalchemy_uri
# set correct uri
db_obj.sqlalchemy_uri='mysql://mysqladmin:FIXME_12345@db/db'
# check if it works
db_obj.get_df("SELECT * from tables", None)

Please post here the stacktrace if you'll have some problems.

@bkyryliuk -- Thanks for the debugging advice.  Here's the output of the session.  (Even though it reports version 0.10.0, this is build from the tag 'airbnb_prod.<IP_ADDRESS>'.)
root@564d0054a5e0:/home/caravel# ipython
Python 2.7.11 (default, Jun  9 2016, 14:42:54)
Type "copyright", "credits" or "license" for more information.

IPython 4.2.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from caravel import db, models, version
/usr/local/lib/python2.7/site-packages/Flask-0.11.1-py2.7.egg/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.sqlalchemy is deprecated, use flask_sqlalchemy instead.
  .format(x=modname), ExtDeprecationWarning
/usr/local/lib/python2.7/site-packages/Flask-0.11.1-py2.7.egg/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.sqlalchemy._compat is deprecated, use flask_sqlalchemy._compat instead.
  .format(x=modname), ExtDeprecationWarning
/usr/local/lib/python2.7/site-packages/Flask-0.11.1-py2.7.egg/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.script is deprecated, use flask_script instead.
  .format(x=modname), ExtDeprecationWarning
2016-09-08 16:24:44,062:INFO:root:Using SQLALCHEMY_DATABASE_URI: mysql://mysqladmin:FIXME_12345@db/db
/usr/local/lib/python2.7/site-packages/Flask_Cache-0.13.1-py2.7.egg/flask_cache/__init__.py:152: UserWarning: Flask-Cache: CACHE_TYPE is set to null, caching is effectively disabled.
  warnings.warn("Flask-Cache: CACHE_TYPE is set to null, "
/usr/local/lib/python2.7/site-packages/Flask-0.11.1-py2.7.egg/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.cache is deprecated, use flask_cache instead.
  .format(x=modname), ExtDeprecationWarning
2016-09-08 16:24:44,128:INFO:flask_appbuilder.base:Registering class MyIndexView on menu
2016-09-08 16:24:44,131:INFO:flask_appbuilder.base:Registering class UtilView on menu
2016-09-08 16:24:44,133:INFO:flask_appbuilder.base:Registering class LocaleView on menu
2016-09-08 16:24:44,135:INFO:flask_appbuilder.base:Registering class ResetPasswordView on menu
2016-09-08 16:24:44,144:INFO:flask_appbuilder.base:Registering class ResetMyPasswordView on menu
2016-09-08 16:24:44,152:INFO:flask_appbuilder.base:Registering class UserInfoEditView on menu
2016-09-08 16:24:44,162:INFO:flask_appbuilder.base:Registering class AuthDBView on menu
2016-09-08 16:24:44,168:INFO:flask_appbuilder.base:Registering class UserDBModelView on menu List Users
2016-09-08 16:24:44,195:INFO:flask_appbuilder.base:Registering class RoleModelView on menu List Roles
2016-09-08 16:24:44,220:INFO:flask_appbuilder.base:Registering class UserStatsChartView on menu User's Statistics
2016-09-08 16:24:44,236:INFO:flask_appbuilder.base:Registering class PermissionModelView on menu Base Permissions
2016-09-08 16:24:44,258:INFO:flask_appbuilder.base:Registering class ViewMenuModelView on menu Views/Menus
2016-09-08 16:24:44,278:INFO:flask_appbuilder.base:Registering class PermissionViewModelView on menu Permission on Views/Menus
2016-09-08 16:24:44,770:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,770:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,772:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,773:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,773:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,773:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,773:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,774:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,774:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,774:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,774:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,774:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,775:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,779:INFO:flask_appbuilder.base:Registering class TableColumnInlineView on menu
2016-09-08 16:24:44,798:INFO:flask_appbuilder.base:Registering class DruidColumnInlineView on menu
2016-09-08 16:24:44,823:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,824:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,824:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,824:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,824:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,824:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,825:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,827:INFO:flask_appbuilder.base:Registering class SqlMetricInlineView on menu
2016-09-08 16:24:44,842:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,843:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,843:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,843:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,843:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,843:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,846:INFO:flask_appbuilder.base:Registering class DruidMetricInlineView on menu
2016-09-08 16:24:44,869:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.tables".
2016-09-08 16:24:44,869:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.tables.TableExtension".
2016-09-08 16:24:44,869:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.fenced_code".
2016-09-08 16:24:44,869:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
2016-09-08 16:24:44,869:DEBUG:MARKDOWN:Successfuly imported extension module "markdown.extensions.codehilite".
2016-09-08 16:24:44,870:DEBUG:MARKDOWN:Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
2016-09-08 16:24:44,871:WARNING:flask_appbuilder.models.filters:Filter type not supported for column: password
2016-09-08 16:24:44,873:INFO:flask_appbuilder.base:Registering class DatabaseView on menu Databases
2016-09-08 16:24:44,900:WARNING:flask_appbuilder.models.filters:Filter type not supported for column: password
2016-09-08 16:24:44,902:INFO:flask_appbuilder.base:Registering class DatabaseAsync on menu
2016-09-08 16:24:44,923:WARNING:flask_appbuilder.models.filters:Filter type not supported for column: password
2016-09-08 16:24:44,925:INFO:flask_appbuilder.base:Registering class DatabaseTablesAsync on menu
2016-09-08 16:24:44,951:INFO:flask_appbuilder.base:Registering class TableModelView on menu Tables
2016-09-08 16:24:44,979:INFO:flask_appbuilder.base:Registering class SliceModelView on menu Slices
2016-09-08 16:24:45,001:INFO:flask_appbuilder.base:Registering class SliceAsync on menu
2016-09-08 16:24:45,019:INFO:flask_appbuilder.base:Registering class SliceAddView on menu
2016-09-08 16:24:45,038:INFO:flask_appbuilder.base:Registering class DashboardModelView on menu Dashboards
2016-09-08 16:24:45,116:INFO:flask_appbuilder.base:Registering class DashboardModelViewAsync on menu
2016-09-08 16:24:45,132:INFO:flask_appbuilder.base:Registering class LogModelView on menu Action Log
2016-09-08 16:24:45,157:INFO:flask_appbuilder.base:Registering class R on menu
2016-09-08 16:24:45,161:INFO:flask_appbuilder.base:Registering class Caravel on menu
2016-09-08 16:24:45,191:INFO:flask_appbuilder.base:Registering class CssTemplateModelView on menu CSS Templates

In [2]: version.VERSION_INFO
Out[2]: (0, 10, 0)

In [3]: version.VERSION_BUILD
Out[3]: 0

In [4]: s = db.session()

In [5]: s
Out[5]: <flask_sqlalchemy.SignallingSession at 0x7f7cb36b3b90>

In [6]: s.query(models.Database).all()
Out[6]: [main]

In [7]: s.query(models.Database).first()
Out[7]: main

In [8]: db_obj = s.query(models.Database).first()

In [9]: db_obj
Out[9]: main

In [10]: db_obj.get_df("SELECT * from tables", None)
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-10-de04cd15e243> in <module>()
----> 1 db_obj.get_df("SELECT * from tables", None)

/home/caravel/caravel/caravel/models.pyc in get_df(self, sql, schema)
    409     def get_df(self, sql, schema):
    410         eng = self.get_sqla_engine(schema=schema)
--> 411         cur = eng.execute(sql, schema=schema)
    412         cols = [col[0] for col in cur.cursor.description]
    413         df = pd.DataFrame(cur.fetchall(), columns=cols)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in execute(self, statement, *multiparams, **params)
   1988         """
   1989
-> 1990         connection = self.contextual_connect(close_with_result=True)
   1991         return connection.execute(statement, *multiparams, **params)
   1992

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in contextual_connect(self, close_with_result, **kwargs)
   2037         return self._connection_cls(
   2038             self,
-> 2039             self._wrap_pool_connect(self.pool.connect, None),
   2040             close_with_result=close_with_result,
   2041             **kwargs)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2076             if connection is None:
   2077                 Connection._handle_dbapi_exception_noconnection(
-> 2078                     e, dialect, self)
   2079             else:
   2080                 util.reraise(*sys.exc_info())

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _handle_dbapi_exception_noconnection(cls, e, dialect, engine)
   1403             util.raise_from_cause(
   1404                 sqlalchemy_exception,
-> 1405                 exc_info
   1406             )
   1407         else:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/compat.pyc in raise_from_cause(exception, exc_info)
    200     exc_type, exc_value, exc_tb = exc_info
    201     cause = exc_value if exc_value is not exception else None
--> 202     reraise(type(exception), exception, tb=exc_tb, cause=cause)
    203
    204 if py3k:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2072         dialect = self.dialect
   2073         try:
-> 2074             return fn()
   2075         except dialect.dbapi.Error as e:
   2076             if connection is None:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in connect(self)
    374         """
    375         if not self._use_threadlocal:
--> 376             return _ConnectionFairy._checkout(self)
    377
    378         try:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _checkout(cls, pool, threadconns, fairy)
    711     def _checkout(cls, pool, threadconns=None, fairy=None):
    712         if not fairy:
--> 713             fairy = _ConnectionRecord.checkout(pool)
    714
    715             fairy._pool = pool

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in checkout(cls, pool)
    478     @classmethod
    479     def checkout(cls, pool):
--> 480         rec = pool._do_get()
    481         try:
    482             dbapi_connection = rec.get_connection()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1058                 except:
   1059                     with util.safe_reraise():
-> 1060                         self._dec_overflow()
   1061             else:
   1062                 return self._do_get()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/langhelpers.pyc in __exit__(self, type_, value, traceback)
     58             exc_type, exc_value, exc_tb = self._exc_info
     59             self._exc_info = None   # remove potential circular references
---> 60             compat.reraise(exc_type, exc_value, exc_tb)
     61         else:
     62             if not compat.py3k and self._exc_info and self._exc_info[1]:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1055             if self._inc_overflow():
   1056                 try:
-> 1057                     return self._create_connection()
   1058                 except:
   1059                     with util.safe_reraise():

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _create_connection(self)
    321         """Called by subclasses to create a new ConnectionRecord."""
    322
--> 323         return _ConnectionRecord(self)
    324
    325     def _invalidate(self, connection, exception=None):

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __init__(self, pool)
    447     def __init__(self, pool):
    448         self.__pool = pool
--> 449         self.connection = self.__connect()
    450         self.finalize_callback = deque()
    451

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __connect(self)
    605         try:
    606             self.starttime = time.time()
--> 607             connection = self.__pool._invoke_creator(self)
    608             self.__pool.logger.debug("Created new connection %r", connection)
    609             return connection

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/strategies.pyc in connect(connection_record)
     95                         if connection is not None:
     96                             return connection
---> 97                 return dialect.connect(*cargs, **cparams)
     98
     99             creator = pop_kwarg('creator', connect)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/default.pyc in connect(self, *cargs, **cparams)
    383
    384     def connect(self, *cargs, **cparams):
--> 385         return self.dbapi.connect(*cargs, **cparams)
    386
    387     def create_connect_args(self, url):

/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.pyc in Connect(*args, **kwargs)
     79     """Factory function for connections.Connection."""
     80     from MySQLdb.connections import Connection
---> 81     return Connection(*args, **kwargs)
     82
     83 connect = Connection = Connect

/usr/local/lib/python2.7/site-packages/MySQLdb/connections.pyc in __init__(self, *args, **kwargs)
    202         self.waiter = kwargs2.pop('waiter', None)
    203
--> 204         super(Connection, self).__init__(*args, **kwargs2)
    205         self.cursorclass = cursorclass
    206         self.encoders = dict([ (k, v) for k, v in conv.items()

OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user<EMAIL_ADDRESS>(using password: NO)")

Inspect sqlalchemy_uri and notice it already has the password intact:
In [11]: db_obj.sqlalchemy_uri
Out[11]: u'mysql://mysqladmin:FIXME_12345@db/db'

Set it anyway and follow the rest of your script:
In [12]: db_obj.sqlalchemy_uri = 'mysql://mysqladmin:FIXME_12345@db/db'

In [13]: db_obj.get_df("SELECT * from tables", None)
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-13-de04cd15e243> in <module>()
----> 1 db_obj.get_df("SELECT * from tables", None)

/home/caravel/caravel/caravel/models.pyc in get_df(self, sql, schema)
    409     def get_df(self, sql, schema):
    410         eng = self.get_sqla_engine(schema=schema)
--> 411         cur = eng.execute(sql, schema=schema)
    412         cols = [col[0] for col in cur.cursor.description]
    413         df = pd.DataFrame(cur.fetchall(), columns=cols)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in execute(self, statement, *multiparams, **params)
   1988         """
   1989
-> 1990         connection = self.contextual_connect(close_with_result=True)
   1991         return connection.execute(statement, *multiparams, **params)
   1992

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in contextual_connect(self, close_with_result, **kwargs)
   2037         return self._connection_cls(
   2038             self,
-> 2039             self._wrap_pool_connect(self.pool.connect, None),
   2040             close_with_result=close_with_result,
   2041             **kwargs)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2076             if connection is None:
   2077                 Connection._handle_dbapi_exception_noconnection(
-> 2078                     e, dialect, self)
   2079             else:
   2080                 util.reraise(*sys.exc_info())

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _handle_dbapi_exception_noconnection(cls, e, dialect, engine)
   1403             util.raise_from_cause(
   1404                 sqlalchemy_exception,
-> 1405                 exc_info
   1406             )
   1407         else:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/compat.pyc in raise_from_cause(exception, exc_info)
    200     exc_type, exc_value, exc_tb = exc_info
    201     cause = exc_value if exc_value is not exception else None
--> 202     reraise(type(exception), exception, tb=exc_tb, cause=cause)
    203
    204 if py3k:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2072         dialect = self.dialect
   2073         try:
-> 2074             return fn()
   2075         except dialect.dbapi.Error as e:
   2076             if connection is None:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in connect(self)
    374         """
    375         if not self._use_threadlocal:
--> 376             return _ConnectionFairy._checkout(self)
    377
    378         try:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _checkout(cls, pool, threadconns, fairy)
    711     def _checkout(cls, pool, threadconns=None, fairy=None):
    712         if not fairy:
--> 713             fairy = _ConnectionRecord.checkout(pool)
    714
    715             fairy._pool = pool

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in checkout(cls, pool)
    478     @classmethod
    479     def checkout(cls, pool):
--> 480         rec = pool._do_get()
    481         try:
    482             dbapi_connection = rec.get_connection()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1058                 except:
   1059                     with util.safe_reraise():
-> 1060                         self._dec_overflow()
   1061             else:
   1062                 return self._do_get()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/langhelpers.pyc in __exit__(self, type_, value, traceback)
     58             exc_type, exc_value, exc_tb = self._exc_info
     59             self._exc_info = None   # remove potential circular references
---> 60             compat.reraise(exc_type, exc_value, exc_tb)
     61         else:
     62             if not compat.py3k and self._exc_info and self._exc_info[1]:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1055             if self._inc_overflow():
   1056                 try:
-> 1057                     return self._create_connection()
   1058                 except:
   1059                     with util.safe_reraise():

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _create_connection(self)
    321         """Called by subclasses to create a new ConnectionRecord."""
    322
--> 323         return _ConnectionRecord(self)
    324
    325     def _invalidate(self, connection, exception=None):

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __init__(self, pool)
    447     def __init__(self, pool):
    448         self.__pool = pool
--> 449         self.connection = self.__connect()
    450         self.finalize_callback = deque()
    451

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __connect(self)
    605         try:
    606             self.starttime = time.time()
--> 607             connection = self.__pool._invoke_creator(self)
    608             self.__pool.logger.debug("Created new connection %r", connection)
    609             return connection

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/strategies.pyc in connect(connection_record)
     95                         if connection is not None:
     96                             return connection
---> 97                 return dialect.connect(*cargs, **cparams)
     98
     99             creator = pop_kwarg('creator', connect)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/default.pyc in connect(self, *cargs, **cparams)
    383
    384     def connect(self, *cargs, **cparams):
--> 385         return self.dbapi.connect(*cargs, **cparams)
    386
    387     def create_connect_args(self, url):

/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.pyc in Connect(*args, **kwargs)
     79     """Factory function for connections.Connection."""
     80     from MySQLdb.connections import Connection
---> 81     return Connection(*args, **kwargs)
     82
     83 connect = Connection = Connect

/usr/local/lib/python2.7/site-packages/MySQLdb/connections.pyc in __init__(self, *args, **kwargs)
    202         self.waiter = kwargs2.pop('waiter', None)
    203
--> 204         super(Connection, self).__init__(*args, **kwargs2)
    205         self.cursorclass = cursorclass
    206         self.encoders = dict([ (k, v) for k, v in conv.items()

OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user<EMAIL_ADDRESS>(using password: NO)")

In [14]:

And just to be sure, this is the version of caravel
root@564d0054a5e0:/home/caravel# pip freeze | grep caravel
-e git+https://github.com/airbnb/caravel.git@561828c2f890e179c4116f773cc7507103804dc6#egg=caravel

I see similar stacktrace in #726 which was closed as a dupe of #596
If I follow the steps testconn uses it works fine.  But when I use get_sqla_engine I get the error.  Is this the problem:
https://github.com/airbnb/caravel/blob/airbnb_prod.<IP_ADDRESS>/caravel/models.py#L398
        url = make_url(self.sqlalchemy_uri_decrypted)

But again, I would expect this to break for everyone using a SQLALCHEMY_DATABASE_URI with a username and password.
Here's an example using the code in testconn:
In [1]: from caravel import db, models
...

In [2]: from sqlalchemy import create_engine

In [3]: s = db.session()

In [4]: db_obj = s.query(models.Database).first()

In [6]: db_obj.sqlalchemy_uri
Out[6]: u'mysql://mysqladmin:FIXME_12345@db/db'

In [7]: engine = create_engine(db_obj.sqlalchemy_uri)

In [8]: engine.connect()
Out[8]: <sqlalchemy.engine.base.Connection at 0x7f35d4ed0690>

In [9]: engine.table_names()
Out[9]:
[u'ab_permission',
 u'ab_permission_view',
 u'ab_permission_view_role',
 u'ab_register_user',
 u'ab_role',
 u'ab_user',
 u'ab_user_role',
 u'ab_view_menu',
 u'alembic_version',
 u'birth_names',
 u'clusters',
 u'columns',
 u'css_templates',
 u'dashboard_slices',
 u'dashboard_user',
 u'dashboards',
 u'datasources',
 u'dbs',
 u'energy_usage',
 u'favstar',
 u'logs',
 u'long_lat',
 u'metrics',
 u'multiformat_time_series',
 u'query',
 u'random_time_series',
 u'slice_user',
 u'slices',
 u'sql_metrics',
 u'table_columns',
 u'tables',
 u'url',
 u'wb_health_population']

And an example of the problem using the engine returned by get_sqla_engine:
In [11]: engine = db_obj.get_sqla_engine()

In [12]: engine.connect()
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-12-e398aa840b8a> in <module>()
----> 1 engine.connect()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in connect(self, **kwargs)
   2016         """
   2017
-> 2018         return self._connection_cls(self, **kwargs)
   2019
   2020     def contextual_connect(self, close_with_result=False, **kwargs):

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in __init__(self, engine, connection, close_with_result, _branch_from, _execution_options, _dispatch, _has_events)
     70         else:
     71             self.__connection = connection \
---> 72                 if connection is not None else engine.raw_connection()
     73             self.__transaction = None
     74             self.__savepoint_seq = 0

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in raw_connection(self, _connection)
   2102         """
   2103         return self._wrap_pool_connect(
-> 2104             self.pool.unique_connection, _connection)
   2105
   2106

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2076             if connection is None:
   2077                 Connection._handle_dbapi_exception_noconnection(
-> 2078                     e, dialect, self)
   2079             else:
   2080                 util.reraise(*sys.exc_info())

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _handle_dbapi_exception_noconnection(cls, e, dialect, engine)
   1403             util.raise_from_cause(
   1404                 sqlalchemy_exception,
-> 1405                 exc_info
   1406             )
   1407         else:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/compat.pyc in raise_from_cause(exception, exc_info)
    200     exc_type, exc_value, exc_tb = exc_info
    201     cause = exc_value if exc_value is not exception else None
--> 202     reraise(type(exception), exception, tb=exc_tb, cause=cause)
    203
    204 if py3k:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/base.pyc in _wrap_pool_connect(self, fn, connection)
   2072         dialect = self.dialect
   2073         try:
-> 2074             return fn()
   2075         except dialect.dbapi.Error as e:
   2076             if connection is None:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in unique_connection(self)
    316
    317         """
--> 318         return _ConnectionFairy._checkout(self)
    319
    320     def _create_connection(self):

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _checkout(cls, pool, threadconns, fairy)
    711     def _checkout(cls, pool, threadconns=None, fairy=None):
    712         if not fairy:
--> 713             fairy = _ConnectionRecord.checkout(pool)
    714
    715             fairy._pool = pool

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in checkout(cls, pool)
    478     @classmethod
    479     def checkout(cls, pool):
--> 480         rec = pool._do_get()
    481         try:
    482             dbapi_connection = rec.get_connection()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1058                 except:
   1059                     with util.safe_reraise():
-> 1060                         self._dec_overflow()
   1061             else:
   1062                 return self._do_get()

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/util/langhelpers.pyc in __exit__(self, type_, value, traceback)
     58             exc_type, exc_value, exc_tb = self._exc_info
     59             self._exc_info = None   # remove potential circular references
---> 60             compat.reraise(exc_type, exc_value, exc_tb)
     61         else:
     62             if not compat.py3k and self._exc_info and self._exc_info[1]:

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _do_get(self)
   1055             if self._inc_overflow():
   1056                 try:
-> 1057                     return self._create_connection()
   1058                 except:
   1059                     with util.safe_reraise():

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in _create_connection(self)
    321         """Called by subclasses to create a new ConnectionRecord."""
    322
--> 323         return _ConnectionRecord(self)
    324
    325     def _invalidate(self, connection, exception=None):

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __init__(self, pool)
    447     def __init__(self, pool):
    448         self.__pool = pool
--> 449         self.connection = self.__connect()
    450         self.finalize_callback = deque()
    451

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/pool.pyc in __connect(self)
    605         try:
    606             self.starttime = time.time()
--> 607             connection = self.__pool._invoke_creator(self)
    608             self.__pool.logger.debug("Created new connection %r", connection)
    609             return connection

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/strategies.pyc in connect(connection_record)
     95                         if connection is not None:
     96                             return connection
---> 97                 return dialect.connect(*cargs, **cparams)
     98
     99             creator = pop_kwarg('creator', connect)

/usr/local/lib/python2.7/site-packages/SQLAlchemy-1.0.13-py2.7-linux-x86_64.egg/sqlalchemy/engine/default.pyc in connect(self, *cargs, **cparams)
    383
    384     def connect(self, *cargs, **cparams):
--> 385         return self.dbapi.connect(*cargs, **cparams)
    386
    387     def create_connect_args(self, url):

/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.pyc in Connect(*args, **kwargs)
     79     """Factory function for connections.Connection."""
     80     from MySQLdb.connections import Connection
---> 81     return Connection(*args, **kwargs)
     82
     83 connect = Connection = Connect

/usr/local/lib/python2.7/site-packages/MySQLdb/connections.pyc in __init__(self, *args, **kwargs)
    202         self.waiter = kwargs2.pop('waiter', None)
    203
--> 204         super(Connection, self).__init__(*args, **kwargs2)
    205         self.cursorclass = cursorclass
    206         self.encoders = dict([ (k, v) for k, v in conv.items()

OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user<EMAIL_ADDRESS>(using password: NO)")

Here's an ipython session that tries to mimic the functionality of caravel.views.Caravel.explore (the handler for the endpoint '/explore/<datasource_type>/<datasource_id>/').  In this case I was emulating the endpoint '/caravel/explore/table/3/?...'
root@f96e0b9325c8:/home/caravel# ipython
Python 2.7.11 (default, Jun  9 2016, 14:42:54)
Type "copyright", "credits" or "license" for more information.

IPython 4.2.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from caravel import db, models
...

In [2]: db.session.query(models.SqlaTable).all()
Out[2]:
[energy_usage,
 wb_health_population,
 birth_names,
 random_time_series,
 long_lat,
 multiformat_time_series]

In [3]: datasources = db.session.query(models.SqlaTable).all()

In [4]: datasources = sorted(datasources, key=lambda ds: ds.full_name)

In [5]: datasources
Out[5]:
[birth_names,
 energy_usage,
 long_lat,
 multiformat_time_series,
 random_time_series,
 wb_health_population]

In [6]: datasource = [ds for ds in datasources if 3 == ds.id]

In [7]: datasource
Out[7]: [birth_names]

In [8]: datasource = datasource[0] if datasource else None

In [9]: datasource
Out[9]: birth_names

In [10]: slice_id = 20  # from inspecting the url query string

In [11]: slc = db.session.query(models.Slice).filter_by(id=slice_id).first()

In [12]: slc
Out[12]: Trends

In [13]: # skip the section on permissions

In [14]: action = None  # not in the request

In [15]: viz_type = 'line'

In [16]: from caravel import viz

In [22]: from urlparse import parse_qs

In [23]: request_args_string = 'slice_name=Trends&row_limit=50000&metric=sum__num&show_legend=y&flt_op_1=in&viz_type=line&since=100+years+ago&json=false&until=now&datasource_id=1&metrics=sum__num&datasource_name=birth_names&granularity=ds&slice_id=20&datasource_type=table&rich_tooltip=y&compare_lag=10&limit=25&markup_type=markdown&compare_suffix=o10Y&where=&groupby=name'

In [25]: request_args = parse_qs(request_args_string)

In [27]: request_args
Out[27]:
{'compare_lag': ['10'],
 'compare_suffix': ['o10Y'],
 'datasource_id': ['1'],
 'datasource_name': ['birth_names'],
 'datasource_type': ['table'],
 'flt_op_1': ['in'],
 'granularity': ['ds'],
 'groupby': ['name'],
 'json': ['false'],
 'limit': ['25'],
 'markup_type': ['markdown'],
 'metric': ['sum__num'],
 'metrics': ['sum__num'],
 'rich_tooltip': ['y'],
 'row_limit': ['50000'],
 'show_legend': ['y'],
 'since': ['100 years ago'],
 'slice_id': ['20'],
 'slice_name': ['Trends'],
 'until': ['now'],
 'viz_type': ['line']}

In [28]: obj = viz.viz_types[viz_type](datasource, form_data=request_args, slice_=slc)
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-28-79440994ad54> in <module>()
----> 1 obj = viz.viz_types[viz_type](datasource, form_data=request_args, slice_=slc)

/home/caravel/caravel/caravel/viz.pyc in __init__(self, datasource, form_data, slice_)
     62
     63         # TODO refactor all form related logic out of here and into forms.py
---> 64         ff = FormFactory(self)
     65         form_class = ff.get_form()
     66         defaults = form_class().data.copy()

/home/caravel/caravel/caravel/forms.pyc in __init__(self, viz)
    125         datasource = viz.datasource
    126         if not datasource.metrics_combo:
--> 127             raise Exception("Please define at least one metric for your table")
    128         default_metric = datasource.metrics_combo[0][0]
    129

Exception: Please define at least one metric for your table

In [29]:

And I can verify that metrics is an empty list.
In [29]: datasource.metrics_combo
Out[29]: []

In [30]: datasource.metrics
Out[30]: []

But if I query the db directly, I do see 'metrics' as a key in 'params'.
In [31]: from sqlalchemy import create_engine

In [32]: s = db.session()

In [33]: db_obj = s.query(models.Database).first()

In [34]: db_obj.sqlalchemy_uri
Out[34]: u'mysql://mysqladmin:FIXME_12345@db/db'

In [35]: engine = create_engine(db_obj.sqlalchemy_uri)

In [36]: engine.connect()
Out[36]: <sqlalchemy.engine.base.Connection at 0x7f215fdc4550>

In [38]: import pandas as pd

In [41]: pd.read_sql("SELECT * from slices where id=20", engine)
Out[41]:
           created_on          changed_on  id slice_name druid_datasource_id  \
0 2016-09-08 23:24:12 2016-09-08 23:24:12  20     Trends                None

   table_id datasource_type datasource_name viz_type  \
0         3           table            None     line

                                              params created_by_fk  \
0  {\n    "compare_lag": "10", \n    "compare_suf...          None

  changed_by_fk description cache_timeout                        perm
0          None        None          None  [main].[birth_names](id:3)

In [50]: params = pd.read_sql("SELECT * from slices where id=20", engine)['params'].tolist()[0]

In [52]: import json

In [53]: json.loads(params)
Out[53]:
{u'compare_lag': u'10',
 u'compare_suffix': u'o10Y',
 u'datasource_id': u'1',
 u'datasource_name': u'birth_names',
 u'datasource_type': u'table',
 u'flt_op_1': u'in',
 u'granularity': u'ds',
 u'groupby': [u'name'],
 u'limit': u'25',
 u'markup_type': u'markdown',
 u'metric': u'sum__num',
 u'metrics': [u'sum__num'],
 u'rich_tooltip': u'y',
 u'row_limit': 50000,
 u'show_legend': u'y',
 u'since': u'100 years ago',
 u'until': u'now',
 u'viz_type': u'line',
 u'where': u''}

In [54]:

That's pretty interesting, here is what I get:
>>> db_obj.sqlalchemy_uri
u'mysql://root:XXXXXXXXXX@localhost/caravel_db'
>>> db_obj.sqlalchemy_uri_decrypted
'mysql://root:root@localhost/caravel_db'

I the views file https://github.com/airbnb/caravel/blob/master/caravel/views.py#L486 when you save the database model this code is executed:
    def pre_add(self, db):
        conn = sqla.engine.url.make_url(db.sqlalchemy_uri)
        db.password = conn.password
        conn.password = "X" * 10 if conn.password else None
        db.sqlalchemy_uri = str(conn)  # hides the password
        utils.merge_perm(sm, 'database_access', db.perm)

I would expect to see mysql://root:XXXXXXXXXX@localhost/caravel_db at the sqlalchemy_uri.
That feature was added quite some time ago.
What is happening if you edit the Database and save updated connection string?

Hmm.  I don't see the X's in my uri.
In [1]: from caravel import db, models
...

In [2]: s = db.session()

In [3]: db_obj = s.query(models.Database).first()

In [4]: db_obj.sqlalchemy_uri
Out[4]: u'mysql://mysqladmin:FIXME_12345@db/db'

In [5]: db_obj.sqlalchemy_uri_decrypted
Out[5]: 'mysql://mysqladmin@db/db'

I am able to edit the database info, save it, reload and verify that it persists.  I just updated the "Extra" json to test.
{
    "metadata_params": {},
    "engine_params": {},
    "foo": "bar"
}

In [5]: db_obj.sqlalchemy_uri_decrypted
Out[5]: 'mysql://mysqladmin@db/db'

Is the reason why you cannot access the db as db.password is not set.
It means that pre_add function https://github.com/airbnb/caravel/blob/master/caravel/views.py#L486 wasn't called somehow.
I cannot replicate the bug on my side.
Do you see any errors when you are saving the DB configuration in the UI ?

@bkyryliuk
I don't see any errors in the log around the time that DatabaseView is registered (and I assume when pre_add is called).  There is a warning at the end of this section:
caravel_1  | 2016-09-10 00:25:28,102:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can edit on DatabaseView
caravel_1  | 2016-09-10 00:25:28,122:INFO:flask_appbuilder.security.sqla.manager:Added Permission can edit on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,137:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can delete on DatabaseView
caravel_1  | 2016-09-10 00:25:28,155:INFO:flask_appbuilder.security.sqla.manager:Added Permission can delete on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,173:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can download on DatabaseView
caravel_1  | 2016-09-10 00:25:28,197:INFO:flask_appbuilder.security.sqla.manager:Added Permission can download on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,214:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on DatabaseView
caravel_1  | 2016-09-10 00:25:28,239:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,258:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can add on DatabaseView
caravel_1  | 2016-09-10 00:25:28,282:INFO:flask_appbuilder.security.sqla.manager:Added Permission can add on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,299:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can show on DatabaseView
caravel_1  | 2016-09-10 00:25:28,318:INFO:flask_appbuilder.security.sqla.manager:Added Permission can show on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,349:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: muldelete on DatabaseView
caravel_1  | 2016-09-10 00:25:28,373:INFO:flask_appbuilder.security.sqla.manager:Added Permission muldelete on DatabaseView to role Admin
caravel_1  | 2016-09-10 00:25:28,401:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Databases
caravel_1  | 2016-09-10 00:25:28,428:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Databases to role Admin
caravel_1  | 2016-09-10 00:25:28,455:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Sources
caravel_1  | 2016-09-10 00:25:28,476:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Sources to role Admin
caravel_1  | 2016-09-10 00:25:28,477:WARNING:flask_appbuilder.models.filters:Filter type not supported for column: password

And here's the record from the dbs table.  Note that sqlalchemy_uri has the original value of SQLALCHEMY_DATABASE_URI and password is None.  I'm guessing the password is supposed to be a hashed string, not None.
In [1]: from sqlalchemy import create_engine

In [2]: SQLALCHEMY_DATABASE_URI = 'mysql://mysqladmin:FIXME_12345@db/db'

In [3]: engine = create_engine(SQLALCHEMY_DATABASE_URI)

In [4]: import pandas as pd

In [7]: pd.read_sql("select * from dbs", engine).T
Out[7]:
                                                                           0
created_on                                               2016-09-10 00:25:52
changed_on                                               2016-09-10 00:25:52
id                                                                         1
database_name                                                           main
sqlalchemy_uri                          mysql://mysqladmin:FIXME_12345@db/db
created_by_fk                                                           None
changed_by_fk                                                           None
password                                                                None
cache_timeout                                                           None
extra                      {\n    "metadata_params": {},\n    "engine_par...
select_as_create_table_as                                                  0

Also, does it matter that in the migration, no key is specified, while in the Database.password definition, it is provided?
https://github.com/airbnb/caravel/blob/master/caravel/migrations/versions/289ce07647b_add_encrypted_password_field.py#L23
https://github.com/airbnb/caravel/blob/airbnb_prod.<IP_ADDRESS>/caravel/models.py#L382
I'm not very familiar with Flask-AppBuilder and pre_add but it looks like it is only called for POST actions.  That might explain why something like 'testconn' works ("POST /caravel/testconn HTTP/1.1" 200) and SQL Lab and others do not ("GET /caravel/tables/1/undefined HTTP/1.1" 500, "GET /databasetablesasync/api/read?_flt_0_id=1 HTTP/1.1" 500)?
https://github.com/dpgaspar/Flask-AppBuilder/blob/1.8.1/flask_appbuilder/baseviews.py#L910

@bkyryliuk You've already helped me immensely so this is not a request, but if you want a reproducible test case, and already have docker and docker-compose installed, you can clone this repo and do a one-liner to bring up this stack.
https://github.com/dennisobrien/caravel-mysql-docker-example
It's probably not as minimal as I could make it, but it is reproducible.
Thanks again for all your help!

@bkyryliuk - I just found that if I use the mysql 'root' user and configure it to have no password, these problems all go away.

All the example dashboards appear.
I am able to query the 'main' database in the SQL Labs section.

So I think this bug is specific to using a mysql (or postgres) username and password in the SQLALCHEMY_DATABASE_URI.  From your comments a couple days ago, I'm guessing you are using the mysql user with no password and that's why you have not been able to reproduce this problem.

I'm also seeing this issue with postgres passwords. commenting out the conn.password overwrite resolves the access problem (but of course leaves it visible in the view). is db.sqlalchemy_uri getting called somewhere without first reading db.password?
    def pre_add(self, db):
        conn = sqla.engine.url.make_url(db.sqlalchemy_uri)
        db.password = conn.password
        # conn.password = "X" * 10 if conn.password else None
        db.sqlalchemy_uri = str(conn)  # hides the password

@bkyryliuk - If you have any guidance on fixing this I'd be happy to submit a PR.  At the moment, I'm confused on the intent of the code.  caravel.models.Database has class attributes sqlalchemy_uri and password.  At initialization utils.get_or_create_main_db sets dbobj.sqlalchemy_uri = config.get("SQLALCHEMY_DATABASE_URI") and at this point the "dbs" entry for "main" has the full values for sqlalchemy_uri and null for password.
Later in caravel.views.DatabaseView the method pre_add modifies db.sqlalchemy_uri to mask the password.  But this is not called in the course of caravel init.  (At least, I put a breakpoint there and it was never triggered.)  Is the intent that the call to appbuilder.add_view(DatabaseView, ...) would trigger pre_add?  In the Flask-AppBuilder source I only see pre_add called in RestCRUDView.api_create and in BaseCRUDView._add, both handlers of POST requests.
So calls to Database.sqlalchemy_uri_decrypted loses the password (since password is None) and calls to safe_sqlalchemy_uri returns the full string with the password.
Since a recent commit https://github.com/airbnb/caravel/commit/6aadc6ec1373d5a6bb46c1485f744ac806ea9729#diff-397111749c5081b0f26dfa6ac13430dcL896 the command caravel load_examples fails with this stacktrace:
Loading examples into <SQLA engine=u'mysql://mysqladmin:FIXME_12345@<IP_ADDRESS>:3306/db'>
Creating default CSS templates
Loading energy related dataset
Creating table [wb_health_population] reference
2016-09-14 11:15:27,603:INFO:root:Creating database reference
2016-09-14 11:15:27,607:INFO:root:mysql://mysqladmin:FIXME_12345@<IP_ADDRESS>:3306/db
Traceback (most recent call last):
  File "/home/dobrien/anaconda3/envs/caraveldev/bin/caravel", line 6, in <module>
    exec(compile(open(__file__).read(), __file__, 'exec'))
  File "/home/dobrien/workspace/github/caravel/caravel/bin/caravel", line 152, in <module>
    manager.run()
  File "/home/dobrien/anaconda3/envs/caraveldev/lib/python2.7/site-packages/Flask_Script-2.0.5-py2.7.egg/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/home/dobrien/anaconda3/envs/caraveldev/lib/python2.7/site-packages/Flask_Script-2.0.5-py2.7.egg/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/home/dobrien/anaconda3/envs/caraveldev/lib/python2.7/site-packages/Flask_Script-2.0.5-py2.7.egg/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/home/dobrien/workspace/github/caravel/caravel/bin/caravel", line 91, in load_examples
    data.load_energy()
  File "/home/dobrien/workspace/github/caravel/caravel/data/__init__.py", line 71, in load_energy
    tbl.fetch_metadata()
  File "/home/dobrien/workspace/github/caravel/caravel/models.py", line 906, in fetch_metadata
    "Table doesn't seem to exist in the specified database, "
Exception: Table doesn't seem to exist in the specified database, couldn't fetch column information

I think previous to this commit it was failing silently here.  So this is a good thing.
Maybe the easiest fix is to move the password masking work from pre_add to get_or_create_main_db.  I'm open to ideas/guidance and would be happy to put together a PR.
thanks,
Dennis

@dennisobrien - I'll have a chance to take a better look closer to the end of the week.
Thanks for the detailed stacktraces and scripts.
We are using caravel with mysql and passwords in our production. Looks like the issue is that somehow  def pre_add(self, db): isn't executed in your case.

I added this commit https://github.com/airbnb/caravel/pull/1092/commits/0debcee80d0451d83276b450f7f48b9e1c03c090 to PR #1092  The Travis tests are still running but hopefully will pass (and fix my broken PR).
As I'm new to this codebase, I'd appreciate any suggestions for improvements.
thanks,
Dennis

I closed PR #1092 and opened a cleaner PR #1137
(This seemed easier than dealing with all the merge conflicts from recently pulled changes in master.)

Thanks for the fix @dennisobrien  !


Connect to a Public IP instead of Private IP

What feature do you want to see added?
I have my Jenkins master on AWS. It is able to launch slave on Hetzner but unable to connect as it tried to connect with Hetzner Private IP.
Any Solution?
Upstream changes
No response

By default, there is no private IP in Hetzner cloud, unless you explicitly configure private network.
See this for more details https://github.com/jenkinsci/hetzner-cloud-plugin/issues/7

Thank you very much. That worked


fix(redux):Fixing bug in stage

Updating redux toolkit to fix the bug in stage
The bug - for some reason when you switch between recommendations and clusters page the table stop loading and get stuck in the "isFetching"

to reproduce, open the https://console.stage.redhat.com/openshift/insights/advisor/recommendations
Go to Clusters table then back to Recommendations table
How to test this PR
0. You need both Insights Chrome and OCP Advisor locally.

Add route in Insights Chrome a to the wepback.config.js
...proxy({      env: 'stage-beta',      port: 1337,      appUrl: [/^\/*$/, /^\/beta\/*$/],      useProxy: true,      publicPath,      proxyVerbose: true,      isChrome: true,      routes: {        '/apps/ocp-advisor': {          host: 'https://localhost:8004',        },      },    }),

run insights chrome with "npm run dev"

run this command in OCP Advisor
"BETA=true npx webpack serve --config config/dev.webpack.config.js --port=8004"

Visit the https://stage.foo.redhat.com:1337/beta/openshift/insights/advisor/recommendations then open Clusters table. After that go back to the Recommendations table

:tada: This PR is included in version 1.8.2 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Not working for UIKitMac on macOS Catelina

Ld /Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Products/Debug-uikitformac/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Versions/A/Flurry_iOS_SDK normal x86_64 (in target: Flurry-iOS-SDK)
    cd /Users/jefhai/Documents/git/Proj-iOS/Pods
    /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-ios13.0-macabi -dynamiclib -isysroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -L/Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Products/Debug-uikitformac/Flurry-iOS-SDK -L/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/iOSSupport/usr/lib -L/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/uikitformac -L/Users/jefhai/Documents/git/Proj-iOS/Pods/Flurry-iOS-SDK/Flurry -L/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/iOSSupport/usr/lib -L/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/uikitformac -F/Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Products/Debug-uikitformac/Flurry-iOS-SDK -iframework /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/iOSSupport/System/Library/Frameworks -iframework /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/iOSSupport/System/Library/Frameworks -filelist /Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Intermediates.noindex/Pods.build/Debug-uikitformac/Flurry-iOS-SDK.build/Objects-normal/x86_64/Flurry_iOS_SDK.LinkFileList -install_name @rpath/Flurry_iOS_SDK.framework/Versions/A/Flurry_iOS_SDK -Xlinker -rpath -Xlinker @executable_path/Frameworks -Xlinker -rpath -Xlinker @loader_path/Frameworks -Xlinker -object_path_lto -Xlinker /Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Intermediates.noindex/Pods.build/Debug-uikitformac/Flurry-iOS-SDK.build/Objects-normal/x86_64/Flurry_iOS_SDK_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -fobjc-arc -fobjc-link-runtime -lFlurry_9.3.1 -framework Foundation -framework Security -framework SystemConfiguration -framework UIKit -framework Foundation -framework Security -framework SystemConfiguration -framework UIKit -compatibility_version 1 -current_version 1 -Xlinker -dependency_info -Xlinker /Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Intermediates.noindex/Pods.build/Debug-uikitformac/Flurry-iOS-SDK.build/Objects-normal/x86_64/Flurry_iOS_SDK_dependency_info.dat -o /Users/jefhai/Library/Developer/Xcode/DerivedData/ss_ws-ghkuqnoshpqwkkfpwyogwlgfpvnn/Build/Products/Debug-uikitformac/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Versions/A/Flurry_iOS_SDK

ld: in /Users/jefhai/Documents/git/Proj-iOS/Pods/Flurry-iOS-SDK/Flurry/libFlurry_9.3.1.a(libFlurry.a-x86_64-master.o), building for UIKitForMac, but linking in object file built for iOS Simulator,
clang: error: linker command failed with exit code 1 (use -v to see invocation)

@flurrydev any chance you're looking into this? I don't want to cut out flurry- but I would if there's no plans to support Mac OS / iPad apps on Mac OS

Hi @jefhai ,
Thank you for using Flurry SDK! We do plan to support Project Catalyst and we are working hard on this, so please stay tuned!

Any time frame for supporting it? End of next week possibly?
Thanks
Sent from my iPhone

On Jun 4, 2019, at 7:56 PM, Yubo Qin<EMAIL_ADDRESS>wrote:
Hi @jefhai ,
Thank you for using Flurry SDK! We do plan to support Project Catalyst and we are working hard on this, so please stay tuned!
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

@xnth97 how's the progress on supporting project catalyst going?

Hi @jefhai ,
Thank you for your support! We are sorry for any inconvenience this may cause, but please understand that there are lots of compatibility issues that we need to think about when adapting for new OS versions and platforms. We can't just click macOS support option and build it 😀 so please stay tuned and we'll definitely let you know once we have a usable beta version.

Hi @xnth97 do you have any update on your progress? I understand it's a complex issue.

They just don't seem to develop Flurry..... I'm going to abandon it and roll my own.

They just don't seem to develop Flurry..... I'm going to abandon it and roll my own.

It's not a light undertaking to support catalyst, so I do understand that it's taking time. Wouldn't mind a little bit insight on the progress tho :)

@jefhai @emreberge Thank you for your patience while we work on supporting UIKItMac. Supporting UIKitMac requires not only supporting this new platform in the SDK but also surfacing the analytics on our developer portal and providing this seamless support is in no ways trivial. We are publishing a beta release of our SDK with UIKitMac support on macOS today and will share the link once it is published. The beta release will provide support for UIKitMac at the SDK level but analytics for apps built on UIKitMac may not surface correctly in our flurry portal. Again, thank you for your patience while we continue to add end to end support for UIKitMac on macOS Catelina.

@jefhai @emreberge You can download the beta build of Flurry SDK with catalyst support from the link below. Again thank you for your patience as we build out full end to end support for catalyst.
https://flurrysdk-mbst-pub-ue1.s3.amazonaws.com/sdks/iPhone/671/flurry_iPhone_sdk.zip

@rajkaur01 thank you for the update, this is great news! Just a quick question (and I have not yet tested the SDK)

built on UIKitMac may not surface correctly in our flurry portal
Does that mean that we might not see the data yet, or that it might be mixed with or labeled incorrectly as being an iPad/iPhone device? And do you think it would be a good idea to manually separate the devices with a separate API Key to begin with?

@emreberge You will definitely see the data in our flurry portal but as you eluded to already, in some instances the data may be labeled incorrectly/mixed. You do the have the option of manually separating the two platforms with a different API Key for now so that you can inspect catalyst analytics without the noise of the iOS app. Once this feature goes GA, the separation of API keys would not be required as the flurry portal will be able to correctly identify the source of data across all currently supported metrics. Let me know if you have any other questions and thank you for using Flurry!

Is there any POD for Flurry SDK with catalyst support?

Hi @umairxiq Thank you for using Flurry. We will release a pod once CocoaPods adds support for MacCatalyst and XCFramework.

@jefhai @emreberge You can download the beta build of Flurry SDK with catalyst support from the link below. Again thank you for your patience as we build out full end to end support for catalyst.
https://flurrysdk-mbst-pub-ue1.s3.amazonaws.com/sdks/iPhone/671/flurry_iPhone_sdk.zip

Hello!
I downloaded the file in your link and imported the Flurry.xcframework into my project as instructed here: https://developer.apple.com/videos/play/wwdc2019/416/?time=247
However, it seems Xcode doesn't recognize the Swift module inside the framework and it is not possible to do import Flurry after import. Do you have a working version or some instructions to make this work?

@cocoatoucher Thank you for using Flurry Analytics. We will look into this issue and get back to you soon.

@cocoatoucher
To use the Flurry's Catalyst beta sdk with Swift follow our standard instructions here for a manual installation(substitiuting Flurry.xcframework for the static libraries.).
https://developer.yahoo.com/flurry/docs/integrateflurry/ios-manual/#swift-sdk-integration.
Briefly the steps are:

Add the Flurry.xcframework, Security.framework, SystemConfiguration.framework
CoreLocation.framework (CoreLocation is optional)
Create a bridging header, modify build settings to register the bridging header, import Flurry.h in the bridging header.
Initialize Flurry in the AppDelegate.

Note the Flurry Catalyst SDK is a beta product. We are actively working on how the data is presented in the Flurry UI.

Hey! Thanks for the reply.
The project is building after integrating the SDK via following the instructions.
However, once I attempt to initialize Flurry in my AppDelegate using:
Flurry.startSession(             "appid", with: FlurrySessionBuilder()             .withCrashReporting(true)             .withLogLevel(FlurryLogLevelAll))
I get the following compiler error:
Undefined symbols for architecture x86_64:   "_SCNetworkReachabilityCreateWithAddress", referenced from:       +[FlurryReachability flurryReachabilityWithAddress:] in libFlurryMacCatalyst.a(FlurryReachability.o)   "_SCNetworkReachabilityCreateWithName", referenced from:       +[FlurryReachability flurryReachabilityWithHostName:] in libFlurryMacCatalyst.a(FlurryReachability.o)   "_SCNetworkReachabilityGetFlags", referenced from:       -[FlurryReachability flurryCurrentReachabilityStatus] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryReachable] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryConnectionRequired] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryConnectionOnDemand] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryUserInterventionRequired] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryReachableViaWWAN] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability isFlurryReachableViaWiFi] in libFlurryMacCatalyst.a(FlurryReachability.o)       ...   "_SCNetworkReachabilitySetCallback", referenced from:       -[FlurryReachability flurryStartNotifier] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability flurryStopNotifier] in libFlurryMacCatalyst.a(FlurryReachability.o)   "_SCNetworkReachabilitySetDispatchQueue", referenced from:       -[FlurryReachability flurryStartNotifier] in libFlurryMacCatalyst.a(FlurryReachability.o)       -[FlurryReachability flurryStopNotifier] in libFlurryMacCatalyst.a(FlurryReachability.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

@cocoatoucher Hello, those are errors I would expect if SystemConfiguration.framework is not included, andI was able to reproduce the errors by removing SystemConfiguration from my project.
I posted a bare bones project here of my integration:
https://github.com/flurrydev/MacCatalyst

Sorry for totally missing that one, it works after adding the SystemConfiguration.framework
I appreciate the help! 🙌

Now that SE-0272 Package Manager Binary Dependencies is officially accepted I for one am perfectly happy with manual integration into my Catalyst apps - Which went perfectly smoothly, nice work Flurry! 👍 - until implementation makes its way into Xcode. As I would optimistically expect that to arrive expeditiously.

Thanks very much for making the macCatalyst beta available.
I've followed the integration instructions and I can access Flurry classes from the app target fine, but I'm having hard time making flurry available inside my own shared framework that is part of my app.  I've added the Flurry.xcframework to my framework's target Frameworks and Libraries section, picked Embed & Sign, but my framework code cannot compile any of the Flurry classes.

To add more context... when I try to include
#import "Flurry.h"
inside MyOwnFramework.h file
I get this error compiling:
Include of non-modular header inside framework module

@gabors Thank you for using Flurry. Apologies for the late response due to the holidays. We will investigate this issue and get back to you shortly.

@rajkaur01 any updates on this?

@gabors We are still investigating the feasibility of this, and also preparing a new release of the MacCatalyst beta.
I have reproduced the issue you describe, and I will follow up as soon as possible.

Still manual integration after more than six months? Although Pod has support for MACCatalyst and XCFrameWork. What's the timeline? or should we abandoned flurry for future use and recommend others?

@flurrydev Flurry.logEvent(<#T##eventName: String##String#>) calls are not getting logged for MacCatalyst app in the dashboard. In the same app, same iOS logs successfully logged in the dashboard. However, for MacCatalyst I can see the active sessions on dashboard, events are not there. Do you have any ideas?

Any updates on catalyst support? I'm eagerly awaiting this feature.

@umairxiq @JaxMyers Abandon flurry... Switch to Microsoft App Center Analytics and be happy :)
https://docs.microsoft.com/en-us/appcenter/analytics/

Just checking in after waiting another month... Any updates?

@JaxMyers @umairxiq
Flurry is waiting for the following fix to be made available by the Cocoapods team in their next beta release: https://github.com/CocoaPods/CocoaPods/issues/9528
Once the fix is available in the Cocoapods pre-release build we will release a podspec.

Any updates on this?

CocoaPods/CocoaPods#9528 is closed. Any update now for cocoapods?

What's the latest on the Flurry SDK cocoapod supporting Mac Catalyst?

@ToshMeston I would just switch to Microsoft’s app analytics or something device agnostic if it’s feasible..

@ToshMeston We are blocked by the following issue on Cocoapods: https://github.com/CocoaPods/CocoaPods/issues/9843
They are aware of the issue and working on this.

@jefhai Thanks.

@flurrydev could you at least update the XCFramework for manual installation (updated 9 months ago at this point)? Many don't use Cocoapods, and the tools to build for Catalyst have been available for more than one year now. I find it very frustrating that Flurry still doesn't have a way to provide XCFrameworks for each release. This will likely force us to move to another analytics service.

Any update @flurrydev ?

Should it theoretically be possible for my app which uses Flurry for iOS to compile using for Mac by simply excluding Flurry calls when built for mac? I've tried this but I have never been able to get over the many errors that Xcode generates and given up, thinking that I need to wait for Flurry to be updated. So now I am wondering if I need to keep waiting for Flurry to be updated or if I can simply exclude it from my Mac binary.

Am I safe to assume this will never be fixed?

We are currently testing a new xcframework build of Flurry that supports MacCatalyst (including M1 support). It will be available in the next week.

We have released a Catalyst compatible version of Flurry here: https://github.com/flurrydev/Flurry-Catalyst-Beta
This will allow you to run Flurry on Catalyst apps and includes M1 mac support.

About time! But to voice my opinion real quick… adopting flurry was a mistake and a loss for those waiting around for this.

@flurrydev Sweet!


Regression in SDK 1.14+: no quick fix to import matching package

(Originally filed in WebStorm's issue tracker)
I have path package in pubspec.yaml and pub get done.
SDK 1.13:

SDK 1.14 and 1.15-dev-3.0:

Problem: no quick fix offering to add matching import statement.
Another problem (SDK 1.13, first screenshot): quick fix to import package:path/src/path_exception.dart seems to be redundant, according to Pub Package Layout Conventions (see Implementation files) these files should be treated as package-private. Already filed as #24257.
Questionable: is there a sense in Remove type annotation quick assist for such incomplete code?

People keep pinging us. @scheglov is this your area?

:+1:

Seems to work again with Dart SDK 1.16.0-dev.1.0

Yes, it works now if the library is used at all in the same module. Still does not work if the containing package was added to pubspec.yaml, downloaded using Pub but is not used anywhere yet. Although I think it has never worked in these conditions, so it's not a bug.

Closed as fixed as per comment


Kustomize previews missing links and updated validation

Steps to reproduce:

clone argo-rollouts repo
create a project for the manifests folder in the cloned repo
preview the "base" kustomize overlay
expected outcome

some of the generated resources have links to each other
the validation error counters at the top of the navigator are updated

actual outcome

no links are shown
the validation counters still show the validation numbers for the non-preview resources

seeing this in the console:

going to the validation panel and redoing the validation "fixes" the issue - i.e. that validation works and shows the correct links/errors in the navigator


How to change OpenTSDB server port

Hi PeterGrace:
I want to change openTsdb default port number from 4242 to 4949.  I change the port configuration number in all files which located in files directory (include Dockerfile), then I build a new IMAGE from Dockerfile.
I start a container from the new IMAGE, container runs well but openTsdb doesn't work, I can't connect to the ip:4949.
Can you tell me how to change the OpenTSDB default port?
Thanks

Hello @ShanQincheng, did you change the opentsdb.conf line with the port?  https://github.com/PeterGrace/opentsdb-docker/blob/a335bf08e0d5a1e8674b3eed91b4e59613d8b340/files/opentsdb.conf#L1
If you changed that, rebuilt the container after that change, and it still was on 4242 instead of 4949, that might indicate that the opentsdb.conf file isn't being properly read.

Yes, I did. But it didn't work for me. I even change all the port number in all files which located in the file directory, and then rebuild the image from the Dockerfile.
I think use the default port may be unsafe, that's why I insist change the port...


Fixed issue with ponyc not being able to find Visual Studio Build Tools in non-standard locations.

Fixed issue with ponyc not being able to find Visual Studio Build Tools in non-standard locations, as per https://github.com/ponylang/ponyc/issues/3067

Awesome, thanks!


Integrationtests with iceoryx related projects

Brief feature description
A project like rmw_iceoryx could break when we change our public API in master.
Here we could either document the best practice that you only work with tags but its maybe not the best approach for projects which are so closely related to iceoryx like rmw_iceoryx.
I would suggest to introduce some "iceoryx master" projects where we add a job in our CI pipeline. Here we could:

fail if the "iceoryx master" project is not building

I think here we would require committer rights for the project otherwise this could block us hard

inform the code owner that with the new iceoryx version his master will not work anymore

@Karsten1987 @elBoberido @mossmaurice @budrus @dkroenke whats your opinion?

@elfenpiff my opinion is to not break the API in the first place ... at least not after 1.0 release. We need some checks for this and building rmw_iceoryx could be one of them.
If someone accesses private API it's not our problem. We should be willing to extend our public API in such cases, though.

I guess if we have long term support releases with a stable API people would more use these. E.g. I don't think that people besides the ones who develop new stuff work on master of ROS. There are frequent releases with clear support timeline.
In rmw_iceoryx we already have a CI job that checks compatibility with iceoryx. Having it on this side makes more sense for me. There we can have a "check the masters" action for information. But we should push the users more to the stable releases.
What you propose is a third project that uses rmw_iceoryx and iceoryx and checks these together?

@budrus I smell a iceoryx ecosystem health badge 😁

When we are talking about a badge I'm in ;-)

@budrus I suggest the following badge: https://upload.wikimedia.org/wikipedia/commons/8/83/DEA_badge_C.PNG
It looks epic - but of course with an oryx instead of an eagle!

@elBoberido @dkroenke @FerdinandSpitzschnueffler I recommend the following iceoryx developer badge: https://media.gettyimages.com/photos/police-badge-picture-idAA017580?s=612x612
But with "Ice0ryx Developer" instead of police officer!

@elfenpiff we are talking more about this https://shields.io/category/build ;)

Yeah but I was talking about real badges! Additionally, every developer should get a small mission accomplished badge for every issue which the developer is closing.
I would like to show my accomplishments like here: https://www.snopes.com/tachyon/2016/05/nkextramedals.jpg?resize=733,412


IPC-HDW4231EM-ASE working but with errors !

2021-07-22 19:58:23 ERROR (MainThread) [custom_components.dahua] TimeoutError fetching information from http://<IP_ADDRESS>:80/cgi-bin/configManager.cgi?action=getConfig&name=General -
2021-07-22 19:58:23 ERROR (MainThread) [custom_components.dahua] TimeoutError fetching information from http://<IP_ADDRESS>:80/cgi-bin/magicBox.cgi?action=getSoftwareVersion -
2021-07-22 19:58:23 ERROR (MainThread) [custom_components.dahua] TimeoutError fetching information from http://<IP_ADDRESS>:80/cgi-bin/magicBox.cgi?action=getSystemInfo -
2021-07-22 19:58:24 WARNING (MainThread) [homeassistant.config_entries] Config entry 'Kamera-Bagdoer' for dahua integration not ready yet; Retrying in background
2021-07-22 19:58:24 WARNING (MainThread) [custom_components.dahua] Failed to sync device state
Traceback (most recent call last):
File "/config/custom_components/dahua/init.py", line 174, in _async_update_data
data.update(response)
TypeError: 'NoneType' object is not iterable

I have similar errors with the IPC-A26 camera several times a day. Irregularly.
It was explained to me: That's pretty normal. For various reasons the integration will timeout when calling the camera's APIs. Could be your network or just the cam in general. Thes cams are not high powered devices and sometimes will timeout.

@pepe59 Thanks for that log. I think I can get that fixed. Working on it now...

Try 0.9.9 - https://github.com/rroller/dahua/releases/tag/0.9.9
Just released :)  That should stop the TypeError: 'NoneType' object is not iterable error. But please let me know if you still see it.

Installed. I will monitor and inform about the result. Thank you

Great job, thank you. Observation one day TypeError error: 'NoneType' object is not iterable, fixed. Timeout error only twice a day. I consider this a normal state when querying the API.
I think this problem could be closed.

Thank you!


gpu-compute: Minor edits for atomic no returns and stores

Since returned data is not needed for AtomicNoReturn and Store memory requests, the coalescer need not spend time writing in dummy data for packets of these types.
Change-Id: Ie669e8c2a3bf44b5b0c290f62c49c5d4876a9a6a

@abmerop Note sure who else would need to review this, but just following up on one of the discussions about atomic no return requests. I believe that this operation is not needed (it's probably not a huge deal if it needs to remain). Just might make the code easier to follow if it wasn't there.

It looks like this was there before the atomic log. It seems unintuitive that a store would need to set data on the return path, but I am not sure why it was there before. I suppose if none of the tests break it is fine.

Maybe a leftover from the backing store?


[All actors] Block UI and inform user when a background message processing is performed

Add a nice Blockchain loader
Prevent user to refresh the page

const onConfirmRefresh = function (event) {
event.preventDefault();
return event.returnValue = "Are you sure you want to leave the page?";
}
window.addEventListener("beforeunload", onConfirmRefresh, { capture: true });

@Mastaleru  The loader is there and nice, but when I tried to refresh, I was able to without the notification (e.g., are you sure you want to leave, etc.). I am closing the issue, and the loader is added, and overall we will not have any significantly long operations (e.g., process that takes minutes).


Fix DPI issue when parent-window specified

2nd try (git hates me!)
This change should fix DPI scaling issue when wfreerdp.exe is started using parent-handle argument of a control/window with SystemAware or PerMonitorDpiAware mode.
This was tested on two machines but I'm not sure if the usage of these APIs is correct. Please let me know if there's a better way or if there are issues with my suggested implementation.
Thank you!

@freerdp-bot test

@freerdp-bot test

@StefanKoell looks like this needs some preprocessor conditional ( https://learn.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 ) as the 32bit build  is running an older windows version.

Is it possible to just include the code branch (DPI check) on a certain Windows version? Or is there a Windows version I can use as preprocessor conditional which is suitable for wfreerdp.exe?

@StefanKoell did push a fix for that on your branch.

@freerdp-bot test

Since the DPI functions are only available since a certain Win10 version (1607) run-time dynamic linking should be used instead of load-time dynamic linkage.
For an example refer to client/Windows/wf_cliprdr.c (search for user32.dll).

@akallabeth No, I didn't push anything else.

@mfleisz good point.

@StefanKoell I meant I did push ;)
but just as @mfleisz said, better way is to use GetProcAddress to get a function pointer to the library and only use it if it exists.


Adding a tool name to UserAgent

Add the program name to the User-Agent to allow archive.org to recognize it.

Add the program name to the User-Agent to allow archive.org to recognize it.

how would you rewrite the user-agent in this case?

Add the program name to the User-Agent to allow archive.org to recognize it.

how would you rewrite the user-agent in this case?

I would like to use bitdruid/python-wayback-machine-downloader (1.1.0), maybe the user can change it too.
Using a browser UA doesn't seem to be a good option, it might confuse archive.org.

Even though it's not very standard, it seems to suffice:
more standard:
bitdruid-python-wayback-machine-downloader/1.1.0

Even though it's not very standard, it seems to suffice:
more standard but looks a little bit weird:
bitdruid-python-wayback-machine-downloader/1.1.0

sounds okay to me. but do you have any sources for this approach? like if other tools doing so

Even though it's not very standard, it seems to suffice:
more standard but looks a little bit weird:
bitdruid-python-wayback-machine-downloader/1.1.0

sounds okay to me. but do you have any sources for this approach? like if other tools doing so

Without a specific source, UA usually consists of ProgramName/Version (Comment), but I'm not sure what the real name of this Program is, so I went with username-repository/version

fixed with release :)


Update sbt to 1.3.2

Updates org.scala-sbt:sbt from 1.2.8 to 1.3.2.
Release Notes/Changelog
I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.
If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention @scala-steward in the comments below.
Have a fantastic day writing Scala!

Ignore future updates
Add this to your .scala-steward.conf file to ignore future updates of this dependency:
updates.ignore = [ { groupId = "org.scala-sbt", artifactId = "sbt" } ]

labels: semver-minor

Codecov Report

Merging #61 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master      #61   +/-   ##
=======================================
  Coverage   99.16%   99.16%
=======================================
  Files          11       11
  Lines         120      120
  Branches        6        6
=======================================
  Hits          119      119
  Misses          1        1

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 1383554...4ff1858. Read the comment docs.