Example #1
0
    def _run(self, data):
        """ Procedure to run when data received from trigger thread.

        Args:
            data: Pass to the registered event handlers.
        """
        data_source = data["source"]
        at = data["at"]

        upload_items = []
        for label, datum in data["data"].items():
            upload_item = datum
            upload_item["label"] = label
            upload_item["source"] = data_source
            upload_item["keen"] = {"timestamp": "{}Z".format(at.isoformat())}
            upload_items.append(upload_item)

        try:
            self.client_.add_events({"offgrid": upload_items})
        except Exception as e:
            logger.error("{} failed to send data to keenio at {} by {}".format(
                type(self).__name__, data["at"],
                type(e).__name__))
            logger.error("Details: {}".format(str(e)))

            del self.client_
            self.client_ = KeenClient(project_id=self.project_id_,
                                      write_key=self.write_key_)

            # TODO: skip retry to avoid exception in this scope.
            # self.client_.add_events({"offgrid": upload_items})
        else:
            logger.info("{} sent data to keenio at {}".format(
                type(self).__name__, at))
Example #2
0
def main():

    call(['./get_sleep.sh'])

    with open('data_json.txt') as raw:
        print '[Info] Loading raw sleep data...'
        raw_sessions = json.load(raw)
        timestamp = (datetime.today() - timedelta(days=TIME_DELTA)).isoformat()
        chk_sessions = [s for s in raw_sessions if s['start'] > timestamp]
        
        if len(chk_sessions) > 0:
            print '[Info] Found {0} sleep sessions to check...'.format(len(chk_sessions))

            client = KeenClient(
                project_id = KEEN_PROJECT_ID,
                write_key = KEEN_WRITE_KEY,
                read_key = KEEN_READ_KEY
                )
            old_sessions = client.extraction('sessions', timeframe=TIME_FRAME)
            new_sessions = [s for s in chk_sessions if 'tyin' + s['start'] not in [s2['id'] for s2 in old_sessions]]

            if len(new_sessions) > 0:
                print '[Info] Found {0} sleep sessions to add...'.format(len(new_sessions))
                sessions = []
                events = []
                sessions, events = transform(new_sessions, 'tyin')

                client.add_events({'sessions': sessions, 'events': events})
                print '[Info] Added {0} sleep sessions.'.format(len(new_sessions))

    print '[Info] Done.'
Example #3
0
def index(request):

    hits = cache.get('keen_hit_count')

    if not hits:
        keen = KeenClient(project_id=settings.KEEN_PROJECT_ID,
                          write_key=settings.KEEN_WRITE_KEY,
                          read_key=settings.KEEN_READ_KEY,
                          get_timeout=3)
        try:
            detail_count = keen.count('detail_hit')
            list_count = keen.count('list_hit')
            schema_count = keen.count('schema_hit')
            hits = detail_count + list_count + schema_count
        except Exception:
            print('exception!')
            hits = DEFAULT_HITS

        cache.set('keen_hit_count', hits, DEFAULT_HITS)

    stripe_key = settings.STRIPE_KEYS['publishable']
    return render_to_response('index.html', {
        "hits": hits,
        "stripe_key": stripe_key
    })
Example #4
0
def index(request):

    hits = cache.get('keen_hit_count')

    if not hits:
        keen = KeenClient(
            project_id=settings.KEEN_PROJECT_ID,
            write_key=settings.KEEN_WRITE_KEY,
            read_key=settings.KEEN_READ_KEY,
            get_timeout=3
        )
        try:
            detail_count = keen.count('detail_hit')
            list_count = keen.count('list_hit')
            schema_count = keen.count('schema_hit')
            hits = detail_count + list_count + schema_count
        except Exception:
            print('exception!')
            hits = DEFAULT_HITS

        cache.set('keen_hit_count', hits, DEFAULT_HITS)


    stripe_key = settings.STRIPE_KEYS['publishable']
    return render_to_response('index.html',
        {
            "hits": hits,
            "stripe_key": stripe_key
        }
    )
 def test_post_timeout_batch(self):
     keen.project_id = "5004ded1163d66114f000000"
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     keen.write_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]})
     client = KeenClient(keen.project_id, write_key=keen.write_key, read_key=None,
                         post_timeout=0.0001)
     client.add_events({"python_test": [{"hello": "goodbye"}]})
    def test_generate_image_beacon(self):
        keen.project_id = "5004ded1163d66114f000000"
        api_key = "2e79c6ec1d0145be8891bf668599c79a"
        keen.write_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]})

        event_collection = "python_test hello!?"
        event_data = {"a": "b"}
        data = self.base64_encode(json.dumps(event_data))

        # module level should work
        url = keen.generate_image_beacon(event_collection, event_data)
        expected = "https://api.keen.io/3.0/projects/{0}/events/{1}?api_key={2}&data={3}".format(
            keen.project_id, self.url_escape(event_collection), keen.write_key.decode(sys.getdefaultencoding()), data
        )
        self.assert_equal(expected, url)

        # so should instance level
        client = KeenClient(keen.project_id, write_key=keen.write_key, read_key=None)
        url = client.generate_image_beacon(event_collection, event_data)
        self.assert_equal(expected, url)

        # make sure URL works
        response = requests.get(url)
        self.assert_equal(200, response.status_code)
        self.assert_equal(b"GIF89a\x01\x00\x01\x00\x80\x01\x00\xff\xff\xff\x00\x00\x00!\xf9\x04\x01\n\x00\x01\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02L\x01\x00;",
                          response.content)
