Compare commits
No commits in common. "master" and "1.0.0-b36" have entirely different histories.
@ -4,7 +4,7 @@ RUN apk update && \
|
||||
apk add py-pip libc-dev gcc
|
||||
RUN python -m pip install --upgrade pip
|
||||
RUN pip install utils pycryptodome && \
|
||||
pip install python-dotenv coinbase flask schedule numpy stomp.py python-json-logger
|
||||
pip install python-dotenv coinbase flask schedule numpy stomp.py
|
||||
COPY . /home/price-collector/.
|
||||
EXPOSE 9090
|
||||
CMD ["python", "/home/price-collector/src/main.py"]
|
||||
@ -99,10 +99,10 @@ spec:
|
||||
imagePullPolicy: Always
|
||||
resources:
|
||||
requests:
|
||||
cpu: 25m
|
||||
cpu: 32m
|
||||
memory: 32Mi
|
||||
limits:
|
||||
cpu: 25m
|
||||
cpu: 75m
|
||||
memory: 64Mi
|
||||
securityContext:
|
||||
capabilities:
|
||||
|
||||
@ -28,7 +28,7 @@ try {
|
||||
timestamps {
|
||||
node ("${env.SLAVE_LABEL}") {
|
||||
stage('Initialise') {
|
||||
checkout([$class: 'GitSCM', branches: [[name: 'master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'Github', url: env.GIT_REPOSITORY_URL]]])
|
||||
checkout([$class: 'GitSCM', branches: [[name: 'master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'Github', url: 'https://github.com/andyjk15/price-collector.git']]])
|
||||
|
||||
env.APPLICATION_VERSION = get_application_version()
|
||||
|
||||
@ -45,7 +45,16 @@ try {
|
||||
}
|
||||
}
|
||||
|
||||
stage('Test Artifact') {
|
||||
try {
|
||||
// mvn 'verify -DskipUTs -DskipTests'
|
||||
} finally {
|
||||
// mvn 'test'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build Image') {
|
||||
// mvn 'clean package -DskipTests'
|
||||
|
||||
executeShellScript("configuration/scripts/mapVarsToConfigs.sh",
|
||||
env.DIGITAL_OCEAN,
|
||||
@ -69,6 +78,7 @@ try {
|
||||
|
||||
stage('Tag Repository') {
|
||||
|
||||
|
||||
withCredentials(
|
||||
[usernamePassword(
|
||||
credentialsId: env.GITHUB_CREDENTIALS_ID,
|
||||
|
||||
@ -5,4 +5,6 @@ APPLICATION_NAME=$1
|
||||
kubectl apply -f configuration/kubernetes/deployment.yaml
|
||||
kubectl apply -f configuration/kubernetes/service.yaml
|
||||
|
||||
kubectl get pods
|
||||
|
||||
kubectl rollout status deployment/${APPLICATION_NAME} --namespace=production
|
||||
@ -6,8 +6,6 @@ sys.path.append('/home/price-collector/')
|
||||
from threading import Thread
|
||||
from pricing.collector import collectorMain
|
||||
|
||||
from src.utils.jsonLogger import setup_logging
|
||||
|
||||
from probes.probes import runFlaskProbes
|
||||
|
||||
def callCollector(args):
|
||||
@ -17,7 +15,6 @@ def callProbes():
|
||||
runFlaskProbes()
|
||||
|
||||
if __name__=='__main__':
|
||||
setup_logging()
|
||||
|
||||
Thread(target=callProbes).start()
|
||||
|
||||
|
||||
@ -12,19 +12,28 @@ from pricing.exchanges.gemini import geminiPublicTicker, geminiVolAskBid, gemini
|
||||
from pricing.exchanges.bitstamp import bitstampVolAskBid, bitstampHighLow, bitstampOpenClose
|
||||
from pricing.exchanges.kraken import krakenVolAskBid, krakenHighLow, krakenOpenClose
|
||||
|
||||
# from src.utils.databaseConnect import send
|
||||
from src.utils.databaseConnect import send
|
||||
from src.utils.activemqConnect import activeMQSender
|
||||
|
||||
import json, uuid
|
||||
import json
|
||||
|
||||
from src.utils.jsonLogger import log
|
||||
import logging as logger
|
||||
|
||||
logger.basicConfig(
|
||||
level=logger.INFO,
|
||||
format="%(asctime)s: %(levelname)s -- %(message)s",
|
||||
datefmt='%Y-%m-%d %H:%M:%S'
|
||||
)
|
||||
|
||||
btc_usd="/home/price-collector/src/resources/queries/V1_INSERT_NEW_PRICE_RECORD_BTC.graphql"
|
||||
xmr_usd="/home/price-collector/src/resources/queries/V1_INSERT_NEW_PRICE_RECORD_XMR.graphql"
|
||||
|
||||
def averager(type):
|
||||
|
||||
timestamp = datetime.datetime.now() + datetime.timedelta(hours=1)
|
||||
|
||||
bitstampH, bitstampL = bitstampHighLow(type, log)
|
||||
krakenH, krakenL = krakenHighLow(type, log)
|
||||
bitstampH, bitstampL = bitstampHighLow(type, logger)
|
||||
krakenH, krakenL = krakenHighLow(type, logger)
|
||||
|
||||
bitstamp_P = (bitstampH + bitstampL)/2
|
||||
kraken_P = (krakenH + krakenL)/2
|
||||
@ -34,15 +43,15 @@ def averager(type):
|
||||
|
||||
averagePrice = round(averagePrice, 2)
|
||||
|
||||
log("Hourly Price for ({}) is {}".format(timestamp ,averagePrice), 'INFO')
|
||||
logger.info("Hourly Price for ({}) is {}".format(timestamp ,averagePrice))
|
||||
|
||||
return averagePrice, timestamp
|
||||
|
||||
def getVol(type):
|
||||
bitV, bitA, bitB = bitstampVolAskBid(type, log)
|
||||
kV, kA, kB = krakenVolAskBid(type, log)
|
||||
bV, bA, bB = bitfinexVolAskBid(type, log)
|
||||
gV, gA, gB = geminiVolAskBid(type, log)
|
||||
bitV, bitA, bitB = bitstampVolAskBid(type, logger)
|
||||
kV, kA, kB = krakenVolAskBid(type, logger)
|
||||
bV, bA, bB = bitfinexVolAskBid(type, logger)
|
||||
gV, gA, gB = geminiVolAskBid(type, logger)
|
||||
|
||||
v_array = np.array([bitV, kV, bV, gV])
|
||||
|
||||
@ -51,8 +60,8 @@ def getVol(type):
|
||||
return volume
|
||||
|
||||
def getHighLow(type):
|
||||
kH, kL = krakenHighLow(type, log)
|
||||
bH, bL = bitstampHighLow(type, log)
|
||||
kH, kL = krakenHighLow(type, logger)
|
||||
bH, bL = bitstampHighLow(type, logger)
|
||||
|
||||
h_array = np.array([kH, bH])
|
||||
l_array = np.array([kL, bL])
|
||||
@ -63,8 +72,8 @@ def getHighLow(type):
|
||||
return high, low
|
||||
|
||||
def getOpenClose(type):
|
||||
bO, bC = bitstampOpenClose(type, log)
|
||||
kO, kC = krakenOpenClose(type, log)
|
||||
bO, bC = bitstampOpenClose(type, logger)
|
||||
kO, kC = krakenOpenClose(type, logger)
|
||||
|
||||
o_array = np.array([bO, kO])
|
||||
c_array = np.array([bC, kC])
|
||||
@ -74,37 +83,37 @@ def getOpenClose(type):
|
||||
|
||||
return open, close
|
||||
|
||||
# def sendToGateway(c_type, timestamp, av_price, high, low, vol, o_price, c_price):
|
||||
#
|
||||
# with open(btc_usd, 'r') as file:
|
||||
# data = file.read()
|
||||
#
|
||||
# strippedTimestamp = timestamp.replace(minute=0, second=0, microsecond=0)
|
||||
# timestamp = '"'+strippedTimestamp.strftime('%Y-%m-%dT%H:%M:%S')+'"'
|
||||
# type = '"'+c_type+'"'
|
||||
#
|
||||
# query = data % (timestamp, type, round(av_price, 2),
|
||||
# round(high, 2),
|
||||
# round(low, 2),
|
||||
# round(o_price, 2),
|
||||
# round(c_price, 2),
|
||||
# round(vol, 2))
|
||||
#
|
||||
# log("Query sending down to db-gateway -- ({})".format(query), 'INFO')
|
||||
def sendToGateway(c_type, timestamp, av_price, high, low, vol, o_price, c_price):
|
||||
|
||||
# status, response = send(query, log)
|
||||
with open(btc_usd, 'r') as file:
|
||||
data = file.read()
|
||||
|
||||
# if status != 200:
|
||||
# log("Query wasn't executed properly, view logs. Status = {}".format(status), 'WARN')
|
||||
# log("With Response of : {}".format(response), 'ERR')
|
||||
# else:
|
||||
# log("Query executed successfully with Status = {}".format(status), 'INFO')
|
||||
# log("With Response of : {}".format(response), 'INFO')
|
||||
strippedTimestamp = timestamp.replace(minute=0, second=0, microsecond=0)
|
||||
timestamp = '"'+strippedTimestamp.strftime('%Y-%m-%dT%H:%M:%S')+'"'
|
||||
type = '"'+c_type+'"'
|
||||
|
||||
query = data % (timestamp, type, round(av_price, 2),
|
||||
round(high, 2),
|
||||
round(low, 2),
|
||||
round(o_price, 2),
|
||||
round(c_price, 2),
|
||||
round(vol, 2))
|
||||
|
||||
logger.info("Query sending down to db-gateway -- ({})".format(query))
|
||||
|
||||
status, response = send(query, logger)
|
||||
|
||||
if status != 200:
|
||||
logger.critical("Query wasn't executed properly, view logs. Status = {}".format(status))
|
||||
logger.error("With Response of : {}".format(response))
|
||||
else:
|
||||
logger.info("Query executed successfully with Status = {}".format(status))
|
||||
logger.info("With Response of : {}".format(response))
|
||||
|
||||
def sentToArtemis(c_type, timestamp, av_price, high, low, vol, o_price, c_price):
|
||||
|
||||
strippedTimestamp = timestamp.replace(minute=0, second=0, microsecond=0)
|
||||
timestamp = strippedTimestamp.strftime('%Y-%m-%dT%H:%M:%S')
|
||||
timestamp = '"'+strippedTimestamp.strftime('%Y-%m-%dT%H:%M:%S')+'"'
|
||||
|
||||
message = {
|
||||
"timestamp" : timestamp,
|
||||
@ -117,14 +126,14 @@ def sentToArtemis(c_type, timestamp, av_price, high, low, vol, o_price, c_price)
|
||||
"volume" : vol
|
||||
}
|
||||
|
||||
messageJson = json.dumps(message, indent = 4)
|
||||
# messageJson = json.dumps(message, indent = 4)
|
||||
|
||||
syncId = uuid.uuid4()
|
||||
messageJson = str(message)
|
||||
|
||||
log("Sending message to PricingSave queue", 'INFO', syncId)
|
||||
log("Message: {}".format(message), 'INFO', syncId)
|
||||
logger.info("Sending message to PricingSave queue")
|
||||
|
||||
activeMQSender(messageJson, logger)
|
||||
|
||||
activeMQSender(messageJson, syncId)
|
||||
|
||||
def timeFunction():
|
||||
global time
|
||||
@ -145,6 +154,8 @@ def collector(c_type):
|
||||
global time
|
||||
time = timeFunction()
|
||||
|
||||
print(time)
|
||||
|
||||
av_price, timestamp = averager(c_type)
|
||||
vol = getVol(c_type)
|
||||
high, low = getHighLow(c_type)
|
||||
@ -155,11 +166,9 @@ def collector(c_type):
|
||||
|
||||
schedule.every().hour.at(time).do(collector, c_type).tag("collector")
|
||||
|
||||
log("Collection will run again at {} every hour".format(time), 'INFO')
|
||||
|
||||
# Dynamically Spin up Child process for each type wanting to track
|
||||
def collectorMain(c_type):
|
||||
log("Starting Historical Price Collector", 'INFO')
|
||||
logger.info("== Historical Price Collector ==")
|
||||
|
||||
collector(c_type)
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import requests, json, sys
|
||||
|
||||
def bitfinexPublicTicker(type, log):
|
||||
def bitfinexPublicTicker(type, logger):
|
||||
try:
|
||||
uri = "https://api.bitfinex.com/v2/tickers?symbols=" + "t"+type.upper().replace('_', '')
|
||||
|
||||
@ -13,11 +13,11 @@ def bitfinexPublicTicker(type, log):
|
||||
price = round(price, 2)
|
||||
return price
|
||||
except KeyError as e:
|
||||
log("Bitfinex Spot Price Error: {}".format(e), 'ERR')
|
||||
logger.error("Bitfinex Spot Price Error: {}".format(e))
|
||||
price = 0
|
||||
return price
|
||||
|
||||
def bitfinexVolAskBid(type, log):
|
||||
def bitfinexVolAskBid(type, logger):
|
||||
|
||||
try:
|
||||
uri = "https://api.bitfinex.com/v2/tickers?symbols=" + "t"+type.upper().replace('_', '')
|
||||
@ -32,5 +32,5 @@ def bitfinexVolAskBid(type, log):
|
||||
|
||||
return vol, ask, bid
|
||||
except KeyError as e:
|
||||
log("Bitfinex High Low Volume Error: {}".format(e), 'ERR')
|
||||
logger.error("Bitfinex High Low Volume Error: {}".format(e))
|
||||
return 0, 0, 0
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import requests, json, sys
|
||||
|
||||
def bitstampVolAskBid(type, log):
|
||||
def bitstampVolAskBid(type, logger):
|
||||
try:
|
||||
uri = "https://www.bitstamp.net/api/v2/ticker_hour/" + type.lower().replace('_', '') + "/"
|
||||
response = requests.request("GET", uri)
|
||||
@ -14,10 +14,10 @@ def bitstampVolAskBid(type, log):
|
||||
|
||||
return vol, ask, bid
|
||||
except KeyError as e:
|
||||
log("Bitstamp Volume Ask Bid Error: {}".format(e), 'ERR')
|
||||
logger.error("Bitstamp Volume Ask Bid Error: {}".format(e))
|
||||
return 0, 0, 0
|
||||
|
||||
def bitstampOpenClose(type, log):
|
||||
def bitstampOpenClose(type, logger):
|
||||
try:
|
||||
uri = "https://www.bitstamp.net/api/v2/ticker_hour/" + type.lower().replace('_', '') + "/"
|
||||
response = requests.request("GET", uri)
|
||||
@ -28,10 +28,10 @@ def bitstampOpenClose(type, log):
|
||||
|
||||
return open, close
|
||||
except KeyError as e:
|
||||
log("Bitstamp Open Close Error: {}".format(e), 'ERR')
|
||||
logger.error("Bitstamp Open Close Error: {}".format(e))
|
||||
return 0, 0
|
||||
|
||||
def bitstampHighLow(type, log):
|
||||
def bitstampHighLow(type, logger):
|
||||
try:
|
||||
uri = "https://www.bitstamp.net/api/v2/ticker_hour/" + type.lower().replace('_', '') + "/"
|
||||
response = requests.request("GET", uri)
|
||||
@ -42,5 +42,5 @@ def bitstampHighLow(type, log):
|
||||
|
||||
return high, low
|
||||
except KeyError as e:
|
||||
log("Bitstamp Open Close Error: {}".format(e), 'ERR')
|
||||
logger.error("Bitstamp Open Close Error: {}".format(e))
|
||||
return 0, 0
|
||||
@ -10,7 +10,7 @@ class keys():
|
||||
self.api_key = os.getenv('COINBASE_KEY')
|
||||
self.api_secret = os.getenv("COINBASE_SECRET")
|
||||
|
||||
def coinbasePublicTicker(type, log):
|
||||
def coinbasePublicTicker(type, logger):
|
||||
|
||||
api_key = keys().api_key
|
||||
api_secret = keys().api_secret
|
||||
@ -24,6 +24,6 @@ def coinbasePublicTicker(type, log):
|
||||
price = round(price, 2)
|
||||
return price
|
||||
except KeyError as e:
|
||||
log("Coinbase Spot Price Error: {}".format(e), 'ERR')
|
||||
logger.error("Coinbase Spot Price Error: {}".format(e))
|
||||
price = 0
|
||||
return price
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import requests, json, sys
|
||||
|
||||
def geminiPublicTicker(type, log):
|
||||
def geminiPublicTicker(type, logger):
|
||||
|
||||
try:
|
||||
uri = "https://api.gemini.com/v1/pubticker/" + type.lower().replace('_', '')
|
||||
@ -15,11 +15,11 @@ def geminiPublicTicker(type, log):
|
||||
|
||||
return price
|
||||
except KeyError as e:
|
||||
log("Gemini Spot Price Error: {}".format(e), 'ERR')
|
||||
logger.error("Gemini Spot Price Error: {}".format(e))
|
||||
price = 0
|
||||
return price
|
||||
|
||||
def geminiVolAskBid(type, log):
|
||||
def geminiVolAskBid(type, logger):
|
||||
try:
|
||||
uri = "https://api.gemini.com/v2/ticker/" + type.lower().replace('_', '')
|
||||
response = requests.request("GET", uri)
|
||||
@ -36,20 +36,20 @@ def geminiVolAskBid(type, log):
|
||||
|
||||
return vol, ask, bid
|
||||
except KeyError as e:
|
||||
log("Gemini Volume Ask Bid Error: {}".format(e), 'ERR')
|
||||
logger.error("Gemini Volume Ask Bid Error: {}".format(e))
|
||||
return 0, 0, 0
|
||||
|
||||
def geminiDailyOpenClose(type, log):
|
||||
def geminiDailyOpenClose(type, logger):
|
||||
try:
|
||||
uri = "https://api.gemini.com/v2/ticker/" + type.lower().replace('_', '')
|
||||
response = requests.request("GET", uri)
|
||||
response = json.loads(response.text)
|
||||
|
||||
open = round(float(response['open']), 2)
|
||||
close = round(float(response['close']), 2)
|
||||
dailyOpen = round(float(response['open']), 2)
|
||||
dailyClose = round(float(response['close']), 2)
|
||||
|
||||
return open, close
|
||||
except KeyError as e:
|
||||
log("Gemini Open Close Error: {}".format(e), 'ERR')
|
||||
logger.error("Gemini Open Close Error: {}".format(e))
|
||||
sys.stdout.flush()
|
||||
return 0, 0
|
||||
|
||||
@ -21,7 +21,7 @@ def krakenCalculateOHLC(response):
|
||||
|
||||
return fopen, fhigh, flow, fclose
|
||||
|
||||
def krakenVolAskBid(type, log):
|
||||
def krakenVolAskBid(type, logger):
|
||||
try:
|
||||
uri = "https://api.kraken.com/0/public/Ticker?pair=" + type.upper().replace('_', '').replace('BTC', 'XBT')
|
||||
response = requests.request("GET", uri)
|
||||
@ -37,10 +37,10 @@ def krakenVolAskBid(type, log):
|
||||
|
||||
return vol, ask, bid
|
||||
except KeyError as e:
|
||||
log("Kraken Volume Ask Bid Error: {}".format(e), 'ERR')
|
||||
logger.error("Kraken Volume Ask Bid Error: {}".format(e))
|
||||
return 0, 0, 0
|
||||
|
||||
def krakenOpenClose(type, log):
|
||||
def krakenOpenClose(type, logger):
|
||||
try:
|
||||
uri = "https://api.kraken.com/0/public/OHLC?pair=" + type.upper().replace('_', '').replace('BTC', 'XBT') + "&?interval\=60"
|
||||
response = requests.request("GET", uri)
|
||||
@ -53,10 +53,10 @@ def krakenOpenClose(type, log):
|
||||
|
||||
return fopen, fclose
|
||||
except KeyError as e:
|
||||
log("Kraken Open Close Error: {}".format(e), 'ERR')
|
||||
logger.error("Kraken Open Close Error: {}".format(e))
|
||||
return 0, 0, 0
|
||||
|
||||
def krakenHighLow(type, log):
|
||||
def krakenHighLow(type, logger):
|
||||
try:
|
||||
uri = "https://api.kraken.com/0/public/OHLC?pair=" + type.upper().replace('_', '').replace('BTC', 'XBT') + "&?interval\=60"
|
||||
response = requests.request("GET", uri)
|
||||
@ -69,5 +69,5 @@ def krakenHighLow(type, log):
|
||||
|
||||
return fhigh, flow
|
||||
except KeyError as e:
|
||||
log("Kraken Open Close Error: {}".format(e), 'ERR')
|
||||
logger.error("Kraken Open Close Error: {}".format(e))
|
||||
return 0, 0
|
||||
@ -6,6 +6,13 @@ import json
|
||||
|
||||
from pricing.exchanges.coinbase import coinbasePublicTicker
|
||||
|
||||
import logging as logger
|
||||
logger.basicConfig(
|
||||
level=logger.INFO,
|
||||
format="%(asctime)s: %(levelname)s -- %(message)s",
|
||||
datefmt='%Y-%m-%d %H:%M:%S'
|
||||
)
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/health')
|
||||
@ -15,7 +22,7 @@ def health():
|
||||
@app.route('/readiness')
|
||||
def readiness():
|
||||
# Can it make a call to an exchange?
|
||||
price = coinbasePublicTicker('btc_usd')
|
||||
price = coinbasePublicTicker('btc_usd', logger)
|
||||
|
||||
if price != 0 :
|
||||
return json.dumps({
|
||||
|
||||
@ -0,0 +1 @@
|
||||
mutation { createBtc(createdDate: %s, type: %s, average_price: %f, high_price: %f, low_price: %f, open_price: %f, close_price: %f, volume: %f){ id } }
|
||||
@ -3,8 +3,6 @@
|
||||
import stomp
|
||||
import os
|
||||
|
||||
from src.utils.jsonLogger import log
|
||||
|
||||
class keys():
|
||||
|
||||
def __init__(self):
|
||||
@ -17,20 +15,12 @@ class keys():
|
||||
def returnKeys(self):
|
||||
return self.addr, self.port, self.amqU, self.amqP
|
||||
|
||||
def activeMQSender(message, syncId):
|
||||
def activeMQSender(message, logger):
|
||||
addr, port, mqUser, mqPass = keys().returnKeys()
|
||||
|
||||
log("Attempting Connection to Artemis...", 'INFO', syncId)
|
||||
con = stomp.Connection([(addr, port)], auto_content_length=False)
|
||||
logger.info("Attempting Connection to Artemis...")
|
||||
con = stomp.Connection([(addr, port)])
|
||||
con.connect( mqUser, mqPass, wait=True)
|
||||
|
||||
con.send("PricingSave",
|
||||
message,
|
||||
content_type="application/json",
|
||||
headers={
|
||||
"Content-Type":"application/json",
|
||||
"X-CRYPTO-Sync-ID":syncId
|
||||
})
|
||||
|
||||
con.disconnect()
|
||||
con.send(message, destination='PricingSave.dlq/queues/anycast/PricingSave.dlq' )
|
||||
|
||||
|
||||
@ -2,14 +2,12 @@
|
||||
|
||||
import requests, os, json, sys
|
||||
|
||||
from src.utils.jsonLogger import log
|
||||
|
||||
class keys():
|
||||
|
||||
def __init__(self):
|
||||
self.uri = os.getenv("DATABASE_URL")
|
||||
|
||||
def send(query):
|
||||
def send(query, logger):
|
||||
try:
|
||||
uri = keys().uri + "/graphql"
|
||||
headers = {'Content-type': 'application/json'}
|
||||
@ -21,8 +19,8 @@ def send(query):
|
||||
|
||||
return statusCode, response
|
||||
except requests.exceptions.HTTPError as e:
|
||||
log("Unable to send data down to db-gateway: {}".format(e), 'ERR')
|
||||
logger.critical("Unable to send data down to db-gateway: {}".format(e))
|
||||
sys.exit(1)
|
||||
except requests.exceptions.RequestException as e:
|
||||
log("Unable to send data down to db-gateway: {}".format(e), 'ERR')
|
||||
logger.critical("Unable to send data down to db-gateway: {}".format(e))
|
||||
sys.exit(1)
|
||||
@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import logging
|
||||
from pythonjsonlogger import jsonlogger
|
||||
|
||||
import datetime
|
||||
|
||||
class CustomJsonFormatter(jsonlogger.JsonFormatter):
|
||||
def add_fields(self, log_record, record, message_dict):
|
||||
super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)
|
||||
if not log_record.get('@timestamp'):
|
||||
# this doesn't use record.created, so it is slightly off
|
||||
now = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
log_record['@timestamp'] = now
|
||||
if log_record.get('level'):
|
||||
log_record['level'] = log_record['level'].upper()
|
||||
else:
|
||||
log_record['level'] = record.levelname
|
||||
|
||||
def setup_logging(log_level='INFO'):
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.propagate = 0
|
||||
logger.setLevel(log_level)
|
||||
logHandler = logging.StreamHandler()
|
||||
|
||||
formatter = CustomJsonFormatter('%(@timestamp)s %(level)s %(name)s %(message)s')
|
||||
|
||||
logHandler.setFormatter(formatter)
|
||||
logger.addHandler(logHandler)
|
||||
|
||||
def log(message, level, syncId=""):
|
||||
logger = logging.getLogger(__name__)
|
||||
if level == 'INFO':
|
||||
logger.info(message, extra={"X-CRYPTO-Sync-ID" : syncId})
|
||||
elif level == 'WARN':
|
||||
logger.warn(message, extra={"X-CRYPTO-Sync-ID" : syncId})
|
||||
elif level == 'ERR':
|
||||
logger.error(message, extra={"X-CRYPTO-Sync-ID" : syncId})
|
||||
elif level == 'DEBUG':
|
||||
logger.debug(message, extra={"X-CRYPTO-Sync-ID" : syncId})
|
||||
Loading…
x
Reference in New Issue
Block a user