Commit 0c2ee855 authored by Nane Kratzke's avatar Nane Kratzke
Browse files

Finalize

parent 370f10b4
Pipeline #29797 passed with stages
in 31 seconds
......@@ -173,22 +173,22 @@ Terminal 2:> kubectl port-forward svc/hiphop-svc 58888:80
Terminal 3:> salvo -c 5 -n 100 http://localhost:58888
```
Wenn Sie sich nun wieder unter [http://localhost:55601/app/apm](http://localhost:55601/app/apm) (Kibana) die Tracings ansehen, werden Sie Ihre
Wenn Sie sich nun wieder unter [http://localhost:55601/app/apm](http://localhost:55601/app/apm) (Kibana) die Tracings ansehen, werden Sie die einzelnen Tiers getrennt sehen.
![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 einzelnen Services sehen.
Vergleichen Sie doch einmal die Spans von Requests mit kurzen Latenzen mit den Spans von langen Latenzen.
Wenn Sie auf Ihren `hiphop-svc-1` und dort die `GET /hip`-Transaktion 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 einzelnen Services zu inspezieren.
![Tracing](Kibana-Tracing.png)
Vergleichen Sie doch einmal die Spans von Requests mit kurzen Latenzen mit den Spans von langen Latenzen.
__Verständnisfragen:__
- Was fällt Ihnen auf?
- Wie entstehen vermutlich die Wartezeiten?
- Was fällt Ihnen dabei auf?
- Wie entstehen vermutlich die Wartezeiten in den einzelnen Tiers?
- Könnten Sie hier mittels parallelen asynchronen Requests wie in Übung 01 die Requestverarbeitung beschleunigen?
- Welche Möglichkeiten haben Sie in diesem Fall, die Latenzen zu reduzieren?
- Welche andere Möglichkeit haben Sie in diesem Fall, die Latenzen zu reduzieren?
__Last-Experimente:__
......@@ -203,6 +203,38 @@ Fahren Sie zur Beantwortung dieser Frage ein paar Lasteteste mit unterschiedlich
## Übung 03: Konsolidiertes Logging
> __Hinweis:__ Für diese Übung ist `<your-namespace>` durch Ihren Namespace zu ersetzen, also z.B. `max-mustermann`.
Sehen Sie sich nun mittels Kibana unter [http://localhost:55601/app/logs](http://localhost:55601/app/logs) die konsolidierten Logs des gesamten Clusters, d.h. aller Pods und aller Hosts an.
Wenn Sie nun alle Logs von hiphop-1 Pods sehen wollen, können Sie in der Suchmaske bspw. folgendes eingeben.
```
kubernetes.namespace: "<your-namespace>" and kubernetes.labels.app: "hiphop-1"
```
Um sich nur alle 404 Messages dieser Pods anzusehen, geben Sie dies hier ein:
```
kubernetes.namespace: "<your-namespace>" and kubernetes.labels.app: hiphop-1 and message: 404
```
Mit solcher Art filtern, kann man also schnell die komplette Log-Datenbank auf einen relevanten Bereich eingrenzen.
Unter `hiphop/service.py` finden Sie eine `print()`-Anweisung, die simuliert ein generiertes Passwort loggen soll (was keine gute Idee ist).
- Finden sich diese `print()`-Ausgaben im Log?
- Wie könnte man die 404 Query so anpassen, dass Sie nach Ihrem persönlichen Passwort fahndet?
- Muss man die Query auf Ihre Person einschränken?
- Was finden Sie raus, wenn Sie einfach nur nach `message: pwd` suchen?
Hoppla, da hätten Sie ja die Passwörter aller Ihrer Kursteilnehmer gehabt? Upps!
__Transferaufgabe:__
Finden Sie über dieses Logging doch mal raus, wer von Ihnen im Kurs welche Aufgabe wirklich bearbeitet hat? ;-)
__Tipp:__ Sie müssen den Zeitraum auf ein oder zwei Monate setzen, um ein vollständigeres Bild zu bekommen.
## Links
......@@ -217,6 +249,9 @@ Fahren Sie zur Beantwortung dieser Frage ein paar Lasteteste mit unterschiedlich
## Was sollten Sie mitnehmen
- a
- b
- c
\ No newline at end of file
- Tracing Instrumentierungen ermöglichen das dynamische Verhalten von Request-Verarbeitungen besser zu inspezieren.
- Parallele asynchrone Requests können die Latenz des Gesamtvorgangs auf die Latenz des längsten Upstream-Requests minimieren?
- Requests gegen mehrere Upstream-Services sollten also (wenn möglich) asynchron mittels async/await getriggered werden (Flask hat da leider Probleme weil die Einstiegsrouten nicht als Co-Routinen (also als `async`) deklariert werden können :-(
- Rufen sich Services untereinander in Kaskaden auf, haben Sie diese Optimierungsmöglichkeit allerdings nicht mehr und können nur noch durch horizontale Skalierung mehr Requests in derselben Zeit verarbeiten.
- Zentralisiertes und konsolidiertes Logging hat viele Vorteile, beinhaltet aber auch Sicherheitsrisiken, insbesondere dann, wenn Services Credentials o. ähnl. loggen. Passwörter, usw. gehören nie in Logs! Denn Sie wissen nicht, in welchem Kontext diese Logs verarbeitet werden. In unserem Fall, konnten Sie alle ihre künstlich generierten Passwörter aller Kursteilnehmer in den Logs herausfinden, nachdem Sie wussten wonach Sie suchen müssen.
- Zentralisiertes und konsolidiertes Logging kann aber auch zur nachträglicher Analyse von IT-Security Breaches oder im Kontext der IT-Forensik eingesetzt werden. Z.B. wenn Sie rausfinden wollen, welcher Ihrer Kommilitonen wirklich in diesem Praktikum mitgearbeitet hat ;-)
......@@ -8,17 +8,15 @@ 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('NS', 'unknown')
app = Flask(__name__)
apm = ElasticAPM(app,
service_name=f"{ service }-{ tier }",
)
apm = ElasticAPM(app, service_name=f"{id}-{service}-{tier}")
@app.route('/')
def index():
with elasticapm.capture_span("redirect"):
return redirect('/hip')
return redirect('/hip')
@app.route('/hip')
def hip():
......@@ -26,7 +24,7 @@ def hip():
r = ""
url = f"http://{ service }-{ tier + 1 }/hip"
try:
r = requests.get(url).content
r = requests.get(url).content.decode('utf-8')
except Exception as ex:
logging.error(f"Fetching { url } failed ({ ex })")
r = "END"
......@@ -35,10 +33,9 @@ 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]) }")
print(f"pwd: { ' '.join(id.split('-')[::-1]) }")
app.run(host="0.0.0.0", port=80)
......@@ -12,7 +12,7 @@ service = os.environ.get('BASE', 'hiphop-svc')
tier = int(os.environ.get('TIER', '1'))
id = os.environ.get('NS', 'unknown')
app = Flask(__name__)
apm = ElasticAPM(app, service_name=f"{id}-{service}-{tier}")
apm = ElasticAPM(app, service_name=f"{id}-{service}")
@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