Example #7
0
    def run(self):
        keen_client = KeenClient(
            project_id=self.project_id,
            write_key=self.write_key,
        )

        timezone = pytz.timezone(self.data['user']['timezone'])

        self.events = []
        with click.progressbar(self.data['days'],
                            label='Preparing keen.io events',
                            fill_char=click.style('#', fg='blue')) as days:

            for day in days:
                dt = self._parse_date(day['date'], timezone)

                self.append_event(dt, 'total', {
                    'seconds': day['grand_total']['total_seconds'],
                })

                categories = [
                    'editor',
                    'language',
                    'operating_system',
                    'project',
                ]
                for category in categories:
                    for item in day.get(category + 's', []):
                        self.append_event(dt, category, {
                            'seconds': item['total_seconds'],
                            'name': item['name'],
                        })

                files = {}
                for project in day.get('projects', []):
                    for f in project.get('dump', {}).get('files', []):
                        if f['name'] not in files:
                            files[f['name']] = 0
                        files[f['name']] += f['total_seconds']

                for name, seconds in files.items():
                    self.append_event(dt, 'file', {
                        'seconds': seconds,
                        'name': name,
                    })

        if len(self.events) == 0:
            click.echo('No events available for exporting to keen.io')
            return

        click.echo('Uploading events to keen.io...')
        start = datetime.utcfromtimestamp(self.data['range']['start'])
        end = datetime.utcfromtimestamp(self.data['range']['end'])
        collection = 'WakaTime Data Dump from {start} until {end}'.format(
            start=start.strftime('%Y-%m-%d'),
            end=end.strftime('%Y-%m-%d'),
        )
        keen_client.add_events({
            collection: self.events,
        })
Example #8
0
 def __keen_client(self):
     if KEEN_CLIENT_ENABLED and self.keen_client == None:
         self.keen_client = KeenClient(project_id=KEEN_PROJECT_ID,
                                       write_key=KEEN_WRITE_KEY,
                                       read_key=KEEN_READ_KEY,
                                       base_url=KEEN_API_URL)
     return self.keen_client
Example #9
0
    def test_generate_image_beacon(self):
        keen.project_id = "5004ded1163d66114f000000"
        api_key = "2e79c6ec1d0145be8891bf668599c79a"
        keen.write_key = scoped_keys.encrypt(api_key,
                                             {"allowed_operations": ["write"]})

        event_collection = "python_test hello!?"
        event_data = {"a": "b"}
        data = self.base64_encode(json.dumps(event_data))

        # module level should work
        url = keen.generate_image_beacon(event_collection, event_data)
        expected = "https://api.keen.io/3.0/projects/{0}/events/{1}?api_key={2}&data={3}".format(
            keen.project_id, self.url_escape(event_collection),
            keen.write_key.decode(sys.getdefaultencoding()), data)
        self.assert_equal(expected, url)

        # so should instance level
        client = KeenClient(keen.project_id,
                            write_key=keen.write_key,
                            read_key=None)
        url = client.generate_image_beacon(event_collection, event_data)
        self.assert_equal(expected, url)

        # make sure URL works
        response = requests.get(url)
        self.assert_equal(200, response.status_code)
        self.assert_equal(
            b"GIF89a\x01\x00\x01\x00\x80\x01\x00\xff\xff\xff\x00\x00\x00!\xf9\x04\x01\n\x00\x01\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02L\x01\x00;",
            response.content)
Example #10
0
    def __init__(self, project_id, write_key, q_max=5):
        IEventHandler.__init__(self, q_max=q_max)

        # for retry
        self.project_id_ = project_id
        self.write_key_ = write_key

        self.client_ = KeenClient(project_id=project_id, write_key=write_key)
Example #11
0
class KeenIoEventHandler(IEventHandler):
    """ The instance should be registered to event trigger for data update.
        This uploads any data to keenio cloud service.

    Args:
        project_id: Project ID provided by keenio.
        write_key: Write key ID provided by keenio.
        q_max: internal queue size to be used from another thread.
    Returns:
        Instance of this class.
    """
    def __init__(self, project_id, write_key, q_max=5):
        IEventHandler.__init__(self, q_max=q_max)

        # for retry
        self.project_id_ = project_id
        self.write_key_ = write_key

        self.client_ = KeenClient(project_id=project_id, write_key=write_key)

    def _run(self, data):
        """ Procedure to run when data received from trigger thread.

        Args:
            data: Pass to the registered event handlers.
        """
        data_source = data["source"]
        at = data["at"]

        upload_items = []
        for label, datum in data["data"].items():
            upload_item = datum
            upload_item["label"] = label
            upload_item["source"] = data_source
            upload_item["keen"] = {"timestamp": "{}Z".format(at.isoformat())}
            upload_items.append(upload_item)

        try:
            self.client_.add_events({"offgrid": upload_items})
        except Exception as e:
            logger.error("{} failed to send data to keenio at {} by {}".format(
                type(self).__name__, data["at"],
                type(e).__name__))
            logger.error("Details: {}".format(str(e)))

            del self.client_
            self.client_ = KeenClient(project_id=self.project_id_,
                                      write_key=self.write_key_)

            # TODO: skip retry to avoid exception in this scope.
            # self.client_.add_events({"offgrid": upload_items})
        else:
            logger.info("{} sent data to keenio at {}".format(
                type(self).__name__, at))
Example #12
0
def main():
    counts_by_institutions = get_count_by_institutions()
    keen_project = keen_settings['private']['project_id']
    write_key = keen_settings['private']['write_key']
    if keen_project and write_key:
        client = KeenClient(
            project_id=keen_project,
            write_key=write_key,
        )
        client.add_events(counts_by_institutions)
    else:
        print(counts_by_institutions)
Example #13
0
 def send_events(self, events):
     keen_project = keen_settings['private']['project_id']
     write_key = keen_settings['private']['write_key']
     if keen_project and write_key:
         client = KeenClient(
             project_id=keen_project,
             write_key=write_key,
         )
         logger.info('Adding {} events to the {} collection'.format(len(events), self.collection_name))
         client.add_events({self.collection_name: events})
     else:
         logger.info('Keen not enabled - would otherwise be adding the following {} events to the {} collection'.format(len(events), self.collection_name))
         print(events)
Example #14
0
 def send_events(self, events):
     keen_project = keen_settings['private']['project_id']
     write_key = keen_settings['private']['write_key']
     if keen_project and write_key:
         client = KeenClient(
             project_id=keen_project,
             write_key=write_key,
         )
         logger.info('Adding {} events to the {} collection'.format(len(events), self.collection_name))
         client.add_events({self.collection_name: events})
     else:
         logger.info('Keen not enabled - would otherwise be adding the following {} events to the {} collection'.format(len(events), self.collection_name))
         print(events)
