Add debug output table

This commit is contained in:
nolash 2021-03-04 09:05:05 +01:00
parent 951ba52de4
commit 195b1e3c9b
Signed by untrusted user who does not match committer: lash
GPG Key ID: 21D2E7BB88C2A746
15 changed files with 184 additions and 29 deletions

View File

@ -1,12 +1,25 @@
# standard imports
import datetime import datetime
# external imports
import celery import celery
# local imports
from cic_eth.db.models.debug import Debug
from cic_eth.db.models.base import SessionBase
from cic_eth.task import CriticalSQLAlchemyTask
celery_app = celery.current_app celery_app = celery.current_app
@celery_app.task() @celery_app.task(base=CriticalSQLAlchemyTask)
def out_tmp(tag, txt): def alert(chained_input, tag, txt):
f = open('/tmp/err.{}.txt'.format(tag), "w") session = SessionBase.create_session()
f.write(txt)
f.close() o = Debug(tag, txt)
session.add(o)
session.commit()
session.close()
return chained_input

View File

@ -0,0 +1,32 @@
"""debug output
Revision ID: f738d9962fdf
Revises: ec40ac0974c1
Create Date: 2021-03-04 08:32:43.281214
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f738d9962fdf'
down_revision = 'ec40ac0974c1'
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'debug',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('tag', sa.String, nullable=False),
sa.Column('description', sa.String, nullable=False),
sa.Column('date_created', sa.DateTime, nullable=False),
)
pass
def downgrade():
op.drop_table('debug')
pass

View File

@ -0,0 +1,32 @@
"""debug output
Revision ID: f738d9962fdf
Revises: ec40ac0974c1
Create Date: 2021-03-04 08:32:43.281214
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f738d9962fdf'
down_revision = 'ec40ac0974c1'
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'debug',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('tag', sa.String, nullable=False),
sa.Column('description', sa.String, nullable=False),
sa.Column('date_created', sa.DateTime, nullable=False),
)
pass
def downgrade():
op.drop_table('debug')
pass

View File

@ -0,0 +1,23 @@
# standard imports
import datetime
import logging
# external imports
from sqlalchemy import Column, String, DateTime
# local imports
from .base import SessionBase
class Debug(SessionBase):
__tablename__ = 'debug'
date_created = Column(DateTime, default=datetime.datetime.utcnow)
tag = Column(String)
description = Column(String)
def __init__(self, tag, description):
self.tag = tag
self.description = description

View File

@ -2,7 +2,7 @@
import datetime import datetime
import logging import logging
# third-party imports # external imports
from sqlalchemy import Column, Enum, String, Integer, DateTime, Text, or_, ForeignKey from sqlalchemy import Column, Enum, String, Integer, DateTime, Text, or_, ForeignKey
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method

View File

