Skip to content

Commit 145e059

Browse files
Merge pull request #37 from singnet/development
metering changes to capture more metrics
2 parents 171fdc6 + 4959198 commit 145e059

18 files changed

+438
-39
lines changed

.circleci/config.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
version: 2
3+
jobs:
4+
build:
5+
docker:
6+
- image: circleci/python:3.6.6-node
7+
- image: circleci/mysql:8.0.16
8+
environment:
9+
MYSQL_ROOT_PASSWORD: rootpw
10+
MYSQL_DATABASE: test_db
11+
MYSQL_USER: user
12+
MYSQL_PASSWORD: passw0rd
13+
working_directory: ~/singnet
14+
environment:
15+
PYTHONPATH: ~/singnet/snet-platform-usage/metering
16+
steps:
17+
- checkout
18+
- run:
19+
# Our primary container isn't MYSQL so run a sleep command until it's ready.
20+
name: Waiting for MySQL to be ready
21+
command: |
22+
for i in `seq 1 30`;
23+
do
24+
nc -z 127.0.0.1 3306 && echo Success && exit 0
25+
echo -n .
26+
sleep 1
27+
done
28+
echo Failed waiting for MySQL && exit 1
29+
- run:
30+
name: Initialise tables.
31+
command: |
32+
cd metering
33+
cp tests/alembic.ini .
34+
cp tests/test-settings.py settings.py
35+
sudo pip install alembic
36+
sudo pip install pymysql
37+
sudo pip install cryptography
38+
PYTHONPATH=$PWD
39+
alembic upgrade head
40+
- run:
41+
name: Install dependencies & compile
42+
command: |
43+
cd metering
44+
python -m compileall *.py
45+
python -m compileall */*.py
46+
sudo pip install -r requirements.txt
47+
- run:
48+
name: run tests for metering
49+
command: |
50+
cd metering
51+
PYTHONPATH=$PWD python tests/test_total_calls.py
52+
- store_artifacts:
53+
path: test-reports
54+
destination: test-reports

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
# snet-monitoring
1+
# Snet-Platform-Usage
2+
[![CircleCI](https://circleci.com/gh/singnet/snet-platform-usage.svg?style=svg)](https://circleci.com/gh/singnet/snet-platform-usage)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""usage table update
2+
3+
Revision ID: 66d97ed3bdc5
4+
Revises: 9ecbd29ee907
5+
Create Date: 2019-08-20 16:00:09.306326
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
# revision identifiers, used by Alembic.
12+
revision = '66d97ed3bdc5'
13+
down_revision = '9ecbd29ee907'
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
# ### commands auto generated by Alembic - please adjust! ###
20+
op.add_column('usage_table', sa.Column('channel_id', sa.VARCHAR(length=225), nullable=True))
21+
op.add_column('usage_table', sa.Column('client_type', sa.VARCHAR(length=225), nullable=True))
22+
op.add_column('usage_table', sa.Column('error_message', sa.VARCHAR(length=225), nullable=True))
23+
op.add_column('usage_table', sa.Column('ethereum_json_rpc_endpoint', sa.VARCHAR(length=225), nullable=True))
24+
op.add_column('usage_table', sa.Column('group_id', sa.VARCHAR(length=225), nullable=True))
25+
op.add_column('usage_table', sa.Column('operation', sa.VARCHAR(length=225), nullable=True))
26+
op.add_column('usage_table', sa.Column('org_id', sa.VARCHAR(length=225), nullable=True))
27+
op.add_column('usage_table', sa.Column('registry_address_key', sa.VARCHAR(length=225), nullable=True))
28+
op.add_column('usage_table', sa.Column('request_id', sa.VARCHAR(length=225), nullable=True))
29+
op.add_column('usage_table', sa.Column('resource', sa.VARCHAR(length=225), nullable=True))
30+
op.add_column('usage_table', sa.Column('response_code', sa.VARCHAR(length=225), nullable=True))
31+
op.add_column('usage_table', sa.Column('response_time', sa.FLOAT(), nullable=True))
32+
op.add_column('usage_table', sa.Column('user_address', sa.VARCHAR(length=225), nullable=True))
33+
op.add_column('usage_table', sa.Column('user_details', sa.VARCHAR(length=225), nullable=True))
34+
op.add_column('usage_table', sa.Column('username', sa.VARCHAR(length=225), nullable=True))
35+
op.add_column('usage_table', sa.Column('version', sa.VARCHAR(length=225), nullable=True))
36+
# ### end Alembic commands ###
37+
38+
39+
def downgrade():
40+
# ### commands auto generated by Alembic - please adjust! ###
41+
op.drop_column('usage_table', 'version')
42+
op.drop_column('usage_table', 'username')
43+
op.drop_column('usage_table', 'user_details')
44+
op.drop_column('usage_table', 'user_address')
45+
op.drop_column('usage_table', 'response_time')
46+
op.drop_column('usage_table', 'response_code')
47+
op.drop_column('usage_table', 'resource')
48+
op.drop_column('usage_table', 'request_id')
49+
op.drop_column('usage_table', 'registry_address_key')
50+
op.drop_column('usage_table', 'org_id')
51+
op.drop_column('usage_table', 'operation')
52+
op.drop_column('usage_table', 'group_id')
53+
op.drop_column('usage_table', 'ethereum_json_rpc_endpoint')
54+
op.drop_column('usage_table', 'error_message')
55+
op.drop_column('usage_table', 'client_type')
56+
op.drop_column('usage_table', 'channel_id')
57+
# ### end Alembic commands ###
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""user address added
2+
3+
Revision ID: b0f9443a30de
4+
Revises: 66d97ed3bdc5
5+
Create Date: 2019-08-23 18:32:06.447515
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from sqlalchemy.dialects import mysql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = 'b0f9443a30de'
14+
down_revision = '66d97ed3bdc5'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('usage_table', sa.Column('payment_mode', sa.VARCHAR(length=225), nullable=True))
22+
op.add_column('usage_table', sa.Column('service_id', sa.VARCHAR(length=225), nullable=True))
23+
op.add_column('user_org_group', sa.Column('user_address', sa.VARCHAR(length=225), nullable=True))
24+
op.alter_column('user_org_group', 'user_name',
25+
existing_type=mysql.VARCHAR(length=225),
26+
nullable=True)
27+
# ### end Alembic commands ###
28+
29+
30+
def downgrade():
31+
# ### commands auto generated by Alembic - please adjust! ###
32+
op.alter_column('user_org_group', 'user_name',
33+
existing_type=mysql.VARCHAR(length=225),
34+
nullable=False)
35+
op.drop_column('user_org_group', 'user_address')
36+
op.drop_column('usage_table', 'service_id')
37+
op.drop_column('usage_table', 'payment_mode')
38+
# ### end Alembic commands ###

metering/alembic/versions/eeec29a1af7b_added_tables.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def upgrade():
2727
sa.Column('free_calls', sa.Integer(), nullable=False),
2828
sa.Column('effective_start_date', sa.TIMESTAMP(
2929
timezone=True), nullable=True),
30-
sa.Column('effective_end_date', sa.TIMESTAMP(timezone=True),
31-
server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
30+
sa.Column('effective_end_date', sa.TIMESTAMP(
31+
timezone=True), nullable=True),
3232
sa.Column('created_at', sa.TIMESTAMP(
3333
timezone=True), nullable=True),
3434
sa.PrimaryKeyConstraint('id')

metering/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class StatusCode:
1010
"Access-Control-Allow-Origin": "*",
1111
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
1212
}
13+
PAYMENT_MODE_FREE_CALL = 'freecall'
1314

1415

1516
class StatusMessage:

metering/handlers/freecall_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
setup_logger()
1212
logger = logging.getLogger(__name__)
1313

14-
required_keys = ['username', 'organization_id', 'service_id']
14+
required_keys = ['organization_id', 'service_id']
1515

1616

1717
def main(event, context):
@@ -37,7 +37,7 @@ def main(event, context):
3737
)
3838

3939
else:
40-
logger.error('Request validation failed')
40+
logger.error(f"Request validation failed for {event['queryStringParameters']}")
4141
return_value = make_response(
4242
status_code=StatusCode.BAD_PARAMETERS_CODE,
4343
header=HEADER_POST_RESPONSE,

metering/handlers/usage_handler.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,31 @@
1515
'service_method', 'group_id', 'status', 'start_time', 'end_time']
1616

1717

18+
def add_verify_fields(usage_detail_dict):
19+
new_requred_keys = {
20+
'usage_type', 'status', 'usage_value', 'start_time', 'end_time',
21+
'created_at', 'payment_mode', 'group_id', 'registry_address_key',
22+
'ethereum_json_rpc_endpoint', 'response_time', 'response_code', 'error_message',
23+
'version', 'client_type', 'user_details', 'channel_id', 'operation', 'user_address',
24+
'username', 'org_id', 'service_id', 'resource', 'request_id'
25+
}
26+
for key in new_requred_keys:
27+
if key not in usage_detail_dict:
28+
usage_detail_dict[key] = None
29+
30+
if usage_detail_dict['username'] is not None and usage_detail_dict['user_address'] is None:
31+
usage_detail_dict['payment_mode'] = 'freecall'
32+
else:
33+
usage_detail_dict['payment_mode'] = 'paid'
34+
return usage_detail_dict
35+
36+
1837
def main(event, context):
1938
usage_detail_dict = json.loads(event['body'])
2039

2140
try:
2241
if validate_request(required_keys, usage_detail_dict):
42+
usage_detail_dict = add_verify_fields(usage_detail_dict)
2343
usage_service.save_usage_details(usage_detail_dict)
2444
response = make_response(
2545
StatusCode.SUCCESS_GET_CODE,

metering/models.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, TIMESTAMP, func
1+
from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, TIMESTAMP, func, FLOAT, String
22

33
from sqlalchemy.ext.declarative import declarative_base
44
from sqlalchemy.orm import relationship
@@ -24,7 +24,8 @@ class UserOrgGroupModel(Base):
2424
id = Column('id', Integer, primary_key=True)
2525
payment_group_id = Column('group', VARCHAR(225))
2626
org_id = Column('org_id', VARCHAR(225), nullable=False)
27-
user_name = Column('user_name', VARCHAR(225), nullable=False)
27+
user_name = Column('user_name', VARCHAR(225))
28+
user_address = Column('user_address', VARCHAR(225))
2829
created_at = Column('created_at', TIMESTAMP(
2930
timezone=True), nullable=False, server_default=func.current_timestamp())
3031
service_id = Column('service_id', VARCHAR(225), nullable=False)
@@ -43,3 +44,21 @@ class UsageModel(Base):
4344
end_time = Column('end_time', TIMESTAMP(timezone=True))
4445
created_at = Column('created_at', TIMESTAMP(
4546
timezone=True), nullable=False, server_default=func.current_timestamp())
47+
payment_mode = Column('payment_mode', VARCHAR(225))
48+
group_id = Column('group_id', VARCHAR(225))
49+
registry_address_key = Column('registry_address_key', VARCHAR(225))
50+
ethereum_json_rpc_endpoint = Column('ethereum_json_rpc_endpoint', VARCHAR(225))
51+
response_time = Column('response_time', FLOAT)
52+
response_code = Column('response_code', VARCHAR(225))
53+
error_message = Column('error_message', VARCHAR(225))
54+
version = Column('version', VARCHAR(225))
55+
client_type = Column('client_type', VARCHAR(225))
56+
user_details = Column('user_details', VARCHAR(225))
57+
channel_id = Column('channel_id', VARCHAR(225))
58+
operation = Column('operation', VARCHAR(225))
59+
user_address = Column('user_address', VARCHAR(225))
60+
user_name = Column('username', VARCHAR(225))
61+
org_id = Column('org_id', VARCHAR(225))
62+
service_id = Column('service_id', VARCHAR(225))
63+
resource = Column('resource', VARCHAR(225))
64+
request_id = Column('request_id', VARCHAR(225))

metering/repository/user_org_group_repository.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33

44

55
class UserOrgGroupRepository(BaseRepository):
6-
def get_user_org_group_data(self, payment_group_id, org_id, user_name, service_id, resource):
6+
7+
def get_user_org_group_id_by_username(self, username, org_id, service_id, resource):
78
session = self.get_default_session()
8-
user_org_query = session.query(UserOrgGroupModel) \
9-
.filter(UserOrgGroupModel.resource == resource) \
9+
user_org_query = session.query(UserOrgGroupModel).filter(UserOrgGroupModel.user_name == username) \
1010
.filter(UserOrgGroupModel.service_id == service_id) \
11-
.filter(UserOrgGroupModel.user_name == user_name) \
11+
.filter(UserOrgGroupModel.resource == resource) \
1212
.filter(UserOrgGroupModel.org_id == org_id)
1313

14-
if payment_group_id is not None:
15-
user_org_query = user_org_query.filter(
16-
UserOrgGroupModel.payment_group_id == payment_group_id)
14+
user_org_group_data = user_org_query.first()
15+
session.commit()
16+
session.flush()
17+
return user_org_group_data
1718

19+
def get_user_org_group_id_by_user_address(self, user_address, org_id, service_id, resource, payment_group_id):
20+
session = self.get_default_session()
21+
user_org_query = session.query(UserOrgGroupModel).filter(UserOrgGroupModel.user_address == user_address) \
22+
.filter(UserOrgGroupModel.service_id == service_id) \
23+
.filter(UserOrgGroupModel.resource == resource) \
24+
.filter(UserOrgGroupModel.org_id == org_id) \
25+
.filter(UserOrgGroupModel.payment_group_id == payment_group_id)
1826
user_org_group_data = user_org_query.first()
1927
session.commit()
2028
session.flush()

0 commit comments

Comments
 (0)