Example #15
0
    def test_configure_through_code(self, post):
        client = KeenClient(project_id="123456", read_key=None, write_key=None)
        self.assert_raises(exceptions.InvalidEnvironmentError,
                           client.add_event, "python_test", {"hello": "goodbye"})

        # force client to reinitialize
        client = KeenClient(project_id="123456", read_key=None, write_key="abcdef")
        with patch("requests.Session.post") as post:
            post.return_value = MockedFailedResponse(
                status_code=401,
                json_response={"message": "authorization error", "error_code": "AdminOnlyEndpointError"},
            )
            self.assert_raises(exceptions.KeenApiError,
                               client.add_event, "python_test", {"hello": "goodbye"})
Example #16
0
 def negative_helper(expected_exception, project_id,
                     **kwargs):
     try:
         KeenClient(project_id, **kwargs)
     except expected_exception as e:
         self.assert_true(str(e))
         return e
Example #17
0
    def test_generate_image_beacon(self, post):
        event_collection = "python_test hello!?"
        event_data = {"a": "b"}
        data = self.base64_encode(json.dumps(event_data))

        # module level should work
        url = keen.generate_image_beacon(event_collection, event_data)
        expected = "https://api.keen.io/3.0/projects/{0}/events/{1}?api_key={2}&data={3}".format(
            keen.project_id, self.url_escape(event_collection), keen.write_key.decode(sys.getdefaultencoding()), data
        )
        self.assert_equal(expected, url)

        # so should instance level
        client = KeenClient(keen.project_id, write_key=keen.write_key, read_key=None)
        url = client.generate_image_beacon(event_collection, event_data)
        self.assert_equal(expected, url)
Example #18
0
 def init_app(self, app):
     # self.app = app
     self.client = KeenClient(
         project_id=app.config.get('KEEN_PROJECT_ID'),
         read_key=app.config.get('KEEN_READ_KEY'),
         write_key=app.config.get('KEEN_WRITE_KEY'),
     )
Example #19
0
def get_keen_client(credentials_key):
    """ Get KeenCLient

    Parameters
    ----------
    credentials_key : str
        either a path to a json file containing 'project_id' and 'read_key'
        or a service_name for keyring entries containing 'project_id' and
        'read_key'

    Returns
    -------
    KeenClient
    """
    if credentials_key.endswith('.json'):
        credentials = open(credentials_key, 'r').read()
        credentials = json.loads(credentials)
        project_id = credentials['project_id']
        read_key = credentials['read_key']
    else:
        project_id=keyring.get_password(credentials_key, 'project_id')
        read_key=keyring.get_password(credentials_key, 'read_key')

    client = KeenClient(project_id=project_id, read_key=read_key)
    return client
 def setUp(self):
     super(SavedQueryTests, self).setUp()
     self.exp_project_id = "xxxx1234"
     exp_master_key = "abcd3456"
     self.client = KeenClient(project_id=self.exp_project_id,
                              read_key="efgh7890",
                              master_key=exp_master_key)
    def test_passing_invalid_custom_api_client(self, get):
        class CustomApiClient(object):
            api_version = "3.0"

            def __init__(self,
                         project_id,
                         write_key=None,
                         read_key=None,
                         base_url=None,
                         api_version=None,
                         **kwargs):
                super(CustomApiClient, self).__init__()
                self.project_id = project_id
                self.write_key = write_key
                self.read_key = read_key
                if base_url:
                    self.base_url = base_url
                if api_version:
                    self.api_version = api_version

        api_key = "2e79c6ec1d0145be8891bf668599c79a"
        client = KeenClient(
            "5004ded1163d66114f000000",
            write_key=scoped_keys.encrypt(api_key,
                                          {"allowed_operations": ["write"]}),
            read_key=scoped_keys.encrypt(api_key,
                                         {"allowed_operations": ["read"]}),
            api_class=CustomApiClient,
            base_url="keen.base.url")

        # Should raise an error, we never added this method on our class
        # But it shows it is actually using our class
        self.assertRaises(TypeError, client.add_event)
Example #22
0
 def setUp(self):
     super(CustomJSONEncoderTests, self).setUp()
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     self.client = KeenClient(project_id='5004ded1163d66114f000000',
                              write_key=scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]}),
                              read_key=scoped_keys.encrypt(api_key, {"allowed_operations": ["read"]}),
                              json_encoder=CustomEncoder)
Example #23
0
    def test_generate_image_beacon(self, post):
        event_collection = "python_test hello!?"
        event_data = {"a": "b"}
        data = self.base64_encode(json.dumps(event_data))

        # module level should work
        url = keen.generate_image_beacon(event_collection, event_data)
        expected = "https://api.keen.io/3.0/projects/{0}/events/{1}?api_key={2}&data={3}".format(
            keen.project_id, self.url_escape(event_collection), keen.write_key.decode(sys.getdefaultencoding()), data
        )
        self.assert_equal(expected, url)

        # so should instance level
        client = KeenClient(keen.project_id, write_key=keen.write_key, read_key=None)
        url = client.generate_image_beacon(event_collection, event_data)
        self.assert_equal(expected, url)
 def __init__(self):
     self.client = KeenClient(
         project_id=ENV["keen"]["project_id"],
         write_key=ENV["keen"]["write_key"],
         read_key=ENV["keen"]["read_key"],
         master_key=ENV["keen"]["master_key"],
     )
class KeenEventService:
    def __init__(self):
        self.client = KeenClient(
            project_id=ENV["keen"]["project_id"],
            write_key=ENV["keen"]["write_key"],
            read_key=ENV["keen"]["read_key"],
            master_key=ENV["keen"]["master_key"],
        )

    #
    # insert an event log
    #
    def insert_event(self, event_collection, event_log):
        try:
            self.client.add_event(event_collection, event_log)
        except Exception, e:
            log.exception(e)
