# Dec 24th, 2017 - \[DE\]\[Elastic Stack\] Daten-Exploration mit Elasticsearch und Kibana

**URL:** <https://discuss.elastic.co/t/dec-24th-2017-de-elastic-stack-daten-exploration-mit-elasticsearch-und-kibana/113066>\
**Category:** Advent Calendar\
**Created:** [December 24, 2017, 12:00am UTC](https://discuss.elastic.co/t/dec-24th-2017-de-elastic-stack-daten-exploration-mit-elasticsearch-und-kibana/113066 "2017-12-24T00:00:20Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![xeraa](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xeraa/32/48181_2.png) [@xeraa](https://discuss.elastic.co/u/xeraa)\
**Post date:** [December 24, 2017, 12:00am UTC](https://discuss.elastic.co/t/dec-24th-2017-de-elastic-stack-daten-exploration-mit-elasticsearch-und-kibana/113066/1 "2017-12-24T00:00:20Z")

</div>

Welche Informationen verbergen sich eigentlich hinter einer API? In der reinen Textausgabe sieht man oft den Wald vor lauter Bäumen nicht — eine sinnvolle Visualisierung muss her. Dazu kann man entweder selbst ein Programm schreiben, um die Daten einzusammeln, aufzubereiten und anschließend grafisch darzustellen, oder ... man verwendet einfach Elasticsearch und Kibana.

Als konkretes Beispiel wollen wir die [GitHub API](https://developer.github.com/v3/) verwenden. Dafür gäbe es sogar ein [GitHub Input Plugin für Logstash](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-github.html), aber wir wollen es hier ganz einfach und allgemein anwendbar halten. [`curl`](https://curl.haxx.se) und [`jq`](https://stedolan.github.io/jq/) reichen völlig aus, um die Daten auf der Kommandozeile abzurufen und die JSON-Antwort zu verarbeiten und abschließend in Elasticsearch zu speichern.

## curl, jq und Elasticsearch

Dazu wollen wir folgendes Shell-Script verwenden, wobei Elasticsearch unter `https://<url:ip>` erreichbar sein muss und `--user '<user>:<password>'` muss, falls vorhanden, die richtigen Zugangsdaten enthalten:

```bash
#!/bin/bash -e

if (( $# != 1 )); then
    printf "Usage: Provide the GitHub username to collect their stats"
    exit 1
fi

printf "Fetching data of $1"

printf "\n\nGet the user profile. HTTP return code: "
curl -XGET https://api.github.com/users/$1 --silent | \
     jq -c --arg user $1 '{"index": {"_index": "github", "_type": "doc", "_id": .login}}, . + {"type": "user", "github_profile": $user}' | \
     curl -XPOST https://<url:ip>/_bulk --silent --write-out '%{http_code}' --output /dev/null --user '<user>:<password>' -H'Content-Type: application/json' --data-binary @-

printf "\n\nGet the user repositories. HTTP return code: "
curl -XGET https://api.github.com/users/$1/repos --silent | \
     jq -c --arg user $1 '.[] | {"index": {"_index": "github", "_type": "doc", "_id": .full_name}}, . + {"type": "repo", "github_profile": $user}' | \
     curl -XPOST https://<url:ip>/_bulk --silent --write-out '%{http_code}' --output /dev/null --user '<user>:<password>' -H'Content-Type: application/json' --data-binary @-

exit 0

```

Aufruf und Ausgabe:

```
$ ./github-userdata.sh xeraa
Fetching data of xeraa

Get the user profile. HTTP return code: 200

Get the user repositories. HTTP return code: 200

```

Ein paar Anmerkungen zum Script:

- Wer Elasticsearch und Kibana nicht selbst aufsetzen möchte oder die Ergebnisse gerne teilen würde, kann einfach [Elastic Cloud](https://cloud.elastic.co) verwenden.
- Das Script muss genau mit einem Parameter aufgerufen werden, nämlich dem Benutzernamen dessen GitHub-Daten wir abrufen wollen; beispielsweise `./github-userdata.sh xeraa`
- Als erstes fragen wir das Benutzerprofil des Users ab und speichern es mit der [Bulk API](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html) in Elasticsearch. Zusätzlich fügen wir dem abgerufenen Dokument die Attribute `type` und `github_profile` (als jq Parameter übergeben) hinzu, die wir später für Abfragen benötigen.
- Danach fragen wir Daten zu den Repositories des Users ab. Einziger Unterschied zur vorigen Abfrage ist, dass wir hier ein Array zurückbekommen, aber jq macht die Verarbeitung mit dem Array-Iterator `.[]` ganz einfach.
- Die Fehlerbehandlung (existiert der Benutzername, ging bei der Abfrage etwas schief,...) ist auf jeden Fall verbesserungswürdig, aber für ein schnelles Experiment wollen wir es simpel halten.

Für die Daten-Exploration in Kibana habe ich die GitHub-Daten des DevRel-Teams von Elastic verwendet: `echo xeraa dadoonet medcl aravindputrevu johtani miiiiiche tylerhannan markwalkom kimjmin ossanna16 eemrich crayzeigh RochelleSonny | xargs -n1 ./github-userdata.sh`

Damit wäre das Abrufen, Bearbeiten und Speichern der Daten auch schon fertig.

## Kibana

Jetzt können wir uns die Daten ansehen. Zuallererst müssen wir das _Index Pattern_ anlegen: Management → Index Patterns → Create Index Pattern → `github`

Danach kann man ein passendes Zeitfenster wählen (beispielsweise `8 Years ago`) und die Daten in _Discover_ anzeigen. In der nachfolgenden Grafik sind die Daten bereits auf `type` `is` `user` eingeschränkt, um nur die Daten der Benutzerprofile anzuzeigen. Außerdem ist die Ansicht auf einige _Columns_ eingeschränkt um die Anzeige als Tabelle zu ermöglichen:

 ![user_overview](https://us1.discourse-cdn.com/elastic/original/3X/2/0/20594bd09b59f1acfcbb1a31c706841aaa07d97c.png)

Wer beim Link zum Benutzer-Avatar das tatsächliche Bild anzeigen möchte, muss folgende Einstellung im Index Pattern auf dem Attribut `avatar_url` vornehmen:

 ![avatar_url](https://us1.discourse-cdn.com/elastic/original/3X/9/7/97b2a10d63f993d3589e3194188bf79586c57715.png)

Anschließend kann man in der Detailansicht den Benutzer-Avatar des jeweiligen Users sehen:

 ![user_detail](https://us1.discourse-cdn.com/elastic/original/3X/6/2/6269784e124142665ede79ce9ef654faff29e866.png)

Als nächstes wollen wir uns die Repository-Daten ansehen. Dazu wechseln wir zu _Visualize_ und bauen verschiedene Visualisierungen. Untenstehendes Beispiel zeigt die Summe der Stargazers der top zehn Repositories:

 ![visualization](https://us1.discourse-cdn.com/elastic/original/3X/3/e/3e878356580adf5122a1d5afe7a820e086daebae.png)

Andere Beispiele könnten die Lizenz, Programmiersprache,... zeigen. Diese kann man anschließend alle in einem _Dashboard_ für alle Benutzer anzeigen:

 ![dashboard_all](https://us1.discourse-cdn.com/elastic/original/3X/e/e/ee1c22715be8bd3a02b34196a086fa1f000623e7.png)

Über `github_profile.keyword` `is` `xeraa` lassen sich auch die Dashboards auf einen Benutzer einschränken:

 ![dashboard_user](https://us1.discourse-cdn.com/elastic/original/3X/c/8/c8129933fbf262d028f88565457463c0b9a8c003.png)

Und damit ist unser kurzer Überblick über die GitHub-Profile auch bereits abgeschlossen. Die Beispiele lassen sich natürlich mit mehr Daten und Visualisierungen beliebig erweitern, aber sie können auch leicht auf jede andere HTTP und JSON basierte API angewendet werden.

Frohe Weihnachten und erfolgreiches Erkunden diverser APIs über die Feiertage! 🤶 🎅 🎄 🎁 ☃

---

<div class="post-metadata">

**Author:** ![zezz](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/zezz/32/17169_2.png) [@zezz](https://discuss.elastic.co/u/zezz)\
**Post date:** [January 8, 2018, 7:10am UTC](https://discuss.elastic.co/t/dec-24th-2017-de-elastic-stack-daten-exploration-mit-elasticsearch-und-kibana/113066/2 "2018-01-08T07:10:25Z")

</div>

Even if my German knowledge is fadding, I do like those quick integrations using json APIs, jq and shell scripts

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [August 23, 2018, 8:31am UTC](https://discuss.elastic.co/t/dec-24th-2017-de-elastic-stack-daten-exploration-mit-elasticsearch-und-kibana/113066/3 "2018-08-23T08:31:27Z")

</div>


