You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ch...@apache.org on 2019/03/29 01:10:36 UTC
[incubator-superset] branch lyftga updated: Injectable statsd
client (#7138)
This is an automated email from the ASF dual-hosted git repository.
christine pushed a commit to branch lyftga
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/lyftga by this push:
new 4407442 Injectable statsd client (#7138)
4407442 is described below
commit 440744200d828345f622a82a3bf22a2ec4f3afa0
Author: Dave Smith <da...@gmail.com>
AuthorDate: Wed Mar 27 14:08:36 2019 -0700
Injectable statsd client (#7138)
* Add ability to inject statsd client; some py test/reqs updates
- Updated the metrics logger to allow construction with an existing
statsd client, so that it can be configured by external systems or libs.
- added requirements to requirements-dev.txt which are needed to run
tests-eg coverage, nose
- removed dependency on mock lib, it is in python stdlib now
- updated tox.ini to remove the now-superfluous deps
* add license to test file, and remove blank line at EOF
(cherry picked from commit ba19a62412aba27d9c38ec7013f13a976cb6c054)
---
requirements-dev.txt | 2 ++
superset/stats_logger.py | 15 +++++++++++--
tests/access_tests.py | 3 +--
tests/base_tests.py | 2 +-
tests/core_tests.py | 2 +-
tests/db_engine_specs_test.py | 2 +-
tests/druid_func_tests.py | 2 +-
tests/druid_tests.py | 3 +--
tests/email_tests.py | 3 +--
tests/schedules_test.py | 2 +-
tests/stats_logger_tests.py | 50 +++++++++++++++++++++++++++++++++++++++++++
tests/utils_tests.py | 2 +-
tests/viz_tests.py | 2 +-
tox.ini | 3 ---
14 files changed, 75 insertions(+), 18 deletions(-)
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 872fb04..6c9e506 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -15,6 +15,7 @@
# limitations under the License.
#
console_log==0.2.10
+coverage==4.5.3
flake8-commas==2.0.0
flake8-import-order==0.18
flake8-quotes==1.0.0
@@ -22,6 +23,7 @@ flake8==3.6.0
flask-cors==3.0.6
ipdb==0.11
mysqlclient==1.3.13
+nose==1.3.7
pip-tools==3.1.0
psycopg2-binary==2.7.5
pycodestyle==2.4.0
diff --git a/superset/stats_logger.py b/superset/stats_logger.py
index ce4b400..3ab6313 100644
--- a/superset/stats_logger.py
+++ b/superset/stats_logger.py
@@ -73,8 +73,19 @@ try:
from statsd import StatsClient
class StatsdStatsLogger(BaseStatsLogger):
- def __init__(self, host, port, prefix='superset'):
- self.client = StatsClient(host=host, port=port, prefix=prefix)
+
+ def __init__(self, host='localhost', port=8125,
+ prefix='superset', statsd_client=None):
+ """
+ Initializes from either params or a supplied, pre-constructed statsd client.
+
+ If statsd_client argument is given, all other arguments are ignored and the
+ supplied client will be used to emit metrics.
+ """
+ if statsd_client:
+ self.client = statsd_client
+ else:
+ self.client = StatsClient(host=host, port=port, prefix=prefix)
def incr(self, key):
self.client.incr(key)
diff --git a/tests/access_tests.py b/tests/access_tests.py
index f363401..f608f00 100644
--- a/tests/access_tests.py
+++ b/tests/access_tests.py
@@ -17,8 +17,7 @@
"""Unit tests for Superset"""
import json
import unittest
-
-import mock
+from unittest import mock
from superset import app, db, security_manager
from superset.connectors.connector_registry import ConnectorRegistry
diff --git a/tests/base_tests.py b/tests/base_tests.py
index 8884bbb..8555915 100644
--- a/tests/base_tests.py
+++ b/tests/base_tests.py
@@ -17,9 +17,9 @@
"""Unit tests for Superset"""
import json
import unittest
+from unittest.mock import Mock, patch
from flask_appbuilder.security.sqla import models as ab_models
-from mock import Mock, patch
import pandas as pd
from superset import app, db, is_feature_enabled, security_manager
diff --git a/tests/core_tests.py b/tests/core_tests.py
index 14a6ed8..00e83ac 100644
--- a/tests/core_tests.py
+++ b/tests/core_tests.py
@@ -26,8 +26,8 @@ import random
import re
import string
import unittest
+from unittest import mock
-import mock
import pandas as pd
import psycopg2
import sqlalchemy as sqla
diff --git a/tests/db_engine_specs_test.py b/tests/db_engine_specs_test.py
index 1390f50..9d7b368 100644
--- a/tests/db_engine_specs_test.py
+++ b/tests/db_engine_specs_test.py
@@ -15,8 +15,8 @@
# specific language governing permissions and limitations
# under the License.
import inspect
+from unittest import mock
-import mock
from sqlalchemy import column
from superset import db_engine_specs
diff --git a/tests/druid_func_tests.py b/tests/druid_func_tests.py
index d2e9edc..cf0c5e9 100644
--- a/tests/druid_func_tests.py
+++ b/tests/druid_func_tests.py
@@ -16,8 +16,8 @@
# under the License.
import json
import unittest
+from unittest.mock import Mock
-from mock import Mock
from pydruid.utils.dimensions import MapLookupExtraction, RegexExtraction
import pydruid.utils.postaggregator as postaggs
diff --git a/tests/druid_tests.py b/tests/druid_tests.py
index ab26a98..78d1bb8 100644
--- a/tests/druid_tests.py
+++ b/tests/druid_tests.py
@@ -18,8 +18,7 @@
from datetime import datetime
import json
import unittest
-
-from mock import Mock, patch
+from unittest.mock import Mock, patch
from superset import db, security_manager
from superset.connectors.druid.models import (
diff --git a/tests/email_tests.py b/tests/email_tests.py
index 163d1c3..7e1830c 100644
--- a/tests/email_tests.py
+++ b/tests/email_tests.py
@@ -22,8 +22,7 @@ from email.mime.multipart import MIMEMultipart
import logging
import tempfile
import unittest
-
-import mock
+from unittest import mock
from superset import app
from superset.utils import core as utils
diff --git a/tests/schedules_test.py b/tests/schedules_test.py
index 858cb7e..b0d311a 100644
--- a/tests/schedules_test.py
+++ b/tests/schedules_test.py
@@ -16,9 +16,9 @@
# under the License.
from datetime import datetime, timedelta
import unittest
+from unittest.mock import Mock, patch, PropertyMock
from flask_babel import gettext as __
-from mock import Mock, patch, PropertyMock
from selenium.common.exceptions import WebDriverException
from superset import app, db
diff --git a/tests/stats_logger_tests.py b/tests/stats_logger_tests.py
new file mode 100644
index 0000000..531c136
--- /dev/null
+++ b/tests/stats_logger_tests.py
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""Unit tests for Superset"""
+from unittest import TestCase
+from unittest.mock import Mock, patch
+
+from superset.stats_logger import StatsdStatsLogger
+
+
+class StatsdStatsLoggerTest(TestCase):
+
+ def verify_client_calls(self, logger, client):
+ logger.incr('foo1')
+ client.incr.assert_called_once()
+ client.incr.assert_called_with('foo1')
+ logger.decr('foo2')
+ client.decr.assert_called_once()
+ client.decr.assert_called_with('foo2')
+ logger.gauge('foo3')
+ client.gauge.assert_called_once()
+ client.gauge.assert_called_with('foo3')
+ logger.timing('foo4', 1.234)
+ client.timing.assert_called_once()
+ client.timing.assert_called_with('foo4', 1.234)
+
+ def test_init_with_statsd_client(self):
+ client = Mock()
+ stats_logger = StatsdStatsLogger(statsd_client=client)
+ self.verify_client_calls(stats_logger, client)
+
+ def test_init_with_params(self):
+ with patch('superset.stats_logger.StatsClient') as MockStatsdClient:
+ mock_client = MockStatsdClient.return_value
+
+ stats_logger = StatsdStatsLogger()
+ self.verify_client_calls(stats_logger, mock_client)
diff --git a/tests/utils_tests.py b/tests/utils_tests.py
index 587e07f..7e29089 100644
--- a/tests/utils_tests.py
+++ b/tests/utils_tests.py
@@ -17,9 +17,9 @@
from datetime import date, datetime, time, timedelta
from decimal import Decimal
import unittest
+from unittest.mock import patch
import uuid
-from mock import patch
import numpy
from superset.exceptions import SupersetException
diff --git a/tests/viz_tests.py b/tests/viz_tests.py
index b84c661..facb8c3 100644
--- a/tests/viz_tests.py
+++ b/tests/viz_tests.py
@@ -15,9 +15,9 @@
# specific language governing permissions and limitations
# under the License.
from datetime import datetime
+from unittest.mock import Mock, patch
import uuid
-from mock import Mock, patch
import pandas as pd
from superset import app
diff --git a/tox.ini b/tox.ini
index 243e1ac..39294d7 100644
--- a/tox.ini
+++ b/tox.ini
@@ -51,9 +51,6 @@ commands =
deps =
-rrequirements.txt
-rrequirements-dev.txt
- coverage
- mock
- nose
setenv =
PYTHONPATH = {toxinidir}
SUPERSET_CONFIG = tests.superset_test_config