Example #26
0
 def __keen_client(self):
    if KEEN_CLIENT_ENABLED and self.keen_client == None:
       self.keen_client = KeenClient(
          project_id=KEEN_PROJECT_ID,
          write_key=KEEN_WRITE_KEY,
          read_key=KEEN_READ_KEY,
          base_url=KEEN_API_URL
       )
    return self.keen_client
Example #27
0
    def send_events(self, events):
        keen_project = keen_settings["private"]["project_id"]
        write_key = keen_settings["private"]["write_key"]
        if keen_project and write_key:
            client = KeenClient(project_id=keen_project, write_key=write_key)
            logger.info("Adding {} events to the {} collection".format(len(events), self.collection_name))

            for chunk in self.yield_chunked_events(events):
                client.add_events({self.collection_name: chunk})
                time.sleep(1)

        else:
            logger.info(
                "Keen not enabled - would otherwise be adding the following {} events to the {} collection".format(
                    len(events), self.collection_name
                )
            )
            print(events)
Example #28
0
def main():
    print "[INFO] Getting raw spire data..."
    date = (datetime.today() - timedelta(days=DAYS_AGO)).strftime("%Y-%m-%d")

    # Breath
    breath_client = KeenClient(
        project_id=keen["breath"]["project_id"],
        read_key=keen["breath"]["read_key"],
        write_key=keen["breath"]["write_key"],
    )

    if len(breath_client.extraction("sessions", timeframe="this_" + str(DAYS_AGO) + "_days")) > 0:
        print "[INFO] Already uploaded breath data for " + date + "."
    else:
        breaths = get_spire(spire["breath"], date)

        if len(breaths["data"]) > 0:
            print "[INFO] Uploading breath data..."

            keen_breaths = {}
            keen_breaths["breaths"] = [{"timestamp": b["timestamp"], "value": b["value"]} for b in breaths["data"]]
            keen_breaths["metadata"] = breaths["metadata"]

            keen_breaths["metadata"]["min"] = min([b["value"] for b in breaths["data"]])
            keen_breaths["metadata"]["max"] = max([b["value"] for b in breaths["data"]])
            keen_breaths["id"] = USER + date
            breath_client.add_event("sessions", keen_breaths)
            print "[INFO] Uploaded breath data for " + date + "."
        else:
            print "[INFO] No breath data found for " + date + "."

    # Steps
    steps_client = KeenClient(
        project_id=keen["steps"]["project_id"], read_key=keen["steps"]["read_key"], write_key=keen["steps"]["write_key"]
    )

    if len(steps_client.extraction("sessions", timeframe="this_" + str(DAYS_AGO) + "_days")) > 0:
        print "[INFO] Already uploaded steps data for " + date + "."
    else:
        steps = get_spire(spire["step"], date)

        if len(steps["data"]) > 0:
            print "[INFO] Uploading steps data..."

            keen_steps = {}
            keen_steps["steps"] = [{"timestamp": s["timestamp"], "value": s["value"]} for s in steps["data"]]
            keen_steps["metadata"] = steps["metadata"]
            keen_steps["id"] = USER + date
            steps_client.add_event("sessions", keen_steps)
            print "[INFO] Uploaded steps data for " + date + "."
        else:
            print "[INFO] No steps data found for " + date + "."
Example #29
0
class AsyncKeenClient(object):
    def __init__(self):
        self._client = KeenClient(
            project_id=os.environ['KEEN_PROJECT_ID'],
            write_key=os.environ['KEEN_WRITE_KEY'],
            post_timeout=100
        )

    def add_event(self, collection, body):
        push = lambda: self._client.add_event(collection, body)
        IOLoop.current().spawn_callback(push)
Example #30
0
class CustomJSONEncoderTests(BaseTestCase):

    def setUp(self):
        super(CustomJSONEncoderTests, self).setUp()
        api_key = "2e79c6ec1d0145be8891bf668599c79a"
        self.client = KeenClient(project_id='5004ded1163d66114f000000',
                                 write_key=scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]}),
                                 read_key=scoped_keys.encrypt(api_key, {"allowed_operations": ["read"]}),
                                 json_encoder=CustomEncoder)

    def tearDown(self):
        self.client = None
        super(CustomJSONEncoderTests, self).tearDown()

    def test_custom_encoder_with_datetime_type(self):
        self.client.add_event("sign_ups", {
            "username": "******",
            "referred_by": "harry",
            "confirmed_at": datetime.datetime.utcnow()
        })
 def test_direct_persistence_strategy(self):
     project_id = "5004ded1163d66114f000000"
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     write_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]})
     read_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["read"]})
     client = KeenClient(project_id, write_key=write_key, read_key=read_key)
     client.add_event("python_test", {"hello": "goodbye"})
     client.add_event("python_test", {"hello": "goodbye"})
     client.add_events(
         {
             "sign_ups": [{
                 "username": "******",
                 "referred_by": "steve",
                 "son_of": "my_mom"
             }],
             "purchases": [
                 {"price": 5},
                 {"price": 6},
                 {"price": 7}
             ]}
     )
 def test_timeout_count(self, get):
     get.side_effect = requests.Timeout
     client = KeenClient(keen.project_id,
                         write_key=None,
                         read_key=keen.read_key,
                         get_timeout=0.0001)
     self.assert_raises(requests.Timeout,
                        client.count,
                        "query test",
                        timeframe="today",
                        filters=self.get_filter())
     # Make sure the requests library was called with `timeout`.
     self.assert_equals(get.call_args[1]["timeout"], 0.0001)
Example #33
0
def get_keen_client():
    keen_project = keen_settings['private'].get('project_id')
    read_key = keen_settings['private'].get('read_key')
    master_key = keen_settings['private'].get('master_key')
    write_key = keen_settings['private'].get('write_key')
    if keen_project and read_key and master_key:
        client = KeenClient(project_id=keen_project,
                            read_key=read_key,
                            master_key=master_key,
                            write_key=write_key)
    else:
        raise ValueError(
            'Cannot connect to Keen clients - all keys not provided.')

    return client
