From a2bc48c12110712fd06f882196e187fd87d65b91 Mon Sep 17 00:00:00 2001 From: chrislovecnm Date: Mon, 23 Jul 2018 16:21:48 -0700 Subject: [PATCH] initial checkin of gke logging sinks demo --- .gitignore | 39 +++ CONTRIBUTING.md | 23 ++ LICENSE | 201 ++++++++++++++ Makefile | 60 +++++ README.md | 233 ++++++++++++++++ docs/application-screen.png | Bin 0 -> 2408 bytes docs/bigquery.png | Bin 0 -> 149269 bytes docs/cloudstoragebucket.png | Bin 0 -> 79416 bytes docs/logging-architecture.png | Bin 0 -> 72313 bytes docs/loggingconsole.png | Bin 0 -> 130104 bytes generate-tfvars.sh | 75 ++++++ main.tf | 136 ++++++++++ provider.tf | 22 ++ scripts/enable-apis.sh | 32 +++ test/boilerplate/boilerplate.Dockerfile.txt | 13 + test/boilerplate/boilerplate.Makefile.txt | 13 + test/boilerplate/boilerplate.go.txt | 15 ++ test/boilerplate/boilerplate.py.txt | 13 + test/boilerplate/boilerplate.sh.txt | 13 + test/boilerplate/boilerplate.tf.txt | 15 ++ test/boilerplate/boilerplate.xml.txt | 15 ++ test/boilerplate/boilerplate.yaml.txt | 13 + test/make.sh | 87 ++++++ test/verify_boilerplate.py | 279 ++++++++++++++++++++ variables.tf | 31 +++ 25 files changed, 1328 insertions(+) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100755 docs/application-screen.png create mode 100644 docs/bigquery.png create mode 100644 docs/cloudstoragebucket.png create mode 100755 docs/logging-architecture.png create mode 100644 docs/loggingconsole.png create mode 100755 generate-tfvars.sh create mode 100644 main.tf create mode 100644 provider.tf create mode 100755 scripts/enable-apis.sh create mode 100644 test/boilerplate/boilerplate.Dockerfile.txt create mode 100644 test/boilerplate/boilerplate.Makefile.txt create mode 100644 test/boilerplate/boilerplate.go.txt create mode 100644 test/boilerplate/boilerplate.py.txt create mode 100644 test/boilerplate/boilerplate.sh.txt create mode 100644 test/boilerplate/boilerplate.tf.txt create mode 100644 test/boilerplate/boilerplate.xml.txt create mode 100644 test/boilerplate/boilerplate.yaml.txt create mode 100755 test/make.sh create mode 100644 test/verify_boilerplate.py create mode 100644 variables.tf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a677852 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# OSX leaves these everywhere on SMB shares +._* + +# OSX trash +.DS_Store + +# Emacs save files +*~ +\#*\# +.\#* + +# Vim-related files +[._]*.s[a-w][a-z] +[._]s[a-w][a-z] +*.un~ +Session.vim +.netrwhist + +### https://raw.github.com/github/gitignore/90f149de451a5433aebd94d02d11b0e28843a1af/Terraform.gitignore + +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log + +# Ignore any .tfvars files that are generated automatically for each Terraform run. Most +# .tfvars files are managed as part of configuration and so should not be included in +# version control. +# +# example.tfvars + +terraform.tfvars + +*.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5ab3809 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution; +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to https://cla.developers.google.com/ to see your +current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it again. + +## Code reviews +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult GitHub Help for more +information on using pull requests. + +## Community Guidelines +This project follows +[Google's Open Source Community Guidelines](CODE-OF-CONDUCT.md). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e5fc621 --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Make will use bash instead of sh +SHELL := /usr/bin/env bash + +# All is the first target in the file so it will get picked up when you just run 'make' on its own +all: check_shell check_python check_golang check_terraform check_docker check_base_files check_headers check_trailing_whitespace + +# The .PHONY directive tells make that this isn't a real target and so +# the presence of a file named 'check_shell' won't cause this target to stop +# working +.PHONY: check_shell +check_shell: + @source test/make.sh && check_shell + +.PHONY: check_python +check_python: + @source test/make.sh && check_python + +.PHONY: check_golang +check_golang: + @source test/make.sh && golang + +.PHONY: check_terraform +check_terraform: + @source test/make.sh && check_terraform + +.PHONY: check_docker +check_docker: + @source test/make.sh && docker + +.PHONY: check_base_files +check_base_files: + @source test/make.sh && basefiles + +.PHONY: check_shebangs +check_shebangs: + @source test/make.sh && check_bash + +.PHONY: check_trailing_whitespace +check_trailing_whitespace: + @source test/make.sh && check_trailing_whitespace + +.PHONY: check_headers +check_headers: + @echo "Checking file headers" + @python test/verify_boilerplate.py + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e224ec5 --- /dev/null +++ b/README.md @@ -0,0 +1,233 @@ +# Logging with Stackdriver on Kubernetes Engine + +## Table of Contents + +* [Introduction](#introduction) +* [Architecture](#architecture) +* [Prerequisites](#prerequisites) + * [Enable GCP APIs](#enable-gcp-apis) + * [Install Cloud SDK](#install-cloud-sdk) + * [Install Terraform](#install-terraform) +* [Deployment](#deployment) + * [How does it work?](#how-does-it-work) + * [Running Terraform](#running-terraform) +* [Validation](#validation) + * [Generating Logs](#generating-logs) + * [Logs in the Stackdriver UI](#logs-in-the-stackdriver-ui) + * [Logs in Cloud Storage](#logs-in-cloud-storage) + * [Logs in BigQuery](#logs-in-bigquery) +* [Teardown](#teardown) + * [Next Steps](#next-steps) +* [Troubleshooting](#troubleshooting) +* [Relevant Material](#relevant-material) + +## Introduction +A common goal of cloud computing is to abstract away operational tasks from applications so that developer efforts can focus on providing business value. One feature common to most applications is the need to accumulate logs and to provide for the ability to search them. On [Google Cloud Platform (GCP)](https://cloud.google.com/) the [Stackdriver](https://cloud.google.com/stackdriver/) suite of products addresses the need for logging in addition to other related features such as monitoring and tracing. + +Stackdriver Logging can be used to log from all GCP resources as well as any custom resources (on other platforms) to allow for one centralized store for all logs and metrics. Logs are aggregated and then viewable within the provided Stackdriver Logging UI. They can also be [exported to Sinks](https://cloud.google.com/logging/docs/export/configure_export_v2) to support more specialized of use cases. Currently, Stackdriver Logging supports exporting to the following sinks: +* Cloud Storage +* Pub/Sub +* BigQuery + +This document will describe the steps required to deploy a sample application to Kubernetes Engine that forwards log events to [Stackdriver Logging](https://cloud.google.com/logging/). It makes use of [Terraform](https://www.terraform.io/), a declarative [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_Code) tool that enables configuration files to be used to automate the deployment and evolution of infrastructure in the cloud. The configuration will also create a Cloud Storage bucket and a BigQuery dataset for exporting log data to. + +## Architecture + +The Terraform configurations are going to build a Kubernetes Engine cluster that will generate logs and metrics that can be ingested by Stackdriver. The scripts will also build out Logging Export Sinks for Cloud Storage, BigQuery, and Cloud Pub/Sub. The diagram of how this will look along with the data flow can be seen in the following graphic. + +![Logging Architecture](docs/logging-architecture.png) + +## Prerequisites + +The steps described in this document require the installation of several tools and the proper configuration of authentication to allow them to access your GCP resources. + +### Cloud Project + +You'll need access to a Google Cloud Project with billing enabled. See **Creating and Managing Projects** (https://cloud.google.com/resource-manager/docs/creating-managing-projects) for creating a new project. To make cleanup easier it's recommended to create a new project. + +### Required GCP APIs + +The following APIs will be enabled in the +* Cloud Resource Manager API +* Kubernetes Engine API +* Stackdriver Logging API +* Stackdriver Monitoring API +* BigQuery API + +### Install Cloud SDK + +The Google Cloud SDK is used to interact with your GCP resources. [Installation instructions](https://cloud.google.com/sdk/downloads) for multiple platforms are available online. + +### Install Terraform + +Terraform is used to automate the manipulation of cloud infrastructure. Its [installation instructions](https://www.terraform.io/intro/getting-started/install.html) are also available online. + +### Configure Authentication + +The Terraform configuration will execute against your GCP environment and create various resources. The script will use your personal account to build out these resources. To setup the default account the script will use, run the following command to select the appropriate account: + +`gcloud auth application-default login` + +## Deployment + +### How does it work? + +Following the principles of [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_Code) and [Immutable Infrastructure](https://www.oreilly.com/ideas/an-introduction-to-immutable-infrastructure), Terraform supports the writing of declarative descriptions of the desired state of infrastructure. When the descriptor is applied, Terraform uses GCP APIs to provision and update resources to match. Terraform compares the desired state with the current state so incremental changes can be made without deleting everyingt and starting over. For instance, Terraform can build out GCP projects and compute instances, etc., even set up a Kubernetes Engine cluster and deploy applications to it. When requirements change, the descriptor can be updated and Terraform will adjust the cloud infrastructure accordingly. + +This example will start up a Kubernetes Engine cluster and deploy a simple sample application to it. By default, Kubernetes Engine clusters in GCP are provisioned with a pre-configured [Fluentd](https://www.fluentd.org/)-based collector that forwards logs to Stackdriver. Interacting with the sample app will produce logs that are visible in the Stackdriver Logging UI and other log event sinks. + +### Running Terraform + +#### One-time configuration +The terraform configuration takes two parameters to determine where the Kubernetes Engine cluster should be created: + +* project +* zone + +For simplicity, these parameters should be specified in a file named terraform.tfvars, in the terraform directory. To generate this file based on your glcoud defaults, run: + +./generate-tfvars.sh +This will generate a terraform/terraform.tfvars file with the following keys. The values themselves will match the output of gcloud config list: +``` +# Contents of terraform.tfvars +project="YOUR_PROJECT" +zone="YOUR_ZONE" +``` + +If you need to override any of the defaults, simply replace the desired value(s) to the right of the equals sign(s). Be sure your replacement values are still double-quoted. + + +#### Deploying the cluster + +There are three Terraform files provided with this example. The first one, `main.tf`, is the starting point for Terraform. It describes the features that will be used, the resources that will be manipulated, and the outputs that will result. The second file is `provider.tf`, which indicates which cloud provider and version will be the target of the Terraform commands--in this case GCP. The final file is `variables.tf`, which contains a list of variables that are used as inputs into Terraform. Any variables referenced in the `main.tf` that do not have defaults configured in `variables.tf` will result in prompts to the user at runtime. + +In order to run terraform, use the `deploy-cluster` Make target: +```console +make deploy-cluster +``` + +This target will initialize the necessary APIs for your project and then run terraform apply. + +You will be prompted to confirm before cluster resources are created. + +## Validation + +If no errors are displayed during deployment, after a few minutes you should see your Kubernetes Engine cluster in the [GCP Console](https://console.cloud.google.com/kubernetes) with the sample application deployed. + +Now that the application is deployed to Kubernetes Engine we can generate log data and use the [Stackdriver UI](https://console.cloud.google.com/logs) and other tools to view it. + +### Generating Logs + +The sample application that Terraform deployed serves up a simple web page. Each time you open this application in your browser the application will publish log events to Stackdriver Logging. Refresh the page a few times to produce several log events. + +To get the URL for the application page you must perform the following steps: + +1. In the GCP console navigate to the **Networking -> Network services** page. +2. On the default **Load balancing** page that shows up, click on the TCP load balancer that was setup. +3. On the **Load balancer details** page there is a top section labeled **Frontend**. Note the IP:Port value as this will be used in the upcoming steps. + +Using the IP:Port value you can now access the application. Go to a browser and enter the URL. The browser should return a screen that looks similar to the following: + +![Sample application screen](docs/application-screen.png) + +### Logs in the Stackdriver UI + +Stackdriver provides a UI for viewing log events. Basic search and filtering features are provided, which can be useful when debugging system issues. The Stackdriver Logging UI is best suited to exploring more recent log events. Users requiring longer-term storage of log events should consider some the tools in following sections. + +To access the Stackdriver Logging console perform the following steps: + +1. In the GCP console navigate to the **Stackdriver -> Logging** page. +2. The default logging console will load. On this page change the resource filter to be **GKE Container**. Your screen should look similar the screenshot below. +3. On this screen you can expand the bulleted log items to view more complete details about the log entry. + +![Logging Console](docs/loggingconsole.png) + +In the logging console you can perform any type of text search, or try the various filters by log type, log level, timeframe, etc. + +### Logs in Cloud Storage + +Log events can be stored in [Cloud Storage](https://cloud.google.com/storage/), an object storage system suitable for archiving data. Policies can be configured for Cloud Storage buckets that, for instance, allow aging data to expire and be deleted while more recent data can be stored with a variety of storage classes affecting price and availability. + +The Terraform configuration created a Cloud Storage Bucket named stackdriver-gke-logging- to which logs will be exported for medium to long-term archival. In this example, the Storage Class for the bucket is defined as Nearline because the logs should be infrequently accessed in a normal production environment (this will help to manage the costs of medium-term storage). In a production scenario this bucket may also include a lifecycle policy that moves the content to Coldline storage for cheaper long-term storage of logs. + +To access the Stackdriver logs in Cloud Storage perform the following steps: + +**Note:** The Cloud Storage Export is not populated immediately. It may take a few minutes for logs to appear. + +1. In the GCP console navigate to the **Storage -> Storage** page. +2. This loads the Cloud Storage Browser page. On the page find the Bucket with the name stackdriver-gke-logging-, and click on the name (which is a hyperlink). +3. This will show the details of the bucket. You should see a list of directories corresponding to pods running in the cluster (eg autoscaler, dnsmasq, etc.). + +![Cloud Storage Bucket](docs/cloudstoragebucket.png) + +On this page you can click into any of the named folders to browse specific log details like heapster, kubedns, sidecar, etc. + +### Logs in BigQuery + +Stackdriver log events can be configured to be published to [BigQuery](https://cloud.google.com/bigquery/), a data warehouse tool that supports fast, sophisticated, querying over large data sets. + +The Terraform configuration will create a BigQuery [DataSet](https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets) named gke_logs_dataset. This dataset will be setup to include all Kubernetes Engine related logs for the last hour (by setting a Default Table Expiration for the dataset). A Stackdriver Export will be created that pushes Kubernetes Engine container logs to the dataset. + +To access the Stackdriver logs in BigQuery perform the following steps: + +**Note:** The BigQuery Export is not populated immediately. It may take a few minutes for logs to appear. + +1. In the GCP console navigate to the **Big Data -> BigQuery** page. +2. This loads a new browser tab with the BigQuery console. +3. On the left hand console you will have a display of the datasets you have access to. You should see a dataset named **gke_logs_dataset**. Expand this dataset to view the tables that exist (**Note:** The dataset is created immediately, but the tables are what is generated as logs are written and new tables are needed). +4. Click on one of the tables to view the table details. Your screen should look similar to the screenshot below. +5. Review the schema of the table to note the column names and their data types. This information can be used in the next step when we query the table to look at the data. + +![BigQuery](docs/bigquery.png) + +5. Click on the **Query Table** towards the top right to perform a custom query against the table. +6. This opens the query window. You can simply add an asterisk (*) after the **Select** in the window to pull all details from the current table. **Note:**A 'Select *' query is generally very expensive and not advised. For this tutorial the dataset is limited to only the last hour of logs so the overall dataset is relatively small. +7. Click the **Run Query** button to execute the query and return some results from the table. +8. A popup window till ask you to confirm running the query. Click the **Run Query** button on this window as well. +9. The results window should display some rows and columns. You can scroll through the various rows of data that are returned, or download the results to a local file. +10. Execute some custom queries that filter for specific data based on the results that were shown in the original query. + + +## Teardown + +When you are finished with this example you will want to clean up the resources that were created so that you avoid accruing charges: + +``` +$ terraform destroy +``` + +Since Terraform tracks the resources it created it is able to tear them all down. + +### Next Steps + +Having used Terraform to deploy an application to Kubernetes Engine, generated logs, and viewed them in Stackdriver, you might consider exploring [Stackdriver Monitoring](https://cloud.google.com/monitoring/) and [Stackdriver Tracing](https://cloud.google.com/trace/). Examples for these topics are available [here](../README.md) and build on the work performed with this document. + +## Troubleshooting + +** The install script fails with a `Permission denied` when running Terraform. ** +The credentials that Terraform is using do not provide the +necessary permissions to create resources in the selected projects. Ensure +that the account listed in `gcloud config list` has necessary permissions to +create resources. If it does, regenerate the application default credentials +using `gcloud auth application-default login`. + +** Cloud Storage Bucket not populated ** +Once the Terraform configuration is complete the Cloud Storage Bucket will be created +but it is not always populated immediately with log data from the Kubernetes Engine cluster. The logs +details rarely populate in the bucket immediately. Give the process some time (minimum of 15 +minutes) before determining that something is not working proplerly. + +** No tables created in the BigQuery dataset ** +Once the Terraform configuration is complete the BigQuery Dataset will be created +but it will not always have tables created in it by the time you go to review the results. The +tables are rarely populated immediately. Give the process some time (minimum of 15 minutes) +before determining that something is not working properly. + + +## Relevant Material +* [Kubernetes Engine Logging](https://cloud.google.com/kubernetes-engine/docs/how-to/logging) +* [Viewing Logs](https://cloud.google.com/logging/docs/view/overview) +* [Advanced Logs Filters](https://cloud.google.com/logging/docs/view/advanced-filters) +* [Overview of Logs Exports](https://cloud.google.com/logging/docs/export/) +* [Procesing Logs at Scale Using Cloud Dataflow](https://cloud.google.com/solutions/processing-logs-at-scale-using-dataflow) +* [Terraform Google Cloud Provider](https://www.terraform.io/docs/providers/google/index.html) diff --git a/docs/application-screen.png b/docs/application-screen.png new file mode 100755 index 0000000000000000000000000000000000000000..2fcad9e9513b39c59cb1859c13d6d355c438586f GIT binary patch literal 2408 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 DwYr+m literal 0 HcmV?d00001 diff --git a/docs/bigquery.png b/docs/bigquery.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6fcdeb89e6f7299ba690feb3ed9d816dd05aec GIT binary patch literal 149269 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