-
Notifications
You must be signed in to change notification settings - Fork 50
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #63 from xingetouzi/develop
Develop
- Loading branch information
Showing
23 changed files
with
1,695 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
# encoding: UTF-8 | ||
|
||
__version__ = '1.1.17' | ||
__version__ = '1.1.18' | ||
__author__ = 'Xingetouzi' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
vnpy/trader/app/ctaStrategy/plugins/ctaMetric/observers/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from .log import LogFileMetricObserver | ||
from .sqlite import SqliteMetricObserver | ||
from .utils import run_observer as run_observer_cls | ||
|
||
def run_observer(path, url=None, cls=None): | ||
cls = cls or SqliteMetricObserver | ||
run_observer_cls(cls, path, url) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 120 additions & 0 deletions
120
vnpy/trader/app/ctaStrategy/plugins/ctaMetric/observers/sqlite.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
import json | ||
import os | ||
import time | ||
import re | ||
import logging | ||
|
||
import requests | ||
from watchdog.observers import Observer | ||
from watchdog.events import RegexMatchingEventHandler | ||
from sqlalchemy import create_engine | ||
from sqlalchemy.orm import sessionmaker | ||
|
||
from vnpy.trader.app.ctaStrategy.plugins.ctaMetric.base import NumpyEncoder | ||
from vnpy.trader.app.ctaStrategy.plugins.ctaMetric.senders.sqlite import OpenFalconMetric as OpenFalconMetricModel | ||
from vnpy.trader.app.ctaStrategy.plugins.ctaMetric.base import OpenFalconMetric | ||
|
||
class HandleMetric(object): | ||
def __init__(self, filepath): | ||
self.filepath = filepath | ||
self._init() | ||
|
||
def _init(self): | ||
engine = create_engine('sqlite:///%s' % self.filepath) | ||
self.engine = engine | ||
Session = sessionmaker() | ||
Session.configure(bind=engine) | ||
self.session = Session() | ||
|
||
def has_table(self): | ||
return self.engine.dialect.has_table(self.engine, OpenFalconMetricModel.__tablename__) | ||
|
||
def get_metrics(self): | ||
if self.has_table(): | ||
metrics = self.session.query(OpenFalconMetricModel).all() | ||
metrics = [OpenFalconMetric.from_dict(metric.__dict__) for metric in metrics] | ||
return metrics | ||
else: | ||
return [] | ||
|
||
|
||
class FileEventHandler(RegexMatchingEventHandler): | ||
def __init__(self, root, reg): | ||
RegexMatchingEventHandler.__init__(self, regexes=[reg]) | ||
self.handlers = {} | ||
self.df_total = None # 所有文件的最后记录的总数据 | ||
self._root = root | ||
self._reg = reg | ||
self._init() | ||
|
||
def _init(self): | ||
for dirpath, _, filenames in os.walk(self._root): | ||
for file in filenames: | ||
if re.match(self._reg, file): | ||
path = os.path.join(dirpath, file) | ||
self.handle_file(path) | ||
|
||
def get_metrics(self): | ||
metrics = {} | ||
for handler in self.handlers.values(): | ||
try: | ||
for metric in handler.get_metrics(): | ||
key = (metric.endpoint, metric.metric) | ||
if key in metrics: | ||
old = metrics[key] | ||
if old.timestamp > metric.timestamp: | ||
continue | ||
metrics[key] = metric | ||
except Exception as e: | ||
logging.exception(e) | ||
continue | ||
return list(metrics.values()) | ||
|
||
def handle_file(self, path): | ||
if path not in self.handlers: | ||
logging.info("开始处理Metric文件: %s" % path) | ||
self.handlers[path] = HandleMetric(path) | ||
|
||
def on_created(self, event): | ||
self.handle_file(event.src_path) | ||
|
||
def on_modified(self, event): | ||
pass | ||
|
||
|
||
class SqliteMetricObserver(object): | ||
interval = 10 | ||
reg = r"ctaMetric.sqlite" # 监控的文件 | ||
|
||
def __init__(self, root=".", url=None): | ||
self._root = os.path.abspath(root) | ||
self._observer = Observer() | ||
self._handler = FileEventHandler(self._root, self.reg) | ||
self._observer.schedule(self._handler, self._root, True) | ||
self._url = url or os.environ.get("OPEN_FALCON_URL", "http://localhost:1988/v1/push") | ||
|
||
def run(self): | ||
self._observer.start() | ||
try: | ||
while True: | ||
time.sleep(self.interval) | ||
self.push_metrics(self._handler.get_metrics()) # 每5秒push一次 | ||
except KeyboardInterrupt: | ||
self._observer.stop() | ||
except Exception as e: | ||
logging.exception(e) | ||
self._observer.join() | ||
|
||
def dump_metrics(self, metrics): | ||
payload = [metric.__dict__ for metric in metrics] | ||
return json.dumps(payload, cls=NumpyEncoder) | ||
|
||
def push_metrics(self, metrics): | ||
r = requests.post(self._url, data=self.dump_metrics(metrics)) | ||
logging.info("推送%s个指标,response:%s" % (len(metrics), r.content)) | ||
|
||
|
||
if __name__ == "__main__": | ||
from utils import run_observer | ||
|
||
run_observer(SqliteMetricObserver, ".") |
6 changes: 6 additions & 0 deletions
6
vnpy/trader/app/ctaStrategy/plugins/ctaMetric/observers/utils.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
|
||
import logging | ||
|
||
def run_observer(cls, path, url=None): | ||
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)-8s %(message)s") | ||
cls(path, url).run() |
5 changes: 5 additions & 0 deletions
5
vnpy/trader/app/ctaStrategy/plugins/ctaMetric/senders/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
from .log import LogfileMetricSender | ||
from .sqlite import SqliteMetricSender | ||
from ..base import set_sender | ||
|
||
set_sender(SqliteMetricSender) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.