Example #34
0
def _initialize_client_from_environment():
    global _client, project_id, write_key, read_key

    if _client is None:
        # check environment for project ID and keys
        project_id = project_id or os.environ.get("KEEN_PROJECT_ID")
        write_key = write_key or os.environ.get("KEEN_WRITE_KEY")
        read_key = read_key or os.environ.get("KEEN_READ_KEY")

        if not project_id:
            raise InvalidEnvironmentError("Please set the KEEN_PROJECT_ID environment variable or set keen.project_id!")

        _client = KeenClient(project_id,
                             write_key=write_key,
                             read_key=read_key)
Example #35
0
    def test_new_client_instance(self, post):
        exp_project_id = "xxxx1234"
        exp_write_key = "yyyy4567"
        exp_read_key = "zzzz8912"
        exp_master_key = "abcd3456"

        # create Client instance
        client = KeenClient(project_id=exp_project_id,
                            write_key=exp_write_key,
                            read_key=exp_read_key,
                            master_key=exp_master_key)

        # assert values
        self.assertEquals(exp_project_id, client.api.project_id)
        self.assertEquals(exp_write_key, client.api.write_key)
        self.assertEquals(exp_read_key, client.api.read_key)
        self.assertEquals(exp_master_key, client.api.master_key)
Example #36
0
def _initialize_client_from_environment():
    ''' Initialize a KeenClient instance using environment variables. '''
    global _client, project_id, write_key, read_key, master_key, base_url

    if _client is None:
        # check environment for project ID and keys
        project_id = project_id or os.environ.get("KEEN_PROJECT_ID")
        write_key = write_key or os.environ.get("KEEN_WRITE_KEY")
        read_key = read_key or os.environ.get("KEEN_READ_KEY")
        master_key = master_key or os.environ.get("KEEN_MASTER_KEY")
        base_url = base_url or os.environ.get("KEEN_BASE_URL")

        if not project_id:
            raise InvalidEnvironmentError("Please set the KEEN_PROJECT_ID environment variable or set keen.project_id!")

        _client = KeenClient(project_id,
                             write_key=write_key,
                             read_key=read_key,
                             master_key=master_key,
                             base_url=base_url)
Example #37
0
 def test_direct_persistence_strategy(self):
     project_id = "5004ded1163d66114f000000"
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     write_key = scoped_keys.encrypt(api_key,
                                     {"allowed_operations": ["write"]})
     read_key = scoped_keys.encrypt(api_key,
                                    {"allowed_operations": ["read"]})
     client = KeenClient(project_id, write_key=write_key, read_key=read_key)
     client.add_event("python_test", {"hello": "goodbye"})
     client.add_event("python_test", {"hello": "goodbye"})
     client.add_events({
         "sign_ups": [{
             "username": "******",
             "referred_by": "steve",
             "son_of": "my_mom"
         }],
         "purchases": [{
             "price": 5
         }, {
             "price": 6
         }, {
             "price": 7
         }]
     })
 def test_direct_persistence_strategy(self):
     project_id = "5004ded1163d66114f000000"
     auth_token = "2e79c6ec1d0145be8891bf668599c79a"
     client = KeenClient(project_id, auth_token)
     client.add_event("python_test", {"hello": "goodbye"})
Example #39
0
#!/usr/bin/env python
# -*- coding:utf8 -*-
from keen.client import KeenClient
keen_client = KeenClient(
        project_id="55f93f85d2eaaa05a699de39",
        write_key="8f77f837b629b8519e8d23c541fedc42d423f8f71dc10e2244b50e364e7034cb753d960ea31d7925d044a109233cdf55e88792d4fa9f16f4e2410a7e09309242565415ef3d7299526c2fbf6860603bd349d186f068f5bd940ff047c2f4a4f0959c1cda4c3c3208729524b233b096e4de",
        read_key="2f1b89a70f545caaeff7964b5daa60236844aa0291a20749e15ca83e30c63d3cb939d7eb720666c03164403680d77d8e6086e3f1d60b5a34f696b09fc1bd695a0a0f0a1f947757cd5bd5666d5448b614e9928a544bfcecfe4bb9e52b1c02d77e49e359c04dc2dd901764097364b00573",
        master_key="3855C83BD7B0720323E0B1E447149B01")

class Keen(object):
    keen = None
    def __init__(self):
        self.keen = keen_client

    def add_girl(self, collection, name, count_dict, **kwargs):
        data_array = list()
        for i in count_dict.keys():
            if self.is_exist_girl(collection, name, i):
                pass
            else:
                data_dict = dict()
                data_dict["캐릭터"] = name
                data_dict["keen"] = dict()
                data_dict["count"] = count_dict[i]
                data_dict["keen"]["timestamp"] = i
                data_array.append(data_dict)
        self.keen.add_events({
            collection : data_array})
        return True

    def is_exist_girl(self, collection, name, timestamp, **kwargs):
Example #40
0
# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>

# <codecell>

from keen.client import KeenClient
import json
from dateutil.parser import *

client = KeenClient(
    project_id="50ba759d897a2c45c2000000",
    write_key="72a1ad85456fd2361cfe8b65d240eab16b083caa944c11d9507761e536d34822eca4cefad12e482373ee41278953f98c6ff724b33b56fd5971e8d34cdd284cb6c3f202d9f13329e39c01eb9a35d1124cae81d9a4505992fce03be4030e32b19c72df266c55a18937f001e7158f6eac44",
    read_key="f7a829ecc9e237949b0b97245c828661ff0c9f46eaec35a7dc4cfd3b4ef42804f5fc1859ecad05bd7d72b6c3a2e4047ae39cba86b5d51c770be26b0a406cbb44650d20fd05fb7896293f015cec3af3ca2df8a507927bf4cfed9275eb89e8dee855cf45db75b221074bda2f737d2810f2"
)


# <codecell>

import datetime

# <codecell>

current = datetime.datetime.now()

# <codecell>

from dateutil.relativedelta import *

# <codecell>

two_week = relativedelta(weeks=2)
Example #41
0
import matplotlib.pyplot as plt
from keen.client import KeenClient
from functools import wraps
from queue import Queue
from threading import Thread
from datetime import datetime, timedelta

