Implement tracking stats

This commit is contained in:
AnthorNet 2018-01-05 15:06:21 +01:00
parent 4fad830e59
commit 313120aa94
9 changed files with 95 additions and 22 deletions

View File

@ -43,6 +43,10 @@
<li><a href="#uploaders">Uploaders</a></li>
<li><a href="#schemas">Schemas</a></li>
</ul>
<p class="navbar-right navbar-text">
<em>Powered by <a href="https://www.edsm.net/" target="_blank" class="navbar-link"><strong>EDSM</strong></a></em>
</p>
</div>
</div>
@ -406,5 +410,15 @@
<script src="https://code.highcharts.com/5.0.12/highcharts.js"></script>
<script src="https://code.highcharts.com/5.0.12/modules/drilldown.js"></script>
<script src="./js/eddn.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-496332-23', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>

View File

@ -39,6 +39,10 @@
<ul class="nav navbar-nav">
<li><a href="./#schemas">Back to EDDN Status</a></li>
</ul>
<p class="navbar-right navbar-text">
<em>Powered by <a href="https://www.edsm.net/" target="_blank" class="navbar-link"><strong>EDSM</strong></a></em>
</p>
</div>
</div>
@ -279,5 +283,15 @@
});
});
</script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-496332-23', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>

View File

@ -143,17 +143,10 @@ def parse_and_error_handle(data):
validationResults = validator.validate(parsed_message)
if validationResults.severity <= ValidationSeverity.WARN:
parsed_message['header']['gatewayTimestamp'] = datetime.utcnow().isoformat() + 'Z'
parsed_message['header']['gatewayTimestamp'] = datetime.utcnow().isoformat() + 'Z'
parsed_message['header']['uploaderIP'] = get_remote_address()
ip_hash_salt = Settings.GATEWAY_IP_KEY_SALT
if ip_hash_salt:
# If an IP hash is set, salt+hash the uploader's IP address and set
# it as the EDDN upload key value.
ip_hash = hashlib.sha1(ip_hash_salt + get_remote_address()).hexdigest()
parsed_message['header']['uploaderKey'] = ip_hash
# Sends the parsed MarketOrderList or MarketHistoryList to the Announcers
# as compressed JSON.
# Sends the parsed to the Relay/Monitor as compressed JSON.
gevent.spawn(push_message, parsed_message, parsed_message['$schemaRef'])
logger.info("Accepted %s upload from %s" % (
parsed_message, get_remote_address()

View File

@ -11,8 +11,10 @@ import sqlite3
import datetime
import collections
import zmq.green as zmq
from bottle import get, request, response, run as bottle_run
from eddn.conf.Settings import Settings, loadConfig
from eddn.core.Analytics import Analytics
from gevent import monkey
monkey.patch_all()
@ -186,6 +188,8 @@ class Monitor(Thread):
receiver = context.socket(zmq.SUB)
receiver.setsockopt(zmq.SUBSCRIBE, '')
analytics = Analytics()
for binding in Settings.MONITOR_RECEIVER_BINDINGS:
receiver.connect(binding)
@ -210,6 +214,7 @@ class Monitor(Thread):
c.execute('UPDATE schemas SET hits = hits + 1 WHERE `name` = ? AND `dateStats` = DATE("now", "utc")', (schemaID, ))
c.execute('INSERT OR IGNORE INTO schemas (name, dateStats) VALUES (?, DATE("now", "utc"))', (schemaID, ))
db.commit()
db.close()
return
@ -244,6 +249,12 @@ class Monitor(Thread):
db.commit()
db.close()
uploaderIP = None
if 'uploaderIP' in json['header']:
uploaderIP = json['header']['uploaderIP'].encode('utf8')
analytics.hit(schemaID, uploaderID, uploaderIP)
while True:
inboundMessage = receiver.recv()

View File

@ -85,20 +85,30 @@ class Relay(Thread):
else:
message = message[0]
message = zlib.decompress(message)
message = simplejson.loads(message)
# Handle duplicate message
if Settings.RELAY_DUPLICATE_MAX_MINUTES:
if duplicateMessages.isDuplicated(message):
# We've already seen this message recently. Discard it.
statsCollector.tally("duplicate")
return
if Settings.RELAY_DECOMPRESS_MESSAGES:
message = zlib.decompress(message)
# Remove IP to end consumer
if 'uploaderIP' in message['header']:
del json['header']['uploaderIP']
# Convert messgae back to JSON
message = simplejson.dumps(message, sort_keys=True)
# Recompress message when needed
if not Settings.RELAY_DECOMPRESS_MESSAGES:
message = zlib.compress(message)
sender.send(message)
statsCollector.tally("outbound")
logger.info("Relay is now listening for order data.")
while True:
# For each incoming message, spawn a greenlet using the relay_worker
# function.

View File

@ -46,8 +46,6 @@ class _Settings(object):
GATEWAY_SENDER_BINDINGS = ["tcp://*:8500"]
GATEWAY_IP_KEY_SALT = None
GATEWAY_JSON_SCHEMAS = {
"https://eddn.edcd.io/schemas/commodity/3" : "schemas/commodity-v3.0.json",
"https://eddn.edcd.io/schemas/commodity/3/test" : "schemas/commodity-v3.0.json",
@ -95,8 +93,11 @@ class _Settings(object):
]
MONITOR_DB = "/home/EDDN_Monitor.s3db"
MONITOR_DB = "D:/EDDN_Monitor.s3db" #DEBUG
MONITOR_DECOMPRESS_MESSAGES = True
MONITOR_UA = "UA-496332-23"

View File

@ -1,2 +1,2 @@
# This should be a version number as understood by setuptools
__version__ = "1.0.1"
__version__ = "1.1"

View File

@ -0,0 +1,33 @@
# coding: utf8
import requests
from hashlib import sha1
from random import randint
from traceback import print_exc
from eddn.conf.Settings import Settings
class Analytics(object):
mobileProperty = 'MO' + Settings.MONITOR_UA[2:]
utmUrl = 'http://www.google-analytics.com/__utm.gif'
def hit(self, schema, uploaderId, uploaderIp):
try:
if(uploaderId):
uploaderId = str(int("0x%s" % sha1(uploaderId).hexdigest(), 0))[:10]
else:
uploaderId = 'DUPLICATE'
payload = {}
payload['utmwv'] = "5.2.2d",
payload['utmn'] = str(randint(1, 9999999999)),
payload['utmp'] = schema,
payload['utmac'] = self.mobileProperty
payload['utmcc'] = "__utma=%s;" % ".".join(["1", uploaderId, "1", "1", "1", "1"])
payload['utmip'] = uploaderIp
r = requests.get(self.utmUrl, params=payload)
except:
print_exc()
return

View File

@ -33,9 +33,6 @@ class DuplicateMessages(Thread):
def isDuplicated(self, message):
with self.lock:
message = zlib.decompress(message)
message = simplejson.loads(message)
# Test messages are not duplicate
if re.search('test', message['$schemaRef'], re.I):
return False