From 94638ac7e221100b263d6b8494aaa97c381144b8 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Thu, 13 Dec 2018 14:38:01 +0100 Subject: [PATCH 01/16] Allow for configurable PROJECT_ID in kubernetes config files --- services/cluster.sh | 15 +++++++++++---- services/kubernetes/browse-controller.yaml | 2 +- services/kubernetes/home-controller.yaml | 4 +++- services/kubernetes/locate-controller.yaml | 4 +++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/services/cluster.sh b/services/cluster.sh index 1d20aad..4374ac4 100755 --- a/services/cluster.sh +++ b/services/cluster.sh @@ -15,9 +15,15 @@ set -e -MACHINE_TYPE=g1-small ZONE=us-central1-f -NUM_NODES=1 + +MACHINE_TYPE=f1-micro +NUM_NODES=3 + +#MACHINE_TYPE=g1-small +#MACHINE_TYPE=n1-standard-1 +#NUM_NODES=1 + PROJECT_ID=${1} CLUSTER_NAME=${2} COMMAND=${3} @@ -41,8 +47,8 @@ fi case "$COMMAND" in up ) echo "* Creating Google Container Engine cluster ${CLUSTER_NAME} under project ${PROJECT_ID}..." + # --scopes monitoring,logging-write \ gcloud container clusters create ${CLUSTER_NAME} \ - --scopes monitoring,logging-write \ --project ${PROJECT_ID} \ --machine-type ${MACHINE_TYPE} \ --zone ${ZONE} \ @@ -52,7 +58,8 @@ case "$COMMAND" in echo -e "\n* Deploying microservices Replication Controllers..." for f in `ls kubernetes/*-controller.yaml`; do - kubectl create -f $f + # DEBUG f=kubernetes/browse-controller.yaml + envsubst < $f | kubectl create -f - done echo -e "\n* Deploying microservices Services..." diff --git a/services/kubernetes/browse-controller.yaml b/services/kubernetes/browse-controller.yaml index d4dcb52..a68b9de 100644 --- a/services/kubernetes/browse-controller.yaml +++ b/services/kubernetes/browse-controller.yaml @@ -33,7 +33,7 @@ spec: spec: containers: - name: sample-browse-service - image: gcr.io/cloud-solutions-images/sample-browse-service:latest + image: gcr.io/${PROJECT_ID}/sample-browse-service:latest ports: - name: browse-http containerPort: 8100 diff --git a/services/kubernetes/home-controller.yaml b/services/kubernetes/home-controller.yaml index 7508342..1d479c5 100644 --- a/services/kubernetes/home-controller.yaml +++ b/services/kubernetes/home-controller.yaml @@ -33,7 +33,9 @@ spec: spec: containers: - name: sample-home-service - image: gcr.io/cloud-solutions-images/sample-home-service:latest + ## note that kubectl will not perform this variable substiution + ## see https://serverfault.com/questions/791715/using-environment-variables-in-kubernetes-deployment-spec + image: gcr.io/${PROJECT_ID}/sample-home-service:latest ports: - name: home-http containerPort: 8000 diff --git a/services/kubernetes/locate-controller.yaml b/services/kubernetes/locate-controller.yaml index 57aa4ba..affbd57 100644 --- a/services/kubernetes/locate-controller.yaml +++ b/services/kubernetes/locate-controller.yaml @@ -33,7 +33,9 @@ spec: spec: containers: - name: sample-locate-service - image: gcr.io/cloud-solutions-images/sample-locate-service:latest + ## note that kubectl will not perform this variable substiution + ## see https://serverfault.com/questions/791715/using-environment-variables-in-kubernetes-deployment-spec + image: gcr.io/${PROJECT_ID}/sample-locate-service:latest ports: - name: locate-http containerPort: 8200 From 501f5ca7abd46a1ddc26bbb3c57fb8597e8af7a8 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Thu, 13 Dec 2018 14:38:31 +0100 Subject: [PATCH 02/16] Replaced hardcoded user and project-id with variables --- services/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/Makefile b/services/Makefile index c122e00..6e36e98 100644 --- a/services/Makefile +++ b/services/Makefile @@ -22,15 +22,15 @@ build: image: $(foreach s, $(services), \ - docker build -t crcsmnky/sample-$(s)-service $(s) ;) + docker build -t ${USER}/sample-$(s)-service $(s) ;) tag: $(foreach s, $(services), \ - docker tag -f crcsmnky/sample-$(s)-service gcr.io/$(project)/sample-$(s)-service ;) + docker tag ${USER}/sample-$(s)-service gcr.io/${PROJECT_ID}/sample-$(s)-service ;) push: $(foreach s, $(services), \ - gcloud docker --project $(project) push gcr.io/$(project)/sample-$(s)-service ;) + docker push gcr.io/${PROJECT_ID}/sample-$(s)-service ;) clean: $(foreach s, $(services), \ From 1df3b9a5b6ff86c2dd6629f81f59a1f67d89a16c Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Fri, 14 Dec 2018 10:38:46 +0100 Subject: [PATCH 03/16] fixed log sink filter --- services/logging.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/services/logging.sh b/services/logging.sh index 6de55af..1a91968 100755 --- a/services/logging.sh +++ b/services/logging.sh @@ -119,15 +119,19 @@ case "$MODE" in # error_exit "gs://${GCS_BUCKET} exists, please choose a new bucket name" # fi + # Create a Cloud Storage Bucket gsutil -q mb gs://${GCS_BUCKET} + # Allow Stackdriver Logging access to the bucket gsutil -q acl ch -g cloud-logs@google.com:O gs://${GCS_BUCKET} + echo "done" + # For each microservice, set up Stackdriver Logging exports echo -n "* Creating Log Export sinks..." for s in ${SERVICE_NAMES[@]}; do gcloud beta logging sinks create ${s} \ storage.googleapis.com/${GCS_BUCKET} \ - --log="${s}" \ + --log-filter="resource.type=\"container\" \"${s}\"" \ --project=${PROJECT_ID} \ --quiet >/dev/null || error_exit "Error creating Log Export sinks" done @@ -137,8 +141,6 @@ case "$MODE" in echo -n "* Deleting Log Export sinks..." for s in ${SERVICE_NAMES[@]}; do gcloud beta logging sinks delete ${s} \ - --log="${s}" \ - --project=${PROJECT_ID} \ --quiet >/dev/null || error_exit "Error deleting Log Export Sinks" done echo "done" From e252d380420cc544859e29af7d11459c9ffe8818 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Fri, 14 Dec 2018 10:39:09 +0100 Subject: [PATCH 04/16] Extended documentation --- README.md | 176 +++++++++++++++++++++++++++++--- images/overview.png | Bin 0 -> 9293 bytes images/stackdriver_gke_logs.png | Bin 0 -> 124866 bytes 3 files changed, 159 insertions(+), 17 deletions(-) create mode 100644 images/overview.png create mode 100644 images/stackdriver_gke_logs.png diff --git a/README.md b/README.md index 3c62c37..29bd868 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,13 @@ This tutorial demonstrates how to use [Google Cloud Dataflow](http://cloud.googl For details about how the tutorial works, see [Processing Logs at Scale Using Cloud Dataflow](http://cloud.google.com/solutions/processing-logs-at-scale-using-dataflow) on the Google Cloud Platform website. + +## Architecture Overview + +In this solution, a set of sample microservices run on [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/) to implement a website. [Stackdriver Logging](https://cloud.google.com/logging/) collects logs from these services and then saves them to [Google Cloud Storage](https://cloud.google.com/storage/) buckets. [Google Cloud Dataflow](https://cloud.google.com/dataflow/) then processes the logs by extracting metadata and computing basic aggregations. The Cloud Dataflow pipeline is designed to process the log elements daily to generate aggregate metrics for server response times, based on the logs for each day. Finally, the output from Cloud Dataflow is loaded into [Google BigQuery](https://cloud.google.com/bigquery/) tables, where it can be analyzed to provide business intelligence. + +![](images/overview.png) + ## Prerequisites * [Java JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) (version 1.7 or greater) @@ -20,10 +27,31 @@ After installing the Google Cloud SDK, run `gcloud components update` to install * gcloud app Python Extensions * kubectl +Define names for resources + +```bash +# cd ~/projects/gcp/misc/processing-logs-using-dataflow +export PROJECT_HOME=$(pwd) + +export PROJECT_ID="new-logs-demo" ## pick your favorite name here +export CLUSTER_NAME="my-first-cluster-9995" +export BUCKET_NAME=${PROJECT_ID}-data-bucket + +# BigQuery dataset name, must be alphanumeric (plus underscores) +export DATASET_NAME=$(echo ${PROJECT_ID}-bq-data | tr "-" "_" ) +``` + + Set your preferred zone and project: +```bash +# Configure GCP for project +# gcloud config set compute/zone ZONE # e.g. +#gcloud config set compute/zone europe-west1 +gcloud config set compute/zone us-central1-f + +gcloud config set project ${PROJECT_ID} +``` - $ gcloud config set compute/zone ZONE - $ gcloud config set project PROJECT-ID Ensure the following APIs are enabled in the [Google Cloud Console](https://console.developers.google.com/). Navigate to **API Manager** and enable: @@ -34,35 +62,128 @@ Ensure the following APIs are enabled in the [Google Cloud Console](https://cons * Google Cloud Storage * Google Container Engine + +Or use the shell to enable them https://cloud.google.com/endpoints/docs/openapi/enable-api + +```bash +gcloud services list --available | grep container + +gcloud services enable container.googleapis.com +gcloud services enable containerregistry.googleapis.com +``` + +Typically the other permission are already enabled by default when using a test-GCP account. + ## Sample Web Applications -The `services` folder contains three simple applications built using [Go](http://golang.org) and the [Gin](https://github.com/gin-gonic/gin) HTTP web framework. These applications generate the logs to be analyzed by the Dataflow pipeline. The applications have been packaged as Docker images and are available through [Google Container Registry](https://gcr.io). **Note:** If you are interested in editing/updating these applications, refer to the [README](https://github.com/GoogleCloudPlatform/dataflow-log-analytics/tree/master/services). +The `services` folder contains three simple applications built using [Go](http://golang.org) and the [Gin](https://github.com/gin-gonic/gin) HTTP web framework. **These applications generate the logs to be analyzed by the Dataflow pipeline.** The applications have been packaged as Docker images and are available through [Google Container Registry](https://gcr.io). **Note:** If you are interested in editing/updating these applications, refer to the [README](https://github.com/GoogleCloudPlatform/dataflow-log-analytics/tree/master/services). In the `services` folder, there are several scripts you can use to facilitate deployment, configuration, and testing of the sample web applications. ### Deploy the Container Engine cluster -First, change the current directory to `services`: +First, we need to build the project and [push the images](https://cloud.google.com/container-registry/docs/pushing-and-pulling) to the registry + +```bash +cd ${PROJECT_HOME}/services + +gcloud auth configure-docker + +make build image tag push +``` - $ cd dataflow-log-analytics/services +We can checkout the images in _Container Registry_ UI +``` +open https://console.cloud.google.com/gcr/images/new-logs-demo?project=${PROJECT_ID} +``` Next, deploy the Container Engine cluster with the sample web applications: - $ ./cluster.sh PROJECT-ID CLUSTER-NAME up + +```bash +./cluster.sh ${PROJECT_ID} ${CLUSTER_NAME} up + +## to shut it down use +# ./cluster.sh ${PROJECT_ID} ${CLUSTER_NAME} down + +## to inspect cluster structure see +open https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-f/${CLUSTER_NAME}?${PROJECT_ID} + + +## to test the services extract the public IPs and e.g. do +curl http://35.224.38.74:8100/browse/category/23 + +## to reconnect to an existing cluster to use +## see https://cloud.google.com/kubernetes-engine/docs/quickstart#create_cluster +#gcloud container clusters list +gcloud container clusters get-credentials ${CLUSTER_NAME} +kubectl get pods ## or do something else with the cluster +``` + The script will deploy a single-node Container Engine cluster, deploy the web applications, and expose the applications as Kubernetes services. +Check if there were any issues with the deployment! The cluster may not contain enough cpu power (g1-small -> 0.5 vCPU but (_Die Standard-CPU-Anfrage beträgt 100 MB oder 10 % einer CPU bzw. eines Kerns._). Also see https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-cpu + + ### Set up Cloud Logging -The next step is to configure Cloud Logging to export the web application logs to Google Cloud Storage. The following script first creates a Cloud Storage bucket, configures the appropriate permissions, and sets up automated export from the web applications to Cloud Storage. **Note:** the `BUCKET-NAME` should not be an existing Cloud Storage bucket. - $ ./logging.sh PROJECT-ID BUCKET-NAME batch up +By default, Stackdriver logging collects only your container's standard output and standard error streams. It can be configured to also collect any logs your application writes to a file. + +![](images/stackdriver_gke_logs.png) + +The next step is to configure Cloud Logging to export the web application logs to Google Cloud Storage. The following script first creates a Cloud Storage bucket, configures the appropriate permissions, and sets up automated export from the web applications to Cloud Storage. **Note:** the `${BUCKET_NAME}` should not be an existing Cloud Storage bucket. + +For details see https://cloud.google.com/kubernetes-engine/docs/how-to/logging, https://cloud.google.com/storage/docs/gsutil/commands/mb and https://cloud.google.com/sdk/gcloud/reference/beta/logging/sinks/create + + + +```bash +cd ${PROJECT_HOME}/services + +./logging.sh ${PROJECT_ID} ${BUCKET_NAME} batch up + +# ./logging.sh ${PROJECT_ID} ${BUCKET_NAME} batch down + +## to check that the sinks were correctly created run +gcloud logging sinks list +``` + +We can list the created buckets with `gsutil ls`. + +The sinks are listed in the GCP UI under +```bash +open https://console.cloud.google.com/logs/exports?project=${PROJECT_ID} +``` + + +To ensure that data is logged we can create an event and listen on the pod logs +``` +kubectl logs -f browse-service-2djpb & + + +## TODO adjust IP based on `kubectl get services` +curl http://35.224.38.74:8100/browse/category/23 +curl http://35.202.0.152:8200/locate/55?zipcode=12345 +``` + + +Finally, we can open the bucket directly +``` +open https://console.cloud.google.com/storage/browser/${BUCKET_NAME} +``` + ### Generate requests Now that the applications have been deployed and are logging through Cloud Logging, you can use the following script to generate requests against the applications: - $ ./load.sh REQUESTS CONCURRENCY +```bash +# Usage./load.sh REQUESTS CONCURRENCY +./load.sh 100 2 +./load.sh 1 1 +``` This script uses Apache Bench [ab](https://httpd.apache.org/docs/2.2/programs/ab.html) to generate load against the deployed web applications. `REQUESTS` controls how many requests are issued to each application and `CONCURRENCY` controls how many concurrent requests are issued. The logs from the applications are sent to Cloud Storage in hourly batches, and it can take up to two hours before log entries start to appear. For more information, see the [Cloud Logging documentation](https://cloud.google.com/logging/docs/export/using_exported_logs). @@ -70,6 +191,11 @@ This script uses Apache Bench [ab](https://httpd.apache.org/docs/2.2/programs/ab For information on examining logs or log structure in Cloud Storage, see the [Cloud Logging documentation](https://cloud.google.com/logging/docs/export/using_exported_logs#log_entries_in_google_cloud_storage). +Check if the logs arrived in the _GCP Logging_ `open https://console.cloud.google.com/logs/viewer?project=${PROJECT_ID}` + +Troubleshooting hints https://cloud.google.com/logging/docs/export/?hl=en_US&_ga=2.100645598.-1938216270.1543417411#troubleshooting + + ## Cloud Dataflow pipeline The following diagram shows the structure and flow of the example Dataflow pipeline: @@ -78,24 +204,40 @@ The following diagram shows the structure and flow of the example Dataflow pipel ### Create the BigQuery dataset -Before deploying the pipeline, create the BigQuery dataset where output from the Cloud Dataflow pipeline will be stored: +Before deploying the pipeline, [create the BigQuery dataset](https://cloud.google.com/bigquery/docs/datasets) where output from the Cloud Dataflow pipeline will be stored: + +```bash - $ gcloud alpha bigquery datasets create DATASET-NAME +bq mk ${DATASET_NAME} +``` ### Run the pipeline First, change the current directory to `dataflow`: - $ cd dataflow-log-analytics/dataflow +``` +cd ${PROJECT_HOME}/dataflow +``` + +Next, Run the pipeline. Replace `${BUCKET_NAME}` with the same name you used for the logging setup: -Next, Run the pipeline. Replace `BUCKET-NAME` with the same name you used for the logging setup: +```bash +./pipeline.sh ${PROJECT_ID} ${DATASET_NAME} ${BUCKET_NAME} run +``` - $ ./pipeline.sh PROJECT-ID DATASET-NAME BUCKET-NAME run This command builds the code for the Cloud Dataflow pipeline, uploads it to the specified staging area, and launches the job. To see all options available for this pipeline, run the following command: $ ./pipeline.sh + +In case it errors with +``` +DataflowRunner requires gcpTempLocation, but failed to retrieve a value from PipelineOptions: Unable to get application default credentials. Please see https://developers.google.com/accounts/docs/application-default-credentials +``` +you need to login with `gcloud auth application-default login` + + ### Monitoring the pipeline While the pipeline is running, you can see its status in the [Google Developers Console](https://console.developers.google.com). Navigate to **Dataflow** and then click the running job ID. You can see a graphical rendering of the pipeline and examine job logging output along with information about each pipeline stage. Here is an example screenshot of a running Cloud Dataflow job: @@ -112,14 +254,14 @@ To clean up and remove all resources used in this example: 1. Delete the BigQuery dataset: - $ gcloud alpha bigquery datasets delete DATASET-NAME + $ gcloud alpha bigquery datasets delete ${DATASET_NAME} 1. Deactivate the Cloud Logging exports. This step deletes the exports and the specified Cloud Storage bucket: $ cd dataflow-log-analytics/services - $ ./logging.sh PROJECT-ID BUCKET-NAME batch down + $ ./logging.sh ${PROJECT_ID} ${BUCKET_NAME} batch down 1. Delete the Container Engine cluster used to run the sample web applications: $ cd dataflow-log-analytics/services - $ ./cluster.sh PROJECT-ID CLUSTER-NAME down + $ ./cluster.sh ${PROJECT_ID} ${CLUSTER_NAME} down diff --git a/images/overview.png b/images/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..35509dac2207e6c8e00b805faa130183677cc4a8 GIT binary patch literal 9293 zcmd6tWl&sAx9@`u5G-U8TtWyAL4yn~!QI^@Sa8Wea0xbO0)q^}-Q8V+yTf1!?vTN` z^StM+x~J+r_rv{mzU>27h^4=5+ zfV>)>4O~Ba_U@IOl(?q%(osgZkET{jUx)wp+Kyi&o&=$4+`jmzm?(8U(jEga)YnH!G$Ah}{?}YS1eEAhJSQi=>XjC*Qe$wK!8UN58x;NADS*52CK~*9 z2AHLc7)Fd;d3Q|FjMOMkfDfUm>6@=dIU%ysPc=KGM$Jm>2~Rg%^CiMl>^kixYH#O{ zwW(>1)zoMN1Oz0`wAqE(1l~+pwad0mb~Q+ENoi9i6dI}6+7@l^?37%*CMK5gT{}EH zWFC+I{+;g89egmymIdqHYM6ezsxCP_J#F#v2X$Pbacs}VixrFeUi*^SVn1t3OIaQs z>zc*f%E~xU(S|C+tPVq;)m!`6Z>$SILj$|sIP)~;H)3d1EjV8MA9*R?Cnw9i*5+En zYagw+G|t563&Q=v^Z2(b7&Gr<6w!Gt*eU`X}jMHM4w6XKC@6EkzmyL-#iqR(+ALry870
= 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 literal 0 HcmV?d00001 diff --git a/images/stackdriver_gke_logs.png b/images/stackdriver_gke_logs.png new file mode 100644 index 0000000000000000000000000000000000000000..1e05daaed0241aca51475aa151bc3344c73c34f1 GIT binary patch literal 124866 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