#load keen credentials and initialize the class
os.chdir('/users/csaunders/Desktop')
with open('Keen_API_credentials.pickle', 'rb') as f:
    Keen_API_credentials = pickle.load(f)

Keen_silo = 'QZ prod'
projectID = Keen_API_credentials[Keen_silo]['projectID']
readKey = Keen_API_credentials[Keen_silo]['readKey']
keen = KeenClient(project_id=projectID, read_key=readKey)


######### TIMEFRAME GENERATOR ##############################################
def timeframe_gen(start, end, hour_interval=24, tz='US/Eastern'):
    """creates timeframe for use in making Keen API calls
    args:
        start - start date (str - '2017-08-04'); inclusive
        end - end date (str - '2017-08-04'); inclusive
    kwargs:
        hour_interval - interval for breaking up start, end tuple
        tz - timezone

    returns:
        List of tuples, tuple - (start, end)
    """
Example #42
0
 def __init__(self):
     self.keenWriter = KeenClient(
         project_id=config.KEEN_PROJECTID,
         write_key=config.KEEN_WRITEKEY,
         read_key=config.KEEN_READKEY
     )        
Example #43
0
 def __init__(self):
     self._client = KeenClient(
         project_id=os.environ['KEEN_PROJECT_ID'],
         write_key=os.environ['KEEN_WRITE_KEY'],
         post_timeout=100
     )
Example #44
0
class Alerter:
   def __init__(self):
      logging.basicConfig()
      self.logger = logging.getLogger()
      self.logger.setLevel(logging.INFO)
      self.garage_data = anyconfig.load("garage_data.json")['garage_data']
      self.sg = sendgrid.SendGridClient(SENDGRID_USERNAME, SENDGRID_PASSWORD)
      self.keen_client = None

   def __keen_client(self):
      if KEEN_CLIENT_ENABLED and self.keen_client == None:
         self.keen_client = KeenClient(
            project_id=KEEN_PROJECT_ID,
            write_key=KEEN_WRITE_KEY,
            read_key=KEEN_READ_KEY,
            base_url=KEEN_API_URL
         )
      return self.keen_client

   def is_email(self, address):
      assert isinstance(address, str)
      return "@" in address


   def is_phone(self, address):
      assert isinstance(address, str)
      address = address.replace("-", "")
      pattern = re.compile("^[\dA-Z]{3}[\dA-Z]{3}[\dA-Z]{4}$", re.IGNORECASE)
      return pattern.match(address) is not None


   @newrelic.agent.background_task()
   def send_alert(self, address, garage):
      if self.is_email(address):
         self.send_email(address, garage)
      elif self.is_phone(address):
         self.send_txt(address, garage)
      self.clear_subs_for_user(address)


   @newrelic.agent.background_task()
   def send_email(self, address, garage):
      self.logger.info("send_email(): Sending email about {} to {}".format(garage, address))
      message = sendgrid.Mail()
      message.add_to(address)
      message_text = "{} has a new spot open".format(garage)
      message.set_subject(message_text)
      message.set_text(message_text) #todo add how many spots are there
      message.set_from(SENDGRID_EMAIL_FROM)
      self.sg.send(message)


   @newrelic.agent.background_task()
   def send_txt(self, address, garage):
      self.logger.info("send_txt(): Sending txt about {} to {}".format(garage, address))
      body = "{} has a new spot open".format(garage),
      EasySms.send_sms(to=address, body=body)


   @newrelic.agent.background_task()
   def find_changes(self):
      current = json.loads(self.redis_connection.hget("current", "data"))
      previous = json.loads(self.redis_connection.hget("previous", "data"))

      cur_stations = {}
      prev_stations = {}

      for garage in current.itervalues():
         cur_stations.update(garage['stations'])

      for garage in previous.itervalues():
         prev_stations.update(garage['stations'])

      stations_with_new_spots = []
      for station_name in cur_stations.keys():
         if cur_stations[station_name] > prev_stations[station_name]:
            stations_with_new_spots.append(station_name)

      all_changes = {}
      for station_name in cur_stations.keys():
         if cur_stations[station_name] != prev_stations[station_name]:
            all_changes[station_name] = cur_stations[station_name]

      self.logger.info("find_changes(): all chargers changes: {}".format(all_changes))

      if KEEN_CLIENT_ENABLED and all_changes > 0:
         self.logger.info("find_changes(): sending keen events: {}".format(all_changes))
         self.keen_client.add_event("chargers", all_changes)

      self.logger.info("find_changes(): stations with new spots {}".format(stations_with_new_spots))
      return stations_with_new_spots


   @newrelic.agent.background_task()
   def clear_subs_for_user(self, target):
      self.logger.info("clear_subs_for_user(): Clearing sub for user {}".format(target))
      for key in self.redis_connection.keys("SUB-*"):
         if self.redis_connection.type(key) == "set":
            self.redis_connection.srem(key, target)
            self.logger.info("clear_subs_for_user(): Removing user {} from subscription to {}".format(target, key))

   def find_garage(self, station):
      # station = PG3-STATION 26 for example
      # PG1 is Hilltop, PG2 is Central, PG3 is Creekside
      garages = ['Hilltop', 'Central', 'Creekside']
      garage_array_index = int(station[2]) - 1
      return garages[garage_array_index]


   @newrelic.agent.background_task()
   def main_loop(self):
      self.redis_connection = redis.StrictRedis.from_url(REDIS_URL)
      pubsub = self.redis_connection.pubsub()
      pubsub.subscribe(REDIS_CHANNEL)

      # todo add tests
      for item in pubsub.listen():
         self.logger.info("alerter.main_loop(): Got a new alert. Processing ...")

         if item['type'] == "message":
            self.logger.info("alerter.main_loop(): received alert of new info with timstamp {}".format(item['data']))

            for station in self.find_changes():
               self.logger.info("alerter.main_loop(): Found new station {}...checking for subscriptions".format(station))

               garage_name = self.find_garage(station)
               queue_name = "SUB-{}".format(garage_name)

               self.logger.info("alerter.main_loop(): Checking queue {} for members".format(queue_name))
               queue_members = self.redis_connection.smembers(queue_name)

               if len(queue_members) == 0:
                  self.logger.info("alerter.main_loop(): No notifications to send for garage {}".format(garage_name))
               for target in queue_members:
                  self.logger.info("alerter.main_loop(): Notifying {} for {} changes.".format(target, garage_name))
                  self.send_alert(target, garage_name)

         self.logger.info("alerter.main_loop(): done processing alert.")
 def test_create_saved_query_master_key(self):
     client = KeenClient(project_id="123123")
     self.assertRaises(
         exceptions.InvalidEnvironmentError,
         lambda: client.saved_queries.create("saved-query-name", {})
     )
 def test_get_one_saved_query_keys(self):
     client = KeenClient(project_id="123123")
     self.assertRaises(
         exceptions.InvalidEnvironmentError,
         lambda: client.saved_queries.get("saved-query-name")
     )
 def test_get_all_saved_queries_keys(self):
     client = KeenClient(project_id="123123")
     self.assertRaises(
         exceptions.InvalidEnvironmentError, client.saved_queries.all
     )
