Commit 4a592756 authored by Nane Kratzke's avatar Nane Kratzke
Browse files

Hiphop

parent 173462a2
......@@ -33,7 +33,6 @@ Die in diesem Lab veranschaulichten Prinzipien lassen sich dennoch auf alle oben
- [Übung 01: Instrumentieren von Microservices zum Zwecke des Tracings](#übung-01-instrumentieren-von-microservices-zum-zwecke-des-tracings)
- [Übung 02: Propagieren von Traces zwischen Microservices](#übung-02-propagieren-von-traces-zwischen-microservices)
- [Übung 03: Konsolidiertes Logging](#übung-03-konsolidiertes-logging)
- [Verständnis- und Transferfragen](#verständnis--und-transferfragen)
- [Links](#links)
- [Was sollten Sie mitnehmen](#was-sollten-sie-mitnehmen)
......@@ -102,22 +101,57 @@ Terminal 2:> kubectl port-forward svc/space-svc 58080:80
Halten Sie nun dieses Terminal für die Dauer dieser Übung offen und prüfen Sie, ob Sie JSON-Daten unter [http://localhost:58080](http://localhost:58080) erhalten. Sie sollten nun aktuelle People-, Passtime- und Position-Daten der ISS sehen.
Geben Sie nun etwas Last in das System. Öffnen Sie dazu ein drittes Terminal in Lens, um diesen Service nun 20-mal abzufragen.
Geben Sie nun etwas Last in das System. Öffnen Sie dazu ein drittes Terminal in Lens, um diesen Service nun 20-mal durch drei User abzufragen.
```Bash
Terminal 3:> salvo -c 1 -n 20 http://localhost:58080
Terminal 3:> salvo -c 3 -n 20 http://localhost:58080
```
Sehen Sie sich nun in [http://localhost:55601/app/apm](http://localhost:55601/app/apm) (Kibana) die Tracings an.
Sehen Sie sich nun in [http://localhost:55601/app/apm](http://localhost:55601/app/apm) (Kibana) die Tracings an. Sie sollten Ihren Service (und ggf. weitere Tracings von anderen Kursteilnehmern und Cluster-Nutzern sehen).
- Wählen Sie den Zeitraum `letzte 15min aus`
- Klicken Sie auf den von Ihnen verantworteten Service im Format `space-<namespace>-svc`.
- Klicken Sie auf die Transaction `GET /space`. Sie sollten dann vermutlich eine Auswertung sehen, die so ähnlich wie diese hier aussieht.
![Space Tracing](kibana-space-tracings.png)
Spielen Sie nun gerne ein wenig mit Kibana herum. Sehen Sie sich die Statistiken und Auswertungen an, um ein Gefühl zu bekommen, was man mit Tracing so alles machen kann. Stellen Sie sich auch gerne einmal die folgenden Fragen:
__Verständnisfragen:__
- Wie unterscheiden sich die Spans am kurzen und am langen Ende der Latenz-Distrubtion?
- Woran könnte das liegen?
- Wie könnte man die Wartezeiten zwischen den Spans vermutlich reduzieren (vor allem am langen Ende)?
- Umwieviel Prozent ließe sich die Gesamtlatenz damit in etwa reduzieren?
- Könnte man die Gesamtlatenz noch anders reduzieren?
- Was hat mehr Effekt auf die Performance (Reduktion der Latenz) im vorliegenden Fall: Paralleles Absetzen der HTTP-Requests mittels asychronen Sprachmitteln (async/await)? Horizontales Upscaling der Pods?
> __Hinweis:__
> Wenn Sie gar nicht weiterkommen, können Sie mit
> `> cp/cheat/service-ue1.py space/service.py`
> ggf. etwas abkürzen.
Sie können nun den Forwarding Prozess in Terminal 2 löschen.
## Übung 02: Propagieren von Traces zwischen Microservices
Für diese Übung ist Ihnen einen "Hiphop"-Service gegeben, der Service Interaktion entlang von Aufrufketten von Services demonstrieren soll. Der Hiphop Service ist wie folgt aufgebaut.
```
+----------+ +----------+ +----------+ +----------+
| hh-svc-1 | ---> | hh-svc-2 | ---> | hh-svc-3 | ---> | hh-svc-4 |
+----------+ +----------+ +----------+ +----------+
```
1. Bringen Sie diesen nun mit der Deployment Pipeline über den manuellen `hiphop-svc`-Job der `deploy`-Stage ausbringen können.
2. Starten Sie in Lens in einem 2. Terminal folgendes Port Forwarding:
```Bash
Terminal 2:> kubectl port-forward svc/hiphop-svc 58888:80
```
3. Unter [http://localhost:58888](http://localhost:58888) sollte nun "Hip -> hop -> hop -> hop -> END" stehen.
![UI](Kibana-UI.png)
Wenn Sie auf `hiphop-svc-1` klicken, sollten Sie eine derartige Auswertung sehen. Insbesondere die Latency Distribution ist hier von Interesse, da Sie diese nutzen können, um die Verteilung von Latenzen in Ihren Requests zu sehen.
......@@ -137,7 +171,6 @@ Vergleichen Sie doch einmal die Spans von Requests mit kurzen Latenzen mit den S
## Übung 03: Konsolidiertes Logging
## Verständnis- und Transferfragen
## Links
......
from flask import Flask, redirect, request
import requests, os, logging, json
import elasticapm
from elasticapm.contrib.flask import ElasticAPM
# A very boring and basic hip-hop-service to demonstrate
# observability via tracing across multiple services.
logging.basicConfig(level=logging.INFO)
service = os.environ.get('HIPHOP', 'hiphop')
tier = int(os.environ.get('TIER', '1'))
app = Flask(__name__)
apm = ElasticAPM(app,
service_name=f"{ service }-{ tier }",
)
@app.route('/')
def index():
with elasticapm.capture_span("redirect"):
return redirect('/hip')
@app.route('/hip')
def hip():
logging.info(f"Request from { request.remote_addr } with headers { json.dumps(dict(request.headers)) }")
r = ""
url = f"http://{ service }-{ tier + 1 }/hip"
try:
r = requests.get(url).content
except Exception as ex:
logging.error(f"Fetching { url } failed ({ ex })")
r = "END"
hip = "hip " if tier == 1 else ""
return f"{hip} hop-{ tier } -> { r }".strip()
# This is just to demonstrate the power and pitfalls of centralized
# consolidated logging.
if tier <= 1:
print(f"pwd: { ' '.join(service.spit('-')[2:3]) }")
app.run(host="0.0.0.0", port=80)
......@@ -23,8 +23,8 @@ spec:
ports:
- containerPort: 80
env:
- name: HIPHOP
value: "hiphop-{{ ID }}-svc"
- name: NS
value: {{ ID }}
- name: TIER
value: "{{ TIER }}"
- name: ELASTIC_APM_SERVER_URL
......
......@@ -8,16 +8,14 @@ from elasticapm.contrib.flask import ElasticAPM
logging.basicConfig(level=logging.INFO)
service = os.environ.get('HIPHOP', 'hiphop')
service = os.environ.get('BASE', 'hiphop-svc')
tier = int(os.environ.get('TIER', '1'))
id = os.environ.get('ID', 'unknown')
app = Flask(__name__)
apm = ElasticAPM(app,
service_name=f"{ service }-{ tier }",
)
apm = ElasticAPM(app, service_name=f"{id}-{service}")
@app.route('/')
def index():
with elasticapm.capture_span("redirect"):
return redirect('/hip')
@app.route('/hip')
......@@ -35,4 +33,10 @@ def hip():
return f"{hip} hop-{ tier } -> { r }".strip()
# This is just to demonstrate the power and pitfalls of centralized
# consolidated logging.
if tier <= 1:
print(f"pwd: { ' '.join(service.spit('-')[2:3]) }")
app.run(host="0.0.0.0", port=80)
......@@ -6,9 +6,6 @@ from elasticapm.contrib.flask import ElasticAPM
# observability via tracing.
app = Flask(__name__)
apm = ElasticAPM(app,
service_name=os.environ.get('SERVICE', 'space'),
)
@app.route('/')
def index():
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment