from flask import Flask, redirect, request, jsonify from jaeger_client import Config import opentracing import requests import traceback import os import json from joblib import Parallel, delayed from elasticapm.contrib.flask import ElasticAPM apm = ElasticAPM(app) # A very boring and basic space-service to demonstrate # observability via tracing. service = os.environ.get('SERVICE', 'space') app = Flask(__name__) # config = Config(config = { # 'sampler': { 'type': 'const', 'param': 1 }, # 'logging': True, # 'reporter_batch_size': 1 # }, service_name=service) # tracer = config.initialize_tracer() @app.route('/') def index(): return redirect('/space') def load_url(key, url): return key, json.loads(requests.get(url).content) #with tracer.start_span(operation_name=key, child_of=ctx) as span: # return key, json.loads(requests.get(url).content) @app.route('/space') def space(): #with tracer.start_span(operation_name="space") as parent_span: try: lat = float(request.args.get('lat', "0.0001")) lon = float(request.args.get('lon', "0.0001")) except Exception as ex: print(ex) return "Bad request (lat/lon not numeric)", 400 queries = { "astros": "http://api.open-notify.org/astros.json", "position": "http://api.open-notify.org/iss-now.json", "passtime": f"http://api.open-notify.org/iss-pass.json?lat={ lat }&lon={ lon }" } #with tracer.start_span(operation_name="parallel", child_of=parent_span) as span: results = Parallel(n_jobs=3)(delayed(load_url)(key, url) for key, url in queries.items()) result = { key: content for key, content in results } #for key, url in queries.items(): # with tracer.start_span(operation_name=key, child_of=parent_span) as span: # result[key] = json.loads(requests.get(url).content) print(result) return jsonify(result) app.run(host="0.0.0.0", port=80)