Example #48
0
class HireKeen:

    def __init__(self):
        self.keenWriter = KeenClient(
            project_id=config.KEEN_PROJECTID,
            write_key=config.KEEN_WRITEKEY,
            read_key=config.KEEN_READKEY
        )        

    def record_keen(self, index, event):
        self.keenWriter.add_event(index, event)

    def extract_keen(self, index, timeframe, filters):
        return self.keenWriter.extraction(index, timeframe, filters=filters)

    def pred_identify(self, user_id):
        self.identified = True
        self.predclient.identify(user_id)

    def pred_ranked(self, engine, data):
        return self.predclient.get_itemrank_ranked(engine, data)

    def pred_top_rec(self, engine, number):
        return self.predclient.get_itemrec_topn(engine, number)

    def pred_create(self, user, userType):
        self.predclient.create_user(user, {'userType': userType})

    def event_record_register(self, loggedin_id):
        user_details = self.db_user.find_one({'linkedin_id': loggedin_id})
        if user_details:
            event_data = {
                "action": "registration",
                "userId": user_details['linkedin_id'],
                "userCompanyId": user_details['linkedin_company_id']
            }
            recordEvent.delay('siteActions', event_data)

    def event_record_activate(self, loggedin_id):
        user_details = self.db_user.find_one({'linkedin_id': loggedin_id})
        if user_details:
            event_data = {
                "action": "activation",
                "userId": user_details['linkedin_id'],
                "userCompanyId": user_details['linkedin_company_id']
            }
            recordEvent.delay('siteActions', event_data)

    def event_record_create_project(self, project_slug, user_id):
        project_details = self.db_project.find_one({'slug': project_slug, 'loggedin_id': user_id})
        if project_details:
            try:
                user_details = self.db_user.find_one({'linkedin_id': project_details['loggedin_id']})
                company_details = self.db_linkedincompany.find_one({'id': user_details['linkedin_company_id']})
                event_data = {
                    "action": "project creation",
                    "userId": project_details['loggedin_id'],
                    "userCompanyId": user_details['linkedin_company_id'],
                    "slug": project_slug,
                    "skills": [],
                    "addlSkills": [],
                    "userCompany": company_details['name'],
                    "forCompanyId": project_details['companyId'],
                    "forCompanyName": project_details['company'],
                    "name": project_details['name']
                }
                for skill in project_details['skills']:
                    if skill['skill'] not in event_data['skills']:
                        event_data['skills'].append(skill['skill'])
                for addlskill in project_details['addlSkills']:
                    if addlskill not in event_data['addlSkills']:
                        event_data['addlSkills'].append(addlskill)
                recordEvent.delay('siteActions', event_data)
            except:
                rollbar.report_exc_info()

    def event_record_create_position(self, project_slug, position_slug, user_id):
        position_details = self.db_position.find_one({'project': project_slug, 'slug': position_slug, 'loggedin_id': user_id})
        if position_details:
            try:
                user_details = self.db_user.find_one({'linkedin_id': position_details['loggedin_id']})
                company_details = self.db_linkedincompany.find_one({'id': user_details['linkedin_company_id']})
                project_details = self.db_project.find_one({'slug': project_slug})
                event_data = {
                    "action": "position creation",
                    "userId": user_details['linkedin_id'],
                    "companyId": user_details['linkedin_company_id'],
                    "slug": position_details['slug'],
                    "projectslug": position_details['project'],
                    "skills": [],
                    "addlSkills": [],
                    "userCompany": company_details['name'],
                    "forCompanyId": project_details['companyId'],
                    "forCompanyName": project_details['company'],
                    "title": position_details['title'],
                    "projectName": project_details['name']
                }
                for skill in position_details['skills']:
                    if skill['skill'] not in event_data['skills']:
                        event_data['skills'].append(skill['skill'])
                for addlskill in position_details['addlSkills']:
                    if addlskill not in event_data['addlSkills']:
                        event_data['addlSkills'].append(addlskill)
                recordEvent.delay('siteActions', event_data)
            except:
                rollbar.report_exc_info()

    def event_record_resumesearch(self, position_slug, loggedin_id):
        resumesearch_details = self.db_searchlog.find_one({'slug': position_slug, 'loggedin_id': loggedin_id})
        if resumesearch_details:
            try:
                user_details = self.db_user.find_one({'linkedin_id': loggedin_id})
                company_details = self.db_linkedincompany.find_one({'id': user_details['linkedin_company_id']})
                position_details = self.db_position.find_one({'loggedin_id': loggedin_id, 'slug': position_slug})
                project_details = self.db_project.find_one({'slug': position_details['project']})
                event_data = {
                    "action": "resume search",
                    "userId": loggedin_id,
                    "companyId": user_details['linkedin_company_id'],
                    "positionslug": position_slug,
                    "projectslug": position_details['project'],
                    "userCompany": company_details['name'],
                    "forCompanyId": project_details['companyId'],
                    "forCompanyName": project_details['company'],
                    "title": position_details['title'],
                    "projectName": project_details['name'],
                    "results": resumesearch_details['results'],
                    "site": resumesearch_details['site']
                }
                recordEvent.delay('siteActions', event_data)
            except:
                rollbar.report_exc_info()

    def event_record_resumedownload(self, position_slug, loggedin_id, doc_id):
        download_details = self.db_positionexternalrel.find_one({'position_slug': position_slug, 'loggedin_id': loggedin_id, 'doc_id': doc_id})
        if download_details:
            try:
                user_details = self.db_user.find_one({'linkedin_id': loggedin_id})
                company_details = self.db_linkedincompany.find_one({'id': user_details['linkedin_company_id']})
                position_details = self.db_position.find_one({'loggedin_id': loggedin_id, 'slug': position_slug})
                project_details = self.db_project.find_one({'slug': position_details['project']})
                event_data = {
                    "action": "resume download",
                    "userId": loggedin_id,
                    "companyId": user_details['linkedin_company_id'],
                    "positionslug": position_slug,
                    "projectslug": position_details['project'],
                    "userCompany": company_details['name'],
                    "forCompanyId": project_details['companyId'],
                    "forCompanyName": project_details['company'],
                    "title": position_details['title'],
                    "projectName": project_details['name'],
                    "site": download_details['source'],
                    "resumeid": doc_id
                }
                recordEvent.delay('siteActions', event_data)
            except:
                rollbar.report_exc_info()