@ -69,7 +69,6 @@ def check_gas(self, tx_hashes, chain_str, txs=[], address=None, gas_required=Non
for i in range(len(tx_hashes)): for i in range(len(tx_hashes)):
o = get_tx(tx_hashes[i]) o = get_tx(tx_hashes[i])
txs.append(o['signed_tx']) txs.append(o['signed_tx'])
logg.debug('ooooo {}'.format(o))
if address == None: if address == None:
address = o['address'] address = o['address']
@ -178,12 +177,7 @@ class ParityNodeHandler:
def handle(self, exception, tx_hash_hex, tx_hex): def handle(self, exception, tx_hash_hex, tx_hex):
meth = self.handle_default meth = self.handle_default
if isinstance(exception, (ValueError)): if isinstance(exception, (ValueError)):
# s_debug = celery.signature(
# 'cic_eth.admin.debug.out_tmp',
# [tx_hash_hex, '{}: {}'.format(tx_hash_hex, exception)],
# queue=queue,
# )
# s_debug.apply_async()
earg = exception.args[0] earg = exception.args[0]
if earg['code'] == -32010: if earg['code'] == -32010:
logg.debug('skipping lock for code {}'.format(earg['code'])) logg.debug('skipping lock for code {}'.format(earg['code']))
@ -191,14 +185,15 @@ class ParityNodeHandler:
elif earg['code'] == -32602: elif earg['code'] == -32602:
meth = self.handle_invalid_encoding meth = self.handle_invalid_encoding
else: else:
# TODO: move to status log db comment field
meth = self.handle_invalid meth = self.handle_invalid
elif isinstance(exception, (requests.exceptions.ConnectionError)): elif isinstance(exception, (requests.exceptions.ConnectionError)):
meth = self.handle_connection meth = self.handle_connection
(t, e_fn, message) = meth(tx_hash_hex, tx_hex) (t, e_fn, message) = meth(tx_hash_hex, tx_hex, str(exception))
return (t, e_fn, '{} {}'.format(message, exception)) return (t, e_fn, '{} {}'.format(message, exception))
def handle_connection(self, tx_hash_hex, tx_hex): def handle_connection(self, tx_hash_hex, tx_hex, debugstr=None):
s_set_sent = celery.signature( s_set_sent = celery.signature(
'cic_eth.queue.tx.set_sent_status', 'cic_eth.queue.tx.set_sent_status',
[ [
@ -211,7 +206,7 @@ class ParityNodeHandler:
return (t, TemporaryTxError, 'Sendfail {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id()))) return (t, TemporaryTxError, 'Sendfail {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id())))
def handle_invalid_encoding(self, tx_hash_hex, tx_hex): def handle_invalid_encoding(self, tx_hash_hex, tx_hex, debugstr=None):
tx_bytes = bytes.fromhex(tx_hex[2:]) tx_bytes = bytes.fromhex(tx_hex[2:])
tx = unpack_signed_raw_tx(tx_bytes, self.chain_spec.chain_id()) tx = unpack_signed_raw_tx(tx_bytes, self.chain_spec.chain_id())
s_lock = celery.signature( s_lock = celery.signature(
@ -258,7 +253,7 @@ class ParityNodeHandler:
return (t, PermanentTxError, 'Reject invalid encoding {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id()))) return (t, PermanentTxError, 'Reject invalid encoding {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id())))
def handle_invalid_parameters(self, tx_hash_hex, tx_hex): def handle_invalid_parameters(self, tx_hash_hex, tx_hex, debugstr=None):
s_sync = celery.signature( s_sync = celery.signature(
'cic_eth.eth.tx.sync_tx', 'cic_eth.eth.tx.sync_tx',
[ [
@ -271,7 +266,7 @@ class ParityNodeHandler:
return (t, PermanentTxError, 'Reject invalid parameters {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id()))) return (t, PermanentTxError, 'Reject invalid parameters {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id())))
def handle_invalid(self, tx_hash_hex, tx_hex): def handle_invalid(self, tx_hash_hex, tx_hex, debugstr=None):
tx_bytes = bytes.fromhex(tx_hex[2:]) tx_bytes = bytes.fromhex(tx_hex[2:])
tx = unpack_signed_raw_tx(tx_bytes, self.chain_spec.chain_id()) tx = unpack_signed_raw_tx(tx_bytes, self.chain_spec.chain_id())
s_lock = celery.signature( s_lock = celery.signature(
@ -289,6 +284,16 @@ class ParityNodeHandler:
[], [],
queue=self.queue, queue=self.queue,
) )
s_debug = celery.signature(
'cic_eth.admin.debug.alert',
[
tx_hash_hex,
tx_hash_hex,
debugstr,
],
queue=queue,
)
s_set_reject.link(s_debug)
s_lock.link(s_set_reject) s_lock.link(s_set_reject)
t = s_lock.apply_async() t = s_lock.apply_async()
return (t, PermanentTxError, 'Reject invalid {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id()))) return (t, PermanentTxError, 'Reject invalid {}'.format(tx_hex_string(tx_hex, self.chain_spec.chain_id())))

View File

@ -30,6 +30,7 @@ from cic_eth.task import CriticalSQLAlchemyTask
from cic_eth.eth.util import unpack_signed_raw_tx # TODO: should not be in same sub-path as package that imports queue.tx from cic_eth.eth.util import unpack_signed_raw_tx # TODO: should not be in same sub-path as package that imports queue.tx
from cic_eth.error import NotLocalTxError from cic_eth.error import NotLocalTxError
from cic_eth.error import LockedError from cic_eth.error import LockedError
from cic_eth.db.enum import status_str
celery_app = celery.current_app celery_app = celery.current_app
#logg = celery_app.log.get_default_logger() #logg = celery_app.log.get_default_logger()
@ -405,7 +406,7 @@ def get_tx_cache(tx_hash):
'tx_hash': otx.tx_hash, 'tx_hash': otx.tx_hash,
'signed_tx': otx.signed_tx, 'signed_tx': otx.signed_tx,
'nonce': otx.nonce, 'nonce': otx.nonce,
'status': StatusEnum(otx.status).name, 'status': status_str(otx.status),
'status_code': otx.status, 'status_code': otx.status,
'source_token': txc.source_token_address, 'source_token': txc.source_token_address,
'destination_token': txc.destination_token_address, 'destination_token': txc.destination_token_address,

View File

@ -23,8 +23,11 @@ from hexathon import add_0x
# local imports # local imports
from cic_eth.api import AdminApi from cic_eth.api import AdminApi
from cic_eth.eth.rpc import RpcClient from cic_eth.eth.rpc import RpcClient
from cic_eth.db.enum import StatusEnum from cic_eth.db.enum import (
from cic_eth.db.enum import LockEnum StatusEnum,
status_str,
LockEnum,
)
logging.basicConfig(level=logging.WARNING) logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger() logg = logging.getLogger()
@ -119,7 +122,7 @@ def render_tx(o, **kwargs):
for v in o.get('status_log', []): for v in o.get('status_log', []):
d = datetime.datetime.fromisoformat(v[0]) d = datetime.datetime.fromisoformat(v[0])
e = StatusEnum(v[1]).name e = status_str(v[1])
content += '{}: {}\n'.format(d, e) content += '{}: {}\n'.format(d, e)
return content return content

View File

@ -1,7 +1,7 @@
cic-base~=0.1.1a10 cic-base~=0.1.1a10
web3==5.12.2 web3==5.12.2
celery==4.4.7 celery==4.4.7
crypto-dev-signer~=0.4.13rc3 crypto-dev-signer~=0.4.13rc4
confini~=0.3.6rc3 confini~=0.3.6rc3
cic-registry~=0.5.3a22 cic-registry~=0.5.3a22
cic-bancor~=0.0.6 cic-bancor~=0.0.6

View File

@ -19,6 +19,7 @@ def celery_includes():
'cic_eth.queue.balance', 'cic_eth.queue.balance',
'cic_eth.admin.ctrl', 'cic_eth.admin.ctrl',
'cic_eth.admin.nonce', 'cic_eth.admin.nonce',
'cic_eth.admin.debug',
'cic_eth.eth.account', 'cic_eth.eth.account',
'cic_eth.callbacks.noop', 'cic_eth.callbacks.noop',
'cic_eth.callbacks.http', 'cic_eth.callbacks.http',

View File

@ -0,0 +1,29 @@
# external imports
import celery
# local imports
from cic_eth.db.models.debug import Debug
def test_debug_alert(
init_database,
celery_session_worker,
):
s = celery.signature(
'cic_eth.admin.debug.alert',
[
'foo',
'bar',
'baz',
],
queue=None,
)
t = s.apply_async()
r = t.get()
assert r == 'foo'
q = init_database.query(Debug)
q = q.filter(Debug.tag=='bar')
o = q.first()
assert o.description == 'baz'

View File

@ -0,0 +1,16 @@
# local imports
from cic_eth.db.models.debug import Debug
def test_debug(
init_database,
):
o = Debug('foo', 'bar')
init_database.add(o)
init_database.commit()
q = init_database.query(Debug)
q = q.filter(Debug.tag=='foo')
o = q.first()
assert o.description == 'bar'

View File

@ -1,3 +1,3 @@
cic-base[full_graph]==0.1.1a10 cic-base[full_graph]==0.1.1a12
cic-eth==0.10.0a36 cic-eth==0.10.0a37
cic-types==0.1.0a8 cic-types==0.1.0a8

View File

@ -3,7 +3,7 @@ alembic==1.4.2
bcrypt==3.2.0 bcrypt==3.2.0
celery==4.4.7 celery==4.4.7
confini==0.3.6rc3 confini==0.3.6rc3
crypto-dev-signer==0.4.13rc3 crypto-dev-signer==0.4.13rc4
cryptography==3.2.1 cryptography==3.2.1
ecuth==0.4.5a1 ecuth==0.4.5a1
eth-accounts-index==0.0.10a10 eth-accounts-index==0.0.10a10

View File

@ -192,7 +192,7 @@ services:
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
"/usr/local/bin/uwsgi" \ "/usr/local/bin/uwsgi" \
--wsgi-file /usr/src/cic-cache/cic_cache/runnable/server.py \ --wsgi-file /usr/src/cic-cache/cic_cache/runnable/server.py \
--http :80 \ --http :8000 \
--pyargv -vv --pyargv -vv
cic-eth-tasker: cic-eth-tasker:
@ -237,7 +237,7 @@ services:
- -c - -c
- | - |
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
./start_tasker.sh -q cic-eth -vv ./start_tasker.sh -q cic-eth -v
# command: [/bin/sh, "./start_tasker.sh", -q, cic-eth, -vv ] # command: [/bin/sh, "./start_tasker.sh", -q, cic-eth, -vv ]
cic-eth-tracker: cic-eth-tracker:
@ -274,7 +274,7 @@ services:
- -c - -c
- | - |
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
./start_tracker.sh -vv -c /usr/local/etc/cic-eth ./start_tracker.sh -v -c /usr/local/etc/cic-eth
# command: "/root/start_manager.sh head -vv" # command: "/root/start_manager.sh head -vv"