service.py 1.91 KB
Newer Older
Nane Kratzke's avatar
Nane Kratzke committed
1
2
3
4
5
6
7
from flask import Flask, redirect, request, jsonify
from jaeger_client import Config
import opentracing
import requests
import traceback 
import os
import json
Nane Kratzke's avatar
Nane Kratzke committed
8
9
from joblib import Parallel, delayed

Nane Kratzke's avatar
Nane Kratzke committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 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')

Nane Kratzke's avatar
Nane Kratzke committed
28
29
30
31
32
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)
Nane Kratzke's avatar
Nane Kratzke committed
33

Nane Kratzke's avatar
Nane Kratzke committed
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@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 }"
        }
Nane Kratzke's avatar
Nane Kratzke committed
49

Nane Kratzke's avatar
Nane Kratzke committed
50
51
52
53
        with tracer.start_span(operation_name="parallel", child_of=parent_span) as span:
            results = Parallel()(delayed(load_url)(key, url) for key, url in queries.items())
            result = { key: content for key, content in results }
            
Nane Kratzke's avatar
Nane Kratzke committed
54
55
56
        #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)
Nane Kratzke's avatar
Nane Kratzke committed
57
58
59
60

    print(result)
    return jsonify(result)

Nane Kratzke's avatar
Nane Kratzke committed
61
app.run(host="0.0.0.0", port=80)