j;-^=)_hqKLjBqj6-ZfR3A3#XoT! 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 k|15{PYyatIe!hCzb~`0vb-U5T Date: Fri, 14 Dec 2018 10:39:34 +0100 Subject: [PATCH 05/16] fixed incorrect runner name --- dataflow/pipeline.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataflow/pipeline.sh b/dataflow/pipeline.sh index ce13eaf..b5ee4eb 100755 --- a/dataflow/pipeline.sh +++ b/dataflow/pipeline.sh @@ -42,7 +42,7 @@ case "$COMMAND" in -Dexec.args="\ --project=${PROJECT_ID} \ --stagingLocation=gs://${BUCKET_NAME}/staging \ - --runner=BlockingDataflowPipelineRunner \ + --runner=DataflowRunner \ --homeLogSource=gs://${BUCKET_NAME}/sample-home-service/*/*/*/*.json \ --browseLogSource=gs://${BUCKET_NAME}/sample-browse-service/*/*/*/*.json \ --locateLogSource=gs://${BUCKET_NAME}/sample-locate-service/*/*/*/*.json \ From 5e6aaa8c8cc6cae3ffb924f057e87a2c96f01625 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Fri, 14 Dec 2018 10:39:55 +0100 Subject: [PATCH 06/16] removed LATEST with v2.5 for google cloud apis --- dataflow/pom.xml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dataflow/pom.xml b/dataflow/pom.xml index 88a7b7f..c65cf0a 100644 --- a/dataflow/pom.xml +++ b/dataflow/pom.xml @@ -25,23 +25,25 @@ limitations under the License. com.google.cloud.dataflow google-cloud-dataflow-java-sdk-all - LATEST + + 2.5.0 com.google.apis google-api-services-logging - v1beta3-rev10-1.21.0 + v2-rev608-1.25.0 com.google.http-client google-http-client - 1.20.0 + 1.27.0 com.google.http-client google-http-client-jackson2 - 1.20.0 + 1.27.0 + junit junit @@ -67,6 +69,14 @@ limitations under the License. + + org.apache.maven.plugins + maven-compiler-plugin + + 7 + 7 + + From ffb733f11d8909ca55583fbbf5b271f3e1c5961e Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Fri, 14 Dec 2018 10:40:36 +0100 Subject: [PATCH 07/16] Refactored to become compatible with cloud APIs --- .../cloud/solutions/LogAnalyticsPipeline.java | 277 +++++++++--------- .../LogAnalyticsPipelineOptions.java | 6 +- .../google/cloud/solutions/LogMessage.java | 4 +- 3 files changed, 140 insertions(+), 147 deletions(-) diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java index 3f4be5a..872043b 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java @@ -1,38 +1,39 @@ -/** -Copyright Google Inc. 2015 -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. -**/ +/* + Copyright Google Inc. 2015 + 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. + */ package com.google.cloud.solutions; import com.google.api.client.json.JsonParser; import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.servicecontrol.v1.LogEntry; import com.google.api.services.bigquery.model.TableFieldSchema; import com.google.api.services.bigquery.model.TableRow; import com.google.api.services.bigquery.model.TableSchema; -import com.google.api.services.logging.model.LogEntry; -import com.google.cloud.dataflow.sdk.Pipeline; -import com.google.cloud.dataflow.sdk.PipelineResult; -import com.google.cloud.dataflow.sdk.io.BigQueryIO; -import com.google.cloud.dataflow.sdk.io.PubsubIO; -import com.google.cloud.dataflow.sdk.io.TextIO; -import com.google.cloud.dataflow.sdk.options.PipelineOptionsFactory; -import com.google.cloud.dataflow.sdk.transforms.*; -import com.google.cloud.dataflow.sdk.transforms.windowing.FixedWindows; -import com.google.cloud.dataflow.sdk.transforms.windowing.Window; -import com.google.cloud.dataflow.sdk.values.KV; -import com.google.cloud.dataflow.sdk.values.PCollection; -import com.google.cloud.dataflow.sdk.values.PCollectionList; + +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.PipelineResult; +import org.apache.beam.sdk.io.TextIO; +import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO; +import org.apache.beam.sdk.io.gcp.pubsub.PubsubIO; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.transforms.*; +import org.apache.beam.sdk.transforms.windowing.FixedWindows; +import org.apache.beam.sdk.transforms.windowing.Window; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; import org.joda.time.Duration; import org.joda.time.Instant; import org.joda.time.format.DateTimeFormat; @@ -55,7 +56,7 @@ public class LogAnalyticsPipeline { * - The input String is a Cloud Logging LogEntry JSON object * - The "structPayload.log" field contains the log message to be parsed */ - private static class EmitLogMessageFn extends DoFn { + private static class EmitLogMessageFn extends DoFn { private boolean outputWithTimestamp; private String regexPattern; @@ -64,15 +65,15 @@ public EmitLogMessageFn(boolean outputWithTimestamp, String regexPattern) { this.regexPattern = regexPattern; } - @Override - public void processElement(ProcessContext c) { - LogMessage logMessage = parseEntry(c.element()); - if(logMessage != null) { - if(this.outputWithTimestamp) { - c.outputWithTimestamp(logMessage, logMessage.getTimestamp()); - } - else { - c.output(logMessage); + + @ProcessElement + public void processElement(@Element String element, OutputReceiver receiver) { + LogMessage logMessage = parseEntry(element); + if (logMessage != null) { + if (this.outputWithTimestamp) { + receiver.outputWithTimestamp(logMessage.toString(), logMessage.getTimestamp()); + } else { + receiver.output(logMessage.toString()); } } } @@ -84,30 +85,26 @@ private LogMessage parseEntry(String entry) { JsonParser parser = new JacksonFactory().createJsonParser(entry); LogEntry logEntry = parser.parse(LogEntry.class); logString = logEntry.getTextPayload(); - } - catch (IOException e) { + } catch (IOException e) { LOG.error("IOException parsing entry: " + e.getMessage()); - } - catch(NullPointerException e) { + } catch (NullPointerException e) { LOG.error("NullPointerException parsing entry: " + e.getMessage()); } Pattern p = Pattern.compile(this.regexPattern); Matcher m = p.matcher(logString); - if(m.find()) { + if (m.find()) { DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy/MM/dd - HH:mm:ss"); Instant timestamp = fmt.parseDateTime(m.group("timestamp")).toInstant(); int httpStatusCode = Integer.valueOf(m.group("httpStatusCode")); double responseTime = 0; - if(m.group("resolution").equals("ns")) { + if (m.group("resolution").equals("ns")) { responseTime = Double.valueOf(m.group("responseTime")) / 1e9; - } - else if(m.group("resolution").equals("µs")) { + } else if (m.group("resolution").equals("µs")) { responseTime = Double.valueOf(m.group("responseTime")) / 1e6; - } - else if(m.group("resolution").equals("ms")) { + } else if (m.group("resolution").equals("ms")) { responseTime = Double.valueOf(m.group("responseTime")) / 1e3; } @@ -116,8 +113,7 @@ else if(m.group("resolution").equals("ms")) { String destination = m.group("destination"); return new LogMessage(timestamp, httpStatusCode, responseTime, source, httpMethod, destination); - } - else { + } else { return null; } } @@ -128,19 +124,17 @@ else if(m.group("resolution").equals("ms")) { * - Transforms LogMessage objects to BigQuery TableRow objects */ private static class LogMessageTableRowFn extends DoFn { - @Override - public void processElement(ProcessContext c) { - LogMessage msg = c.element(); - + @ProcessElement + public void processElement(@Element LogMessage msg, OutputReceiver receiver) { TableRow row = new TableRow() - .set("timestamp", msg.getTimestamp().toString()) - .set("httpStatusCode", msg.getHttpStatusCode()) - .set("responseTime", msg.getResponseTime()) - .set("source", msg.getSource()) - .set("httpMethod", msg.getHttpMethod()) - .set("destination", msg.getDestination()); - - c.output(row); + .set("timestamp", msg.getTimestamp().toString()) + .set("httpStatusCode", msg.getHttpStatusCode()) + .set("responseTime", msg.getResponseTime()) + .set("source", msg.getSource()) + .set("httpMethod", msg.getHttpMethod()) + .set("destination", msg.getDestination()); + + receiver.output(row); } } @@ -150,7 +144,7 @@ public void processElement(ProcessContext c) { * - Creates a BigQuery TableSchema from an input String * - Writes the output PCollection to BigQuery */ - private static class TableRowOutputTransform extends PTransform>,PCollection> { + private static class TableRowOutputTransform extends PTransform>, PCollection> { private String tableSchema; private String tableName; @@ -163,7 +157,7 @@ public static TableSchema createTableSchema(String schema) { String[] fieldTypePairs = schema.split(","); List fields = new ArrayList(); - for(String entry : fieldTypePairs) { + for (String entry : fieldTypePairs) { String[] fieldAndType = entry.split(":"); fields.add(new TableFieldSchema().setName(fieldAndType[0]).setType(fieldAndType[1])); } @@ -171,28 +165,28 @@ public static TableSchema createTableSchema(String schema) { return new TableSchema().setFields(fields); } + @Override - public PCollection apply(PCollection> input) { + public PCollection expand(PCollection> input) { PCollection output = input. - apply(ParDo.named("aggregateToTableRow").of(new DoFn, TableRow>() { - @Override - public void processElement(ProcessContext c) { - KV e = c.element(); - - TableRow row = new TableRow() - .set("destination", e.getKey()) - .set("aggResponseTime", e.getValue()); - - c.output(row); - } - })); - - output.apply(BigQueryIO.Write - .named("tableRowToBigQuery") - .to(this.tableName) - .withSchema(createTableSchema(this.tableSchema)) - .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) - .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)); + apply(ParDo.of(new DoFn, TableRow>() { + // @Override + public void processElement(ProcessContext c) { + KV e = c.element(); + + TableRow row = new TableRow() + .set("destination", e.getKey()) + .set("aggResponseTime", e.getValue()); + + c.output(row); + } + })); + + output.apply(BigQueryIO.write() + .to(this.tableName) + .withSchema(createTableSchema(this.tableSchema)) + .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) + .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)); return output; } @@ -201,9 +195,9 @@ public void processElement(ProcessContext c) { public static void main(String[] args) { PipelineOptionsFactory.register(LogAnalyticsPipelineOptions.class); LogAnalyticsPipelineOptions options = PipelineOptionsFactory - .fromArgs(args) - .withValidation() - .as(LogAnalyticsPipelineOptions.class); + .fromArgs(args) + .withValidation() + .as(LogAnalyticsPipelineOptions.class); Pipeline p = Pipeline.create(options); @@ -212,106 +206,105 @@ public static void main(String[] args) { PCollection locateLogs; boolean outputWithTimestamp; - /** - * If the pipeline is started in "streaming" mode, treat the input sources as Pub/Sub subscriptions + /* + If the pipeline is started in "streaming" mode, treat the input sources as Pub/Sub subscriptions */ - if(options.isStreaming()) { + if (options.isStreaming()) { outputWithTimestamp = false; - homeLogs = p.apply(PubsubIO.Read.named("homeLogsPubSubRead").subscription(options.getHomeLogSource())); - browseLogs = p.apply(PubsubIO.Read.named("browseLogsPubSubRead").subscription(options.getBrowseLogSource())); - locateLogs = p.apply(PubsubIO.Read.named("locateLogsPubSubRead").subscription(options.getLocateLogSource())); + homeLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getHomeLogSource())); + browseLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getBrowseLogSource())); + locateLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getLocateLogSource())); } - /** - * If the pipeline is not started in "streaming" mode, treat the input sources as Cloud Storage paths + /* + If the pipeline is not started in "streaming" mode, treat the input sources as Cloud Storage paths */ else { outputWithTimestamp = true; // [START readingData] - homeLogs = p.apply(TextIO.Read.named("homeLogsTextRead").from(options.getHomeLogSource())); - browseLogs = p.apply(TextIO.Read.named("browseLogsTextRead").from(options.getBrowseLogSource())); - locateLogs = p.apply(TextIO.Read.named("locateLogsTextRead").from(options.getLocateLogSource())); + homeLogs = p.apply(TextIO.read().from(options.getHomeLogSource())); + browseLogs = p.apply(TextIO.read().from(options.getBrowseLogSource())); + locateLogs = p.apply(TextIO.read().from(options.getLocateLogSource())); // [END readingData] } - /** - * Flatten all input PCollections into a single PCollection + /* + Flatten all input PCollections into a single PCollection */ // [START flattenCollections] PCollection allLogs = PCollectionList - .of(homeLogs) - .and(browseLogs) - .and(locateLogs) - .apply(Flatten.pCollections()); + .of(homeLogs) + .and(browseLogs) + .and(locateLogs) + .apply(Flatten.pCollections()); // [END flattenCollections] - /** - * Transform "allLogs" PCollection to PCollection and apply custom windowing scheme + /* + Transform "allLogs" PCollection to PCollection and apply custom windowing scheme */ // [START transformStringToLogMessage] PCollection allLogMessages = allLogs - .apply(ParDo.named("allLogsToLogMessage").of(new EmitLogMessageFn(outputWithTimestamp, options.getLogRegexPattern()))); + .apply(ParDo.of(new EmitLogMessageFn(outputWithTimestamp, options.getLogRegexPattern()))); // [END transformStringToLogMessage] // [START applyWindowing] PCollection allLogMessagesDaily = allLogMessages - .apply(Window.named("allLogMessageToDaily").into(FixedWindows.of(Duration.standardDays(1)))); + .apply(Window.into(FixedWindows.of(Duration.standardDays(1)))); // [END applyWindowing] - /** - * Transform "allLogs" PCollection to PCollection + /* + Transform "allLogs" PCollection to PCollection */ // [START logMessageToTableRow] PCollection logsAsTableRows = allLogMessagesDaily - .apply(ParDo.named("logMessageToTableRow").of(new LogMessageTableRowFn())); + .apply(ParDo.of(new LogMessageTableRowFn())); // [END logMessageToTableRow] - /** - * Output "allLogs" PCollection to BigQuery + /* + Output "allLogs" PCollection to BigQuery */ TableSchema allLogsTableSchema = TableRowOutputTransform.createTableSchema(options.getAllLogsTableSchema()); // [START allLogsToBigQuery] - logsAsTableRows.apply(BigQueryIO.Write - .named("allLogsToBigQuery") - .to(options.getAllLogsTableName()) - .withSchema(allLogsTableSchema) - .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) - .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)); + logsAsTableRows.apply(BigQueryIO.write() + .to(options.getAllLogsTableName()) + .withSchema(allLogsTableSchema) + .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) + .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)); // [END allLogsToBigQuery] - /** - * Create new PCollection> - * - Contains "destination->responseTime" key-value pairs - * - Used for computing responseTime aggregations + /* + Create new PCollection> + - Contains "destination->responseTime" key-value pairs + - Used for computing responseTime aggregations */ - PCollection> destResponseTimeCollection = allLogMessagesDaily - .apply(ParDo.named("logMessageToDestRespTime").of(new DoFn>() { - @Override - public void processElement(ProcessContext processContext) throws Exception { - LogMessage l = processContext.element(); - processContext.output(KV.of(l.getDestination(), l.getResponseTime())); - } - })); - - /** - * Transform PCollection> to PCollection - * - First aggregate "destination->responseTime" key-value pairs into - * - destination->maxResponseTime and destination->meanResponseTime - * - Use custom PTransform to output PCollection to BigQuery + PCollection> destResponseTimeCollection = allLogMessagesDaily + .apply(ParDo.of(new DoFn>() { + // @Override + public void processElement(ProcessContext processContext) throws Exception { + LogMessage l = processContext.element(); + processContext.output(KV.of(l.getDestination(), l.getResponseTime())); + } + })); + + /* + Transform PCollection> to PCollection + - First aggregate "destination->responseTime" key-value pairs into + - destination->maxResponseTime and destination->meanResponseTime + - Use custom PTransform to output PCollection to BigQuery */ // [START computeAggregations] - PCollection> destMaxRespTime = destResponseTimeCollection - .apply(Combine.perKey(new Max.MaxDoubleFn())); + PCollection> destMaxRespTime = destResponseTimeCollection + .apply(Combine.perKey(Max.ofDoubles())); - PCollection> destMeanRespTime = destResponseTimeCollection - .apply(Mean.perKey()); + PCollection> destMeanRespTime = destResponseTimeCollection + .apply(Mean.perKey()); // [END computeAggregations] PCollection destMaxRespTimeRows = destMaxRespTime - .apply(new TableRowOutputTransform(options.getMaxRespTimeTableSchema(), options.getMaxRespTimeTableName())); + .apply(new TableRowOutputTransform(options.getMaxRespTimeTableSchema(), options.getMaxRespTimeTableName())); PCollection destMeanRespTimeRows = destMeanRespTime - .apply(new TableRowOutputTransform(options.getMeanRespTimeTableSchema(), options.getMeanRespTimeTableName())); + .apply(new TableRowOutputTransform(options.getMeanRespTimeTableSchema(), options.getMeanRespTimeTableName())); PipelineResult r = p.run(); diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java index 999cfc0..1ef2aa7 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java @@ -15,9 +15,9 @@ package com.google.cloud.solutions; -import com.google.cloud.dataflow.sdk.options.DataflowPipelineOptions; -import com.google.cloud.dataflow.sdk.options.Default; -import com.google.cloud.dataflow.sdk.options.Description; +import org.apache.beam.runners.dataflow.options.DataflowPipelineOptions; +import org.apache.beam.sdk.options.Default; +import org.apache.beam.sdk.options.Description; @SuppressWarnings("unused") public interface LogAnalyticsPipelineOptions extends DataflowPipelineOptions { diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogMessage.java b/dataflow/src/main/java/com/google/cloud/solutions/LogMessage.java index 4e2096a..e075edd 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogMessage.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogMessage.java @@ -15,9 +15,9 @@ package com.google.cloud.solutions; -import com.google.cloud.dataflow.sdk.coders.AvroCoder; -import com.google.cloud.dataflow.sdk.coders.DefaultCoder; import org.apache.avro.reflect.Nullable; +import org.apache.beam.sdk.coders.AvroCoder; +import org.apache.beam.sdk.coders.DefaultCoder; import org.joda.time.Instant; @DefaultCoder(AvroCoder.class) From e055a7bf43789f1204a7003e6cf3226fcf8827a3 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Sun, 16 Dec 2018 11:27:48 +0100 Subject: [PATCH 08/16] improved docs --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 29bd868..541eb26 100644 --- a/README.md +++ b/README.md @@ -164,8 +164,8 @@ kubectl logs -f browse-service-2djpb & ## TODO adjust IP based on `kubectl get services` -curl http://35.224.38.74:8100/browse/category/23 -curl http://35.202.0.152:8200/locate/55?zipcode=12345 +curl http://35.224.38.74:8100/browse/category/67 +curl http://35.202.0.152:8200/locate/66?zipcode=12345 ``` @@ -191,7 +191,12 @@ This script uses Apache Bench [ab](https://httpd.apache.org/docs/2.2/programs/ab For information on examining logs or log structure in Cloud Storage, see the [Cloud Logging documentation](https://cloud.google.com/logging/docs/export/using_exported_logs#log_entries_in_google_cloud_storage). -Check if the logs arrived in the _GCP Logging_ `open https://console.cloud.google.com/logs/viewer?project=${PROJECT_ID}` +Most importantly we need some patience here because [as documented](https://cloud.google.com/logging/docs/export/using_exported_logs#gcs-availability) +> Log entries going to Cloud Storage are batched and sent out approximately every hour. + +So it will take an hour or so before logs actually arrive in our bucket. + +So after an hour, we can check if the logs have arrived in the _GCP Logging_ `open https://console.cloud.google.com/logs/viewer?project=${PROJECT_ID}` Troubleshooting hints https://cloud.google.com/logging/docs/export/?hl=en_US&_ga=2.100645598.-1938216270.1543417411#troubleshooting From 92661e1429c4be1eb63da0b5cc744297d33ffd94 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Sun, 16 Dec 2018 18:11:30 +0100 Subject: [PATCH 09/16] adjusted log regex to comply with format --- .../com/google/cloud/solutions/LogAnalyticsPipelineOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java index 1ef2aa7..8d9acfe 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipelineOptions.java @@ -34,7 +34,7 @@ public interface LogAnalyticsPipelineOptions extends DataflowPipelineOptions { void setLocateLogSource(String locateLogSource); @Description("Regular expression pattern used to parse embedded log messages inside Cloud Logging entries") - @Default.String("\\[GIN\\]\\s+(?\\d{4}/\\d{2}/\\d{2} \\- \\d{2}\\:\\d{2}\\:\\d{2}).*? (?\\d{3}) .*?(?\\d+\\.?\\d*)(?\\S{1,}) \\| (?[0-9\\.:]+?) \\|\\S+?\\s+?\\S+?\\s+?(?\\w+?)\\s+?(?[a-z0-9/]+)") + @Default.String(value = "\\[GIN\\]\\s+(?\\d{4}/\\d{2}/\\d{2} \\- \\d{2}\\:\\d{2}\\:\\d{2}).*? (?\\d{3}) .*?(?\\d+\\.?\\d*)(?\\S{1,}) \\|\\s+(?[0-9\\.:]+)\\s\\|\\s(?[A-Z]+)\\s*(?[a-z0-9/]+)") String getLogRegexPattern(); void setLogRegexPattern(String logRegexPattern); From 2a7645070acea174dc7e34b7505395e805fc47e8 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Sun, 16 Dec 2018 20:28:55 +0100 Subject: [PATCH 10/16] migrated to v2 of logging API --- .../cloud/solutions/LogAnalyticsPipeline.java | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java index 872043b..fd297a7 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java @@ -17,11 +17,11 @@ import com.google.api.client.json.JsonParser; import com.google.api.client.json.jackson2.JacksonFactory; -import com.google.api.servicecontrol.v1.LogEntry; import com.google.api.services.bigquery.model.TableFieldSchema; import com.google.api.services.bigquery.model.TableRow; import com.google.api.services.bigquery.model.TableSchema; +import com.google.api.services.logging.v2.model.LogEntry; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.PipelineResult; import org.apache.beam.sdk.io.TextIO; @@ -29,11 +29,13 @@ import org.apache.beam.sdk.io.gcp.pubsub.PubsubIO; import org.apache.beam.sdk.options.PipelineOptionsFactory; import org.apache.beam.sdk.transforms.*; +import org.apache.beam.sdk.transforms.display.DisplayData; import org.apache.beam.sdk.transforms.windowing.FixedWindows; import org.apache.beam.sdk.transforms.windowing.Window; import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; import org.apache.beam.sdk.values.PCollectionList; +import org.apache.beam.sdk.values.TypeDescriptor; import org.joda.time.Duration; import org.joda.time.Instant; import org.joda.time.format.DateTimeFormat; @@ -67,13 +69,13 @@ public EmitLogMessageFn(boolean outputWithTimestamp, String regexPattern) { @ProcessElement - public void processElement(@Element String element, OutputReceiver receiver) { + public void processElement(@Element String element, OutputReceiver receiver) { LogMessage logMessage = parseEntry(element); if (logMessage != null) { if (this.outputWithTimestamp) { - receiver.outputWithTimestamp(logMessage.toString(), logMessage.getTimestamp()); + receiver.outputWithTimestamp(logMessage, logMessage.getTimestamp()); } else { - receiver.output(logMessage.toString()); + receiver.output(logMessage); } } } @@ -170,7 +172,7 @@ public static TableSchema createTableSchema(String schema) { public PCollection expand(PCollection> input) { PCollection output = input. apply(ParDo.of(new DoFn, TableRow>() { - // @Override + @ProcessElement public void processElement(ProcessContext c) { KV e = c.element(); @@ -186,7 +188,14 @@ public void processElement(ProcessContext c) { .to(this.tableName) .withSchema(createTableSchema(this.tableSchema)) .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) - .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)); + .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED) + .withFormatFunction(new SimpleFunction() { + @Override + public TableRow apply(TableRow input) { + return input; + } + })); + return output; } @@ -211,8 +220,8 @@ public static void main(String[] args) { */ if (options.isStreaming()) { outputWithTimestamp = false; - homeLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getHomeLogSource())); - browseLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getBrowseLogSource())); +// homeLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getHomeLogSource())); +// browseLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getBrowseLogSource())); locateLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getLocateLogSource())); } /* @@ -221,8 +230,8 @@ public static void main(String[] args) { else { outputWithTimestamp = true; // [START readingData] - homeLogs = p.apply(TextIO.read().from(options.getHomeLogSource())); - browseLogs = p.apply(TextIO.read().from(options.getBrowseLogSource())); +// homeLogs = p.apply(TextIO.read().from(options.getHomeLogSource())); +// browseLogs = p.apply(TextIO.read().from(options.getBrowseLogSource())); locateLogs = p.apply(TextIO.read().from(options.getLocateLogSource())); // [END readingData] } @@ -232,9 +241,9 @@ public static void main(String[] args) { */ // [START flattenCollections] PCollection allLogs = PCollectionList - .of(homeLogs) - .and(browseLogs) - .and(locateLogs) + .of(locateLogs) +// .and(browseLogs) +// .and(locateLogs) .apply(Flatten.pCollections()); // [END flattenCollections] @@ -251,6 +260,8 @@ public static void main(String[] args) { .apply(Window.into(FixedWindows.of(Duration.standardDays(1)))); // [END applyWindowing] + //language=RegExp + String foo = "\\[GIN\\]\\s+(?\\d{4}/\\d{2}/\\d{2} \\- \\d{2}\\:\\d{2}\\:\\d{2}).*? (?\\d{3}) .*?(?\\d+\\.?\\d*)(?\\S{1,}) \\| (?[0-9\\.:]+?) \\|\\S+?\\s+?\\S+?\\s+?(?\\w+?)\\s+?(?[a-z0-9/]+)"; /* Transform "allLogs" PCollection to PCollection */ @@ -265,6 +276,13 @@ public static void main(String[] args) { TableSchema allLogsTableSchema = TableRowOutputTransform.createTableSchema(options.getAllLogsTableSchema()); // [START allLogsToBigQuery] logsAsTableRows.apply(BigQueryIO.write() + .withFormatFunction(new SimpleFunction() { + @Override + public TableRow apply(TableRow input) { + return input; +// return super.apply(input); + } + }) .to(options.getAllLogsTableName()) .withSchema(allLogsTableSchema) .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND) @@ -278,7 +296,8 @@ public static void main(String[] args) { */ PCollection> destResponseTimeCollection = allLogMessagesDaily .apply(ParDo.of(new DoFn>() { - // @Override + + @ProcessElement public void processElement(ProcessContext processContext) throws Exception { LogMessage l = processContext.element(); processContext.output(KV.of(l.getDestination(), l.getResponseTime())); @@ -300,6 +319,8 @@ public void processElement(ProcessContext processContext) throws Exception { .apply(Mean.perKey()); // [END computeAggregations] + + // see https://beam.apache.org/releases/javadoc/2.3.0/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.html PCollection destMaxRespTimeRows = destMaxRespTime .apply(new TableRowOutputTransform(options.getMaxRespTimeTableSchema(), options.getMaxRespTimeTableName())); From 87f50bce3b0dfb520e8cd2ffe6e273ed0b142056 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Sun, 16 Dec 2018 20:29:28 +0100 Subject: [PATCH 11/16] reenabled bucket creation --- README.md | 40 +++++++++++++++++++++++++++++++++++++--- services/logging.sh | 4 ++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 541eb26..b7ce4d3 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,23 @@ This tutorial demonstrates how to use [Google Cloud Dataflow](http://cloud.googl For details about how the tutorial works, see [Processing Logs at Scale Using Cloud Dataflow](http://cloud.google.com/solutions/processing-logs-at-scale-using-dataflow) on the Google Cloud Platform website. +[TOC levels=3]: # " " + +- [Architecture Overview](#architecture-overview) +- [Prerequisites](#prerequisites) +- [Sample Web Applications](#sample-web-applications) + - [Deploy the Container Engine cluster](#deploy-the-container-engine-cluster) + - [Set up Cloud Logging](#set-up-cloud-logging) + - [Generate requests](#generate-requests) + - [Examining logs](#examining-logs) +- [Cloud Dataflow Pipeline](#cloud-dataflow-pipeline) + - [Create the BigQuery dataset](#create-the-bigquery-dataset) + - [Run the pipeline](#run-the-pipeline) + - [Monitoring the pipeline](#monitoring-the-pipeline) + - [View BigQuery data](#view-bigquery-data) +- [Cleaning Up](#cleaning-up) + + ## Architecture Overview @@ -70,6 +87,7 @@ gcloud services list --available | grep container gcloud services enable container.googleapis.com gcloud services enable containerregistry.googleapis.com +gcloud services enable dataflow.googleapis.com ``` Typically the other permission are already enabled by default when using a test-GCP account. @@ -182,7 +200,6 @@ Now that the applications have been deployed and are logging through Cloud Loggi ```bash # Usage./load.sh REQUESTS CONCURRENCY ./load.sh 100 2 -./load.sh 1 1 ``` This script uses Apache Bench [ab](https://httpd.apache.org/docs/2.2/programs/ab.html) to generate load against the deployed web applications. `REQUESTS` controls how many requests are issued to each application and `CONCURRENCY` controls how many concurrent requests are issued. The logs from the applications are sent to Cloud Storage in hourly batches, and it can take up to two hours before log entries start to appear. For more information, see the [Cloud Logging documentation](https://cloud.google.com/logging/docs/export/using_exported_logs). @@ -201,7 +218,7 @@ So after an hour, we can check if the logs have arrived in the _GCP Logging_ `op Troubleshooting hints https://cloud.google.com/logging/docs/export/?hl=en_US&_ga=2.100645598.-1938216270.1543417411#troubleshooting -## Cloud Dataflow pipeline +## Cloud Dataflow Pipeline The following diagram shows the structure and flow of the example Dataflow pipeline: @@ -231,11 +248,18 @@ Next, Run the pipeline. Replace `${BUCKET_NAME}` with the same name you used for ``` + This command builds the code for the Cloud Dataflow pipeline, uploads it to the specified staging area, and launches the job. To see all options available for this pipeline, run the following command: $ ./pipeline.sh +To run locally we can use a direct runner: +```bash +mvn compile exec:java \ + -Dexec.mainClass=com.google.cloud.solutions.LogAnalyticsPipeline \ + -Dexec.args="--project=new-logs-demo --stagingLocation=gs://new-logs-demo-data-bucket/staging --runner=DirectRunner --homeLogSource=gs://new-logs-demo-data-bucket/sample-home-service/*/*/*/*.json --browseLogSource=gs://new-logs-demo-data-bucket/sample-browse-service/*/*/*/*.json --locateLogSource=gs://new-logs-demo-data-bucket/sample-locate-service/*/*/*/*.json --tempLocation=gs://new-logs-demo-data-bucket/temp --allLogsTableName=new_logs_demo_bq_data.all_logs_table --maxRespTimeTableName=new_logs_demo_bq_data.max_response_time_table --meanRespTimeTableName=new_logs_demo_bq_data.mean_response_time_table " +``` In case it errors with ``` DataflowRunner requires gcpTempLocation, but failed to retrieve a value from PipelineOptions: Unable to get application default credentials. Please see https://developers.google.com/accounts/docs/application-default-credentials @@ -253,7 +277,11 @@ While the pipeline is running, you can see its status in the [Google Developers After the job has completed, you can see the output in the [BigQuery console](https://bigquery.cloud.google.com) and compose and run queries against the data. -## Cleaning up +```bash +open https://console.cloud.google.com/bigquery?project=${PROJECT_ID} +``` + +## Cleaning Up To clean up and remove all resources used in this example: @@ -270,3 +298,9 @@ To clean up and remove all resources used in this example: $ cd dataflow-log-analytics/services $ ./cluster.sh ${PROJECT_ID} ${CLUSTER_NAME} down + + +Alternatively, we can also the delete the complete project in a single step +```bash +gcloud projects delete ${PROJECT_ID} +``` diff --git a/services/logging.sh b/services/logging.sh index 1a91968..2645c81 100755 --- a/services/logging.sh +++ b/services/logging.sh @@ -121,7 +121,9 @@ case "$MODE" in # Create a Cloud Storage Bucket gsutil -q mb gs://${GCS_BUCKET} + # Allow Stackdriver Logging access to the bucket + ## https://cloud.google.com/storage/docs/gsutil/commands/acl gsutil -q acl ch -g cloud-logs@google.com:O gs://${GCS_BUCKET} echo "done" @@ -134,6 +136,8 @@ case "$MODE" in --log-filter="resource.type=\"container\" \"${s}\"" \ --project=${PROJECT_ID} \ --quiet >/dev/null || error_exit "Error creating Log Export sinks" + + # TODO we need to grant the associcated service account access to the bucket done echo "done" ;; From dce247dfbb1ff681b40dfac89eb206861b10a38c Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Wed, 19 Dec 2018 14:33:56 +0100 Subject: [PATCH 12/16] add write permissions to service accounts --- services/logging.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/logging.sh b/services/logging.sh index 2645c81..b11ea5c 100755 --- a/services/logging.sh +++ b/services/logging.sh @@ -131,13 +131,17 @@ case "$MODE" in # For each microservice, set up Stackdriver Logging exports echo -n "* Creating Log Export sinks..." for s in ${SERVICE_NAMES[@]}; do + #eg s=sample-home-service gcloud beta logging sinks create ${s} \ storage.googleapis.com/${GCS_BUCKET} \ --log-filter="resource.type=\"container\" \"${s}\"" \ --project=${PROJECT_ID} \ --quiet >/dev/null || error_exit "Error creating Log Export sinks" - # TODO we need to grant the associcated service account access to the bucket + # we need to grant the associcated service account access to the bucket + serviceAccount=$(gcloud beta logging sinks describe --format "value[](writerIdentity)" ${s} | sed 's/serviceAccount://g') + gsutil acl ch -u ${serviceAccount}:W gs://${GCS_BUCKET + } done echo "done" ;; From 392529df9e00b155a701b37fd019e669db6bda9d Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Wed, 19 Dec 2018 14:34:33 +0100 Subject: [PATCH 13/16] added temp bucket location as required by dataflow --- dataflow/pipeline.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dataflow/pipeline.sh b/dataflow/pipeline.sh index b5ee4eb..68536cb 100755 --- a/dataflow/pipeline.sh +++ b/dataflow/pipeline.sh @@ -46,6 +46,8 @@ case "$COMMAND" in --homeLogSource=gs://${BUCKET_NAME}/sample-home-service/*/*/*/*.json \ --browseLogSource=gs://${BUCKET_NAME}/sample-browse-service/*/*/*/*.json \ --locateLogSource=gs://${BUCKET_NAME}/sample-locate-service/*/*/*/*.json \ + --gcpTempLocation=gs://${BUCKET_NAME}/temp \ + --tempLocation=gs://${BUCKET_NAME}/temp \ --allLogsTableName=${DATASET_NAME}.all_logs_table \ --maxRespTimeTableName=${DATASET_NAME}.max_response_time_table \ --meanRespTimeTableName=${DATASET_NAME}.mean_response_time_table" From 49a27728efaa35f5db4b9f8dd9dc183cf038763e Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Wed, 19 Dec 2018 14:34:50 +0100 Subject: [PATCH 14/16] restored logs in workflow --- .../cloud/solutions/LogAnalyticsPipeline.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java index fd297a7..c49a9d1 100644 --- a/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java +++ b/dataflow/src/main/java/com/google/cloud/solutions/LogAnalyticsPipeline.java @@ -220,8 +220,8 @@ public static void main(String[] args) { */ if (options.isStreaming()) { outputWithTimestamp = false; -// homeLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getHomeLogSource())); -// browseLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getBrowseLogSource())); + homeLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getHomeLogSource())); + browseLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getBrowseLogSource())); locateLogs = p.apply(PubsubIO.readStrings().fromSubscription(options.getLocateLogSource())); } /* @@ -230,8 +230,8 @@ public static void main(String[] args) { else { outputWithTimestamp = true; // [START readingData] -// homeLogs = p.apply(TextIO.read().from(options.getHomeLogSource())); -// browseLogs = p.apply(TextIO.read().from(options.getBrowseLogSource())); + homeLogs = p.apply(TextIO.read().from(options.getHomeLogSource())); + browseLogs = p.apply(TextIO.read().from(options.getBrowseLogSource())); locateLogs = p.apply(TextIO.read().from(options.getLocateLogSource())); // [END readingData] } @@ -241,9 +241,9 @@ public static void main(String[] args) { */ // [START flattenCollections] PCollection allLogs = PCollectionList - .of(locateLogs) -// .and(browseLogs) -// .and(locateLogs) + .of(homeLogs) + .and(browseLogs) + .and(locateLogs) .apply(Flatten.pCollections()); // [END flattenCollections] From 9895cb889e361ffb4f22b8e3c187c0e79bf2d43b Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Wed, 19 Dec 2018 14:35:16 +0100 Subject: [PATCH 15/16] added docs about credentials and big-query logging example. --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7ce4d3..3eafa18 100644 --- a/README.md +++ b/README.md @@ -249,9 +249,16 @@ Next, Run the pipeline. Replace `${BUCKET_NAME}` with the same name you used for -This command builds the code for the Cloud Dataflow pipeline, uploads it to the specified staging area, and launches the job. To see all options available for this pipeline, run the following command: +This command builds the code for the Cloud Dataflow pipeline, uploads it to the specified staging area, and launches the job. Since we're using legacy APIs we need to point it to some credentials (see https://cloud.google.com/storage/docs/reference/libraries#setting_up_authentication). To see all options available for this pipeline, run the following command: - $ ./pipeline.sh +``` + +export GOOGLE_APPLICATION_CREDENTIALS="[PATH]" + +./pipeline.sh +``` + +This is the compute graph To run locally we can use a direct runner: @@ -281,6 +288,11 @@ After the job has completed, you can see the output in the [BigQuery console](ht open https://console.cloud.google.com/bigquery?project=${PROJECT_ID} ``` +And run quries, e.g. +```sql +SELECT destination, count(destination) FROM `new-logs-demo.new_logs_demo_bq_data.all_logs_table` GROUP BY destination LIMIT 1000 +``` + ## Cleaning Up To clean up and remove all resources used in this example: From 7cdadfeb46814bd994fa1f855324dfac4e0ddad3 Mon Sep 17 00:00:00 2001 From: Holger Brandl Date: Wed, 19 Dec 2018 14:41:19 +0100 Subject: [PATCH 16/16] cosmetics --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index 3eafa18..7bd9b70 100644 --- a/README.md +++ b/README.md @@ -258,22 +258,6 @@ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]" ./pipeline.sh ``` -This is the compute graph - - -To run locally we can use a direct runner: -```bash -mvn compile exec:java \ - -Dexec.mainClass=com.google.cloud.solutions.LogAnalyticsPipeline \ - -Dexec.args="--project=new-logs-demo --stagingLocation=gs://new-logs-demo-data-bucket/staging --runner=DirectRunner --homeLogSource=gs://new-logs-demo-data-bucket/sample-home-service/*/*/*/*.json --browseLogSource=gs://new-logs-demo-data-bucket/sample-browse-service/*/*/*/*.json --locateLogSource=gs://new-logs-demo-data-bucket/sample-locate-service/*/*/*/*.json --tempLocation=gs://new-logs-demo-data-bucket/temp --allLogsTableName=new_logs_demo_bq_data.all_logs_table --maxRespTimeTableName=new_logs_demo_bq_data.max_response_time_table --meanRespTimeTableName=new_logs_demo_bq_data.mean_response_time_table " -``` -In case it errors with -``` -DataflowRunner requires gcpTempLocation, but failed to retrieve a value from PipelineOptions: Unable to get application default credentials. Please see https://developers.google.com/accounts/docs/application-default-credentials -``` -you need to login with `gcloud auth application-default login` - - ### Monitoring the pipeline While the pipeline is running, you can see its status in the [Google Developers Console](https://console.developers.google.com). Navigate to **Dataflow** and then click the running job ID. You can see a graphical rendering of the pipeline and examine job logging output along with information about each pipeline stage. Here is an example screenshot of a running Cloud Dataflow job: