From 6e328b4ef24bd14137819af472db7236560a14ed Mon Sep 17 00:00:00 2001 From: Barrett <81570928+btlghrants@users.noreply.github.com> Date: Thu, 4 Nov 2021 16:18:13 -0400 Subject: [PATCH] docs: Add Logging example README (#157) Signed-off-by: Jeff McCoy --- .images/get-started/plg.png | Bin 0 -> 67112 bytes docs/asciinema/Vagrantfile | 2 +- .../scenarios/examples-game-logging.exp | 164 ++++++++++++++++++ examples/game/add-logging.md | 156 +++++++++++++++++ 4 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 .images/get-started/plg.png create mode 100755 docs/asciinema/scenarios/examples-game-logging.exp create mode 100644 examples/game/add-logging.md diff --git a/.images/get-started/plg.png b/.images/get-started/plg.png new file mode 100644 index 0000000000000000000000000000000000000000..ca356e9c76ef0a9f4f83e6b49ab603f51792dc8d GIT binary patch literal 67112 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 literal 0 HcmV?d00001 diff --git a/docs/asciinema/Vagrantfile b/docs/asciinema/Vagrantfile index 34b25f40da..066e5768a6 100644 --- a/docs/asciinema/Vagrantfile +++ b/docs/asciinema/Vagrantfile @@ -26,6 +26,6 @@ Vagrant.configure("2") do |config| config.vm.provision "shell", inline: <<-'SCRIPT' # https://serverfault.com/questions/500764/dpkg-reconfigure-unable-to-re-open-stdin-no-file-or-directory export DEBIAN_FRONTEND=noninteractive - apt-get --yes install asciinema expect + apt-get --yes install asciinema expect jq SCRIPT end diff --git a/docs/asciinema/scenarios/examples-game-logging.exp b/docs/asciinema/scenarios/examples-game-logging.exp new file mode 100755 index 0000000000..393cc2a056 --- /dev/null +++ b/docs/asciinema/scenarios/examples-game-logging.exp @@ -0,0 +1,164 @@ +#!/usr/bin/expect -f + +# Assumptions: +# - run as root (required to run zarf) +# - invocation working dir is /build (where zarf binary is) + +# Refs: +# - https://linux.die.net/man/1/expect +# - https://www.tcl.tk/man/tcl8.6/TclCmd/contents.html + + +# variables / config +set env(PATH) "$::env(PATH):[file normalize .]" ; # add zarf to path +set gamedir "[file normalize ../examples/game]" +set rcfile "/tmp/asciinema-rcfile" +set title [ + file tail [ file rootname [lindex $argv0] ] +] +set recording [lindex $argv 0] +set log [lindex $argv 1] +log_file $log +set send_human {.1 .2 10 .05 1} ; # "human-like" typing speeds on 'send -h' +set env(PS1) {\[\033[01;32m\]root@host\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# } ; # custom terminal input prompt +set prompt ".*root@host.*:.*# $" +#match_max 25000 +#set expect_out(buffer) {} +#set down_key "\033\[B" + + +# proc defs +proc wait_input { {timeout 10} } { + global prompt + expect -timeout $timeout -re $prompt +} + +proc input_wait { {seconds 1} } { + wait_input ; sleep $seconds +} + +proc comment { {text " "} } { + send "# --> " ; send -h "$text \r\r" ; input_wait 1 +} + +proc do { {cmd "\r"} {timeout 2} } { + send -h "$cmd" ; sleep 1 ; send "\r\r" ; input_wait $timeout +} + +proc wait_for { {predicate "1 = 1"} {timeout 120} } { + set template { + START="$SECONDS" + until [ ||predicate|| ] ; do + sleep 2 + if [ "$(( $SECONDS - $START ))" -gt "||timeout||" ] ; then + echo -e "\nwait_for::timeout!\n" > /dev/tty ; exit 1 + fi + done + } + set script [ string map [ list \ + ||predicate|| $predicate \ + ||timeout|| $timeout \ + ] $template ] + set result [ system "/bin/bash -c '$script'" ] +} + +proc clean {} { + global gamedir + global rcfile + + spawn bash --norc + send "rm -f $gamedir/*.tar.zst $rcfile\r" + send "zarf destroy --confirm\r" + send "exit\r" + expect eof +} + +proc setup {} { + global rcfile + + spawn bash --norc + send "echo 'alias ls=\"ls --color=auto\"' > $rcfile\r" ; expect * + send "echo 'alias grep=\"grep --color=auto\"' >> $rcfile\r" ; expect * + send "echo 'export PS1=\"$::env(PS1)\"' >> $rcfile\r" ; expect * + send "echo 'export GREP_COLOR=\"01;97;100\"' >> $rcfile\r" ; expect * + send "exit\r" + expect eof +} + + +# filesystem to ready state +clean +setup + + +# prep cluster +spawn bash --norc + +send -h "zarf init --host=localhost --components=management --confirm\r" +expect -timeout 120 -re {.*Grafana Username[^=]*=([^\s]*)} +set grafana_user $expect_out(1,string) +expect -re {.*Password \(all\)[^=]*="([^"]*)"} +set grafana_pass $expect_out(1,string) +expect -re $prompt + +send -h "cd $gamedir\r" ; wait_input +send -h "zarf package create --confirm\r" ; wait_input 120 + +wait_for {$( curl -o /dev/null -s -w '%{http_code}' https://localhost/v2 ) == '404'} +send -h "zarf package deploy zarf-\t --confirm\r" ; wait_input 120 + +wait_for {$( curl -o /dev/null -s -w '%{http_code}' https://localhost ) == '200'} +send -h "exit\r" +expect eof + + +# start recording & wait for input prompt +spawn asciinema rec \ + --command "/bin/bash --rcfile $rcfile" \ + --title "$title" \ + --idle-time-limit 3 \ + --overwrite \ + $recording +expect -re {asciinema: .* done} ; wait_input + +comment "cluster up?" +do "kubectl cluster-info" ; wait_input + +comment "game running?" +do "kubectl get pod -l app=game"; wait_input + +comment "install logging component" +send -h "zarf init --host=localhost --components=logging --confirm\r\r" +wait_input 120 + +comment "PLG stack up?" +wait_for {$( curl -o /dev/null -sL -w '%{http_code}' https://localhost/monitor ) == '200'} +system {kubectl wait -n logging pods --all --for=condition=Ready --selector=release=loki --timeout=120s} +do "kubectl get pods -n logging" ; wait_input + +comment "call game to generate logs" +do "curl -sL https://localhost | grep -e '^' -e 'main(.*$'" + +# wait for logs to propagate to grafana +sleep 60 + +comment "pod logs available to grafana (via loki)?" +send -h "curl -sL -u '" +send "$grafana_user:$grafana_pass" +send -h "' \\\r" +send { 'https://localhost/monitor/api/datasources/proxy/1/loki/api/v1/query_range?direction=BACKWARD&limit=1&query=%7Bapp%3D"game"%7D'} +send -h "\\\r" +send -h " | jq '.data.result' \\\r" +send -h { | grep -e '^' -e '".*stdout.*$'} +send -h "\r\r" +wait_input 60 + +comment "and finally, to cleanup" +send -h "zarf destroy --confirm\r\r" +wait_input 60 + +comment "its gone!" +do "kubectl cluster-info" + +comment "success!" +do "exit" diff --git a/examples/game/add-logging.md b/examples/game/add-logging.md new file mode 100644 index 0000000000..7bc850202e --- /dev/null +++ b/examples/game/add-logging.md @@ -0,0 +1,156 @@ +# Zarf Components - Add Logging + +This example demonstrates using a [Zarf component](./components.md) to inject zero-config, centralized logging into your Zarf cluster. + +More specifically, you'll be adding a [Promtail / Loki / Grafana (PLG)](https://github.com/grafana/loki) stack to the example game cluster by installing Zarf's "logging" component. + +  + + +## The Flow + + +asciicast + + +Here's what you'll do in this example: + +1. [Get ready](#get-ready) + +1. [Install the logging component](#install-the-logging-component) + +1. [Note the credentials](#note-the-credentials) + +1. [Check the logs](#check-the-logs) + +1. [Cleanup](#cleanup) + +  + +  + + +## Get ready + + +asciicast + + +This scenario builds upon the previous one, so: + +1. Run through the [Zarf game example](./README.md) again but _**don't** do the cleanup step_ — you're setup correctly once you can pull the game up in your browser. + +1. Take a deep breath—because it's good for your body—and read on! + +  + +  + + +## Install the logging component + + +asciicast + + +Installing a Zarf component is _really_ easy—you just have to let `zarf init` know that you want use it. That's it! + +Exactly like when you first created the game example cluster, you _move into the directory holding your init package_ and run: + +```sh +cd +zarf init +``` + +You can answer the follow-on prompts in almost the exact same way as during your original install _**except** this time answer "yes" when asked whether to install the "logging" component_. + +Give it some time for the new logging pods to come up and you're ready to go! + + > _**Note**_ + > + > You can install components as part of new cluster installs too (obviously)—there's no need to update afterward if you already know you need a component. + + > _**Note**_ + > + > Zarf supports non-interactive installs too! See `zarf init --help` for how to make that work. + +  + + +## Note the credentials + +Go back to your terminal and review the `zarf init` command output—the very last thing printed should be a set of credentials Zarf has generated for you. + +Pay attention to these because you're going to need them to log into your shiny, new [Grafana](https://grafana.com/docs/) installation. + +The line you want will look something like this: + +```sh +WARN[0026] Credentials stored in ~/.git-credentials Gitea Username (if installed)=zarf-git-user Grafana Username=zarf-admin Password (all)="AbCDe0fGH12IJklMnOPQRSt~uVWx" +``` + +Pull out the `Grafana Username` and `Password (all)` values & save them for later. + +  + + +## Check the logs + + +asciicast + + +We've only _just_ installed the logging utilities so we (likely) haven't had time to record anything interesting. Since log aggregation & monitoring aren't worth much without something to collect, let's get some data in there. + +  + + +### Generate some traffic + +Pull up the game in your brower—_[instructions here](./README.md#space-marine-the-demon-invasion), in case you forgot how_—and then reload the browser window a few times. + +Doing that sends a bunch of HTTP traffic into the cluster & should give you something worth looking at in Grafana. + +  + + +### Get into Grafana + + +dosbox + + +Now that you've got some logs worth looking at, you're ready to log into your brand new Grafana instance. + +Get started by navigating your browser to: `https://localhost/monitor/explore`. + +You'll be redirected the `/login` page where you have to sign in with the Grafana credentials you saved [in a previous step](#note-the-credentials). + +Once you've successfully logged in you will be redirected back to: + +1. the `monitor/explore` page, where + +1. you can select `Loki` in the dropdown, and then + +1. enter `{app="game"}` into the Log Browser query input field + +Submit that query and you'll get back a dump of all the game pod logs that Loki has collected. Neat! + +  + + +## Cleanup + + +asciicast + + +Once you've had your fun it's time to clean up. + +In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster: + +```sh +zarf destroy --confirm +``` + +It takes just a couple moments for the _entire Zarf cluster_ to disappear—long-running system services and all—leaving your machine squeaky clean.