Example #49
0
from keen.client import KeenClient
keen = KeenClient(project_id="123", write_key="abc")


@app.before_request
def before_request():
    if "/static/" in request.path:
        return

    g.start_time = time.time()


@app.after_request
def send_to_keen(response):
    if request.path.startswith("/static"):
        return response

    keen.add_event(
        "request", {
            "keen": {
                "addons": [{
                    "name": "keen:ip_to_geo",
                    "input": {
                        "ip": "ip_address"
                    },
                    "output": "ip_geo_info"
                }, {
                    "name": "keen:url_parser",
                    "input": {
                        "url": "url"
                    },
Example #50
0
def get_keen_sonar(collection, timeframe, filters = [], timezone="US/Pacific"):
    client = KeenClient(
        project_id=conf['keen_project_id'], read_key=conf['keen_read_key'])

    return client.extraction(
        collection, timeframe=timeframe, filters=filters, timezone=timezone)
Example #51
0
from sseclient import SSEClient
from keen.client import KeenClient
import json

client = KeenClient(
    project_id="50ba759d897a2c45c2000000",
    write_key="72a1ad85456fd2361cfe8b65d240eab16b083caa944c11d9507761e536d34822eca4cefad12e482373ee41278953f98c6ff724b33b56fd5971e8d34cdd284cb6c3f202d9f13329e39c01eb9a35d1124cae81d9a4505992fce03be4030e32b19c72df266c55a18937f001e7158f6eac44",
    read_key="f7a829ecc9e237949b0b97245c828661ff0c9f46eaec35a7dc4cfd3b4ef42804f5fc1859ecad05bd7d72b6c3a2e4047ae39cba86b5d51c770be26b0a406cbb44650d20fd05fb7896293f015cec3af3ca2df8a507927bf4cfed9275eb89e8dee855cf45db75b221074bda2f737d2810f2"
)

headers = {"Accept": "text/event-stream"}

messages = SSEClient('https://flickering-fire-322.firebaseio.com/.json', headers=headers)

first = True

for msg in messages:
    print msg.event
    print msg.data
    if not first and 'put' in msg.event:
        data = json.loads(msg.data)
        path = data['path'].split("/")
        device = path[1]
        timestamp = path[2]
        data = int(data['data'])
        event = {
            "device": device,
            "volume": data,
            "timestamp": timestamp
        }
        client.add_event("flow", event)
Example #52
0
 def test_direct_persistence_strategy(self):
     project_id = "5004ded1163d66114f000000"
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     write_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["write"]})
     client = KeenClient(project_id, write_key=write_key)
     client.add_event("python_test", {"hello": "goodbye"})
 def positive_helper(project_id, **kwargs):
     client = KeenClient(project_id, **kwargs)
     self.assert_not_equal(client, None)
     self.assert_equal(project_id, client.project_id)
     return client
Example #54
0
from sseclient import SSEClient
from keen.client import KeenClient
import json

client = KeenClient(
    project_id="50ba759d897a2c45c2000000",
    write_key=
    "72a1ad85456fd2361cfe8b65d240eab16b083caa944c11d9507761e536d34822eca4cefad12e482373ee41278953f98c6ff724b33b56fd5971e8d34cdd284cb6c3f202d9f13329e39c01eb9a35d1124cae81d9a4505992fce03be4030e32b19c72df266c55a18937f001e7158f6eac44",
    read_key=
    "f7a829ecc9e237949b0b97245c828661ff0c9f46eaec35a7dc4cfd3b4ef42804f5fc1859ecad05bd7d72b6c3a2e4047ae39cba86b5d51c770be26b0a406cbb44650d20fd05fb7896293f015cec3af3ca2df8a507927bf4cfed9275eb89e8dee855cf45db75b221074bda2f737d2810f2"
)

headers = {"Accept": "text/event-stream"}

messages = SSEClient('https://flickering-fire-322.firebaseio.com/.json',
                     headers=headers)

first = True

for msg in messages:
    print msg.event
    print msg.data
    if not first and 'put' in msg.event:
        data = json.loads(msg.data)
        path = data['path'].split("/")
        device = path[1]
        timestamp = path[2]
        data = int(data['data'])
        event = {"device": device, "volume": data, "timestamp": timestamp}
        client.add_event("flow", event)
    first = False
 def test_timeout_count(self):
     keen.project_id = "5004ded1163d66114f000000"
     api_key = "2e79c6ec1d0145be8891bf668599c79a"
     keen.read_key = scoped_keys.encrypt(api_key, {"allowed_operations": ["read"]})
     client = KeenClient(keen.project_id, write_key=None, read_key=keen.read_key, get_timeout=0.0001)
     resp = client.count("query test", timeframe="today", filters=self.get_filter())